p7q Posted 4 hours ago Posted 4 hours ago Hi everyono, I’ve tried using the OVERKILL command in AutoCAD to remove overlapping objects. However, it doesn’t have a parameter to keep only the longest object when there are overlaps. I’m looking for an AutoLISP routine that can work with LINE and PLINE (polylines), detect overlapping or collinear segments, and delete all but the longest one in each group. Thanks in advance! Quote
SLW210 Posted 3 hours ago Posted 3 hours ago There is an option in OVERKILL to combine co-linear objects that partially overlap. If that's not what you need, post a before/after .dwg. Quote
p7q Posted 3 hours ago Author Posted 3 hours ago 21 minutes ago, SLW210 said: There is an option in OVERKILL to combine co-linear objects that partially overlap. If that's not what you need, post a before/after .dwg. The issue is that in my case the longest object is underneath and the shorter one is on top in the draw order. When I run OVERKILL, it keeps the top-most object, which ends up deleting my longest segment. What I need is to always keep the longest overlapping segment (LINE or PLINE) and delete the shorter one, regardless of the draw order. Quote
Saxlle Posted 1 hour ago Posted 1 hour ago (edited) Hi @p7q, If this what you want, you can try with this: (prompt "\nTo run a LISP type: DOL (DeleteOverlappingLines)") (princ) (defun c:DOL ( / ss len i ename_length_list ename ename_length) (setq ss (ssget (list (cons 0 "*LINE"))) len (sslength ss) i 0 ename_length_list (list) ) (while (< i len) (setq ename (ssname ss i) ename_length (getpropertyvalue ename "Length") ename_length_list (append ename_length_list (list (list ename ename_length))) i (1+ i) ) ) (setq ename_length_list (vl-sort ename_length_list (function (lambda (x1 x2) (< (cadr x1) (cadr x2))))) ename_length_list (vl-remove (last ename_length_list) ename_length_list) total_len (itoa (length ename_length_list)) ) (foreach x ename_length_list (entdel (car x)) ) (prompt (strcat "\nThe total number of deleted lines is " total_len "!")) (princ) ) and you will get something like this (picture 1). Note: you need to select group by group to get only line or polyline with the highest length. Best regards. Edited 1 hour ago by Saxlle Quote
p7q Posted 29 minutes ago Author Posted 29 minutes ago 1 hour ago, Saxlle said: Hi @p7q, If this what you want, you can try with this: (prompt "\nTo run a LISP type: DOL (DeleteOverlappingLines)") (princ) (defun c:DOL ( / ss len i ename_length_list ename ename_length) (setq ss (ssget (list (cons 0 "*LINE"))) len (sslength ss) i 0 ename_length_list (list) ) (while (< i len) (setq ename (ssname ss i) ename_length (getpropertyvalue ename "Length") ename_length_list (append ename_length_list (list (list ename ename_length))) i (1+ i) ) ) (setq ename_length_list (vl-sort ename_length_list (function (lambda (x1 x2) (< (cadr x1) (cadr x2))))) ename_length_list (vl-remove (last ename_length_list) ename_length_list) total_len (itoa (length ename_length_list)) ) (foreach x ename_length_list (entdel (car x)) ) (prompt (strcat "\nThe total number of deleted lines is " total_len "!")) (princ) ) and you will get something like this (picture 1). Note: you need to select group by group to get only line or polyline with the highest length. Best regards. Thanks for the answer ! I tested DOL and it unfortunately doesn’t solve my case. That routine keeps the single longest object from the entire selection, but it doesn’t check whether objects are collinear and overlapping. In my drawings I often have a LINE and a PLINE that lie on the same line with partial overlap; draw order puts the shorter one on top, so OVERKILL keeps the short piece. What I need is: Work with LINE and LWPOLYLINE (straight segments). Group only collinear segments whose projections overlap (within a small tolerance). In each group, keep the longest and delete the shorter overlapping pieces. Do not touch segments that are merely end-to-end (no overlap). Ignore draw order. If anyone has a LISP that does this “overlap-aware, keep-longest” behavior, I’d really appreciate it Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.