company-desktop/company-desktop-computer/feat-cad-mcp-aec AGit
main
新增 cad-mcp-aec.md:工程结构、两处关键 CMake 设置(链接 CoreCommand、 不要定义 EARTHWORM_EXPORT)、12 个工具与单位约定、三个实现坑 (文档锁 / GetSpecialtyData 必须 kForRead / SetSection 清派生字段与 SetRegionSlab 不自动闭合)、端到端实测用例表、部署与启用步骤(含把 cad-mcp-aec.json 合进运行期 cad-mcp-frame.json 的脚本)、已知限制。
现象:工作计划第 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 已内置同样的文案)。
No dependencies set.
The note is not visible to the blocked user.
新增 cad-mcp-aec.md:工程结构、两处关键 CMake 设置(链接 CoreCommand、
不要定义 EARTHWORM_EXPORT)、12 个工具与单位约定、三个实现坑
(文档锁 / GetSpecialtyData 必须 kForRead / SetSection 清派生字段与
SetRegionSlab 不自动闭合)、端到端实测用例表、部署与启用步骤(含把
cad-mcp-aec.json 合进运行期 cad-mcp-frame.json 的脚本)、已知限制。