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.
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