首页 > 其他分享 >objectarx中,块引用bounds返回的结果跟预期不一致的解决方法

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

时间:2024-10-22 11:09:26浏览次数:7  
标签:pBlockTableRecordIter bounds pBlockTableRecord objectarx es close pBlockRef pEnt

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

相关文章

  • 自定义组件-组件的创建和引用
    全局引用 局部引用全局引用VS局部引用组件和页面的区别 ......
  • PHP 正则表达式 修正符【m s x e ? (?i)】内部修正符 贪婪模式 后向引用 断言【总结篇
    1.正则表达式修正符在PHP中,正则表达式中的修正符(modifier)可以改变模式的行为,使得其功能更加灵活。1.m修正符(多行模式)作用:在多行模式下,^和$元字符除了匹配整个字符串的开头和结尾外,还可以匹配每一行的开头和结尾。举例: "Hello\nWorld",当使用/^World/m时,^会匹配"W......
  • golang项目引用GitHub私有仓库module
    1.创建gomodule项目module的名字假设为go-testmodule项目创建成功后,将go.mod文件中的module"go-test"修改成module"github.com/tonglin0325/go-test"避免引用的时候goget的时候报错,如下gogetgithub.com/tonglin0325/go-test@latestgo:github.com/tonglin0325......
  • js查缺补漏——引用类型对象和数组
    一、什么是引用类型——Object引用类型是一种数据结构,而对象是引用类型的实例。有时候也叫对象定义,包含对象的属性和方法。Object是原生引用类型之一。创建对象实例的方法:1.使用new操作符varobj=newObject()obj.name="aaa"obj.age=122.使用对象字面量的......
  • 【信奥赛·C++基础语法】CSP-J C++ 指针与引用
    序言指针和引用是非常重要的概念,它们提供了对内存的直接访问和操作方式,使得程序员能够更加灵活地处理数据哈,理解指针和引用的工作原理以及正确使用它们,对于编写高效、安全的C++程序至关重要。一、指针的基本概念指针的定义和作用指针是一个变量,它存储了另一个变量的内......
  • C++ 基础-面试题02(final和override关键字、sizeof和strlen区别、strcpy、sprintf 与me
    1.final和override关键字在C++中,final和override关键字是在面向对象编程中用于处理类的继承和多态的。它们主要用于管理派生类和虚函数,提供额外的安全性和代码可读性,防止意外的函数重写或错误的重载行为。1.final关键字final关键字用于防止进一步的继承或函数重......
  • 【Golang】踩坑记录:make()创建引用类型,初始值是不是nil!!
    文章目录起因二、得记住的知识点1.make()切片,初始化了吗?2.make()切片不同长度容量,append时的差别3.切片是指向数组的指针吗?4.切片扩容时,重新分配内存,原切片的数据怎么办?三、咳咳,总结一下起因序列化的时候居然给我空指针报错,哪nil啦???猛一顿查,查到了创建的结构体......
  • 使用Pydantic和SqlAlchemy实现树形列表数据(自引用表关系)的处理,以及递归方式处理数据差
    在我的设计框架业务中,字典大类、部门机构、系统菜单等这些表,都存在id、pid的字段,主要是作为自引用关系,实现树形列表数据的处理的,因为这样可以实现无限层级的树形列表。在实际使用Pydantic和SqlAlchemy来直接处理嵌套关系的时候,总是出现数据在Pydantic的对象转换验证上,爬坑一段时间......
  • 自然语言处理:第五十二章 LongCite:助力RAG应用,让大模型精准找到引用
    代码:https://github.com/THUDM/LongCite\数据:HF:https://huggingface.co/datasets/THUDM/LongCite-45k魔搭:https://modelscope.cn/datasets/AI-ModelScope/LongCite-45k模型:HF:https://huggingface.co/THUDM魔搭:https://modelscope.cn/organization/ZhipuAIDemo:https:/......
  • problemmatcher 引用无效: $esbuild-watch vscode插件报错
    vscode插件esbuild类型提示报错最近在上手开发vscode插件,demo阶段就遇到了一个小问题。搜索引擎没有特别好的回答,记录一下,以供查漏补缺。vscode插件开发做为一统前端的开发插件,vscode+其丰富的插件能力,共同构建了欣欣向荣的vscode插件。在团队效率方面,也是不可或缺的利器......