sutai 发表于 2015-1-29 16:07:51

让lisp程序随处安家——自身路径的设定与读取(更正1)

本帖最后由 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);以下程序正常内容, 这里测试一下路径是否正确
)

烟盒迷唇 发表于 2019-4-22 11:02:36

不错,可以获取到文件所在的路径了

tangweinbs 发表于 2024-12-30 11:16:12

感谢分享,学无止境啊 。

cnks 发表于 2015-1-29 16:38:22

支持一下!

sutai 发表于 2015-1-29 17:14:16

cnks 发表于 2015-1-29 16:38 static/image/common/back.gif
支持一下!

非常感谢!这好像是我在明经发的第一个帖子,鸡冻啊~~~

springwillow 发表于 2015-1-29 17:24:58

支持一下读写注册表

lidaxiu 发表于 2015-1-29 18:29:49

路过,支持一下

illcyt 发表于 2015-1-29 18:55:24

win7好像注册表读取不一样了,注册表里面是一些数字和字母,不像xp那样直接能找到路径,如何破

sutai 发表于 2015-1-29 19:18:47

illcyt 发表于 2015-1-29 18:55 static/image/common/back.gif
win7好像注册表读取不一样了,注册表里面是一些数字和字母,不像xp那样直接能找到路径,如何破

二进制,我不会弄~
我这个读注册表只是为了避免弹出选择路径对话框的措施之一而已,真正作用还是把路径写入自身文件。

伪书虫86 发表于 2015-1-29 19:43:18

支持一下
不过要是程序比较多,还是写注册表添加搜索路径来的方便些

434939575 发表于 2015-1-29 19:46:34

这个好使。谢谢!

Rimford 发表于 2015-1-29 19:51:37

长江后浪推前浪啊
页: [1] 2 3
查看完整版本: 让lisp程序随处安家——自身路径的设定与读取(更正1)