quickly 发表于 2003-8-22 16:13:00

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

我想自己定义一个实体类,这个类由多个圆和矩形构成的图形,他的可以被整体的拖动,
点击这个实体的任何一部分时,整个实体被选中。我能够察看到我选择的实体的类名。

莫名 发表于 2004-3-13 21:57:00

没有人知道吗?

cag 发表于 2004-3-14 18:21:00

是啊,下面这个怎么做?


       

C:\Documents and Settings\cag\桌面\ccd.bmp

leeyeafu 发表于 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;
pMode->subEntityTraits().setColor(5);
point.set(10.0,10.0,0.0);
point.set(20.0,10.0,0.0);
point.set(20.0,30.0,0.0);
point.set(10.0,30.0,0.0);
pMode->geometry().polyline(4,point);
       AcGeVector3d nor(1.0,1.0,0.0);
pMode->geometry().circle(point,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();
}

hello 发表于 2004-3-16 21:27:00

除此之外,还要定义,Transformby,grippoint,snappoint,explode,deepclone等等一些函数,ARX自带一些例子,你可以先读一下那些例子,对custom object有一些了解
页: [1]
查看完整版本: 创建自定义的实体类,急呀!!