ssget过滤器选择顶点数大于2的偶数且闭合的多段线
本帖最后由 fangmin723 于 2024-6-19 14:35 编辑感谢明经 AutoLISP 编程②群的:
【自贡黄明儒】大师和【LLSheng_73■■■】大佬的指导!
【LLSheng_73■■■】指出:
;;(logand 奇数 1)一定是等于1的,
;;(logand 偶数 2)那就不见得是2了,所以前边会漏选很多
经过测试,理解如下:
;;(logand number 1) 结果为1时,number一定是奇数。
;;(logand number 2) 结果为0或2时,number不一定是偶数。
;;选择顶点数大于2的偶数且闭合的多段线
(ssget
'((0 . "LWPOLYLINE")
(-4 . ">") (90 . 2);;顶点数大于2
(-4 . "<not") (-4 . "&=") (90 . 1) (-4 . "not>");;偶数
(70 . 1);;闭合
)
)
想过将(-4 . ">") (90 . 2);;顶点数大于2去掉,但是试了下,两个顶点的多段线,也可以设置闭合属性,为了严谨性,就保留了!
ssget用法详解出处:https://blog.csdn.net/yxp_xa/article/details/72229202
知识扩展:boole函数:
(boole 1) => AND(与)
(boole 7) => OR(或)
(boole 8) => NOT(非)
(boole 6) => XOR(异或)
12 => 1100
5=> 0101
(boole 1 5 12) 0100 => 4 ;;两个都是1的返回1,即返回0100
(boole 7 5 12) 1101 => 13 ;;有一个是1的返回1,即返回0100
(boole 8 5 12) => (boole 8 5 12) => (boole 8 (boole 7 5 12) 0) => 13的补码 =>
111111111111111111111111111111111111111111111111111111111111 0010 => -14 ;;有一个是1的返回1,即返回1101,然后取补码 0010
(boole 6 5 12) 1001 => 9 ;;两个相同的返回0,即返回1001
说一下我的理解,不一定对,和大佬们请教一下
"&="按位屏蔽相等,以(-4 . "&=") (90 . 1)为例,每个图元的90号组码值x与1按位求与(Logand x 1),返回值!=1不等于1,则为真,会被选择,否则无论等于多少,都是假,不会被选择。
奇数的二进制,末尾肯定是1,偶数的二进制,末尾肯定是0,以8为例,二进制,1000,(Logand 1000 0001),返回值0,不等于1,被选择。以9为例,二进制,1001,(Logand 1001 0001),返回值1,则不会被选择。 ;; 来个啰嗦的
(defun abc (ss / lst)
(setq lst (xyp-Ss2List ss)
lst (vl-remove-if-not '(lambda (x) (xyp-Etype x "*polyline")) lst)
lst (vl-remove-if-not '(lambda (x) (xyp-CurveIsClose x)) lst)
lst (vl-remove-if '(lambda (x) (/= (rem (length (xyp-Vertexs x 0)) 2) 0))lst)
)
) 谢谢大佬分享,按位逻辑求布尔值,一直很神秘。 没帮上什么忙,还是你自己太厉害了。 自贡黄明儒 发表于 2024-6-19 09:24
没帮上什么忙,还是你自己太厉害了。
黄大师过过谦了 请教一下,
(boole 8 5 12),关于非这段解释,还是没看懂。 hubeiwdlue 发表于 2024-6-19 13:07
请教一下,
(boole 8 5 12),关于非这段解释,还是没看懂。
不用懂,了解下就行了,函数用的不多 转成c#看看 hubeiwdlue 发表于 2024-6-19 13:07
请教一下,
(boole 8 5 12),关于非这段解释,还是没看懂。
看这个可能更明白
你有种再说一遍 发表于 2024-6-19 14:11
转成c#看看
C#有现成的运算符啊,不用转
布尔逻辑运算符 - 布尔 AND、OR、NOT 和 XOR 运算符 - C# reference | Microsoft Learn
页:
[1]
2