| | |
 | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| | |
 | PNY wird von NVIDIA zum Händler des Jahres gewählt - zum dritten Mal in Folge, eine Pressemitteilung
|
|
Autor
|
Thema: vla-TranslateCoordinates (1958 mal gelesen)
|
vlide Mitglied

 Beiträge: 29 Registriert: 10.07.2006 AutoCAD 200x ObjectDCL 3.0
|
erstellt am: 06. Sep. 2006 10:51 <-- editieren / zitieren --> Unities abgeben:         
Hallo, hat jemand eine Ahnung, wie man Koordinaten einer Polylinie aus einem Block in das acWorld bekommt? Mein Versuch mit (vla-TranslateCoordinates vlaPoly acOCS acWorld :vlax-true) ist leider irgendwie gescheitert Schon mal vielen Dank für eure Hilfe!! Wolfgang Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joern bosse Ehrenmitglied Dipl.-Ing. Vermessung und AutoLISPler
    
 Beiträge: 1781 Registriert: 11.10.2004 Window 11 ACAD 2021 CIVIL 2021 BricsCAD ab V14 11th Gen Intel(R) Core(TM) i7-1165G7 @ 2.80GHz 2.80 GHz 32.0GB RAM NVIDIA GeForce MX450<P>
|
erstellt am: 06. Sep. 2006 14:34 <-- editieren / zitieren --> Unities abgeben:          Nur für vlide
Hallo Wolfgang, mit vla-TranslateCoordinates ... habe ich sowas noch nicht probiert, aber Du könntest den Blockdefinition (tblobjname "BLOCK" "Blockname") mit "ENTNEXT" solange durchsuchen, bis Du Deine Polylinien gefunden hast. (Wenn es sich um eine "POLYLINE" handelt, mußst Du mit ENTNEXT noch solange weiter gehen, bis Du an ein SEQEND kommst. Dann kannst Du Dir die Koordinaten der einzelnen Stützpunkte im Blocksystem ermitteln. Wenn Du diese dann mit den Basispunktkoordinaten des Blockes in der Zeichnung addierst hast Du die Weltkoordinaten der Polylinie.  Mmmh, klingt ziemlich umständlich, vielleicht kommen aber noch ein paar sinnvolle Vorschläge. ------------------ viele Grüße Jörn Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
vlide Mitglied

 Beiträge: 29 Registriert: 10.07.2006 AutoCAD 200x ObjectDCL 3.0
|
erstellt am: 06. Sep. 2006 15:01 <-- editieren / zitieren --> Unities abgeben:         
Hallo Jörn, vielen Dank für deine Antwort! Das "Auslesen" der Elemente regel ich so: (defun u:get_xref_data (o / vlaBlock vlaObj lstPolys lstRaumnr strName xRefEP xRefName) (setq vlaBlock (vla-item (vla-get-blocks (vla-get-ActiveDocument (vlax-get-acad-object))) (setq strName (vla-get-name o)))) (if (vlax-property-available-p vlaBlock 'IsXRef) (if (= (vla-get-IsXRef vlaBlock) :vlax-true) (progn (vlax-for vlaObj (vla-get-ModelSpace (vla-get-XRefDatabase vlaBlock)) (if (and (= (vla-get-objectname vlaObj) "AcDbPolyline") (= (vla-get-layer vlaObj) (strcat strName "|Polylinie"))) (setq lstPolys (cons vlaObj lstPolys)) ); if (if (and (= (vla-get-objectname vlaObj) "AcDbBlockReference") (= (vla-get-layer vlaObj) (strcat strName "|Raumnummer"))) (setq lstRaumnr (cons vlaObj lstRaumnr)) ); if (setq xRefEP (safearray-value (variant-value (vla-get-Origin vlaBlock))) xRefName (vla-get-name vlaBlock)) ); vlax-for ); progn ); if ); if (if lstPolys (list (list "XREF" o)(list "RAUMNUMMER" lstRaumnr) (list "POLYLINIE" lstPolys)) ); if ) Was mir jetzt fehlt ist die Umsetzung des OCS in WCS. Da es ja nun auch eine schöne vla-Funktion gibt, möchte ich sie natürlich nutzen. VG Wolfgang Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
       

 Beiträge: 13533 Registriert: 30.11.2003 .
|
erstellt am: 06. Sep. 2006 15:15 <-- editieren / zitieren --> Unities abgeben:          Nur für vlide
Zitat: Original erstellt von joern bosse: Wenn Du diese dann mit den Basispunktkoordinaten des Blockes in der Zeichnung addierst hast Du die Weltkoordinaten der Polylinie.
wenn die Blockreferenz gedreht und/oder skaliert ist, reicht nur addieren aber nicht und zu (vla-TranslateCoordinates vlaPoly acOCS acWorld :vlax-true) ... vla-TranslateCoordinates verlangt als ersten Parameter einen 3D-Punkt kein Polylinienobject. .. ist dafür aber auch ungeeignet ..
der Eigentümer der PL ist der Block , du willst aber bezüglich der Koordinaten der Blockreferenz transformieren -> da bleibt dir nur die Mathematik ------------------ - Thomas - "Bei 99% aller Probleme ist die umfassende Beschreibung des Problems bereits mehr als die Hälfte der Lösung desselben." Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
vlide Mitglied

 Beiträge: 29 Registriert: 10.07.2006 AutoCAD 200x ObjectDCL 3.0
|
erstellt am: 06. Sep. 2006 15:23 <-- editieren / zitieren --> Unities abgeben:         
|
andi2050 Mitglied
 
 Beiträge: 107 Registriert: 11.03.2003
|
erstellt am: 06. Sep. 2006 23:49 <-- editieren / zitieren --> Unities abgeben:          Nur für vlide
Hallo vlide ! Ich denke Du verwechselt OCS (Objektkoordinaten) mit MCS (Modellkoordinaten). Die Koordinaten in der Blockdefinition werden als MCS bezeichnet (kannst Du Dir als eine Art Weltkoordinaten innerhalb der Blockdef. vorstellen, jede Blockdef. hat ihr eigenes WCS). Du musst also die Koordinaten der Pline vom MCS der Blockdef. in WCS umrechnen. Ganz exakt: OCS-Pline -> MCS-Blockdefinition -> WCS (abhängig von der Lage des INSERTS (BlockREFERENZ) OCS->MCS ist kein Problem, geht einfach mit: (trans Punkt (cdr (assoc 210 (entget enamePline)) 0) ... einfache OCS->WCS Transformation, nur daß diese nicht 'echte' Weltkoordinaten zurückgibt, sondern Weltkoordinaten innherhalb der Blockdef. (MCS) Übrigens: vla-TranslateCoordinates ist eigentlich nichts anderes als trans, nur eben vla-... MCS->WCS (Koordinaten aus Block 'herausrechnen') ist aber meist nicht ganz einfach. Dafür benötigst Du die Transformationsmatrix des INSERTS. (trans oder vla-TranslateCoordinates funktioniert hierfür nicht !) Wenn die Matrix bekannt ist, dann lassen sich damit die Punkte leicht aus dem Block herausrechnen. Die Matrix wird normalerweise von nentselp zurückgegeben. Dafür muß aber der Benutzer die Pline anwählen. Wenn die Matrix nicht bekannt ist, muss diese berechnet werden. Das ist aber nicht ganz einfach... Mir ist keine eingebaute LISP-Funktion bekannt, mir der man die Matrix 'zu Fuß' ermitteln kann. Schau mal unter folgendem Link nach: http://acad.fleming-group.com/Download/BIXForm/BIXForm.html Mit diesen Funktionen kannst Du von MCS nach WCS und wieder zurück rechnen. Ich hoffe, daß Dir das weiterhilft.
Grüße Andi [Diese Nachricht wurde von andi2050 am 06. Sep. 2006 editiert.]
[Diese Nachricht wurde von andi2050 am 06. Sep. 2006 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |

| |
vlide Mitglied

 Beiträge: 29 Registriert: 10.07.2006 AutoCAD 200x ObjectDCL 3.0
|
erstellt am: 07. Sep. 2006 09:56 <-- editieren / zitieren --> Unities abgeben:         
|