Hallo fmfm,
die Koordianten würde ich über vla-BoundingBox ermitteln.
Die Auswahl der XREF's habe ich in 2 Schritten vorgenommen:
1. BlockTabelle durchlaufen und nach Eigenschaft vla-IsXref abfragen.
2. Mit den gefundenen Block(XREF)Namen wird jeweils ein Auswahlsatz gebildet.
Alles ohne Netz und doppelten Boden, vielleicht selber mal debuggen, dann wird es klarer.
Zum Aufruf entweder "testpick", es wird ein XREF gepickt und eine Diagonale Linie gezeichnet, mit der die Abmessungen dargestellt werden.
Mit der Funktion "testblocklist" wird eine Liste mit Namen und Koordinaten zurückgegeben.
Viel Spaß beim ausprobieren.
Code:
(defun c:testPick ( / KOORDS OBJ VLA-OBJ)
(vl-load-com)
(if (and(Setq obj (car (entsel "\nXref picken:")))
(setq vla-obj(vlax-ename->vla-object obj))
(setq koords (JB_xrefKoords vla-obj)))
(command "_.line" (car koords)(cadr koords))
)
(princ))
(defun c:testBlockList ( / AWS KOORDS N OBJ RETLIST RETLIST1 VLA-OBJ VLA-XREFDEF)
(vl-load-com)
(vlax-for item
(vla-get-blocks
(vla-get-activedocument(vlax-get-acad-object)))
(if(=(vla-get-IsXref item):vlax-true)
(setq RetList (cons Item RetList))))
(mapcar '(lambda(vla-XrefDef)
(if (setq aws (ssget"_X" (list (cons 0 "INSERT")
(cons 2 (vla-get-name vla-XrefDef)))))
(progn
(setq n 0)
(repeat (sslength aws)
(if (setq koords(JB_xrefKoords
(vlax-ename->vla-object(ssname aws n))))
(setq RetList1 (cons(list (vla-get-name vla-XrefDef)
koords)RetList1)))
(setq n (+ n 1)))))
)
RetList)
RetList1)
(defun JB_xrefKoords (vla-obj / LISTE)
(if vla-obj
(if (and(not(vl-catch-all-error-p
(setq liste(vl-catch-all-apply
'JB_xrefKoords:getBoundingBox
(list vla-obj)))))
liste)
(list
(vlax-safearray->list (car liste))
(vlax-safearray->list (cadr liste))))
(alert "Kein gültiges XREF"))
)
(defun JB_xrefKoords:getBoundingBox (vla-obj / p1 p2)
(vla-GetBoundingBox vla-obj 'p1 'p2)
(list p1 p2))
------------------
viele Grüße
Jörn
http://www.bosse-engineering.com
Liniensignaturen Youtube
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP