company-desktop
|
f668e29b6c
|
fix: 修复 AecDbEwEquipment 的 10 处逻辑缺陷
3.2 subErase:sName.Find(_T("接头")) 当布尔用,找不到返回 -1 也为真,
整个条件恒成立,删除任何设备都走阀门/接头的合并管线分支。补 != -1。
3.3 DrawHandFlg:else 分支写成 sFlag == _T("Y"),液动阀(3)符号文字一直是空串。
3.4 ProcessHlrResult:遍历 map 时 erase(it) 之后仍然 ++it。改成 while +
erase(it++),没有用 it = erase(it),因为 R190 走 C++98 标准,
C++03 的 map::erase(iterator) 返回 void。
3.5 GetSectionDraw:返回 nCount - nCoundPre(调用前减调用后),恒为 0 或负数。
改为 nCoundPre - nCount。全库调用点都忽略返回值,此前无实际故障。
3.8 copyFrom:补拷 m_bVert / m_idDash / m_idCenter。原来复制粘贴竖放阀门
会变横放,虚线与中心线的图层也丢失。
3.9 MakeBlockRefSet:判断的是累加器 ext 而不是本次的 extAdd,第一轮 ext 还是
空状态,第一个实体的范围永远加不进去;块参照分支不 continue,extAdd 会
沿用上一轮的值被重复累加。改为块参照跳过、extAdd 每轮新建并检查返回值。
3.10 byJson:br._len 是字节数,却按 new PVOID[br._len] 分配、按
sizeof(PVOID)*br._len 拷贝,源缓冲区越界读 7 倍。改为按字节分配拷贝,
并用 br._len 覆盖 m_nSize。
3.11 dwgInFieldsForXPrim:加 16MB 上限(kMaxXPrimDataSize),超限置
eInvalidInput 让整个 dwgInFields 退出;readBytes 检查返回值,失败时释放。
3.13 GetBodyBox:恒返回 TRUE,调用方无法区分是否取到几何;_ext 在循环外定义,
会把上一轮的累积结果重复并入。改为返回实际结果、每轮新建 _ext。
3.14 clearGeoBuffer:函数体只有 AssertWriteEnabled(),改完参数几何不刷新。
改为 Clean2DBuffer() + Clean3DBuffer()。
未处理,见文档 5.4:3.6 HLR_CALC 序列化(要动 AecDbObjXDataMap 公共类)、
3.7 GetInterface 数组版单位(影响 67 处调用)、3.12 mat4 双次变换(需确认是否刻意)。
|
2026-10-25 11:21:11 +08:00 |
|
company-desktop
|
f6d701a661
|
fix: 存盘不再清空组合设备的子单元(m_Combins)
dwgOutFieldsForXPrim 里的容错条件写成
m_eType != kRevitCombination || m_eType != kRevitCombination
恒为真,任何单元存盘前都会执行 m_Combins.clear():
- 组合设备(kCombination)写出去就是 0 个子单元,存盘一次几何永久丢失
- clear() 只清 vector 不释放指针,内存里的 XPrimData 全部泄漏
- 存盘是只读语义,原代码却在写盘路径里修改了对象状态
改为按实际有效数量写出,不修改对象状态;跳过 NULL 并单独计数,避免
"写了数量但循环少写一条"造成读写错位。同时删掉定义后未使用的 int num。
没有按原方案把条件改成 &&,也没有在读入端加过滤:m_Combins 只有组合
单元才会非空,写端正确后不存在"非组合类型带子单元"的数据,保留枚举
判断等于把正确性押在类型比较上,和原来的错误同源。
受影响的图纸里组合设备的子单元已经被写没了,无法从 dwg 恢复,不做数据
迁移。文档同步更新 3.1、5.2、5.4、6、8。
|
2026-10-25 10:30:19 +08:00 |
|
company-desktop
|
41397130e2
|
refactor: 统一 XPrimData::m_pData 为字节数组,releaseData 只保留 delete[]
releaseData() 原来按 m_eType 分两路(8 种 delete[],其余 delete),但同一类型
在内存里可能是对象也可能是字节数组:开图、JSON 导入、深拷贝都分配 new byte[],
而对话框里 setData<T> 的 default 分支和几处直接 new 分配的是对象。按类型判断
必然有一半场景不匹配。
- 13 处对象形式分配统一改成 new unsigned char[sizeof(T)],后续 (T*)m_pData
的用法不变
- releaseData() 去掉 switch,只保留 delete[];~XPrimData() 改为先调 releaseData(),
顺带修掉 m_Combins 子单元的 m_pData 泄漏
- AecDbEwEquipment::FreeSubPrimData() 取代 FreeBuffer(CPtrArray&),改成成员函数,
不再需要参数
- 另外三个文件作用域的 FreeBuffer/FreeBuffer2/FreeBuffer3 改名为 FreeEntityArray/
FreeComplexCurveArray/FreeFaceplanArray,并加 static 收回内部链接
- 删除 ReleaseXPrimData,直接 releaseData() + DELETE_PTR
|
2026-10-23 10:29:31 +08:00 |
|
company-desktop
|
03bbe08b76
|
fix: 修复 AecDbEwEquipment 的内存泄漏(夹点数组、几何单元、剖切与投影克隆)
|
2026-10-23 09:57:20 +08:00 |
|
company-desktop
|
55391b8dc8
|
docs: 补 AecDbEwEquipment 内存、缺陷与性能分析
|
2026-10-22 16:31:00 +08:00 |
|