objectarx中,块引用bounds返回的结果跟预期不一致的解决方法

最近在写一个根据图框批量导出图框内容的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 }
复制代码

转换这部分的代码是大模型写的,具体的原理我也不清楚,但是这个函数可以实现重新计算块引用的范围,忽略文字。

posted on   路人甲也码  阅读(50)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示