Problem z makrem pustej zmiennej

Witam, mam problem z makrem na jednej z ponad 20 stacji roboczych od 2 dni (zanim działało idealnie).
Zmienna Set swPart pozostaje pusta, a nie wypełniana jak poprzednio
Ustaw swPart = swChildComp.GetModelDoc2() na 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

Czy ktoś ma wytłumaczenie dla tego bardzo dziwnego i nagłego zachowania (brak aktualizacji a priori)
W razie potrzeby pełne makro (powyżej częściowy kod)
CreateFolderByProperties.swp (118,5 KB)

Witam

Nie mam takiego pojęcia. Czy Swchild też nie byłby pusty?
Czy rozwijając go krok po kroku na danym poście, idzie to normalnie?

1 polubienie

Witam

Nie ma też natychmiastowych pomysłów: Ale przyjrzałbym się następującym punktom.

  1. Sposób otwierania podzespołu.
    (powinien być w " Resolved " i prawdopodobnie jest w " Lite ")?

  2. brakujące suplementy VB?
    (Mało prawdopodobne, że powinien pojawić się komunikat o błędzie)

  3. Zakładka Solidworks " Wydajność ": Rozdzielczość w złożeniach?
    (Porównaj z pozycjami "funkcjonalnymi")
    image

  4. … Lampa? (Ref: do starej reklamy, której sponsora zapomniałem...)

2 polubienia

Witam @tous
Przypomina mi to komunikat " wywoływany obiekt odłączył się od swoich klientów " testy lighten, delete, hide i isloaded() nie wystarczyły, to tak, jakby SW wyrzucił je z pamięci (może to być związane z optymalizacją zasobów :stuck_out_tongue_winking_eye:).
Proponuję dodać warunek, jeśli obiekt jest pusty, otwórz dokument ze ścieżki komponentu.

1 polubienie

@sbadenis ... Jakieś uwagi na temat prowadzonych dochodzeń?

@Cyril_f swchild nie jest puste 2 debugowania. Druk dobrze wyświetla zmienne.

@Maclane śledztwa nie można było pogłębić ze względu na brak czasu.
Ale tryb jasny (1 sztuka) rzeczywiście powoduje ten błąd systematycznie. (jak myślałeś)

Wymusiłem jego ustawienia w jego poście, aby były w rozdzielczości.

Prawdopodobnie będę musiał dodać jakiś kod, aby sprawdzić, czy cała sprawa została rozwiązana. (W przypadku tego samego problemu na innej stacji roboczej)
Jeśli ktokolwiek ma kawałek kodu na ten temat, który spełnia swoje zadanie, jestem za tym!

Bez wątpienia jest to trop;
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

a dokładniej polecenie " Rozwiązywanie "

....    
Debug.Print "    Solving        = " & swComp.Solving
.....
1 polubienie

Po szybkim teście

Debug.Print " Solving = " & swComp.Solving

Nie sprawdza się w przypadku lekkich lub rozwiązanych części, ale w przypadku montażu sztywnego, elastycznego lub jednoczęściowego.
Kontynuuję moje śledztwo!

1 polubienie

Dodając ten kod, wykrywa, czy jeden lub więcej komponentów znajduje się w jego świetle i proponuje ich rozwiązanie:
image

A jeśli dana osoba kliknie dobrze, komponenty zostaną rozwiązane.
Jeśli kliknie Anuluj, zawiesza się jak poprzednio na nierozwiązanym komponencie, ale gorzej dla niej!

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

Link do kodu API
https://help.solidworks.com/2021/english/api/sldworksapi/resolve_all_components_fix_a_component_example_vb.htm

1 polubienie