- 积分
- 3266
- 明经币
- 个
- 注册时间
- 2002-7-5
- 在线时间
- 小时
- 威望
-
- 金钱
- 个
- 贡献
-
- 激情
-
|
发表于 2004-3-15 11:21:00
|
显示全部楼层
楼主的问题似乎可以通过块或者组来解决。ARX可以实现自定义实体类,这也是许多ACAD开发者从其它语言转入ARX的原因之一。不过,我认为楼主还没有理解ARX自定义实体的基本原理。自定义实体并不是从AcDbEntity类派生一个实体类就完事了的。要在ACAD图形数据库中绘图,必须重载AcDbObject基类的worldDraw()函数,在重载函数中调用AcGi几何接口库实现ACAD绘图(注意:这与调用AcDb类库绘图有很大的区别)。以下结合代码例子做个初步讲解:(注:本文代码经过裁剪,不是完整代码,可能不能编译。)- #include <acgi.h>
- 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类:- ACRX_DECLARE_MEMBERS(CMyEnt);
复制代码 在随后的私有(private)段中可以添加自定义类的特有属性。在worldDraw()函数的重载实现中,首先调用pMode->subEntityTraits().setColor(5);设置实体颜色,然后定义四个点,并调用AcGi类库的polyline模板绘制矩形,调用circle模板绘制圆。根据编程需要,还可以重载基类中的其它函数实现更复杂的功能。最后,将自定义实体添加到ACAD图形数据库可参考以下代码:- void test()
- {
- AcDbBlockTable *pBlkTbl;
- acdbHostApplicationServices()->workingDatabase()->getBlockTable(
- pBlkTbl,AcDb::kForRead);
- AcDbBlockTableRecord *pTblRcd;
- pBlkTbl->getAt(ACDB_MODEL_SPACE,pTblRcd,AcDb::kForWrite);
- pBlkTbl->close();
- CMyEnt *pMyEnt = new CMyEnt();
- pTblRcd->appendAcDbEntity(pMyEnt);
- pMyEnt->close();
- pTblRcd->close();
- }
复制代码 |
|