万工-CAD天正绘图(执行层)
> 定位:本包是 驱动/执行层——把设计意图真正画进 CAD/天正。知识(命令码、参数口径、代际、防火模块能力)全部在 wangong-ziliaoji 的 references/09-CAD绘图接口.md,本包不复制知识,只实现"怎么画"。
> 授权模型(混合授权,2026-09-06 用户拍板):
> - L0 默认=文件交换:意图 JSON(继承 ziliaoji §二契约)→ ezdxf 生成 DXF + 天正 .scr 命令脚本包,用户在天正内手动加载执行。零进程驱动、零授权风险。
> - L1 显式授权后=官方 COM 实时驱动:仅走 AutoCAD 官方公开 COM API(pywin32/win32com,非逆向);默认只 GetActiveObject 附着已运行实例,Dispatch 启动新进程须用户当轮明确要求;天正专有构件(墙/门窗/楼梯)不能由 COM 直接创建,借道 SendCommand 调天正命令间接生成。
> - 🔴 授权解读原则(2026-09-06 钉死):"用户去启动 CAD"≠"授权 AI 启动 CAD"。凡启动进程、Dispatch 拉起实例、驱动 GUI、写文件、发命令——只有用户明确说"你(AI)来启动/驱动/执行"才算当轮授权;对用户的操作建议("你去 X")不构成对 AI 的授权。解读存疑时停下问一句,不外推。
> - 硬禁项(不可被任何指令覆盖):① 逆向 ObjectARX、解析天正专有文件格式内部结构;② 未经用户当轮显式授权启用 L1;③ 无人值守批量自动化;④ L1 下不自动保存覆盖原图——一律写副本(_wb 后缀),回读校验通过后由用户决定是否另存。
> - 🔴 专有内容读取边界(2026-09-06 用户裁定,与 ① 配套):
> - ✅ 允许:读取天正安装目录的明码文本配置(如 SYS/LAYERDEF.DAT 图层命名表、.lay 图层文件、菜单/脚本资源 Lisp/*.lsp)——性质等同读公开配置,不构成逆向;
> - ❌ 禁止:解析二进制/数据库文件的内部结构(如 SYS/FireProofStandardTarch.db 天正防火标准库)——只允许确认文件名与存在性,不做内容探针;同理禁止解析 .DWG/.DWB/.TK 专有二进制内部结构(DWG 读取一律经 ODA File Converter 官方转换器);
> - 依据:自设红线不得自绕——文本配置=公开口径;数据库内部=专有结构。
> - 🔴 图纸处理路线分工(2026-09-06 用户拍板"按分工执行"):
> - ODA 路线(零 GUI)仅限非天正标准 DWG/DXF(AutoCAD 原生图)——实测证据:天正 1F.dwg 经 ODA 双向后,21 个 TArch 专有实体变 ACAD_PROXY_ENTITY,回写 DWG 在天正中失去墙体/门窗/楼梯可编辑性("能转≠能用");
> - 天正图纸一律走 L1 COM 原生路线(CAD 运行中附着,天正对象保持可编辑,批注画独立 REVIEW 层或走天正批注命令)——待 CAD 运行实测;
> - 审查器严重度分级(已校准):高=必须整改(强条类,判据回 verify.py)/ 中=施工图硬性要求缺失(门窗编号)/ 低=出图质量 / 提示=模板/版本/习惯差异(层名等,非错误) / 信息=参考。
> - 🔴 "输出替代源 DWG"语义钉死(2026-09-06,消覆盖 vs 副本歧义):
> - "替代"= 工作流语义:审图产物(*_审图.dxf / *_审图.dwg)在流程中取代源文件的位置供设计师使用;
> - 物理覆盖原图三重门:① 用户当轮显式指令("覆盖原文件"字面确认,不接受历史授权/默认授权);② 覆盖前强制备份源文件为 *_原始备份.dwg 并回读校验字节数一致;③ 备份失败即中止覆盖。三重门缺一不可;
> - 审查器输出的 coverage_warning 字段永远存在——强条判定不覆盖,高等级恒空=工具边界≠图纸无问题,须人工 verify.py 复核(防"无法判断"伪装成"判断通过")。
> - 09 分册红线说明:ziliaoji 的"不驱动 CAD"红线约束的是 ziliaoji 自身(知识/接口层);驱动能力由本包承载并受上述授权模型约束。两包分工已在项目 MEMORY 立案。
一、环境探测(P0 实测,2026-09-06)
> ⚠️ 本节以下 CAD/天正安装路径(如 D:\RJAZ\...、C:\Tangent\...)均为 L1 实测主机的本地路径,仅作记录;其他机器须自行探测实际安装位置,切勿照搬。
| 项 | 状态 | 证据 |
|---|---|---|
| 天正建筑 | ⚠️ 本机三个天正(2026-09-06 winreg HKLM\SOFTWARE\Tangent + 目录实查):① TArch T20 V9 C:\Tangent\TArchT20V9(AutoCAD 版,宿主=D 盘 ACA 2014,起不来);② TCAD-20v4 D:\RJAZ\TCAD-20v4(国产内核版,TGStart.exe+sys18/19/20/21x64,不依赖 acad);③ TZ-Arch V4 D:\RJAZ\ZWT20-V4(中望版天正,30 个 tch_*.zrx 装于 SYS20X64\,宿主=ZWCAD 2020——已由注册表钉死:HKLM\SOFTWARE\ZWSOFT\ZWCAD*2020\zh-CN\Applications 下 16 个 T817/TCH_* 项 Loader 全指向 D:\RJAZ\ZWT20-V4\SYS20X64\*.zrx;2025 的 Applications 下无任何天正项,其中 TCH_KERNAL 名字撞车但 LOADER=ZwAecKernal.zrx 系中望自带 AEC 内核。互证:2020 Profiles 含 TZArchV4 profile;tch.ini AcadDwt=zwcad.dwt+ArgName=ZWTArchV4.arg+Registry=Software\Tangent\TArch\V4;SetupLocation=D:\安装包\...\TZ-Arch V4.0正式版-中望) |
注册表 Applications 清单+tch.ini+安装目录实查 2026-09-06 |
| pywin32 | ✅ venv 可用(win32com.client import 成功) |
实测 |
| AutoCAD COM | ⚠️ ProgID 已注册(.19/.19.1);本机实际装的是 AutoCAD Architecture 2014 简体中文(D:\RJAZ\CAD2014\AutoCAD 2014\acad.exe,注册表 R19.1/ACAD-D004:804)。事件日志死因画像(2026-09-06 实查 Application 1000/1001/1002):并非"许可拒绝启动"——6/3、6/25、7/30、8/20、8/25 多次正常启动后 AppHang(挂起无响应),6/12 一次 0xc0000005 BEX64 崩溃(unknown 模块),伴 GDIObjectLeak/RADAR 内存泄漏——属旧版 ACA 2014 在 Win10 19045 上的兼容性/资源泄漏问题;exe 直启"静默退出"疑为沙箱回收子进程假象(历史日志证明其能进主循环) |
WER 事件日志+注册表实查 2026-09-06 |
| ZWCAD COM | ✅ L1 首测主机:ProgID ZWCAD.Application(HKCR 另有 .2020/.2021/.2025);主机在 D:\RJAZ\ZWCAD2020\、ZWCAD2025\、BECS2023\(斯维尔绿建基于 ZWCAD)——ZWCAD2025 同时是中望版天正 TZ-Arch V4 的宿主 |
注册表枚举+启动实测 |
| Autodesk 目录 | C:\Program Files\Autodesk\ 仅 ApplicationPlugins / Autodesk Sync,未见完整版本目录(实际装于 D:\RJAZ\CAD2014\) |
文件系统实查 |
🔴 L1 COM 首测结论(2026-09-06 实测,证据 cad_tarch_trial/l1_first_test_zwcad.py 五项全 PASS):
1. ZWCAD 的 COM 语义与 AutoCAD 相反:GetActiveObject/ROT 附着不可用(ZWCAD 不注册运行对象表,ROT 枚举 12 条无一 CAD);Dispatch("ZWCAD.Application") 可用——附着或拉起实例,且拉起的实例为 Visible=False 隐藏服务器模式(正合无人值守 L1 驱动,无需弹窗占桌面)。
2. COM API 全通:ModelSpace.AddLine(0→1 实体计数闭合)、SendCommand 通道(_zoom _e)、几何回读(StartPoint/EndPoint 精确命中)——"发出命令≠画出来"的假阳性防线在此主机成立。
3. 天正命令脚本化判定(2026-09-06 晚 L1 实测定案:分支②坐实——真存活但 zrx 未加载):Dispatch("ZWCAD.Application.2020") 拉起/附着隐藏实例成功(Version=2020,活 20+ 分钟未退出、无许可弹窗——网络许可未拦进程);COM/SendCommand 通道正常(_zoom _e 0.0s);GetVariable('CMDNAMES') 探测法有效(能读到挂起命令,\x03 ESC 取消法有效);但干净状态下发 _twall/_tdoor/_twindow/_taxis 后 CMDNAMES 全空=命令未注册;进程模块实查(Get-Process -Module):实例加载 338 模块零 tch*.zrx。根因(lnk 解析实锤):天正快捷方式指向 D:\RJAZ\ZWT20-V4\TGStart.exe 启动器——天正 zrx 只经 TGStart 注入,纯 Dispatch ZWCAD.exe=裸 CAD 无天正。⚠️ 实操坑:① SendCommand 不阻塞(异步),"阻塞=命令存在"推断不成立;② 挂起的交互命令会污染后续 CMDNAMES 读数(实测被遗留 LINE 污染)——探测前必须先 \x03 清干净;③ Dispatch 会附着同 ProgID 既有实例(不拉新),判定"静默退出"不能只看新增 PID。下一步路线:用户经 TGStart 启动天正 GUI(许可+profile+菜单全套)→ AI Dispatch 附着(同 ProgID 附着已实测可行)→ SendCommand 天正命令。详见 cad_tarch_trial/l1_tarch2020_result3.txt。35508 判定(当晚补查):PID 35508(20:00:56 启动)经 tasklist /V+天正模块反查确认为挂起残留(内存 32K/CPU 0/无窗口/用户名可见但 Path 读不到),且全机无任何进程加载 tch*.zrx——不是天正实例,附着无意义;天正 GUI 须由用户经 TGStart 现启。🔴 许可结论收窄(用户审阅纠错):"许可未拦"仅在裸 ZWCAD 层面成立——裸 CAD 未加载天正 zrx、未触发天正 feature 校验;天正 zrx 加载后许可是否拦截,本轮未验证,是 TGStart 路线的第一验证项。🔴 等用户"启动结果三选一"协议(2026-09-07 用户审阅钉死,替代"回天正已启动"):35508 残骸(20:00:56 启动→裸 ZWCAD 空壳 32K/0CPU)强烈暗示 TGStart 在这台机器上可能本身启动不完整——"TGStart 能拉起完整天正"是未验证假设,故用户启动后须回三选一:①「天正已启动,正常」(有菜单/墙门窗命令)→ AI Dispatch 附着逐条测命令出台账;②「启动异常,现象 X」(卡住/闪退/只剩空白 CAD)→ TGStart 启动链损坏,与 zrx 注入同问题,查 TGStart 为何只拉起裸 CAD;③「许可报错,内容 X」→ 许可墙真实出现,回"弃 2020/找许可管理员"路线。🔴 授权边界补充(同路线2原则):用户启动过程中弹出的许可框/错误框/需点击的对话框,AI 一律不处理——点完正常回①;卡住回②;不指望 AI 附着后去点框(GUI 交互红线)。
4. ProgID 坑排除实证(2026-09-06 winreg HKCR):ZWCAD.Application.2020 存在,CLSID {EC92313D-5A17-11E7-B72E-BC5FF42AC839} → LocalServer32=D:\RJAZ\ZWCAD2020\ZWCAD 2020\ZWCAD.exe /Automation;⚠️ 无后缀 ZWCAD.Application 的 CurVer→.2025(首测五项 PASS 实拉的即 2025);⚠️ ZWCAD.Application.2021 被斯维尔占用(LocalServer32=D:\RJAZ\BECS2023\ZWCAD.exe)——多版本共机必须用带年份后缀的 ProgID。
5. ZWCAD 2020 许可状态画像(2026-09-06 只读实查):网络层活(FlexNet 服务器 121.46.31.215:27000 TCP=OPEN);但 zwco.log 显示 2025-06~09 feature 级反复失败(-97/-16/占满/找不到 feature);正面旁证 HKCU VerAuth=PRO;实启结果(见 3)证明裸 CAD 层面许可未拦进程存活与命令执行——天正 zrx 层许可未验证(见 3 收窄注)。
6. 环境注:reg.exe 被沙箱黑名单→注册表操作一律 Python winreg;PowerShell 工具可能无 stdout 回显→查询结果落盘再读(Out-File utf8 在 PS5.1=带 BOM UTF-8,Read 工具可直读,GBK 的 tasklist 输出在 Python 里用 decode('gbk'))。
7. 启动方式结论:Start-Process acad.exe/ZWCAD.exe 直接启动 2025 会静默退出;COM Dispatch 拉起/附着可靠——L1 驱动一律走 Dispatch,不走 exe 直启(但注意:Dispatch 拿到的是裸 CAD,天正须 TGStart 启动器注入,见 3)。
8. 环境注:reg.exe 被沙箱黑名单→注册表操作一律 Python winreg;PowerShell 工具可能无 stdout 回显→查询结果落盘再读。
补测方式:scripts/probe_cad.py 已含 ZWCAD ProgID 枚举与 ROT 附着检查(附实测注)。
> 环境坑记录:本会话沙箱拦截 reg.exe,但 Python 内置 winreg 只读注册表不受影响——注册表探测应优先用 winreg,不必外推给用户。
二、分期实现(先骨架后血肉)
- P0 骨架+探测(本版 v0.1.0):授权模型、环境探测脚本、架构与边界成文。✅ 试验 A 已通过(2026-09-06):两室一厅住宅平面意图 JSON(三开间 3300×4500、外墙 240/内墙 120、门 M0921×4、窗 C1521×5、房间面积标签、防火分区边界)→
dwg_exchange.py生成 DXF(93 实体/7 图层)→ 独立验证脚本 20 项断言全 PASS(图层集合、6 个闭合轮廓坐标逐点一致、开启弧数==门数、弧半径==门宽 900、A-WIND 实体==窗数×5、墙体双线 y=±120、房间/轴线文字、6 个标注)——L0 路径实锤,样例与验证脚本存于WorkBuddy/2026-08-30-13-08-19/cad_tarch_trial/。契约缺口修复:ziliaojidwg_exchange.py原缺openings/labels实现,本试验补齐并随 ziliaoji 1.6.9 发布。 - P1 脚本生成器:意图 JSON → 天正
.scr命令脚本(命令序列取自 09 分册 §4.2–4.5 已蒸馏命令码;全部标"置信=中,须本机 T20 V9 实测"——命令码源自视频帧/社区笔记,首次实机执行必须逐条验证)。产物:DXF 底图 +.scr+ 人读执行说明。 - P2 COM 驱动层 ✅ 最小首测通过(2026-09-06,ZWCAD 2025):Dispatch 附着/拉起(隐藏实例)→ 文档/模型空间定位 → COM 直画(AddLine 计数闭合)+ SendCommand 通道 + 几何回读全 PASS;下一步=SendCommand 播放天正命令(待天正 host 启动方案)+ 批量图元驱动。详见环境清单【L1 COM 首测结论】。
- P3 施工图修改流:修改意图定位(图层/文字/实体选择集)→ 参数替换(墙厚/门窗尺寸/标注值)→ 回读 diff → 报告"改了什么、没改什么"。修改类操作在 L1 下逐条确认,不做模糊批量替换。
二·B、审图管线(2026-09-06 全流程实测贯通,零 GUI/零 COM)
工具链:ODA File Converter 27.1.0(winget 安装 ODA.ODAFileConverter,路径 C:\Program Files\ODA\ODAFileConverter 27.1.0\)+ ezdxf(venv)。
| 环节 | 工具 | 实测 |
|---|---|---|
| [1] DWG→DXF | scripts/convert_dwg.py(ODA 命令行优先→COM 附着备选) |
✅ 真实天正 1F.dwg→1F.dxf(943KB/483实体) |
| [2] 审查 | scripts/review_dxf.py(R1 图层/R2 开放轮廓/R3 门窗编号/R4 字高) |
✅ 34 项问题(高1/中1/信息31) |
| [3] 批注 | REVIEW 层批注圈+引线+文字+问题清单 JSON | ✅ 93 实体回读闭合 PASS |
| [4] DXF→DWG | ODA 反向(ACAD2018/DWG) | ✅ 1F_审图.dwg(167KB,未覆盖源文件) |
真实图纸一手发现:① 1F.dwg 图层(STAIR/WINDOW/COLUMN/WALL/DIM_SYMB)与 LAYERDEF.DAT 蒸馏完全对上;② 天正专有对象经 ODA 转换后为 ACAD_PROXY_ENTITY(21 个)——不可编辑的代理实体,需在天正侧"分解对象/构件转化"处理;③ 该项目实际图层(PUB_TEXT/DG-A-墙体)与 LAYERDEF 组合层名有出入——图层命名随版本/项目模板变化,审图 R1 规则以 profile+宽容清单处理。
红线边界:DWG 读取一律经 ODA 官方转换器(非解析专有格式);输出永不覆盖源文件("替代源文件"须用户当轮显式确认+先备份)。
三、与 ziliaoji 09 分册的契约(不复制、只引用)
- 意图输入:ziliaoji §二 JSON(meta/grid/walls/openings/rooms/zones/dims/labels/cables)——本包的消费格式,字段含义与取证纪律(面积/防火判据回 verify.py)以那边为准;
- 图层命名:GB/T 50001(A-WALL/A-DOOR/A-ZONE…),本包生成与识别一致;
- 命令知识:天正命令码/对话框参数/防火模块能力 → 全部引用 09 分册 §4.1–4.5,置信度分层(官·高/社·中)照搬;
- 电缆表 CSV、DXF 交换器:直接调用 ziliaoji
scripts/dwg_exchange.py(路径引用,不复制实现)。
四、本版已知缺口(挂账)
- AutoCAD COM 可用性未定(等 probe_cad.py 在工作站实跑);
.scr生成器的天正命令序列未编写(P1);命令码实测台账未建(P1 起逐条记录"命令码→T20V9 实测结果");- 天正专有构件经 SendCommand 生成的可行域未验证——
twall等命令的命令行参数化程度未知(对话框驱动命令可能无法纯脚本化),P1 首测项。