# 兼容 CAD 与升级说明

`com.cad` 是唯一基础封装，CAD 技能与普通范例使用同一增强 Application。主目标是 AutoCAD；中望、浩辰仅提供低成本的兼容能力，不保证全部 API 或所有历史版本一致。

## 连接

```aardio
import com.cad;
var cad,err=com.cad(false); // 只连接已有候选实例
if(!cad) return {error=err};
return cad.Inspect();
```

- `com.cad()` / `com.cad(true)`：先尝试连接候选中的已有实例，再尝试创建。
- 省略 ProgID 的候选顺序：`AutoCAD.Application`、`GStarCAD.Application`、`ZWCAD.Application`、`BricscadApp.AcadApplication`、`IJCAD.Application`、`AresCommander.Application`。
- `com.cad(false,"ZWCAD.Application")`：只连接指定产品；可传多个或带版本的 ProgID。
- 已有原生对象可 `com.cad(app)` 原位增强，不重新寻找实例。原生包装没有创建来源时不会猜实际 ProgID；需要产品相关默认值和 C# 编译时，优先保留原先由 com.cad 创建的增强对象。
- `cad.ProgId` 是连接工厂返回的实际命中项。选定实例后不会在任务失败时换产品。

## 基本接口

常见 Documents、ModelSpace、图层、实体读写仍使用原生 COM 对象模型。增强方法 `Inspect / IsQuiescent / Selection / Summary / Preview / RunLisp` 共用一份实现，不要求 Autos。

状态接口的小差异由 `cad.IsQuiescent()` 集中处理：优先 GetAcadState，中望 GetZcadState。未知接口报明确错误，不把失败当空闲。

### LISP 默认传输

| 创建任务的增强实例 | 默认命令通道 | 默认回执编码 |
| --- | --- | --- |
| AutoCAD | PostCommand | UTF-8 |
| GStarCAD | PostCommand | 系统 ANSI |
| ZWCAD | SendCommand | 系统 ANSI |

这些是创建任务时按 ProgId 选定的保守默认值。可用 `method`、`resultEncoding`、`codepage` 显式覆盖；**提交异常后绝不自动换方法重发**。低层 `com.cad.task.create` 只给 doc、没有增强实例时不猜产品，仍为 post/utf8。

ANSI 受 CAD 输出代码页限制；中文Windows实测不等于任意Unicode均无损。数据重要时先做文字往返，不能靠修改安全设置解决编码差异。SendCommand 可能同步阻塞，wait 的 timeout 无法中断调用。

## C# 边界

`cad.CompileCSharp(source,options)` 按增强实例的实际 ProgId 选择引用：

| 产品 | 核心引用 | 用户源码命名空间 |
| --- | --- | --- |
| AutoCAD | AcCoreMgd / AcDbMgd / AcMgd | Autodesk.AutoCAD |
| GStarCAD | GcCoreMgd / GcDbMgd / GcMgd | Gssoft.Gscad |
| ZWCAD | ZwDatabaseMgd / ZwManaged | ZwSoft.ZwCAD |

运行时先读该产品的 runtimeconfig；中望/浩辰缺少现代配置时仅在实际 exe.config 声明 CLR v4 后使用已有 Framework 编译器。不按产品年份猜框架，不为未知兼容产品安装最新SDK。所有宿主DLL不复制到输出目录。

库不自动翻译用户C#源码。不同厂商业务代码应分别保存；如需将来支持厂商专属宿主，使用独立资源文件，不把补丁混入 AutoCAD 宿主。

**RunCSharp 短脚本宿主目前仅支持 .NET 8+ AutoCAD。** 中望/浩辰可用 DLL 编译、COM 和 LISP；没有额外的 Framework/ALC 桥、第三方注册器或另一份 com.cad。

## 直接使用 com.cad

CAD 技能只提供任务提示与按需帮助，不另设 CAD 操作入口。旧技能 `getApp/inspect/selection/summary/run/resume/preview` 已移除；统一使用增强实例：

```aardio
import com.cad;
var cad,err=com.cad(false); // 仅连接，不启动 CAD
if(!cad) return {error=err};

if(!cad.Documents.Count) return {error="请先打开图纸"};
var doc=cad.ActiveDocument;
return cad.RunLisp("(+ 7 5)",null,doc);
```

- 连接用 `com.cad(false,progId)`；查询用 `cad.Inspect()`、`cad.Selection(doc)`、`cad.Summary(doc)`；绘图与恢复用 `cad.RunLisp(code,args,doc)`、`cad.ResumeLisp(taskPath,timeout,doc)`；图像用 `cad.Preview(handles,doc,options)`。离线读原回执用 `com.cad.task.resume(taskPath,timeout)`。
- `cad.RunLisp` / `cad.ResumeLisp` 返回 `result,err,task`，并统一保存 journal；任务协议与编排仍由 `com.cad.task` 实现。
- Autodesk 官方文档查询按需 `import autos.skills.cad.help`，使用 `autos.skills.cad.help.callTool(...)`；它不是 `com.cad` 的转发，亦不连接 CAD。
- `com.cad.script.create/run` 改为 `(cad,source,args,doc,options)`；stats 改为 `(cad,collect,doc,options)`。增强 `cad.RunCSharp` 的调用方式不变。`script.open(path,doc)` 不变，可继续读旧任务，不重新编译/提交。
- 旧 LISP/C# 回执格式未变；已有 taskPath 可以继续恢复。新 journal 移到 `%LOCALAPPDATA%\aardio\com.cad\journal`；旧 journal 文件不自动删除。
