xing_hu 发表于 2002-9-11 23:38:00

怎样得到由AcDbSpline对象组成的块中的点的信息?

现有一个由几个AcDbSpline类的对象组成的block,想求各个Spline的控制顶点集合,以构造这个block所表示的形状的凸包。

如果用AcDbEntity::explode()将block炸开,返回的AcDbVoidPtrArray中有很多指针且无法判断其类型(由4个AcDbSpline类的对象组成的block,explode()返回的AcDbVoidPtrArray中有十几个指针)。

考虑过是不是可以用GS marker和subentity的方法解决。但Arx reference上说:“Currently, the only entities that support subentities are bodies, regions, solids, and mlines.”那么,块(block)就不支持subentity了。

究竟该怎样做呢?请各位大虾不吝赐教。谢谢!

leeyeafu 发表于 2002-9-12 09:08:00

在图形数据库中有该块的块表记录,具体是这样

无论这个由几个AcDbSpline类的对象组成的block是用户make的还是程序生成的,都应该有个块名,根据这个块名,可以浏览组成该块的各个实体。给你一个例子程序,你改改应该能用。
void MyBlockIterator()
{
char name;
ads_getstring(0,"\n请输入块名:",name);
if (name=='\0') return;
AcDbBlockTable *pBlkTbl;
acdbCurDwg()->getBlockTable(pBlkTbl,AcDb::kForRead);//当前数据库块表
AcDbBlockTableRecord *pBlkTblRcd;
pBlkTbl->getAt(name,pBlkTblRcd,AcDb::kForRead);//以name命名的块的块表记录
AcDbBlockTableRecordIterator *pBlkIter;
pBlkTblRcd->newIterator(pBlkIter);//块表浏览器
for(pBlkIter->start();!pBlkIter->done();pBlkIter->step())//浏览块表的方法
{
   AcDbEntity *pEnt;
   if (strcmp(pEnt->desc(),"AcDbSpline")){
      ......//在这添加你自己的代码
   }
   pEnt->close();
   }
   delete pBlkIter;//不要忘记了释放内存
   pBlkTbl->close();
   pBlkTblRcd->close();
}

xing_hu 发表于 2002-9-12 19:11:00

出手好快呀!多谢!

原来是钻了牛角尖,倒把基本的思路和方法给忘了,呵呵。

程序加上一句pBlkIter->getEntity(pEnt, AcDb::kForRead);改一句if (pEnt->isKindOf(AcDbSpline::desc()))

xing_hu 发表于 2002-9-13 00:19:00

再问:怎样将这样的块插入到当前的文件中,成为可见的实体呢?

是不是要用到deep clone?

leeyeafu 发表于 2002-9-13 07:47:00

不需要deep clone

你可新建一个AcDbBlockRefrence对象,其构造函数为:
AcDbBlockReference(const AcGePoint3d& position,AcDbObjectId BlkTblRcdId);
其中,参数position是新块的插入点,BlkTblRcdId是原有块在块表记录中的块表ID号,可用pBlkTblRcd->objectId();函数获取。
最后,谢谢你对前面的源程序的修改。
页: [1]
查看完整版本: 怎样得到由AcDbSpline对象组成的块中的点的信息?