vlx如何在用到的时候自行加载
本帖最后由 qiushizhda 于 2016-1-4 11:51 编辑在自己的工具箱里为了使用各种插件的命令,我们可以用load命令预先加载各种lsp、vlx、arx插件。现在的问题是,很多vlx加载时会弹出一大堆提示信息,作者的本意是好的,提醒大家如何使用本插件,但是这样的vlx文件较多的话,进入cad就会被刷屏,命令框上面就会刷出各个加载的vlx的各种提示信息。有没有什么好的办法让我们能够先不加载这些vlx,等到用到某个vlx命令的时候输入一个命令,若该vlx还没加载就自行加载。本来我想用以下函数,如
(defun c:ssup_exp ()
(if (not (command "Sup_exp")) (progn (LOAD "path/【Sup_exp】超级炸弹.VLX")(vlax-add-cmd "Sup_exp""c:Sup_exp" ) (command "Sup_exp")) )
)
但是由于command返回结果永远为nil,所以 (not (command "Sup_exp")) 这句话实际永远是T,这样每次都会再执行一遍load,重复工作,有什么办法或者其他思路呢?请大家多多指教~
问题已经解决了,就是把load语句改成autoload语句就行
比如(autoload "path/【Sup_exp】超级炸弹.VLX" '("Sup_exp")),ivde的答案就是最佳答案
关于“重复加载”,说一点基本的概念,这也是容易误解的东西。
很多时候,前面的语句会习惯写成:(defun c:c()(if (not c:c) (load "c")) (c:c))
乍一看,这是有区别的,就是不重复加载,但实际情况并不这样,至少对于在c.lsp中已经定义了外部命令c的情况,这个if判断是不需要的,原因是,在加载了c.lsp后,外部命令c已经服从了c.lsp文件中的定义,而不是开始我们说写的语句,所以下一次执行命令时,也就不会再重复加载了。
但是,使用判断再加载有时也是需要的,比如我们文件中定义了某个函数,但我们希望的命令并不包括在文件定义中,此时就最好判断一下,否则就会重复加载。 我是定义自己的acad.lsp,在其中使用下面这样的语句(比如c.lsp中有命令a和c,vlx应该相同):
(defun c:a() (load “c") (c:a))
(defun c:c() (load "c") (c:c))
本帖最后由 tryhi 于 2019-2-22 17:14 编辑
qiushizhda 发表于 2016-1-4 11:16
谢谢楼上各位的解答
现在这个问题有两个解决思路,但都还不是最理想的
1.(defun ssup_exp ()
(autoload "path/【Sup_exp】超级炸弹.VLX" '("Sup_exp"))
(c:Sup_exp)
)
2.(defun c:a() (load “a") (c:a))
第一种方法的好处就是不用重复加载,缺点是要另外定义函数名
第二种方法的好处是不用重复定义函数名,缺点是要重复加载(使用load)
有没有办法两者兼顾呢?既不用重复加载,又不用另外定义函数名
第二种方法看起来好像是重复加载了,其实并没有,因为加载的时候已经覆盖了,你写的加载命令运行一次之后便已失效,不存在重复加载 使用 autocaddocxxx.lsp 定义的 autoload 函数 (not (c:Sup_exp)) ll_j 发表于 2016-1-4 11:07 static/image/common/back.gif
我是定义自己的acad.lsp,在其中使用下面这样的语句(比如c.lsp中有命令a和c,vlx应该相同):
(defun c:a ...
谢谢楼上各位的解答
现在这个问题有两个解决思路,但都还不是最理想的
1.(defun ssup_exp ()
(autoload "path/【Sup_exp】超级炸弹.VLX" '("Sup_exp"))
(c:Sup_exp)
)
2.(defun c:a() (load “a") (c:a))
第一种方法的好处就是不用重复加载,缺点是要另外定义函数名
第二种方法的好处是不用重复定义函数名,缺点是要重复加载(使用load)
有没有办法两者兼顾呢?既不用重复加载,又不用另外定义函数名 hao3ren 发表于 2016-1-4 10:58 static/image/common/back.gif
(not (c:Sup_exp))
这个好像不能用来判断
如果没定义会出现
no function definition: ll_j 发表于 2016-1-4 11:07 static/image/common/back.gif
我是定义自己的acad.lsp,在其中使用下面这样的语句(比如c.lsp中有命令a和c,vlx应该相同):
(defun c:a ...
你直接用autoload代替load语句就能达成你的要求,而且不用重复执行load。终于解决进cad刷屏的苦恼了 有些没有命令,但也会弹出一大堆提示信息 请问这种情况又何解?? 我来解答
(defun c:jr()
(if (= (type c:yy) 'subr);用这个判断比较合理
(c:yy)
(progn
(load "D:\\贱人工具箱5.8破解版.VLX")
(vlax-add-cmd "yy""c:yy" )
)
)
(prin1)
)
页:
[1]
2