[已解决]如何用ssget "X"过滤选择不包含隐藏和冻结的对象
本帖最后由 yhly555 于 2016-10-11 15:20 编辑如题,如何用ssget "X"过滤选择不包含隐藏和冻结的对象,谢谢!
楼主可能需要注意一个问题
比如判断出"图层1"、"图层2"..."图层n"是关闭的或者被冻结的,总之就是不想选择到的图层
那么怎么写最后的过滤表?
我们知道:类型为字符型的组通常可以这样写'(8 . "图层1,图层2...图层n"),这样作为过滤的时候只要是其中之一都会被选择,相当于(-4 . "<or")(8 . "图层1")(8 . "图层2")...(8 . "图层n")(-4 . "or>")
但是,如果这些图层名前边都加上一个~的时候,得到的结果很可能不是你所期望的
比如'(8 "~图层1,~图层2")实际上它根本不起作用了,原因在于那个逗号的作用实际上相当于or,最终就是图层2不是图层1,所以被选中,同样的,因为图层1不是图层2,也被选中,有点绕?但它实际上就是这么干的。。。
这个时候,如果用not来限定就不会有问题了(-4 ."<not")(8 . " "图层1,图层2...图层n")(-4 . "not>")
也就是说,不管是冻结的图层还是隐藏的图层甚至锁定的图层,只要先得到这个图层列表,然后用not进行限定就真正解决问题了
所设得到的需要排除的图层列表为lays,需要选择多段线(0 . "lwpolyline"),那么可以写成
(ssget"X"(list'(0 . "lwpolyline")'(-4 . "<not")(cons 8(apply'strcat(mapcar'(lambda(x)(strcat","x))lays)))'(-4 . "not>"))) 知识点1 : 反向过滤图层
(ssget '((8 . "~家具")))
知识点2 : 获取关闭图层列表
(setq
*acad* (vlax-get-acad-object)
*doc* (vla-get-ActiveDocument *acad*)
*LAYERS* (vla-get-Layers *doc*)
)
(setq layonlist '())
(vlax-for x *LAYERS*
(if (= (vlax-get-property x "LayerOn") :vlax-false)
(setq layonlist (cons (vla-get-name x) layonlist))
)
)
(princ layonlist)
(princ)
知识点3 : 列表转文字
这个自己写
不要养成只伸手的习惯
知识点4 : 特殊字符处理
一般情况下用不上
但如果碰上程序结果不符合预期
就需要解决这个问题
提醒两点
学习wcmatch函数
图层名包括块名都是可以包含特殊字符的
ssget 后跟mode 的部分理解(不断更新)
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=84736&fromuid=202795
llsheng_73 发表于 2016-9-13 11:57 static/image/common/back.gif
ssget 后跟mode 的部分理解(不断更新)
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=84736&fromuid= ...
谢谢, 有不包含冻结的,但没有不包含隐藏的。 建立隐藏图层列表
转化为反向过滤字符串
再配合"A"参数进行选择 楼上的方法好 masterlong 发表于 2016-9-14 19:05
建立隐藏图层列表
转化为反向过滤字符串
再配合"A"参数进行选择
可以写个例子来看看吗?谢谢! 楼主应该是懂编程的
思路有了
做到应该不难 初学者,很多东西还是不理解,谢谢的指点! masterlong 发表于 2016-9-25 01:44
楼主应该是懂编程的
思路有了
做到应该不难
初学者,很多东西还是不理解,谢谢的指点!
页:
[1]
2