明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2999|回复: 4

创建自定义的实体类,急呀!!

[复制链接]
发表于 2003-8-22 16:13:00 | 显示全部楼层 |阅读模式
我想自己定义一个实体类,这个类由多个圆和矩形构成的图形,他的可以被整体的拖动,
点击这个实体的任何一部分时,整个实体被选中。我能够察看到我选择的实体的类名。
发表于 2004-3-13 21:57:00 | 显示全部楼层
没有人知道吗?
发表于 2004-3-14 18:21:00 | 显示全部楼层
是啊,下面这个怎么做?


       

C:\Documents and Settings\cag\桌面\ccd.bmp
发表于 2004-3-15 11:21:00 | 显示全部楼层
楼主的问题似乎可以通过块或者组来解决。ARX可以实现自定义实体类,这也是许多ACAD开发者从其它语言转入ARX的原因之一。不过,我认为楼主还没有理解ARX自定义实体的基本原理。自定义实体并不是从AcDbEntity类派生一个实体类就完事了的。要在ACAD图形数据库中绘图,必须重载AcDbObject基类的worldDraw()函数,在重载函数中调用AcGi几何接口库实现ACAD绘图(注意:这与调用AcDb类库绘图有很大的区别)。以下结合代码例子做个初步讲解:(注:本文代码经过裁剪,不是完整代码,可能不能编译。)
  1. #include <acgi.h>
  2. class CMyEnt:public AcDbEntity
  3. {
  4. public:
  5.   ACRX_DECLARE_MEMBERS(CMyEnt);
  6. private:
  7.   char *property;
  8. public:
  9.   CMyEnt();
  10.   ~CMyEnt();
  11.   Acad::ErrorStatus getProperty(char *property);
  12.   virtual Acad::ErrorStatus dwgInFields(AcDbDwgFiler*);
  13.   virtual Acad::ErrorStatus dwgOutFields(AcDbDwgFiler*) const;
  14.   virtual Acad::ErrorStatus dxfInFields(AcDbDxfFiler*);
  15.   virtual Acad::ErrorStatus dxfOutFields(AcDbDxfFiler*) const;
  16.   virtual Adesk::Boolean worldDraw(AcGiWorldDraw *pMode);
  17. };
  18. Acad::ErrorStatus CMyEnt::getProperty(char *property)
  19. {
  20.   assertReadEnabled();
  21.   strcpy(property,this->property);
  22.        return Acad::eOk ;
  23. }
  24. Adesk::Boolean CMyEnt::worldDraw(AcGiWorldDraw *pMode)
  25. {
  26.   AcGePoint3d point[4];
  27.   pMode->subEntityTraits().setColor(5);
  28.   point[0].set(10.0,10.0,0.0);
  29.   point[1].set(20.0,10.0,0.0);
  30.   point[2].set(20.0,30.0,0.0);
  31.   point[3].set(10.0,30.0,0.0);
  32.   pMode->geometry().polyline(4,point);
  33.        AcGeVector3d nor(1.0,1.0,0.0);
  34.   pMode->geometry().circle(point[0],10.0,nor);
  35.   return Acad::eOk;
  36. };
以上代码未给出dwgInFields(),dwgOutFields(),dxfInFields(),dxfOutFields()等函数的重载实现,在实际编程时必须考虑如何重载这四个函数,以保证正确读写包含自定义类实体的DWG或者DXF文件。自定义类实现的关键问题在于worldDraw()函数的重载实现。在类定义中首先声明ACRX类:
  1. ACRX_DECLARE_MEMBERS(CMyEnt);
复制代码
在随后的私有(private)段中可以添加自定义类的特有属性。在worldDraw()函数的重载实现中,首先调用pMode->subEntityTraits().setColor(5);设置实体颜色,然后定义四个点,并调用AcGi类库的polyline模板绘制矩形,调用circle模板绘制圆。根据编程需要,还可以重载基类中的其它函数实现更复杂的功能。最后,将自定义实体添加到ACAD图形数据库可参考以下代码:
  1. void test()
  2. {
  3.   AcDbBlockTable *pBlkTbl;
  4.   acdbHostApplicationServices()->workingDatabase()->getBlockTable(
  5.    pBlkTbl,AcDb::kForRead);
  6.   AcDbBlockTableRecord *pTblRcd;
  7.   pBlkTbl->getAt(ACDB_MODEL_SPACE,pTblRcd,AcDb::kForWrite);
  8.   pBlkTbl->close();
  9.   CMyEnt *pMyEnt = new CMyEnt();
  10.   pTblRcd->appendAcDbEntity(pMyEnt);
  11.   pMyEnt->close();
  12.   pTblRcd->close();
  13. }
复制代码
发表于 2004-3-16 21:27:00 | 显示全部楼层
除此之外,还要定义,Transformby,grippoint,snappoint,explode,deepclone等等一些函数,ARX自带一些例子,你可以先读一下那些例子,对custom object有一些了解
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-26 02:44 , Processed in 0.167260 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表