| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: VLISP - 3D to 2D - XData (1602 / mal gelesen)
|
silcono Mitglied Planer
Beiträge: 88 Registriert: 19.12.2014 AutoCAD 2010 LT AutoCAD 2014 AutoCAD 2018 AutoCAD MAP 3D 2017 Intel(R) Core(TM) i5-4570 CPU @ 3.20GhZ 3.20Ghz 16,00GB Ram Windows 7- Prof. 64-Bit ASUS EAH6450 Series
|
erstellt am: 14. Aug. 2017 09:15 <-- editieren / zitieren --> Unities abgeben:
Hallöchen CAD-Forumer, folgende Sachlage: Ich bekomme aus AutoCAD MAP 3D 2017 3D-Polylinien geliefert, zur weiteren Bearbeitung müssten diese aber konvertiert werden, hierfür habe ich eine schönes LISP entdeckt (PLINE-3D-2D.LSP von Tony Hotchkiss). Funktioniert einwandfrei. Jetzt möchte ich einen Wert aus den XData der 3D-Polylinie auslesen, in eine Variable packen und diesen Wert, der neu eingebrachten 2D-Polylinie als globale Breite eintragen. Mein Problem: Ich finde die Variable mit dem 3D-Objekt nicht, um dort die XData abzurufen und leider bin ich noch nicht ganz so vertraut mit Visual LISP :P (noch in Arbeit). Code: ;;CADALYST 09/03 AutoLISP Solutions ;;; PLINE-3D-2D.LSP - a program to convert ;;; 3D polylines to 2D ;;; Program by Tony Hotchkiss(defun pline-3d-2d () (vl-load-com) (setq *thisdrawing* (vla-get-activedocument (vlax-get-acad-object) ) ;_ end of vla-get-activedocument *modelspace* (vla-get-ModelSpace *thisdrawing*) ) ;_ end of setq (setq 3d-pl-list (get-3D-pline) ) ;_ end of setq (if 3d-pl-list (progn (setq vert-array-list (make-list 3d-pl-list)) (setq n (- 1)) (repeat (length vert-array-list) (setq vert-array (nth (setq n (1+ n)) vert-array-list)) (setq lyr (vlax-get-property (nth n 3d-pl-list) 'Layer)) (setq obj (vla-AddPolyline *modelspace* vert-array)) (vlax-put-property obj 'Layer lyr) ) ;_ end of repeat (foreach obj 3d-pl-list (vla-delete obj)) ) ;_ end of progn ) ;_ end of if ) ;_ end of pline-3d-2d (defun get-3D-pline ( ) (setq pl3dobj-list nil obj nil 3d "AcDb3dPolyline" ) ;_ end of setq (setq selsets (vla-get-selectionsets *thisdrawing*)) (setq ss1 (vlax-make-variant "ss1")) (if (= (vla-get-count selsets) 0) (setq ssobj (vla-add selsets ss1)) ) ;_ end of if (vla-clear ssobj) (setq Filterdata (vlax-make-variant "POLYLINE")) (setq no-ent 1) (while no-ent (vla-Selectonscreen ssobj) (if (> (vla-get-count ssobj) 0) (progn (setq no-ent nil) (setq i (- 1)) (repeat (vla-get-count ssobj) (setq obj (vla-item ssobj (vlax-make-variant (setq i (1+ i))) ) ;_ end of vla-item ) ;_ end of setq (cond ((= (vlax-get-property obj "ObjectName") 3d) (setq pl3dobj-list (append pl3dobj-list (list obj)) ) ;_ end of setq ) ) ;_ end-of cond ) ;_ end of repeat ) ;_ end of progn (prompt "\nNo entities selected, try again.") ) ;_ end of if (if (and (= nil no-ent) (= nil pl3dobj-list)) (progn (setq no-ent 1) (prompt "\nNo 3D-polylines selected.") (quit) ) ;_ end of progn ) ;_ end of if ) ;_ end of while (vla-delete (vla-item selsets 0)) pl3dobj-list ) ;_ end of get-3D-pline (defun get-3D-pline-old () (setq no-ent 1) (setq filter '((-4 . "<AND") (0 . "POLYLINE") (70 . 8) (-4 . "AND>") ) ) ;_ end of setq (while no-ent (setq ss (ssget filter) k (- 1) pl3dobj-list nil obj nil 3d "AcDb3dPolyline" ) ;_ end-of setq (if ss (progn (setq no-ent nil) (repeat (sslength ss) (setq ent (ssname ss (setq k (1+ k))) obj (vlax-ename->vla-object ent) ) ;_ end-of setq (cond ((= (vlax-get-property obj "ObjectName") 3d) (setq pl3dobj-list (append pl3dobj-list (list obj)) ) ;_ end of setq ) ) ;_ end-of cond ) ;_ end-of repeat ) ;_ end-of progn (prompt "\nNo 3D-polylines selected, try again.") ) ;_ end-of if ) ;_ end-of while pl3dobj-list ) ;_ end of get-3D-pline-old
(defun make-list (p-list) (setq i (- 1) vlist nil calist nil ) ;_ end of setq (repeat (length p-list) (setq obj (nth (setq i (1+ i)) p-list) coords (vlax-get-property obj "coordinates") ca (vlax-variant-value coords) ) ;_ end-of setq (setq calist (append calist (list ca))) ) ;_ end-of repeat ) ;_ end-of make-list (defun c l32 () (pline-3d-2d) (princ) ) ;_ end of pl32 (prompt "Enter PL32 to start: ")
Vielleicht hat jemand einen Tipp für mich Im Voraus besten Dank und einen guten Start in die Woche! Grüße Silcono Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 21533 Registriert: 03.06.2002 Alles
|
erstellt am: 14. Aug. 2017 09:44 <-- editieren / zitieren --> Unities abgeben: Nur für silcono
Ich habe es nur überflogen, aber zum einen enthält der gepostete Code unnötige Bestandteile (die Funktion get-3D-pline-old ist definiert, wird aber nirgends aufgerufen?) und zu deiner Frage: (setq 3d-pl-list (get-3D-pline)) ;_ end of setq liefert eine Liste von vla-Objekten (die gewählten Objekte) ------------------ CAD on demand GmbH - Beratung und Programmierung rund um AutoCAD Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
silcono Mitglied Planer
Beiträge: 88 Registriert: 19.12.2014 AutoCAD 2010 LT AutoCAD 2014 AutoCAD 2018 AutoCAD MAP 3D 2017 Intel(R) Core(TM) i5-4570 CPU @ 3.20GhZ 3.20Ghz 16,00GB Ram Windows 7- Prof. 64-Bit ASUS EAH6450 Series
|
erstellt am: 14. Aug. 2017 10:46 <-- editieren / zitieren --> Unities abgeben:
Da hast du vollkommen recht, die Funktion ist komplett überflüssig Richtig, es wird eine Liste über die Funktion 'get-3D-pline' erstellt. Da dies aber eine Liste ist, kann ich aber nicht die Xdata auslesen. Ich müsste ihm dann wahrscheinlich sagen, von welchem Objekt in der Liste? Ist dies korrekt? Montag...xD Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 21533 Registriert: 03.06.2002 Alles
|
erstellt am: 14. Aug. 2017 11:27 <-- editieren / zitieren --> Unities abgeben: Nur für silcono
Natürlich von allen Objekte - du kannst ja mehrere wählen. Es gibt bereits eine Schleife welche alle Objekte bearbeitet, du mußt darin also nur deinen Part ergänzen. (repeat (length vert-array-list) (setq vert-array (nth (setq n (1+ n)) vert-array-list)) ; holen der Stützpunkte (setq lyr (vlax-get-property (nth n 3d-pl-list) 'Layer)) ; holen des "alten" Layers (setq obj (vla-AddPolyline *modelspace* vert-array)) ; erstellen des neuen Objektes (vlax-put-property obj 'Layer lyr) ; Objektlayer des neuen Objektes ändern ) ;_ end of repeat ------------------ CAD on demand GmbH - Beratung und Programmierung rund um AutoCAD Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
silcono Mitglied Planer
Beiträge: 88 Registriert: 19.12.2014 AutoCAD 2010 LT AutoCAD 2014 AutoCAD 2018 AutoCAD MAP 3D 2017 Intel(R) Core(TM) i5-4570 CPU @ 3.20GhZ 3.20Ghz 16,00GB Ram Windows 7- Prof. 64-Bit ASUS EAH6450 Series
|
erstellt am: 14. Aug. 2017 12:52 <-- editieren / zitieren --> Unities abgeben:
Vorab erstmal vielen Dank cadffm, das hat mir sehr geholfen Das war schon mal der Ansatz, der mir gefehlt hat. Jetzt wollte ich nur mal mit 'princ' schauen, was er mir den so als Xdata raus gibt:
Code: (repeat (length vert-array-list) (setq vert-array (nth (setq n (1+ n)) vert-array-list)) (setq lyr (vlax-get-property (nth n 3d-pl-list) 'Layer)) (setq test (vla-getxdata (nth n 3d-pl-list) appdata 'xtype 'xdata)) (princ test) (setq obj (vla-AddPolyline *modelspace* vert-array)) (vlax-put-property obj 'Layer lyr) ) ;_ end of repeat
Leider nur nil. Aber ich glaube ich bin momentan einwenig auf dem falschem Weg
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 21533 Registriert: 03.06.2002 Alles
|
erstellt am: 14. Aug. 2017 13:02 <-- editieren / zitieren --> Unities abgeben: Nur für silcono
|
silcono Mitglied Planer
Beiträge: 88 Registriert: 19.12.2014 AutoCAD 2010 LT AutoCAD 2014 AutoCAD 2018 AutoCAD MAP 3D 2017 Intel(R) Core(TM) i5-4570 CPU @ 3.20GhZ 3.20Ghz 16,00GB Ram Windows 7- Prof. 64-Bit ASUS EAH6450 Series
|
erstellt am: 14. Aug. 2017 13:03 <-- editieren / zitieren --> Unities abgeben:
|
silcono Mitglied Planer
Beiträge: 88 Registriert: 19.12.2014 AutoCAD 2010 LT AutoCAD 2014 AutoCAD 2018 AutoCAD MAP 3D 2017 Intel(R) Core(TM) i5-4570 CPU @ 3.20GhZ 3.20Ghz 16,00GB Ram Windows 7- Prof. 64-Bit ASUS EAH6450 Series
|
erstellt am: 14. Aug. 2017 15:23 <-- editieren / zitieren --> Unities abgeben:
So, habs geschafft, wenn auch einwenig kompliziert gedacht. Ich denke es gibt auch einen schöneren und sauberen Weg :P Code: (repeat (length vert-array-list) (setq vert-array (nth (setq n (1+ n)) vert-array-list)) (setq lyr (vlax-get-property (nth n 3d-pl-list) 'Layer)) (setq clr (vlax-get-property (nth n 3d-pl-list) 'Color)) (vla-getxdata (nth n 3d-pl-list) appdata 'xtype 'xdata) (vlax-safearray->list xtype) (setq temp (vlax-safearray->list xdata)) (mapcar 'vlax-variant-value temp) (setq xd1 (cddddr temp)) (setq xd2 (cddddr xd1)) (setq xd3 (cddddr xd2)) (setq xd4 (cddddr xd3)) (setq xd5 (cddddr xd4)) (setq xd6 (cddddr xd5)) (setq xd7 (cddddr xd6)) (setq xd8 (caddr xd7)) (setq endx (gc:VariantToLispData xd8)) (setq xd(/ endx 1000.0)) (setq obj (vla-AddPolyline *modelspace* vert-array)) (vlax-put-property obj 'Layer lyr) (vlax-put-property obj 'Color clr) (vla-put-ConstantWidth obj xd) ) ;_ end of repeat
gc:VariantToLispData - Dies hab ich noch im Netz gefunden. Es erleichert einiges. Es wandelt die Variant oder Safearray in einfach Lisp-Daten. Code: (defun gc:VariantToLispData (var) (cond ((= (type var) 'variant) (gc:VariantToLispData (vlax-variant-value var))) ((= (type var) 'safearray) (mapcar 'gc:VariantToLispData (vlax-safearray->list var)) ) (T var) ) )
Vielen Dank nochmal an dich @cadffm! Grüße und schönen Feierabend! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |