Makroerstellung von Ordnern in der Furcht + Klassifizierung nach Eigenschaft

Hallo

In meinen Baugruppen möchte ich mit Hilfe eines Makros (vba) den Ordner FI und Schrauben erstellen und alle Teile bzw. Baugruppen der 1. Ebene in diese Ordner verschieben.

Dafür suche ich nach Möglichkeiten, um:

1-Rufen Sie den Namen jedes Teils oder jeder Baugruppe der 1. Ebene ab

2-Rufen Sie die Kategorieeigenschaft jedes dieser Teile oder Baugruppen ab.

3-Erstellen Sie einen Ordner im Feature-Manager

4-Verschieben Sie Teile oder Baugruppen mit der Eigenschaftskategorie = in Schrauben oder Industriebedarf in den entsprechenden Ordner

 

Wenn Sie Hinweise für den einen oder anderen der Schritte (Verfahren oder sogar Beispiel) haben, könnte es mir sehr helfen ;-)

 

Vielen Dank

Sebastian

Hallo

Punkt 1: GetChildren-Funktion mit einem Beispiel HIER

Punkt 2: GetModelDoc2-Funktion

Punkt 3: Ich erinnere mich nicht, es kommt später wieder.

Punkt 4: Wie Punkt 3

Herzliche Grüße

2 „Gefällt mir“

Punkte 3 und 4: Funktion InsertFeatureTreeFolder2 mit einem Beispiel HIER

Herzliche Grüße

2 „Gefällt mir“

Hallo

Und hier ist das vollständige Beispiel:

Option Explicit

' ce code nécessite que la référence "Microsoft Scripting Runtime" soit activée
Dim MonDico As New Scripting.Dictionary

Sub main()
    Dim swApp As SldWorks.SldWorks
    Dim swModel As SldWorks.ModelDoc2
    Dim swAssy As SldWorks.AssemblyDoc
    Dim featureMgr As SldWorks.FeatureManager
    Dim feature As SldWorks.feature
    Dim swConf As SldWorks.Configuration
    Dim swRootComp As SldWorks.Component2
    Dim bRet As Boolean
    Dim Compteur As Long
    Dim TestValeurDico As Variant

    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
    Set swConf = swModel.GetActiveConfiguration
    Set swRootComp = swConf.GetRootComponent

    TraverseComponent swRootComp, swRootComp.Name2, "catégorie", "visserie"
    
    Compteur = 1
    For Each TestValeurDico In MonDico.Keys
        Classement swModel, MonDico(TestValeurDico), Compteur, "Visserie"
        Compteur = Compteur + 1
    Next TestValeurDico
    Set MonDico = Nothing
    
    Set swModel = swApp.ActiveDoc
    Set swConf = swModel.GetActiveConfiguration
    Set swRootComp = swConf.GetRootComponent
    
    TraverseComponent swRootComp, swRootComp.Name2, "catégorie", "Fourniture industrielle"
    
    Compteur = 1
    For Each TestValeurDico In MonDico.Keys
        Classement swModel, MonDico(TestValeurDico), Compteur, "FI"
        Compteur = Compteur + 1
    Next TestValeurDico
    Set MonDico = Nothing
End Sub

Sub TraverseComponent(swComp As SldWorks.Component2, nomAsm As String, nomVar As String, resultVar As String)
    Dim vChildCompArr As Variant
    Dim vChildComp As Variant
    Dim swChildComp As SldWorks.Component2
    Dim swSelModel As SldWorks.ModelDoc2
    Dim swCompConfig As SldWorks.Configuration
    Dim Compteur As Long
    
    Compteur = 1
    vChildCompArr = swComp.GetChildren
    For Each vChildComp In vChildCompArr
        Set swChildComp = vChildComp
        If Not swChildComp Is Nothing Then
            Set swSelModel = swChildComp.GetModelDoc2
            GetPropChildren swSelModel, nomAsm, swChildComp.Name2, nomVar, resultVar, Compteur
        End If
        Compteur = Compteur + 1
    Next
End Sub

Sub GetPropChildren(swChild As SldWorks.ModelDoc2, nomAsm As String, nomPrt As String, nomVar As String, resultVar As String, Cle As Long)
    Dim swModelDocExtension As SldWorks.ModelDocExtension
    Dim swCustPropMgr As SldWorks.CustomPropertyManager
    Dim nbrProps As Long
    Dim vpropsnames As Variant
    Dim k As Long
    Dim valeur As String
    Dim val As String
    Dim valout As String
    Dim boolstatus As Boolean
    
    Set swModelDocExtension = swChild.Extension
    Set swCustPropMgr = swModelDocExtension.CustomPropertyManager("")
    
    nbrProps = swCustPropMgr.count
    vpropsnames = swCustPropMgr.GetNames
    
    For k = 0 To nbrProps - 1
        If vpropsnames(k) = nomVar Then
            boolstatus = swCustPropMgr.Get4(nomVar, False, val, valout)
            If valout = resultVar Then
                valeur = nomPrt & "@" & nomAsm
                If Not MonDico.Exists(Cle) Then
                    MonDico.Add Cle, valeur
                End If
            End If
        End If
    Next k
End Sub

Sub Classement(swModel As SldWorks.ModelDoc2, nomComposant As String, Nbr As Long, nomDossier As String)
    Dim swAssy As SldWorks.AssemblyDoc
    Dim featureMgr As SldWorks.FeatureManager
    Dim feature As SldWorks.feature
    Dim swConf As SldWorks.Configuration
    Dim swRootComp As SldWorks.Component2
    Dim bRet As Boolean
    Dim modelDocExt As SldWorks.ModelDocExtension
    Dim selectionMgr As SldWorks.selectionMgr
    Dim selObj As Object
    Dim status As Long
    Dim count As Long
    Dim i As Long
    Dim componentToMove As SldWorks.Component2
    Dim componentsToMove() As Object
    Dim retVal As Boolean

    swModel.ClearSelection2 True
    
    Set modelDocExt = swModel.Extension
    Set selectionMgr = swModel.SelectionManager

    status = modelDocExt.SelectByID2(nomComposant, "COMPONENT", 0, 0, 0, True, 0, Nothing, 0)
    Set selObj = selectionMgr.GetSelectedObject6(Nbr, -1)
    count = selectionMgr.GetSelectedObjectCount2(0)
    ReDim componentsToMove(count - 1)
    For i = 0 To count - 1
        Set componentToMove = selectionMgr.GetSelectedObjectsComponent4(i + 1, 0)
        Set componentsToMove(i) = componentToMove
    Next

    Dim erreur As String
    erreur = "Oui"
    Set swAssy = swModel
    Set featureMgr = swAssy.FeatureManager
    Set feature = swModel.FirstFeature
    Do While Not feature Is Nothing
        If feature.Name = nomDossier Then
            erreur = "Non"
        End If
        Set feature = feature.GetNextFeature
    Loop
    If erreur = "Oui" Then
        Set feature = featureMgr.InsertFeatureTreeFolder2(swFeatureTreeFolder_EmptyBefore)
        feature.Name = nomDossier
    End If
    
    Set feature = swAssy.FeatureByName(nomDossier)
    retVal = swAssy.ReorderComponents(componentsToMove, feature, swReorderComponents_LastInFolder)
    
    swModel.ClearSelection2 True
End Sub

Herzliche Grüße


macroranking3d.swp
2 „Gefällt mir“

Danke @d.roger , es ist eher eine Strecke, es ist eine Autobahn, die du für mich gemacht hast!

Es hilft mir sehr, ich war nicht so weit, eher sehr weit von dort entfernt...

Ich habe noch ein Problem für 1 Sonderfall:

Teile, die mit einer Teilefamilie erstellt wurden, bei denen die Kategorie in der Konfiguration ausgefüllt ist (z. B. Schrauben oder andere), werden ignoriert, ich müsste eine Bedingung hinzufügen, wenn die Eigenschaft "Kategorie" leer ist, dann schauen Sie sich die Konfigurationseigenschaft an.

 

Schließlich muss ich auch eine Verbesserung hinzufügen, um die Ordner Schrauben und FI beim Starten des Makros zu löschen, wenn sie bereits vorhanden sind. (für den Fall, dass wir das Makro nach dem Hinzufügen neuer Coins neu starten)

Und zum Schluss möchte ich die 2 Ordner nach Möglichkeit ganz nach unten in den Feature-Manager verschieben (keine Möglichkeit, den Ordner zu verschieben).

 

 

Hallo

Hier ist eine neue Version, die es Ihnen ermöglicht, Ordner beim Start zu löschen, wenn sie vorhanden sind, und auch nach dem Wert der Variablen in allen Konfigurationen von 3D-Elementen zu suchen.

Ich habe nicht versucht, die Ordner an das Ende des Feature-Managers zu setzen, wir werden später sehen, ob ich die Zeit dazu habe.

Eine kleine Erinnerung, dies ist nur ein Beispiel, damit das Fehlermanagement noch nicht abgeschlossen ist...

Herzliche Grüße


macroranking3d.swp
2 „Gefällt mir“

Neueste Version, die mit der Positionierung der Ordner am Ende des Feature-Managers ...

Herzliche Grüße


macroranking3d.swp
3 „Gefällt mir“

Ich teste es tagsüber, wenn ich 15-20 Minuten finden kann, aber auf den ersten Blick scheint es perfekt zu funktionieren!

Für die Wörterbuchstruktur entdecke ich etwas Neues, in der Ausarbeitung von Makros. Vielen Dank.

Ich werde am Ende des Tages wiederkommen, wenn alles gut geht.

 

Und danke @d.roger , dass du dir die Zeit genommen hast, dir das alles anzusehen.

Nach dem Test:

Es gibt noch mindestens 2  Fehler zu beheben:

- Wenn sich ein Teil im gelöschten Zustand befindet (Nr. 1-Bild1) - > unmöglich, die Standardkonfiguration zu finden -> Fehler -> Ich muss herausfinden, wie ich es ignorieren kann, wenn sich das Teil im Löschzustand befindet. (für Bug 2 zurückgesetzt, nicht gelöscht)

- Das Verschieben des Ordners funktioniert nicht gut, der WELL-Ordner befindet sich ganz unten, aber alle Teile unterhalb des 1. zu verschiebenden Ordners befinden sich auch im Ordner.

Außerdem kann der Ordner nicht mit dem Pfeil "erweitert" werden, um seinen Inhalt zu sehen.

Ohne die Verschiebung hingegen ist der Pfeil da.

Ich denke, es verschiebt alle Elemente unterhalb des Ordners dorthin, einschließlich der anderen Ordner, die als nächstes erstellt werden.

Beispiel vor Makro (Bild 1)

In der Baugruppe Nr. 1 wegen Fehler 1 entfernt

in Nr. 2 (Schrauben)

In Nr. 3 und 4 (FI)

 

Angehängt, meine Testassembly und das Makro mit den Eigenschaften mit dem richtigen Fall (Fehler meinerseits beim 1. Beitrag).


test_dossiers.zip

Hallo

Hier ist eine neue Version, die es Ihnen ermöglicht, Elemente zu vermeiden, die sich im gelöschten Zustand befinden, ich habe die Zeilen entfernt, die die Ordner verschieben, weil es in der Tat in einigen Fällen Fehler macht (darüber nachzudenken, wie man es macht, aber nicht zu viel Zeit für den Moment).

Herzliche Grüße


macroclassement3d_1.swp
2 „Gefällt mir“

Hallo

Vielen Dank für die neueste Version, die das Problem bei gelöschten Teilen effektiv löst.

Ich werde das Thema trotz des Fehlers beim Verschieben des Ordners schließen, der aber in der grundlegenden Frage nicht angefordert wurde.

Für den Ordnerumzug habe ich einige Ideen:

- Verschieben Sie zuerst die Teile und nicht den Ordner und erstellen Sie dann den Ordner

- Finden Sie heraus, warum dieser Fehler auftritt (indem Sie die Frage im speziellen Solidworks Makroforum stellen)

Für den Rest ist das Makro perfekt funktionsfähig und ich danke Ihnen @ d.roger für die perfekte Arbeit, es hat mir mehr als wertvolle Zeit gespart, während ich einen viel saubereren Code hatte als das, was ich mit meinem Anfängerniveau gemacht hätte.
 

 

Hallo

Vielen Dank für die neueste Version, die das Problem bei gelöschten Teilen effektiv löst.

Ich werde das Thema trotz des Fehlers beim Verschieben des Ordners schließen, der aber in der grundlegenden Frage nicht angefordert wurde.

Für den Ordnerumzug habe ich einige Ideen:

- Verschieben Sie zuerst die Teile und nicht den Ordner und erstellen Sie dann den Ordner

- Finden Sie heraus, warum dieser Fehler auftritt (indem Sie die Frage im speziellen Solidworks Makroforum stellen)

Für den Rest ist das Makro perfekt funktionsfähig und ich danke Ihnen @d.roger für die perfekte Arbeit, es hat mir mehr als wertvolle Zeit gespart, während ich einen viel saubereren Code hatte, als ich es mit meinem Anfängerniveau getan hätte.

 

1 „Gefällt mir“

Hallo

Gern geschehen für das Dankeschön, gegenseitige Hilfe ist das Prinzip des Forums...

Für das Verschieben der Ordner ist die erste Idee, die Sie in Betracht ziehen, etwas, über das ich auch nachgedacht habe, aber im Moment keine Zeit, es zu testen. Wenn Sie eine funktionale Lösung haben, bin ich dafür, es wird gut für meine allgemeine Kultur sein ...

Vergessen Sie nicht, den Code zu überarbeiten, um eine Fehlerbehandlung hinzuzufügen.

Herzliche Grüße

1 „Gefällt mir“

Keine Sorge, für die Fehlerverwaltung muss ich eigentlich ein wenig Code hinzufügen, aber nichts zu erfinden, nur um rechts und links zu verpflanzen, was mir passen sollte!

Wenn ich eine Lösung finde, werde ich die Lösung hier posten.