--- name: CADProject 图纸审查 Agent 工作 description: 基于 CadProject MCP 框架实现的 AutoCAD 图纸审查工具集(18 工具)与逐图框审查流程的目标、设计决策、交付物与遗留事项 type: project --- # CADProject 图纸审查 Agent 工作总结 ## 目标 在既有 MCP(Model Context Protocol)框架 `CadProject` 之上,构建一个 **让 LLM 能够审查 AutoCAD / 中望 CAD 图纸** 的 Agent(前提:CAD 进程已打开并加载插件)。 - 应用场景:**建筑** 与 **工业厂房** 图纸。 - 审图规则:**先让 LLM 自主判断**;后期再接入整理好的审图规范(建筑标准、工业管道标准等), 让 LLM 参照规范审核。 - 约束:所有 DLL 工具 **全部实现在 `cad_mcp_plugins` 工程内**;编写时 **封装常用函数**。 - 命名:源码前缀由 `review_` 改为 **`dwg_review`**。 - 额外需求:实现 **图框(drawing frame)识别**(参考网上 CAD 分图软件实现)。 - 交付顺序:先出 **详细工具规格** → 逐步实现 → 串联 **逐图框审查流程**。 **Why:** 用户希望 LLM 能像审图员一样通读整张图纸;先做工具能力,规范接入是二期。 **How to apply:** 后续新增审查能力时,继续走 `c++_dll` 后端 + 公共层复用;规范接入时 把规则做成可配置(见 `review_checklist.json`)而非硬编码。 --- ## 关键架构决策 ### 读类工具必须用 C++ DLL 三种后端中,只有 `c++_dll` 能**同步**返回数据/图片(`lisp_inline` / `lisp_file` 是异步的 `sendStringToExecute`)。审查 Agent 需同步取回图层/实体/文字/标注/截图,故 **全部读类工具走 DLL**。 ### 返回值信封(关键) `mcp_server.cpp` 的 `HandleToolsCall` 会 `resp.update(payload)`,把工具返回的 JSON **扁平化** 进响应。因此工具必须返回 **`{"result":{"content":[...]}}`** 信封,而非裸 JSON。 公共层用 `makeJsonResult()` 统一包裹 15 个数据类工具。 ### 线程模型(不可改动) TCP 线程只 `recv`,把请求封装成 `TaskData` 后 `PostMessage(WM_MCP_EXECUTE_TASK)` 投递给 主 UI 消息窗口;`ExecuteTaskInMainThread()` 运行在 **CAD 主线程**。任何调用 ARX API 的逻辑 必须在主线程派发链中执行。 --- ## 交付物 ### 新增源码(`src/cad_mcp_plugins/`) | 文件 | 作用 | | --- | --- | | `dwg_review_common.h` / `.cpp` | **核心公共层**,所有工具依赖它 | | `dwg_review_overview.cpp` | 图纸概览类工具 | | `dwg_review_query.cpp` | 实体/文字/标注/块/多段线查询工具 | | `dwg_review_frame.h` / `.cpp` | **图框识别**(含分图逻辑) | | `dwg_review_check.cpp` | 重复实体 / 零长度实体检查 | | `dwg_review_view.cpp` | 缩放定位 / 高亮工具 | `cmakelists.txt`:`SOURCES` 新增上述 6 个 `.cpp`。 ### 公共层 `dwg_review_common` - 参数解析:`parseCommonQuery` - 实体信息:`handleOf`、`layerOf`、`entityTypeName`、`entityBBox`、`blockNameOf` - 句柄解析:`objectIdFromHandle`(`AcDbHandle(const ACHAR*)` + `db->getAcDbObjectId()`) - 过滤:`wildcardMatch`、`layerAccepted`、`openSpace`、`forEachEntity` - 结果构造:`pageResult`、`makeError`、`makeJsonResult` - JSON 转换:`point2Json` / `point3Json` / `bboxJson` - 编码:`wstrToUtf8` / `acharToUtf8` - 错误码:`kErrBadParam=-32001`、`kErrNotFound=-32002`、`kErrNoDocument=-32003`、`kErrInternal=-32603` ### 图框识别 `dwg_review_frame` - 结构体:`DrawingFrame`、`FrameDetectOptions`、`FrameKind{Block, Polyline, LineLoop}` - 函数:`detectFrames`、`framesToJson`、`frameKindName` - 三类来源:**块参照** / **闭合多段线** / **直线闭环** - 幅面判定:ISO A 系列(A0–A4)、长宽比 √2、扩展幅面、比例推断猜幅面 - 辅助:`isFrameKeyword`、`guessSheet`、`finalizeFrame`、`acceptable`、`isClosedRect`、`collectLineLoops` - 导出工具 `detect_drawing_frames`(工厂 `CreateDetectDrawingFramesTool`) ### 工具全集(18 个) 概览:`get_drawing_info`、`get_layers`、`get_layouts` 查询:`query_entities`、`get_text_content`、`get_dimensions`、`get_block_references`、 `get_polylines_info`、`get_entity_detail` 图框:`detect_drawing_frames` 检查:`find_duplicate_entities`、`find_zero_length` 视图:`zoom_to_entity`、`zoom_to_window`、`highlight_entities` 已有:`zoom_window_normalized`、`zoom_extents`、`get_viewport_screenshot` ### 配置 - `src/cad_mcp_frame/cad-mcp-frame.json` — 模板,更新为 18 工具; `plugin_directory = "."`、`lisp_directory = "."`。 - `bin/Debug-R230/mcp_config.json` — **运行时注册枢纽**(`bin/` 已 gitignore,未入库),内容同上。 - `plugin_directory` 相对 `.arx` 所在目录解析 → 设为 `"."`。 ### 审查脚本与清单 - `dwg_review_agent.py`:逐图框审查流程。`MODEL_NAME`(默认 `deepseek-flash`)、 `CHECKLIST_PATH`(默认 `review_checklist.json`)。 流程:`detect_drawing_frames` → 每框 `zoom_to_window` + `query_entities(window)` + `get_text_content(window)` + `get_viewport_screenshot` → LLM 审查 → 汇总。 - `review_checklist.json`:**可配置审查清单**,5 大类 (图层规范性 / 文字 / 标注 / 几何 / 图面整体),每类含 `checks[]` 与 `severity`。 --- ## 构建与验证 - 通过:**R243 Release**、**R230 Release**、**R230 Debug**。 - DLL 导出确认 16 个工厂函数(`Create*Tool`),含 `CreateZoomToWindowTool`、`CreateDetectDrawingFramesTool`。 - 曾误以为缺 `.arx`:因早期只构建 `cad_mcp_plugins`,基座是独立目标 `cad_mcp_frame`,需一并构建。 - 已校验 JSON 配置(18 工具)、Python 语法、清单 JSON。 --- ## 修复过的坑 | 问题 | 修复 | | --- | --- | | `acdbGetObjectId` 不接受字符串 | 新增 `objectIdFromHandle()` | | `near` 是 Windows 遗留宏 | 重命名 `approxEq` | | `getIntoAsciiBuffer(buf)` 缺参数 | 补为 `getIntoAsciiBuffer(buf, 64)` | | `AcDbBlockReference` 无 `name()` | 改用 `blockNameOf()` | | `AcDbDimension::measurement()` 用法 | 改为 `measurement(double&)` | | `ACDB_MODEL_SPACE` 宽字符宏 | 用 `acharToUtf8` 转换 | | 缺 `` | 补 include | | 无 `dbviewport.h` | `AcDbViewport` 在 `dbents.h` | | 数据工具返回裸 JSON | 用 `makeJsonResult()` 统一包裹 | --- ## Git - 提交 `7310f44 feat(review): 新增图纸审查工具集与逐图框审查流程`(13 files, +2881/-59)。 - 首次 push 被拒(非快进);`git fetch` 见远程多出 `5493c06`(`envi-code/` 的 PCF→ISO 模块), 两边文件无重叠,`git pull --rebase origin main` 干净完成,`git push origin main` 成功。 --- ## 遗留 / 待办 1. `dwg_review_agent.py` 仍硬编码 DeepSeek API Key(已推送远程),建议改为环境变量 `DEEPSEEK_API_KEY`。 2. `review_checklist.json` 可补充「检查方法 / 阈值」;可加跨图框统计工具;可把清单移入 MCP 侧。 3. 后期整理建筑/工业管道等审图规范并接入,让 LLM 参照规范审核。