- MEMORY.md 索引 + 分主题记忆文件 - project: 图纸审查 Agent 工作汇总 - feedback: 协作偏好(含 Git 推送规则:refs/for/main 触发 Gitea PR) - reference: 环境与外部资源
7.0 KiB
name, description, type
| name | description | type |
|---|---|---|
| CADProject 图纸审查 Agent 工作 | 基于 CadProject MCP 框架实现的 AutoCAD 图纸审查工具集(18 工具)与逐图框审查流程的目标、设计决策、交付物与遗留事项 | 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成功。
遗留 / 待办
dwg_review_agent.py仍硬编码 DeepSeek API Key(已推送远程),建议改为环境变量DEEPSEEK_API_KEY。review_checklist.json可补充「检查方法 / 阈值」;可加跨图框统计工具;可把清单移入 MCP 侧。- 后期整理建筑/工业管道等审图规范并接入,让 LLM 参照规范审核。