| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für SOLIDWORKS |
| |
| Nahe an industriellen Realbedingungen, eine Pressemitteilung
|
Autor
|
Thema: Gesucht: Makro Körper einzeln einblenden (728 mal gelesen)
|
Lubber2 Mitglied
Beiträge: 6 Registriert: 28.08.2023
|
erstellt am: 28. Aug. 2023 13:08 <-- editieren / zitieren --> Unities abgeben:
Hallo Forum. Ich bin leider ein VBA Noobie und kenne mich hier gar nicht aus, aber vielleicht kann mir ja wer weiterhelfen. Ich hätte gerne ein Makro, am besten mit einer UF "verfeinert" welches mir erlaubt in einem SolidWorks Mehrkörperteil alle enthaltenen Körper der Reihe nach einzeln einblendet und den Rest entsprechend ausblendet. Vorstellen tu ich mir das so: Start von Makro öffnet die UF. Darauf befindet sich eine Schaltfläche. Beim betätigen wird mir der Erste Körper im Ordner Volumenkörper einblendet. Erneutes betätigen den nächsten. Das ganze kann so lange wiederholt werden bis der Ordner einmal "durchgeklickt" wurde und am Ende kommt eine Meldung, "alle Volumenkörper wurden einmal angezeigt" (oder so was ähnliches) und es werden wieder alle vollständig angezeigt. Nun meine Frage: Kann mir wer bei der Erstellung helfen oder hat wer zufällig schon etwas in der Art in der Schublade? Wie gesagt, kenne ich mich mit VBA so gar nicht aus. Danke schon mal für Eure Antworten. Gruß Lubber
------------------ Dante Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Lenzcad Ehrenmitglied Selbständiger Handwerker
Beiträge: 1539 Registriert: 21.10.2003 CPU i7-9700K RAM 64GB Quadro P2200 SW 2022 SW Simulation 2022
|
erstellt am: 28. Aug. 2023 14:14 <-- editieren / zitieren --> Unities abgeben: Nur für Lubber2
Hallo Lubber, mit VBA sind andere bestimmt geübter als ich, aber mein Vorschlag wäre: Im FM im Ordner "Volumenkörper" > RK auf den ersten Volumenkörper > Isolieren > die weiteren Körper anklicken (dann wird der jeweilige transparent eingeblendet) > Isolieren beenden. Bei Bedarf den gewünschten Körper markiert lassen und mit RK "Isolieren" einzeln anzeigen. Gruß - Lenz [Diese Nachricht wurde von Lenzcad am 28. Aug. 2023 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Lubber2 Mitglied
Beiträge: 6 Registriert: 28.08.2023
|
erstellt am: 30. Aug. 2023 09:48 <-- editieren / zitieren --> Unities abgeben:
Moin Lenz. Danke für die Antwort. Da ich aber Teilweise Mehrkörperteile mit 200+ Körper habe würde ich gerne bei meinem Ansatz mit dem Makro bzw. einer UserForm bleiben. Ich dachte mir das ganze jetzt zu splitten und erstmal für die später einzelnen command buttons in der UF die jeweiligen codes zu erstellen. später will ich dann einen button für "den ersten Volumenkörper anzeigen", und einen für den aktuell angezeigten VK ausblenden und den nächsten anzeigen". Für den ersten anzeigen hätte ich diesen Code: Code: Sub HideAllShowFirstSolid() Dim swApp As SldWorks.SldWorks Dim swModel As SldWorks.ModelDoc2 Dim swPart As SldWorks.PartDoc Dim vBodies As Variant Dim i As Integer Set swApp = Application.SldWorks Set swModel = swApp.ActiveDoc If Not swModel Is Nothing Then If swModel.GetType = swDocPART Then Set swPart = swModel Set vBodies = swPart.GetBodies2(swBodyType_e.swSolidBody) ' Hide all solids except the first one For i = LBound(vBodies) To UBound(vBodies) If i > LBound(vBodies) Then vBodies(i).Hide End If Next i ' Show the first solid If UBound(vBodies) >= LBound(vBodies) Then vBodies(LBound(vBodies)).Hide = False End If Else MsgBox "The active document is not a part." End If Else MsgBox "No active document found." End If Set swPart = Nothing Set swModel = Nothing Set swApp = Nothing End Sub
In der Zeile: Set vBodies = swPart.GetBodies2(swBodyType_e.swSolidBody) bekomme ich die Meldung "Fehler beim Kompilieren: Argument ist nicht optional" Kann mir wer sagen woran das liegen könnte? Ich benutze SW22. Gruß Lubber ------------------ Dante [Diese Nachricht wurde von Lubber2 am 30. Aug. 2023 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Swazi Mitglied
Beiträge: 6 Registriert: 10.02.2013 SOLIDWORKS 2021/2022/2023 SP0.1 WIN10x64 21H2
|
erstellt am: 30. Aug. 2023 11:14 <-- editieren / zitieren --> Unities abgeben: Nur für Lubber2
|
Lubber2 Mitglied
Beiträge: 6 Registriert: 28.08.2023
|
erstellt am: 30. Aug. 2023 11:28 <-- editieren / zitieren --> Unities abgeben:
Moin Swazi, Danke. Der Code schaut nun so aus: Code: Sub HideAllShowFirstSolid() Dim swApp As SldWorks.SldWorks Dim swModel As SldWorks.ModelDoc2 Dim swPart As SldWorks.PartDoc Dim vBodies As Variant Dim i As Integer Set swApp = Application.SldWorks Set swModel = swApp.ActiveDoc If Not swModel Is Nothing Then If swModel.GetType = swDocPART Then Set swPart = swModel Set vBodies = swModel.GetBodies2(swSolidBody, False) ' Hide all solids except the first one For i = LBound(vBodies) To UBound(vBodies) If i > LBound(vBodies) Then vBodies(i).Hide End If Next i ' Show the first solid If UBound(vBodies) >= LBound(vBodies) Then vBodies(LBound(vBodies)).Hide = False End If Else MsgBox "The active document is not a part." End If Else MsgBox "No active document found." End If Set swPart = Nothing Set swModel = Nothing Set swApp = Nothing End Sub
Nun kommt der Laufzeitfehler 13 Typen unverträglich in dieser Zeile. Gruß Lubber ------------------ Dante [Diese Nachricht wurde von Lubber2 am 30. Aug. 2023 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Swazi Mitglied
Beiträge: 6 Registriert: 10.02.2013 SOLIDWORKS 2021/2022/2023 SP0.1 WIN10x64 21H2
|
erstellt am: 30. Aug. 2023 11:33 <-- editieren / zitieren --> Unities abgeben: Nur für Lubber2
|
Lubber2 Mitglied
Beiträge: 6 Registriert: 28.08.2023
|
erstellt am: 30. Aug. 2023 11:37 <-- editieren / zitieren --> Unities abgeben:
Ok, verstehe. Allerdings bekomme ich nun den Laufzeitfehler 449 Argument ist nicht optional in der Zeile vBodies(i).Hide im ersten For i Block. Sorry, ich steh grad irgendwie auf dem Schlauch... Danke schon mal. ------------------ Dante Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Swazi Mitglied
Beiträge: 6 Registriert: 10.02.2013 SOLIDWORKS 2021/2022/2023 SP0.1 WIN10x64 21H2
|
erstellt am: 30. Aug. 2023 11:57 <-- editieren / zitieren --> Unities abgeben: Nur für Lubber2
|
Lubber2 Mitglied
Beiträge: 6 Registriert: 28.08.2023
|
erstellt am: 30. Aug. 2023 12:06 <-- editieren / zitieren --> Unities abgeben:
Du bist der Beste! Danke Dir! Musste aber noch im Block 'Show the first Solid aus .Hide = False ein .HideBody (False) machen. Dann ging es. Für alle die so ein Makro nutzen können, hier nochmal der Code der funktioniert: Code:
Sub HideAllShowFirstSolid() Dim swApp As SldWorks.SldWorks Dim swModel As SldWorks.ModelDoc2 Dim swPart As SldWorks.PartDoc Dim vBodies As Variant Dim i As Integer Set swApp = Application.SldWorks Set swModel = swApp.ActiveDoc If Not swModel Is Nothing Then If swModel.GetType = swDocPART Then Set swPart = swModel vBodies = swModel.GetBodies2(swSolidBody, False) ' Hide all solids except the first one For i = LBound(vBodies) To UBound(vBodies) If i > LBound(vBodies) Then vBodies(i).HideBody (True) End If Next i ' Show the first solid If UBound(vBodies) >= LBound(vBodies) Then vBodies(LBound(vBodies)).HideBody (False) End If Else MsgBox "The active document is not a part." End If Else MsgBox "No active document found." End If Set swPart = Nothing Set swModel = Nothing Set swApp = Nothing End Sub
Als nächstes Makro, das nun daran anknüpft will ich versuchen alle Körper der reihe nach einzublenden. Sprich, aktuell eingeblendeten Körper ausblenden und den nächsten Körper im Ordner Volumenkörper einblenden. Das ganze soll dann jeweils so lange gemacht werden können bis der letzte VK in dem Ordner eingeblendet wurde. Mal schauen ob ich das hinbekomme. Möglicherweise werde ich mich dann nochmal melden. Auf jeden Fall nochmal recht herzlichen Dank für die schnelle Hilfe trotz Deiner knapp bemessenen Zeit. Schönen Gruß, Lubber ------------------ Dante Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Lubber2 Mitglied
Beiträge: 6 Registriert: 28.08.2023
|
erstellt am: 30. Aug. 2023 13:09 <-- editieren / zitieren --> Unities abgeben:
Leider früher als erwartet -.-: Ich hatte den besagten Code der auf den ersten aufbauen soll die Tage schon mal angefangen und tüttl da gerade rum. Wie gesagt möchte ich nun mit dem 2. Makro die einzelnen volumenkörper nach und nach "durchklicken" und anzeigen lassen. Mein aktueller Code dazu sieht zur Zeit so aus: Code:
Sub ShowNextSolid() Dim swApp As SldWorks.SldWorks Dim swModel As SldWorks.ModelDoc2 Dim swPart As SldWorks.PartDoc Dim vBodies As Variant Dim currentBodyIndex As Integer Set swApp = Application.SldWorks Set swModel = swApp.ActiveDoc If Not swModel Is Nothing Then If swModel.GetType = swDocPART Then Set swPart = swModel vBodies = swPart.GetBodies2(swSolidBody, False) ' Determine the index of the currently shown body currentBodyIndex = -1 For i = 0 To UBound(vBodies) If Not vBodies(i).IsHidden Then currentBodyIndex = i Exit For End If Next i ' Hide the currently shown body If currentBodyIndex >= 0 Then vBodies(currentBodyIndex).HideBody (True) End If ' Show the next body or display a message if all bodies are shown If currentBodyIndex < UBound(vBodies) Then currentBodyIndex = currentBodyIndex + 1 vBodies(currentBodyIndex).HideBody (False) Else MsgBox "All solids have been shown once. Press OK to show all solids again.", vbInformation For i = 0 To UBound(vBodies) vBodies(i).HideBody (False) Next i End If Else MsgBox "The active document is not a part." End If Else MsgBox "No active document found." End If Set swPart = Nothing Set swModel = Nothing Set swApp = Nothing End Sub
In der Zeile If Not vBodies(i).IsHidden Then Bekomme ich nun den Laufzeitfehler 438 Objekt unterstützt diese Eigenschaft oder methode nicht. Ich finde den Fehler allerdings nicht bzw. habe keinen Plan wie ich das gelöst bekomme. Weißt Du vieleicht auch hier die Lösung? Danke und Gruß! ------------------ Dante 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: 3256 Registriert: 04.04.2001 CSWP 12/2015<P>SWX2021sp5 Win10/11 (SWX2016, SWX2012) proAlpha6.2e00/calinkV9 (Tactonworks) (Medusa7, NesCAD2010, solidEdge19)
|
erstellt am: 31. Aug. 2023 10:08 <-- editieren / zitieren --> Unities abgeben: Nur für Lubber2
|
Swazi Mitglied
Beiträge: 6 Registriert: 10.02.2013 SOLIDWORKS 2021/2022/2023 SP0.1 WIN10x64 21H2
|
erstellt am: 31. Aug. 2023 11:25 <-- editieren / zitieren --> Unities abgeben: Nur für Lubber2
Moin, ich habs mal funktional quick and dirty runtergeschrieben. Code: Sub HideCurrentShowNextBody()Dim swApp As SldWorks.SldWorks Dim swModel As SldWorks.ModelDoc2 Dim vBodies As Variant Dim iBody As Integer Set swApp = Application.SldWorks Set swModel = swApp.ActiveDoc vBodies = swModel.GetBodies2(swSolidBody, False) ' Hide all Bodies For iBody = 0 To UBound(vBodies) vBodies(iBody).HideBody (True) Next ' Hide Current and Show Next Body For iBody = 0 To UBound(vBodies) If iBody > 0 Then vBodies(iBody - 1).HideBody (True) vBodies(iBody).HideBody (False) Next ' Show all Bodies For iBody = 0 To UBound(vBodies) vBodies(iBody).HideBody (False) Next
End Sub
Bzgl. deinem Error hat Christian schon einen Hinweis gegeben. Ob die Reihenfolge im Array anders sein kann als im Ordner, sollte mal Überprüft werden. 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: 3256 Registriert: 04.04.2001 CSWP 12/2015<P>SWX2021sp5 Win10/11 (SWX2016, SWX2012) proAlpha6.2e00/calinkV9 (Tactonworks) (Medusa7, NesCAD2010, solidEdge19)
|
erstellt am: 04. Sep. 2023 10:55 <-- editieren / zitieren --> Unities abgeben: Nur für Lubber2
getbodies geht nur vom partdoc, nicht vom modeldoc ... alternative - braucht aber einen Haltepunkt !! Code:
Dim swApp As SldWorks.SldWorks Dim swModel As SldWorks.ModelDoc2 Dim swPart As SldWorks.PartDoc Dim vBodies As Variant Dim vBody As VariantSub main() Set swApp = Application.SldWorks Set swModel = swApp.ActiveDoc Set swPart = swModel vBodies = swPart.GetBodies2(swSolidBody, False) 'alle ausblenden showhide_all (True) 'erstes einblenden vBodies(0).HideBody (False) 'naechstes einblenden Do Loop Until showNext 'EndeErreicht 'alle einblenden showhide_all (False) End Sub Function showNext() As Boolean 'liefert true, wenn letzter sichtbar Dim myState As Boolean Dim nextState As Boolean For Each vBody In vBodies myState = vBody.Visible If nextState Then vBody.HideBody (False) If myState Then vBody.HideBody (True) nextState = myState Next showNext = nextState End Function Sub showhide_all(myState As Boolean) For Each vBody In vBodies vBody.HideBody (myState) Next End Sub
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: 3256 Registriert: 04.04.2001 CSWP 12/2015<P>SWX2021sp5 Win10/11 (SWX2016, SWX2012) proAlpha6.2e00/calinkV9 (Tactonworks) (Medusa7, NesCAD2010, solidEdge19)
|
erstellt am: 04. Sep. 2023 14:59 <-- editieren / zitieren --> Unities abgeben: Nur für Lubber2
statt showNext mit for each komplett durchzulaufen, wäre es mit Index vermutlich schneller. dann muss man halt selber dafür sorgen, dass die richtigen indexe übergeben werden. Code:
sub changeShownBody (FromIndex as integer, ToIndex as integer) vbodies(FromIndex).HideBody (true) vbodies(ToIndex).HideBodey (false) end sub
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |