1006015131 发表于 2023-4-17 14:51:02

关于autolisp和aardio混用时传参的疑问

本帖最后由 1006015131 于 2023-4-17 15:01 编辑

先说下起因。开始是在坛里搜图库意外找到了梁泊全大佬的图库软件。觉得挺好用的,帮助里的超链接http://swjtulbq.ysepan.com/ 是作者的个人主页,里面提到了aardio语言以及和autolisp混用的一些参考源码。
这个图库软件有个优点是可以在不开启cad的情况下也查看图库的内容;也有个缺点是的当同时打开多个cad进程时不能选择需要的那个cad。
因此我个人想通过cad中用autolisp调用aardio的方式来将窗口的句柄传递过去,以正确区分。
为此进行了简单的尝试如下:
首先根据aardio官方文档,此处(strcat "/hwnd" " "(itoa(vla-get-hwnd(vlax-get-acad-object))))是可传递到aardio中的参数。在aardio中存在于`_cmdline`中。
https://www.hualigs.cn/image/643ce57815bd4.jpg
此时,可以读取到cad窗口的句柄为`/hwnd 5839396`
https://www.hualigs.cn/image/643ce7465aa28.jpg
后续在aardio用使用论坛大佬的示例也获得相同窗口的句柄,代码如下:

<blockquote>//aardio
结果获取的句柄与之前autolisp传递的完全不同。
https://www.hualigs.cn/image/643ce9351fe99.jpg
陷入了困惑。
附件为对应过程源码。

ps:另,问chatgpt有不同的思路,不过暂时不懂怎么用,放出来抛砖引玉。
https://www.hualigs.cn/image/643ce9d5d2fb8.jpg

pss:在网上也查了一种多文件选择方式,也是通过aardio来传递参数。作为附件上传,供大家参考。


jacenhe 发表于 2024-6-27 09:20:07

/hwnd 这样传参数是为了可扩展,这样以后就可以传更多其他的参数。
命令行参数会自动解析成表对象 _ARGV,例如在 aardio 里 _ARGV.hwnd 就可以得到 hwnd 参数的值。

_CMDLINE 取到的是解析前的完整命令行。

也可以获取父进程的主窗口得到 AutoCAD 的窗口句柄。

import process;

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

//取到 AutoCAD 的窗口句柄
var hwndCad = parentProcess.getMainWindow();

或者直接获取所有 AutoCAD 窗口句柄。
import process;

//遍历所有 AutoCAD 窗口句柄
for hwnd in process.eachWindow( "@acad.exe" ) {

   
}


还有一种方法更简单:

在 aardio 工程向导界面点选『窗口程序 / ActiveX EXE 』。
发布生成 EXE 文件,双击 EXE 注册控件(或调用 /r 命令行参数静默注册)。
然后在 AutoLISP 里就可以直接调用 aardio 编写的函数了。

工程里已经有 AutoLISP 调用 aardio 函数的演示。
通过这种方式,在 AutoLISP 里将窗口句柄作为参数直接传给 aardio 函数就可以了。




yu960312 发表于 2023-12-12 22:10:32

1006015131 发表于 2023-12-12 14:09
不懂,我猜是放内存了;
你的方法可以实现吗?能不能分享个简单点的代码参考下

好家伙,折腾了半天原来简单
lisp: (startapp "D:\\ATool.exe" (itoa(vla-get-hwnd(vlax-get-acad-object))))
aardio: hwnd = _CMDLINE;

1006015131 发表于 2023-12-12 14:09:09

yu960312 发表于 2023-12-10 20:35
(strcat "/hwnd" " "(itoa(vla-get-hwnd(vlax-get-acad-object))))这个CAD窗口句柄是怎么传到aardio的, ...

不懂,我猜是放内存了;
你的方法可以实现吗?能不能分享个简单点的代码参考下

yu960312 发表于 2023-12-10 20:35:16

(strcat "/hwnd" " "(itoa(vla-get-hwnd(vlax-get-acad-object))))这个CAD窗口句柄是怎么传到aardio的,一直搞不明白,我用的是写入注册表或txt,然后用aardio读取CAD句柄

kozmosovia 发表于 2023-12-10 20:47:58

这种调用一般都是临时的,因为每次开启CAD的hwnd都不一样,没必要写注册表。直接通过DOS的环境变量就可以了。

1006015131 发表于 2023-12-12 14:10:23

kozmosovia 发表于 2023-12-10 20:47
这种调用一般都是临时的,因为每次开启CAD的hwnd都不一样,没必要写注册表。直接通过DOS的环境变量就可以了 ...

但是这个只能获得一个cad程序的hwnd,同时开启多个CAD,例如在分屏场景就会有问题了

kozmosovia 发表于 2023-12-12 15:09:41

1006015131 发表于 2023-12-12 14:10
但是这个只能获得一个cad程序的hwnd,同时开启多个CAD,例如在分屏场景就会有问题了

说得好像用注册表就没有多开CAD的问题了

yu960312 发表于 2023-12-12 21:39:31

1006015131 发表于 2023-12-12 14:09
不懂,我猜是放内存了;
你的方法可以实现吗?能不能分享个简单点的代码参考下

我是用CAD lisp调用aardio生成的exe文件,做了个工具箱面板,不是aardio调用cad,所以我只需要把CAD窗口句柄传递给exe就行了

yu960312 发表于 2023-12-12 21:44:54

1006015131 发表于 2023-12-12 14:10
但是这个只能获得一个cad程序的hwnd,同时开启多个CAD,例如在分屏场景就会有问题了你aardio里面是如何获取到lisp传递过去的窗口句柄的?

yu960312 发表于 2023-12-12 22:01:58

yu960312 发表于 2023-12-12 21:44
你aardio里面是如何获取到lisp传递过去的窗口句柄的?

看了你的工程文件,知道了如何把CAD窗口句柄传给aardio了
页: [1] 2
查看完整版本: 关于autolisp和aardio混用时传参的疑问