Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  Lisp
  VLISP - 3D to 2D - XData

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
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 (1603 / mal gelesen)
silcono
Mitglied
Planer


Sehen Sie sich das Profil von silcono an!   Senden Sie eine Private Message an silcono  Schreiben Sie einen Gästebucheintrag für silcono

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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
良い精神




Sehen Sie sich das Profil von cadffm an!   Senden Sie eine Private Message an cadffm  Schreiben Sie einen Gästebucheintrag für cadffm

Beiträge: 21533
Registriert: 03.06.2002

Alles

erstellt am: 14. Aug. 2017 09:44    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für silcono 10 Unities + Antwort hilfreich

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


Sehen Sie sich das Profil von silcono an!   Senden Sie eine Private Message an silcono  Schreiben Sie einen Gästebucheintrag für silcono

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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
良い精神




Sehen Sie sich das Profil von cadffm an!   Senden Sie eine Private Message an cadffm  Schreiben Sie einen Gästebucheintrag für cadffm

Beiträge: 21533
Registriert: 03.06.2002

Alles

erstellt am: 14. Aug. 2017 11:27    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für silcono 10 Unities + Antwort hilfreich

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


Sehen Sie sich das Profil von silcono an!   Senden Sie eine Private Message an silcono  Schreiben Sie einen Gästebucheintrag für silcono

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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
良い精神




Sehen Sie sich das Profil von cadffm an!   Senden Sie eine Private Message an cadffm  Schreiben Sie einen Gästebucheintrag für cadffm

Beiträge: 21533
Registriert: 03.06.2002

Alles

erstellt am: 14. Aug. 2017 13:02    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für silcono 10 Unities + Antwort hilfreich

(setq test kannst du dir sparen, die Daten hängen an 'xtype 'xdata.
Google nach vla-getXdata, dann bekommst du genügend CodeBeispiele.

------------------
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


Sehen Sie sich das Profil von silcono an!   Senden Sie eine Private Message an silcono  Schreiben Sie einen Gästebucheintrag für silcono

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Danke cadffm,

melde mich, sobald ich es zum Laufen gebracht habe.

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

silcono
Mitglied
Planer


Sehen Sie sich das Profil von silcono an!   Senden Sie eine Private Message an silcono  Schreiben Sie einen Gästebucheintrag für silcono

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz