Commit Graph
4 Commits
Author SHA1 Message Date
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