Probleem met lege variabele macro

Hallo, ik heb een probleem met een macro op een enkele van meer dan 20 werkstations gedurende 2 dagen (voordat het perfect werkte).
De variabele Set swPart blijft leeg in plaats van te vullen zoals voorheen
Stel swPart = swChildComp.GetModelDoc2() in op surrvol swPart = Niets:

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

Heeft iemand een verklaring voor dit zeer vreemde en plotselinge gedrag (geen a priori update)
Indien nodig de volledige macro (boven gedeeltelijke code)
CreateFolderByProperties.swp (118.5 kB)

Hallo

Geen idee zo. Zou Swchild ook niet leeg zijn?
Door het stap voor stap uit te rollen op de betreffende paal, gaat het dan normaal?

1 like

Hallo

Ook geen instant ideeën: Maar ik zou naar de volgende punten kijken.

  1. De manier waarop de assemblage wordt geopend.
    (moet in " Resolved " en is waarschijnlijk in " Lite ")?

  2. de ontbrekende VB-supplementen?
    (Het is onwaarschijnlijk dat er een foutmelding wordt weergegeven)

  3. Solidworks " Prestaties " tabblad: Resolutie onder assemblages?
    (Vergelijk met "functionele" posities)
    image

  4. … De lamp? (Ref: naar een oude advertentie waarvan ik de sponsor vergeten ben...)

2 likes

Hallo @tous
Het doet me denken aan het bericht " het aangeroepen object heeft de verbinding met zijn clients verbroken " de tests verlichten, verwijderen, verbergen en isloaded() waren niet genoeg, het is alsof SW ze uit het geheugen schopt (het kan te maken hebben met resource-optimalisatie :stuck_out_tongue_winking_eye:).
Ik stel voor om een voorwaarde toe te voegen, als het object leeg is, open dan het document vanaf het componentpad.

1 like

@sbadenis ... Heeft u feedback op uw onderzoeken?

@Cyril_f swchild is niet leeg de 2 debugs. Print geeft de variabelen goed weer.

@Maclane konden de onderzoeken wegens tijdgebrek niet worden verdiept.
Maar de lichtstand (1 stuk) veroorzaakt inderdaad systematisch deze bug. (zoals je dacht)

Ik dwong zijn instellingen op zijn post om in resolutie te zijn.

Ik zal waarschijnlijk wat code moeten toevoegen om te controleren of het hele ding is opgelost. (In het geval van hetzelfde probleem op een ander werkstation)
Als iemand hier een stukje code over heeft dat het werk doet, ben ik er helemaal voor!

Ongetwijfeld een voorsprong hier;
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

en meer specifiek het commando " Oplossen "

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

Na een snelle test

Debug.Print " Oplossen = " & swComp.Solving

Werkt niet voor lichtgewicht of opgeloste onderdelen, maar voor stijve, flexibele of enkeldelige montage.
Ik ga door met mijn onderzoek!

1 like

Door deze code toe te voegen, detecteert het of een of meer componenten in het licht ervan zijn en stelt het voor om ze op te lossen:
image

En als de persoon goed klikt, worden de componenten opgelost.
Als ze op annuleren klikt, crasht het zoals eerder op het onopgeloste onderdeel, maar erger voor haar!

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

Koppeling naar API-code
https://help.solidworks.com/2021/english/api/sldworksapi/resolve_all_components_fix_a_component_example_vb.htm

1 like