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

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.

OK 

nou, ik heb niet de mogelijkheid om de naam van het bestand weer te geven, wat me raar lijkt...


capture.png

Het is verborgen in "Componentnamen weergeven". De naam van de component is hetzelfde als de naam van de record.

Anders moet u in de algemene opties op extern referentieniveau kijken als de optie "Componentnamen bijwerken bij het vervangen van documenten" is aangevinkt.

1 like

Geweldig, deze optie van externe verwijzingen is niet :) aangevinkt!  

Ik heb het sinds vanmorgen op verschillende assemblages getest en ik heb nog steeds een spijtige vraag^^ 

Zijn er gevallen waarin de hernoemingsfunctie niet werkt? 

Omdat ik hier twee delen heb die niet worden hernoemd, maar ik geef het programma stap voor stap door, het geeft ze door en activeert de regel: errorsRename = swModel.Extension.RenameDocument(newName)

Maar hernoem het niet. Heb je een idee? 

Fijn weekend

Hallo 

na intensief gebruik van de macro. Ik merk dat ik, afhankelijk van de configuratie van mijn onderdelen, vaak een foutmelding heb omdat we beide talen hebben (standaard en standaard). Hoe kunnen we deze fout achter ons laten en beide gevallen in overweging nemen? 

Bij voorbaat dank, 

Fijne dag 

Hallo

De eerste vraag had ik niet gezien.

Voor het hernoemingsprobleem moet je kijken naar wat de variabele ErrorsRename retourneert en in de help zien waar deze fout mee overeenkomt: 

 http://help.solidworks.com/2020/english/api/swconst/SolidWorks.Interop.swconst~SolidWorks.Interop.swconst.swRenameDocumentError_e.html

Voor de rest moet je een extra vinkje toevoegen zoals in de onderstaande code:

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 swCustProp Is Nothing Then
            Set swCustProp = swModelChild.Extension.CustomPropertyManager("Default")
        End If
        If Not swCustProp Is Nothing Then
        status = swCustProp.Get4("SWOODCP_PanelStockLength", False, val, valout)
        If valout <> "" Then
            newName = NomParent & "-" & "000" & j
            errorsRename = swModel.Extension.RenameDocument(newName)
            swChildComp.Name2 = newName
            Debug.Print swModelChild.GetTitle & " : " & j & " - " & errorsRename
            j = j + 1
        End If
        End If
    Next i
End Sub

 

Ja, ik had er wel over nagedacht, maar al bij de "swCust set.... " omdat het de configuratie niet kan vinden, crasht het en ik weet niet hoe ik het moet doen. 

Voor de eerste vraag is het eigenlijk dat het onderdeel al bestond in de vensters van de verkenner, maar niet in de assemblage zat.

Hallo

Ik denk dat het van iets anders komt. Persoonlijk heb ik geen problemen met de bediening, zelfs als de configuratie niet bestaat.

swCustProp blijft leeg en daarom is er geen hernoeming of iets anders op het betreffende bestand.

Is de code ingesloten zoals deze is in uw macro of is deze gewijzigd om in uw code te integreren?

Hallo Cyril, 

Ik post al mijn code. Ik heb twee lussen gezet omdat als ik mijn stukken al heb hernoemd, het niet werkte, dus ik hernoem ze eerst met een teller (1,2,3,4...) en daarna hernoem ik ze met de liniaal. 

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 j Zo lang
Zon h 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
h = 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
    Dim swModelChild As SldWorks.ModelDoc2
    Dim swCustProp als CustomPropertyManager
    Dim val als snaar
    Dim valout als snaar
    Zon i Zo lang
    
    Dim status2 Als Booleaans
    Dim val1 Als String
    Dim valout1 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") ' zet de naam van de configuratie inclusief de
        Zo niet, dan is swCustProp niets
            status = swCustProp.Get4("SWOODCP_PanelStockLength", False, val, valout)
            status2 = swCustProp.Get4("HARDWARE", Onwaar, val1, valout1)
            
            Als valout <> "" Of valout1 <> "" Dan
                newName = h
                errorsRename = swModel.Extension.RenameDocument(newName)
                Debug.Print swModelChild.GetTitle & " : " & h & " - " & errorsRename
                h = h + 1
            Einde als
        Einde als
    volgende i
    
        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)
            status2 = swCustProp.Get4("HARDWARE", Onwaar, val1, valout1)
            
            Als valout <> "" Of valout1 <> "" Dan
                newName = Oudernaam & "-000" & j
                Als Lin (newName) > 12 dan
                    newName = Links(nieuweNaam, 8) & Rechts(nieuweNaam, 4)
                Einde als
                errorsRename = swModel.Extension.RenameDocument(newName)
                Debug.Print swModelChild.GetTitle & " : " & j & " - " & errorsRename
                j = d + 1
            Einde als
        Einde als
    volgende i
Einde Sub

 

Ik heb het nog niet gecontroleerd, maar bij de eerste benadering denk ik dat het probleem uit de tweede lus komt.

De swChild-variabele wordt waarschijnlijk gespoeld nadat de eerste run is gepasseerd.

Hallo Cyril, 

swChild is niet gereset naar niets, ik begrijp niet hoe het leeg zou zijn.

Hallo

Persoonlijk heb ik geen probleem met deze macro. Zoals het er nu uitziet, zie ik niet wat er blokkeert (ik heb bestanden die geen benoemde configuratie hebben zoals de beoogde en het gaat zonder enig probleem door).

Wat is de foutmelding die wordt gemeld?

Hallo 

Ik heb een oplossing gevonden met GetActiveConfiguration dus ik houd rekening met alle configuraties zonder vertaalproblemen. 

Hallo Cyril, 

Ik heb nog wat tests gedaan en ik heb een voorbeeld dat ik bijvoeg in een ZIP-bestand. 

Ik heb de indruk dat het niet alle dossiers van de vergadering doorneemt en ik begrijp echt niet waarom... Uiteindelijk waren mijn vakanties niet :D!  

Bij voorbaat dank voor uw hulp, 

Fijne dag 

Vincent 


1500000-0000.zip
hernoemen.swp