
提供思路 和 部分代码
1快捷方式可以用(defun c: xxx) 实现
2调用xxx 时 可以d出对话框 选择需要选取的图形 并将结果 放入选集 selection@
3关闭0 图层 打开 1图层 试用insert 命令插入 至于偏移多少自己定
3关闭1 图层 打开 2图层 用insert 命令插入 到图层2中
;;;;;实现打开图层1 例如 (LayerOn 1)
(defun LayerOn (LayerNames$ / LayerList@ Name$)
(setq LayerList@ (CommaList LayerNames$))
(foreach Name$ LayerList@
(if (= Name$ "")
(command "LAYER" "T" "" "U" "" "ON" "" "")
(if (tblsearch "layer" Name$)
(command "LAYER" "T" Name$ "U" Name$ "ON" Name$ "S" Name$ "")
(command "LAYER" "M" Name$ "")
);if
);if
);foreach
);defun LayerOn
;;关闭图纸0 (LayerOff 0)
(defun LayerOff (LayerNames$)
(if (= LayerNames$ "")
(command "LAYER" "F" "" "")
(command "LAYER" "OFF" LayerNames$ "F" LayerNames$ "")
);if
);defun LayerOff
(findfile "settingtxt")
用以上语句获取你这个文件的完整路径,前提是不管这个文件是放在那个目录,必须将该目录设置在autocad的支持文件搜索路径内,否则是找不到该文件目录的
(defun c:test()
(SETVAR "QAFLAGS" 1)
(setq s (ssget "X" '(
(-4 "<or")
(8 "")
(-4 "or>")
)))
(command "explode" s "")
(setq s nil)
(SETVAR "QAFLAGS" 0)
)
(c:test)
;可以使用princ函数在命令行查看,如:
(setq &k1 (entsel)) ;选择对象
(princ &k1) ;命令行查看代码&k1
(setq &k2 (car &k1)) ;取得对象图元名
(princ &k2) ;在命令行查看图元名
(setq #k1 (entget &k2));取得图元名的属性列表
(princ #k1) ;在命令行查看属性列表
怎么在启动CAD时自动加载Lisp的工具及插件
网上有很多非常有用的CAD插件,手动加载后就可以执行,但每次用的时候都要加载挺麻烦的,能不能在启动软件的`时候把自己常用的插件加载进来
方法1:添加到启动组
CAD的工具插件都可以通过appload(ap)命令来加载,在d出的“加载\卸载应用程序”对话框中,可以找到“启动组”。不同CAD不一样,AutoCAD是在“启动组”下面有一个“内容”按钮,点击此按钮就可以需要启动时自动加载的程序加进去;浩辰CAD有一个“添加到启动组”按钮,可以将“历史记录列表”中加载过的程序添加到启动组中。添加到启动组后,下次启动CAD的时候这些程序就会自动加载。
这种方式比较简单易行,任何 *** 作起来都没有难度。
方法2:在启动的lisp文件加入LOAD语句。
无论是AutoCAD还是浩辰CAD等国产CAD,启动时都会有一个自动加载的LISP程序,AutoCAD加载的是acadlsp或acadxxxxlisp(xxxx为版本号),acaddoclsp等(通常在AutoCAD的support目录下),很多CAD病毒正是利用了这一点来加载从而影响CAD的应用;浩辰CAD等自动加载的LSP名为icadautoloadlsp,在安装的根目录下,浩辰CAD8以后的版本为SUPPORT目录下的gcad2013doclsp。
需要做的就是用记事本打开这些LSP,在里面加上类似下面的语句:
(LOAD "x:\\xxxxx\\sp2pllsp")
如果觉得写路径太麻烦,你就可以将程序复制刚才哪些自动加载LISP所在的路径。
关于CAD病毒
因此如果遇到AutoCAD莫名奇妙出现不正常状态,你可以搜索所有acadlsp,看看在图纸所在目录是否有此类文件,是否有多个相同大小的此类LSP,如果有,删除掉后可以看看CAD是否恢复正常。如果有兴趣可以用记事本打开看看,到底这些CAD病毒做了什么手脚。当然现在CAD病毒也有变种成acadvlx或acadfas的,这些文件就没法打开看了,如果有此类文件,建议直接删除。
;一般有两个方案
第一个方案:用AutoLisp方案,首先用 取得图块这个图元,然后用 entnext 逐一找到属性块来找到其中length的属性,然后将它的值给找出来,然后进行运算,注意 entnext 的运用。这个很简单,你自己应该写吧。
第二个方案:用VisualLisp方案,注意vla-getattributes,vlax-variant-value,vlax-safeArray->list这几个函数的运用,以下为 VisualLisp的例子
(Defun C:Test ()
(setq en0 (car (entsel)))
;;此处请选有属性定义的图块
(setq vn0 (vlax-ename->vla-object en0))
(setq lstVar (vla-getattributes vn0))
(setq lstAttrs (vlax-safeArray->list (vlax-variant-value lstVar)))
(setq TextString nil)
(foreach attr lstAttrs
(setq TagString (vla-get-TagString attr))
(if (equal TagString "length") ;此处为你想要的元素
(setq TextString (vla-get-TextString attr))
)
)
(if TextString
(princ (strcat "The content of length = " TextString))
(princ "没有找到length ")
)
(prin1)
)
;;打开指定图层lisp
(defun c:tes ( / lay lays obj TC_ss tc1)
(vl-load-com)
(setq TC_ss '() lays (vla-get-layers (vla-get-activedocument (vlax-get-acad-object))))
(vlax-for obj lays
(setq TC_ss (cons (vla-get-Name obj) TC_ss));提取所有图层
)
(setq TC_ss (mapcar 'strcase TC_ss) lay nil)
(if tc_mc
(if (and (setq tc1 (getstring (strcat "\n请输入需要打开的图层名称默认:<" tc_mc ">"))) (/= tc1 ""))
(setq tc_mc (strcase tc1) lay t)
(setq lay t)
)
(if (setq tc1 (getstring "\n请输入需要打开的图层名称:")) (setq tc_mc (strcase tc1) lay t) )
)
(if lay
(progn
(if (member tc_mc TC_ss)
(progn
(setq lay (vla-add lays tc_mc))
(if (< (cdr (assoc 62 (tblsearch "layer" tc_mc))) 0) (vla-put-LayerOn lay :vlax-true));打开
)
(progn
(princ (strcat "\n没有(" tc_mc ")这个图层,仔细核对后输入"))
(setq tc_mc nil)
)
)
)
)
(princ)
)
;以上是autolisp程序
以上就是关于关于cad的lisp全部的内容,包括:关于cad的lisp、CAD lisp中,是否可以获取自己所在的lisp源代码文件的当前所在路径名、用lisp实现打开一个图后自动炸开所有的问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)