Problème macro variable vide

Bonjour, je rencontre un soucis dans une macro sur un seul de plus de 20 postes depuis 2 jour (avant cela fonctionnait parfaitement).
La variable Set swPart reste vide au lieu de se remplir comme avant
Set swPart = swChildComp.GetModelDoc2() au surrvol swPart = Nothing:

Sub TraverseComponent(swComp As SldWorks.Component2, nLevel As Long, catSelect As String)
    Dim vChilds As Variant, vChild As Variant
    Dim swChildComp As SldWorks.Component2
    Dim MyString As String
    Dim swCustPropMgr As SldWorks.CustomPropertyManager
    Set swApp = Application.SldWorks

    
    vChilds = swComp.GetChildren
    For Each vChild In vChilds
        Set swChildComp = vChild
        Dim FileName As String
        FileName = swChildComp.GetPathName
        Debug.Print "Part Name    : " & FileName
        FileName = Left(FileName, InStr(FileName, ".") - 1)
        FileName = Right(FileName, Len(FileName) - InStrRev(FileName, "\"))
        Debug.Print "Part Name    : " & FileName
        MyString = FileName
        Dim ActiveConfig As String
        ActiveConfig = swChildComp.ReferencedConfiguration
        Debug.Print "Configuration: " & ActiveConfig
        FileName = swChildComp.GetPathName
        If swChildComp.GetSuppression() <> swComponentSuppressionState_e.swComponentSuppressed Then
            Dim swIComp As IComponent2
            Set swIComp = swChildComp
            Dim notRepetition As Boolean
            notRepetition = swIComp.IsPatternInstance()
                Dim swPart As SldWorks.modelDoc2
                Set swPart = swChildComp.GetModelDoc2()
                'Récupère la catégorie de la configuration active
                Set swCustPropMgr = swPart.Extension.CustomPropertyManager(ActiveConfig) 'get properties
                categorie = swCustPropMgr.Get("Categorie") 'get categorie
                designation = swCustPropMgr.Get("Designation")
                'Si la catégorie de la config active est vide on récupère celle du document
                If categorie = "" Then
                    Set swCustPropMgr = swPart.Extension.CustomPropertyManager("") 'get properties
                    categorie = swCustPropMgr.Get("Categorie") 'get categorie
                    If designation = "" Then
                        designation = swCustPropMgr.Get("Designation") 'get categorie
                    End If
                End If
                
                Debug.Print "Catégorie: " & categorie
                    'If notRepetition = False Then
                        If catSelect = "FI" And notRepetition = False Then
                            folderName = "FI"
                            If (categorie = "Fourniture Industrielle" And Not (designation Like "STD*")) Or (categorie = "Tuyauterie") Or ((categorie = "Sans Catégorie") And (MyString Like "Bipod*")) Or ((categorie = "Sans Catégorie") And (MyString Like "Tripod*")) Then
                                compteur = compteur + 1
                                retVal = swChildComp.Select2(True, 0)
                            End If
                         ElseIf catSelect = "Visserie" And notRepetition = False Then
                            folderName = "Visserie"
                            'Debug.Print "Type:" & swPart.GetType
                            If (categorie = "Visserie") Or ((categorie = "Sans Catégorie") And (swPart.GetType = 2) And (Not MyString Like "Bipod*") And (Not MyString Like "Tripod*")) Then
                                compteur = compteur + 1
                                rRetVal = swChildComp.Select2(True, 0)
                            End If
                         ElseIf catSelect = "Reconductible" And notRepetition = False Then
                            folderName = "Reconductible"
                            'If categorie = "Reconductible" Then
                            If (categorie = "Reconductible") And (Not designation Like "STD*") Then
                                compteur = compteur + 1
                                retVal = swChildComp.Select2(True, 0)
                            End If
                         ElseIf catSelect = "Electricite" And notRepetition = False Then
                            folderName = "Electricité"
                            If categorie = "Electricite" Then
                                compteur = compteur + 1
                                retVal = swChildComp.Select2(True, 0)
                            End If
                          
                          ElseIf catSelect = "Produit" Then
                            folderName = "Produit"
                            If categorie = "Produit" Then
                                'Ligne pour exclure le composant de la nomenclature
                                swChildComp.SetExcludeFromBOM2 True, 2, 2
                                If categorie = "Produit" And notRepetition = False Then
                                    compteur = compteur + 1
                                    retVal = swChildComp.Select2(True, 0)
                                End If
                            End If
                        
                          ElseIf catSelect = "STD" And notRepetition = False Then
                            folderName = "STD"
                            If designation Like "STD*" Then
                                compteur = compteur + 1
                                retVal = swChildComp.Select2(True, 0)
                            End If
                        
                    'End If
            End If
            
        End If
        Debug.Print

    Next
    
End Sub

Est-ce que quelqu’un aurait une explication a ce comportement très bizarre et soudain (pas de maj à prioris)
Au besoin la macro complète (ci-dessus code partiel)
CreateFolderByProperties.swp (118,5 Ko)

Bonjour,

Pas d’idée comme ça. Est-ce que Swchild ne serait pas vide également ?
En la déroulant pas à pas sur le poste en question est-ce que ça se déroule normalement?

1 « J'aime »

Bonjour

Pas d’idées instantanées non plus: Mais je regarderais les points suivants.

  1. Le mode d’ouverture de l’assemblage.
    (devrait être en « Resolu » et est probablement en « Allégé ») ?

  2. les Compléments VB manquants?
    (Peu probable devrait avoir message erreur)

  3. onglet « Performance » Solidworks : Résolution sous assemblages ?
    (A comparer avec les postes "fonctionnels)
    image

  4. …La Lampe ? (Ref: à une vieille publicité dont j’ai oublié le commanditaire…)

2 « J'aime »

Bonjour @tous
Ça me rappelle le message « the object invoked has disconnected from its clients » les tests alléger, supprimer, cacher et isloaded() ne suffisaient pas, c’est comme si SW les virent de la mémoire (c’est peut-être lié à l’optimisation des ressources :stuck_out_tongue_winking_eye:).
Je propose d’ajouter une condition, si l’objet est vide alors ouvrir le document depuis le chemin du composant.

1 « J'aime »

@sbadenis … Des retours sur tes investigations ?

@Cyril_f swchild n’est pas vide les 2 debug.Print affiche bien les variables.

@Maclane, les investigations n’ont pas pu être approfondie par manque de temps.
Mais le mode allégé (d’1seul pièce) provoque effectivement ce bug systématiquement. (comme tu le pensais)

J’ai forcé ses paramètre sur son poste pour être en résolu.

Je vais probablement devoir ajouter du code pour vérifier si l’ensemble est bien en résolu. (Au cas où même problème sur un autre poste)
Si quelqu’un à un bout de code à ce propos qui fait le taf, je suis preneur!

Sans doute une piste ici;
https://help.solidworks.com/2019/english/api/sldworksapi/Get_Component_State_Example_VB.htm

'---------------------------------------------------
' Preconditions:
' 1. Ensure that the specified assembly document
'    to open exists.
' 2. Open the Immediate window.
' 3. Run the macro.
'
' Postconditions:
' 1. Opens the assembly document.
' 2. Selects the subassembly.
' 3. Prints to the Immediate window:
'    * Paths to the assembly and subassembly documents
'    * Whether the component is hidden, fixed,
'      or suppressed
'    * Component's persistent ID
'    * Component's solving state
' 4. Examine the Immediate window.
'----------------------------------------------------

Option Explicit

Sub main()

    Dim swApp                       As SldWorks.SldWorks
    Dim swModel                     As SldWorks.ModelDoc2
    Dim swModelDocExt               As SldWorks.ModelDocExtension
    Dim swAssy                      As SldWorks.AssemblyDoc
    Dim swSelMgr                    As SldWorks.SelectionMgr
    Dim swComp                      As SldWorks.Component2
    Dim fileName                    As String
    Dim status                      As Boolean
    Dim errors                      As Long
    Dim warnings                    As Long

    Set swApp = Application.SldWorks

    ' Open assembly document
    fileName = "C:\Users\Public\Documents\SOLIDWORKS\SOLIDWORKS 2018\samples\tutorial\advdrawings\98food processor.sldasm"
    Set swModel = swApp.OpenDoc6(fileName, swDocASSEMBLY, swOpenDocOptions_e.swOpenDocOptions_Silent, "", errors, warnings)
    Set swModelDocExt = swModel.Extension
    

    ' Select subassembly
    status = swModelDocExt.SelectByID2("blade shaft-1@98food processor", "COMPONENT", 0, 0, 0, False, 0, Nothing, 0)
    Set swSelMgr = swModel.SelectionManager
    Set swAssy = swModel
    Set swComp = swSelMgr.GetSelectedObjectsComponent3(1, 0)
    

    ' Print to the Immediate window the path and state of the
    ' selected component
    Debug.Print "File = " & swModel.GetPathName
    Debug.Print "  Component   = " & swComp.Name2
    Debug.Print "    Path           = " & swComp.GetPathName
    Debug.Print "    IsHidden       = " & swComp.IsHidden(True)
    Debug.Print "    IsFixed        = " & swComp.IsFixed
    Debug.Print "    GetSuppression = " & swComp.GetSuppression
    Debug.Print "    ID             = " & swComp.GetID
    ' 0 =  if subassembly is rigid
    ' 1 =  if subassembly is flexible
    ' -1 = selected component is a part component
    Debug.Print "    Solving        = " & swComp.Solving

End Sub

et plus particulierement la commande « Solving »

....    
Debug.Print "    Solving        = " & swComp.Solving
.....
1 « J'aime »

Après un rapide test

Debug.Print " Solving = " & swComp.Solving

Ne fonctionne pas pour les pièce allégé ou résolu, mais pour un assemblage rigide, flexible ou pour une pièce.
Je continu mes investigations!

1 « J'aime »

En ajoutant ce code cela détecte si un ou plusieurs composant en en allégés et propose de les résoudre:
image

Et si la personne clique sur ok, les composants deviennent résolus.
Si elle clique sur annuler cela plante comme avant sur le composant non résolu, mais tans pis pour elle!

    Dim errors As Long
    errors = swAssy.ResolveAllLightWeightComponents(True)
    'Debug.Print ("All lightweight components resolved (0 = All components resolved)? " & errors)

Lien vers le code de l’API
https://help.solidworks.com/2021/english/api/sldworksapi/resolve_all_components_fix_a_component_example_vb.htm

1 « J'aime »