aardio 文档

aardio 范例:LISP 调用 aardio

//LISP 调用 aardio
if(_STUDIO_INVOKED) error("请复制此代码到 aardio 工程的 main.aardio 内,然后生成 EXE 文件再运行",2);
/*
LISP 调用 aardio 的三种途径
1、aardio 创建 ActiveX 控件,在 LISP 中调用。
打开「aardio 工程向导 / 窗口程序 /ActiveX EXE」创建工程,
发布 EXE 以后,鼠标双击 EXE 可自动注册该控件。

该工程目录下提供 test.lsp 包含 AutoLisp 调用示例。
注意要用 vlax-invoke 而不是 vlax-invoke-method 调用 aardio 函数。
并且 AutoLISP 会自动将函数名转为大写,aardio 大小写敏感,所以在 aardio 里被调用函数名也要大写。

然后在 AutoCAD 中以如下 LISP 代码创建并调用 aardio 控件:
(setq aarObj (vlax-get-or-create-object "aardioTestControl.Sample"))(vlax-invoke aarObj 'Add 1 3)  

2、执行以下 LISP 代码异步启动 aardio 编写的 EXE。
(startapp "d:/test/test.exe" (strcat "/hwnd" " " (itoa(vla-get-hwnd(vlax-get-acad-object)))))

在 aardio 中使用 _ARGV 得到解析后的 _ARGV.hwnd 参数。
或者用 _CMDLINE 得到解析前的命令行参数。

上面的代码主要演示传命令行参数的方法。
其实在 aardio 中用 process.getParent().getMainWindow() 可以直接取到 AutoCAD 窗口。 

有了 AutoCAD 的句柄,
然后使用 com.cad.sendCopyData(hwnd,"") 就可以发送命令了。

3、下面示例演示的 startExe 函数阻塞启动 aardio 编写的 EXE。
*/

import fsys.dlg;
import process;

//获取父进程对象
var parentProcess = process.getParent(); 

//直接拿到 AutoCAD 窗口
var hwndCad;
if(parentProcess) hwndCad = parentProcess.getMainWindow();

//自标准输入读取 LISP 传入的值 
var cmdline = io.stdin.read(); 

if(! (cmdline && parentProcess) ){
    import console
    console.showLoading("正在为 为 AutoCAD 安装 startExe( cmdline ) 函数。");

    import com.cad;
    var cad = com.cad()
    cad.Visible = true; 

    //直接添加函数
    cad.SendCommand(`(defun startExe(cmdline)
    (setq wsc (vlax-get-or-create-object "WScript.Shell"))
    (setq handle (itoa(vla-get-hwnd(vlax-get-acad-object))))
    (setq wsx (vlax-invoke wsc 'EXec <? 

    //将当前 EXE 路径传入 lisp 代码,模板参数放入数组可自动处理转义字符,首尾自动加双引号。
    ={ io._exepath }
    ?>))
    (setq stat(vlax-get wsx 'status ))

    (setq stdin(vlax-get wsx 'StdIn ))
    (vlax-invoke stdin 'Write (strcat cmdline "\n"))

    (setq stdout(vlax-get wsx 'StdOut ))
    (setq out1 (vlax-invoke stdout 'Readall))
    out1
    )`)

    console.log("已为 AutoCAD 安装 startExe( cmdline ) 函数"); 
    console.pause();
    return;
}


import process;
import string.cmdline;

//解析命令行参数
var argv = string.cmdline.argv(` ` + cmdline);

//获取 AutoCAD 主窗口句柄
var hwndAutoCAD = parentProcess.getMainWindow(); 
//注意这时候 AutoCAD 是阻塞状态,不应也不必要设置所有者窗口为 hwndAutoCAD

//请在 AutoCAD 输入命令 (startExe "/c=dlg")
if(argv.c = "dlg"){
    var path = fsys.dlg.open();

    //把返回值写到标准输出
    if(path) io.stdout.write(path); 
}
else {
    io.stdout.write("暂未支持此参数");
}

Markdown 格式