| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für SOLIDWORKS | | | | HEDELIUS Hausmesse 2024 |
Autor
|
Thema: Makro-Problem mit konfigurationsspezifischen benutzerdefinierten Eigenschaften (2267 mal gelesen)
|
Rotanimret Mitglied
Beiträge: 31 Registriert: 10.12.2021
|
erstellt am: 13. Dez. 2021 10:32 <-- editieren / zitieren --> Unities abgeben:
Ich habe mir ein Makro von Deepak Guptda umgestrickt, damit dateien nur mit Nummer als Name gespeichert werden. Diese Nummer steht in den benutzerdefinierten Eigenschaften und wird im Schriftfeld der Zeichnung und in den Stücklisten benutzt. Bei Konfigurationen wird die zur Konfiguration gehörende Nummer benutzt. Häufiger haben wir so ein Modell mit 2 oder 3 Konfigurationen und dazu dann entsprechend viele Fertigungszeichnungen. Das Makro öffnet von der Zeichnung aus die richtige Konfiguration des Models, speichert sie unter der konfigurationsspezifischen Nummer als Step und schließt das Model wieder. Vorher wird die Zeichnung als PDF mit der konfigurationsspezifischen Nummer gespeichert. Soweit so gut, jetzt das Problem: Fast immer werden die konfigurationsspezifischen Eigenschaften nur für die zusätzlichen Konfigurationen angegeben, nicht aber für die Standard-Konfiguration. Das Makro öffnet zwar auch da das richtige Model in der richtigen Konfiguration, speichert aber nichts, weil in den konfigurationsspezifischen Eigenschaften nichts drin steht für Standard. Da es bei Stücklisten und Schriftfeldern aber funktioniert, muss es ja irgendwie gehen. Ich bin ein noob in Sachen Makros und bastel mir meine Sachen aus Codeschnipseln zusammen, so wird man in diesem Makro auch die entsprechenden Schnipsel wiederfinden. Wie bekomme ich also die Standard-Eigenschaften ausgelesen, wenn für die Konfiguration keine konfigurationsspezifischen Eigenschaften hinterlegt wurden? Code: Dim swApp As SldWorks.SldWorks Dim swModel As SldWorks.ModelDoc2 Dim swDraw As SldWorks.DrawingDoc Dim swView As SldWorks.View Dim Filepath As String Dim FileName As String Dim boolstatus As Boolean Dim longstatus As Long Dim longwarnings As Long Dim swCustPrpMgr As SldWorks.CustomPropertyManager Dim Value As String Dim swModelRef As SldWorks.ModelDoc2 Dim swCustProp As CustomPropertyManagerDim val As String Dim valout As String Dim bool As Boolean Sub main() Set swApp = Application.SldWorks 'Set swModel = swApp.ActiveDoc Set swDraw = swApp.ActiveDoc Set swView = swDraw.GetFirstView Set swView = swView.GetNextView 'erste Ansicht auf der Zeichnung Set swModel = swView.ReferencedDocument 'hier hast du dann den ModelDoc2 pointer von dem referenzierten Teil Set swModelRef = swView.ReferencedDocument swModelRef.ShowConfiguration2 (swView.ReferencedConfiguration) ' Check to see if a drawing is loaded. If (swApp.ActiveDoc Is Nothing) Or (swApp.ActiveDoc.GetType <> swDocDRAWING) Then swApp.SendMsgToUser ("To be used for drawings only, Open a drawing first and then TRY!") ' If no model currently loaded, then exit Exit Sub End If 'Set swDraw = swModel 'Filepath = Left(swDraw.GetPathName, InStrRev(swDraw.GetPathName, "\")) Filepath = "C:\sw-export\" If Dir(Filepath & "PDF", vbDirectory) = "" Then ' Change Sub folder Name here MkDir Filepath + "PDF" ' Change Sub folder Name here End If Filepath = Filepath + "PDF\" ' Change Sub folder Name here Set swConfigMgr = swModelRef.ConfigurationManager Set swConfig = swConfigMgr.ActiveConfiguration Debug.Print "Name of this configuration: " & swConfig.Name Set swCustProp = swConfig.CustomPropertyManager bool = swCustProp.Get4("NR", False, val, valout) 'Set swCustPrpMgr = swModel.Extension.CustomPropertyManager("") ' swCustPrpMgr.Get4 "NR", False, "", Value 'Change here the var revision "Rev." FileName = Mid(swDraw.GetPathName, InStrRev(swDraw.GetPathName, "\") + 1) FileName = "" & val & ".pdf" 'FileName = Left(FileName, Len(FileName) - 7) & "" & Value & ".pdf" swDraw.SaveAs3 Filepath & FileName & "", 0, 0 '-------------------------------------------------- SAVE STEP 'Filepath = Left(swDraw.GetPathName, InStrRev(swDraw.GetPathName, "\")) Filepath = "C:\sw-export\" If Dir(Filepath & "STEP", vbDirectory) = "" Then ' Change Sub folder Name here MkDir Filepath + "STEP" ' Change Sub folder Name here End If Filepath = Filepath + "STEP\" ' Change Sub folder Name here Set part = swApp.ActiveDoc Set myModelView = part.ActiveView myModelView.FrameState = swWindowState_e.swWindowMaximized swApp.ActivateDoc2 "", False, longstatus Set part = swApp.ActiveDoc part.ClearSelection2 True Set myModelView = part.ActiveView myModelView.FrameState = swWindowState_e.swWindowMaximized
FileName = Mid(part.GetPathName, InStrRev(part.GetPathName, "\") + 1) FileName = "" & val & ".step" 'FileName = Left(FileName, Len(FileName) - 7) & "" & Value & ".step" part.SaveAs3 Filepath & FileName & "", 0, 0 Set swPart = Nothing Set part = Nothing swApp.CloseDoc "" Set part = swApp.ActiveDoc swDraw.Save
End Sub
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
deckelmaho Mitglied Konstrukteur
Beiträge: 239 Registriert: 03.03.2020 SolidWorks 2023 SP5 Windows 10 64bit Office 2019
|
erstellt am: 13. Dez. 2021 10:58 <-- editieren / zitieren --> Unities abgeben: Nur für Rotanimret
Hi Rotanimret (terminatoR) Ich denke mit dem Makro ist soweit alles in Ordnung. Wenn ich dich richtig verstanden habe, hast du bei allen Konfigurationen außer bei "Standard" einen Wert für "NR" vergeben. Er zieht also aus der Konfiguration "Standard" einen leeren String (also "") Er versuchst also deine Datei zu speichern, hat aber keinen Namen und kann somit nicht speichern ("".PDF) Am besten fängst du das vorher ab und prüfst ob der Wert leer ist. Wenn du möchtest das er trotzdem etwas speichert, kannst du ihm ja eine Alternative geben Sowas wie... Code:
If Trim(val) = "" then val = swConfig.Name
Ich hab es jetzt nicht im VBA getestet. If val leer ist oder nur aus Leerzeichen besteht then setze den Konfigurationsnamen stattdessen ein. Dann sollte es funktionieren. LG Kevin
------------------ HOMEPAGE | SWXTools.de - SWXHelper für SOLIDWORKS KONTAKT | support@swxtools.de FACEBOOK | facebook.com/SWXHelper TWITTER | twitter.com/SWXTools Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Rotanimret Mitglied
Beiträge: 31 Registriert: 10.12.2021
|
erstellt am: 13. Dez. 2021 11:56 <-- editieren / zitieren --> Unities abgeben:
Danke Kevin, so in der Art habe ich mir das auch gedacht, nur eben nicht zu Ende, weil ich weder VBA noch die SW-spezifischen Variablen und Konstanten nur sehr rudimentär durchblicke. Vorhandenen code anpassen und ändern ist im Moment noch ganz was anderes, als selbst etwas zu schreiben. edit: ich habe es so versucht:
Code: Debug.Print "Name of this configuration: " & swConfig.Name Set swCustProp = swConfig.CustomPropertyManagerbool = swCustProp.Get4("NR", False, val, valout) If Trim(val) = "" Then val = swConfig.Standard
aber das gibt mir einen Fehler "Objekt unterstützt diese Eigenschaft oder Methode nicht" [Diese Nachricht wurde von Rotanimret am 13. Dez. 2021 editiert.] 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: 13. Dez. 2021 13:21 <-- editieren / zitieren --> Unities abgeben: Nur für Rotanimret
|
deckelmaho Mitglied Konstrukteur
Beiträge: 239 Registriert: 03.03.2020 SolidWorks 2023 SP5 Windows 10 64bit Office 2019
|
erstellt am: 13. Dez. 2021 13:33 <-- editieren / zitieren --> Unities abgeben: Nur für Rotanimret
|
Rotanimret Mitglied
Beiträge: 31 Registriert: 10.12.2021
|
erstellt am: 13. Dez. 2021 15:38 <-- editieren / zitieren --> Unities abgeben:
|
deckelmaho Mitglied Konstrukteur
Beiträge: 239 Registriert: 03.03.2020 SolidWorks 2023 SP5 Windows 10 64bit Office 2019
|
erstellt am: 13. Dez. 2021 17:02 <-- editieren / zitieren --> Unities abgeben: Nur für Rotanimret
Kontrollier mal ob du wirklich eine Eigenschaft vergeben hast. Ich bin jetzt nicht mehr am PC und kann es selbst schlecht testen. Ansonsten kannst du, statt dich darauf zu verlassen das er die richtigen Properties abgreift, auch die Methode verwenden die aktuell auskommentiert ist. Verwende statt
Code:
Set swCustProp = swConfig.CustomPropertyManager
Einfach
Code:
Set swCustPrp = swModel.Extension.CustomPropertyManager(swConfig.Name)
dann spricht du direkt die konfigurationsspezifischen Eigenschaften der jeweiligen Konfiguration an. Edit: Und kontrollier auch das der Eigenschaftname richtig geschrieben ist. Denn im Makro fragst du "NR" ab und in deinem Post sprichst du von "Nr". Ein solcher Tippfehler passiert schnell wenn man die Eigenschaften von Hand erzeugt. LG Kevin
------------------ HOMEPAGE | SWXTools.de - SWXHelper für SOLIDWORKS KONTAKT | support@swxtools.de FACEBOOK | facebook.com/SWXHelper TWITTER | twitter.com/SWXTools [Diese Nachricht wurde von deckelmaho am 13. Dez. 2021 editiert.] [Diese Nachricht wurde von deckelmaho am 13. Dez. 2021 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Rotanimret Mitglied
Beiträge: 31 Registriert: 10.12.2021
|
erstellt am: 13. Dez. 2021 17:11 <-- editieren / zitieren --> Unities abgeben:
ich habs mal so versucht: Code: bool = swCustProp.Get4("NR", False, val, valout) '------------- If Trim(val) = "" Then Set swCustPrp = swModel.Extension.CustomPropertyManager(swConfig.Name) bool = swCustProp.Get4("NR", False, val, valout) End If
Damit ist es aber wieder wie vorher, es wird alles richtig aufgerufen, aber nichts gespeichert. Nur nochmal zur Erklärung: Wenn ich die Nummer bei den konfigurationsspezifischen Eigenschaften für die Konfiguration "Standard" eintrage, dann funktioniert es. Das Problem ist, dass die Nummer in den "normalen" Benutzerdefinierten Eigenschaften steht, nicht aber in den konfigurationsspezifischen. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
deckelmaho Mitglied Konstrukteur
Beiträge: 239 Registriert: 03.03.2020 SolidWorks 2023 SP5 Windows 10 64bit Office 2019
|
erstellt am: 13. Dez. 2021 17:22 <-- editieren / zitieren --> Unities abgeben: Nur für Rotanimret
|
deckelmaho Mitglied Konstrukteur
Beiträge: 239 Registriert: 03.03.2020 SolidWorks 2023 SP5 Windows 10 64bit Office 2019
|
erstellt am: 13. Dez. 2021 17:38 <-- editieren / zitieren --> Unities abgeben: Nur für Rotanimret
Ich bin jetzt am PC und kann vielleicht noch etwas aktiver helfen Zitat:
Bei Konfigurationen wird die zur Konfiguration gehörende Nummer benutzt.Häufiger haben wir so ein Modell mit 2 oder 3 Konfigurationen und dazu dann entsprechend viele Fertigungszeichnungen. Das Makro öffnet von der Zeichnung aus die richtige Konfiguration des Models, speichert sie unter der konfigurationsspezifischen Nummer als Step und schließt das Model wieder. Vorher wird die Zeichnung als PDF mit der konfigurationsspezifischen Nummer gespeichert.
wenn die Nummer konfigurationsspezifisch sein soll, dann kannst du sie nur unter der den konfigurationsspezifischen Eigenschaften speichern. Bei Konfiguration "Standard" muss ebenfalls einen konfigurationsspezifische Eigenschaft gesetzt werden.
------------------ HOMEPAGE | SWXTools.de - SWXHelper für SOLIDWORKS KONTAKT | support@swxtools.de FACEBOOK | facebook.com/SWXHelper TWITTER | twitter.com/SWXTools Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Rotanimret Mitglied
Beiträge: 31 Registriert: 10.12.2021
|
erstellt am: 16. Dez. 2021 10:55 <-- editieren / zitieren --> Unities abgeben:
Sorry für die Verzögerung, ich musste für eine Inbetriebnahme mal eben nach Bayern... aaalso, ja, es funktioniert, wenn für Standard konfigurationsspezifische Eigenschaften angegeben werden. Es muss aber auch gehen, wenn dort nichts steht und dann die benutzerdefinierten Eigenschaften genommen werden. bei Stücklisten und Schriftfeldern funktioniert es auch so. Es müsste so sein, dass geprüft wird, ob für Standard konfigurationsspezifische Eigenschaften vorhanden sind, und wenn nicht, die benutzerdefinierten genommen werden. Und wenn da auch nichts ist, müsste eine Meldung kommen, aber das mit der Meldung kriege ich wohl auch selbst hin. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
deckelmaho Mitglied Konstrukteur
Beiträge: 239 Registriert: 03.03.2020 SolidWorks 2023 SP5 Windows 10 64bit Office 2019
|
erstellt am: 16. Dez. 2021 11:27 <-- editieren / zitieren --> Unities abgeben: Nur für Rotanimret
|
deckelmaho Mitglied Konstrukteur
Beiträge: 239 Registriert: 03.03.2020 SolidWorks 2023 SP5 Windows 10 64bit Office 2019
|
erstellt am: 16. Dez. 2021 18:10 <-- editieren / zitieren --> Unities abgeben: Nur für Rotanimret
Hier der überarbeitete Code, den Pfad musst du dir wahrscheinlich nochmal anpassen. Ich hoffe es funktioniert und ich habe die Funktion nicht falsch verstanden. LG Kevin
Code:
Dim swApp As SldWorks.SldWorks Dim swModel As SldWorks.ModelDoc2 Dim swDraw As SldWorks.DrawingDoc Dim swView As SldWorks.View Dim swModelRef As SldWorks.ModelDoc2 Dim swswConfigMgr As SldWorks.ConfigurationManager Dim swConfig As SldWorks.Configuration Dim swCustPrpMgr As SldWorks.CustomPropertyManagerDim val As String Dim valout As String Dim Filepath As String Dim boolstatus As Boolean Sub main() 'Die SOLIDWORKS Instanz holen Set swApp = Application.SldWorks 'Das aktive Dokument laden (kann erstmal alles sein (Teil, Baugruppe, Zeichnung) Set swModel = swApp.ActiveDoc 'Das aktive Dokument als Zeichnung übergeben Set swDraw = swModel '################################################ 'Hier kannst du den Pfad editieren '################################################ ' 'Filepath = "C:\sw-export\" Filepath = Left(swDraw.GetPathName, InStrRev(swDraw.GetPathName, "\")) ' '################################################
'Wenn nichts geöffnet ist (Teil, Baugruppe oder Zeichnung), dann Fehler und beenden If swModel Is Nothing Or (swApp.ActiveDoc.GetType <> swDocDRAWING) Then swApp.SendMsgToUser ("Es wurde kein aktives Dokument gefunden") Exit Sub End If
'Wenn das aktuelle Dokument keine Zeichnung ist, dann Fehler und beenden If swModel.GetType <> swDocDRAWING Then swApp.SendMsgToUser ("Das aktuelle Dokument ist keinen Zeichnung") Exit Sub End If
'Die erste Ansicht des aktuellen Blattes holen (Ist das Blatt selbst)... Set swView = swDraw.GetFirstView '... also eins weiter um die erste Ansicht des Teils zu bekommen Set swView = swView.GetNextView
'Nun holen wir das Modell aus der Ansicht (es kann eine Baugruppe oder ein Teil sein) Set swModelRef = swView.ReferencedDocument 'und schalten auf die gleiche Konfiguration wie in der Zeichnung swModelRef.ShowConfiguration2 (swView.ReferencedConfiguration)
'Wir ziehen uns den ConfigurationsManager des Modells... Set swConfigMgr = swModelRef.ConfigurationManager '... und daraus die aktuell aktive Konfiguration Set swConfig = swConfigMgr.ActiveConfiguration Debug.Print "Name der aktiven Konfiguration " & swConfig.Name
'Wir holen uns die konfigurationsspezifischen Eigenschaften... Set swCustPrpMgr = swModelRef.Extension.CustomPropertyManager(swConfig.Name) 'konfigurationsspezifischen Eigenschaft auslesen boolstatus = swCustPrpMgr.Get4("NR", False, val, valout)
'Wenn in den konfigurationsspezifischen Eigenschaften ein Wert für "NR" gefunden wurde, dann... If Trim(val) = "" Then '... die benutzerdefinierten Eigenschaften holen Set swCustPrpMgr = swModelRef.Extension.CustomPropertyManager("") 'benutzerdefinierte Eigenschaft auslesen boolstatus = swCustPrpMgr.Get4("NR", False, val, valout) End If
'Wenn der Wert immernoch leer ist, dann Fehler und raus If Trim(val) = "" Then swApp.SendMsgToUser ("Es wurde keine Eigenschaft mit diesem Namen gefunden" & vbCrLf & "Das Makro wird beendet") Exit Sub End If
'############################### 'Zeichnung speichern als PDF '###############################
'Prüfen ob am Zielpfad der Ordner PDF existiert, ansonsten einen Ordner erzeugen If Dir(Filepath & "PDF", vbDirectory) = "" Then MkDir Filepath & "PDF" End If 'Nun die Zeichnung mit der der Nummer als Namen speichern boolstatus = swDraw.SaveAs3(Filepath & "PDF\" & val & ".pdf", 0, 0) '############################### 'Modell speichern als STEP '###############################
'Prüfen ob am Zielpfad der Ordner STEP existiert, ansonsten einen Ordner erzeugen If Dir(Filepath & "STEP", vbDirectory) = "" Then MkDir Filepath + "STEP" End If 'Nun das Teil mit der Nummer als Namen speichern boolstatus = swModelRef.SaveAs3(Filepath & "STEP\" & val & ".STEP", 0, 0) End Sub
------------------ HOMEPAGE | SWXTools.de - SWXHelper für SOLIDWORKS KONTAKT | support@swxtools.de FACEBOOK | facebook.com/SWXHelper TWITTER | twitter.com/SWXTools Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Rotanimret Mitglied
Beiträge: 31 Registriert: 10.12.2021
|
erstellt am: 17. Dez. 2021 11:31 <-- editieren / zitieren --> Unities abgeben:
|
deckelmaho Mitglied Konstrukteur
Beiträge: 239 Registriert: 03.03.2020 SolidWorks 2023 SP5 Windows 10 64bit Office 2019
|
erstellt am: 17. Dez. 2021 12:52 <-- editieren / zitieren --> Unities abgeben: Nur für Rotanimret
|
Rotanimret Mitglied
Beiträge: 31 Registriert: 10.12.2021
|
erstellt am: 21. Dez. 2021 13:43 <-- editieren / zitieren --> Unities abgeben:
Ich hab da noch eine Frage zu einem Erweiterungswunsch eines Kollegen: Wenn ich neben "Nr" auch "Benennung" auslesen will, wobei auch "Benennung" konfigurationsspezifisch oder benutzerdefiniert in den Eigenschaften abgelegt sein kann, wie geht das am geschicktesten? Meist ist es bei uns so, dass die Nr konfigurationsspezifisch angegeben wird, die Benennung aber nicht. Da der Teufel aber ein Eichhörnchen ist, kann es auch mal anders sein. Die Abfrage müsste also sein: gibt es "Nr" konfigurationsspezifisch? Falls ja, nimm die, falls nein, nimm aus benutzerdefiniert, so wie es jetzt wunderbar funktioniert. Das gleiche müsste für "Benennung" passieren und dann im Datei-Namen mit "_" hintereinander geschrieben werden. Ich hänge bei der doppelten Abfrage. Es ist kein Problem, wenn immer beide Eigenschaften zusammen konfigurationsspezifisch oder benutzerdefiniert sind, aber wie fragt man geschickt beide ab und führt sie danach wieder zusammen? 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: 21. Dez. 2021 14:00 <-- editieren / zitieren --> Unities abgeben: Nur für Rotanimret
Zitat: Original erstellt von Rotanimret:
Die Abfrage müsste also sein: gibt es "Nr" konfigurationsspezifisch?
zum Beispiel so:
Code:
Set swCustPrpMgr = swModelRef.Extension.CustomPropertyManager(swConfig.Name) 'konfigurationsspezifischen Eigenschaft auslesen boolstatus = swCustPrpMgr.Get4("NR", False, val, valout) If boolstatus = false then Set swCustPrpMgr = swModelRef.Extension.CustomPropertyManager("") Status = swCustPrpMgr.Get4("NR", False, val, valout) End If
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Rotanimret Mitglied
Beiträge: 31 Registriert: 10.12.2021
|
erstellt am: 21. Dez. 2021 14:34 <-- editieren / zitieren --> Unities abgeben:
Ja genau, für eine Abfrage funktioniert das Makro auch wunderbar, aber was ist mit 2 Abfragen? Kann man das elegant in einem Zug abfragen, oder muss man mehrere verschachteln? Oder fragt man nacheinander ab und fügt sie dann zusammen? Oder ganz anders? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Rotanimret Mitglied
Beiträge: 31 Registriert: 10.12.2021
|
erstellt am: 22. Dez. 2021 12:08 <-- editieren / zitieren --> Unities abgeben:
ich habe das erstmal selbst hinbekommen, ob es so der eleganteste weg ist, weiß ich nicht, aber es funktioniert: Code: Dim swApp As SldWorks.SldWorks Dim swModel As SldWorks.ModelDoc2 Dim swDraw As SldWorks.DrawingDoc Dim swView As SldWorks.View Dim swModelRef As SldWorks.ModelDoc2 Dim swswConfigMgr As SldWorks.ConfigurationManager Dim swConfig As SldWorks.Configuration Dim swCustPrpMgr As SldWorks.CustomPropertyManager Dim val1 As String Dim valout1 As String Dim val2 As String Dim valout2 As StringDim Filepath As String Dim boolstatus As Boolean Sub main() 'Die SOLIDWORKS Instanz holen Set swApp = Application.SldWorks 'Das aktive Dokument laden (kann erstmal alles sein (Teil, Baugruppe, Zeichnung) Set swModel = swApp.ActiveDoc 'Das aktive Dokument als Zeichnung übergeben Set swDraw = swModel '################################################ 'Hier kannst du den Pfad editieren '################################################ ' Filepath = "C:\sw-export\" 'Filepath = Left(swDraw.GetPathName, InStrRev(swDraw.GetPathName, "\")) ' '################################################
'Wenn nichts geöffnet ist (Teil, Baugruppe oder Zeichnung), dann Fehler und beenden If swModel Is Nothing Or (swApp.ActiveDoc.GetType <> swDocDRAWING) Then swApp.SendMsgToUser ("Es wurde kein aktives Dokument gefunden") Exit Sub End If
'Wenn das aktuelle Dokument keine Zeichnung ist, dann Fehler und beenden If swModel.GetType <> swDocDRAWING Then swApp.SendMsgToUser ("Das aktuelle Dokument ist keinen Zeichnung") Exit Sub End If
'Die erste Ansicht des aktuellen Blattes holen (Ist das Blatt selbst)... Set swView = swDraw.GetFirstView '... also eins weiter um die erste Ansicht des Teils zu bekommen Set swView = swView.GetNextView
'Nun holen wir das Modell aus der Ansicht (es kann eine Baugruppe oder ein Teil sein) Set swModelRef = swView.ReferencedDocument 'und schalten auf die gleiche Konfiguration wie in der Zeichnung swModelRef.ShowConfiguration2 (swView.ReferencedConfiguration)
'Wir ziehen uns den ConfigurationsManager des Modells... Set swConfigMgr = swModelRef.ConfigurationManager '... und daraus die aktuell aktive Konfiguration Set swConfig = swConfigMgr.ActiveConfiguration Debug.Print "Name der aktiven Konfiguration " & swConfig.Name
'Wir holen uns die konfigurationsspezifischen Eigenschaften... Set swCustPrpMgr = swModelRef.Extension.CustomPropertyManager(swConfig.Name) 'konfigurationsspezifischen Eigenschaft auslesen boolstatus = swCustPrpMgr.Get4("NR", False, val1, valout1)
'Wenn in den konfigurationsspezifischen Eigenschaften kein Wert für "NR" gefunden wurde, dann... If Trim(val1) = "" Then '... die benutzerdefinierten Eigenschaften holen Set swCustPrpMgr = swModelRef.Extension.CustomPropertyManager("") 'benutzerdefinierte Eigenschaft auslesen boolstatus = swCustPrpMgr.Get4("NR", False, val1, valout1) End If
'Wenn der Wert immernoch leer ist, dann Fehler und raus If Trim(val1) = "" Then swApp.SendMsgToUser ("Es wurde keine Eigenschaft -Nr- gefunden" & vbCrLf & "Das Makro wird beendet") Exit Sub End If
'konfigurationsspezifischen Eigenschaft auslesen boolstatus = swCustPrpMgr.Get4("Benennung", False, val2, valout2) 'Wenn in den konfigurationsspezifischen Eigenschaften kein Wert für "Benennung" gefunden wurde, dann... If Trim(val2) = "" Then '... die benutzerdefinierten Eigenschaften holen Set swCustPrpMgr = swModelRef.Extension.CustomPropertyManager("") 'benutzerdefinierte Eigenschaft auslesen boolstatus = swCustPrpMgr.Get4("Benennung", False, val2, valout2) End If
'Wenn der Wert immernoch leer ist, dann Fehler und raus If Trim(val1) = "" Then swApp.SendMsgToUser ("Es wurde keine Eigenschaft -Benennung- gefunden" & vbCrLf & "Das Makro wird beendet") Exit Sub End If
'############################### 'Zeichnung speichern als PDF '############################### 'Prüfen ob am Zielpfad der Ordner PDF existiert, ansonsten einen Ordner erzeugen If Dir(Filepath & "PDF", vbDirectory) = "" Then MkDir Filepath & "PDF" End If 'Nun die Zeichnung mit der der Nummer_Benennung_Datum als Namen speichern boolstatus = swDraw.SaveAs3(Filepath & "PDF\" & val1 & "_" & val2 & "_" & (Format(Date, "yyyy-mm-dd")) & ".pdf", 0, 0) '############################### 'Modell speichern als STEP '###############################
'Prüfen ob am Zielpfad der Ordner STEP existiert, ansonsten einen Ordner erzeugen If Dir(Filepath & "STEP", vbDirectory) = "" Then MkDir Filepath + "STEP" End If 'Nun das Teil mit der Nummer_Benennung_Datum als Namen speichern boolstatus = swModelRef.SaveAs3(Filepath & "STEP\" & val1 & "_" & val2 & "_" & (Format(Date, "yyyy-mm-dd")) & ".STEP", 0, 0) End Sub
ein kleines Problem habe ich noch gefunden: Selten habe ich Teile, die abgeleitet sind, z.B. gespiegelt, und wo sich die benutzerdefinierten Eigenschaften auf das Mutter-Teil beziehen, dazu das Bild im Anhang. Da wirft das Makro dann den Fehler aus, dass keine Eigenschaften vorhanden sind. Müsste man von daher auf den evaluierten Wert gehen? [Diese Nachricht wurde von Rotanimret am 22. Dez. 2021 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
deckelmaho Mitglied Konstrukteur
Beiträge: 239 Registriert: 03.03.2020 SolidWorks 2023 SP5 Windows 10 64bit Office 2019
|
erstellt am: 22. Dez. 2021 13:25 <-- editieren / zitieren --> Unities abgeben: Nur für Rotanimret
Statt val1 und val2 abzufragen kannst du auch valout1 und valout2 abfragen. das sind die evaluierten Werte. Und Achtung, du wolltest das selbe anscheinend mit der Eigenschaft "Benennung" machen, dabei fragst du jedoch beide Male nur die benutzerdefinierten Eigenschaften ab. Da kannst du in der Konfiguration schreiben was du willst, er wird es nicht finden. EDIT: Ok, stimmt nicht ganz, wenn er den ersten Wert in der Konfiguration gefunden hat, bleibt der swCustPrpMgr auf der Konfiguration stehen. Also ganz prozesssicher ist das ganze noch nicht
------------------ HOMEPAGE | SWXTools.de - SWXHelper für SOLIDWORKS KONTAKT | support@swxtools.de FACEBOOK | facebook.com/SWXHelper TWITTER | twitter.com/SWXTools [Diese Nachricht wurde von deckelmaho am 22. Dez. 2021 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Rotanimret Mitglied
Beiträge: 31 Registriert: 10.12.2021
|
erstellt am: 22. Dez. 2021 15:56 <-- editieren / zitieren --> Unities abgeben:
Vielen Dank für die Hinweise Ich habe jetzt nach der Abfrage der Nummer das Ziehen des ConfigurationManagers wiederholt. Scheint genauso zu funktionieren. Ich habe diverse kombinationen von benutzerdefinierten und konfigurationsspezifischen Eigenschaften getestet und noch keinen Fehler in der Ausgabe gefunden. Ist es denn so besser, und sollte man das eigentlich anders machen? Code: Dim swApp As SldWorks.SldWorks Dim swModel As SldWorks.ModelDoc2 Dim swDraw As SldWorks.DrawingDoc Dim swView As SldWorks.View Dim swModelRef As SldWorks.ModelDoc2 Dim swswConfigMgr As SldWorks.ConfigurationManager Dim swConfig As SldWorks.Configuration Dim swCustPrpMgr As SldWorks.CustomPropertyManager Dim val1 As String Dim valout1 As String Dim val2 As String Dim valout2 As StringDim Filepath As String Dim boolstatus As Boolean Sub main() 'Die SOLIDWORKS Instanz holen Set swApp = Application.SldWorks 'Das aktive Dokument laden (kann erstmal alles sein (Teil, Baugruppe, Zeichnung) Set swModel = swApp.ActiveDoc 'Das aktive Dokument als Zeichnung übergeben Set swDraw = swModel '################################################ 'Hier kannst du den Pfad editieren '################################################ ' Filepath = "C:\sw-export\" 'Filepath = Left(swDraw.GetPathName, InStrRev(swDraw.GetPathName, "\")) ' '################################################
'Wenn nichts geöffnet ist (Teil, Baugruppe oder Zeichnung), dann Fehler und beenden If swModel Is Nothing Or (swApp.ActiveDoc.GetType <> swDocDRAWING) Then swApp.SendMsgToUser ("Es wurde kein aktives Dokument gefunden") Exit Sub End If
'Wenn das aktuelle Dokument keine Zeichnung ist, dann Fehler und beenden If swModel.GetType <> swDocDRAWING Then swApp.SendMsgToUser ("Das aktuelle Dokument ist keinen Zeichnung") Exit Sub End If
'Die erste Ansicht des aktuellen Blattes holen (Ist das Blatt selbst)... Set swView = swDraw.GetFirstView '... also eins weiter um die erste Ansicht des Teils zu bekommen Set swView = swView.GetNextView
'Nun holen wir das Modell aus der Ansicht (es kann eine Baugruppe oder ein Teil sein) Set swModelRef = swView.ReferencedDocument 'und schalten auf die gleiche Konfiguration wie in der Zeichnung swModelRef.ShowConfiguration2 (swView.ReferencedConfiguration)
'Wir ziehen uns den ConfigurationsManager des Modells... Set swConfigMgr = swModelRef.ConfigurationManager '... und daraus die aktuell aktive Konfiguration Set swConfig = swConfigMgr.ActiveConfiguration Debug.Print "Name der aktiven Konfiguration " & swConfig.Name
'Wir holen uns die konfigurationsspezifischen Eigenschaften... Set swCustPrpMgr = swModelRef.Extension.CustomPropertyManager(swConfig.Name) 'konfigurationsspezifischen Eigenschaft auslesen boolstatus = swCustPrpMgr.Get4("NR", False, val1, valout1)
'Wenn in den konfigurationsspezifischen Eigenschaften kein Wert für "NR" gefunden wurde, dann... If Trim(val1) = "" Then '... die benutzerdefinierten Eigenschaften holen Set swCustPrpMgr = swModelRef.Extension.CustomPropertyManager("") 'benutzerdefinierte Eigenschaft auslesen boolstatus = swCustPrpMgr.Get4("NR", False, val1, valout1) End If
'Wenn der Wert immernoch leer ist, dann Fehler und raus If Trim(val1) = "" Then swApp.SendMsgToUser ("Es wurde keine Eigenschaft -Nr- gefunden" & vbCrLf & "Das Makro wird beendet") Exit Sub End If
'Das ganze nochmal für die Benennung 'Wir ziehen uns den ConfigurationsManager des Modells für die Benennung... Set swConfigMgr = swModelRef.ConfigurationManager '... und daraus die aktuell aktive Konfiguration Set swConfig = swConfigMgr.ActiveConfiguration Debug.Print "Name der aktiven Konfiguration " & swConfig.Name 'Wir holen uns die konfigurationsspezifischen Eigenschaften... Set swCustPrpMgr = swModelRef.Extension.CustomPropertyManager(swConfig.Name) 'konfigurationsspezifischen Eigenschaft auslesen boolstatus = swCustPrpMgr.Get4("Benennung", False, val2, valout2)
'Wenn in den konfigurationsspezifischen Eigenschaften kein Wert für "Benennung" gefunden wurde, dann... If Trim(val2) = "" Then '... die benutzerdefinierten Eigenschaften holen Set swCustPrpMgr = swModelRef.Extension.CustomPropertyManager("") 'benutzerdefinierte Eigenschaft auslesen boolstatus = swCustPrpMgr.Get4("Benennung", False, val2, valout2) End If
'Wenn der Wert immernoch leer ist, dann Fehler und raus If Trim(val1) = "" Then swApp.SendMsgToUser ("Es wurde keine Eigenschaft -Benennung- gefunden" & vbCrLf & "Das Makro wird beendet") Exit Sub End If
'############################### 'Zeichnung speichern als PDF '############################### 'Prüfen ob am Zielpfad der Ordner PDF existiert, ansonsten einen Ordner erzeugen If Dir(Filepath & "PDF", vbDirectory) = "" Then MkDir Filepath & "PDF" End If 'Nun die Zeichnung mit der der Nummer als Namen speichern boolstatus = swDraw.SaveAs3(Filepath & "PDF\" & valout1 & "_" & valout2 & "_" & (Format(Date, "yyyy-mm-dd")) & ".pdf", 0, 0) '############################### 'Modell speichern als STEP '###############################
'Prüfen ob am Zielpfad der Ordner STEP existiert, ansonsten einen Ordner erzeugen If Dir(Filepath & "STEP", vbDirectory) = "" Then MkDir Filepath + "STEP" End If 'Nun das Teil mit der Nummer als Namen speichern boolstatus = swModelRef.SaveAs3(Filepath & "STEP\" & valout1 & "_" & valout2 & "_" & (Format(Date, "yyyy-mm-dd")) & ".STEP", 0, 0) End Sub
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
deckelmaho Mitglied Konstrukteur
Beiträge: 239 Registriert: 03.03.2020 SolidWorks 2023 SP5 Windows 10 64bit Office 2019
|
erstellt am: 23. Dez. 2021 07:52 <-- editieren / zitieren --> Unities abgeben: Nur für Rotanimret
Sieht doch gut aus, so ist es auf jeden Fall "richtiger" und beugt ungewolltes Verhalten vor. Das Einzige was ich vielleicht noch ändern würde, wären die If-Abfragen val1 -> valout1 Code: If Trim(val1) = "" Then '... die benutzerdefinierten Eigenschaften holen Set swCustPrpMgr = swModelRef.Extension.CustomPropertyManager("") 'benutzerdefinierte Eigenschaft auslesen boolstatus = swCustPrpMgr.Get4("NR", False, val1, valout1) End If
Dort werden noch die Werte aus der "Wert / Textausdruck" Spalte abgefragt. Es wird in deinem Fall keinen Unterschied machen, denn wenn es keinen evaluierten Wert gibt, dann gibt es auch keinen "Wert / Textausdruck" und anders herum. LG Kevin ------------------ HOMEPAGE | SWXTools.de - SWXHelper für SOLIDWORKS KONTAKT | support@swxtools.de FACEBOOK | facebook.com/SWXHelper TWITTER | twitter.com/SWXTools Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Rotanimret Mitglied
Beiträge: 31 Registriert: 10.12.2021
|
erstellt am: 04. Jan. 2022 09:14 <-- editieren / zitieren --> Unities abgeben:
Vielen Dank, und frohes neues Jahr Einen Fehler hab ich noch gefunden: Die letzte If-Abfrage fragt val1 ab, müsste aber wohl val2 abfragen. Und ja, das mit val1 -> valout1 verstehe ich, macht hier aber wirklich keinen Unterschied. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Rotanimret Mitglied
Beiträge: 31 Registriert: 10.12.2021
|
erstellt am: 12. Jan. 2022 11:29 <-- editieren / zitieren --> Unities abgeben:
Ich habe tatsächlich Bauteile, bei denen das Makro nicht funktioniert. Benennung und Nr sind vorhanden, die pdf- und step-ordner werden angelegt, aber es wird nichts gespeichert und es gibt keine Fehlermeldung. Kann ich das Makro schritt für schritt ausführen, oder wie kann ich den Fehler sonst eingrenzen? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
deckelmaho Mitglied Konstrukteur
Beiträge: 239 Registriert: 03.03.2020 SolidWorks 2023 SP5 Windows 10 64bit Office 2019
|
erstellt am: 12. Jan. 2022 11:39 <-- editieren / zitieren --> Unities abgeben: Nur für Rotanimret
|
Rotanimret Mitglied
Beiträge: 31 Registriert: 10.12.2021
|
erstellt am: 12. Jan. 2022 16:33 <-- editieren / zitieren --> Unities abgeben:
Zitat: Original erstellt von deckelmaho:
[b]EDIT: Und da du den Dateinamen aus den Variablen bildest, sollten dort auch nur Zeichen verwendet werden die auch in Dateinamen zulässig sind. Also kein Späße wie: \ / : * ? " < > | [/B]
Da liegt der Hase im Pfeffer, es war ein "/" im Namen, danke für den Hinweis! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
deckelmaho Mitglied Konstrukteur
Beiträge: 239 Registriert: 03.03.2020 SolidWorks 2023 SP5 Windows 10 64bit Office 2019
|
erstellt am: 12. Jan. 2022 16:44 <-- editieren / zitieren --> Unities abgeben: Nur für Rotanimret
|
Rotanimret Mitglied
Beiträge: 31 Registriert: 10.12.2021
|
erstellt am: 17. Jan. 2022 12:09 <-- editieren / zitieren --> Unities abgeben:
|
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: 18. Jan. 2022 15:24 <-- editieren / zitieren --> Unities abgeben: Nur für Rotanimret
Zitat: Original erstellt von Rotanimret: Das mache ich, sobald Zeit da ist (das übliche Problem).Muss das mit dem TestText da rein, oder ist das nur, um einmalig zu sehen, ob es funktioniert?
Hallo Rotanimret, in deinem Fall musst du "sTestText" natürlich durch val1 bzw. val2 ersetzten, weil aus diesen Werten wird ja dein Dateinamen gebildet. In dem Code-Schnipsel dient die "sTestText" Variable nur zum testen der Prüfung. 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 |
deckelmaho Mitglied Konstrukteur
Beiträge: 239 Registriert: 03.03.2020 SolidWorks 2023 SP5 Windows 10 64bit Office 2019
|
erstellt am: 18. Jan. 2022 15:26 <-- editieren / zitieren --> Unities abgeben: Nur für Rotanimret
|
Rotanimret Mitglied
Beiträge: 31 Registriert: 10.12.2021
|
erstellt am: 26. Sep. 2022 13:17 <-- editieren / zitieren --> Unities abgeben:
Ich bin ja noch das komplette Makro schuldig. Ich hab die Abfrage nach ungültigen Zeichen noch eingebaut und Step auf 214 wegen Farben festgelegt. Nochmals vielen Dank für Eure Hilfe, das Makro wird auch wirklich benutzt! Code: Dim swApp As SldWorks.SldWorks Dim swModel As SldWorks.ModelDoc2 Dim swDraw As SldWorks.DrawingDoc Dim swView As SldWorks.View Dim swModelRef As SldWorks.ModelDoc2 Dim swswConfigMgr As SldWorks.ConfigurationManager Dim swConfig As SldWorks.Configuration Dim swCustPrpMgr As SldWorks.CustomPropertyManager Dim val1 As String Dim valout1 As String Dim val2 As String Dim valout2 As String Dim WrongChar As String Dim i As Long Dim Filepath As String Dim boolstatus As BooleanSub main() 'Die SOLIDWORKS Instanz holen Set swApp = Application.SldWorks 'Step auf v2.14 setzen, damit farben ausgegeben werden Step = swApp.SetUserPreferenceIntegerValue(swStepAP, 214) 'Das aktive Dokument laden (kann erstmal alles sein (Teil, Baugruppe, Zeichnung) Set swModel = swApp.ActiveDoc 'Das aktive Dokument als Zeichnung übergeben Set swDraw = swModel '################################################ 'Hier kannst du den Pfad editieren '################################################ ' Filepath = "C:\sw-export\" 'Filepath = Left(swDraw.GetPathName, InStrRev(swDraw.GetPathName, "\")) ' '################################################
'Unerlaubte Zeichen WrongChar = "<>?:|*\/" & Chr(34) 'für Dateinamen und kleiner 219 Zeichen 'Wenn nichts geöffnet ist (Teil, Baugruppe oder Zeichnung), dann Fehler und beenden If swModel Is Nothing Or (swApp.ActiveDoc.GetType <> swDocDRAWING) Then swApp.SendMsgToUser ("Es wurde kein aktives Dokument gefunden") Exit Sub End If 'Wenn das aktuelle Dokument keine Zeichnung ist, dann Fehler und beenden If swModel.GetType <> swDocDRAWING Then swApp.SendMsgToUser ("Das aktuelle Dokument ist keinen Zeichnung") Exit Sub End If
'Die erste Ansicht des aktuellen Blattes holen (Ist das Blatt selbst)... Set swView = swDraw.GetFirstView '... also eins weiter um die erste Ansicht des Teils zu bekommen Set swView = swView.GetNextView
'Nun holen wir das Modell aus der Ansicht (es kann eine Baugruppe oder ein Teil sein) Set swModelRef = swView.ReferencedDocument 'und schalten auf die gleiche Konfiguration wie in der Zeichnung swModelRef.ShowConfiguration2 (swView.ReferencedConfiguration)
'Wir ziehen uns den ConfigurationsManager des Modells... Set swConfigMgr = swModelRef.ConfigurationManager '... und daraus die aktuell aktive Konfiguration Set swConfig = swConfigMgr.ActiveConfiguration Debug.Print "Name der aktiven Konfiguration " & swConfig.Name
'Wir holen uns die konfigurationsspezifischen Eigenschaften... Set swCustPrpMgr = swModelRef.Extension.CustomPropertyManager(swConfig.Name) 'konfigurationsspezifischen Eigenschaft auslesen boolstatus = swCustPrpMgr.Get4("NR", False, val1, valout1)
'Wenn in den konfigurationsspezifischen Eigenschaften kein Wert für "NR" gefunden wurde, dann... If Trim(val1) = "" Then '... die benutzerdefinierten Eigenschaften holen Set swCustPrpMgr = swModelRef.Extension.CustomPropertyManager("") 'benutzerdefinierte Eigenschaft auslesen boolstatus = swCustPrpMgr.Get4("NR", False, val1, valout1) End If
'Wenn der Wert immernoch leer ist, dann Fehler und raus If Trim(val1) = "" Then swApp.SendMsgToUser ("Es wurde keine Eigenschaft -Nr- gefunden" & vbCrLf & "Das Makro wird beendet") Exit Sub End If
'Das ganze nochmal für die Benennung 'Wir ziehen uns den ConfigurationsManager des Modells für die Benennung... Set swConfigMgr = swModelRef.ConfigurationManager '... und daraus die aktuell aktive Konfiguration Set swConfig = swConfigMgr.ActiveConfiguration Debug.Print "Name der aktiven Konfiguration " & swConfig.Name 'Wir holen uns die konfigurationsspezifischen Eigenschaften... Set swCustPrpMgr = swModelRef.Extension.CustomPropertyManager(swConfig.Name) 'konfigurationsspezifischen Eigenschaft auslesen boolstatus = swCustPrpMgr.Get4("Benennung", False, val2, valout2)
'Wenn in den konfigurationsspezifischen Eigenschaften kein Wert für "Benennung" gefunden wurde, dann... If Trim(val2) = "" Then '... die benutzerdefinierten Eigenschaften holen Set swCustPrpMgr = swModelRef.Extension.CustomPropertyManager("") 'benutzerdefinierte Eigenschaft auslesen boolstatus = swCustPrpMgr.Get4("Benennung", False, val2, valout2) End If 'Wenn der Wert immernoch leer ist, dann Fehler und raus If Trim(val2) = "" Then swApp.SendMsgToUser ("Es wurde keine Eigenschaft -Benennung- gefunden" & vbCrLf & "Das Makro wird beendet") Exit Sub End If
'Prüfen auf ungültige Zeichen For i = 1 To Len(WrongChar) If InStr(valout2, Mid(WrongChar, i, 1)) Then MsgBox ("Ungültiges Zeichen in -Benennung- enthalten."), vbInformation, "Hinweis" Exit For Exit Sub End If If InStr(valout1, Mid(WrongChar, i, 1)) Then MsgBox ("Ungültiges Zeichen in -NR- enthalten."), vbInformation, "Hinweis" Exit For Exit Sub End If Next i
'############################### 'Zeichnung speichern als PDF '############################### 'Prüfen ob am Zielpfad der Ordner PDF existiert, ansonsten einen Ordner erzeugen If Dir(Filepath & "PDF", vbDirectory) = "" Then MkDir Filepath & "PDF" End If
'Nun die Zeichnung mit der der Nummer als Namen speichern boolstatus = swDraw.SaveAs3(Filepath & "PDF\" & valout1 & "_" & valout2 & "_" & (Format(Date, "yyyy-mm-dd")) & ".pdf", 0, 0) '############################### 'Modell speichern als STEP '###############################
'Prüfen ob am Zielpfad der Ordner STEP existiert, ansonsten einen Ordner erzeugen If Dir(Filepath & "STEP", vbDirectory) = "" Then MkDir Filepath + "STEP" End If 'Nun das Teil mit der Nummer als Namen speichern boolstatus = swModelRef.SaveAs3(Filepath & "STEP\" & valout1 & "_" & valout2 & "_" & (Format(Date, "yyyy-mm-dd")) & ".STEP", 0, 0) End Sub
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
deckelmaho Mitglied Konstrukteur
Beiträge: 239 Registriert: 03.03.2020 SolidWorks 2023 SP5 Windows 10 64bit Office 2019
|
erstellt am: 29. Sep. 2022 09:23 <-- editieren / zitieren --> Unities abgeben: Nur für Rotanimret
|
Rotanimret Mitglied
Beiträge: 31 Registriert: 10.12.2021
|
erstellt am: 10. Mrz. 2023 14:10 <-- editieren / zitieren --> Unities abgeben:
Ich muss nochmal was fragen zum Makro: Ein Kollege setzt manchmal bei der Zeichnungsnummer ein Leerzeichen an den Anfang, das Vom Makro im Dateinamen auch so mit ausgegeben wird. Kann man Leerzeichen am Anfang (und am liebsten auch am Ende) über das Makro entfernen?
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
HenryV Mitglied Konstrukteur, Engineering
Beiträge: 813 Registriert: 18.05.2005 SolidWorks 2022 x64 SP5.0 Dell Precision 5820 Intel Xeon W-2125 4x4GHz NVIDIA Quadro P2000 5GB 32GB RAM 2x Dell U2412M, 24" TFT Windows 10 Enterprise x64 22H2 Microsoft 365 E5 Microsoft Visual Studio Enterprise 2022
|
erstellt am: 10. Mrz. 2023 15:16 <-- editieren / zitieren --> Unities abgeben: Nur für Rotanimret
|
Rotanimret Mitglied
Beiträge: 31 Registriert: 10.12.2021
|
erstellt am: 10. Mrz. 2023 15:25 <-- editieren / zitieren --> Unities abgeben:
|
Rotanimret Mitglied
Beiträge: 31 Registriert: 10.12.2021
|
erstellt am: 14. Mrz. 2023 13:21 <-- editieren / zitieren --> Unities abgeben:
Hier nochmal die aktuelle Version. Zusätzlich zum "Trim" hab ich noch 2 kleine Fehler entfernt, die ein sauberes Aussteigen verhindert haben, wenn das Makro nicht aus einer Zeichnung gestartet wurde. Code:
Dim swApp As SldWorks.SldWorks Dim swModel As SldWorks.ModelDoc2 Dim swDraw As SldWorks.DrawingDoc Dim swView As SldWorks.View Dim swModelRef As SldWorks.ModelDoc2 Dim swswConfigMgr As SldWorks.ConfigurationManager Dim swConfig As SldWorks.Configuration Dim swCustPrpMgr As SldWorks.CustomPropertyManager Dim val1 As String Dim valout1 As String Dim val2 As String Dim valout2 As String Dim WrongChar As String Dim i As Long Dim Filepath As String Dim boolstatus As BooleanSub main() 'Die SOLIDWORKS Instanz holen Set swApp = Application.SldWorks 'Step auf v2.14 setzen, damit farben ausgegeben werden Step = swApp.SetUserPreferenceIntegerValue(swStepAP, 214) 'Das aktive Dokument laden (kann erstmal alles sein (Teil, Baugruppe, Zeichnung) Set swModel = swApp.ActiveDoc '################################################ 'Hier kannst du den Pfad editieren '################################################ ' Filepath = "C:\sw-export\" 'Filepath = Left(swDraw.GetPathName, InStrRev(swDraw.GetPathName, "\")) ' '################################################
'Unerlaubte Zeichen WrongChar = "<>?:|*\/" & Chr(34) 'für Dateinamen und kleiner 219 Zeichen 'Wenn nichts geöffnet ist (Teil, Baugruppe oder Zeichnung), dann Fehler und beenden If swModel Is Nothing Then swApp.SendMsgToUser ("Es wurde kein aktives Dokument gefunden") Exit Sub End If 'Wenn das aktuelle Dokument keine Zeichnung ist, dann Fehler und beenden If swModel.GetType <> swDocDRAWING Then swApp.SendMsgToUser ("Das aktuelle Dokument ist keinen Zeichnung") Exit Sub End If
'Das aktive Dokument als Zeichnung übergeben Set swDraw = swModel 'Die erste Ansicht des aktuellen Blattes holen (Ist das Blatt selbst)... Set swView = swDraw.GetFirstView '... also eins weiter um die erste Ansicht des Teils zu bekommen Set swView = swView.GetNextView 'Nun holen wir das Modell aus der Ansicht (es kann eine Baugruppe oder ein Teil sein) Set swModelRef = swView.ReferencedDocument 'und schalten auf die gleiche Konfiguration wie in der Zeichnung swModelRef.ShowConfiguration2 (swView.ReferencedConfiguration)
'Wir ziehen uns den ConfigurationsManager des Modells... Set swConfigMgr = swModelRef.ConfigurationManager '... und daraus die aktuell aktive Konfiguration Set swConfig = swConfigMgr.ActiveConfiguration Debug.Print "Name der aktiven Konfiguration " & swConfig.Name
'Wir holen uns die konfigurationsspezifischen Eigenschaften... Set swCustPrpMgr = swModelRef.Extension.CustomPropertyManager(swConfig.Name) 'konfigurationsspezifischen Eigenschaft auslesen boolstatus = swCustPrpMgr.Get4("NR", False, val1, valout1)
'Wenn in den konfigurationsspezifischen Eigenschaften kein Wert für "NR" gefunden wurde, dann... If Trim(val1) = "" Then '... die benutzerdefinierten Eigenschaften holen Set swCustPrpMgr = swModelRef.Extension.CustomPropertyManager("") 'benutzerdefinierte Eigenschaft auslesen boolstatus = swCustPrpMgr.Get4("NR", False, val1, valout1) End If
'Wenn der Wert immernoch leer ist, dann Fehler und raus If Trim(val1) = "" Then swApp.SendMsgToUser ("Es wurde keine Eigenschaft -Nr- gefunden" & vbCrLf & "Das Makro wird beendet") Exit Sub End If
'Das ganze nochmal für die Benennung 'Wir ziehen uns den ConfigurationsManager des Modells für die Benennung... Set swConfigMgr = swModelRef.ConfigurationManager '... und daraus die aktuell aktive Konfiguration Set swConfig = swConfigMgr.ActiveConfiguration Debug.Print "Name der aktiven Konfiguration " & swConfig.Name 'Wir holen uns die konfigurationsspezifischen Eigenschaften... Set swCustPrpMgr = swModelRef.Extension.CustomPropertyManager(swConfig.Name) 'konfigurationsspezifischen Eigenschaft auslesen boolstatus = swCustPrpMgr.Get4("Benennung", False, val2, valout2)
'Wenn in den konfigurationsspezifischen Eigenschaften kein Wert für "Benennung" gefunden wurde, dann... If Trim(val2) = "" Then '... die benutzerdefinierten Eigenschaften holen Set swCustPrpMgr = swModelRef.Extension.CustomPropertyManager("") 'benutzerdefinierte Eigenschaft auslesen boolstatus = swCustPrpMgr.Get4("Benennung", False, val2, valout2) End If 'Wenn der Wert immernoch leer ist, dann Fehler und raus If Trim(val2) = "" Then swApp.SendMsgToUser ("Es wurde keine Eigenschaft -Benennung- gefunden" & vbCrLf & "Das Makro wird beendet") Exit Sub End If
'Prüfen auf ungültige Zeichen For i = 1 To Len(WrongChar) If InStr(valout2, Mid(WrongChar, i, 1)) Then MsgBox ("Ungültiges Zeichen in -Benennung- enthalten."), vbInformation, "Hinweis" Exit For Exit Sub End If If InStr(valout1, Mid(WrongChar, i, 1)) Then MsgBox ("Ungültiges Zeichen in -NR- enthalten."), vbInformation, "Hinweis" Exit For Exit Sub End If Next i
'############################### 'Zeichnung speichern als PDF '############################### 'Prüfen ob am Zielpfad der Ordner PDF existiert, ansonsten einen Ordner erzeugen If Dir(Filepath & "PDF", vbDirectory) = "" Then MkDir Filepath & "PDF" End If
'Nun die Zeichnung mit der der Nummer als Namen speichern boolstatus = swDraw.SaveAs3(Filepath & "PDF\" & Trim(valout1) & "_" & Trim(valout2) & "_" & (Format(Date, "yyyy-mm-dd")) & ".pdf", 0, 0) '############################### 'Modell speichern als STEP '###############################
'Prüfen ob am Zielpfad der Ordner STEP existiert, ansonsten einen Ordner erzeugen If Dir(Filepath & "STEP", vbDirectory) = "" Then MkDir Filepath + "STEP" End If 'Nun das Teil mit der Nummer als Namen speichern boolstatus = swModelRef.SaveAs3(Filepath & "STEP\" & Trim(valout1) & "_" & Trim(valout2) & "_" & (Format(Date, "yyyy-mm-dd")) & ".STEP", 0, 0) End Sub
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|