明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 5598|回复: 12

[已解答] vlx如何在用到的时候自行加载

[复制链接]
发表于 2016-1-4 10:27:52 | 显示全部楼层 |阅读模式
本帖最后由 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的答案就是最佳答案


本帖被以下淘专辑推荐:

  • · 学习|主题: 95, 订阅: 8
发表于 2016-1-4 12:25:16 | 显示全部楼层
关于“重复加载”,说一点基本的概念,这也是容易误解的东西。
很多时候,前面的语句会习惯写成:(defun c:c()(if (not c:c) (load "c")) (c:c))
乍一看,这是有区别的,就是不重复加载,但实际情况并不这样,至少对于在c.lsp中已经定义了外部命令c的情况,这个if判断是不需要的,原因是,在加载了c.lsp后,外部命令c已经服从了c.lsp文件中的定义,而不是开始我们说写的语句,所以下一次执行命令时,也就不会再重复加载了。
但是,使用判断再加载有时也是需要的,比如我们文件中定义了某个函数,但我们希望的命令并不包括在文件定义中,此时就最好判断一下,否则就会重复加载。
回复 支持 1 反对 0

使用道具 举报

发表于 2016-1-4 11:07:34 | 显示全部楼层
我是定义自己的acad.lsp,在其中使用下面这样的语句(比如c.lsp中有命令a和c,vlx应该相同):
(defun c:a() (load “c") (c:a))
(defun c:c() (load "c") (c:c))

评分

参与人数 1明经币 +1 收起 理由
冰之绝恋 + 1 神马都是浮云

查看全部评分

回复 支持 1 反对 0

使用道具 举报

发表于 2019-2-22 17:13:12 | 显示全部楼层
本帖最后由 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)
有没有办法两者兼顾呢?既不用重复加载,又不用另外定义函数名

第二种方法看起来好像是重复加载了,其实并没有,因为加载的时候已经覆盖了,你写的加载命令运行一次之后便已失效,不存在重复加载
发表于 2016-1-4 10:51:18 | 显示全部楼层
使用 autocaddocxxx.lsp 定义的 autoload 函数
发表于 2016-1-4 10:58:20 | 显示全部楼层
(not (c:Sup_exp))
 楼主| 发表于 2016-1-4 11:16:48 | 显示全部楼层
ll_j 发表于 2016-1-4 11:07
我是定义自己的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)
有没有办法两者兼顾呢?既不用重复加载,又不用另外定义函数名
 楼主| 发表于 2016-1-4 11:24:00 | 显示全部楼层
hao3ren 发表于 2016-1-4 10:58
(not (c:Sup_exp))

这个好像不能用来判断
如果没定义会出现
no function definition:
 楼主| 发表于 2016-1-4 11:54:00 | 显示全部楼层
ll_j 发表于 2016-1-4 11:07
我是定义自己的acad.lsp,在其中使用下面这样的语句(比如c.lsp中有命令a和c,vlx应该相同):
(defun c:a ...

你直接用autoload代替load语句就能达成你的要求,而且不用重复执行load。终于解决进cad刷屏的苦恼了
发表于 2016-1-7 15:09:36 | 显示全部楼层
有些没有命令,但也会弹出一大堆提示信息 请问这种情况又何解??
发表于 2019-2-22 16:16:30 | 显示全部楼层
我来解答
(defun c:jr()
  (if (= (type c:yy) 'subr);用这个判断比较合理
      (c:yy)
      (progn
            (load "D:\\贱人工具箱5.8破解版.VLX")
             (vlax-add-cmd "yy"  "c:yy" )
      )
   )
  (prin1)
)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-12-27 09:36 , Processed in 0.196446 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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