Macro creatie van mappen in de angstaangelegenheid + classificatie op eigenschap

Hallo

In mijn assemblages wil ik de map FI en Schroeven maken met behulp van een macro (vba) en alle onderdelen of samenstellingen van het 1e niveau naar deze mappen verplaatsen.

Hiervoor ben ik op zoek naar manieren om:

1-Haal de naam op van elk onderdeel of assemblage op het 1e niveau

2-Haal de categorie-eigenschap van elk van deze onderdelen of assemblage op

3-Maak een map aan in de Functiebeheer

4-Verplaats onderdelen of samenstellingen met de eigenschapscategorie = naar Schroeven of Industriële toelevering naar de juiste map

 

Als je aanknopingspunten hebt voor een van de stappen (procedure of zelfs voorbeeld), kan het me veel helpen ;-)

 

Bedankt

Sebastian

Hallo

Punt 1: GetChildren-functie met een voorbeeld HIER

Punt 2: GetModelDoc2 functie

Punt 3: Ik weet het niet meer, het komt later terug.

Punt 4: Zelfde als punt 3

Vriendelijke groeten

2 likes

Punten 3 en 4: InsertFeatureTreeFolder2 functie met een voorbeeld HIER

Vriendelijke groeten

2 likes

Hallo

En hier is het volledige voorbeeld:

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

Vriendelijke groeten


macroranking3d.swp
2 likes

Bedankt @d.roger, het is meer een baan, het is een snelweg die je voor mij hebt gemaakt!

Het helpt me enorm, ik was niet zo ver, eerder heel ver daarvandaan...

Ik heb nog een probleem voor 1 speciaal geval:

Onderdelen die zijn gemaakt met een onderdeelfamilie, waarbij de categorie is ingevuld in de configuratie (zoals schroeven of andere) worden genegeerd, zou ik een voorwaarde moeten toevoegen als de eigenschap "categorie" leeg is, kijk dan naar de configuratie-eigenschap.

 

Ten slotte moet ik ook een verbetering toevoegen om de map Schroeven en FI te verwijderen bij het starten van de macro als ze al bestaan. (voor het geval we de macro opnieuw opstarten na het toevoegen van nieuwe munten)

En tot slot zou ik de 2 mappen indien mogelijk helemaal naar de onderkant van de functiebeheerder willen verplaatsen (geen manier om de map te verplaatsen).

 

 

Hallo

Hier is een nieuwe versie waarmee u mappen bij het opstarten kunt verwijderen als ze bestaan en ook kunt zoeken naar de waarde van de variabele in alle configuraties van 3D-elementen.

Ik heb niet geprobeerd de mappen aan het einde van de functiebeheerder te plaatsen, we zullen later zien of ik de tijd heb.

Een kleine herinnering, dit is slechts een voorbeeld, dus het foutbeheer is niet gedaan...

Vriendelijke groeten


macroranking3d.swp
2 likes

Nieuwste versie, die met de positionering van de mappen aan het einde van de functiebeheerder ...

Vriendelijke groeten


macroranking3d.swp
3 likes

Ik test het overdag als ik 15-20mn kan vinden, maar op het eerste gezicht lijkt het perfect functioneel!

Voor de woordenboekstructuur ontdek ik iets nieuws, in de uitwerking van macro's. Bedankt.

Ik kom aan het eind van de dag terug als alles goed gaat.

 

En bedankt @d.roger dat je de tijd hebt genomen om naar dit alles te kijken.

Na de test:

Er zijn nog minstens 2  bugs om op te lossen:

- als een onderdeel zich in de verwijderde staat bevindt (N°1-Image1)-> onmogelijk om de standaardconfiguratie te vinden -> fout -> Ik moet vinden hoe ik het kan negeren als het onderdeel zich in de verwijderstatus bevindt. (voor bug 2 terugzetten, niet verwijderd)

- De map verplaatsen werkt niet goed De WELL map staat helemaal onderaan, maar alle stukken onder de 1e die in de map te verplaatsen zijn, staan ook in de map.

En bovendien kan de map niet worden "uitgebreid" met de pijl om de inhoud te zien.

Terwijl zonder de verplaatsing de pijl er is.

Ik denk dat het alle items onder de map daarin, inclusief de andere mappen die vervolgens worden gemaakt, verplaatst.

Voorbeeld voor macro (Afbeelding 1)

In nr. 1 assemblage verwijderd voor bug 1

in N°2 (Schroeven)

In nr. 3 en 4 (FI)

 

Bijgevoegd, mijn testassemblage, en de macro met de eigenschappen met het juiste geval (fout van mijn kant tijdens de 1e post).


test_dossiers.zip

Hallo

Hier is een nieuwe versie waarmee je elementen kunt vermijden die zich in de verwijderde staat bevinden, ik heb de regels verwijderd die de mappen verplaatsen omdat het inderdaad in sommige gevallen bugs bevat (om na te denken over hoe je het moet doen, maar niet te veel tijd voor het moment).

Vriendelijke groeten


macroclassement3d_1.swp
2 likes

Hallo

Bedankt voor de nieuwste versie die het probleem op verwijderde delen effectief oplost.

Ik ga het onderwerp sluiten ondanks de bug bij het verplaatsen van de map, maar waar niet om werd gevraagd in de basisvraag.

Voor de mapverplaatsing heb ik een aantal ideeën:

- Verplaats eerst de onderdelen in plaats van de map en maak vervolgens de map aan

- ontdek waarom deze bug is (door de vraag te stellen op het speciale Solidworks macro forum)

Voor de rest is de macro perfect functioneel en ik dank u @ d.roger voor het perfecte werk dat is gedaan, het heeft me meer dan kostbare tijd bespaard terwijl ik een veel schonere code had dan wat ik zou hebben gedaan met mijn beginnersniveau.
 

 

Hallo

Bedankt voor de nieuwste versie die het probleem op verwijderde delen effectief oplost.

Ik ga het onderwerp sluiten ondanks de bug bij het verplaatsen van de map, maar waar niet om werd gevraagd in de basisvraag.

Voor de mapverplaatsing heb ik een aantal ideeën:

- Verplaats eerst de onderdelen in plaats van de map en maak vervolgens de map aan

- ontdek waarom deze bug is (door de vraag te stellen op het speciale Solidworks macro forum)

Voor de rest is de macro perfect functioneel en ik dank je @d.roger voor het perfecte werk, het heeft me meer dan kostbare tijd bespaard terwijl ik een veel schonere code had dan wat ik zou hebben gedaan met mijn beginnersniveau.

 

1 like

Hallo

U bent van harte welkom voor de dankjewel, wederzijdse hulp is het principe van het forum...

Voor het verplaatsen van de mappen is het eerste idee dat je overweegt iets waar ik ook over heb nagedacht, maar op dit moment geen tijd om het te testen. Als je een functionele oplossing hebt, ben ik er helemaal voor, het zal goed zijn voor mijn algemene cultuur ...

Vergeet niet de code te herwerken om foutafhandeling toe te voegen.

Vriendelijke groeten

1 like

Geen zorgen, voor het foutbeheer moet ik eigenlijk een beetje code toevoegen, maar niets om uit te vinden, alleen om rechts en links te transplanteren, wat bij mij zou moeten passen!

Als ik een oplossing vind, zal ik de oplossing hier plaatsen.