company-desktop
|
4523690cc5
|
revert: 删除 modeler filer 存 3D 缓存的全部代码(实测该 API 写读不能配对)
结论(用户实测):acdbModelerSaveEntityToDwgFiler 写出的数据,
用 acdbModelerRestoreEntityFromDwgFiler 读回来 CAD 直接报错、实体丢失。
这两个函数不是一对可逆读写,不能用来把绘制缓存塞进 DWG 再取回来。
本仓库自己的现象与之一致:
- 单条静态数据时"读回 len=1 / setASMBody 成功 / 包围盒正确"只是巧合;
- 一旦多条混排或与别的字段交错,读端就错位,表现为
"打开图形文件发现一个错误" + 实体变 ZOMBIEENTITY(造型.dwg 的 2D5 就是);
- 之前加的读端防护(magic/count/尾标记/失败回退)只能保证不把文件写得更坏,
改变不了"写进去的字节读不回同一个几何"这个根本问题。
删除范围(对应之前几个 PR):
- AecDbEntityCommon: Write3DBufferBlock / Read3DBufferBlock(#125)
- AecDbEwFitting: 上述两个函数的调用点(#125)
- AecDbX3dPartEntity: WriteX3dGeomBlock / ReadX3dGeomBlock 及调用点(#118)
- AecDbX3dPart.h/.cpp: GetDwgCacheSolid / SetDwgCacheSolid(#118)
- AecDbMultiPartEntity: 3D 缓存块,版本号回到 3(#131/#132)
- cmakelists.txt: AEC_HAS_MODELER_FILER 能力宏
共 -612 行。
保留:AEC_PERF_COUNTER 计时(EwPipeBase::Draw3d / X3dPart::Rebuild /
MultiPartEntity::Draw3d)。它们只回答"开图期画了多少、花了多久",与存盘格式无关,
以后评估"隐藏块里放真实 3DSOLID"或 SAT 通道时还用得上。
结论与后续方向写进 3d-cache-dwg-verdict.md §10。
验证:R230 Debug 编译通过(CoreCommand_BAL_REMOTE,零 error)。
|
2026-10-30 19:01:19 +08:00 |
|
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 |
|
company-desktop
|
b5c0ea3004
|
Update AecDbMultiPartEntity.cpp
|
2026-10-30 10:56:53 +08:00 |
|
gjm
|
164968b62e
|
chore
把非utf8-bom编码的cpp/h文件改为 utf8 bom 编码, msvc识别utf8编码时,如果不是bom格式的,会使用当前cp_oem来解码.
|
2026-10-04 00:04:20 +08:00 |
|
gjm
|
345044cb46
|
初始化提交
|
2026-09-28 15:28:50 +08:00 |
|