本帖最后由 sutai 于 2015-2-2 13:49 编辑
CAD目录下过多的文件及子目录势必会拖慢其搜索查找文件的速度从而使程序运行变慢,而有些带数据的lsp零零落落文件不少。
我曾使用读取注册表的方法,虽然大多数情况下能读到,但有时候不知为什么读不到,然后就跳出要求指定目录的对话框,烦。
这两天我想了个方法,让程序在获得正确路径后写入自身文件,下次加载时先读取路径,若读取的路径不正确,继而读取注册表,再读不到,最后才弹出选择位置对话框。只在读不到正确的路径时才写文件,若读取到正确的路径则不做任何动作(lisp文件若较大在写文件时可能会有些缓慢,但仅仅一次而已)。
本程序最大的好处就是不写注册表,不添加CAD搜索路径,删除后不留任何垃圾。
补充一下,你可以分别建立各种目录如图层工具文字工具等,路径设置只需分别设为 path图层、path文字,互不干扰。
或许你有更好的方法希望能给予指点。附件中tt是主程序,tmp只是测试用的。
更正一处:(if (not (wcmatch f_name "*\\tat.LSP")) ;确定是否包含程序名 - (setq l_path "")
- (vl-load-com)
- (defun z_getlspdir (p_name / o_file rw_lin rw_lst l_dirn)
- (setq o_file (open p_name "r")
- rw_lst '())
- (while (setq rw_lin (read-line o_file))
- (setq rw_lst (append rw_lst (list rw_lin))))
- (close o_file)
- (setq l_path (substr p_name 1 (- (strlen p_name) 6)) ;去掉文件名, 本例tt.lsp为6位
- l_dirn l_path)
- (while (vl-string-search "\" l_dirn)
- (setq l_dirn (vl-string-subst "/" "\" l_dirn)));while
- (setq l_dirn (strcat "(setq l_path "" l_dirn "")")
- rw_lst (append (list l_dirn) (cdr rw_lst)))
- (setq o_file (open p_name "w"))
- (setq i -1)
- (while (setq rw_lin (nth (setq i (1+ i)) rw_lst))
- (write-line rw_lin o_file));while
- (close o_file)
- )
- (defun c:tt (/ regkey idxlst p_name g_file)
- (if (not (findfile (strcat l_path "tt.lsp"))) ;若在指定目录下找不到程序文件
- (progn
- (setq regkey "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\ComDlg32\\OpenSaveMRU\\lsp")
- (if (setq idxlst (vl-registry-read regkey "MRUList"))
- (progn
- (setq f_name (vl-registry-read regkey (substr idxlst 1 1)))
- (if (not (wcmatch f_name "*[\tt.lsp]")) ;确定是否包含程序名
- (setq f_name (getfiled "请指定程序位置" "tt" "lsp" 32))) ;指定程序位置, 返回全路径文件名
- );progn
- (setq f_name (getfiled "请指定程序位置" "tt" "lsp" 32))
- );if
- (if (findfile f_name)
- (z_getlspdir f_name) ;设置并记录程序路径
- (progn
- (princ "\n未取得正确路径, 请重新加载程序!")
- (exit));progn
- );if
- );progn
- );if
- (load (strcat l_path "tmp.lsp")) (z_tmp) ;以下程序正常内容, 这里测试一下路径是否正确
- )
|