| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für SOLIDWORKS | | | | SOLIDWORKS Webinar-Serie 2020 / 21: Aufzeichnungen zum Nachhören |
Autor
|
Thema: Makro läuft leider nicht (1045 mal gelesen)
|
Pete85 Mitglied
Beiträge: 156 Registriert: 09.05.2016
|
erstellt am: 23. Jun. 2021 11:21 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, ich komm mal wieder nicht weiter, habe mich hier umgesehen und einfach nichts gefunden was bei mir funktioniert... 1. Ich möchte aus einer Baugruppe alle Teile durchgehen (das funktioniert) 2. alle Teile kurz öffnen, werte in die Eigenschaften eintragen über externes Makro. 3. Dann das Teil speichern. Das Programm läuft durch... aber es wird halt nix geöffnet und gespeichert...
Code: Private Function TraverseComponent(Level As Integer, swComp As Object) ' rekursive Routine, die alle Komponenten durchläuft Dim Children As Variant Dim part As SldWorks.ModelDoc2 Dim swApp As SldWorks.SldWorks Dim Child As Object Dim ChildCount As Integer Dim Feature As Object Dim FeatureCreatedBy, comp As String Dim f, t, swcompname As String Dim ret As Boolean Dim fileerror As Long Dim filewarning As Long Dim lWarnings As Long Dim lErrors As Long Dim boolstatus As Variant Set swApp = Application.SldWorks swApp.Visible = True ' Open f = swComp.GetPathName swcompname = swComp.Name2 t = Right(f, 7) swcompname = swcompname & t swApp.Visible = True If t = ".SLDPRT" Then Set part = swApp.OpenDoc6(f, swDocPART, swOpenDocOptions_Silent, "", fileerror, filewarning) ElseIf t = ".SLDASM" Then Set part = swApp.OpenDoc6(f, swDocASSEMBLY, swOpenDocOptions_Silent, "", fileerror, filewarning) ElseIf t = ".SLDDRW" Then Set part = swApp.OpenDoc6(f, swDocDRAWING, swOpenDocOptions_Silent, "", fileerror, filewarning) Else MsgBox "Dateityp sieht so aus: " & t End If Set part = swApp.ActiveDoc If swcompname = Title Then GoTo jump Else boolstatus = swApp.RunMacro(Pfad, Name, "Main") boolstatus = part.Save3(swSaveAsOptions_Silent, lErrors, lWarnings) swApp.CloseDoc swcompname End If jump: boolstatus = swApp.RunMacro(Pfad, Name, "Main") 'stamp = Now & " : " & swComp.Name2 'write_log stamp i = i + 1 comp = swComp.Name2 barr ges ' progressbar logo ProgressBar_Chart ges, comp 'progressbar Useform ' schauen, ob's ein Subassy ist und ggf. über die Kinder rüberschauen Children = swComp.GetChildren ChildCount = UBound(Children) + 1 For j = 0 To (ChildCount - 1) Set Child = Children(j) TraverseComponent Level + 1, Child Next j End Function
Danke schonmal :-) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
ad_man Mitglied freiberuflicher Entwicklungsing. (Fahrzeugtechnik, CSWP, CPPA))
Beiträge: 1366 Registriert: 20.12.2003 SolidWorks 2023 SP5 mit Enterprise PDM , Windows 11, Dell Precision 3660, i7-12700K, 96 GB DDR-Ram, Quadro RTX A4000
|
erstellt am: 24. Jun. 2021 17:29 <-- editieren / zitieren --> Unities abgeben: Nur für Pete85
|
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: 25. Jun. 2021 08:35 <-- editieren / zitieren --> Unities abgeben: Nur für Pete85
Hallo Pete, als Fehlermöglichkeit ist mir nur eines aufgefallen: Wenn eine Komponente z.B. mit .sldprt als Dateiendung gespeichert ist, wird die hier: Code: If t = ".SLDPRT" Then
ignoriert und nichts wird geöffnet. Abhilfe schafft ein einfaches UCase davor: Code: If UCase(t) = ".SLDPRT" Then
Ein paar gut gemeinte, prinzipielle Hinweise: Man sollte generell alle Variablen dimensionieren (der Befehl "Option Explicit" am Anfang ist dafür eine große Hilfe) und vor allem sprechend benennen. Auch eine gewisse Sauberkeit mit Einrückungen und Zwischenzeilen hilft beim Bearbeiten und Debuggen ungemein. Ich hab dir mal meine Kommentare direkt in den Code eingefügt: Code: Private Function TraverseComponent(Level As Integer, swComp As Object) ' rekursive Routine, die alle Komponenten durchläuft Dim Children As Variant Dim part As SldWorks.ModelDoc2 Dim swApp As SldWorks.SldWorks Dim Child As Object Dim ChildCount As Integer Dim Feature As Object Dim FeatureCreatedBy, comp As String Dim f, t, swcompname As String Dim ret As Boolean Dim fileerror As Long Dim filewarning As Long Dim lWarnings As Long Dim lErrors As Long Dim boolstatus As Variant Set swApp = Application.SldWorks swApp.Visible = True ' Open f = swComp.GetPathName '<---- Besser sprechende Variablennamen vergeben, z.B. CompPathName swcompname = swComp.Name2 t = Right(f, 7) '<---- Besser sprechende Variablennamen vergeben, z.B. CompDateiendung swcompname = swcompname & t 'swApp.Visible = True '<---- Doppelt, kann weg If UCase(t) = ".SLDPRT" Then Set part = swApp.OpenDoc6(f, swDocPART, swOpenDocOptions_Silent, "", fileerror, filewarning) ElseIf UCase(t) = ".SLDASM" Then Set part = swApp.OpenDoc6(f, swDocASSEMBLY, swOpenDocOptions_Silent, "", fileerror, filewarning) ElseIf UCase(t) = ".SLDDRW" Then Set part = swApp.OpenDoc6(f, swDocDRAWING, swOpenDocOptions_Silent, "", fileerror, filewarning) Else MsgBox "Dateityp sieht so aus: " & t End '<---- An der Stelle das Makro abbrechen, sonst führt der nächste Befehl zu einem Fehler End If Set part = swApp.ActiveDoc If swcompname = Title Then '<---- Die Variable "Titel" ist hier nirgends definiert GoTo jump Else boolstatus = swApp.RunMacro(Pfad, Name, "Main") boolstatus = part.Save3(swSaveAsOptions_Silent, lErrors, lWarnings) swApp.CloseDoc swcompname 'End function '<---- s.u. End If jump: '<---- Sprungmarken gelten als bad practise. Besser sauber in eine Schleife einfügen. ' Der Code nach einer Sprungmarke wird immer auch ausgeführt, wenn das Makro ' "auf normalen Weg" zu der Stelle kommt. ' Hier z.B. wird das Makro im Fall swcompname <> Title 2 Mal ausgeführt: ' Einmal in der Else-Schleife direkt oberhalb und dann direkt nochmal, wenn ' die Else-Schleife abgeschlossen ist. Es fehlt also evtl. in der Else-Schleife ein ' "End function" (es sei denn, das Ganze soll noch irgendwie anders funktionieren ' dann passt aber noch mehr nicht) boolstatus = swApp.RunMacro(Pfad, Name, "Main") 'stamp = Now & " : " & swComp.Name2 'write_log stamp i = i + 1 '<---- Wofür? comp = swComp.Name2 '<---- Wofür? Ist bereits oben mit swcompname definiert. Lieber die verwenden, ' als noch eine neue Variable einzuführen barr ges ' progressbar logo ProgressBar_Chart ges, comp 'progressbar Useform ' schauen, ob's ein Subassy ist und ggf. über die Kinder rüberschauen Children = swComp.GetChildren ChildCount = UBound(Children) + 1 For j = 0 To (ChildCount - 1) Set Child = Children(j) TraverseComponent Level + 1, Child Next j End Function
Gruß, Jens Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
riesi Mitglied CAD-Admin
Beiträge: 1073 Registriert: 06.05.2002 SWX Premium 2020-Sp5
|
erstellt am: 25. Jun. 2021 09:44 <-- editieren / zitieren --> Unities abgeben: Nur für Pete85
|
Pete85 Mitglied
Beiträge: 156 Registriert: 09.05.2016
|
erstellt am: 25. Jun. 2021 11:57 <-- editieren / zitieren --> Unities abgeben:
Vielen dank für eure Hilfe, ja mit den Variablennamen bin ich ab und an auch sehr Faul... Ich hab deine Ratschläge in den Code eingebaut, Danke dafür. Ich hab jetzt noch das Problem, das die Teile aus der Baugruppe nicht sichtbar geöffnet werden.. ich möchte in der Schleife ein Makro auf die Einzelteile anwenden und abspeichern. Das Makro wird aber immer auf die Hauptbaugruppe angewendet. wie kann ich das ändern? Vielen Dank 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: 28. Jun. 2021 07:42 <-- editieren / zitieren --> Unities abgeben: Nur für Pete85
|
bk.sc Ehrenmitglied V.I.P. h.c. Konstrukteur Sondermaschinenbau
Beiträge: 2776 Registriert: 18.07.2012 -Solid Works 2019 SP5 -Pro Engineer WF 3
|
erstellt am: 28. Jun. 2021 16:57 <-- editieren / zitieren --> Unities abgeben: Nur für Pete85
Hallo Jens, Zitat: Da muss vorher aber noch eine Abfrage rein, ob die Komponente nicht reduziert geladen und nicht unterdrückt ist.
Wenn man seinem anderen Thread folgt kann man davon ausgehen das die Komponenten eben Unterdrückt (Reduziert) ist, daher will er sie seperat öffnen weil GetModelDoc2 nicht funktioniert. Gruß Bernd ------------------ --- Man muß nicht alles wissen, man muß nur wissen wo es steht --- Staatlich anerkannte Deutschniete Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Pete85 Mitglied
Beiträge: 156 Registriert: 09.05.2016
|
erstellt am: 30. Jun. 2021 07:37 <-- editieren / zitieren --> Unities abgeben:
|
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|