自定义实体的COM封装
如果自定义实体在AutoCAD中处于选中状态时,属性面板能够显示其属性并供用户修改,那么用户与自定义实体的交互性将得到极大提升,这在实际工程中是非常实用的!天正系列软件内置大量自定义实体,并且供用户修改属性驱动,其技术核心就是COM封装。
本文逐步讲解如何对自定义实体进行COM封装。
对自定义实体进行COM包装
本文在已有的自定义实体项目中添加自定义实体的COM包装类,所以在创建自定义实体项目时需要选择COM相关的选项。
创建COM包装类
- 通过项模板添加COM包装类
- 设置若干COM支持,这里要输入自定义实体类名
点击“Finish”按钮后,在项目文件夹中添加了CustomEntity1COMWrapper.h
和CustomEntity1COMWrapper.cpp
两个文件,并且IDE自动更新了MyCustomEntity.idl
文件中的内容。
重写自定义实体的一个虚函数
为自定义实体重写subGetClassID()
虚函数,给*pClsid
赋值,这关系到COM包装的成败!
需要添加#include "MyCustomEntity_i.c"
代码,不能是MyCustomEntity_i.h
。
1 | Acad::ErrorStatus CustomEntity1::subGetClassID(CLSID* pClsid) const |
包装自定义实体属性
下面逐步讲解如何实现属性面板的制作,本文暂时仅考虑R1、R2、N三个属性的封装。
- 在
MyCustomEntity.idl
中添加接口声明
1 | interface IMyCE1OPM : IAcadEntity { |
- 在COM头文件中添加方法声明
1 | public: |
- 在COM头文件中声明属性映射
1 | BEGIN_OPMPROP_MAP() |
- 在COM头文件中定义属性号
1 |
- 在COM源文件中定义几个宏
1 |
- 在COM源文件中添加实现方法
1 | STDMETHODIMP_(HRESULT __stdcall) CCustomEntity1COMWrapper::get_R1(double* pVal) |
测试属性面板
重新编译自定义实体,加载dbx和arx文件,在模型空间添加自定义实体后,选中自定义实体后在属性面板上显示R1、R2、N
三个属性,调整这些属性可以驱动图形变化,很完美!