com.cad 是唯一基础封装,CAD 技能与普通范例使用同一增强 Application。主目标是 AutoCAD;中望、浩辰仅提供低成本的兼容能力,不保证全部 API 或所有历史版本一致。
import com.cad;
var cad,err=com.cad(false); // 只连接已有候选实例
if(!cad) return {error=err};
return cad.Inspect();
com.cad() / com.cad(true):先尝试连接候选中的已有实例,再尝试创建。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。未知接口报明确错误,不把失败当空闲。
| 创建任务的增强实例 | 默认命令通道 | 默认回执编码 |
|---|---|---|
| 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 无法中断调用。
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。
CAD 技能只提供任务提示与按需帮助,不另设 CAD 操作入口。旧技能 getApp/inspect/selection/summary/run/resume/preview 已移除;统一使用增强实例:
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 实现。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) 不变,可继续读旧任务,不重新编译/提交。%LOCALAPPDATA%\aardio\com.cad\journal;旧 journal 文件不自动删除。