company-desktop-computer/refactor/x3dpart-lazy-solid AGit
main
与 AcDbX3dSolid::m_bNeedCreate 对齐:同一个语义(派生几何缓存失效, 首次使用时再算),用同一个名字,避免 m_bDirty 被理解成"参数没写完"。 声明为 mutable,与 AcDbX3dSolid 一致;清标志仍在 Rebuild() 里做。
方案 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 补回。
No dependencies set.
The note is not visible to the blocked user.
与 AcDbX3dSolid::m_bNeedCreate 对齐:同一个语义(派生几何缓存失效,
首次使用时再算),用同一个名字,避免 m_bDirty 被理解成"参数没写完"。
声明为 mutable,与 AcDbX3dSolid 一致;清标志仍在 Rebuild() 里做。