Files
cad-agent/ai.memory/project_dwg_review_agent.md
T
gjm e25aa0a650 chore(memory): 新增 ai.memory 记忆库
- MEMORY.md 索引 + 分主题记忆文件
- project: 图纸审查 Agent 工作汇总
- feedback: 协作偏好(含 Git 推送规则:refs/for/main 触发 Gitea PR)
- reference: 环境与外部资源
2026-10-09 09:43:21 +08:00

150 lines
7.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
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 参照规范审核。