楼主的问题似乎可以通过块或者组来解决。ARX可以实现自定义实体类,这也是许多ACAD开发者从其它语言转入ARX的原因之一。不过,我认为楼主还没有理解ARX自定义实体的基本原理。自定义实体并不是从AcDbEntity类派生一个实体类就完事了的。要在ACAD图形数据库中绘图,必须重载AcDbObject基类的worldDraw()函数,在重载函数中调用AcGi几何接口库实现ACAD绘图(注意:这与调用AcDb类库绘图有很大的区别)。以下结合代码例子做个初步讲解:(注:本文代码经过裁剪,不是完整代码,可能不能编译。)
-
- #include
- class CMyEnt:public AcDbEntity
- {
- public:
- ACRX_DECLARE_MEMBERS(CMyEnt);
- private:
- char *property;
- public:
- CMyEnt();
- ~CMyEnt();
- Acad::ErrorStatus getProperty(char *property);
- virtual Acad::ErrorStatus dwgInFields(AcDbDwgFiler*);
- virtual Acad::ErrorStatus dwgOutFields(AcDbDwgFiler*) const;
- virtual Acad::ErrorStatus dxfInFields(AcDbDxfFiler*);
- virtual Acad::ErrorStatus dxfOutFields(AcDbDxfFiler*) const;
- virtual Adesk::Boolean worldDraw(AcGiWorldDraw *pMode);
- };
- Acad::ErrorStatus CMyEnt::getProperty(char *property)
- {
- assertReadEnabled();
- strcpy(property,this->property);
- return Acad::eOk ;
- }
- Adesk::Boolean CMyEnt::worldDraw(AcGiWorldDraw *pMode)
- {
- AcGePoint3d point[4];
- pMode->subEntityTraits().setColor(5);
- point[0].set(10.0,10.0,0.0);
- point[1].set(20.0,10.0,0.0);
- point[2].set(20.0,30.0,0.0);
- point[3].set(10.0,30.0,0.0);
- pMode->geometry().polyline(4,point);
- AcGeVector3d nor(1.0,1.0,0.0);
- pMode->geometry().circle(point[0],10.0,nor);
- return Acad::eOk;
- };
以上代码未给出dwgInFields(),dwgOutFields(),dxfInFields(),dxfOutFields()等函数的重载实现,在实际编程时必须考虑如何重载这四个函数,以保证正确读写包含自定义类实体的DWG或者DXF文件。自定义类实现的关键问题在于worldDraw()函数的重载实现。在类定义中首先声明ACRX类:复制代码在随后的私有(private)段中可以添加自定义类的特有属性。在worldDraw()函数的重载实现中,首先调用pMode->subEntityTraits().setColor(5);设置实体颜色,然后定义四个点,并调用AcGi类库的polyline模板绘制矩形,调用circle模板绘制圆。根据编程需要,还可以重载基类中的其它函数实现更复杂的功能。最后,将自定义实体添加到ACAD图形数据库可参考以下代码:复制代码 |