# 使用 AutoCAD 绘图、查询与验证

<!-- autos.skill.namespace: autos.skills.cad -->
<!-- autos.skill.description: 操作 AutoCAD：绘图编辑、查询实体、批量 LISP、图像反馈与官方文档检索。 -->
<!-- autos.skill.version: 0.4.0 -->
<!-- autos.skill.minAutos: 4.13 -->
<!-- autos.skill.disabled: true -->

## 首选路线

**始终复用标准库 `com.cad` 增强实例。少量对象直接 COM；批量循环一次 LISP；按需原生 PNG。**
技能与人工范例共用同一套连接、查询、任务、预览和 C# 实现；缺少通用能力应改基础库，不在技能或调用代码中另造分支。普通绘图不加载 Excel 等无关知识页。

## 连接与目标

```aardio
import com.cad;

var cad,err=com.cad(false); // com.cad() 默认允许启动；显式 false 仅连接
if(!cad) return {error=err};

var info,err=cad.Inspect();
return {info=info;error=err};
```

- 省略 ProgID 保留 AutoCAD → GStarCAD → ZWCAD  → Brics →  IJCAD → ARES 候选链；库先连接候选中的已有实例，没有才按允许启动的策略创建。`cad.ProgId` 记录实际命中项。
- 用户指定产品时直接 `com.cad(false,"AutoCAD.Application")`、`com.cad(true,"ZWCAD.Application")` 等，不静默换产品。已有 `cad` 直接沿用；已有原生 Application 可用 `com.cad(app)` 原位增强，不另找进程或实例。
- 先核对 `ProgId`、应用/文档 HWND、Name/FullName，再固定 `doc=cad.ActiveDocument`；按用户意图 Open/Add。文档与实体仍使用原生对象模型，实体身份是 **文档+Handle**。
- `Inspect/Selection/Summary/Preview/RunLisp/RunCSharp` 不自动新建图纸；指定 doc 必须属于该实例。实际单位不能仅凭 INSUNITS 判断；明确 WCS/OCS、模型/布局。
- COM 的 `Item(i)` 方法参数零基，如 `cad.Documents.Item(0)`；已转换为 aardio 的坐标数组一基，如 `circle.Center[1]` 是 X。

| 增强实例入口 | 用途 |
| --- | --- |
| `cad.Inspect()` | 只读实例/文档身份、版本、空闲快照、布局/单位/实体数/selectionCount。 |
| `cad.IsQuiescent()` | 统一产品状态接口；空闲不证明任务完成。 |
| `cad.Selection(doc[,limit=200])` | 捕获预选 count/handles/truncated；0只计数，不发命令或改变选择。 |
| `cad.Summary(doc[,options])` | 一次只读 LISP 聚合；textSample默认20（0禁用，最大200），含任务目录。 |
| `cad.RunLisp(code,args,doc[,options])` | 保存恢复路径、唯一提交、等待回执；返回 result,err,task。 |
| `cad.ResumeLisp(taskPath[,timeout[,doc]])` | 读原回执，不重发。省略doc可离线；也可用 `com.cad.task.resume`。 |
| `cad.Preview(handles,doc[,options])` | 原生 BMP→PNG；可临时缩放，恢复并回读原视图。 |
| `cad.CompileCSharp(source[,options])` / `cad.RunCSharp(source,args,doc[,options])` | 插件编译 / AutoCAD短脚本，见按需指南。 |
| `autos.skills.cad.help.callTool(name,args[,options])` | 官方文档查询；需要时单独 `import autos.skills.cad.help`，不连接 CAD。 |

用户说“这些对象”时，**发命令前**保存 `cad.Selection(doc)`。空预选不等于全图，truncated不是完整目标集。Summary只统计顶层，不展开块；详细查询按需读 query.md，不转储整张图。

## COM ROT 探查

```aardio 
import com.cad
for app,interfaceName in com.cad.eachRunning() {
	print(app.ProgId,interfaceName)
}
```

仅备选，优先 com.cad(false) 探查; 主流 CAD 在 ROT 中单实例，后台实例仍注册 ROT（主流 CAD 始终单实例）。

## 批量任务与恢复

已有固定的 cad、doc。code是原始LISP，外部数据放args；最后一个表达式为结果。

```aardio
var result,err,task=cad.RunLisp(
    `(list (cons "text" (car args)) (cons "answer" (+ (cadr args) 5)))`,
    ["中文",7],doc,{timeout=15000}
);
if(!result) return {error=err};
return result;
```

- 先检查 `result.ok`，再验业务数据。`state=timeout` 仅是等待快照，用 `cad.ResumeLisp(result.taskPath,5000)` 查原回执，**不换ID重发写操作**。
- RunLisp统一在 `%LOCALAPPDATA%\aardio\com.cad\journal` 保存任务路径，写入失败不提交。自行编排可用 `cad.CreateLispTask`，先存 `task.path` 再 submit/wait。
- AutoCAD默认 post、nudge=false。中望默认send+ANSI回执，浩辰默认post+ANSI回执；显式method/resultEncoding可覆盖，创建请求时固定，**绝不在提交报错后换方法重放**。ANSI能力受目标代码页限制，必要时先验证文字往返。
- send或显式nudge会同步阻塞，timeout不能打断COM调用；nudge可能驱动其他排队任务，不作为默认兜底。
- 列表转数组、字符串键关联列表转对象；有Handle的实体/VLA对象转为`{handle}`。VARIANT/SAFEARRAY/选择集按协议解包。nil可能成为null，数值按容差验收。
- LISP失败可能有部分修改，不是事务；不在任务内切换/关闭文档、嵌套任务或使用 `ac$` 内部变量。

**命令接收对象不同：**增强 `cad.SendCommand("MYCMD",,doc)` 规范换行并仅补缺少的CR；原生 `doc.SendCommand('MYCMD\r')` 必须自己提供实际CR。`"MYCMD\r"` 不是回车。PostCommand同理。需要回执优先RunLisp。

## 按需看图

```aardio
var image,err=cad.Preview(handles,doc,{zoom="handles"});
return {image=image;error=err};
```

预览要求活动、可见、非最小化且空闲的doc，以及非空句柄；不自动激活/抢前台，不只渲染所选实体。默认保持视图；zoom可为handles/extents，handles仅支持当前空间顶层实体。透视/锁定布局视口不自动缩放。
显式PNG路径不覆盖；检查 `cleanupWarning/viewRestored`。图像验证文字和遮挡，几何直接回读。**空SelectionSet的BMP导出可能转交互选择，不能绕过非空检查排障。**

## 产品范围与维护边界

AutoCAD为主；中望/浩辰复用兼容COM与LISP，并仅在com.cad中集中处理小差异。其C# DLL编译使用实际ProgId选择引用/运行时，用户源码采用目标产品API；RunCSharp宿主当前仅AutoCAD，不强行增加旧Framework桥或混合厂商源码。某项高级能力未支持不妨碍基础绘图。
不擅自覆盖保存或关闭用户图纸。内联LISP不改加载设置；DLL直接用NetLoad，无需安全选项：库在CAD允许时临时调整并恢复，受限时让用户处理原生提示，不破解锁定。失败先读原回执，不改连另一产品、不扩大兼容矩阵。

## 按需知识

| 需要 | 读取 |
| --- | --- |
| Autodesk官方产品/API资料 | `~/lib/autos/skills/cad/.res/knowledge/help.md`；按需 `import autos.skills.cad.help` |
| 有界查询与文字样本 | `~/lib/autos/skills/cad/.res/knowledge/query.md` |
| 绘图、批量LISP、保存验收 | `~/lib/autos/skills/cad/.res/knowledge/recipes.md` |
| 图层 / 块属性与Excel校对 | 同目录 `layers.md` / `attributes.md` |
| 超时、排队、拒绝接收、Esc | 同目录 `recovery.md` |
| C#短脚本 / 插件 | `~/docs/library/com/cad/csharp-scripts.md` / `csharp.md` |
| 任务、安全设置、预览、产品边界 | `~/docs/library/com/cad/tasks.md` / `lisp.md` / `automation.md` / `compatibility.md` |

常规流程：**核对目标 → 最小修改计划 → 单次提交 → 回读验收 → 按需预览/保存**。旧vla范例供人交互学习，不无人值守运行。
