资源描述
下面开始编写初始化LISP程序。这里,我们创建一个LISP程序,命名为:Loadtbox.lsp,这个程序将负责把菜单、主程序等加载到系统中。
以下是这个Loadtbox.lsp的写法。我尽量在注释中解释:
;; 首先定义初始化函数
(defun InittboxApplication (/
;; 内部函数
GetMyApplicationPath GettboxPath
strParse StrUnParse
tbox_AddSupportPath Load_tboxMenu
tbox_placemenu
;; 局部变量
tbox_cmdecho_save
)
;;; 取得本程序的路径.
;;; 文件路径从注册表中读取,这些信息由安装程序负责写入注册表
;;; ---------------------------------------------------------------------------------
(defun GetMyApplicationPath (AppID)
(vl-registry-read
(strcat
"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\"
AppID
"_is1"
)
"Inno Setup: App Path"
)
)
(defun GettboxPath ()
(GetMyApplicationPath "Lisp工具箱")
)
;;; 解析字符串为表(函数来自明经通道转载)
;;; ---------------------------------------------------------------------------------
(defun strParse (Str Delimiter / SearchStr StringLen return n char)
(setq SearchStr Str)
(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
(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
;;; 反解析表为字符串(函数来自明经通道转载)
;;; ---------------------------------------------------------------------------------
(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
;;; 添加支持文件搜索路径
;;; ---------------------------------------------------------------------------------
;;; note: 第二个参数如果为真, 插最前,否则插最后
;;;
(defun tbox_AddSupportPath (PathToAdd isFirst / supportlist)
(if (not
(vl-string-search
(strcase (strcat pathToAdd ";"))
(strcase (strcat (getenv "ACAD") ";"))
)
) ; 保证不重复添加
(progn
(setq supportlist (strparse (getenv "ACAD") ";"))
(setq supportlist
(vl-remove-if-not
'vl-file-directory-p
supportlist
)
) ; 移除不存在的文件夹
(if isFirst
(setq supportlist (cons PathToAdd supportlist))
(setq supportlist (append supportlist (list PathToAdd)))
)
(setenv "ACAD" (strUnParse supportlist ";"))
)
)
)
;; 根据不同的AutoCAD版本加载不同的菜单文件。
(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")
)
((>= 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 (strcat "P" (itoa n) ".1=?"))
(setq n (+ n 1))
(progn
(if (> n 3)
(setq n (- n 2))
(setq n 3)
) ;if
;; 如需插入多条菜单,以反序在这里写:
;; 因只有一条下拉菜单,因此这里4,3,2条注释掉
;; (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)
) ;progn
) ;if
) ;while
) ;progn
) ;if
(princ)
)
;;; -----------------------------------------------------
;;; main:
;;; -----------------------------------------------------
(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中都做好了。下面运行本人制作的安装程序制作向导:
展开阅读全文