ahyin 发表于 2022-7-6 09:51:57

 
运行lisp后,多边形变为另一个形状。我认为这和VVA说的一样,很难确定需要保留哪一点。
LWPOLYLINE空间:模型空间
手柄=2cab
关闭
恒定宽度0.00
面积14153723.23
周长21581.35
 
点X=-9771.00 Y=-7388.00 Z=0.00
点X=-9771.00 Y=-7388.00 Z=0.00
点X=-8116.00 Y=-9826.00 Z=0.00
点X=-9771.00 Y=-7388.00 Z=0.00
点X=-13222.00 Y=-11647.00 Z=0.00
点X=-10528.48 Y=-13202.10 Z=0.00
点X=-8116.00 Y=-9826.00 Z=0.00
 
 
 
LW多段线
空间:模型空间
颜色:9线型:“BYLAYER”
手柄=2da0
关闭
恒定宽度0.00
面积6952768.87
周长17341.12
 
点X=-9771.00 Y=-7388.00 Z=0.00
点X=-8116.00 Y=-9826.00 Z=0.00
点X=-13222.00 Y=-11647.00 Z=0.00
点X=-10528.48 Y=-13202.10 Z=0.00
 
让我详细解释一下我的情况。虽然这是一条闭合的多段线,但一条线段内部有两条重叠的直线。有一些重复点显示重叠位置。我想使用lisp检查多段线,如果发现任何重复的线,它会自动删除它。如果难以确定需要保留哪些直线/点,是否可以显示哪些多段线仅具有此重叠。
谢谢

Lee Mac 发表于 2022-7-6 09:55:52

这将选择具有重复点的所有LWD多段线:
 

(defun c:test ( / LM:UniqueFuzz LM:MAssoc ss i e ) (vl-load-com)
;; © Lee Mac 2011

(defun LM:UniqueFuzz-p ( lst fuzz )
   (or (null lst)
   (and (not (vl-member-if '(lambda ( x ) (equal x (car lst) fuzz)) (cdr lst)))
       (LM:UniqueFuzz-p (cdr lst) fuzz)
   )
   )
)

(defun LM:MAssoc ( key lst / pair )
   (if (setq pair (assoc key lst))
   (cons (cdr pair) (LM:MAssoc key (cdr (member pair lst))))
   )
)

(if (setq ss (ssget "_X" '((0 . "LWPOLYLINE"))))
   (repeat (setq i (sslength ss))
   (if (LM:UniqueFuzz-p (LM:MAssoc 10 (entget (setq e (ssname ss (setq i (1- i)))))) 1e-
       (ssdel e ss)
   )
   )
)
(sssetfirst nil ss)
(princ)
)

VVA 发表于 2022-7-6 09:57:48

试试看

(defun c:testVVA (/ UniqueLineFuzzss i el ss1 lst1)
(vl-load-com)
(defun UniqueLineFuzz (lst fuzz)
   (if lst
   (cons
       (car lst)
       (UniqueLineFuzz
         (vl-remove-if
         '(lambda (x)
            (apply 'and
                     (mapcar '(lambda (l1 l2 / sl1 el1 sl2 el2)
                              (setq
                                  sl1 (mapcar '+
                                              (vlax-curve-getstartpoint l1)
                                              '(0 0)
                                    ) ;_ end of mapcar
                                  el1 (mapcar '+
                                              (vlax-curve-getendpoint l1)
                                              '(0 0)
                                    ) ;_ end of mapcar
                                  sl2 (mapcar '+
                                              (vlax-curve-getstartpoint l2)
                                              '(0 0)
                                    ) ;_ end of mapcar
                                  el2 (mapcar '+
                                              (vlax-curve-getendpoint l2)
                                              '(0 0)
                                    ) ;_ end of mapcar
                              ) ;_ end of setq
                              (or
                                  (and
                                    (equal (car sl1) (car sl2) fuzz)
                                    (equal (cadr sl1) (cadr sl2) fuzz)
                                    (equal (car el1) (car el2) fuzz)
                                    (equal (cadr el1) (cadr el2) fuzz)
                                  ) ;_ end of and
                                  (and
                                    (equal (car sl1) (car el2) fuzz)
                                    (equal (cadr sl1) (cadr el2) fuzz)
                                    (equal (car el1) (car sl2) fuzz)
                                    (equal (cadr el1) (cadr sl2) fuzz)
                                  ) ;_ end of and
                              ) ;_ end of or
                              ) ;_ end of lambda
                           (list x)
                           lst
                     ) ;_ end of mapcar
            ) ;_ end of apply
            ) ;_ end of lambda
         (cdr lst)
         ) ;_ end of vl-remove-if
         fuzz
       ) ;_ end of LM:UniqueSegFuzz
   ) ;_ end of cons
   ) ;_ end of if
) ;_ end of defun
(if (setq ss (ssget "_:L" '((0 . "LWPOLYLINE"))))
   (repeat (setq i (sslength ss))
   (setq el (ssname ss (setq i (1- i))))
   (setq lst (vlax-safearray->list
               (vlax-variant-value
                   (vla-explode (vlax-ename->vla-object el))
               ) ;_ end of vlax-variant-value
               ) ;_ end of vlax-safearray->list
         lst (vl-remove-if '(lambda (x)(equal (vlax-curve-getDistAtParam x(vlax-curve-getEndParam x)) 0.0 1e-6)) lst)
   ) ;_ end of setq
   (setq lst1
            (mapcar 'vlax-vla-object->ename (UniqueLineFuzz lst 1e-6))
   ) ;_ end of setq
   (setq ss1 (ssadd (car lst1)))
   (mapcar '(lambda (x) (ssadd x ss1)) (cdr lst1))
   (if (and (getvar "PEDITACCEPT") (= (getvar "PEDITACCEPT") 1))
       (vl-cmdf "_pedit" "_Multiple" ss1 "" "_Join" 0 "")
       (vl-cmdf "_pedit" "_Multiple" ss1 "" "_Y" "_Join" 0 "")
   ) ;_ end of if
   (entdel el)
   (mapcar '(lambda (x)
                (if (not (vlax-erased-p x))
                  (vla-delete x)
                ) ;_ end of if
            ) ;_ end of lambda
             lst
   ) ;_ end of mapcar
   ) ;_ end of repeat
) ;_ end of if
(princ)
) ;_ end of defun

ahyin 发表于 2022-7-6 10:01:58

 
谢谢你的代码李Mac!

ahyin 发表于 2022-7-6 10:02:59

 
非常感谢您的帮助VVA,这段代码正在运行!再次感谢VVA和李·麦克的友好协助。

ahyin 发表于 2022-7-6 10:06:25

 
我尝试在多段线上使用此lisp,程序返回以下错误消息:
ActiveX服务器返回错误:未知名称:长度
它只在网上工作吗?

VVA 发表于 2022-7-6 10:10:06

正确#13(多么幸运)重试

Lee Mac 发表于 2022-7-6 10:12:56

VVA,只是好奇,为什么:
 
(mapcar '+ < .. >'(0 0))
 
显然,(0 0)不会以任何方式影响结果,因此您是否使用此方法来确保从mapcar返回的是2D点?

irneb 发表于 2022-7-6 10:21:25

我相信李不会介意的:
它广泛使用递归。。。你会在lisp中找到很多东西。一、 e.以形成循环的方式调用自身的函数。这有时比使用正常的while/repeat/etc.循环更好/更容易/更有效。在上述情况下,这是其中之一。
 
还请注意Lee从最后一个实体开始逐步遍历列表-递减i(index)变量。这背后有两个原因:(1)它的效率略高于另一种方式;(2)因为他正在从选择集中删除元素,所以长度会发生变化-因此,如果删除#4,则旧的#5会成为新的#4,因此增加值我会跳过一些项目。
页: 1 [2]
查看完整版本: 检查多段线是否具有duplic