Makro-SW Feature-Manager Filter

Hallo
Ich möchte ein Makro erstellen, in dem ich ein Stück Daten im Feature-Manager-Filter (1) hinzufügen kann:


Und wenn möglich, prüfen Sie, ob Zone 2 nach dem Filter leer ist oder nicht.
Wenn der Filter leer ist, wird er entfernt.
Wenn nicht leere msgbox

Das Wichtigste ist, dass Sie in der Lage sind, ein Datenelement zum Filter hinzuzufügen oder daraus zu entfernen, die Überprüfung (gültig oder nicht leer) bleibt zweitrangig.
Ich habe diese Funktion gefunden, ohne wirklich ein Beispiel zu haben:


Wenn jemand ein Beispiel oder eine Idee hat, wie man diese Funktion verwendet.

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

1 „Gefällt mir“

Ich habe diesen Code gesehen, aber für mich verwendet er den Filter nicht und bei großen Assemblys wie mir denke ich, dass die Suche viel langsamer sein wird.
Wenn ich wirklich keine andere Wahl habe, würde ich es versuchen.
Aber unsere Lösung über den Filter scheint sehr schnell zu gehen, wenn man sie von Hand eintippt?
Ich möchte diese Suche nur automatisieren, indem ich sie in ein anderes Makro integriere.
Und wenn möglich, fügen Sie dann die Suche einmal gefiltert hinzu if=0 keine Nachricht und if >0 Nachricht

Technisch sieht die Verwendung des Fitre wie folgt aus:

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

Es funktioniert, in diesem Beispiel werden nur die " Unterlegscheiben " gefiltert. Nur gibt es ein Problem (und nicht das letzte), ich schaffe es nicht, die Filtration " abzubrechen  " ...

1 „Gefällt mir“

Ich habe diesen Code gerade Schritt für Schritt getestet:

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

Der Filter gilt für das Grafikfenster (CAD-Artikel), in diesem Grafikbereich erscheint nur mein gefiltertes Artikel.
Auf der anderen Seite bleibt der Feature-Manager starr. (Vollständige Baumstruktur der Baugruppe und nichts Sichtbares im Filter.
Fehler in meiner Version 2023 SP05 oder normales Verhalten?
Oder schlechte Funktion?

@Maclane einen Filter abzubrechen, müssen Sie "  " in value oder searchtext="  " für Ihren Code eingeben

Gleiches Verhalten mit Ihrem Code:

Auf der rechten Seite befinden sich nur die Unterlegscheiben.
Aber nichts im Feature-Manager.
Makro-Methode:


Manuelle Methode:

unter Solidworks 2022 die gleiche Beobachtung, nur die grafische Ansicht ist betroffen.

1 „Gefällt mir“

@sbadenis : bei Ihnen vor Ort auch die Bestellung:
searchtext=« »
Ist unglaublich langsam?

Ich habe es versucht mit:
searchtext= vbNullString
Aber besser geht es nicht...

1 „Gefällt mir“

Haben Sie sich die TreeManager-Seite der Mycad-Tools angesehen (sie ist in der Dropdown-Liste "Referenzwerkzeuge" versteckt):
image

Dies erfüllt natürlich nicht alle Ihre Anforderungen, ist aber auch eine Option für die Filtration nach mehreren Kriterien:

Hinweis: Es fällt mir wirklich schwer, die Logik von Visiativ zu verstehen, die darin besteht, ihre Tools zu verstecken oder sie sogar nicht mehr standardmäßig zu installieren... Es fördert nicht den Konsum...


Möglicherweise gibt es einen anderen möglichen Weg, indem Sie die erweiterten Auswahlen durchlaufen.
image
(oft vergessene Option von Solidworks).

Einige VBA-Beispiele sind in der API-Hilfe verfügbar:
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
Bearbeiten: Ich habe gerade festgestellt, dass dies die Funktion ist, die von dem oben erwähnten CodeStack-Makro verwendet wird ...

2 „Gefällt mir“

@Maclane Ja, auch bei mir dauert es " 2 Stunden ", um die Aussicht aufzufrischen!
Für die Verwendung von TreeManager ist es nicht möglich, dies in einem vorhandenen Makro hinzuzufügen.
Wenn ich ein ext-Dienstprogramm in SW durchlaufe, werden die Designer dies nicht systematisch tun und dahinter Fehler erzeugen: Zu ersetzende Teile werden nicht erkannt.
Bei der begrenzten Anzahl an Dienstprogrammen denke ich, dass es nicht an Visiativ liegt, sondern an Windows oder Dassault Ich weiß nicht, wer diese Einschränkung erstellt hat (vgl. Hotline)
Für die erweiterte Auswahl habe ich gerade getestet, dass es für Teile in der Baugruppe funktioniert, aber in einer Unterbaugruppe findet es das Teil nicht mehr.
Es schien perfekt!

1 „Gefällt mir“

Da es mir nicht gelang, eine zuverlässige Lösung über APIs zu finden, habe ich ein Makro entwickelt.
Er durchläuft die Baumstruktur (mit den Unterebenen) und exportiert dann einen HTML-Bericht.
Hier ist der Code für diejenigen, die ihn wollen.

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

Und das Klassenmodul (mit dem Namen clsObject):

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

Vielen Dank @Maclane für die Vorschläge und die Bestätigung des Fehlers, der mich von meiner 1. Idee abgelenkt hat.

2 „Gefällt mir“

Am Ende war die Wahrheit woanders.

2 „Gefällt mir“

Vielen Dank @Sylk hat 2 Finger, um Sie als beste Antwort zu setzen! :rofl: :rofl: :rofl:

2 „Gefällt mir“