Macro SW Functiebeheer Filter

Hallo
Ik wil graag een macro maken waar ik een stukje data aan kan toevoegen in de feature manager filter (1):


En controleer indien mogelijk of zone 2 leeg is of niet na het filter.
Als het leeg is, wordt het filter verwijderd.
Indien niet leeg, maak dan de msgbox leeg

Het belangrijkste is om een stukje gegevens uit het filter te kunnen toevoegen of verwijderen, de verificatie (leven of niet leeg) blijft secundair.
Ik heb deze functie gevonden zonder echt een voorbeeld te hebben:


Als iemand een voorbeeld of idee heeft van hoe deze functie te gebruiken.

Bonjour;
Bah, comme souvent il y a CodeStack: (Non testé)

1 like

Ik zag deze code, maar voor mij gebruikt het niet het filter en op grote assemblages zoals ik, denk ik dat het zoeken veel langzamer zal zijn.
Als ik echt geen keus heb, zou ik ervoor gaan.
Maar onze oplossing via het filter lijkt erg snel door het met de hand te typen?
Ik wil deze zoekopdracht gewoon automatiseren door deze in een andere macro te integreren.
En indien mogelijk voeg dan de zoekopdracht toe: eenmaal gefilterd als=0 geen bericht en indien >0 bericht

Technisch gezien ziet het gebruik van de fitre er als volgt uit:

Sub FiltrerFeatureManager()
    Dim swApp As SldWorks.SldWorks
    Dim swModel As SldWorks.ModelDoc2
    Dim searchText As String

    ' Initialiser l'application SolidWorks
    Set swApp = Application.SldWorks
    ' Obtenir le modèle actif
    Set swModel = swApp.ActiveDoc

    ' Vérifier si un document est ouvert
    If swModel Is Nothing Then
        MsgBox "Aucun document ouvert."
        Exit Sub
    End If

    ' Définir le texte de recherche
    searchText = "Rondelle"

    ' Définir le texte de filtrage dans le FeatureManager
    swModel.Extension.FeatureManagerFilterString = searchText

    ' Forcer la mise à jour de l'interface utilisateur
    swModel.GraphicsRedraw2
End Sub

Het werkt, in dit voorbeeld worden alleen de " ringen " gefilterd. Alleen is er een probleem (en niet het minste), het lukt me niet om de filtratie te " annuleren "...

1 like

Ik heb deze code net stap voor stap getest:

Option Explicit
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swModelDocExt As SldWorks.ModelDocExtension
Dim value As String
Dim value2 As String

Sub main()
    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
    Set swModelDocExt = swModel.Extension


    value = "Tôle passage réduit"
    'value = swModelDocExt.FeatureManagerFilterString
    swModelDocExt.FeatureManagerFilterString = value
    value2 = swModelDocExt.FeatureManagerFilterString
    Debug.Print value2
    swModelDocExt.FeatureManagerFilterString = ""
    'swModel.ClearSelection2 True
End Sub

Het filter is van toepassing op het grafische venster (CAD-gedeelte), alleen het gefilterde deel verschijnt in dit grafische gebied.
Aan de andere kant blijft de functiebeheerder vast. (volledige boomstructuur van het geheel en niets zichtbaar in het filter.
Bug in mijn 2023 SP05-versie of normaal gedrag?
Of slechte functie?

@Maclane een filter te annuleren, moet u "  " in waarde of searchtext="  " voor uw code invoeren

Hetzelfde gedrag met uw code:

Aan de rechterkant verschijnen alleen de ringen.
Maar niets in de functiebeheerder.
Macro methode:


Handmatige methode:

onder Solidworks 2022 dezelfde observatie, alleen de grafische weergave wordt beïnvloed.

1 like

@sbadenis : bij u thuis ook de bestelling:
searchtext=« »
Is ongelooflijk traag?

Ik probeerde het met:
searchtext= vbNullString
Maar het is niet beter...

1 like

Heb je gekeken naar de TreeManager-kant van de Mycad-tools (deze is verborgen in de vervolgkeuzelijst "referentietools"):
image

Dit voldoet uiteraard niet aan al uw behoeften, maar het is ook een optie voor filtratie op meerdere criteria:

Opmerking: Ik heb echt moeite om de Visiativ-logica te begrijpen, die bestaat uit het verbergen van hun tools, of zelfs niet meer standaard te installeren... Het moedigt de consumptie niet aan...


er kan een ander mogelijk pad zijn door door de geavanceerde selecties te gaan.
image
(vaak vergeten optie van Solidworks).

Enkele VBA-voorbeelden zijn beschikbaar in de API Helps:
https://help.solidworks.com/2022/english/api/sldworksapi/Use_Advanced_Component_Selection_Example_VB.htm?verRedirect=1
https://help.solidworks.com/2022/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.iadvancedselectioncriteria.html
Edit: Ik realiseerde me net dat dit de functie is die wordt gebruikt door de hierboven genoemde CodeStack-macro ...

2 likes

@Maclane Ja, ook voor mij duurt het " 2 uur " om het uitzicht op te frissen!
Voor het gebruik van TreeManager, niet mogelijk wil ik dit toevoegen in een bestaande macro.
Als ik via een ext hulpprogramma in SW de ontwerpers zullen het niet systematisch doen en daarachter genereert fouten onderdelen die moeten worden vervangen niet gedetecteerd.
Voor het beperkte aantal hulpprogramma's denk ik dat het niet te wijten is aan Visiativ, maar aan Windows of Dassault, ik weet niet wie deze beperking heeft gemaakt (cf-hotline)
Voor de geavanceerde selectie heb ik zojuist getest dat het werkt voor onderdelen in de assemblage, maar in een subassemblage vindt het het onderdeel niet meer.
Het leek perfect!

1 like

Omdat ik er niet in slaagde om via API's een betrouwbare oplossing te vinden, heb ik een macro ontwikkeld.
Het doorloopt de boomstructuur (met de subniveaus) en exporteert vervolgens een html-rapport.
Hier is de code voor degenen die het willen.

Option Explicit
'U:\Bibliothèque\Equipements\Encaisseuses\Picking\Spécifiques\MSG N°194-MSG COMPACT DUAL M3R2\1-Dessins\AS_111792.SLDASM
Private Declare PtrSafe Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hWnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long


Dim swApp                       As SldWorks.SldWorks
Dim swModel                     As SldWorks.ModelDoc2
Dim swConf                      As SldWorks.Configuration
Dim swRootComp                  As SldWorks.Component2
Dim k                           As Integer
Dim dictionary                  As Object
Dim Values                      As clsObject
Dim CompModel                   As ModelDoc2
Dim Ret                         As Boolean
Dim htmlPath                    As String



Sub main()

    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
    Set swConf = swModel.GetActiveConfiguration
    Set swRootComp = swConf.GetRootComponent
    Set dictionary = CreateObject("Scripting.Dictionary")

    TraverseComponentRecherchePropriete swRootComp, 1
    
    'Lecture du Dictionnaire:
        Dim TestvaleurDico As Variant
        'Debug.Print dictionary.count
        If dictionary.count <> 0 Then
        
        'Création du fichier html
        Dim xFile As Integer
        Dim S1 As String

 
       xFile = FreeFile
       
       'Emplacement de sauvegarde des options
        htmlPath = Environ("USERPROFILE") & "\.Rapports_SW\"
            
        'On vérifie si le dossier de sauvegarde existe sinon création de ce dossier
        If Dir(htmlPath, vbDirectory + vbHidden) = "" Then
            MkDir htmlPath
        End If
   
        Open htmlPath & "RapportIndiçage.html" For Output As xFile
    
           Print #xFile, "<HTML>"
           Print #xFile, "<HEAD>"
           Print #xFile, "<TITLE>Liste fichiers</TITLE>"
           Print #xFile, "</HEAD>"
    
           Print #xFile, ""
           Print #xFile, "<BODY TEXT=""#000000"" >"
           Print #xFile, " <h1><B>Liste des fichiers indicés à remplacer</B> </h1>"
           Print #xFile, "<BR><BR>"
           
            For Each TestvaleurDico In dictionary.Keys
                '<a href="file:///D:/doc/monfichier.pdf">monfichier</a>
                Print #xFile, "Nom: " & TestvaleurDico & "-> Désignation: " & dictionary(TestvaleurDico).Designation
                Print #xFile, "<BR><BR>"
                Print #xFile, "Chemin: " & dictionary(TestvaleurDico).Chemin
                Print #xFile, "<BR><BR>"
            Next TestvaleurDico
           

           Print #xFile, "<BR><BR>"
           Print #xFile, "</BODY>"
           Print #xFile, "</HTML>"
       Close xFile
 
        'Ouvre le fichier html
        Ret = ShellExecute(0, "open", "RapportIndiçage.html", vbNullString, htmlPath, 1)
        End If

        


    Set TestvaleurDico = Nothing
    Set dictionary = Nothing
End Sub


 



Sub TraverseComponentRecherchePropriete(swComp As SldWorks.Component2, nLevel As Long)

    Dim vChildComp                  As Variant
    Dim swModelComponent            As SldWorks.ModelDoc2
    Dim swChildComp                 As SldWorks.Component2
    Dim swCompConfig                As SldWorks.Configuration
    Dim myBool                      As String
    Dim sPadStr                     As String
    Dim i                           As Long
    Dim Part                        As SldWorks.ModelDoc2
    Dim Propriete                   As String
    
    For i = 0 To nLevel - 1
        sPadStr = sPadStr + "  "
    Next i
    
    vChildComp = swComp.GetChildren
    Propriete = "Designation"
    
    For i = 0 To UBound(vChildComp)
        Set swChildComp = vChildComp(i)
        Set swModelComponent = swChildComp.GetModelDoc
        
        TraverseComponentRecherchePropriete swChildComp, nLevel + 1 'multi niveau
        'Debug.Print "Name2 : " & swChildComp.Name2 & vbCrLf & "ReferencedConfiguration: " & swChildComp.ReferencedConfiguration

        boucle "Designation", "", "", "", swModelComponent, swChildComp.ReferencedConfiguration, swChildComp
    Next i
    

      
End Sub




Sub boucle(Propriete, proprieteTab, proprieteTab_Prop, t, swModelComponent, swChildCompRC, swChildComp)
        
        If Not swModelComponent Is Nothing Then
            'Debug.Print swModelComponent.GetCustomInfoValue("", Propriete)
            Set CompModel = swChildComp.GetModelDoc2
            If InStr(swModelComponent.GetCustomInfoValue("", Propriete), "Remplac") > 1 Then
                        Set Values = New clsObject
                        Values.Chemin = swChildComp.GetPathName()
                        'Values.Nom = swChildComp.Name2
                        Values.Designation = swModelComponent.GetCustomInfoValue("", Propriete)
                        
                        If dictionary.Exists(CompModel.GetTitle) Then
                            Set dictionary(CompModel.GetTitle) = Values
                        Else
                            dictionary.Add CompModel.GetTitle, Values
                        End If
                        'Debug.Print swChildComp.Name2
                        'Debug.Print CompModel.GetTitle
                        'Debug.Print swChildComp.GetPathName()
                        'Debug.Print swModelComponent.GetCustomInfoValue("", Propriete)
            End If
            If InStr(swModelComponent.GetCustomInfoValue(swChildCompRC, Propriete), "Remplac") > 1 Then
                        Set Values = New clsObject
                        Values.Chemin = swChildComp.GetPathName()
                        'Values.Nom = swChildComp.Name2
                        Values.Designation = swModelComponent.GetCustomInfoValue(swChildCompRC, Propriete)
                        
                        If dictionary.Exists(CompModel.GetTitle) Then
                            Set dictionary(CompModel.GetTitle) = Values
                        Else
                            dictionary.Add CompModel.GetTitle, Values
                        End If
                        'Debug.Print swChildComp.Name2
                        'Debug.Print swChildComp.GetPathName()
                        'Debug.Print swModelComponent.GetCustomInfoValue("", Propriete)
            End If
        End If
End Sub


'Public Chemin As String, Designation As String, Nom As String
Sub AddValues()
    For k = 2 To 3
        Set Values = New clsPerson

        Values.Chemin = "Chemin"
        Values.Designation = "Designation"
        'Values.Nom = "Nom"
        
        If dictCompany.Exists(k) Then
            Set dictCompany(k) = Values
        Else
            dictCompany.Add k, Values
        End If
    Next k
End Sub

En de class module (Te noemen clsObject):

Public Chemin As String, Designation As String ', Nom As String

Bedankt @Maclane voor de voorstellen en de bevestiging van de bug, die me afleidde van mijn 1e idee.

2 likes

Uiteindelijk lag de waarheid elders.

2 likes

Bedankt @Sylk 2 vingers heeft om je als het beste antwoord te geven! :rofl: :rofl: :rofl:

2 likes