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。
This commit is contained in:
company-desktop committed 2026-10-25 10:30:19 +08:00
1 parent 61316a5f9f
commit f6d701a661
2 files changed
+39 -22

No files matched your search

@@ -275,16 +275,24 @@ namespace
if (CurrentVer >= 5)
{
// 做一下容错
if (pSolid->m_eType != AecEqui::kRevitCombination || pSolid->m_eType != AecEqui::kRevitCombination)
pSolid->m_Combins.clear();
int num(pSolid->m_Combins.size());
pFiler->writeInt32((Adesk::Int32)pSolid->m_Combins.size());
//只有组合单元(kCombination)会带子单元。原来这里的判断写成
//m_eType != kRevitCombination || m_eType != kRevitCombination,恒为真,
//任何单元存盘前都会被 clear()——组合设备写出去就是 0 个子单元,
//而且 clear() 不释放指针,内存里的对象也被破坏。
//存盘是只读语义,这里只按实际数量写出,不修改对象状态。
//(写端不再产生"非组合类型带子单元"的数据,读端不需要额外容错)
int nCount = 0;
for (size_t i(0); i < pSolid->m_Combins.size(); ++i)
{
AecEqui::XPrimData *pp(pSolid->m_Combins[i]);
dwgOutFieldsForXPrim(pSolid->m_Combins[i], pFiler, CurrentVer);
if (pSolid->m_Combins[i] != NULL)
++nCount;
}
pFiler->writeInt32((Adesk::Int32)nCount);
for (size_t i(0); i < pSolid->m_Combins.size(); ++i)
{
if (pSolid->m_Combins[i] != NULL)
dwgOutFieldsForXPrim(pSolid->m_Combins[i], pFiler, CurrentVer);
}
pFiler->writeString((LPCTSTR)pSolid->m_sName);
}