# aardio 范例: COM + LISP：批量绘图、保存恢复入口、确认回执。不使用 GetLispFunctions。



```aardio
// COM + LISP：批量绘图、保存恢复入口、确认回执。不使用 GetLispFunctions。
import com.cad;
import com.cad.task;

var cad = com.cad(); // 兼容 CAD 可显式指定已注册的 ProgID。
if(!cad) error("无法连接或启动 CAD");
cad.Visible=true;

if(!cad.IsQuiescent()) error("CAD 当前忙碌；先查询原任务或显式恢复");
var doc = cad.Documents.Add(); // 本范例只操作新建测试图纸，不保存覆盖。
var code = /**
((lambda (/ model i entity handles)
  (setq model (vla-get-ModelSpace (vla-get-ActiveDocument (vlax-get-acad-object))))
  (setq i 0)
  (repeat (car args)
    (setq entity (vla-AddCircle model (vlax-3d-point (list (* i 12.0) 0.0 0.0)) 4.0))
    (setq handles (cons (vla-get-Handle entity) handles) i (1+ i)))
  (vla-Regen (vla-get-ActiveDocument (vlax-get-acad-object)) 1)
  (list (cons "count" i) (cons "handles" (reverse handles)) (cons "radius" 4.0))))
**/;

var task,err=cad.CreateLispTask(code,[5],doc,{timeout=15000});
if(!task) error(err);

// 先记录，再提交。崩溃或超时后读取原目录，不重画。
io.appData("aardio/com.cad/last-task.txt",task.path);
print("任务目录",task.path);

var sent,err=task.submit();
if(!sent){print("提交未确认，保留任务，勿重发",err);return;}

var result,err=task.wait();
print(result,err);

if(!result || !result.ok) return;
print("已完成，实体句柄",result.data.handles);
// 后续可用 doc.HandleToObject(handle) 校验尺寸。句柄须与 doc 配对。
// 恢复：com.cad.task.open(task.path).wait(5000)，不要求 CAD 正在运行。
// task.cancel() 只请求执行前取消，不中断运行中的 LISP，也不回滚。

```

