fangmin723 发表于 2024-6-19 07:46:19

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






hubeiwdlue 发表于 2024-6-19 09:40:56

说一下我的理解,不一定对,和大佬们请教一下

"&="按位屏蔽相等,以(-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,则不会被选择。

xyp1964 发表于 2024-6-19 23:02:50

;; 来个啰嗦的
(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)
)
)

hubeiwdlue 发表于 2024-6-19 09:17:24

谢谢大佬分享,按位逻辑求布尔值,一直很神秘。

自贡黄明儒 发表于 2024-6-19 09:24:38

没帮上什么忙,还是你自己太厉害了。

fangmin723 发表于 2024-6-19 10:10:55

自贡黄明儒 发表于 2024-6-19 09:24
没帮上什么忙,还是你自己太厉害了。

黄大师过过谦了

hubeiwdlue 发表于 2024-6-19 13:07:33

请教一下,
(boole 8 5 12),关于非这段解释,还是没看懂。

fangmin723 发表于 2024-6-19 13:10:36

hubeiwdlue 发表于 2024-6-19 13:07
请教一下,
(boole 8 5 12),关于非这段解释,还是没看懂。

不用懂,了解下就行了,函数用的不多

你有种再说一遍 发表于 2024-6-19 14:11:02

转成c#看看

自贡黄明儒 发表于 2024-6-19 14:17:28

hubeiwdlue 发表于 2024-6-19 13:07
请教一下,
(boole 8 5 12),关于非这段解释,还是没看懂。

看这个可能更明白

fangmin723 发表于 2024-6-19 14:32:03

你有种再说一遍 发表于 2024-6-19 14:11
转成c#看看

C#有现成的运算符啊,不用转

布尔逻辑运算符 - 布尔 AND、OR、NOT 和 XOR 运算符 - C# reference | Microsoft Learn
页: [1] 2
查看完整版本: ssget过滤器选择顶点数大于2的偶数且闭合的多段线