皇上快溜 发表于 2023-2-21 16:49:18

多段线选择

(if (setq ss (ssget "w"
                     pt1
                     pt2
                  (list
                      (cons -4 "<or")

                      (cons -4 "<and")
                      (cons 0 "LWPOLYLINE")
                      (cons 70 0)
                      (list -3 (list "zyj-wh"))
                      (cons -4 "and>")

                      (cons -4 "<and")
                      (cons 0 "CIRCLE")
                      (list -3 (list "zyj-wh"))
                      (cons -4 "and>")

                      (cons -4 "or>")
                    )
              )
      )
式中(cons 70 0)致使多段线全部选不上,假使不要这行,多段线又能被选上。请教一下,是哪里没弄对?

飞雪神光 发表于 2023-2-21 20:06:10

70的组码有两个版本 一个是0和1 一个是128和129

tryhi 发表于 2023-2-22 10:29:38

本帖最后由 tryhi 于 2023-2-22 10:31 编辑

edsion24 发表于 2023-2-22 08:27
(-4 . "&=") 这句话是什么意思呢
操作
意义

*
通用字符(表示所有的意思)

=
等于

! =
/=

<>
不等于

<
小于

<=
小于等于

>
大于

>=
大于等于

&
Bitwise AND (仅用于整型数群组)

&=
Bitwise marked equals (仅用于整型数群组)




    这些关系操作的使用将视您测试的群组种类而定:

    对实型数与整型数值两群组而言, 除了bitwise操作(“&”和“&=”) 以外的所有关系操作都有效。

    对整型数值群组而言, bitwise 操作(“&”和“&=”) 都是有效的。如果 ((integer_group & filter) /= 0), 则bitwise 操作“&”将为真, 意即如果有任何的位设定在记号内, 则也将设定在整型数群组中。如果((integer_group & filter) = filter), 则 bitwise 操作“&=”将为真, 意即如果有任何的位设定在记号内, 则也将设定在 integer_group 中。其他群组也许设定在 integer_group 中, 但并不检查。

    对点群组而言, X, Y, Z的测试应该合并至一单一字符串(以每一操作间以逗号分开的方式。如, “>, >, *”)。如果一操作被从字符串中忽略 (如,“=, <>”, 少了 Z 测试), “*” 操作将被假设。

    方位向量(群组形式210)将可以仅以“*”, “=” 与“! =”(或另两个不等于操作)来比较。

    您不能使用配合字符串群组的关系操作。请以万用字符取代。

    ● 逻辑群组的过滤器测试

    在上面所描述的关系操作属于二进制位。您也可以经过建立嵌套的布尔表达式(如下表的群组操作)来测试群组。群组操作将由-4 群组所指定, 就像关系运算符。它们是成对的, 过滤器表左右括号的平衡也一样, 否则 ssget 的调用将失效。这些可被包含在运算域中的运算符的数量将视下述表中的操作而定:
起始操作
中间运算域
结束操作

<AND
一个或一个以上的运算域
AND>

<OR
一个或一个以上的运算域
OR>

<XOR
两个运算域
XOR>

<NOT
一个运算域
NOT>


    配合群组操作, 一运算域是一个图元项群组。在一个图元项群组之后的将是一个关系操作或是经过这些操作所建立的嵌套表达式。

    在一个过滤器表中的一个群组操作范例将如下所示:

    (ssget “X” '((-4 .“<OR”)

         (-4 . “<AND”)

            (0 . “CIRCLE”)

             (40 . 1.0)

          (-4 .“AND>”)

          (-4 .“<AND”)

             (0 .“LINE”)

             (8 .“ABC”)

          (-4 .“AND>”)

          (-4 .“OR>”))

          )

    如此将选择半径为 1.0 的圆, 与在“ABC”图层上的所有线。群组操作的大小写都是一样的, 所以您也可以使用小写字符, 如:“ and”,“<or”,“xor>”等。

vormittag 发表于 2023-2-22 15:12:37

edsion24 发表于 2023-2-22 08:27
(-4 . "&=") 这句话是什么意思呢

表示对后面一个点对表是按“按位与”规则的结果来过滤。
比如说后面跟的是 (70 . 1),选择过滤时会将图元的 70 组码值与 1 进行“按位与”运算,如果多段线有线型生成,70 组码会加上128,这时就不能用 70组码为 0 还是 1 来判断多段线是否闭合。 拿 129 为例,转换为二进制是 【1000 0001】与 1 的二进制形式 【0000 0001】按位与,其结果为【0000 0001】,和 1 是一样的,因此,组码表里有 (70 . 129) 的图元是能够被过滤出来的。同理,像 (70 . 3)(70 . 5) 等等都是可以被过滤出来的,只不过这些表在 DXF 中没有意义。

kwok 发表于 2023-2-21 18:05:00

(cons 70 0)(cons 70 1)是闭合和不闭合多线段区别.

皇上快溜 发表于 2023-2-21 18:43:39

被选图元中包含闭合的和不闭合的各一条。如代码中有(cons 70 0)这句,全都选不上,去掉这一句,又全都选上了。所以我觉得大概是表元素70的,没弄对。

皇上快溜 发表于 2023-2-21 22:25:10

飞雪神光 发表于 2023-2-21 20:06
70的组码有两个版本 一个是0和1 一个是128和129

你好,两个版本哪一个更可靠一些呢?或者说什幺条件下用哪个版本是可靠的?

皇上快溜 发表于 2023-2-21 23:47:50

飞雪神光 发表于 2023-2-21 20:06
70的组码有两个版本 一个是0和1 一个是128和129

两套组码用Or并用,完美解决。谢谢你。

vormittag 发表于 2023-2-22 00:15:44

(ssget'((0 . "LWPOLYLINE")(-4 . "&=")(70 . 1)))

(70 . 1) 前面加个 (-4 . "&=") 就行了

edsion24 发表于 2023-2-22 08:27:49

(-4 . "&=") 这句话是什么意思呢
页: [1] 2
查看完整版本: 多段线选择