OPM的实现

OPM在arx的开发中有重要的用途。本文简要描述如何实现自定义实体的OPM,看了好几天才看明白呀。和大家交流交流了。

第一步:定义自定义实体
自定义实体应该以*.dbx文件作为输出文件
dbx中的自定义实体和arx中自定义实体的写法相同。

第二步:定义好了一个自定义实体后,在vc中建立一个ALT工程。(同arx的例程AsdkSquareWrapper一样了,这里不

多说,这里参照讲解的代码都取自AsdkSquareWrapper例程)
这里先介绍一下相关的知识。
CAD系统已经预定义了一些属性的分类,以PROPCAT_为前缀的就是。数值范围是-1~-25。所以用户自己定义的分类不要用这些数字。
AsdkSquareWrapper.h中有如下代码。
BEGIN_OPMPROP_MAP()
OPMPROP_ENTRY(0, 0x00000001, PROPCAT_Data, /
0, 0, 0, "", 0, 1, IID_NULL, IID_NULL, "")
OPMPROP_ENTRY(0, 0x00000003, PROPCAT_Geometry, /
0, 0, 0, "", 0, 1, IID_NULL, IID_NULL, "")
END_OPMPROP_MAP()

这段代码说明,自定义的属性有2个类,你需要自己分类的属性也有2个。一类是PROPCAT_Data,另一类是PROPCAT_Geometry,0x00000001和0x00000003是分别属性的DISPID。如果不定义上面的代码,那么新的属性将被系统按照通用属性处理。当然,如果有多个属性要放到1个类中就多写几行就可以了。比如有3个属性被分到PROPCAT_Data
类中,你就写3行
OPMPROP_ENTRY(0, 编号, PROPCAT_Data, /
0, 0, 0, "", 0, 1, IID_NULL, IID_NULL, "") 那么这3个属性就都会显示在data类中了。

当用户选择自定义实体时COM的标准接口会调用这段代码,当用户的属性分类不属于系统自定义的分类时,
系统就会调用在OPM中必须实现的一个函数GetCategoryName()函数,在这个函数中根据用户的要求加入自己的属性分类。
AsdkSquareWrapper例程中,我想把Squaresize分类改到SQSize类中。只要做如下修改
BEGIN_OPMPROP_MAP()
OPMPROP_ENTRY(0, 0x00000001, PROPCAT_Data, /
0, 0, 0, "", 0, 1, IID_NULL, IID_NULL, "")
OPMPROP_ENTRY(0, 0x00000002, 1, /
0, 0, 0, "", 0, 1, IID_NULL, IID_NULL, "")
OPMPROP_ENTRY(0, 0x00000003, PROPCAT_Geometry, /
0, 0, 0, "", 0, 1, IID_NULL, IID_NULL, "")
END_OPMPROP_MAP() //加入了一个属性,DISPID是0x00000002,分类号是1

当执行这段代码时,cad发现1不是他预定义的分类,所以执行GetCategoryName获得分类的名称
所以我们改写GetCategoryName函数
在头文件中改为
STDMETHODIMP GetCategoryName(
/* [in] */ PROPCAT propcat,
/* [in] */ LCID lcid,
/* [out] */ BSTR* pbstrName);
cpp文件中改为
STDMETHODIMP CAsdkSquareWrapper::GetCategoryName(
/* [in] */ PROPCAT propcat,
/* [in] */ LCID lcid,
/* [out] */ BSTR* pbstrName)
{
if (propcat == 1)
{
*pbstrName = ::SysAllocString(L"SQSize");
return S_OK;
}
else
return S_FALSE;
}
注意看原来例程的写法,按照那个写法程序不会调用这个函数。我也不知道为什么。

执行完这个函数后,GetElementStrings函数被调用。
这个函数的作用就是分解复杂的属性,如当你所描述的属性是一个点时,你需要将x,y,z的坐标同时显示在属性窗
口中。 这个函数就是你实现如何分解这些属性。当然也可以不实现它。
AsdkSquareWrapper例程里没写清楚地好像就是这些了

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值