I've changed my version a little...
(defun c:overlapchk ( / unique rangenums process ss i bl atts bll blll n a b x r )
(vl-load-com)
(defun unique ( l )
(if l (cons (car l) (unique (vl-remove (car l) l))))
)
(defun rangenums ( str / a b )
(setq a (substr str 1 (vl-string-search "-" str)))
(setq b (substr str (+ (vl-string-search "-" str) 2)))
(list (atoi a) (atoi b))
)
(defun process ( q )
(if q
(progn
(setq a (car (setq n (rangenums (cadr q)))))
(setq b (cadr n))
(setq x (vl-remove-if-not '(lambda ( x / n ) (setq n (rangenums (cadr x))) (or (<= a (car n) b) (<= a (cadr n) b))) (setq blll (vl-remove q blll))))
(if x
(strcat (car q) "+" (process (car x)))
(car q)
)
)
)
)
(prompt "\nSelect attributed blocks...")
(if (setq ss (ssget '((0 . "INSERT") (66 . 1))))
(progn
(repeat (setq i (sslength ss))
(setq bl (ssname ss (setq i (1- i))))
(setq atts (vlax-invoke (setq bl (vlax-ename->vla-object bl)) 'getattributes))
(foreach att atts
(if (= (vla-get-tagstring att) "TERM_TAG")
(setq a (vla-get-textstring att))
)
(if (= (vla-get-tagstring att) "FIBERS_USED")
(setq b (vla-get-textstring att))
)
)
(setq bll (cons (list a b) bll))
)
(setq bll (unique bll))
(foreach bl bll
(setq a (car (setq n (rangenums (cadr bl)))))
(setq b (cadr n))
(setq x (vl-remove-if-not '(lambda ( x / n ) (setq n (rangenums (cadr x))) (or (<= a (car n) b) (<= a (cadr n) b))) (vl-remove bl bll)))
(if x
(foreach q x
(setq blll bll)
(setq blll (vl-remove bl blll))
(setq r (cons (vl-string-right-trim "+" (strcat (car bl) "+" (process q))) r))
)
)
)
(if r
(princ (vl-string-right-trim "," (apply 'strcat (mapcar '(lambda ( x ) (strcat x ",")) r))))
(princ "\nAll OK...")
)
)
)
(princ)
)
This part :
(foreach bl bll
(setq blll bll)
(setq a (car (setq n (rangenums (cadr bl)))))
(setq b (cadr n))
(setq x (vl-remove-if-not '(lambda ( x / n ) (setq n (rangenums (cadr x))) (or (< a (car n) b) (< a (cadr n) b))) (vl-remove bl bll)))
(setq blll (vl-remove bl blll))
(if x
(foreach q x
(setq r (cons (vl-string-right-trim "+" (strcat (car bl) "+" (process q))) r))
)
)
)
Is now :
(foreach bl bll
(setq a (car (setq n (rangenums (cadr bl)))))
(setq b (cadr n))
(setq x (vl-remove-if-not '(lambda ( x / n ) (setq n (rangenums (cadr x))) (or (<= a (car n) b) (<= a (cadr n) b))) (vl-remove bl bll)))
(if x
(foreach q x
(setq blll bll)
(setq blll (vl-remove bl blll))
(setq r (cons (vl-string-right-trim "+" (strcat (car bl) "+" (process q))) r))
)
)
)
And I also changed signs (< a num b) into (<= a num b) in all places...
My output is :
G1+E1,F1+C1,E1+G1,D1+B1+A1+H1,D1+A1+B1,C1+F1,B1+D1+A1+H1,B1+A1+D1,A1+H1,A1+D1+B1,A1+B1+D1
That's with your new DWG...
I see that some things are repeating, but I thought better more than less info...
And BTW. if I was to remove duplicates, then which one is correct (to leave it and remove only wrong ones)???
Marko Ribar, d.i.a. (graduated engineer of architecture)