Macro SW2020 / Soucis dans le code VBA

Bonjour à tous,

étant Projeteur/Monteur de métier et un p'tit codeur de passion, je me suis attaqué à plus fort que moi en codage de macro VBA. 

Mon objectif est d'arriver à pouvoir descendre la barre de reprise dans toutes les pièces d'un assemblage. Pour ce faire, j'aimerais que la macro sélectionne et ouvre, unes à unes, les pièces (avec affichage à l'écran ou non) et qu'ensuite elle descende la barre de reprise dans l'arborescence et enregistre la pièce. Si dans mon ensemble il devait y avoir un sous ensemble, j'aimerais qu'il ouvre ce sous ensemble (idem que pour les pièces, avec affichage ou non) et qu'il recommence à ouvrir une à unes les pièces pour recommencer la première étape.

Je vous fait ici un petit schéma:

ASSEMBLAGE SW -----> Ouvrir part et ass (qui ne sont pas supprimés) -------> Si c'est un part --------> alors Descendre la barre de reprise + sauv + fermer

                                                                                                                                I

                                                                                                                                I-----> Si c'est un assemblage, faire de même que la case 2

voici le code et où j'en suis, c'est un code que j'ai trouvé sur le Web, mais qui apparemment a été codé un peut "à l'arrache" sur ce forum : https://forum.solidworks.com/thread/159206

Mon code corrigé comme j'ai pu :                            Le soucis avec mon code, c'est qu'il y a des erreurs de partout... erreur 91, puis des fois 13.... je suis perdus et aurais besoins de l'aide d'un de                                                                                       vous qui s'y connais!!! Merci d'avance ;)

Dim swApp As SldWorks.SldWorks

Dim swModel As SldWorks.ModelDoc2

Dim swModel1 As SldWorks.ModelDoc2

Dim swAssembly As SldWorks.AssemblyDoc

Dim CompNum As Integer

Dim CompNum1 As Integer

Dim components As SldWorks.Component2

Dim components1 As SldWorks.Component2

Dim component As SldWorks.Component2

Dim component1 As SldWorks.Component2

Sub main()


    Set swApp = Application.SldWorks

    Set swModel = swApp.ActiveDoc

    Set swAssembly = swModel
        
    ' Get number of components, not including child components in subassemblies

    CompNum = swAssembly.GetComponentCount(True)
    
    components = swAssembly.GetComponents(True)
    
    Dim i As Integer
    
    For i = 0 To CompNum
 
        component = components(i)

swModel1 = component.GetModelDoc2

          'open part from assembly function (if subassembly, create another for-loop with same procedure)

If swModel1.GetType = swDocPART Then

   Set swModel = swApp.ActivateDoc3(component.Name2, False, swRebuildOnActivation_e.swUserDecision, 0)

    boolstatus = part.FeatureManager.EditRollback(swMoveRollbackBarTo_e.swMoveRollbackBarToEnd, "")
    boolstatus = part.EditRebuild3()

swModel.SaveAs (component.GetPathName)

 swApp.CloseDoc component.GetPathName

Set swModel = swApp.ActiveDoc

 ElseIf swModel1.GetType = swDocASSEMBLY Then

CompNum1 = swModel1.GetComponentCount(True)

components1 = swModel1.GetComponents(True)

    Dim j As Integer
    
    For j = 0 To CompNum1

            component1 = components1(j)

swModel1 = component1.GetModelDoc2


   Set swModel = swApp.ActivateDoc3(component.Name2, False, swRebuildOnActivation_e.swUserDecision, 0)

    boolstatus = part.FeatureManager.EditRollback(swMoveRollbackBarTo_e.swMoveRollbackBarToEnd, "")
    boolstatus = part.EditRebuild3()
    

swModel.SaveAs (component.GetPathName)

 swApp.CloseDoc component.GetPathName

Next

End If

Next

End Sub

 

Bonjour. Essaye ça:

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 « J'aime »

Bonjour JeromP,

Votre code marche parfaitement bien!! Il est plus court que le mien et utilise des fonctions à ce que je vois, où avez-vous trouvé les ressources nécessaires si ça n'est pas trop indiscret?

En tout cas, merci beaucoup pour votre rapide et efficace aide!! 

Bonjour @JeromeP ,

vraiment sympa la macro; serait-il possible de modifier celle-ci pour qu'elle descende la barre de blocage?

Si oui j'ouvre une nouvelle question pour celle-ci?

@theo.hecht: Pas de problème. J'ai adapté le code trouvé ici: Traverse_Assembly_at_Component_and_Feature_Level_Example

@ac cobra 427: Je ne suis pas sûr de qu'est ce qu'es la barre de blocage. Cette macro descends la barre de reprise. Est ce que la barre de blocage est une barre différente de celle-ci?

Edit: Je viens de trouver la barre de blocage .

Pour la descendre, remplacer: swModel.FeatureManager.EditRollback swMoveRollbackBarTo_e.swMoveRollbackBarToEnd, Empty

par: swModel.FeatureManager.EditFreeze2 swMoveFreezeBarTo_e.swMoveFreezeBarToEnd, Empty, True, True

 

Bonjour,

La barre de blocage est la barre jaune que l'on trouve sur les fichiers pièces, la fonction à utiliser est EditFreeze2.

Cordialement,

1 « J'aime »

Oui je viens de voir ça. j'ai édité ma réponse précédente.

@JeromeP Merci ! :)

Cordialement,

@JeromeP  oui c'est une barre qui verrouille les fonction, ce qui empêche les reconstruction des pièces. Ceux-ci fait gagner du temps ors de l'ouverture des ASM. Par contre j'ai remplacer le bout de code et cela ne fonctionne pas . Je vais ouvrir une question, comme ça ce sera plus simple si quelqu'un recherche ce type de macro