明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3749|回复: 27

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

[复制链接]
发表于 2015-1-29 16:07 | 显示全部楼层 |阅读模式
本帖最后由 sutai 于 2015-2-2 13:49 编辑

CAD目录下过多的文件及子目录势必会拖慢其搜索查找文件的速度从而使程序运行变慢,而有些带数据的lsp零零落落文件不少。
我曾使用读取注册表的方法,虽然大多数情况下能读到,但有时候不知为什么读不到,然后就跳出要求指定目录的对话框,烦。
这两天我想了个方法,让程序在获得正确路径后写入自身文件,下次加载时先读取路径,若读取的路径不正确,继而读取注册表,再读不到,最后才弹出选择位置对话框。只在读不到正确的路径时才写文件,若读取到正确的路径则不做任何动作(lisp文件若较大在写文件时可能会有些缓慢,但仅仅一次而已)。
本程序最大的好处就是不写注册表,不添加CAD搜索路径,删除后不留任何垃圾。

补充一下,你可以分别建立各种目录如图层工具文字工具等,路径设置只需分别设为 path图层、path文字,互不干扰。

或许你有更好的方法希望能给予指点。附件中tt是主程序,tmp只是测试用的。

更正一处:(if (not (wcmatch f_name "*\\tat.LSP"))                      ;确定是否包含程序名
  1. (setq l_path "")
  2. (vl-load-com)
  3. (defun z_getlspdir (p_name / o_file rw_lin rw_lst l_dirn)
  4.   (setq o_file (open p_name "r")
  5.   rw_lst '())
  6.   (while (setq rw_lin (read-line o_file))
  7.     (setq rw_lst (append rw_lst (list rw_lin))))
  8.   (close o_file)
  9.   (setq l_path (substr p_name 1 (- (strlen p_name) 6))  ;去掉文件名, 本例tt.lsp为6位
  10.   l_dirn l_path)
  11.   (while (vl-string-search "\" l_dirn)
  12.     (setq l_dirn (vl-string-subst "/" "\" l_dirn)));while
  13.   (setq l_dirn (strcat "(setq l_path "" l_dirn "")")
  14.   rw_lst (append (list l_dirn) (cdr rw_lst)))
  15.   (setq o_file (open p_name "w"))
  16.   (setq i -1)
  17.   (while (setq rw_lin (nth (setq i (1+ i)) rw_lst))
  18.     (write-line rw_lin o_file));while
  19.   (close o_file)
  20. )

  21. (defun c:tt (/ regkey idxlst p_name g_file)
  22.   (if (not (findfile (strcat l_path "tt.lsp")))    ;若在指定目录下找不到程序文件
  23.     (progn
  24.       (setq regkey "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\ComDlg32\\OpenSaveMRU\\lsp")
  25.       (if (setq idxlst (vl-registry-read regkey "MRUList"))
  26.   (progn
  27.     (setq f_name (vl-registry-read regkey (substr idxlst 1 1)))
  28.     (if (not (wcmatch f_name "*[\tt.lsp]"))                     ;确定是否包含程序名
  29.       (setq f_name (getfiled "请指定程序位置" "tt" "lsp" 32)))  ;指定程序位置, 返回全路径文件名
  30.     );progn
  31.   (setq f_name (getfiled "请指定程序位置" "tt" "lsp" 32))
  32.   );if
  33.       (if (findfile f_name)
  34.   (z_getlspdir f_name)  ;设置并记录程序路径
  35.   (progn
  36.     (princ "\n未取得正确路径, 请重新加载程序!")
  37.     (exit));progn
  38.   );if
  39.       );progn
  40.     );if
  41.   (load (strcat l_path "tmp.lsp")) (z_tmp)  ;以下程序正常内容, 这里测试一下路径是否正确
  42. )

本帖子中包含更多资源

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

x

评分

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

查看全部评分

发表于 2019-4-22 11:02 | 显示全部楼层
不错,可以获取到文件所在的路径了
发表于 2015-1-29 16:38 | 显示全部楼层
支持一下!
 楼主| 发表于 2015-1-29 17:14 | 显示全部楼层
cnks 发表于 2015-1-29 16:38
支持一下!

非常感谢!这好像是我在明经发的第一个帖子,鸡冻啊~~~
发表于 2015-1-29 17:24 | 显示全部楼层
支持一下读写注册表
发表于 2015-1-29 18:29 | 显示全部楼层
路过,支持一下
发表于 2015-1-29 18:55 | 显示全部楼层
win7好像注册表读取不一样了,注册表里面是一些数字和字母,不像xp那样直接能找到路径,如何破
 楼主| 发表于 2015-1-29 19:18 | 显示全部楼层
illcyt 发表于 2015-1-29 18:55
win7好像注册表读取不一样了,注册表里面是一些数字和字母,不像xp那样直接能找到路径,如何破

二进制,我不会弄~
我这个读注册表只是为了避免弹出选择路径对话框的措施之一而已,真正作用还是把路径写入自身文件。
发表于 2015-1-29 19:43 | 显示全部楼层
支持一下
不过要是程序比较多,还是写注册表添加搜索路径来的方便些
发表于 2015-1-29 19:46 | 显示全部楼层
这个好使。谢谢!
发表于 2015-1-29 19:51 | 显示全部楼层
长江后浪推前浪啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-26 17:34 , Processed in 0.549423 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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