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:
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);
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user