获取LSIP、FAS、VLX程序自身加载路劲
本帖最后由 曰微言薄论 于 2018-12-11 08:57 编辑距离上次发布CAD批量打印软件SmartBatchPlot的帖子之后,很久没有发表过帖子了,即使SmartBatchPlot更新到6.2.3版本了,我也没有在明经论坛上发布了,有两个原因,一是明经似乎太容易被黑了,经常无法访问,第二就是太多的人只喜欢源码。
关于获取LSIP、FAS、VLX程序自身加载路劲,之前有很多人都问过这个问题,说明大家很关注,我自己通过查阅相关资料,发现没有一步到位的方法,最后找到一个还算比较靠谱的方法,今天就把源码发出来,让大家参考一下。
原理比较简单,我们加载程序有两种方式,一是拖入加载,而是AP加载。对于拖入加载,可以通过 (getvar "lastprompt")获取;AP加载可以通过查询注册表获取,查询注册表需要考虑CAD版本问题。下面就贴出源码吧。;;; 字符分割函数,delm为分割符号
(defun parse (str delim / LST POS sl)
(setq sl (+ (strlen delim) 1))
(while (setq pos (vl-string-search delim str))
(setq lst (cons (substr str 1 pos) lst)
str (substr str (+ pos sl))
)
)
(if (> (strlen str) 0)
(setq lst (cons str lst))
)
(reverse lst)
)
(princ "\n即将获取加载目录……")
(setq lsp_path nil)
(if (wcmatch (setq lsp_path (getvar "lastprompt")) "*(LOAD \"*\")")
(progn
(setq lsp_path (cadr (parse lsp_path "\"")))
(while (vl-string-search "/" lsp_path)
(setq lsp_path (vl-string-subst "\\" "/" lsp_path))
)
(alert (strcat "\n拖入方式加载目录:" lsp_path))
)
(progn
(setq lsp_path (vl-registry-read (strcat "HKEY_CURRENT_USER\\" (vlax-product-key) "\\Profiles\\" (getvar "CPROFILE") "\\Dialogs\\Appload") "MainDialog"))
(alert (strcat "\nAPPLOAD方式加载目录:" lsp_path))
)
)
(princ "请大家多多支持我的CAD批量打印软件SmartBatchPlot")
(princ)
最后还是希望大家多多支持我的CAD批量打印软件SmartBatchPlot,该软件适用于不同图框不同比例的打图情况,能极大提高出图效率。
前面的源码缺少字符串分割函数parse,现在补齐了。(20181211)
附件下载地址:
(defun c:nx_jzcx ( / str1 nn str html adver )
(if (not (menugroup "念悬工具箱"))
(progn
(princ "\n程序正在加载中……");乱世江湖,只需一句不需愁
;acad也可以用lastprompt的方法的,这里只是展示_.copyhist的用法,但是浩辰无法用lastprompt
(setq
str1 (getvar "lastprompt") ;获得最后一行命令
nn (vl-string-search "(LOAD \"" str1);在字符串中搜索指定子串
)
(if nn
(progn ;是执行
;字符串处理,得到完整路径:
(command "_.copyhist")
(setq html (vlax-create-object "htmlfile"))
(setq str (vlax-invoke-method (vlax-get (vlax-get html 'parentwindow) 'clipboarddata) 'getdata "text")
str (strcase (if (= (type str) 'variant) (vlax-variant-value str) str))
)
(setq str (vl-string-right-trim " " str))
(while (vl-string-search "\r\n" str)
(setq str (vl-string-subst "" "\r\n" str))
)
(while (setq nn (vl-string-search "(LOAD \"" str))
(setq str (substr str (+ nn 8)))
)
(and (setq nn (vl-string-search "\")" str))
(setq str (substr str 1 (1+ nn))) ;file name
)
(setq str (vl-filename-directory (vl-string-translate "/" "\\" str)))
(setq str ( strcat str "\\"))
(setq *nxljpa* str)
(and html (vlax-release-object html))
);progn
(progn
(setq str (vl-registry-read (strcat "HKEY_CURRENT_USER\\" (vlax-product-key) "\\Profiles\\" (getvar "CPROFILE") "\\Dialogs\\Appload") "MainDialog"))
(setq *nxljpa* str)
)
);if
;;********
(setq adver (atof (getvar "acadver")))
(if(>= adver 19.1)
(progn
(nx:tj_trustedpaths)
(nx:add_sfsp)
(nx:createnxgjx)
)
(progn
(nx:add_sfsp)
(nx:createnxgjx)
)
)
;;********
)
)
(princ)
);end 小菜123 发表于 2018-12-6 09:40
(getvar "lastprompt")永远返回:"Command: (getvar \"lastprompt\")"
CAD2005
cad2005确实没有试过,可能不支持这个变量。另外"lastprompt"含义是获取命令行最后显示内容,所以要合理控制PRINC函数的使用。 (getvar "lastprompt")永远返回:"Command: (getvar \"lastprompt\")"
CAD2005 谢谢楼主分享宝贵经验! 楼主,好像确实了PARSE 函数。 appload方式提示正常,拖入方式不正确。
cad2014x64 谢谢楼主分享宝贵经验! 呵呵,论坛还是都喜欢免费的。 谢谢楼主分享,学习了 子函数补上2014 64 没毛病