docs: 增加 cad_mcp_aec 的说明与实测结果 #113

Merged
gjm merged 2 commits from company-desktop/company-desktop-computer/feat-cad-mcp-aec AGit into main 2026-10-29 22:17:40 +08:00
Collaborator

新增 cad-mcp-aec.md:工程结构、两处关键 CMake 设置(链接 CoreCommand、
不要定义 EARTHWORM_EXPORT)、12 个工具与单位约定、三个实现坑
(文档锁 / GetSpecialtyData 必须 kForRead / SetSection 清派生字段与
SetRegionSlab 不自动闭合)、端到端实测用例表、部署与启用步骤(含把
cad-mcp-aec.json 合进运行期 cad-mcp-frame.json 的脚本)、已知限制。

新增 cad-mcp-aec.md:工程结构、两处关键 CMake 设置(链接 CoreCommand、 不要定义 EARTHWORM_EXPORT)、12 个工具与单位约定、三个实现坑 (文档锁 / GetSpecialtyData 必须 kForRead / SetSection 清派生字段与 SetRegionSlab 不自动闭合)、端到端实测用例表、部署与启用步骤(含把 cad-mcp-aec.json 合进运行期 cad-mcp-frame.json 的脚本)、已知限制。
company-desktop added 3 commits 2026-10-29 21:52:08 +08:00
现象:工作计划第 2 项要求把自定义实体的 3D 缓存(m_ar3DDrableBufPtrs_)
用 acdbModelerSave/RestoreEntities*Filer 存进 DWG,再用 AecDbEwPipe 做开图时间对比,
判断这套机制有没有必要。

结论:按原方案对管道不做。数据(big1.dwg,AutoCAD 2020 / R230 Debug,开图 89 s):

- EwPipeBase::Draw3d 整函数 0.20~3.34 s(106~650 次),占开图 0.2~3.7%,
  而且随"开图时视图里有多少管道"变化;1088 个管道里大部分根本没画 3D。
- X3dPart::Rebuild 16.4~19.4 s(1248 次),占 18~22%,才是几何重建的大头。
- 基础体构造(GDU DrawPipe/Loft/Cylinder/Cone)合计 36.7 s,与上面有重叠,
  大头不在管道身上。

机制层面撞到三个坑(都写进文档了):

1. 附加块只能挂在叶子类。第一版挂在 AecDbEwPipeBase::dwgOut/InFields,
   AecDbBDPipeBase / XWall / XSlab / Beam / Weir 等派生类都继承它并在其后继续写字段,
   基类读尾部块等于吃掉派生类第一个字段,XWall 曲线长度读成垃圾后无限 append,
   开图从 89 s 变 10 分钟开不出来(xperf 采样定位到 AecComplexCurve::append)。
2. 增量存盘下 dwgOutFields 不会被调用。跟踪确认:开图期 AecDbEwPipe::dwgInFields
   被调 1088 次,而存盘时 AecDbEwPipe::dwgOutFields 被调 0 次;同一次存盘里
   XSlab 374 / XWall 333 / Weir 144 / Beam 126 等都写了(它们载入时被改脏)。
   ISAVEPERCENT=0、SAVEAS 到新文件都改变不了。→ "存盘顺带写字"只对本次改过的对象成立。
3. 3D 缓存本身只在画过之后才有内容,没画到的对象缓冲区是空的。

改动范围:
- 只保留两处 Debug-only 计时(AEC_PERF_COUNTER=1 才生效,Release 零开销):
  AecDbEwPipeBase::Draw3d(总耗时/重建/命中)与 AecDbX3dPart::EnsureCreated
  (构件重建耗时,作为"几何存盘"收益天花板)。
- modeler filer 试点代码(写块/读块/补非 brep)全部回退,不留死代码。
- 新增 3d-cache-dwg-verdict.md 记录数据、三个坑与建议。

验证方式:R230 Debug 编译通过并部署;big1.dwg 冷启动多次实测,
计数器见 %TEMP%\aec_section_perf.txt;卡死那次的栈用 tools/perf_diagsession.py 解析。
未做 R190 / Z2026 编译(本轮没有平台相关代码,试点代码已回退)。

已知风险:无(新增代码只在 Debug+AEC_PERF_COUNTER=1 下计时)。
现象:cad_mcp_frame 的插件机制只能挂"纯 AcDb 层"的只读工具
(cad_mcp_plugins 不链接 CoreCommand,拿不到 AecDbEwPipe / AecDbXWall /
AecDbXSlab / AecDbColumn / AecDbBeam 这些类的实现),agent 没法改仓库的自定义实体。

改动:新建 SourceCode/Code2026/cad_mcp_aec,仍是普通 DLL(由 frame 运行时
LoadLibrary),但链接 CoreCommand_BAL_REMOTE(内含静态库 CoreLibrary),
因此可以 new / 修改这五类实体。cmake 照 PipelineCmd 的写法,并在顶层
cmakelists.txt 里挂在 cad_mcp_frame 同一处(C++11+ 才编,R180/R190 跳过)。

12 个工具(每个实体一个 create + 一个 update,外加 list/get):
  list_aec_entities / get_aec_entity
  create_aec_pipe   / update_aec_pipe
  create_aec_wall   / update_aec_wall
  create_aec_slab   / update_aec_slab
  create_aec_column / update_aec_column
  create_aec_beam   / update_aec_beam

单位约定:坐标与建筑尺寸用图纸单位;管道的 dn_mm / od_mm /
wall_thickness_mm 用毫米,内部按 AS_MUNIT 转米(与 BZGDDlg、AecPipeLineTool 一致)。
update_* 只改传入字段;管道只给一个端点时另一端沿用实体现有值。

实现上撞到三个坑,都已修:
1. MCP 工具在主线程消息里跑、不在命令上下文,写库必须先
   acDocManager->lockDocument(),否则 appendAcDbEntity 返回
   eLockViolation(0x140)。用 DocLock RAII 包起来。
2. 只读实体上取专业数据必须 GetSpecialtyData(AcDb::kForRead):
   该函数缺省参数是 kForWrite,第一次实现没注意,直接把 acad 崩了
   (%TEMP%\acminidump.dmp)。
3. SetSection() 会清掉 PIPE_THICK 等派生字段("只改 DN"会把壁厚清成 0);
   AecDbXSlab::SetRegionSlab(AcGePoint2dArray&) 内部连线不补闭合点,
   传点串必须自己首尾闭合。两处都按实测结果处理了。

验证方式:
- R230 Debug、Z2026 Debug 两个 preset 编译通过并自动部署
  (cad_mcp_aec.dll,12 个工厂函数 + g_mcpPluginApiVersion 都在导出表里)。
- AutoCAD 2020 实测(临时把工具合进部署目录的 cad-mcp-frame.json,测完还原):
  tools/list 返回 30 个工具;pcf_1.dwg 上 list 出 20 根管道;
  五种实体各建一次并用 get 读回参数一致;管道改 DN+单端点后壁厚保留;
  板改厚/标高生效;类型不匹配与非法 handle 返回 -32004 / -32002。
  详见 cad-mcp-aec.md 第 5 节的用例表。

已知限制:只支持这五类实体;新建实体要等一次 REGEN 才有 bbox;
工具没有事务包装;运行期工具描述需要把 cad-mcp-aec.json 的 tools 追加到
部署目录的 cad-mcp-frame.json(插件侧的 private_description 已内置同样的文案)。
新增 cad-mcp-aec.md:工程结构、两处关键 CMake 设置(链接 CoreCommand、
不要定义 EARTHWORM_EXPORT)、12 个工具与单位约定、三个实现坑
(文档锁 / GetSpecialtyData 必须 kForRead / SetSection 清派生字段与
SetRegionSlab 不自动闭合)、端到端实测用例表、部署与启用步骤(含把
cad-mcp-aec.json 合进运行期 cad-mcp-frame.json 的脚本)、已知限制。
gjm approved these changes 2026-10-29 22:17:36 +08:00
gjm merged commit c85b1b645e into main 2026-10-29 22:17:40 +08:00
Sign in to join this conversation.
No Reviewers
No labels
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: gjm/envi-code#113