| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für SOLIDWORKS | | | | PLM TechnologieForum Hannover |
Autor
|
Thema: SWX-API: Größte Modellansicht für DXF-Export auswählen? (925 mal gelesen)
|
CAD-Maler Mitglied Konstrukteur / CAD-Admin / Mädchen für alles
Beiträge: 720 Registriert: 17.01.2007 SWX 2019 SP5 AutoCAD 2019 Win 10 pro 64 bit Intel(R) Xeon(R) CPU E5-1650 v4 @ 3.60GHz 64GB RAM Nvidia Quadro M5000 SWx EPDM
|
erstellt am: 28. Jul. 2017 10:21 <-- editieren / zitieren --> Unities abgeben:
Hallo, wertes WBF ! Ich bastel mir gerade ein VBA-Makro zum Exportieren von DXF-Dateien aus 3D-Modellen (zum späteren Einlesen auf der Laserschneidmaschine) zusammen. Dafür hole ich mir mit folgendem Code die Ansicht mit den größten Abmessungen: Code: Dim varAlignment As Variant Dim dataAlignment(11) As Double Dim varViews As Variant Dim dataViews(0) As String Dim vBoundBox As Variant Dim Lx, Ly, Lz As String dataAlignment(0) = 0# dataAlignment(1) = 0# dataAlignment(2) = 0# dataAlignment(3) = 1# dataAlignment(4) = 0# dataAlignment(5) = 0# dataAlignment(6) = 0# dataAlignment(7) = 1# dataAlignment(8) = 0# dataAlignment(9) = 0# dataAlignment(10) = 0# dataAlignment(11) = 1# varAlignment = dataAlignment 'Ansicht nach max. Größe auswählen vBoundBox = Part.GetPartBox(True) Lx = Str(Abs(vBoundBox(0)) + Abs(vBoundBox(3))) ' Länge x Ly = Str(Abs(vBoundBox(1)) + Abs(vBoundBox(4))) ' Länge y Lz = Str(Abs(vBoundBox(2)) + Abs(vBoundBox(5))) ' Länge z If Lx >= Ly And Lx >= Lz And Ly >= Lz Then dataViews(0) = "*Vorderseite" ElseIf Ly >= Lx And Ly >= Lz And Lx >= Lz Then dataViews(0) = "*Vorderseite" ElseIf Lz >= Lx And Lz >= Ly And Lx >= Ly Then dataViews(0) = "*Oben" Else dataViews(0) = "*Links" End If varViews = dataViews Part.ExportToDWG2 saveFileName, FilePath, swExportToDWG_ExportAnnotationViews, True, varAlignment, False, False, 0, varViews
Das funktioniert bei den meisten Teilen ganz gut. Leider haben wir auch einige (viele ) Teile, bei denen das Koordinatensystem gedreht ist (Alt- oder Fremddaten). Bei denen stimmen natürlich die Ansichten dann nicht mehr, d.h. statt Vorderseite müsste es dann Oben sein usw. Mir fehlt irgendwie der Ansatz, wie ich das Ganze handeln soll. Kann man irgendwie die Orientierung des Koordinatensystems auslesen? Oder vielleicht eine neue benutzerdefinierte Ansicht erzeugen und mit der dann exportieren (würde das überhaupt funktionieren?)? Vielleicht ein ganz anderes Prozedere? Ich bin offen für alle Vorschläge oder Denkanstöße. Danke, Jens ------------------ CSWA, CSWP, CSWPA-SM & -SU =) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Torsten Niemeier Ehrenmitglied V.I.P. h.c. Maschinenbau Ingenieur
Beiträge: 3682 Registriert: 21.06.2001 "ZUSE I.36", 8 BIT, 32 Lämpchen, Service-Ölkännchen "ESSO-Super", Software: AO auf Kuhlmann-Parallelogramm-Plattform ** CSWP 04/2011 ** ** CSWE 08/2011 **
|
erstellt am: 29. Jul. 2017 23:40 <-- editieren / zitieren --> Unities abgeben: Nur für CAD-Maler
Hallo Jens. Ich schlage mal eine nur kleine Abwandlung vor: Mit: ModelView::Orientation3 in Deinen IF-Fallunterscheidungen die Ansicht in die richtige Richtung drehen. Mit: dataViews(0) = "*Current" die aktuelle Ansicht für den Export benutzen. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CAD-Maler Mitglied Konstrukteur / CAD-Admin / Mädchen für alles
Beiträge: 720 Registriert: 17.01.2007 SWX 2019 SP5 AutoCAD 2019 Win 10 pro 64 bit Intel(R) Xeon(R) CPU E5-1650 v4 @ 3.60GHz 64GB RAM Nvidia Quadro M5000 SWx EPDM
|
erstellt am: 10. Aug. 2017 13:40 <-- editieren / zitieren --> Unities abgeben:
Zitat: Original erstellt von Torsten Niemeier: modelView::Orientation3
Danke Torsten, das war der richtige Tipp. Ich musste mich zwar erstmal reintüfteln, wie man das mit der Orientierungsmatrix handhabt, aber jetzt habe ich eine Lösung gefunden. Da ich nur 2 Fälle unterscheiden muss (Standard-SolidWorks-Koordinatensystem (y nach oben, x nach rechts) und unser Maschinenkoordinatensystem (z nach oben, x nach rechts)) reicht es, wenn ich anhand der einzelnen Vorzeichen prüfe, welcher der beiden Fälle eintritt und die Ansichten entsprechend auswähle: Code:
Dim varAlignment As Variant Dim dataAlignment(11) As Double Dim varViews As Variant Dim dataViews(0) As String Dim vBoundBox As Variant Dim swView As IModelView Dim value As MathTransform dataAlignment(0) = 0# dataAlignment(1) = 0# dataAlignment(2) = 0# dataAlignment(3) = 1# dataAlignment(4) = 0# dataAlignment(5) = 0# dataAlignment(6) = 0# dataAlignment(7) = 1# dataAlignment(8) = 0# dataAlignment(9) = 0# dataAlignment(10) = 0# dataAlignment(11) = 1# varAlignment = dataAlignment 'Orientierung des Models auslesen Set swView = Part.GetFirstModelView 'erste Ansicht holen Set value = swView.Orientation3 'Orientierungsmatrix holen ' Debug.Print " Origin = (" & value.ArrayData(9) & "; " & value.ArrayData(10) & "; " & value.ArrayData(11) & ") mm" ' Debug.Print " Rotational sub-matrix 1 = (" & value.ArrayData(0) & "; " & value.ArrayData(1) & "; " & value.ArrayData(2) & ")" ' Debug.Print " Rotational sub-matrix 2 = (" & value.ArrayData(3) & "; " & value.ArrayData(4) & "; " & value.ArrayData(5) & ")" ' Debug.Print " Rotational sub-matrix 3 = (" & value.ArrayData(6) & "; " & value.ArrayData(7) & "; " & value.ArrayData(8) & ")" 'Matrix für alte Teile: ' + - + ' + + + ' - - + 'Matrix für neue Teile: ' + - + ' + + - ' + + + 'Wenn also value.ArrayData(5) negativ ist -> neues Teil vNeuesTeil = IIf(value.ArrayData(5) < 0, True, False) 'Ansicht nach max. Größe auswählen vBoundBox = Part.GetPartBox(False) Lx = Round(Abs(vBoundBox(0)), 1) + Round(Abs(vBoundBox(3)), 1) ' Länge x Ly = Round(Abs(vBoundBox(1)), 1) + Round(Abs(vBoundBox(4)), 1) ' Länge y Lz = Round(Abs(vBoundBox(2)), 1) + Round(Abs(vBoundBox(5)), 1) ' Länge z If vNeuesTeil Then If Lx >= Lz And Lx >= Ly And Lz >= Ly Then dataViews(0) = "*Vorderseite" ElseIf Lz >= Lx And Lz >= Ly And Lx >= Ly Then dataViews(0) = "*Vorderseite" ElseIf Ly >= Lx And Ly >= Lz And Lx >= Lz Then dataViews(0) = "*Oben" Else dataViews(0) = "*Links" End If Else If Lx >= Ly And Lx >= Lz And Ly >= Lz Then dataViews(0) = "*Vorderseite" ElseIf Ly >= Lx And Ly >= Lz And Lx >= Lz Then dataViews(0) = "*Vorderseite" ElseIf Lz >= Lx And Lz >= Ly And Lx >= Ly Then dataViews(0) = "*Oben" Else dataViews(0) = "*Links" End If End If varViews = dataViews Part.ExportToDWG2 saveFileName, FilePath, swExportToDWG_ExportAnnotationViews, True, varAlignment, False, False, 0, varViews
Gruß, Jens ------------------ CSWA, CSWP, CSWPA-SM & -SU =) [Diese Nachricht wurde von CAD-Maler am 10. Aug. 2017 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|