筛选0条长度线
我正在尝试设计一个例程,将清理所有0长度线的绘图;第一次尝试是创建一个包含所有行的选择集,并对其进行解析,以比较起点和终点(DXF代码10和11)。不幸的是,这是一个很长的过程。可以为SSGET函数编写过滤器,以仅选择具有相同DXF代码10和11的行?
非常感谢。
当做
米尔恰 我不确定这是否可行,因为如果使用“-4”关系过滤代码,10和11 DXF组码需要有值进行比较:
由于直线图元没有表示长度的DXF代码,因此没有唯一的值来过滤。。。
这是我最有可能遵循的路线:
(defun c:test ( / ss i e l )
(if (setq ss (ssget "_X" '((0 . "LINE"))))
(repeat (setq i (sslength ss))
(setq e (ssname ss (setq i (1- i)))
l (entget e)
)
(if (equal (cdr (assoc 10 l)) (cdr (assoc 11 l)) 1e- (entdel e))
)
)
(princ)
) 没有人能比李更快。
这就是我可怜的方式。
(defun c:TesT (/ sel ss i sset 1st 2nd obj)
(setq sel (ssadd))
(setq ss (ssget "_x" '((0 . "LINE"))))
(repeat
(setq i (sslength ss))
(while
(setq sset (ssname ss (setq i (1- i))))
(setq 1st (cdr (assoc 10 (setq ents (entget sset)))))
(setq 2nd (cdr (assoc 11 ents)))
(if (and (eq (car 1st) (car 2nd))
(eq (cadr 1st) (cadr 2nd))
)
(setq obj (ssadd sset sel))
)
)
)
(sssetfirst nil obj)
(print (strcat (itoa (sslength obj)) " " " Line(s) found"))
(princ)
)
塔瓦特 弗拉怎么办?
请注意,您的代码有一个嵌套循环,因此,在遍历内部while循环相当于选择集大小的次数后,它将以相同的次数遍历repeat循环。
(defun c:test (/ sset)(vl-load-com)
(if (setq sset (ssget "X" '((0 . "LINE"))))
(progn(foreach
ob (vl-remove-if 'listp (mapcar 'cadr (ssnamex sset)))
(if (/= (vla-get-length (vlax-ename->vla-object ob)) 0.0)
(setq sset (ssdel ob sset))
)
)
(sssetfirst nil sset)
)
)
)
糟糕、糟糕、低效。
(ssget“_:L”'((0。“行”))
(对象的vlax(setq ss(vla get activeselectionset adoc))。。。。
较好的 很或者用repeat/while单步执行,并使用 (vlax-curve-getDistAtParam <Entity> (vlax-curve-getEndParam <Entity>))
您还可以使用vlax curve getDistAtPoint和vlax curve getEndPoint。两者都可以。
非常感谢。
所以While函数对于repeat是错误的。
我喜欢lambda。
(defun c:TesT (/ sel ss)
(setq sel (ssadd))
(if (setq ss (ssget "_x" '((0 . "LINE"))))
((lambda (i / sset 1st 2nd obj)
(while
(setq sset (ssname ss (setq i (1+ i))))
(setq 1st (cdr (assoc 10 (setq ents (entget sset)))))
(setq 2nd (cdr (assoc 11 ents)))
(if (and (eq (car 1st) (car 2nd))
(eq (cadr 1st) (cadr 2nd))
)
(setq obj (ssadd sset sel))
)
)
(sssetfirst nil obj)
)
-1
)
)
(princ)
)
页:
[1]
2