Files
envi-code/SourceCode
company-desktop 3daad7a33d fix: 修 AecDbMultiPartEntity 的 3D 缓存块三个缺陷,并加绘制计时
在 #131 的基础上把 dwgIn/dwgOut 里的 3D 缓存块做成"坏了也能自愈"的版本。
用 造型.dwg(1 个该类实体)实测过:v4 + magic 的读路径能正确恢复
(1 条 ASM、setASMBody 成功、包围盒与原几何一致)。

修的三处:
1. **count 与实际写入数不一致(会写坏文件)**:原来先 writeInt32(ar.length()),
   循环里再跳过非 brep 和取不到 ASM 的实体 → 记的数比实际 payload 多。
   读端按 count 读就会多吃后面的字节、把实体流读坏(实测 造型.dwg 里已经出现
   ZOMBIEENTITY,用户打开时也提示"实体损坏、需要修复")。
   现在先一次性锁住并收集要写的 body,count 一定等于实际写出的条数。
2. **块没有自描述**:加上 magic 'A3DP' + 块版本 + 尾标记。读不到 magic 就是老数据
   (v3 或别人写的 v4),直接跳过、照旧重建;块不完整(缺尾/条数不符)也整体丢弃重建。
3. **dwgInFields 末尾返回 filerStatus()**:探测 magic 失败会把状态置成 eEndOfFile,
   整个实体就会被判成读取失败。现在显式 return eOk。

另外:`AecDbMultiPartEntity::Draw3d` 加了 AEC_PERF_COUNTER 计时
(total / .build / .cached),用来量"这类实体开图画 3D 到底花多少"。

实测(R230 Debug):
- 造型.dwg:该类实体恢复成功,但开图期 Draw3d 计数 = 0(模型空间里只有 1 个
  ZOMBIE + 7 个标准实体,这个多部件实体不在模型空间)→ 时间和缓存无关;
- big1.dwg(86 s 开图):60 个多部件实体,Draw3d 计数同样是 0 → 开图期没画,
  所以"存 ASM / 普通存盘"两种方式的开图时间差 ≈ 0。
  要测出差异,需要一张"多部件实体可见、开图就会画"的图。
2026-10-30 13:02:40 +08:00
..
2026-09-28 15:38:57 +08:00