سبع الليل 发表于 2022-7-6 00:00:10

ssget函数的一个问题

嗨,伙计们
我希望你能帮我
我有一条折线
((-1 . )
(0,“LW多段线”)(330。)(5.“1A7774”)(100。
“AcDbEntity”)(67.0)(410。“Model”)(8。“ali_main_bs”)(100。
“AcDbPolyline”)(90.5)(70.0)(43.0.0)(38.0.0)(39.0.0)(10-3302.06
120081.0) (40 . 0.0) (41 . 0.0) (42 . 0.0) (10 -3266.7 120046.0) (40 . 0.0) (41
. 0.0) (42 . 0.0) (10 2233.3 120046.0) (40 . 0.0) (41 . 0.0) (42 . 0.0) (10
2233.3 120546.0) (40 . 0.0) (41 . 0.0) (42 . 0.0) (10 2197.94 120581.0) (40 .
0.0)(41.0.0)(42.0.0)(210 0.0 0.0 1.0)(-3(“barinfo”(1070.6)(1070)。
16) (1040 . 150.0) (1040 . 5960.0))))
 
正如你所见
我附上了一些信息
最后一个信息是多段线长度
这个(1040.5960.0)
我有许多多段线具有相同的长度,其长度也附加在一起
我想使用ssget函数来选择具有相同长度的所有实体
 
 
我知道>>>如果我想选择属于一个叫做“ali”的层的所有实体,例如,我可以使用这个表达式
(ssget“X”(列表(cons 8“ali”))
 
 
我想如果我用这个表达式
(ssget“X”(列表(cons 1040 5960)))
它将选择所有长度相同的多段线
但它返回“错误的SSGET列表值”
我累了>>>
我怎样才能修复它并做这件事???
 
非常感谢你

BIGAL 发表于 2022-7-6 00:12:01

对于扩展数据,更简单的方法是使用VL,从PLINE中提取长度。这里是一个VL示例,它只有2行代码
 
(setq ss1 (car (entsel))) ;pick a pline
(setq plength (vla-get-length(vlax-ename->vla-object SS1))) ; make this a loop and just compare your length to answer for all plines

版本2

(setq ss1 (ssget "_X" (list (cons 0 "lwpolyline")(cons 8 "0"))))
(setq inc (sslength ss1))
(repeat inc
(setq plength (vla-get-length (vlax-ename->vla-object (ssname SS1 (setq inc (1- inc))))))
(princ "\n")
(princ plength)
)
(princ)

hmsilva 发表于 2022-7-6 00:17:45

除了BIGAL已经说过的,您还可以尝试这样的方法来过滤扩展数据:

(setq ss (ssget "X" '((0 . "LWPOLYLINE") (8 . "ali") (-3 (("barinfo"))))))

 
编辑:如果可能的话,发布一个带有几个多段线的样例dwg,我想测试另一种访问扩展数据的方法,但我太懒了,无法重新创建扩展数据。。。
 
HTH公司
亨里克

سبع الليل 发表于 2022-7-6 00:23:51

谢谢你们
但它也给了我一个错误消息,无法工作
我还在等你的帮助
我还在等待任何lisp,它允许我选择所有长度与我指定的长度相同的多段线
这是我的文件,其中包含这些多段线

hmsilva 发表于 2022-7-6 00:28:45

嗨,只是为了测试。。。将使用(1040.11170.0)选择所有LW多段线
 

(if (setq ss (ssget "X" (list (cons 0 "LWPOLYLINE") (cons -3 (list (list "barinfo"))))))
(repeat (setq i (sslength ss))
   (setq ent (ssname ss (setq i (1- i)))
xdata (cadr (assoc -3 (entget ent '("barinfo")))))
   (if (/= (rtos (cdr (nth 4 xdata)) 2 2) (rtos 11170.0 2 2))
   (ssdel ent ss)
   );; if
);; repeat
);; if

 
我将该值修改为字符串进行测试,因为您的(1040.11170.0)值​​有许多小数位(11170.00001423149)
 
亨里克

BIGAL 发表于 2022-7-6 00:38:16

只是一个细微的变化使用mm作为输入
 

(setq polylen (Getreal "\nEnter your length for pline checking : "))
(if (setq ss (ssget "X" (list (cons 0 "LWPOLYLINE") (cons -3 (list (list "barinfo"))))))
(repeat (setq i (sslength ss))
   (setq ent (ssname ss (setq i (1- i)))
xdata (cadr (assoc -3 (entget ent '("barinfo")))))
   (if (/= (fix (cdr (nth 4 xdata)))polylen) ; note fix is integer value
   (ssdel ent ss)
   );; if
);; repeat
);; if
)

سبع الليل 发表于 2022-7-6 00:40:54

谢谢Hmsilva先生和比加尔先生的帮助
我现在就试试,然后回来
不管怎样,它都会给我添加新的非常有用的注释

hmsilva 发表于 2022-7-6 00:50:57

不客气,
尝试此演示,将选择所有具有相同最后扩展数据点对(1040.XXX.X)和层的LWD多段线,与您选择的一条相同。
确保PICKFIRST=1

(defun c:test ( / E ENT EXDATA I L LAY SS XDATA)
(if (and (setq e (entget (car (entsel "\nSelect a LwPolyline to select equals: ")) '("barinfo")))
(setq exdata (cadr (assoc -3 e))))
(progn
   (setq lay(cdr (assoc 8 e))
l(cdr (nth 4 exdata)))
   (setq ss (ssget "X"
   (list (cons 0 "LWPOLYLINE")
    (cons 8 lay)
    (cons -3 (list (list "barinfo")))
   )
   )
   )
   (repeat (setq i (sslength ss))
   (setq ent   (ssname ss (setq i (1- i)))
    xdata (cadr (assoc -3 (entget ent '("barinfo")))))
   (if (/= (cdr (nth 4 xdata)) l)
(ssdel ent ss)
   );; if
   );; repeat
   (sssetfirst nil ss)
);; progn

);; if
(princ)
)

 
亨里克

سبع الليل 发表于 2022-7-6 00:59:56

Himsilva先生
你是个了不起的人
我真的不知道该怎么感谢你
干得好
这正是我需要的,,,,,,太好了

hmsilva 发表于 2022-7-6 01:05:18

不客气
很高兴我能帮忙
 
亨里克
页: [1]
查看完整版本: ssget函数的一个问题