feat(review): PDF/图片离线源适配(C1)—— 无需 CAD 的整条审查链路
支持直接审查 PDF 与位图图纸,全链路离线(不连 CAD、不连 8080 端口)。 渲染在内存内完成,复用既有墨迹热力图 + 自适应瓦片规划。 - 新增 dwg_review/sources.py - detect_source / plan_file / collect 统一入口 - PdfReader:pypdfium2 惰性导入,页序即图框序,处理 /Rotate 与 crop 边距 - ImageReader:世界单位 = 源像素,snap_box 整数对齐保证窗口与像素严格一致 - ink_grid:纯 PIL 灰度阈值 → 占用网格(不引入 numpy) - ReviewContext.create(connect_cad=False):离线时 client/tools 均为 None - 全链路 ctx.tools is None 守卫:review 只读子循环 / inspect_region / annotator / checks 的窗口类检查 / 绘图区最大化 - checklist.build_system_prompt(allow_tools=False, offline=True):离线提示词 - __main__:位置参数 source,按扩展名自动判定源类型并决定是否连 CAD - config 新增 8 个常量(PDF_MAX_PAGES / 文本最小字数 / 各源缩放上限 / 墨迹阈值等) - tiling.content_predicate 与 heatmap.cell_box 提升为公开函数 验证: - pytest 457 passed - verify_pdf_source.py:PDF 23/23、图片 9/9(不需 CAD),含实测瓦片字高像素与 旋转映射自检(文本区墨迹 0.311 vs 忽略 /Rotate 反向对照 0.145) - 真实 LLM 端到端:20 页 HVAC 图纸前 3 页跑通,结论具体可核验且未编造 handle 已知局限:页边线在墨迹网格里会把整页连成单簇,瓦片常退化为整页象限(CAD 侧 靠 drop_oversized 丢图框块,离线侧暂无等价手段),留待后续打磨。
This commit is contained in:
1 parent
d4a9442e30
commit
6143bb9ab2
32 files changed
+2617
-77
No files matched your search
@@ -49,11 +49,22 @@ type: reference
|
||||
| `verify_drawing_area.py` | 绘图区最大化验收:基线 → `set_drawing_area(max)` → `restore`,断言窗口矩形/最大化态/绘图区尺寸全回位(实测 3.68×) |
|
||||
| `verify_review_maximized.py` | 审查全链路验收:在 `collect`/`review_frame` 入口各采一次窗口矩形,断言**取证与审查两阶段都在最大化态**、结束精确还原;并统计子循环 zoom/截图次数 + 记录 LLM 实际调用的取证工具(含虚拟工具 `inspect_region`) |
|
||||
| `verify_collisions.py` | `find_collisions` 验收:工具注册 / 全模型与逐图框粗筛 / **容器过滤**(图框块剔除)/ `min_overlap` 阈值 / 分页 / `narrow` 细筛 / `--inject` 注入干涉正例(画 2 个深重叠矩形 → 应报出 ratio≈0.902 → 清理)。**只读**(`--inject` 段除外,会自动清理) |
|
||||
| `verify_pdf_source.py` | **PDF / 图片离线源验收(不需要 CAD)**:离线上下文断言 / 页序 / evidence 同形 / 图片窗口在图框内 / **实测瓦片字高像素达标** / **旋转映射自检**(文本区墨迹 vs 忽略 `/Rotate` 反向对照)/ `--dump` 导出目视包 / `--llm` 追加真实 `python -m dwg_review` 端到端 |
|
||||
|
||||
> 历史:根目录 `test.py` / `test_autoagent.py` / `countOfCircle.py` / `agent_loop.py` /
|
||||
> `dwg_review_agent.py` 五个遗留调试脚本已于 2026-10-14 删除(前三个含硬编码 API Key,
|
||||
> 后两个是重复实现)。`test_screenshot.png` 是 `test_autoagent.py` 的残留产物。
|
||||
|
||||
## Python 运行时依赖(2026-10-16 起)
|
||||
|
||||
- 仓库根新增 **`requirements.txt`**(运行时)与 `requirements-dev.txt`(仅 pytest)。
|
||||
- `openai>=1.0`(LLM 客户端,Key 走环境变量 `DEEPSEEK_API_KEY`)
|
||||
- `Pillow>=10.0`(截图下采样、墨迹分析、离线标定)
|
||||
- `pypdfium2>=4.30`(PDF 源适配:内存渲染 + 带 bbox 抽文本)
|
||||
- 选它而非 PyMuPDF:**许可证干净**(Apache-2.0/BSD vs AGPL-3.0)、
|
||||
wheel 为 `py3-none-<platform>`(**与 Python 版本无关**,实测 Python 3.14.5 直接可用)、体积小(~4MB)。
|
||||
- 实测环境:Python **3.14.5**,`pypdfium2 5.14.0`(`py3-none-win_amd64`)。
|
||||
|
||||
## 两个构建目标
|
||||
|
||||
| 目标 | 产物 | 作用 |
|
||||
@@ -93,7 +104,9 @@ type: reference
|
||||
本仓库已设置 `git config core.sshCommand "ssh -i ~/.ssh/id_ed25519_guojianming -o IdentitiesOnly=yes"`。
|
||||
换机器时需补该配置或加入 `~/.ssh/config`。
|
||||
|
||||
## 真实测试图纸(2026-10-15)
|
||||
## 真实测试图纸
|
||||
|
||||
**CAD 源(2026-10-15)**
|
||||
|
||||
- 图纸:`e:\desktop\agent_test.dwg`(用户制作的真实 Plant 3D 图纸:3 个图框 A0/A1/A2,
|
||||
86 个实体:`AECDBEWFITTING` 40 / `AECDBEWPIPE` 29 / `AECDBEWEQUIPMENT` 14 / `INSERT` 3)。
|
||||
@@ -101,3 +114,12 @@ type: reference
|
||||
—— 必须带 `/p SHS-ENVI2026` profile,否则**自定义实体无法显示**(该 profile 自动加载
|
||||
用户写的显示插件)。
|
||||
- 实测:`python -m dwg_review --frames 1` 端到端可跑通并出报告。
|
||||
|
||||
**PDF 源(2026-10-16)**
|
||||
|
||||
- 图纸:`E:\desktop\05 暖通专业图纸.pdf`(**20 页**,A3/A4 混排,`/Rotate 90`)。
|
||||
页 0 = 封面(仅一行标题字);页 1 = 图纸目录(**有文本层**,43 个文本矩形);
|
||||
页 2 起 = 真实施工图(**0 个文本矩形**,文字全是 SHX 描边)。
|
||||
- 实测:`python -m dwg_review "E:\desktop\05 暖通专业图纸.pdf" --frames 3`(**离线、不连 CAD**)
|
||||
端到端跑通,VLM 报出设备标注叠压、定位尺寸缺失、材料表空白等具体问题。
|
||||
- 图片源样本:由该 PDF 第 3 页渲染的 `out/verify_pdf_source/page2.png`(2717×1945,测试产物)。
|
||||
Reference in new issue
Block a user