SW2020 Macro / Problemen in VBA-code

Hoi allemaal

Als ontwerper/redacteur van beroep en een kleine programmeur met passie, pakte ik VBA-macrocodering sterker aan dan ik. 

Mijn doel is om de herstelstang in alle onderdelen van een assemblage te kunnen laten zakken. Om dit te doen, wil ik dat de macro de delen één voor één selecteert en opent (met of zonder weergave op het scherm) en vervolgens de hervattingsbalk in de boom naar beneden beweegt en het onderdeel opslaat. Als er in mijn set een subset zou zijn, zou ik willen dat hij deze subset opent (hetzelfde als voor de onderdelen, met display of niet) en de onderdelen één voor één opnieuw opent om de eerste stap opnieuw te beginnen.

Hier is een klein diagram:

SW-MONTAGE-----> Open onderdeel en kont (die niet worden verwijderd) -------> Als het een onderdeel is --------> ga dan naar beneden de hervattingsbalk + opslaan + sluiten

                                                                                                                                Ik

                                                                                                                                I-----> Als het een vergadering is, Doe hetzelfde als box 2

hier is de code en waar ik ben, het is een code die ik op het web heb gevonden, maar die blijkbaar een beetje "haastig" is gecodeerd op dit forum: https://forum.solidworks.com/thread/159206

Mijn code zo goed mogelijk gecorrigeerd :                            Het probleem met mijn code is dat er overal fouten zijn... fout 91, dan soms 13.... Ik ben verdwaald en zou de hulp nodig hebben van een van                                                                                       jullie die ervan weet!! Bij voorbaat dank;)

Dim swApp als SldWorks.SldWorks

Dim swModel als SldWorks.ModelDoc2

Dim swModel1 als SldWorks.ModelDoc2

Dim swAssembly als SldWorks.AssemblyDoc

Dim CompNum als geheel getal

Dim CompNum1 als geheel getal

Componenten dimmen als SldWorks.Component2

Dim componenten1 als SldWorks.Component2

Dim component als SldWorks.Component2

Dim component1 als SldWorks.Component2

Sub hoofd()


    Stel swApp = Toepassing.SldWorks in

    Stel swModel = swApp.ActiveDoc in

    Stel swAssembly in = swModel
        
    ' Verkrijg het aantal componenten, exclusief onderliggende componenten in subassemblages

    CompNum = swAssembly.GetComponentCount(True)
    
    componenten = swAssembly.GetComponents(True)
    
    Dim i als geheel getal
    
    Voor i = 0 Naar CompNum
 
        component = componenten(i)

swModel1 = component. GetModelDoc2

          'Open onderdeel van assemblagefunctie (als subassemblage, maak dan een andere for-loop met dezelfde procedure)

Als swModel1.GetType = swDocPART Dan

   Stel swModel = swApp.ActivateDoc3(component. Naam2, Onwaar, swRebuildOnActivation_e.swUserDecision, 0)

    boolstatus = delen. FeatureManager.EditRollback(swMoveRollbackBarTo_e.swMoveRollbackBarToEnd, "")
    boolstatus = delen. BewerkenOpnieuw opbouwen3()

swModel.SaveAs (onderdeel. GetPathName)

 swApp.CloseDoc-component. GetPathName (GetPathNaam)

Stel swModel = swApp.ActiveDoc in

 ElseIf swModel1.GetType = swDocASSEMBLY Dan

CompNum1 = swModel1.GetComponentCount(True)

components1 = swModel1.GetComponents(True)

    Zon j Als geheel getal
    
    Voor j = 0 TB CompNum1

            component1 = componenten1(j)

swModel1 = component1. GetModelDoc2


   Stel swModel = swApp.ActivateDoc3(component. Naam2, Onwaar, swRebuildOnActivation_e.swUserDecision, 0)

    boolstatus = delen. FeatureManager.EditRollback(swMoveRollbackBarTo_e.swMoveRollbackBarToEnd, "")
    boolstatus = delen. BewerkenOpnieuw opbouwen3()
    

swModel.SaveAs (onderdeel. GetPathName)

 swApp.CloseDoc-component. GetPathName (GetPathNaam)

Volgend

Einde als

Volgend

Einde Sub

 

Hallo. Probeer het volgende:

Option Explicit
Dim swApp As SldWorks.SldWorks
Sub main()
    Dim swModel As SldWorks.ModelDoc2
    Dim swConf As SldWorks.Configuration
    Dim swRootComp As SldWorks.Component2
    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
    Set swConf = swModel.GetActiveConfiguration
    Set swRootComp = swConf.GetRootComponent3(True)
    TraverseComponent swRootComp
End Sub

Sub TraverseComponent(swComp As SldWorks.Component2)
    Dim vChildComp As Variant
    Dim swChildComp As SldWorks.Component2
    Dim swCompConfig As SldWorks.Configuration
    Dim i As Long
    vChildComp = swComp.GetChildren
    For i = 0 To UBound(vChildComp)
        Set swChildComp = vChildComp(i)
        TraverseComponent swChildComp
    Next i
    RollBack swComp
End Sub

Sub RollBack(swComp As SldWorks.Component2)
    Dim swModel As SldWorks.ModelDoc2
    Set swModel = swComp.GetModelDoc2
    swApp.ActivateDoc3 swComp.Name2, False, swRebuildOnActivation_e.swRebuildActiveDoc, Empty
    If swModel.GetType <> swDocumentTypes_e.swDocPART Then Exit Sub
    swModel.FeatureManager.EditRollback swMoveRollbackBarTo_e.swMoveRollbackBarToEnd, Empty
    swModel.EditRebuild3
    swModel.Save3 swSaveAsOptions_e.swSaveAsOptions_Silent, Empty, Empty
    swApp.CloseDoc swModel.GetPathName
End Sub

 

3 likes

Hallo JeromP,

Je code werkt prima! Het is korter dan de mijne en gebruikt functies voor zover ik kan zien, waar heb je de benodigde bronnen gevonden als het niet te opdringerig is?

In ieder geval hartelijk dank voor uw snelle en efficiënte hulp!!  

Hallo @JeromeP ,

echt mooie macro; Zou het mogelijk zijn om het zo aan te passen dat het naar beneden gaat in de blokkeerbalk?

Zo ja, open ik een nieuwe vraag voor deze?

@theo.hecht: Geen probleem. Ik heb de hier gevonden code aangepast: Traverse_Assembly_at_Component_and_Feature_Level_Example

@ac cobra 427: Ik weet niet zeker wat de vergrendelingsstang is. Deze macro wordt naar beneden verplaatst  op de herstelbalk. Is de blokkeerbalk een andere balk dan deze?

Edit: Ik heb net de blokkeerbalk gevonden.

Als u deze wilt verlagen, vervangt u: swModel.FeatureManager.EditRollback swMoveRollbackBarTo_e.swMoveRollbackBarToEnd, Leeg

door: swModel.FeatureManager.EditFreeze2 swMoveFreezeBarTo_e.swMoveFreezeBarToEnd, leeg, waar, waar

 

Hallo

De blokbalk is de gele balk die te vinden is op onderdelenbestanden, de te gebruiken functie is EditFreeze2.

Vriendelijke groeten

1 like

Ja, dat zag ik net. Ik heb mijn vorige antwoord bewerkt.

@JeromeP Dank je wel ! :)

Vriendelijke groeten

  @JeromeP ja, het is een balk die de functies vergrendelt, wat de reconstructie van de onderdelen voorkomt. Deze besparen tijd bij het openen van ASM's. Aan de andere kant heb ik het codefragment vervangen en het werkt niet. Ik ga een vraag openen, dus het zal gemakkelijker zijn als iemand op zoek is naar dit soort macro 's