向autoload学习
比较喜欢用autoload加载函数,但是最近公司有童鞋说我的插件无法使用,查了下是autoload函数木有这个函数是在acadXXXdoc.lsp中定义的,但是他把这个文件弄丢了,函数原型如下
(defun _autoload (app)
(load app)
);这个函数也忒简单,不知道桌子公司在玩什么
(defun _autoqload (quoi app cmdliste / qapp symnam)
(setq qapp (strcat "\"" app "\""))
(setq initstring "\nInitializing...")
(mapcar
'(lambda (cmd / nom_cmd)
(progn
(setq nom_cmd (strcat "C:" cmd))
(if (not (eval (read nom_cmd)))
(eval
(read (strcat
"(defun " nom_cmd "( / rtn)"
"(setq m:err *error* *error* *merrmsg*)"
"(if (ai_ffile " qapp ")"
"(progn (princ initstring)"
"(_auto" quoi "load " qapp ") (setq rtn (" nom_cmd ")))"
"(ai_nofile " qapp "))"
"(setq *error* m:err m:err nil)"
"rtn)"
))))))
cmdliste)
nil
);这个函数对于学习mapcar evalread 等几个函数有些示范作用,
(defun autoload (app cmdliste)
(_autoqload "" app cmdliste)
) ;这是调用的autoload ,也很简单
从这个函数看出加载的一切根源其实load,其他都是做修饰。
个人用autoqload的主要目的就是文件不存在的时候 他不会干活(ai_ffile 函数判断)
最后我写了个自用的加载函数
(defun LoadApp( filename / )
(if (AppExist filename)
(if (= (load filename "96245863364")"96245863364")
(prompt (strcat "\n " filename "加载出错!"))
filename
)
(prompt(strcat "\n " filename "不在支持路径' "))
)
);也没什么先进的,就是增加了出错提示和文件判断AppExist 函数和ai_ffile 功能一样 可以用ai_ffile替代
单个文件可以这么加载多个文件,可以用foreach 或者mapar,又写了个函数
(defun Apps( AppName ParaLst/ )
(cond ((and (= (type ParaLst) 'STR) (wcmatch ParaLst"*;*"))
(mapcar '(lambda ( n / ) (eval (read (strcat "(" AppName " n )" ) ))) (str2lst ParaLst ";" ) ))
((= (type ParaLst ) 'LIST)
(mapcar '(lambda ( n / ) (eval (read (strcat "(" AppName " n )" ) ))) ParaLst ))
(T nil)
)
);;单参数函数批量化运行,ParaLst可以是表也可以是分号分开的字符串
(defun LoadApps(files / )
(Apps "LoadApp"files )
)
不知道上面的函数有什么用,就当学习 mapcar evalread几个函数的简单使用吧
autoload到底干了撒呢:
就是在用他的时候建立一系列的"c:命令名"函数,这个autoload 建立“c:命令名” 函数们 就是加载lsp文件,然后执行这个命令。后面必须跟列表啊,因为他要用mapcar 针对每一个list中的命令建立一个“c:命令名“的函数
举个例子: (autoload "test.lsp" '("a" "b" "c"))
他就建立了三个函数 “c:a““ c:b““ c:c“(这三个函数在test.lsp其实也是有的,不过这里建立的就很简单了 就几行代码,test.lsp里面的这三个函数代码就可能复杂很多 占用了大量的内存)。autoload建立的三个简化的函数,内容就是 加载test.lsp ,这时候test.lsp里面的三个“c:a““ c:b““ c:c“ 就会覆盖 autoload建立的三个“c:a““ c:b““ c:c“ 函数,这时候 运行命令就是test.lsp里面的三个函数。
原理就这样的,因此我们可以自己改装他 以满足需要,不嫌麻烦的可以自己简化命令 autoload是少内存时代的产物,按需加载,不用的话,就保持简单函数定义,占用内存最小。现代电脑大部分内存足够,没必要整按需加载,一次性全部加载即可。 baitang36 发表于 2021-12-2 12:26
学习的人,扣2
2 2 2 2 2 2 2
很想学习,但不知从何开始 学习的人不多了 学习的人,扣1 学习的人,扣2 学习学习。 autoload我也一直在用,使用程序的时候才加载,完全不影响CAD启动速度。 加深了对eval函数的理解 挺好的:handshake
页:
[1]
2