| |  | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für SOLIDWORKS | | |  | Wie kann Simulation Ihre Produktentwicklung beschleunigen?, ein Webinar am 07.08.2025
|
Autor
|
Thema: SWX-API: Größte Modellansicht für DXF-Export auswählen? (1057 / mal gelesen)
|
CAD-Maler Mitglied Konstrukteur / CAD-Admin / Mädchen für alles
  
 Beiträge: 729 Registriert: 17.01.2007 SWX 2023 SP5 Draftsight 2023 Win 11 Enterprise Intel i7-13700 2.10 GHz 64GB RAM Nvidia RTX A2000 12GB SWx EPDM AP+ CSWE 2018
|
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: 3878 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: 729 Registriert: 17.01.2007 SWX 2023 SP5 Draftsight 2023 Win 11 Enterprise Intel i7-13700 2.10 GHz 64GB RAM Nvidia RTX A2000 12GB SWx EPDM AP+ CSWE 2018
|
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 >>)
 |