明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1315|回复: 12

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

[复制链接]
发表于 2023-4-17 14:51:02 | 显示全部楼层 |阅读模式
本帖最后由 1006015131 于 2023-4-17 15:01 编辑

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

此时,可以读取到cad窗口的句柄为`/hwnd 5839396`

后续在aardio用使用论坛大佬的示例也获得相同窗口的句柄,代码如下:

  1. <blockquote>//aardio
复制代码

结果获取的句柄与之前autolisp传递的完全不同。

陷入了困惑。
附件为对应过程源码。

ps:另,问chatgpt有不同的思路,不过暂时不懂怎么用,放出来抛砖引玉。


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


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2024-6-27 09:20:07 | 显示全部楼层
/hwnd 这样传参数是为了可扩展,这样以后就可以传更多其他的参数。
命令行参数会自动解析成表对象 _ARGV,例如在 aardio 里 _ARGV.hwnd 就可以得到 hwnd 参数的值。

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

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

  1. import process;

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

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


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

  2. //遍历所有 AutoCAD 窗口句柄
  3. for hwnd in process.eachWindow( "@acad.exe" ) {  
  4.   
  5.    
  6. }


还有一种方法更简单:

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

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




发表于 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;
 楼主| 发表于 2023-12-12 14:09:09 | 显示全部楼层
yu960312 发表于 2023-12-10 20:35
(strcat "/hwnd" " "(itoa(vla-get-hwnd(vlax-get-acad-object))))这个CAD窗口句柄是怎么传到aardio的, ...

不懂,我猜是放内存了;
你的方法可以实现吗?能不能分享个简单点的代码参考下
发表于 2023-12-10 20:35:16 | 显示全部楼层
(strcat "/hwnd" " "(itoa(vla-get-hwnd(vlax-get-acad-object))))这个CAD窗口句柄是怎么传到aardio的,一直搞不明白,我用的是写入注册表或txt,然后用aardio读取CAD句柄
发表于 2023-12-10 20:47:58 | 显示全部楼层
这种调用一般都是临时的,因为每次开启CAD的hwnd都不一样,没必要写注册表。直接通过DOS的环境变量就可以了。
 楼主| 发表于 2023-12-12 14:10:23 | 显示全部楼层
kozmosovia 发表于 2023-12-10 20:47
这种调用一般都是临时的,因为每次开启CAD的hwnd都不一样,没必要写注册表。直接通过DOS的环境变量就可以了 ...

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

说得好像用注册表就没有多开CAD的问题了
发表于 2023-12-12 21:39:31 | 显示全部楼层
1006015131 发表于 2023-12-12 14:09
不懂,我猜是放内存了;
你的方法可以实现吗?能不能分享个简单点的代码参考下

我是用CAD lisp调用aardio生成的exe文件,做了个工具箱面板,不是aardio调用cad,所以我只需要把CAD窗口句柄传递给exe就行了
发表于 2023-12-12 21:44:54 | 显示全部楼层
1006015131 发表于 2023-12-12 14:10
但是这个只能获得一个cad程序的hwnd,同时开启多个CAD,例如在分屏场景就会有问题了
你aardio里面是如何获取到lisp传递过去的窗口句柄的?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2023-12-12 22:01:58 | 显示全部楼层
yu960312 发表于 2023-12-12 21:44
你aardio里面是如何获取到lisp传递过去的窗口句柄的?

看了你的工程文件,知道了如何把CAD窗口句柄传给aardio了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 13:18 , Processed in 0.199617 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表