Kingtop 发表于 2002-11-21 20:08:00

如何判断块表中的实体在一个矩形范围内?

如题,有没有好的办法,遍历块表中的所有实体对象,将处于某一矩形的所有实体做成外部块。
该怎么实现?

leeyeafu 发表于 2002-11-22 11:35:00

使用AcDbEntity类的getGeomExtents()函数可能是关键

该函数的完整语法:
virtual Acad::ErrorStatus AcDbEntity::getGeomExtents(AcDbExtents& extents) const;
其中AcDbExtents是ARX为该函数专门设计的类,具体使用在以下代码中介绍。
如果,你要选择的实体是完全在规定的矩形区域内部,可以参考以下代码示例(你提出的另一个问题,若不需要与用户交互,是无须使用AcAp类库,你说的方法应该可行。)
AcDbEntity *pEnt;
AcDbExtents *extents;
AcGePoint3d min,max;//这两个参考用于从extents指针中取出内容
for(pBlkTblItr->start();!pBlkTblItr->done();pBlkTblItr->step())
//pBlkTblItr是你使用的块表记录浏览器指针
{
pBlkTblItr->getEntity(pEnt,AcDb::kForRead);
if(Acad::eInvalidExtents!=pEnt->getGeomExtents(extents))   /*getGeomExtents()函数在AcDbEntity层次不返回extents对象,因此,若你使用了自定义实体,且在类派生中未重载该函数,将不能得到extents指针,函数返回Acad::eInvalidExtents。*/
    {
       min=extents->minPoint();
       max=extents->maxPoint();
   }
   ....../*在这添加代码,实体pEnt处于以min为左下角,max为右上角的矩形区域中,将此矩形与你规定的矩形进行简单比较,就可判断实体是否满足你的要求,并作进一步处理。若你要选择的实体是类似CAD的交叉窗口选择,以上代码会有缺陷,曲线可能不与规定的矩形区域相交但它的extents区域可能满足条件,此时要利用boudingBoxIntersectWith()函数计算矩形区域与实体的交点来判断。*/
}

Kingtop 发表于 2002-11-22 19:12:00

insert方法插入的图形怎么不是图块,怎么转换为图块呢?

谢谢leayeafu,在你详细的指导下,终于完成了基本功能了,只是用acdbCurDwg()->insert(...);方法插入的图形怎么不是图块?如何把它们转换为图块呢,咳,ARX,要学的东西太多了。
页: [1]
查看完整版本: 如何判断块表中的实体在一个矩形范围内?