Makro SW Menedżer funkcji Filtr

Witam
Chciałbym utworzyć makro, w którym mogę dodać fragment danych w filtrze menedżera funkcji (1):


A jeśli to możliwe, sprawdź, czy strefa 2 jest pusta, czy nie za filtrem.
Jeśli filtr jest pusty, jest usuwany.
Jeśli nie, pusta skrzynka msgbox

Najważniejsze jest, aby móc dodać lub usunąć fragment danych z filtra, weryfikacja (żywotność lub nie puste) pozostałaby drugorzędna.
Znalazłem tę funkcję, nie mając tak naprawdę przykładu:


Jeśli ktoś ma przykład lub pomysł jak wykorzystać tę funkcję.

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

1 polubienie

Widziałem ten kod, ale dla mnie nie korzysta z filtra i na dużych złożeniach takich jak ja myślę, że wyszukiwanie będzie znacznie wolniejsze.
Gdybym naprawdę nie miał wyboru, poszedłbym na to.
Ale nasze rozwiązanie za pomocą filtra wydaje się bardzo szybkie, gdy wpisujemy je ręcznie?
Chcę tylko zautomatyzować to wyszukiwanie, integrując je z innym makrem.
A jeśli to możliwe, dodaj wyszukiwanie raz przefiltrowane, jeśli = 0 wiadomość i jeśli > wiadomość

Technicznie zastosowanie fitre wygląda następująco:

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

Działa to w tym przykładzie, filtrowane są tylko " podkładki ". Tylko jest problem (i nie najmniejszy), nie mogę się " anulować " filtracji...

1 polubienie

Właśnie przetestowałem ten kod krok po kroku:

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

Filtr obowiązuje do okna graficznego (część CAD), w tym obszarze graficznym pojawia się tylko moja przefiltrowana część.
Z drugiej strony menedżer funkcji pozostaje niezmieniony. (kompletna struktura drzewa zestawu i nic nie widać w filtrze.
Błąd w mojej wersji SP05 2023 lub normalne zachowanie?
A może zła funkcja?

@Maclane anulować filtr, musisz wpisać "  " w value lub searchtext="  " dla swojego kodu

To samo zachowanie z kodem:

Po prawej stronie pojawiają się tylko podkładki.
Ale nic w menedżerze funkcji.
Metoda makro:


Metoda ręczna:

w Solidworks 2022 ta sama obserwacja, ma to wpływ tylko na widok graficzny.

1 polubienie

@sbadenis : u Państwa również zamówienie:
searchtext=« »
Jest niesamowicie wolny?

Próbowałem z:
searchtext= vbNullString
ale nie jest lepiej...

1 polubienie

Czy spojrzałeś na stronę TreeManager narzędzi Mycad (jest ona ukryta w rozwijanym menu "narzędzia referencyjne"):
image

To oczywiście nie spełnia wszystkich Twoich potrzeb, ale jest to również opcja dla filtracji wielokryterialnej:

Uwaga: Naprawdę trudno mi zrozumieć logikę Visiativ, która polega na ukrywaniu swoich narzędzi, a nawet na zaprzestaniu ich domyślnego instalowania... Nie zachęca do konsumpcji...


może istnieć inna możliwa ścieżka, przechodząc przez Zaawansowane wybory.
image
(często zapominana opcja Solidworks).

Niektóre przykłady języka VBA są dostępne w Pomocy interfejsu API:
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
Edycja: Właśnie zdałem sobie sprawę, że jest to funkcja używana przez makro CodeStack wspomniane powyżej...

2 polubienia

@Maclane Tak, u mnie odświeżenie widoku zajmuje " 2 godziny "!
Do korzystania z TreeManager nie jest to możliwe, chcę dodać to w istniejącym makrze.
Jeśli przejdę przez narzędzie ext w oprogramowaniu, projektanci nie będą tego robić systematycznie, a za nim generowane są błędy, części do wymiany nie są wykrywane.
W przypadku ograniczonej liczby narzędzi myślę, że nie jest to spowodowane Visiativ, ale Windows lub Dassault nie wiem, kto stworzył to ograniczenie (por. infolinia)
W przypadku wyboru zaawansowanego właśnie przetestowałem, że działa dla części w złożeniu, ale w podzespole nie znajduje już części.
Wydawało się idealne!

1 polubienie

Nie mogąc znaleźć niezawodnego rozwiązania za pośrednictwem interfejsów API, opracowałem makro.
Przechodzi przez strukturę drzewa (z podpoziomami), a następnie eksportuje raport html.
Oto kod dla tych, którzy tego chcą.

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

I moduł klasy (który ma się nazywać clsObject):

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

Dziękuję @Maclane za propozycje i potwierdzenie błędu, który odwrócił moją uwagę od mojego 1. pomysłu.

2 polubienia

W końcu prawda leżała gdzie indziej.

2 polubienia

Dziękuję@Sylk ma 2 palce, aby umieścić Cię jako najlepszą odpowiedź! :rofl: :rofl: :rofl:

2 polubienia