Commit Graph
14 Commits
Author SHA1 Message Date
company-desktop 3afc2dd7c1 perf: 增加截面恢复路径的 Phase 0 计数器(Debug 探针)
按 pipe-section-region-performance-plan.md 的 Phase 0 落地。目的不是提速,而是先拿到
三个决定性数字,再判断截面缓存(Phase 1)到底值不值得做:
1) 每次截面恢复多贵(µs),一次开图共多少次;
2) 同一份 SAT 文本被重复恢复多少次(唯一 hash 数 / 模拟命中率)——直接决定缓存收益上限;
3) 临时文件写入次数与字节数(杀软扫描影响面),以及打开图纸时的回写次数。

改动:
- 新增 inc/SectionPerfCounter.h + CoreLibrary/SectionPerfCounter.cpp
  - Scope(QPC 计时)+ NoteRegionText(FNV-1a 64 位 hash,统计唯一数与模拟命中)
    + NoteTempFile + NoteWriteBack + Dump/Reset
  - 计数器实例放在函数内 static:CoreLibrary 是静态库且只被 CoreCommand 链接,
    所以 CoreCommand.arx 里只有一份,两个入口共用
- AecDbEwPipeBase.cpp:RegionAcisInDwgInFields / RegionAcisoutDwgOutFields 接入
- CoreTools.cpp:StringToRegion 两个重载 / RegionToString 接入
- EarthWorm.cpp:注册 ENVIPERFDUMP / ENVIPERFRESET(仅 Debug)
- CoreLibrary/cmakelists.txt 加一个源文件
- 计划文档的 Phase 0 补上实际命令与采集项

开关:启动 CAD 前 set AEC_PERF_COUNTER=1;命令 ENVIPERFDUMP 打印并追加到
%TEMP%\aec_section_perf.txt,ENVIPERFRESET 清零。
Release 下 Enabled() 恒为 false,调用点只剩一次 bool 判断。

不改任何几何逻辑与存盘格式。

验证:R230 Debug 编译通过(CoreLibrary_BAL_REMOTE、CoreCommand_BAL_REMOTE,无新增 warning),
产物已自动部署到 c:\ShangHuaSoft\Envi3D-2026-M\R230\。
R190 未在本机编译(缺 v100 工具集);代码刻意只用 C++98 特性,控制台输出改走 %hs,
避开了 &wstring[0] 这类老 STL 上的写法问题。
尚未做 CAD 实测:需要开图后跑 ENVIPERFDUMP 才看得到数据。
2026-10-28 19:31:27 +08:00
home-laptop 75819c0b72 修复 XEquipment 外壳/Impl 分离机制的 M1-M7 缺陷
- M1 createParamEquImpl 成功替换前释放旧 impl,消除 inplace 编辑泄漏
- M2 copyFrom2 先克隆成功再替换,避免旧 impl 泄漏或被置空
- M3 copyFrom 补基类深拷贝并兜底重建 impl,修复 clone/复制得到空壳
- M4 在 XEquipmentImplBase 注明 impl 不拥有 xdata 的所有权契约
- M5 draw3dByImp 改用临时数组,绘制失败时保留旧 3D 缓存并提示
- M6 抽出 makeTempClone(),集中 ToJson 的克隆/补数据/拷 part 流程
- M7 getUniqueName 的 %s 统一传 LPCTSTR、修正 sizeof,XL 的 %d 改 %f
2026-10-26 22:36:28 +08:00
company-desktop 41397130e2 refactor: 统一 XPrimData::m_pData 为字节数组,releaseData 只保留 delete[]
releaseData() 原来按 m_eType 分两路(8 种 delete[],其余 delete),但同一类型
在内存里可能是对象也可能是字节数组:开图、JSON 导入、深拷贝都分配 new byte[],
而对话框里 setData<T> 的 default 分支和几处直接 new 分配的是对象。按类型判断
必然有一半场景不匹配。

- 13 处对象形式分配统一改成 new unsigned char[sizeof(T)],后续 (T*)m_pData
  的用法不变
- releaseData() 去掉 switch,只保留 delete[];~XPrimData() 改为先调 releaseData(),
  顺带修掉 m_Combins 子单元的 m_pData 泄漏
- AecDbEwEquipment::FreeSubPrimData() 取代 FreeBuffer(CPtrArray&),改成成员函数,
  不再需要参数
- 另外三个文件作用域的 FreeBuffer/FreeBuffer2/FreeBuffer3 改名为 FreeEntityArray/
  FreeComplexCurveArray/FreeFaceplanArray,并加 static 收回内部链接
- 删除 ReleaseXPrimData,直接 releaseData() + DELETE_PTR
2026-10-23 10:29:31 +08:00
company-desktop 8ca9519320 refactor: X3dPart 的懒加载标志改名 m_bNeedCreate 并加 mutable
与 AcDbX3dSolid::m_bNeedCreate 对齐:同一个语义(派生几何缓存失效,
首次使用时再算),用同一个名字,避免 m_bDirty 被理解成"参数没写完"。
声明为 mutable,与 AcDbX3dSolid 一致;清标志仍在 Rebuild() 里做。
2026-10-22 15:41:14 +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
company-desktop 4e658a8ae9 refactor: 水池截面中转文件改用 CoreTools::getTempFilePath
删除 Pool3dCmd/PoolSectionTemp.h,JMDBDlg、JMSJDlg、HZQTDlg 共 7 处
改为 CoreTools::getTempFilePath(_T("JMSJ_"), _T(".sat"), 目录)。

同时修 getTempFilePath 自身的问题:
- 传了有效父目录时 sParentPath 没有赋值,会拼出 "\JMSJ_xxx.sat"
- 父目录为空时仍对 pszParentPath 调 _taccess,参数可能是 NULL
- return sPath(); 语法错误
- objId 用 %lu 格式化 Adesk::ULongPtr,64 位下会截断,改 %I64u

temp-file-naming.md 同步改为介绍这个通用函数。
2026-10-22 10:06:51 +08:00
company-desktop 8941246b16 refactor: 管道截面统一存 SAT,曲线写路径退役
SectionRegionDwgOutFields 不再 explode 后按曲线写,改为固定写 nLen=0 +
RegionAcisoutDwgOutFields。读取端 nLen==0 本来就识别 SAT 通道,因此
kCurrentVersionNumber 保持 7,新图在老插件上仍可还原。

同时修 SAT 通道自身缺陷:
- RegionAcisoutDwgOutFields:临时文件名加进程号;new char[nLen] 补 +1 并
  清零;检查短读,短读或空文件退回原生写法,不再把未初始化内存写进 DWG;
  acisOut/Open 失败分支补 DeleteFile;两个重复的 errorfile 分支合并为
  WriteRegionNativeFallback,顺带修掉 7 字节泄漏
- RegionAcisInDwgInFields:临时文件名只取纯文件名,拒绝 DWG 里夹带的路径
  成分和盘符;errorfile 分支补 delete[];create/dwgInFields/acisIn 失败
  分支加日志并正确释放;acisIn 返回的非 region 实体不再泄漏
- 删除 RegionExplodeDwgOutFields(写路径退役后无调用者)
2026-10-21 22:15:49 +08:00
company-desktop f80ec56189 fix: AcDbX3dSolid 正确性小修(失败留痕/缓存失效/GSMarker/死代码)
- StringToRegion 两个重载在 fixACISFormat 拒绝时打印长度与 SAT 首行,
  原来完全静默,现场只表现为构件消失,无法定位
- ReCreate 统一失效绘制缓存:清 m_pSolidDraw、m_arRegionFaces、
  m_pSubDMeshDraw。原来只有 AddMove/ResetMove/AddRotate/ResetRotate 清,
  TransformBy/SetSolidData/SetOrgPoint 调完 ReCreate 后 Draw3d 仍画旧几何
- GSMarker 改用独立成员 m_nGSMarker,不再借用 m_sszPoint2ds。
  后者在 kExtrude/kLoft/kSweep 里存断面/路径串,SetGSMarkerID 会覆盖成数字,
  导致 ReCreate 静默失败、几何丢失
- 删除 GetDrawSubDMesh 中 return 之后的 28 行不可达代码
- GetDraw2d / ByJson 补注释说明现状
2026-10-21 15:31:27 +08:00
company-desktop 81215c8fe1 perf: AcDbX3dSolid 几何改为懒重建
- 新增 m_bNeedCreate 标志与 EnsureCreated():dwgInFields 与拷贝构造
  不再立即 ReCreate,延迟到首次访问几何时重建
- 开图时不再对每个单元逐个走 SAT 临时文件(acisOut/acisIn),
  显著降低开图耗时;Clone 也省掉一次重建
- 所有读取 m_pSolid/m_pSubDMesh 的入口统一走 EnsureCreated:
  GetNative3dSolid / GetDraw3dSolid / GetNativeSubDMesh /
  GetDrawSubDMesh / GetDrawSubDMesh2D / GetCentoridPoint
- GetDrawSubDMesh 补 m_pSubDMesh 空指针保护
- TransformBy 保持原有行为(参数变更后必须重建)
2026-10-21 10:01:17 +08:00
gjm c84bc78869 重构底层
重构AecDbEntityBase,AecDbCurveBase
2026-10-19 09:19:05 +08:00
company-desktop 199abb989c 重构: AecDbObjXDataMap 解耦 UI,并统一 SetAt/数组实现
- AecXData 的 ctor/Free/CopyFrom 由头部 inline 移入 .cpp,结构体加
  AECDLLIMPEXP 导出,修复其它模块构造 AecXData 时的 LNK2019。
- 抽出私有 SetXData(pszKey, xdata) 助手,替换各 SetAt 中重复的
  find/Free+覆盖/insert 逻辑,并接管 xdata 所有权。
- 数组二进制块统一为 [kArrayMagic][元素类型][元素个数][数据...],元素类型
  复用 AecXData::EType;新增元素类型无需再加魔数或类型标签。
- 矩阵/数组魔数集中到 .cpp 顶部常量,便于维护。
- List(CListCtrl*, int) 改为 List(std::vector<CString>&):去掉 MFC 控件与
  nImage 依赖,每个元素输出 key/value 两项;CCKSXDlg::ListXDataMap 相应改为
  构造 vector 后填充两列列表。
2026-10-13 15:28:19 +08:00
company-desktop 0467086e65 重构: AecXData 类型标签改用枚举 AecXData::EType
- 在 AecXData 内新增 enum EType,取值直接采用 wtypes.h 的 VARENUM(VT_*),
  与原实现逐位一致(nVt 会序列化进 DWG/DXF/XData,数值必须保持不变)。
- 各模块共 303 处 nVt 判断由裸 VT_* 改为 AecXData::kTypeXxx,涉及 18 个文件;
  仅调试打印用的字符串字面量保持原样。
- AecDbObjXDataMap.h 增加 #include <wtypes.h>(EType 引用 VT_*)。
2026-10-13 09:55:42 +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