1、下面开始编写初始化LISP程序。这里,我们创建一个LISP程序,命名为:Loadtbox.lsp,这个程序将负责把菜单、主程序等加载到系统中。 以下是这个Loadtbox.lsp的写法。我尽量在注释中解释: ;; 首先定义初始化函数 (defun InittboxApplication (/ ;; 内部函数 GetMyApplicationPath GettboxPath strParse
2、 StrUnParse tbox_AddSupportPath Load_tboxMenu tbox_placemenu ;; 局部变量 tbox_cmdecho_save ) ;;; 取得本程序的路径. ;;; 文件路径从注册表中读取,这些信息由安装程序负责写入注册表 ;;; -------------
3、 (defun GetMyApplicationPath (AppID) (vl-registry-read (strcat "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\" AppID "_is1" ) "Inno Setup: App P
4、ath" ) ) (defun GettboxPath () (GetMyApplicationPath "Lisp工具箱") ) ;;; 解析字符串为表(函数来自明经通道转载) ;;; --------------------------------------------------------------------------------- (defun strParse (Str Delimiter / SearchStr StringLen return n char) (setq SearchStr Str)
5、 (setq StringLen (strlen SearchStr)) (setq return '()) (while (> StringLen 0) (setq n 1) (setq char (substr SearchStr 1 1)) (while (and (/= char Delimiter) (/= char "")) (setq n (1+ n)) (setq char (substr SearchStr n 1)) ) ;_ end of while
6、 (setq return (cons (substr SearchStr 1 (1- n)) return)) (setq SearchStr (substr SearchStr (1+ n) StringLen)) (setq StringLen (strlen SearchStr)) ) ;_ end of while (reverse return) ) ;_ end of defun ;;; 反解析表为字符串(函数来自明经通道转载) ;;; --------------------------------------
7、 (defun StrUnParse (Lst Delimiter / return) (setq return "") (foreach str Lst (setq return (strcat return Delimiter str)) ) ;_ end of foreach (substr return 2) ) ;_ end of defun ;;; 添加支持文件搜索路径 ;;; -----------------------
8、 ;;; note: 第二个参数如果为真, 插最前,否则插最后 ;;; (defun tbox_AddSupportPath (PathToAdd isFirst / supportlist) (if (not (vl-string-search (strcase (strcat pathToAdd ";")) (strcase (strcat (getenv "ACA
9、D") ";")) ) ) ; 保证不重复添加 (progn (setq supportlist (strparse (getenv "ACAD") ";")) (setq supportlist (vl-remove-if-not 'vl-file-directory-p supportlist )
10、 ) ; 移除不存在的文件夹 (if isFirst (setq supportlist (cons PathToAdd supportlist)) (setq supportlist (append supportlist (list PathToAdd))) ) (setenv "ACAD" (strUnParse supportlist ";")) ) ) ) ;; 根据不同的AutoC
11、AD版本加载不同的菜单文件。 (defun Load_tboxMenu (/ acadver) (setq acadver (atof (getvar "acadver"))) (cond ((and (>= acadver 15.0) (< acadver 16.0)) (command "_menuload" "tbox.mnu") ) ((and (>= acadver 16.0) (<= acadver 16.1)) (command "_menuload" "tbox16.mnu")
12、 ) ((>= acadver 16.2) (command "_menuload" "tbox2006.mnu")) ) ) ;; 这个函数用来插入菜单条 ;; The following code "placemenu" from LUCAS(龙龙仔) (defun tbox_placemenu (/ n) (if (menugroup "tbox") (progn (setq n 1) (while (< n 24) (if (menucmd
13、strcat "P" (itoa n) ".1=?")) (setq n (+ n 1)) (progn (if (> n 3) (setq n (- n 2)) (setq n 3) ) ;if ;; 如需插入多条菜单,以反序在这里写: ;; 因只有一条下拉菜单,因此这里4,3,2条注释掉
14、 ;; (menucmd (strcat "p" (itoa n) "=+tbox.pop4")) ;; (menucmd (strcat "p" (itoa n) "=+tbox.pop3")) ;; (menucmd (strcat "p" (itoa n) "=+tbox.pop2")) (menucmd (strcat "p" (itoa n) "=+tbox.pop1")) (setq n 25) )
15、 ;progn ) ;if ) ;while ) ;progn ) ;if (princ) ) ;;; ----------------------------------------------------- ;;; main: ;;
16、 ----------------------------------------------------- (setq tbox_cmdecho_save (getvar "cmdecho")) (setvar "cmdecho" 0) ;; 添加搜索路径 (tbox_AddSupportPath (GettboxPath) nil) ;; 如果菜单组还没有被加载,则加载之 (if (not (menugroup "tbox")) (Load_tboxMenu) ) ;; 插到合适的位置 ;;; (tbox_placemenu) (setvar "cmdecho" tbox_cmdecho_save) (setq tbox_cmdecho_save nil) (princ) ) ;_end of defun inittboxApplication (inittboxApplication) ;; 加载主程序 ;; 为节省内存,这里也可以以autoload函数形式定义 ;; 有几条写几条 (load "tbox.vlx") (princ) 至此,所有的要添加支持路径、添加菜单的工作在LISP中都做好了。下面运行本人制作的安装程序制作向导:






