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 补回。
This commit is contained in:
company-desktop-computer committed 2026-10-22 15:07:18 +08:00
1 parent b75b779518
commit 5a5cd08721
3 files changed
+49 -1

No files matched your search

+4
View File
@@ -71,6 +71,7 @@ public:
int GetBoolOperFor() const;
bool Create();
bool EnsureCreated() const;
AcDb3dSolid* CreateDraw3dSolid() const;
int GetForHouseSubtract(AcDbVoidPtrArray& arSolidPtrs) const;
@@ -117,6 +118,8 @@ public:
protected:
bool Rebuild(); //无条件重建布尔结果
//序列化
CString m_sName;
CString m_sGUID;
@@ -138,6 +141,7 @@ protected:
bool m_bActive; //活动状态
int m_nPeelOff; //是否需要剖开
AcDb3dSolid* m_pSolid; //原始solid元
bool m_bDirty; //参数已变更,几何待重建
mutable AcDb3dSolid* m_pSolidDraw; //临时绘制solid元
mutable SHJson::WValue m_json;
};