| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für SOLIDWORKS | | | | Baugruppen-Handling mit 3DEXPERIENCE SOLIDWORKS |
Autor
|
Thema: Makro Falsche Konfiguration wird gewählt (980 / mal gelesen)
|
Thor16 Mitglied Konstrukteur
Beiträge: 82 Registriert: 27.08.2019 SolidWorks 2022 Windows 10 x64
|
erstellt am: 01. Okt. 2021 07:36 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, ich bin gerade dabei ein Makro zu erstellen, mit dem allen Bauteilen einer Baugruppe ein neues Material zugewiesen wird. Dies funktioniert so weit auch ganz gut. Allerdings habe ich das Problem, dass bei unseren Normteilen teilweise die falsche Konfiguration angewählt wird. Zum Beispiel ist eine Unterlegscheibe in der Baugruppe mit Konfiguration "DIN EN ISO 7089 - 20" verbaut. Das Material wird aber bei der Konfiguration "DIN EN ISO 7089 - 22" eingetragen. Bei einer anderen Baugruppe wo das gleiche Normteil verbaut wurde funktioniert es aber ohne Problem. Die Normteile sind bei uns "normale" Bauteile mit entsprechenden Konfigurationen und keine Toolbox Teile. Die Konfiguration "DIN EN ISO 7089 - 22" ist die Konfiguration, mit welcher die Vorlagedatei gespeichert wurde. Der Code zu diesem Bereich des Makros lautet:
Code: Dim Part2 As ModelDoc2 Dim swPart As SldWorks.PartDoc Dim sPartName As String Dim sMatName As String Dim sMatDB As String Set Part2 = swApp.OpenDoc6(Dateipfad(x) & Dateiname(x), swDocPART, 0, "", longstatus, longwarnings) ' versuchen ein Teil zu öffnen swPart = Part2 DoEvents sPartName = swPart.GetPathName ' Name und Pfad des ausgewählten Bauteils Set swPartKonfig = Part2.GetActiveConfiguration ' Konfiguration des Bauteils auslesen sMatName = Part2.GetMaterialPropertyName2("Default", sMatDB) ' Materialname auslesen Debug.Print "File o = " & Part2.GetPathName ' Kontrollpunkt Pfad mit Name Debug.Print " Material = " & sMatName & " (" & sMatDB & ")" ' Kontrollpunkt Material mit Materialdatenbank sPartName = Mid(Part2.GetPathName, InStrRev(Part2.GetPathName, "\") + 1, Len(Part2.GetPathName)) ' Dateiname ohne Pfad mit Extender sPartName = VBA.Left(sPartName, Len(sPartName) - 7) ' Dateiname ohne Extender Debug.Print " Dateiname = " + sPartName ' Kontrollpunkt MatNew.CoBsMatName = sMatName ' Material in Auswahlfenster schreiben MatNew.CoBsMatDB = sMatDB ' Materialdatenbank in Auswahlfenster schreiben MatNew.txtsPartName = sPartName ' Bauteilname in Auswahlfenster schreiben MatNew.Show ' Auswahlfenster für die Materialeingabe öffnen While MatNew.Visible DoEvents Wend sMatName = MatNew.CoBsMatName ' Material aus dem Auswahlfenster auslesen sMatDB = MatNew.CoBsMatDB ' Materialdatenbank aus dem Auswahlfenster auslesen swPart.SetMaterialPropertyName2 swPartKonfig.Name, sMatDB, sMatName ' Material in Bauteil einfügen
Kann mir vielleicht jemand sagen, warum manchmal die falsche Konfiguration ausgewählt wird? Viele Grüße Torsten 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
|
erstellt am: 01. Okt. 2021 09:19 <-- editieren / zitieren --> Unities abgeben: Nur für Thor16
Hallo Torsten, bei deinem Makro wird das Material in die Konfiguration eingetragen, die beim Speichern des Teils aktiv war. Wenn du eine spezielle Konfiguration haben möchtest, musst du diese zuerst aktivieren. Sprich du liest den verwendeten Konfig-Name aus der Baugruppenkomponente aus und aktivierst diese dann, nachdem du das entsprechende Teil geöffnet hast. Dann kannst du das Material zuweisen. ------------------ ========== Gruß Andreas ========== Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Thor16 Mitglied Konstrukteur
Beiträge: 82 Registriert: 27.08.2019 SolidWorks 2022 Windows 10 x64
|
erstellt am: 01. Okt. 2021 09:41 <-- editieren / zitieren --> Unities abgeben:
Hallo Andreas, vielen Dank für deine Antwort. Ich dachte mit folgendem Code hole ich mir die derzeit aktive Konfiguration des Bauteiles in der Baugruppe. Code: Set swPartKonfig = Part2.GetActiveConfiguration ' Konfiguration des Bauteils auslesen
Wenn das nicht so ist kannst du mir da vielleicht sagen, was ich verwenden muss? Ich hatte auch schon einmal Test-halber die Normteile in der Baugruppe geöffnet und mit der richtigen Konfiguration gespeichert. Das Problem blieb allerdings weiter bestehen. Bei der Unterlegscheibe wurde trotzdem eine andere Konfiguration erkannt. Ich möchte ungern, im Makro, von Hand eine Konfiguration eintragen. Die Normteile ändern sich in unserer Baugruppe abhängig von der Konfiguration der Baugruppe. In dem Beispiel ist die Baugruppe ein Mannloch, welches es in unterschiedlichen Größen gibt. Je nach Größe werden unterschiedlich große Schrauben, Muttern und Scheiben verwendet. Viele Grüße Torsten 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
|
erstellt am: 01. Okt. 2021 10:03 <-- editieren / zitieren --> Unities abgeben: Nur für Thor16
|
Christian_W Ehrenmitglied V.I.P. h.c. Konstrukteur (Dipl-Ing)
Beiträge: 3189 Registriert: 04.04.2001 CSWP 12/2015<P>SWX2021sp5 Win10/11 (SWX2016, SWX2012) proAlpha6.2e00/calinkV9 (Tactonworks) (Medusa7, NesCAD2010, solidEdge19)
|
erstellt am: 04. Okt. 2021 09:15 <-- editieren / zitieren --> Unities abgeben: Nur für Thor16
Zitat: ... Ich dachte mit folgendem Code hole ich mir die derzeit aktive Konfiguration des Bauteiles in der Baugruppe.Code: Set swPartKonfig = Part2.GetActiveConfiguration
...
Hallo Torsten, nicht in der Baugruppe, sondern im mit opendoc geöffneten "Part2". Und dem hast du mit "" (Leerstring) gesagt, es soll die zuletzt gespeicherte Konfiguration öffnen. du musst da weiterhin zwischen Teil und Komponente unterscheiden. Vorher bist du vermutlich irgendwo die Komponenten durchgegangen und hast dir Arrays mit Dateipfad(x) und Dateiname(x) angelegt. Da jetzt noch ein Array mit Konfiguration(x) und du hast was du brauchst. (dann kannst du auch auf swpartkonfig verzichten) Gruß, Christian
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Thor16 Mitglied Konstrukteur
Beiträge: 82 Registriert: 27.08.2019 SolidWorks 2022 Windows 10 x64
|
erstellt am: 04. Okt. 2021 09:47 <-- editieren / zitieren --> Unities abgeben:
Hallo Andreas, vielen Dank für deine Informationen. Ich habe das Makro entsprechend umgearbeitet, dass jetzt im geöffneten Bauteil die Konfiguration ausgelesen wird. Damit erhalte ich dann auch immer die in der Baugruppe verwendete Konfiguration. Der Code dazu sieht folgendermaßen aus: Code: Private Sub TraverseArrayComponent(Level As Integer, Component As Object) Dim swApp As Object Dim ModelDoc As Object Dim ModelDoc2 As Object Dim x As Integer Dim Children As Variant ' - Masse aller Baugruppenkomponenten auslesen - Dim Child As Object ' der Makromania von Stefan Berlitz entstanden Dim ChildCount As Integer ' ein Zähler Dim i As Integer Dim BTNameAkt As String Dim BTNameAktOnly As String Dim BTPfadAkt As String Dim BTConfigAkt As String Dim swModel As ModelDoc2 Dim vConfigNameArr As Variant Dim vConfigName As Variant Dim swConf As Configuration Dim swConfMgr As ConfigurationManager Dim boolstatus As Boolean Set swApp = Application.SldWorks Set ModelDoc = Component.GetModelDoc If Not ModelDoc Is Nothing Then BTNameAkt = ModelDoc.GetTitle() ' aktueller Bauteilname BTPfadAkt = Left(ModelDoc.GetPathName(), (Len(ModelDoc.GetPathName()) - Len(BTNameAkt))) ' aktueller Pfadname BTNameAktOnly = Left(BTNameAkt, (Len(BTNameAkt) - 7)) ' aktueller Bauteilname ohne Endung Set swModel = swApp.ActiveDoc boolstatus = swModel.Extension.SelectByID2(BTNameAktOnly & "-1@" & MainAssemblyNameOnly, "COMPONENT", 0, 0, 0, False, 0, Nothing, 0) swModel.OpenCompFile Set swModel = swApp.OpenDoc6(BTPfadAkt & BTNameAkt, swDocPART, 0, "", longstatus, longwarnings) Set swConfMgr = swModel.ConfigurationManager Set swConf = swConfMgr.ActiveConfiguration BTConfigAkt = swConf.Name ' aktuelle Konfiguration Debug.Print "Konfiguration = "; BTConfigAkt BTNummer = BTNummer + 1 ' Zähler +1 ReDim Preserve BTName(1 To BTNummer) As String ' Array befüllen ReDim Preserve BTPfad(1 To BTNummer) As String ReDim Preserve BTConfigAkt(1 To BTNummer) As String BTName(BTNummer) = BTNameAkt BTPfad(BTNummer) = BTPfadAkt BTConfigAkt(BTNummer) = BTConfigAkt If BTNummer > 1 Then For x = 1 To (BTNummer - 1) If BTNameAkt = BTName(x) Then BTNummer = BTNummer - 1 ReDim Preserve BTName(1 To BTNummer) As String ' Array befüllen ReDim Preserve BTPfad(1 To BTNummer) As String ReDim Preserve BTConfigAkt(1 To BTNummer) As String End If Next x End If End If Set swModel = Nothing swApp.CloseDoc BTNameAkt Set swModel = swApp.ActiveDoc Children = Component.GetChildren ChildCount = UBound(Children) + 1 For i = 0 To (ChildCount - 1) Set Child = Children(i) TraverseArrayComponent Level + 1, Child Next i End Sub
Ein Problem habe ich noch. Durch das Öffnen und Schließen der einzelnen Bauteile wird das Makro sehr langsam. Hast du vielleicht eine Idee wie ich es wieder beschleunigen kann? Viele Grüße Torsten Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Christian_W Ehrenmitglied V.I.P. h.c. Konstrukteur (Dipl-Ing)
Beiträge: 3189 Registriert: 04.04.2001 CSWP 12/2015<P>SWX2021sp5 Win10/11 (SWX2016, SWX2012) proAlpha6.2e00/calinkV9 (Tactonworks) (Medusa7, NesCAD2010, solidEdge19)
|
erstellt am: 04. Okt. 2021 12:47 <-- editieren / zitieren --> Unities abgeben: Nur für Thor16
Hallo, dein Text wirft mir so manche Frage auf ... - hast du main() "wegrationalisiert"? - hast du mal "getComponents" angesehen? dann brauchst du ggf. gar keine Rekursion mehr - warum machst du sie überhaupt mit open auf? genügt nicht "getModelDoc2" ? Gruß, Christian Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Thor16 Mitglied Konstrukteur
Beiträge: 82 Registriert: 27.08.2019 SolidWorks 2022 Windows 10 x64
|
erstellt am: 04. Okt. 2021 13:44 <-- editieren / zitieren --> Unities abgeben:
Hallo Christian, Main() habe ich nicht wegrationalisiert. Der Code ist nur ein Teil des Makros, in welchem ich mir die Konfiguration der einzelnen Bauteile hole. Leider funktioniert "getModelDoc2" auch nicht richtig. Dabei werden mir bei unseren Normteilen immer die falschen Konfigurationen angezeigt. Nur wenn ich das Bauteil öffne habe ich es bisher hinbekommen, dass die richtige Konfiguration ausgelesen wird. "GetComponents" schaue ich mir als Nächstes an. Viele Grüße Torsten
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
|
erstellt am: 04. Okt. 2021 13:58 <-- editieren / zitieren --> Unities abgeben: Nur für Thor16
|
Thor16 Mitglied Konstrukteur
Beiträge: 82 Registriert: 27.08.2019 SolidWorks 2022 Windows 10 x64
|
erstellt am: 05. Okt. 2021 14:47 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, vielen Dank für eure Hilfe. Das hat mich wieder ein ganzes Stück weitergebracht in der Arbeit mit SolidWorks und VBA. Ich hatte gestern im Forum noch einen Beitrag von bk.sc gefunden, in dem genau das gemacht wird was ich brauchte. https://ww3.cad.de/foren/ubb/Forum2/HTML/029882.shtml Dieses Makro habe ich noch entsprechend angepasst, sodass jetzt die Bildung des Array's sehr schnell vonstattengeht. Der Code lautet jetzt folgendermaßen. Code: Sub TraverseComponent(swApp As SldWorks.SldWorks, swModel As SldWorks.ModelDoc2, swComp As SldWorks.Component2, nLevel As Long) Dim vChildComp As Variant Dim swChildComp As SldWorks.Component2 Dim swCompModelDoc As SldWorks.ModelDoc2 Dim swPart As SldWorks.PartDoc Dim sPadStr As String Dim BTNameAkt As String Dim BTPfadAkt As String Dim BTConfigAkt As String Dim x As Integer Dim i As Long For i = 0 To nLevel - 1 sPadStr = sPadStr + " " Next i vChildComp = swComp.GetChildren For i = 0 To UBound(vChildComp) Set swChildComp = vChildComp(i) Set swCompModelDoc = swChildComp.GetModelDoc2 If swCompModelDoc.GetType = swDocPART Then Set swPart = swCompModelDoc BTNameAkt = swPart.GetTitle() ' aktueller Bauteilname 'Debug.Print "Bauteilname = " & BTNameAkt ' Kontrollpunkt aktueller Bauteilname BTPfadAkt = Left(swPart.GetPathName(), (Len(swPart.GetPathName()) - Len(BTNameAkt))) ' aktueller Pfad 'Debug.Print "Bauteilpfad = " & BTPfadAkt ' Kontrollpunkt aktueller Pfad BTConfigAkt = swChildComp.ReferencedConfiguration ' aktuelle Konfiguration 'Debug.Print "Konfiguration = " & BTConfigAkt ' Kontrollpunkt aktuelle Konfiguration End If BTNummer = BTNummer + 1 ' Zähler +1 ReDim Preserve BTName(1 To BTNummer) As String ' Array befüllen ReDim Preserve BTPfad(1 To BTNummer) As String ReDim Preserve BTConfig(1 To BTNummer) As String BTName(BTNummer) = BTNameAkt BTPfad(BTNummer) = BTPfadAkt BTConfig(BTNummer) = BTConfigAkt If BTNummer > 1 Then For x = 1 To (BTNummer - 1) If BTNameAkt = BTName(x) Then BTNummer = BTNummer - 1 ReDim Preserve BTName(1 To BTNummer) As String ' Array befüllen ReDim Preserve BTPfad(1 To BTNummer) As String ReDim Preserve BTConfig(1 To BTNummer) As String End If Next x End If TraverseComponent swApp, swModel, swChildComp, nLevel + 1 Next i End Sub
Viele Grüße Torsten [Diese Nachricht wurde von Thor16 am 05. Okt. 2021 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|