lostbalance 发表于 2016-10-14 14:40:51

自动完成程序库安装

本帖最后由 lostbalance 于 2016-10-14 21:59 编辑

自从把编的工具箱共享给同事开始,虽然特意编了安装说明,但还是有好多人根本就不看说明,然后被叫过去帮忙安装,次数多了就好蛋疼了,但又不好说什么。于是打算整一个全自动的安装程序,但苦于水平有限,除了autolisp,其他基本上不懂,最终确认是acaddoc.lsp的方式做一个安装程序。
经过几天的努力,终于完成了。关键的几个调用函数,参考自明经,但下载时间太久,原作者信息丢失,深表歉意。
原来的参考程序有几个地方,我做了调整:
1. 原来有个移除搜索目录的函数,被我删除了,因为安装程序装了好几类内容。只能实现搜索目录卸载,感觉没太大意思。
2. 原来的添加启动组有问题,在明经找了一个可以正常用的。
3. 加了几个AutoCAD系统变量的控制。
大致就这些,欢迎试用讨论。

今天发布给同事试用的时候,发现全新安装的AutoCAD无法正常启动插件,查了下,好像是默认的AutoCAD不加载appload.arx的关系,修改了下启动组的函数,将以下代码替换到lsp里就可以。
;|= 将程序加入启动组
@== (AddStartup AppName)
#== return:
par: AppName: 完整路径
sample: (AddStartup "e:\\12.lsp")
ver: by xshrimp @mjtd
by lostbalance
====================|;
(defun AddStartup (AppName / $akey $skey loadctrlnum NumStartup acadpath loader)
(setq acadpath (vl-filename-directory (findfile "acad.exe"))) ;;获取AutoCAD的安装路径
(if (= (type appname) 'STR)
    (progn
      (setq
      $skey (strcat "HKEY_CURRENT_USER\\" (vlax-product-key) "\\Profiles\\" (getvar "CPROFILE") "\\Dialogs\\Appload\\Startup")
      $akey (strcat "HKEY_CURRENT_USER\\" (vlax-product-key) "\\Applications\\AcadAppload" )
      )
      ;;加入启动组
      (setq NumStartup (vl-registry-read $skey "NumStartup"))
      (if NumStartup
      (progn
          (vl-registry-write $skey "NumStartup" (itoa (+ 1 (atoi NumStartup))))
          (vl-registry-write $skey (strcat (itoa (+ 1 (atoi NumStartup))) "Startup") AppName )
      )
      (progn
          (vl-registry-write $skey "NumStartup" "1")
          (vl-registry-write $skey "1Startup" AppName )
      )
      )
      ;;读取LoadCtrls的值,将这个值与2作“或”运算,再写回。这样可以保证AutoCAD启动时会加载Appload.arx模块。
      ;;不设置LOADCTRLS的话,加入启动组的程序无法正确加载,需要手动启动启动组确认后才可以
      (setq loadctrlnum (vl-registry-read $akey "LOADCTRLS"))
      (if loadctrlnum
      (vl-registry-write $akey "LOADCTRLS" (Boole 7 loadctrlnum 2))
      (vl-registry-write $akey "LOADCTRLS" 15)
      )
      (setq loader (vl-registry-read $akey "LOADER"))
      (if (not loader)
      (progn
          (vl-registry-write $akey "DESCRIPTION" "AcadAppload Command Module") ;;此条可以不加,注释性内容,不影响正常启动
          (vl-registry-write $akey "LOADER" (strcat acadpath "\\Appload.arx")) ;;全新安装或格式化后的AutoCAD默认不加载appload.arx,需添加
      )
      )
    ;T ;;这个T什么用?
    )
    nil
)
)

szx025 发表于 2016-10-15 09:25:19

没有完全看明白,如果我的工具箱文件只有*.fas ,*.vlx, *.cuix以及对应的bmp文件,怎么用你的这个文件安装上述这些东西。另:这个*.cuix是在cad2012下做的,怎么安装到cad2000一下的版本中

lyh137 发表于 2016-10-15 09:29:51

好东西正在找的谢谢楼主分享啊   

longer1000 发表于 2016-10-17 10:13:14

楼主是个好人!

szx025 发表于 2016-10-17 10:25:30

(defun C:nice_makpath ()
(setq oldacad (getenv "ACAD")) (princ)
(if (wcmatch oldacad "*D:\\nice\\support*") ()
    (progn
      (vl-load-com)
      (vl-mkdir "D:\\nice")
      (vl-mkdir "D:\\nice\\support")
      (setq path "D:\\nice;D:\\nice\\support")
      (setenv "ACAD" (strcat oldacad ";" path))
    )   
)
(command "filedia" "0" "menuload" "D:\\nice\\szx.cui" "filedia" "1")
(vla-InsertInMenuBar)
(AddStartup "D:\\nice\\szx2007.lsp")
(princ)
)
这里的(AddStartup "D:\\nice\\szx2007.lsp")怎么没有把lsp加载到启动组中

lostbalance 发表于 2016-10-18 08:55:45

szx025 发表于 2016-10-15 09:25
没有完全看明白,如果我的工具箱文件只有*.fas ,*.vlx, *.cuix以及对应的bmp文件,怎么用你的这个文件安装 ...

以我在lsp中给出的文件夹结构来做示例
1. 把fas、vlx、bmp等文件都放入Tools文件夹,然后,在Tools文件夹内建一个AutoLoadApp.lsp文件,所有的fas、vlx以及lsp都在AutoLoadApp.lsp中,用load或者autoload命令做加载。(Tools文件夹要加入AutoCAD的搜索目录)
2. cuix或者其他的菜单文件,放到menu文件夹中,然后menuload命令加载。(menu文件夹可以不加入搜索目录)
3. 因为我接触autolisp差不多就是2010版(还是2012版)开始的。cuix用的自带cui编辑器做的,虽然效率低,但相对傻瓜一点。对于之前的菜单格式,精力有限,就没了解过。对于2010之前的版本,需要做不同格式的菜单文件,然后增加版本判断,应该还是可以用menuload命令加载吧。

lostbalance 发表于 2016-10-18 09:11:24

szx025 发表于 2016-10-17 10:25
(defun C:nice_makpath ()
(setq oldacad (getenv "ACAD")) (princ)
(if (wcmatch oldacad "*D:\\nic ...

看起来程序好像没什么问题。用那个程序加启动组,加好后,最好不要打开立刻打开appload查看结果,建议重启AutoCAD后再检查。附件中示例程序中提醒立刻重启AutoCAD就是为了它。
测试的时候,可以打开注册表,找到涉及的几个注册表项,看看运行后,那些项有没有变化。(运行程序后F5刷新下注册表就可以看结果)
另外就是因为涉及到注册表了,最好把安全卫士之类的安全软件关了。我试了下,做成acaddoc.lsp后360的安全卫士会把它删除,有时候虽然安装后出现菜单和工具栏了,按理来说是安装成功了,但重启AutoCAD后又变回原样了。
还有就是,好像xp系统的这几个注册表项的位置不一样(听说,不确定),可能就不支持了。这个我也只是猜测,但如果关闭AutoCAD后,注册表的项确实显示已加载,那就可能是这个原因了吧?

vectra 发表于 2016-10-18 10:08:32

用(vlax-product-key)得到的注册表位置理应支持不同操作系统和CAD版本

szx025 发表于 2016-10-18 10:35:21

lostbalance 发表于 2016-10-18 09:11
看起来程序好像没什么问题。用那个程序加启动组,加好后,最好不要打开立刻打开appload查看结果,建议重 ...

谢谢楼主,就是重启的问题,再次谢谢你的指导

lostbalance 发表于 2016-10-18 10:42:29

vectra 发表于 2016-10-18 10:08
用(vlax-product-key)得到的注册表位置理应支持不同操作系统和CAD版本

win7以后的系统,上述路径在HKEY_CURRENT_USER下,但XP的好像是在HKEY_LOCAL_MACHINE还是HKEY_USERS下,但vl函数vl-registry-write好像不支持在上述目录下的写入。
大概了解了下,暂时的方法是用bat或者reg之类的进行注入。
不过,一来很周围基本没有xp了,二来,我对那些也不了解,所有就不考虑这些了。
页: [1]
查看完整版本: 自动完成程序库安装