Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  SolidWorks
  Makro läuft leider nicht

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 SOLIDWORKS
  
SOLIDWORKS Webinar-Serie 2020 / 21: Aufzeichnungen zum Nachhören
Autor Thema:  Makro läuft leider nicht (1045 mal gelesen)
Pete85
Mitglied



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

Beiträge: 156
Registriert: 09.05.2016

erstellt am: 23. Jun. 2021 11:21    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

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


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

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 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 Pete85 10 Unities + Antwort hilfreich

Hallo,

du hast nur die Funktion gepostet. Das ist quasi ein Unterprogramm.
Gibt es auch ein Hauptprogramm dazu, wo du diese Funktion aufrufst?

------------------
==========
Gruß
Andreas
==========

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

CAD-Maler
Mitglied
Konstrukteur / CAD-Admin / Mädchen für alles


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

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 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 Pete85 10 Unities + Antwort hilfreich

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


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

Beiträge: 1073
Registriert: 06.05.2002

SWX Premium 2020-Sp5

erstellt am: 25. Jun. 2021 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 Pete85 10 Unities + Antwort hilfreich

Eine Funktion, welche nichts zurück liefert, sollte eher eine Methode sein. Bei Rekursivität sowieso.

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

Pete85
Mitglied



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

Beiträge: 156
Registriert: 09.05.2016

erstellt am: 25. Jun. 2021 11:57    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

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


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

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 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 Pete85 10 Unities + Antwort hilfreich

Versuch mal, die Teile mit

Code:
Set part = swComp.GetModelDoc2

statt OpenDoc6 zu holen. Geladen sind sie ja schon.

https://help.solidworks.com/2012/english/api/sldworksapi/SolidWorks.Interop.sldworks~SolidWorks.Interop.sldworks.IComponent2~GetModelDoc2.html

Da muss vorher aber noch eine Abfrage rein, ob die Komponente nicht reduziert geladen und nicht unterdrückt ist.

Gruß, Jens

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

bk.sc
Ehrenmitglied V.I.P. h.c.
Konstrukteur Sondermaschinenbau



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

Beiträge: 2776
Registriert: 18.07.2012

-Solid Works 2019 SP5
-Pro Engineer WF 3

erstellt am: 28. Jun. 2021 16:57    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 Pete85 10 Unities + Antwort hilfreich

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



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

Beiträge: 156
Registriert: 09.05.2016

erstellt am: 30. Jun. 2021 07:37    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

Hallo zusammen,

mit

Code:

swApp.ActivateDoc part.GetPathName

funktioniert das Programm jetzt :-)

Danke für eure Unterstützung

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)2024 CAD.de | Impressum | Datenschutz