手动切换图层
版主有一个根据执行的命令自动切换图层的工具,但是在我平时工作中,更多的是用一些基本的命令绘制cad基本图元,然后放置在某个图层上.例如同样是用line画条直线,这条直线可能是挡烟垂壁可能是伸缩缝也可能只是条用于标记的注释线.
因此我自己写了一个小程序,经过多次迭代以后能满足基本的使用了,但是感觉代码太过啰嗦.而且我是初学者,很多时候因为不会用某个函数,都是用一些很别扭的方式来实现相同的功能,例如以前不知道foreach时用repeat循环.所以我发在这里希望能学到更多东西.
使用准备:
需要提前配置图层列表文件,并将该文件的路径替换lsp文件中的fn变量的值.
配置文件格式如下(可参见附件示例):
nil;2;370;62
nil;(lambda (x) x );(lambda (x) (fix (* 100 (atof x))));(lambda (x) (atoi x))
快捷代码;图层名;线宽mm;颜色索引号
1;_01临时辅助线;0.25;51
2;_02防烟分区示意图;0.5;170
3;_03最远点距离;0.25;103
文件第一行为dxf
第二行为lambda函数.由于函数中难免会有空格,分隔方式为分号.
第三行为方便用户修改配置文件时使用的行标签
第四行起是各图层的相关信息.
命令名为wyl_chlay,
使用方法,执行命令后直接按空格显示图形列表方便查询图层和切换代码的对应关系,执行命令后输入切换代码切换图层.
当空选的时候切换当前图层为目标图层,并解锁该图层.
有选择时切换(未锁定的)选择对象的图层,并且保持当前激活图层不变.
如果无目标图层,根据配置文件中的信息自动新建图层.如已有目标图层,不会调整目标图层的设置.
最新一次修改(V8)主要目的是增加扩容性,直接在图层配置文件中修改即可,由于程序是利用dxf新建的图层,因此所有可以通过dxf配置的内容均可任意增减(除前两列).
各组码含义及对应的lambda函数如下,常用的应该就是前四个:
(list
(list 370 "(lambda (x) (fix (* 100 (atof x))))" "线宽mm");dxf中存储的是线宽枚举值,数值上等于线宽mm数*100
(list 62 "(lambda (x) (atoi x))""颜色索引号");当为负数时图层为关闭状态
(list 6 "(lambda (x) x)""线型");字符串
(list 290 "(lambda (x) (atoi x))" "是否打印")
(list 70 "(lambda (x) (atoi x))" "锁定冻结方式")
)
每个子表的第一个为组码,对应配置文件中的第一行,第二个为lamba函数,对应配置文件的第二行(不带引号),第三个为列标签,对应配置文件的第三行.
代码中使用的正则表达式函数取自<AutoLisp葵花宝典 >常用函数中.
如果使用中发现什么bug,请提出来,谢谢.
附件见下
其实“线宽”定义意义不大,线型才是常用 纯支持,不评价。。。。。。。 (defun c:tt ();自动换层
(defun Str2LstSpr (str sub / lst n)
(while (setq n (vl-string-search sub str))
(setq lst (cons (substr str 1 n) lst)
str (substr str (+ n (strlen sub) 1))
)
)
(vl-remove "" (reverse (cons str lst)))
)
(defun LaCoLw (la co lw)
(if (= (tblsearch "layer" la) nil)
(Command "-layer" "m" la "c" co "" "lw" lw "" "")
(Command "-layer" "t" la "")
)
(setvar 'clayer la)
(setvar 'cecolor "BYLAYER")
(setvar 'celweight (* lw 100))
)
(setq lst '(;;格式: "快捷代码;图层名;线宽mm;颜色索引号"
"1;01临时辅助线;0.25;51" "2;02防烟分区示意图;0.5;170" "3;03最远点距离;0.25;103"
"4;04PIPE-地暖供;0.3;4" "5;05防火分区线;0.5;20" "11;11需注意;2.0;212"
"12;12风机设备;0.25;7" "13;13风井编号;0.25;7" "14;14伸缩缝;0.25;175"
"15;15详图剖面;0.25;7" "21;21排烟风管长度;0.25;2" "22;22补风风管长度;0.25;4"
"23;23室外机编号;0.25;221" "24;24最远点距离文字;0.25;103" "25;25未使用;0.25;167"
"28;28专业框;0.25;7" "29;29模板内容;0.25;7" "30;30排风扇;0.25;6"
"31;31图名下标注;0.25;3" "32;32防火分区编号面积;0.25;20" "33;33防烟分区编号;0.25;130"
"34;34人防区域;0.25;205" "35;35不打印图层;0.25;251" "41;41自然通风井;0.25;7"
"42;42车位;0.25;7" "44;44挡烟垂壁;0.5;100" "51;51电条件;0.25;7"
"52;52建筑未分类;0.25;7" "53;53图框;0.25;130" "54;54图框内文字;0.25;7"
"55;55图名;0.25;3" "61;61排烟系统;0.25;3" "62;62补风系统;0.25;3"
"63;63空调风系统;0.25;3" "64;64空调水系统;0.25;3" "65;65通风系统;0.25;3"
)
lst (mapcar '(lambda (x) (Str2LstSpr x ";")) lst)
xh(Ustr 1 "图层序号" xh nil)
)
(if (setq nn (vl-position xh (mapcar 'car lst)))
(setq a(nth nn lst)
la (nth 1 a)
lw (distof (nth 2 a))
co (atoi (nth 3 a))
b(LaCoLw la co lw)
)
)
(if (setq ss (ssget))
(command ".chprop" ss "" "la" la "")
)
(princ)
) 本帖最后由 wyl219 于 2019-11-26 17:43 编辑
bai2000 发表于 2019-11-26 13:12
其实“线宽”定义意义不大,线型才是常用
都已经这样了还不知道怎么修改么......
图层列表文件改成下面的形式,即可删除线宽增加线型
nil;2;62;6
nil;(lambda (x) x );(lambda (x) (atoi x));(lambda (x) x)
编号;图层名;颜色索引号;线型
1;_01临时辅助线;51;Continuous;
2;_02防烟分区示意图;170;DASH;
xyp1964 发表于 2019-11-26 14:42
谢谢院长,把配置信息写死到程序中,需要修改的时候不是更麻烦么? xyp1964 发表于 2019-11-26 14:42
命令: tt ; 错误: no function definition: USTR http://bbs.mjtd.com/thread-70009-1-1.html,这里有个思路一样的程序,非常nice,大神有空研究下,继续更新更新
页:
[1]