| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für SOLIDWORKS |
| |
| Der größte Rechenreiniger der Welt bei MUHR , ein Anwenderbericht
|
Autor
|
Thema: Makro Bauteilkomponente löschen (321 / mal gelesen)
|
TechNick Mitglied Konstrukteur
Beiträge: 17 Registriert: 19.11.2018
|
erstellt am: 11. Dez. 2024 08:44 <-- editieren / zitieren --> Unities abgeben:
Hallo werte Gemeinde, Ich möchte mir ein Makro basteln, welches in einer Baugruppe alle Instanzen von Komponente "Trennboden" löscht. Die Beispielkomponente „Trennboden“ kann ein in einem Fall ein Teil und ein anders Mal eine Unterbaugruppe sein. Meist kann ich mir mit meinen begrenzten Kenntnissen in VBA und der SWX API etwas zusammenlügen, aber hier fehlt mir so ziemlich alles. Wäre schön, wenn mir jemand etwas Anschubhilfe geben kann. Ich bedanke mich schonmal im Voraus Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
nahe Ehrenmitglied
Beiträge: 1775 Registriert: 18.01.2001 arbeite mit: Dell Precision 7750 i7 2,6 GHz 6 Kerne 32GB RAM 512GB SSD NVIDIA Quadro RTX 4000 ------------------------ SWX-2020 SP5.0 EPDM ---------------- Windows 10 ---------------- VB.net VB VBA ein wenig Swift am Mac
|
erstellt am: 11. Dez. 2024 09:23 <-- editieren / zitieren --> Unities abgeben: Nur für TechNick
|
TechNick Mitglied Konstrukteur
Beiträge: 17 Registriert: 19.11.2018
|
erstellt am: 11. Dez. 2024 11:40 <-- editieren / zitieren --> Unities abgeben:
|
Heiko Soehnholz Ehrenmitglied V.I.P. h.c. Dipl.-Ing. (FH) Maschinenbau
Beiträge: 5537 Registriert: 03.07.2002 SOLIDWORKS 2001 - 2025SP0 Elite AE Award 2023 SOLIDWORKS Premium, 3DEXPERIENCE, Simu, Flow, Plastics, Composer, MBD, Inspection, PDMP, Visualize, TopsWorks, DPS Tools, JobBox, MacroSheet, etc. Passungstabelle von Heinz WIN11 23H2 | HP ZBook 17 Fury G8
|
erstellt am: 11. Dez. 2024 16:34 <-- editieren / zitieren --> Unities abgeben: Nur für TechNick
Moin, dafür extra ein Makro programmieren? Oder willst du es hundertfach ausführen? Ansonsten kann man es manuell in wenigen Sekunden per Filter im FeatureManager erledigen... ------------------ Einen schönen Gruß von Heiko Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
TechNick Mitglied Konstrukteur
Beiträge: 17 Registriert: 19.11.2018
|
erstellt am: 12. Dez. 2024 12:39 <-- editieren / zitieren --> Unities abgeben:
Moin, nochmal Danke an Heinz. Mit Hilfe des ersten Links bin ich auf folgenden Beitrag hier im Forum gestoßen. https://ww3.cad.de/foren/ubb/Forum2/HTML/033438.shtml#000004Das Beispiel habe ich auf das nötigste für meinen Anwendungsfall eingestampft, aber … -> siehe unten Zum Hintergrund: Ich hab ein Makro, welches ein Bauteil (Teil oder Baugruppe) mehrfach in eine Baugruppe einfügt. Die Lage jedes einzelnen Bauteils werden mittels Excel auf Basis der Eingaben des Konstrukteurs berechnet. Gefällt dem Konstrukteur am Ergebnis im SWX etwas nicht, ändert er die Eingabedaten im Excel und drückt erneut den Button zum Platzieren der Bauteile. Bevor die Bauteile erneut eingefügt werden, müssen die vorhandenen Bauteile (alle Instanzen) natürlich gelöscht werden. Das Makro zum Einfügen der Bauteile gibt es mehrfach für verschiedenste Bauteile (Teil oder Baugruppe) in entsprechend modifizierter Form. In diesem Makro soll nun der Aufruf einer Routine zum Löschen von Bauteilen vorangestellt werde. Und jetzt kommt das ABER: Meine Routine zum Löschen von Bauteilen funktioniert grundsätzlich, jedoch muss der Name der zu löschenden Komponente als Variable (CompName) an die Routine übergeben werden. Und an dieser Kleinigkeit komme ich gerade nicht weiter. Option Explicit Dim swApp As SldWorks.SldWorks Dim swPartDoc As ModelDoc2 Dim boolstatus As Boolean Dim CompName As String Sub main() Set swApp = Application.SldWorks Set swPartDoc = swApp.ActiveDoc 'CompName = "Trennboden" Dim swRootComp As SldWorks.Component2 Set swRootComp = swPartDoc.ConfigurationManager.ActiveConfiguration.GetRootComponent TraverseComponent swRootComp End Sub Sub TraverseComponent(comp As SldWorks.Component2) Dim vChildComps As Variant vChildComps = comp.GetChildren Dim i As Integer For i = 0 To UBound(vChildComps) Dim swChildComp As SldWorks.Component2 Set swChildComp = vChildComps(i) If swChildComp.Name2 Like "Trennboden*" Then boolstatus = swPartDoc.Extension.SelectByID2(swChildComp.Name2, "COMPONENT", 0, 0, 0, False, 0, Nothing, 0) swPartDoc.EditDelete Else TraverseComponent swChildComp End If Next End Sub
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
nahe Ehrenmitglied
Beiträge: 1775 Registriert: 18.01.2001 arbeite mit: Dell Precision 7750 i7 2,6 GHz 6 Kerne 32GB RAM 512GB SSD NVIDIA Quadro RTX 4000 ------------------------ SWX-2020 SP5.0 EPDM ---------------- Windows 10 ---------------- VB.net VB VBA ein wenig Swift am Mac
|
erstellt am: 13. Dez. 2024 08:54 <-- editieren / zitieren --> Unities abgeben: Nur für TechNick
Wenn ich Dich richtig verstehe sollte das reichen Sub TraverseComponent(comp As SldWorks.Component2, CompName as string) .... Aufruf mit TraverseComponent swRootComp, CompName Übrigens keine Ahnung ob das Auswirkungen hat Ich würde vorsichtig sein, einzelne Elemente die man über eine Schleife durchläuft zu löschen. Weil man dadurch ja die Anzahl der zu durchlaufenden Elemente verändert Besser wäre es, die Elemente im Schleifendurchlauf zu markieren und erst danach zu löschen. ------------------ Grüße Heinz Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
TechNick Mitglied Konstrukteur
Beiträge: 17 Registriert: 19.11.2018
|
erstellt am: 17. Dez. 2024 11:24 <-- editieren / zitieren --> Unities abgeben:
Moin, Danke Heinz für den Hinweis. So in etwa hatte ich das auch schon im Blick, nur zunächst nicht konsequent umgesetzt. Nun funktioniert es … nur fast. Option Explicit Dim swApp As SldWorks.SldWorks Dim swPartDoc As ModelDoc2 Dim boolstatus As Boolean Dim CompName As String Sub main() Set swApp = Application.SldWorks Set swPartDoc = swApp.ActiveDoc CompName = "Trennboden" Dim swRootComp As SldWorks.Component2 Set swRootComp = swPartDoc.ConfigurationManager.ActiveConfiguration.GetRootComponent TraverseComponent swRootComp, CompName End Sub Sub TraverseComponent(comp As SldWorks.Component2, CompName As String) Dim vChildComps As Variant vChildComps = comp.GetChildren Dim i As Integer For i = 0 To UBound(vChildComps) Dim swChildComp As SldWorks.Component2 Set swChildComp = vChildComps(i) 'If swChildComp.Name2 Like "Trennboden*" Then If swChildComp.Name2 = CompName Then boolstatus = swPartDoc.Extension.SelectByID2(swChildComp.Name2, "COMPONENT", 0, 0, 0, False, 0, Nothing, 0) swPartDoc.EditDelete Else TraverseComponent swChildComp, CompName End If Next End Sub Während die If-Anweisung mit: If swChildComp.Name2 Like "Trennboden*" Then Funktioniert, tut es die Anweisung: If swChildComp.Name2 = CompName Then nicht mehr. Darf ich nochmal um Hilfestellung bitten? Wie eingangs geschrieben, meine Kenntnisse in VBA und der SWX API sind leider begrenzt
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
nahe Ehrenmitglied
Beiträge: 1775 Registriert: 18.01.2001 arbeite mit: Dell Precision 7750 i7 2,6 GHz 6 Kerne 32GB RAM 512GB SSD NVIDIA Quadro RTX 4000 ------------------------ SWX-2020 SP5.0 EPDM ---------------- Windows 10 ---------------- VB.net VB VBA ein wenig Swift am Mac
|
erstellt am: 17. Dez. 2024 14:45 <-- editieren / zitieren --> Unities abgeben: Nur für TechNick
Hallo TechNick, Du verwendest auch zwei verschiedene Vergleichsmethoden ein mal "like" ein mal "=" Wenn es mit like funktioniert würde ich einfach If swChildComp.Name2 like CompName & "*" verwenden ------------------ Grüße Heinz Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
TechNick Mitglied Konstrukteur
Beiträge: 17 Registriert: 19.11.2018
|
erstellt am: 17. Dez. 2024 15:15 <-- editieren / zitieren --> Unities abgeben:
|