明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1900|回复: 10

[源码] 自动完成程序库安装

[复制链接]
发表于 2016-10-14 14:40 | 显示全部楼层 |阅读模式
本帖最后由 lostbalance 于 2016-10-14 21:59 编辑

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


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


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

点评

次数多了就好蛋疼了,但又不好说什么, 楼主是个好人!  发表于 2016-10-15 11:38

评分

参与人数 2明经币 +2 收起 理由
jltx123456 + 1 赞一个!
USER2128 + 1 赞一个!

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下

本帖被以下淘专辑推荐:

发表于 2016-10-15 09:25 | 显示全部楼层
没有完全看明白,如果我的工具箱文件只有*.fas ,*.vlx, *.cuix以及对应的bmp文件,怎么用你的这个文件安装上述这些东西。另:这个*.cuix是在cad2012下做的,怎么安装到cad2000一下的版本中
发表于 2016-10-15 09:29 | 显示全部楼层
好东西  正在找的  谢谢楼主分享啊   
发表于 2016-10-17 10:13 | 显示全部楼层
楼主是个好人!  
发表于 2016-10-17 10:25 | 显示全部楼层
(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加载到启动组中
 楼主| 发表于 2016-10-18 08:55 | 显示全部楼层
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命令加载吧。
 楼主| 发表于 2016-10-18 09:11 | 显示全部楼层
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后,注册表的项确实显示已加载,那就可能是这个原因了吧?
发表于 2016-10-18 10:08 | 显示全部楼层
用(vlax-product-key)得到的注册表位置理应支持不同操作系统和CAD版本
发表于 2016-10-18 10:35 | 显示全部楼层
lostbalance 发表于 2016-10-18 09:11
看起来程序好像没什么问题。用那个程序加启动组,加好后,最好不要打开立刻打开appload查看结果,建议重 ...

谢谢楼主,就是重启的问题,再次谢谢你的指导
 楼主| 发表于 2016-10-18 10:42 | 显示全部楼层
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了,二来,我对那些也不了解,所有就不考虑这些了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-5 15:56 , Processed in 0.681846 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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