Files
cad-agent/ai.memory/project_dwg_review_agent.md
T

149 lines
7.0 KiB
Markdown
Raw Normal View History

2026-10-09 09:43:21 +08:00
---
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` 转换 |
| 缺 `<algorithm>` | 补 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 参照规范审核。