实现原理
CAD在加载cuix文件后,会自动运行一次同目录下的同名 *.mnl文件。
文件里是一段AutoLisp脚本,因此可以在脚本中写入加载命令。
使用ActiveX的方式
获取应用程序对象 acad,
然后从 acad.MenuGroups 菜单集合中的
MenuGroup.MenuFileName 属性获取cuix文件路径,从而加载目录下的dll文件
测试环境
中望CAD 2021
代码内容
以下是脚本 MYCUIX.mnl中的内容
; 将一段字符串用双引号括起来
(defun str-sharp (a)
(strcat "\"" a "\"")
)
; 将两个字符串转换为大写后,查找 A 字符串是否存在于 B 字符串中。
(defun find-string (a b)
(vl-string-search (strcase a) (strcase b))
)
; 需要先创建CUIX菜单,并在程序中安装,假设使用的是 MYCUIX.cuix
; 也要放置 MYCUIX.dll 到相同目录
(setq cuixname "MYCUIX")
; 使用ActiveX的方式自动从MenuGroups的MenuGroup.MenuFileName属性获取cuix文件路径,从而加载目录下的dll文件
(defun autoload_dll (MYCUIX)
(vl-load-com)
(if (null *ZWCADOBJECT*)
(setq *ZWCADOBJECT* (vlax-get-acad-object))
)
(setq MenuGroups (vla-get-MenuGroups *ZWCADOBJECT*))
(setq groupnum (vla-get-Count MenuGroups))
(setq i 0)
(setq cuixpath nil)
(repeat groupnum
(setq groupobj (vla-item MenuGroups i))
(setq grouppath (vla-get-MenuFileName groupobj))
; 找到文件名对应的菜单
(if (find-string (strcat MYCUIX ".cuix") grouppath)
(setq cuixpath (vl-filename-directory grouppath))
)
(setq i (1+ i))
)
(if (setq cuixpath cuixpath)
(progn
; 加载dll文件
(setq cuixdll (strcat cuixpath "\\" MYCUIX ".dll"))
(command "NETLOAD" (str-sharp cuixdll))
)
)
(princ)
)
; 执行命令
(autoload_dll cuixname)