@smallƑish ,
Check this new version to support mlines.
a few things to be aware of:
1. the mline (pipe) must be of one segment only (not multi segments) and the start + end must be cut straight 90 degree.
make sure two mlines (corner / L shape) are joined exactly 100% 😀
2. always draw the mline at justify = Zero.
3. at select object(s) you can pick as many mlines, than program goes to find match pairs. un match mline is ignored.
4. an mline can be connect at it's both end. if you select odd objects (like 3) there is times the pairs will not be recognized
hance result missing elbow. in this cases, run the command on these two again (yes, it's a bug 😱)
5. in your elbow block, i found the distance from the insertion point to it's edge is 30.7142. do not know how you got this
and if it's not important and you want to make it more pro, change it to 30 fix (or any other fix number).
why i am dealing with that? this is the length the mlines should be trimed after inserting elbow block - yes?!
if you do modify the block, update the new value in the code on line# 107
(setq RETREAT 30.7142) ; const
enjoy
Moshe
(vl-load-com)
(defun c:elbow (/ _geometric _swapVar _pairs _insert_block ; local functions
RETREAT adoc ss data^ pair item0 item1 p0 p1 p2 p3 a0 a1 a2 itm pair elist m0 m1)
(defun _geometric (p / ename)
(mapcar
(function
(lambda (ename)
(append (vl-remove-if-not (function (lambda (e) (= (car e) 11))) (entget ename)) (list ename))
); lambda
); function
(vl-remove-if 'listp (mapcar 'cadr (ssnamex p)))
); mapcar
); _geometric
(defun _swapVar (Qa0 Qa1 / tmp)
(setq tmp (vl-symbol-value Qa0))
(set Qa0 (vl-symbol-value Qa1))
(set Qa1 tmp)
); _swapVar
; return pairs of blocks
(defun _pairs (data^ / dat0 dat1 lst0 lst1 t0 t1 t2 t3 t4)
(foreach dat0 (reverse (cdr (reverse data^)))
(setq lst1 nil)
(setq t0 (cdr (car dat0)))
(setq t1 (cdr (cadr dat0)))
(setq lst1 (vl-some
(function
(lambda (dat1)
(setq t2 (cdr (car dat1)))
(setq t3 (cdr (cadr dat1)))
(if (< (vl-list-length lst1) 2)
(if (setq t4 (inters t0 t1 t2 t3))
(cond
((and
(equal (distance t4 t0) 0.0 1e-3)
(equal (distance t4 t3) 0.0 1e-3)
); and
(_swapVar 't2 't3)
(if (/= (angle t0 t1) (angle t2 t3))
(list dat0 (list (cadr dat1) (car dat1) (caddr dat1)))
)
); case
((and
(equal (distance t4 t1) 0.0 1e-3)
(equal (distance t4 t2) 0.0 1e-3)
); and
(_swapVar 't0 't1)
(if (/= (angle t0 t1) (angle t2 t3))
(list (list (cadr dat0) (car dat0) (caddr dat0)) dat1)
)
); case
((and
(equal (distance t4 t1) 0.0 1e-3)
(equal (distance t4 t3) 0.0 1e-3)
); and
(_swapVar 't0 't1)
(_swapVar 't2 't3)
(if (/= (angle t0 t1) (angle t2 t3))
(list (list (cadr dat0) (car dat0) (caddr dat0)) (list (cadr dat1) (car dat1) (caddr dat1)))
)
); case
); cond
); if
); if
); lambda
); function
(cdr (member dat0 data^))
); vl-some
); setq
(if lst1
(setq lst0 (cons lst1 lst0))
)
); foreach
lst0
); _pairs
(defun _insert_block (bn pt x y z r)
(entmake
(list
'(0 . "insert")
(cons 2 bn)
(cons 10 pt)
(cons 41 x)
(cons 42 y)
(cons 43 z)
(cons 50 r)
)
); entmake
); _insert_block
; here start c:elbow
(setq adoc (vla-get-activedocument (vlax-get-acad-object)))
(vla-startUndoMark adoc)
(setq RETREAT 30.7142) ; const
(cond
((not
(or
(tblsearch "block" "elbow")
(findfile "elbow.dwg")
)
)
(vlr-beep-reaction)
(prompt "\nBlock elbow is not found.")
); case
;| filter mlines of segment, justify = zero |;
((setq ss (ssget '((0 . "mline") (70 . 1) (72 . 2))))
(setq data^ (_geometric ss))
(foreach pair (_pairs data^)
(setq item0 (car pair))
(setq p0 (cdr (car item0)))
(setq p1 (cdr (cadr item0)))
(setq item1 (cadr pair))
(setq p2 (cdr (car item1)))
(setq p3 (cdr (cadr item1)))
(setq a0 (angle p0 p1))
(setq a1 (angle p2 p3))
(if (> a0 a1)
(_swapVar 'a0 'a1)
)
(setq a2 (- a1 a0))
(if (equal a2 (* pi 1.5) 1e-4)
(progn
(setq a0 (+ a0 (* pi 2)))
(setq a2 (- a0 a1))
(_swapVar 'a0 'a1)
); progn
); if
(if (equal a2 (/ pi 2) 1e-4) ; only 90 degrees
(progn
(foreach itm pair
(setq elist (entget (last itm)))
(setq m0 (cdr (assoc '11 elist)))
(setq m1 (cdr (assoc '11 (reverse elist))))
(if (equal (distance p0 m0) 0.0 1e-3)
(entmod (subst (cons '11 (polar m1 (angle m1 m0) (- (distance m1 m0) RETREAT))) (assoc '11 elist) elist))
(entmod (subst (cons '11 (polar m0 (angle m0 m1) (- (distance m0 m1) RETREAT))) (assoc '11 (reverse elist)) elist))
); if
); foreach
(_insert_block "elbow" p0 1 1 1 a1)
); progn
); if
); foreach
); case
); cond
(vla-endUndoMark adoc)
(vlax-release-object adoc)
(princ)
); c:elbow
C