I have a question :
What is priority : coordinates of attribute input (all 3 - X,Y,Z), or block insertion point.?
If attributes input are first thing to check, in what scenario are you in need to acquire block insertion point.? - haven't understood very clearly -
For me and IMHO - as I can see, all blocks have populated values of X,Y,Z coordinates... I am right that you need to change then both and insertion point of block and corresponding connection LINE end point position according to attribute values.?
Let me try it very simply in fly :
Code:
(defun c:foo-remedy-lines+insert-positions_attdata ( / ss i e x y z p ex bll lil bp p1 p2 lix lst lstt )
(vl-load-com)
(if (setq ss (ssget "_:L" '((0 . "LINE,INSERT"))))
(progn
(repeat (setq i (sslength ss))
(setq e (ssname ss (setq i (1- i))))
(if (= (cdr (assoc 0 (setq ex (entget e)))) "LINE")
(setq lil (cons e lil))
(if
(and
(assoc 66 ex)
(equal (assoc 66 ex) (cons 66 1))
(= (cdr (assoc 2 ex)) "DIAG_CROSS_4")
)
(setq bll (cons e bll))
)
)
)
(foreach bl bll
(setq e bl)
(while (and e (setq e (entnext e)))
(cond
( (= (cdr (assoc 2 (setq ex (entget e)))) "X")
(setq x (cdr (assoc 1 ex)) x (atof x))
)
( (= (cdr (assoc 2 (setq ex (entget e)))) "Y")
(setq y (cdr (assoc 1 ex)) y (atof y))
)
( (= (cdr (assoc 2 (setq ex (entget e)))) "Z")
(setq z (cdr (assoc 1 ex)) z (atof z))
)
( (= (cdr (assoc 0 (setq ex (entget e)))) "SEQEND")
(setq e nil)
)
)
)
(if
(and
x
(numberp x)
y
(numberp y)
z
(numberp z)
)
(setq p (list x y z))
)
(foreach li lil
(if
(and
(setq bp (cdr (assoc 10 (entget bl))))
(setq lix (entget li))
(< (distance bp (setq p1 (cdr (assoc 10 lix)))) (distance bp (setq p2 (cdr (assoc 11 lix)))))
)
(setq lst (cons (list bp p1 li p) lst))
(setq lst (cons (list bp p2 li p) lst))
)
)
(setq lst (vl-sort lst (function (lambda ( a b ) (< (distance (car a) (cadr a)) (distance (car b) (cadr b)))))))
(setq lstt (append lstt (vl-remove-if-not (function (lambda ( x ) (equal (cadr x) (cadar lst) 1e-6))) lst)))
(setq lst nil)
(vla-move
(vlax-ename->vla-object (cdr (assoc -1 (setq ex (entget bl)))))
(vlax-3d-point (cdr (assoc 10 ex)))
(vlax-3d-point p)
)
)
(foreach d lstt
(cond
( (equal (cadr d) (cdr (assoc 10 (setq lix (entget (caddr d))))) 1e-6)
(entupd (cdr (assoc -1 (entmod (subst (cons 10 (cadddr d)) (assoc 10 lix) lix)))))
)
( (equal (cadr d) (cdr (assoc 11 lix)) 1e-6)
(entupd (cdr (assoc -1 (entmod (subst (cons 11 (cadddr d)) (assoc 11 lix) lix)))))
)
)
)
)
)
(princ)
)
Code:
(defun c:foo-remedy-attdata_lines+insert-positions ( / unique ftoa ss i e ex bll lil bp p1 p2 lix lst lstt )
(defun unique ( l )
(if l
(cons
(car l)
(unique
(vl-remove-if
(function (lambda ( x )
(eq (caddr x) (caddar l))
))
(cdr l)
)
)
)
)
)
(defun ftoa ( n / m a s b )
(if (numberp n)
(progn
(setq m (fix ((if (< n 0) - +) n 1e-8)))
(setq a (abs (- n m)))
(setq m (itoa m))
(setq s "")
(while (and (not (equal a 0.0 1e-6)) (setq b (fix (* a 10.0))))
(setq s (strcat s (itoa b)))
(setq a (- (* a 10.0) b))
)
(if (= (type n) 'int)
m
(if (= s "")
m
(if (and (= m "0") (< n 0))
(strcat "-" m "." s)
(strcat m "." s)
)
)
)
)
)
)
(if (setq ss (ssget "_:L" '((0 . "LINE,INSERT"))))
(progn
(repeat (setq i (sslength ss))
(setq e (ssname ss (setq i (1- i))))
(if (= (cdr (assoc 0 (setq ex (entget e)))) "LINE")
(setq lil (cons e lil))
(if
(and
(assoc 66 ex)
(equal (assoc 66 ex) (cons 66 1))
(= (cdr (assoc 2 ex)) "DIAG_CROSS_4")
)
(setq bll (cons e bll))
)
)
)
(foreach bl bll
(foreach li lil
(if
(and
(setq bp (cdr (assoc 10 (entget bl))))
(setq lix (entget li))
(< (distance bp (setq p1 (cdr (assoc 10 lix)))) (distance bp (setq p2 (cdr (assoc 11 lix)))))
)
(setq lst (cons (list bp p1 bl) lst))
(setq lst (cons (list bp p2 bl) lst))
)
)
(setq lst (vl-sort lst (function (lambda ( a b ) (< (distance (car a) (cadr a)) (distance (car b) (cadr b)))))))
(setq lstt (append lstt (vl-remove-if-not (function (lambda ( x ) (equal (cadr x) (cadar lst) 1e-6))) lst)))
(setq lst nil)
)
(foreach d (unique lstt)
(setq e (caddr d))
(while (and e (setq e (entnext e)))
(cond
( (= (cdr (assoc 2 (setq ex (entget e)))) "X")
(entupd (cdr (assoc -1 (entmod (subst (cons 1 (ftoa (caadr d))) (assoc 1 ex) ex)))))
)
( (= (cdr (assoc 2 (setq ex (entget e)))) "Y")
(entupd (cdr (assoc -1 (entmod (subst (cons 1 (ftoa (cadadr d))) (assoc 1 ex) ex)))))
)
( (= (cdr (assoc 2 (setq ex (entget e)))) "Z")
(entupd (cdr (assoc -1 (entmod (subst (cons 1 (ftoa (caddr (cadr d)))) (assoc 1 ex) ex)))))
)
( (= (cdr (assoc 0 (setq ex (entget e)))) "SEQEND")
(setq e nil)
)
)
)
)
)
)
(princ)
)
The codes are tested, but I think you could figure out if something's not as expected...