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
|
010d91af04
|
feat: X3dPart 几何块存盘/恢复(env 开关,默认关)+ 中望放开 modeler filer
按"3dbuffer 非空才存、空就不存、读不到就重建"的语义实现第一版:
- 块写在 AecDbX3dPartEntity::dwgOutFields **末尾**,读在 dwgInFields 末尾探测
magic 'A3DP'。不写在 AecDbX3dPart 里:part 是嵌在实体流中间的子流
(它后面还有 m_drawable2d),老版本会把块的字节当成后续字段读。
- 读不到 magic / 块不完整 / modeler 恢复失败 → 一律保持 m_bNeedCreate 走重建,
不刷日志、不动 kCurrentVersionNumber(老版本读新图 = 照旧重建)。
- 内存 filer(clone / copyFrom / 剪贴板)不参与,避免拷贝出来的实体夹带用不上的缓存。
- 探测块会让 filer 状态变成 eEndOfFile,所以 dwgInFields 末尾显式 return eOk,
不再 return pFiler->filerStatus()(否则整个实体会被判读取失败)。
- AecDbX3dPart 加两个存盘用访问器:GetDwgCacheSolid()(脏/没建过返回 NULL)、
SetDwgCacheSolid()(接管恢复出来的 solid,顺带丢掉 m_pSolidDraw 让绘制副本重建)。
- cmakelists.txt:AEC_HAS_MODELER_FILER 对中望也放开(ZRX/Z20xx/arxport/inc/dbacis.h
把 acdbModeler* 映射到 zcdbModeler*,ZwDatabase.lib 有这些符号)。
- 开关 AEC_3D_DWG_CACHE:默认关(确认收益前不改存盘结果),=1 打开;
AEC_3D_CACHE_TRACE=1 时把每次 read/write 写 %TEMP%\aec_x3d_cache.log。
实测(big1.dwg,R230 Debug):
- 开图期探测到 220 个 part 实体,全部 miss(老图,正常回退重建);
- 存盘(MOVE+REGEN+QSAVE)后跟踪日志 **0 条 write**,DWG 只多 128 KB:
这 220 个 part 实体在存盘时不是脏的,增量存盘按字节整块拷贝,dwgOutFields 没被调用;
- 而 X3dPart::Rebuild 是 1138 次 —— 说明 1248 个 part 里只有 220 个是入库实体,
其余 ~918 个是 AecDbBDPipeBase/AecDbSlab/AecDbWeir/AecDbWell 等绘制期 new 出来的临时 part。
结论(已写进 3d-cache-dwg-verdict.md §8):这一版覆盖面上限 220/1248 ≈ 18%,
而且是"part 自己的流里带缓存"这个方案的天生缺陷;下一步要么挂到**所有者实体**
(它们存盘时确实是脏的,写得出去),要么做**图级中央缓存**。等决策后再动。
|
2026-10-29 23:51:31 +08:00 |
|
company-desktop
|
5a5cd08721
|
perf: X3dPart 布尔结果改为按需重建,开图不再逐件建体
方案 A(见 AcDbX3dSolid-refactor-plan.md 第 13 节)。开图慢的瓶颈是
AecDbX3dPartEntity::dwgInFields 无条件调 m_pPart->Create(),每个 part 都要
N 次建体 + N 次布尔。
A1:引入 m_bDirty
- AecDbX3dPart 增加 m_bDirty,构造/拷贝构造置 true
- 15 个改参数的接口置脏:AddX3dSolid、RemoveAt、RemoveAll3dSolidRec、
SetOrgPoint、SetAxis、SetBoolOperFor、SetHide、SetActive、PeelOffTheSkin、
AddMove×2、ResetMove、AddRotate、ResetRotate、CopyFrom
- 新增 Rebuild()(protected):清标志后无条件重建,原 Create() 的函数体
- 新增 EnsureCreated():m_bDirty 或 m_pSolid 为空时才 Rebuild
Create() 保持「显式调用一律重建」的语义,内部转调 Rebuild()。原因是外部
有 10 处先取 GetX3dSolid(0) 直接改(如 AecDbBDPipeBase:941 调 TransformBy)
再调 Create(),部件感知不到这类改动,做成幂等会漏掉重建。
A2:开图不建几何
- AecDbX3dPartEntity::dwgInFields 去掉 m_pPart->Create(),由
AecDbX3dPart::dwgInFields 结尾置脏
- 读入口统一先 EnsureCreated:CreateDraw3dSolid、Draw3d、getOsnapPoints、
GetForHouseSubtract
收益:关闭/冻结图层、视口外、XREF/审核/发布等不绘制的场景完全省掉建体与
布尔;全图可见时开图时间下降、首次 regen 补回。
|
2026-10-22 15:07:18 +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 |
|