最近在写一个根据图框批量导出图框内容的arx插件,但是在确定图框的范围的时候,返现使用bounds函数返回的结果比真实的范围要大,最小点相同,但是最大点要更大一些,点击图框,发现很远处还有一个蓝点,但是炸开之后蓝点就不见了,然后依次选择炸开的元素,发现是有些文字太长,因此,解决办法就是忽略文字的长度,或者可能有办法单独处理文字的范围,我这里就选择忽略单行文字和多行文字的范围,遍历块引用,重新确定图框块的范围。
1 void GetBlockReferenceExtents(AcDbObjectId blockRefId, AcDbExtents& extents) 2 { 3 Acad::ErrorStatus es; 4 AcDbBlockReference* pBlockRef; 5 es = acdbOpenObject(pBlockRef, blockRefId, AcDb::kForRead); 6 if (es != Acad::eOk) 7 { 8 acutPrintf(_T("\nFailed to open block reference")); 9 return; 10 } 11 12 // 获取块参照的变换矩阵 13 AcGeMatrix3d xform = pBlockRef->blockTransform(); 14 15 // 获取块参照的块表记录 16 AcDbBlockTableRecord* pBlockTableRecord; 17 es = acdbOpenObject(pBlockTableRecord, pBlockRef->blockTableRecord(), AcDb::kForRead); 18 if (es != Acad::eOk) 19 { 20 pBlockRef->close(); 21 acutPrintf(_T("\nFailed to open block table record")); 22 return; 23 } 24 25 // 遍历块表记录中的所有实体 26 AcDbBlockTableRecordIterator* pBlockTableRecordIter; 27 es = pBlockTableRecord->newIterator(pBlockTableRecordIter); 28 if (es != Acad::eOk) 29 { 30 pBlockTableRecord->close(); 31 pBlockRef->close(); 32 acutPrintf(_T("\nFailed to create block table record iterator")); 33 return; 34 } 35 36 bool firstEntity = true; 37 38 for (; !pBlockTableRecordIter->done(); pBlockTableRecordIter->step()) 39 { 40 AcDbEntity* pEntity; 41 es = pBlockTableRecordIter->getEntity(pEntity, AcDb::kForRead); 42 if (es != Acad::eOk) 43 continue; 44 if (pEntity->isKindOf(AcDbText::desc()) || pEntity->isKindOf(AcDbMText::desc())) 45 { 46 //忽略文字的长度 47 pEntity->close(); 48 continue; 49 } 50 // 获取实体的边界框 51 AcDbExtents entityExtents; 52 pEntity->getGeomExtents(entityExtents); // 使用 getGeomExtents 而不是 bounds 53 54 // 将实体的边界框转换到块参照的坐标系 55 entityExtents.transformBy(xform); 56 57 // 更新总边界框 58 if (firstEntity) 59 { 60 extents = entityExtents; 61 firstEntity = false; 62 } 63 else 64 { 65 extents.addExt(entityExtents); 66 } 67 68 pEntity->close(); 69 } 70 71 delete pBlockTableRecordIter; 72 pBlockTableRecord->close(); 73 pBlockRef->close(); 74 }
转换这部分的代码是大模型写的,具体的原理我也不清楚,但是这个函数可以实现重新计算块引用的范围,忽略文字。
标签:pBlockTableRecordIter,bounds,pBlockTableRecord,objectarx,es,close,pBlockRef,pEnt From: https://www.cnblogs.com/Archicoder/p/18492210