# CAD COM + LISP 自动化

`com.cad` 在原生 CAD COM 对象上提供命令、LISP、模板及接口辅助。不依赖 Autos，也不要求安装 .NET 插件。

## 先选对接口

- 读取属性、创建少量实体：直接 COM，结果清楚，不必模拟命令行。
- 批量循环：优先用 [CreateLispTask / RunLisp](tasks.html) 在 CAD 内执行 LISP，获取结构化回执；减少进程间往返。性能按同等实体、相同刷新条件实测，不承诺固定倍数。
- 短生命周期 C# 查询/绘图：用 [RunCSharp](csharp-scripts.html)，复用常驻小宿主，在内存中按次编译并返回数据；保留事务与回执边界，不承诺完整热卸载。
- 长期托管插件：用 [CompileCSharp](csharp.html) 自动识别运行时并编译 DLL，再显式加载和调用。不必手动生成项目或管理唯一程序集名。
- 必须使用命令：参数应完整、非交互，命令名使用英文全局形式。不要把等待用户选点的例子用于无人值守任务。
- 图像反馈：直接用 `cad.Preview(handles,doc,options)`，复用标准库原生导出和视图恢复。图像和几何数据分别验收。
- 临时 COM 拒绝：`com.cad.callRetry` 只处理已识别拒绝，用于只读查询或单个可重试调用，不包装多步写操作。未知结果先查原任务；同步队列刷新默认禁用。

## 最小入门

以下创建新的测试文档，不改动已有文档，不保存覆盖文件。

```aardio
import com.cad;
var cad = com.cad();
if(!cad) error("无法连接或启动 AutoCAD");
cad.Visible = true;
if(!cad.IsQuiescent()) error("请先结束 CAD 当前命令或对话框");
var doc = cad.Documents.Add();
var circle = doc.ModelSpace.AddCircle([0,0,0],10);
doc.Regen(cad.acAllViewports);
cad.ZoomExtents();
print({document=doc.Name;handle=circle.Handle;radius=circle.Radius});
```

`com.cad()` 默认连接已有 AutoCAD 实例，否则尝试创建；也保留 GStarCAD、ZWCAD 候选退化。不同 CAD 产品的功能、命令及版本差异仍需实测。只希望连接已有实例时使用 `com.cad(false)`；指定产品用 `com.cad(false,"ZWCAD.Application")`。

## 文档、实体与坐标

1. 任务开始时明确取得 `doc`，执行中不要反复取 `ActiveDocument`。命令/视图操作可能激活文档。
2. `Documents`、`ModelSpace` 等是 COM 集合：用 `Count`，索引从 **0** 开始，不能用 aardio 的 `#` 代替。
3. 记录实体身份时保存“文档 + Handle”。不同文档可能有相同句柄。
4. 明确模型空间/图纸空间、单位与坐标系。`AddLine`、`AddCircle` 的点是 WCS 三维点，不能把所有实体接口的坐标都假定为 WCS。
5. `INSUNITS` 不是对已有几何的缩放命令；改变单位标记不会自动重画实体。
6. 批量创建后再统一 `Regen`、调整视图，避免每个对象都刷新。
7. `Save`、`SaveAs`、`Close(false)`、`Quit` 具有持久化或丢弃数据的效果，应取得明确授权。范例不自动保存、不自动退出 CAD。

## 参数类型

普通数值数组默认转为 double SAFEARRAY。单个整数默认转为 32 位整数，某些 CAD 变量要求 16 位整型，必须用 `com.word`；需要 Double 时使用 `com.double`。COM 对象数组可用于 `AppendOuterLoop`。

填充边界应先准备好，再 `AddHatch`，随后立即 `AppendOuterLoop`，之后才设置其他属性并 `Evaluate`。`ANSI31` 应使用预定义填充类型 `1`。

## 查询与技能复用

`cad.Inspect()`、`cad.Selection(doc)`、`cad.Summary(doc)`、`cad.Preview(handles,doc)` 是普通标准库能力，不依赖 Autos。技能通过同一个增强实例调用；COM产品差异集中在 com.cad，执行与回执集中在 com.cad.task。

## 导航

- [兼容 CAD 与技能 0.4 迁移](compatibility.html)
- [LISP 任务：提交、回执与恢复](tasks.html)
- [LISP 与模板](lisp.html)
- [完成、错误与图像反馈](automation.html)
- [C# 编译与加载](csharp.html)
- [C# 短脚本与恢复](csharp-scripts.html)
- 库参考由源码智能提示生成，可从 IDE 中的 `com.cad` 提示打开。
- 范例位于 `范例 → COM 组件 → AutoCAD`；无交互入门、任务执行、填充和图像导出优先，`netload.aardio` 演示统一 C# 编译入口；WM_COPYDATA 属兼容路线。
- `vla.aardio` 保留 Visual LISP COM 函数接口、表达式转换和模板用法，适合人类程序员学习；`RunLisp.aardio` 演示批量读取数据与结构化回执，适合 AI 自动化。两者用途不同，不互相替代。
- 支持其他兼容 CAD 时显式传入其 ProgID。当前实机验证环境是 AutoCAD 2026；不以类名、产品名称或相似版本号推断接口能力。任务入口需要兼容 Visual LISP、DATE、HWND 和所选命令方法，旧产品可显式配置 ANSI 结果编码。
