From e25aa0a650435f5a9f341d5f9b81428473a906e0 Mon Sep 17 00:00:00 2001 From: LittleGuo Date: Fri, 9 Oct 2026 09:43:21 +0800 Subject: [PATCH] =?UTF-8?q?chore(memory):=20=E6=96=B0=E5=A2=9E=20ai.memory?= =?UTF-8?q?=20=E8=AE=B0=E5=BF=86=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - MEMORY.md 索引 + 分主题记忆文件 - project: 图纸审查 Agent 工作汇总 - feedback: 协作偏好(含 Git 推送规则:refs/for/main 触发 Gitea PR) - reference: 环境与外部资源 --- ai.memory/MEMORY.md | 9 ++ ai.memory/feedback_preferences.md | 64 +++++++++++ ai.memory/project_dwg_review_agent.md | 149 ++++++++++++++++++++++++++ ai.memory/reference_environment.md | 58 ++++++++++ 4 files changed, 280 insertions(+) create mode 100644 ai.memory/MEMORY.md create mode 100644 ai.memory/feedback_preferences.md create mode 100644 ai.memory/project_dwg_review_agent.md create mode 100644 ai.memory/reference_environment.md diff --git a/ai.memory/MEMORY.md b/ai.memory/MEMORY.md new file mode 100644 index 0000000..f6882fc --- /dev/null +++ b/ai.memory/MEMORY.md @@ -0,0 +1,9 @@ +# ai.memory — 记忆索引 + +> 本目录是用户的「AI 记忆库」,位于项目根目录 `CadProject/ai.memory/`。 +> 今后所有与记忆相关的数据都保存到这里,用户可随时接管该目录。 +> 组织方式:本文件是索引(一行一条),各主题内容放在独立文件中。 + +- [CADProject 图纸审查 Agent 工作](project_dwg_review_agent.md) — 基于 MCP 框架的图纸审查工具集与逐图框审查流程 +- [用户协作偏好](feedback_preferences.md) — 调试用 Debug/R230、模型 deepseek-flash、DLL 集中在 cad_mcp_plugins 等 +- [环境与外部资源](reference_environment.md) — 构建/运行要点、CAD SDK 路径、测试脚本 diff --git a/ai.memory/feedback_preferences.md b/ai.memory/feedback_preferences.md new file mode 100644 index 0000000..c532da8 --- /dev/null +++ b/ai.memory/feedback_preferences.md @@ -0,0 +1,64 @@ +--- +name: 用户协作偏好 +description: 用户在本项目中明确的工作方式偏好(调试版本、模型、代码组织、配置文件等) +type: feedback +--- + +# 用户协作偏好 + +## 【最高优先级】提交与推送流程(Gitea PR) + +- 规则:**今后所有提交都 commit 到当前分支 `home-ai-dev`**,然后**自动推送**到代码服务器并 + **创建 PR**。推送**必须严格使用**如下格式: + + ```bash + git push origin HEAD:refs/for/main/<你的分支名称> + ``` + +- **绝对禁止**使用常规的 `git push origin `。 +- **Why:** 必须带 `refs/for/main/` 引用格式,才能触发 **Gitea 的自动 PR 创建机制**。 + 其中 `main` 是**目标主分支**,`<你的分支名称>` 是当前工作的**临时特性分支**名。 +- **How to apply:** 例:当前分支为 `home-ai-dev` 时执行 + `git push origin HEAD:refs/for/main/home-ai-dev`。每次提交后自动完成推送 + 建 PR,无需再问。 + 注意 `home-ai-dev` 的 upstream 常显示 `[gone]`(合并后源分支被删),这不影响该推送方式。 + +## 调试用 R230 + Debug,不用 Release + +- 规则:涉及 CAD 版本的调试**只用 R230**,且配置用 **Debug**(非 Release)。 +- **Why:** 用户明确要求;Release 曾造成误解(只构建了插件目标、没见基座 `.arx`)。 +- **How to apply:** 任何联调/构建验证默认 `--config Debug` + `--preset R230`; + 需要交叉验证时可另编 R243。 + +## 视觉模型用 `deepseek-flash` + +- 规则:审查脚本调用的模型是 **`deepseek-flash`**,已确认支持视觉。 +- **How to apply:** 脚本默认模型名保持 `deepseek-flash`;不要擅自换成其它模型。 + +## 插件代码集中在 `cad_mcp_plugins` + +- 规则:DLL 工具的开发**全部实现在 `cad_mcp_plugins` 工程内**,便于统一管理。 +- **How to apply:** 新增审查工具放进该工程;不要散落到其它目标。 + +## 封装常用函数 + +- 规则:编写代码时注意**封装常用函数**,避免重复。 +- **How to apply:** 公共逻辑进 `dwg_review_common`;同类工具复用同一 helper。 + +## `mcp_config.json` 是注册工具的枢纽 + +- 规则:`mcp_config.json` 是向「基座」注册工具的**关键文件**,必须编辑它才能让工具生效。 +- **How to apply:** 新增工具要同步更新模板 `src/cad_mcp_frame/cad-mcp-frame.json` + 与运行时 `bin/-R230/mcp_config.json`;注意 `plugin_directory` 相对 `.arx` 目录解析。 + +## 命名前缀用 `dwg_review` + +- 规则:审查相关源码前缀用 **`dwg_review`**,不用 `review_`(不够明确)。 + +## `ai.memory/` 要入库并推送到服务器,**不要**加进 `.gitignore` + +- 规则:`CadProject/ai.memory/` 目录**不加入 `.gitignore`**,应作为 **`CadProject` 仓库的一部分** + 提交并推送到远程服务器(`cad-agent.git`),以便 AI 在其它机器上接手记忆。 +- **Why:** 用户希望记忆可跨机器共享/接管。 +- **How to apply:** 不要建议把 `ai.memory/` 加入 `.gitignore`;提交/推送时正常包含它。 + 截至 **2026-10-08** 用户表示「今天就算了」,故暂未加入/推送——后续时机由用户决定。 +- 背景:`CadProject` 已独立为单独仓库(远程 `cad-agent.git`);`ai.memory/` 目前仍是未跟踪状态。 diff --git a/ai.memory/project_dwg_review_agent.md b/ai.memory/project_dwg_review_agent.md new file mode 100644 index 0000000..f2b598c --- /dev/null +++ b/ai.memory/project_dwg_review_agent.md @@ -0,0 +1,149 @@ +--- +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 参照规范审核。 diff --git a/ai.memory/reference_environment.md b/ai.memory/reference_environment.md new file mode 100644 index 0000000..828d15f --- /dev/null +++ b/ai.memory/reference_environment.md @@ -0,0 +1,58 @@ +--- +name: 环境与外部资源 +description: CadProject 的构建/运行要点、CAD SDK 路径、测试脚本等外部资源指引 +type: reference +--- + +# 环境与外部资源 + +## 构建 + +- 系统:**CMake + vcpkg + Visual Studio 生成器**,通过 CMake Presets 区分 CAD 版本。 +- 产物:`bin/-/` 与 `lib/-/`。 +- 命令:`cmake --preset R230` → `cmake --build --preset R230 --config Debug`。 +- 可用 preset:`R180`–`R260`(AutoCAD,ARX 18–26)、`Z2023`–`Z2026`(ZWCAD,ZRX)。 +- 前置:需要 `VCPKG_ROOT`;必需 cache 变量 `CAD_SDK_ROOT`、`DEP_LIB_ROOT`、`DEP_INC_ROOT`、 + `CAD_SDK_VERSION`(AutoCAD 还需 `CAD_SDK_SUBVERSION`)。 + +## CAD SDK 路径 + +- AutoCAD:仓库同级 `../envi-code/Arx` +- ZWCAD:仓库同级 `../envi-code/Zrx` +- 在 `cmakepresets.json` 的 `CAD_SDK_ROOT` 中配置。 + +## 运行 / 联调 + +- 先启动 **已加载插件的 CAD**,确认 `127.0.0.1:8080` 在监听。 +- 脚本通过 TCP 连接 `127.0.0.1:8080` 收发 JSON-RPC。 + +## 测试脚本(根目录,非单元测试) + +| 脚本 | 作用 | +| --- | --- | +| `test.py` | 截图 → 发 DeepSeek 视觉模型 → 回答 | +| `test_autoagent.py` | 拉一次视口截图存 `test_screenshot.png` | +| `countOfCircle.py` | 伪造 `zoom_window_normalized` 调用,验证 TCP 链路 | +| `agent_loop.py` | 完整 Agent 循环(多回合),需 openai 包与 API Key | + +## 两个构建目标 + +| 目标 | 产物 | 作用 | +| --- | --- | --- | +| `src/cad_mcp_frame` | `cad_mcp_frame.arx`(ZWCAD 下 `.zrx`) | MCP **基座**:起 TCP、解析配置、路由执行 | +| `src/cad_mcp_plugins` | `cad_mcp_plugins.dll` | 示例 **C++ 工具插件**,ABI 动态加载 | + +## 三种工具后端(`backend.type`) + +- `lisp_inline`:`{占位符}` 替换后 `sendStringToExecute`(**异步**)。 +- `lisp_file`:`(load "文件" nil)` 后执行 `call_template`。 +- `c++_dll`:`LoadLibrary` + `acrxGetApiVersion` 版本校验 + 工厂/销毁函数(**同步**,可返回图像)。 + +## 远程仓库 + +- 现状(2026-10-08 起):`CadProject` 已从「某仓库的子目录」**独立为单独仓库**。 + - `origin` = `ssh://git@39.107.55.179:222/gjm/cad-agent.git` + - 当前分支 `home-ai-dev`;服务器只保留 `main`,采用 **PR 流程** + (`home-ai-dev` → `main`,合并后源分支被删除,故本地 `home-ai-dev` 的 upstream 显示 `[gone]`)。 + - 历史已被重写/重新初始化(哈希全新)。 +- 历史参考(旧):`new-start.git` = `ssh://gjm@47.93.46.28:1216/srv/git/new-start.git` -- 2.54.0