chore(memory): 新增 ai.memory 记忆库 #2
No files matched your search
@@ -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 路径、测试脚本
|
||||||
@@ -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 <branch_name>`。
|
||||||
|
- **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/<Config>-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/` 目前仍是未跟踪状态。
|
||||||
@@ -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` 转换 |
|
||||||
|
| 缺 `<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 参照规范审核。
|
||||||
@@ -0,0 +1,58 @@
|
|||||||
|
---
|
||||||
|
name: 环境与外部资源
|
||||||
|
description: CadProject 的构建/运行要点、CAD SDK 路径、测试脚本等外部资源指引
|
||||||
|
type: reference
|
||||||
|
---
|
||||||
|
|
||||||
|
# 环境与外部资源
|
||||||
|
|
||||||
|
## 构建
|
||||||
|
|
||||||
|
- 系统:**CMake + vcpkg + Visual Studio 生成器**,通过 CMake Presets 区分 CAD 版本。
|
||||||
|
- 产物:`bin/<Config>-<TAG>/` 与 `lib/<Config>-<TAG>/`。
|
||||||
|
- 命令:`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`
|
||||||
Reference in new issue
Block a user