Wijzig de naam van alle onderdelen in een assembly, zelfs de componenten die deel uitmaken van een subassembly

Hallo 

Ik begon een macro te schrijven met kleine stukjes die hier en daar op het net te vinden waren. 

Het idee is om alle componenten waarvan de eigenschap " SWOODCP_PanelStockLength " anders is dan "" te hernoemen (3D-bestanden + functiebeheer) waarvan de eigenschap " ".

Ik kan de onderdelen niet hernoemen krijgen in de assembly en in de Windows Verkenner. 

Ik voeg het begin van mijn code toe als je me zou kunnen helpen. 

Bij voorbaat dank

 

Optie Expliciete

Dim swApp als SldWorks.SldWorks
Dim swModel als SldWorks.ModelDoc2
Dim swRootComp als SldWorks.Component2
Dim Kinderen Als Variant
Dim swChild As SldWorks.Component2
Dim SwSelData als SldWorks.SelectData
Dim ChildCount zo lang
Dim oldName als tekenreeks
Dim newName als tekenreeks
Zon i Zo lang
Zon j Zo lang
Dim ParentName als tekenreeks

Sub hoofd()

Stel swApp = Toepassing.SldWorks in

Stel swModel = swApp.ActiveDoc in

Stel swRootComp in = swModel.ConfigurationManager.ActiveConfiguration.GetRootComponent3(True)

Kinderen = swRootComp.GetChildren

ChildCount = UBound(Kinderen)

Stel SwSelData in = swModel.SelectionManager.CreateSelectData

 

Voor i = 0 Naar ChildCount

j = 1

Set swChild = Kinderen(i)

swChild.Select4 Onwaar, SwSelData, Onwaar
ParentName = Links(swModel.GetTitle, 7)
newName = Oudernaam & "-" & "000" & j
swModel.Extension.RenameDocument newName
j = d + 1

volgende i
swModel.ForceRebuild3 Waar

Einde Sub

Optie Expliciete

Dim swApp als SldWorks.SldWorks
Dim swModel als SldWorks.ModelDoc2
Dim swRootComp als SldWorks.Component2
Dim Kinderen Als Variant
Dim swChild As SldWorks.Component2
Dim SwSelData als SldWorks.SelectData
Dim ChildCount zo lang
Dim oldName als tekenreeks
Dim newName als tekenreeks
Zon i Zo lang
Zon j Zo lang
Dim ParentName als tekenreeks

Sub hoofd()

Stel swApp = Toepassing.SldWorks in

Stel swModel = swApp.ActiveDoc in

Stel swRootComp in = swModel.ConfigurationManager.ActiveConfiguration.GetRootComponent3(True)

Kinderen = swRootComp.GetChildren

ChildCount = UBound(Kinderen)

Stel SwSelData in = swModel.SelectionManager.CreateSelectData

 

Voor i = 0 Naar ChildCount

j = 1

Set swChild = Kinderen(i)

swChild.Select4 Onwaar, SwSelData, Onwaar
ParentName = Links(swModel.GetTitle, 7)
newName = Oudernaam & "-" & "000" & j
swModel.Extension.RenameDocument newName
j = d + 1

volgende i
swModel.ForceRebuild3 Waar

Einde Sub

 

Hallo

Om te kunnen helpen, zou je moeten weten wat het probleem is. Als eerste benadering, om het te laten werken, moet u de wijzigingen opslaan en ervoor zorgen dat alle gebruiksscenario's indien nodig worden bijgewerkt.

In principe brengt de functie alleen een tijdelijke wijziging aan, als er geen record is, wordt de wijziging niet opgeslagen.

1 like

Hallo Cyril, 

De functie houdt geen rekening met kinderen in subassemblages en hernoemt 3D-bestanden niet correct, maar alleen die in de boomstructuur.

Hallo

Bijgevoegd is de code om de assemblage en subassemblages te doorlopen.

Wat de code blokkeerde, was de positie van j=1, waardoor het op deze waarde bleef lopen en daarom systematisch probeerde te hernoemen met de 0001-verhoging.

Voor de update in de verkenner moet u opslaan zodat de impact wordt weerspiegeld in de naam van het bestandsrecord, aangezien de hernoemingsfunctie de bestandsnamen slechts tijdelijk wijzigt (alleen bijgewerkt in de functiebeheer).

Option Explicit

Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swRootComp As SldWorks.Component2
Dim Children As Variant
Dim swChild As SldWorks.Component2
Dim SwSelData As SldWorks.SelectData
Dim ChildCount As Long
Dim oldName As String
Dim newName As String
Dim i As Long
Dim j As Long
Dim NomParent As String
Dim errorsRename As Long
Dim status As Boolean
Dim warnings As Long
Dim errorsSave As Long

Sub main()

Set swApp = Application.SldWorks

Set swModel = swApp.ActiveDoc
NomParent = Left(swModel.GetTitle, 7)
Set swRootComp = swModel.ConfigurationManager.ActiveConfiguration.GetRootComponent3(True)
j = 1
TraverseComponent swRootComp, 1
swModel.ForceRebuild3 True
status = swModel.Save3(swSaveAsOptions_SaveReferenced, errorsSave, warnings)


End Sub
Sub TraverseComponent _
(swComp As SldWorks.Component2, nLevel As Long)
    Dim vChildComp As Variant
    Dim swChildComp As SldWorks.Component2
    Dim swCompConfig As SldWorks.Configuration
    Dim sPadStr As String
    Dim i As Long
   
    
    For i = 0 To nLevel - 1
        sPadStr = sPadStr + "  "
    Next i
    vChildComp = swComp.GetChildren
    For i = 0 To UBound(vChildComp)
        Set swChildComp = vChildComp(i)
        TraverseComponent swChildComp, nLevel + 1
        swChildComp.Select4 False, SwSelData, False
        newName = "Test" & "-" & "000" & j
        errorsRename = swModel.Extension.RenameDocument(newName)
        j = j + 1
    Next i
End Sub

 

De code moet nog worden aangepast om de te hernoemen bestanden te targeten, bovendien heb ik niet langer gekeken, maar de volgorde is een beetje willekeurig.

3 likes

Super Cyrillus, 

 

Heel erg bedankt, ik zou het geweldig vinden als het net zo eenvoudig is als het klinkt! 

Het enige wat ik nu nog moet doen is testen of er een configuratie-eigenschap van elk van de kinderen bestaat en zo ja, dan hernoem ik die, anders ga ik door naar het volgende kind. ( ongeacht de volgorde .. )

En dan moet ik de teller correct beheren zodat het totaal van mijn bestandsnaam niet meer dan 12 cijfers bedraagt. 

Anders moet het met de MycadTools-tool waar je toegang toe moet hebben gezien je medaille op je profiel,  mogelijk zijn via ProjectManager zonder enige programmeerkennis te hebben

2 likes

Hallo sbadenis, 

Ja, projectManager werkt, maar het is te lang voor het weinige programmeren dat het kost. 

Dankzij Cyril hoef ik alleen maar toegang te krijgen tot de configuratie-eigenschappen waarover ik geen informatie op internet kan vinden en dat zal het zijn:) 

Bedankt voor het advies, 

Vriendelijke groeten

Geen zorgen @vincent.bottier voor de configuratie-eigenschappen, hier is een voorbeeld van mijn macrotec:


 '---------------------------------------------------------------------------
' Preconditions:
' 1. Open a part document.
' 2. Open the Immediate window.
'
' Postconditions:
' 1. Adds a date custom property to the part's configuration.
' 2. Tests whether the custom property is editable, and if so,
'    edits it.
' 3. Gets all custom properties in the configuration.
' 4. Deletes a custom property.
' 5. Examine the Immediate window.
'---------------------------------------------------------------------------

Option Explicit

Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim config As SldWorks.Configuration
Dim cusPropMgr As SldWorks.CustomPropertyManager
Dim lRetVal As Long
Dim vPropNames As Variant
Dim vPropTypes As Variant
Dim vPropValues As Variant
Dim ValOut As String
Dim ResolvedValOut As String
Dim wasResolved As Boolean
Dim linkToProp As Boolean
Dim resolved As Variant
Dim linkProp As Variant
Dim nNbrProps As Long
Dim j As Long
Dim custPropType As Long
Dim bRet As Boolean

Sub main()


    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
    Set config = swModel.GetActiveConfiguration
    Set cusPropMgr = config.CustomPropertyManager
   

    ' Get the number of custom properties for this configuration
    nNbrProps = cusPropMgr.Count
    Debug.Print "Number of properties for this configuration:            " & nNbrProps
   

    ' Gets the custom properties
    lRetVal = cusPropMgr.GetAll3(vPropNames, vPropTypes, vPropValues, resolved, linkProp)

    ' For each custom property, print its name, type, and evaluated value
    For j = 0 To nNbrProps - 1
        custPropType = cusPropMgr.GetType2(vPropNames(j))
        Debug.Print "    Name, swCustomInfoType_e value, and resolved value:  " & vPropNames(j) & ", "; custPropType & ", " & vPropValues(j)
    Next j

   
    ' Get the number of custom properties for this configuration
    nNbrProps = cusPropMgr.Count
    Debug.Print "Number of properties for this configuration:            " & nNbrProps

End Sub

 

1 like

Hallo

Hier is een klein voorbeeld om de waarde van uw eigendom te controleren:

Sub TraverseComponent(swComp As SldWorks.Component2, nLevel As Long)
    Dim vChildComp As Variant
    Dim swChildComp As Component2
    Dim i As Long
    Dim swModelChild As SldWorks.ModelDoc2
    Dim swCustProp As CustomPropertyManager
    Dim val As String
    Dim valout As String

    vChildComp = swComp.GetChildren
    For i = 0 To UBound(vChildComp)
        Set swChildComp = vChildComp(i)
        TraverseComponent swChildComp, nLevel + 1
        swChildComp.Select4 False, SwSelData, False
        Set swModelChild = swChildComp.GetModelDoc2
        Set swCustProp = swModelChild.Extension.CustomPropertyManager("Défaut") 'mettre le nom de la configuration comprenant la propriété
        status = swCustProp.Get4("SWOODCP_PanelStockLength", False, val, valout)
        If valout <> "" Then
            newName = Left(swModelChild.GetTitle, 4) & "-" & "000" & j
            errorsRename = swModel.Extension.RenameDocument(newName)
            Debug.Print swModelChild.GetTitle & " : " & j & " - " & errorsRename
            j = j + 1
        End If
    Next i
End Sub

Kleine informatie ook, als een onderdeel meerdere keren aanwezig is in uw assemblage dan zal het net zo vaak behandeld worden en zal het dus de naam aannemen van de laatste teller waarmee het behandeld is, ik weet niet of dit vervelend is voor uw toepassing.

Vriendelijke groeten

5 likes

Hallo 

Bedankt voor je antwoorden, ik zal proberen deze code aan te passen! 

@d.Roger : Ik zou hem moeten kunnen vertellen dat als hij zoveel cijfers in zijn naam heeft en de eerste 7 gelijk zijn aan de eerste 7 van de vergadering, hij niet verwerkt en het in dit geval niet zal dupliceren:) 

Ik hou jullie op de hoogte en post mijn definitieve code! 

Nogmaals bedankt voor je hulp.

1 like

Zoals beloofd door d.roger;  

Ik heb het geprobeerd met je code. Ik heb een fout op de lijn: Set swCustProp = swModelChild.Extension.CustomPropertyManager("Default")

Toch is de configuratie van al mijn kamers inderdaad deze. Heb je een idee? 

Bedankt 

Goedenavond

Er is waarschijnlijk een bestand dat deze configuratie niet heeft in de instellingen.

Bijgevoegd is de code gewijzigd om rekening te houden met het al dan niet bestaan van de standaardconfiguratie

Sub TraverseComponent(swComp As SldWorks.Component2, nLevel As Long)
    Dim vChildComp As Variant
    Dim swChildComp As Component2
    Dim i As Long
    Dim swModelChild As SldWorks.ModelDoc2
    Dim swCustProp As CustomPropertyManager
    Dim val As String
    Dim valout As String

    vChildComp = swComp.GetChildren
    For i = 0 To UBound(vChildComp)
        Set swChildComp = vChildComp(i)
        TraverseComponent swChildComp, nLevel + 1
        swChildComp.Select4 False, SwSelData, False
        Set swModelChild = swChildComp.GetModelDoc2
        Set swCustProp = swModelChild.Extension.CustomPropertyManager("Défaut") 'mettre le nom de la configuration comprenant la propriété
        If Not swCustProp Is Nothing Then
        status = swCustProp.Get4("SWOODCP_PanelStockLength", False, val, valout)
        If valout <> "" Then
            newName = Left(swModelChild.GetTitle, 4) & "-" & "000" & j
            errorsRename = swModel.Extension.RenameDocument(newName)
            Debug.Print swModelChild.GetTitle & " : " & j & " - " & errorsRename
            j = j + 1
        End If
        End If
    Next i
End Sub

 

2 likes

Hallo 

Ik begin de echte tests te doen en ik zie inderdaad wat je me wilde vertellen. 

De componentnaam in de eigenschappen komt niet overeen met de 3D-bestandsnaam. 

Ik voegde een regel toe en ik dacht dat het zou werken, zelfs als het niet alle nummers zou nemen. En ik heb ook onderdelen die een "standaard" configuratie hebben (verdomd Amerikaanse :)).  

Zo niet, dan is swCustProp niets
            status = swCustProp.Get4("SWOODCP_PanelStockLength", False, val, valout)
            Als valout <> "" Dan
                newName = Oudernaam & "-" & "000" & j
                errorsRename = swModel.Extension.RenameDocument(newName)
                swChildComp.Name2 = nieuwNaam
                Debug.Print swModelChild.GetTitle & " : " & j & " - " & errorsRename
                j = d + 1
            Einde als
        Einde als

 

Voorlopig zijn er bijna geen componenten die dezelfde naam hebben in de boom als in de Windows-map.  

Hallo

Ik begrijp niet wat je probeert te doen met de toegevoegde regel.

Ook, zoals ik al zei in het eerste antwoord, als er geen record is met de update-instellingen van de kinderen, zal er geen verandering zijn in de recordnamen van de bestanden en subassemblages, vandaar het gebrek aan zichtbaarheid in Windows Verkenner.

Hallo 

Ik probeer de Windows-bestandsnaam overeen te laten komen met de componentnaam. 

En voor mij maak ik wel een back-up zie hieronder

 

Optie Expliciete

Dim swApp als SldWorks.SldWorks
Dim swModel als SldWorks.ModelDoc2
Dim swRootComp als SldWorks.Component2
Dim Kinderen Als Variant
Dim swChild As SldWorks.Component2
Dim SwSelData als SldWorks.SelectData
Dim ChildCount zo lang
Dim oldName als tekenreeks
Dim newName als tekenreeks
Zon i Zo lang
Zon j Zo lang
Dim ParentName als tekenreeks
Dim foutenHernoem zo lang
Dim status Als Booleaans
Dim waarschuwingen zo lang
Bespaar zo lang
Dim swModelDocExt als ModelDocExtension
Dim swCustProp als CustomPropertyManager
Dim bool als Booleaanse
Dim val als snaar
Dim valout als snaar

Sub hoofd()

Stel swApp = Toepassing.SldWorks in

Stel swModel = swApp.ActiveDoc in
ParentName = Links(swModel.GetTitle, 7)
Stel swRootComp in = swModel.ConfigurationManager.ActiveConfiguration.GetRootComponent3(True)
j = 1
TraverseComponent swRootComp, 1
swModel.ForceRebuild3 Waar
status = swModel.Save3(swSaveAsOptions_SaveReferenced, foutenOpslaan, waarschuwingen)

Einde Sub


Sub TraverseComponent(swComp als SldWorks.Component2, nLevel zo lang)
    Dim vChildComp als variant
    Dim swChildComp als component2
    Zon i Zo lang
    Dim swModelChild As SldWorks.ModelDoc2
    Dim swCustProp als CustomPropertyManager
    Dim val als snaar
    Dim valout als snaar

    vChildComp = swComp.GetChildren
    Voor i = 0 TB UBound(vChildComp)
        Stel swChildComp in = vChildComp(i)
        TraverseComponent swChildComp, nLevel + 1
        swChildComp.Select4 Onwaar, SwSelData, Onwaar
        Stel swModelChild in = swChildComp.GetModelDoc2
        Set swCustProp = swModelChild.Extension.CustomPropertyManager("Default") ' stel de naam van de configuratie in, inclusief de
        Zo niet, dan is swCustProp niets
            status = swCustProp.Get4("SWOODCP_PanelStockLength", False, val, valout)
            Als valout <> "" Dan
                newName = Oudernaam & "-" & "000" & j
                errorsRename = swModel.Extension.RenameDocument(newName)
                swChildComp.Name2 = nieuwNaam
                Debug.Print swModelChild.GetTitle & " : " & j & " - " & errorsRename
                j = d + 1
            Einde als
        Einde als
    volgende i
Einde Sub
 


capture.png

De regel swChildComp.Name2 = newName voegt niets meer toe dan de hernoemingsfunctie al doet.

Voor de schermafbeelding zie ik niet wat er mis is. De bestandsnaam is goed.

Het enige dat overblijft is om te controleren of de bestanden niet in read-only open zijn, dat kan ik alleen zien.

Ja, want ik heb het met de hand hernoemd, maar als ik mijn macro ergens met een assembly uitvoer, geeft het niet dezelfde naam alsof de teller niet heeft gehandeld. 

En als ik een onderdeel met de hand hernoem, door met de rechtermuisknop op het onderdeel te hernoemen, verandert het de Windows-naam, maar niet de naam van het onderdeel. 

Is dit normaal? 

Ik begrijp het probleem niet of er is een subtiliteit met Swood die ik niet beheers.

Nou, ik ben een beetje een maniak en ik vind het verwarrend dat de naam die in de featuremanager wordt weergegeven niet hetzelfde is als de naam van het Windows-bestand. Nee? 

Is er een opdrachtregel waarmee ik de naam van het onderdeel kan hernoemen, zodat ik deze rechtstreeks kan matchen met de naam van het bestand? 

Het gaat in dit geval meer om het instellen van de modellen. In mijn geval is bestandsnaam = naam die wordt weergegeven in de featuremanager.