Bonjour,
Ci-joint le code pour traverser l'assemblage et les sous-assemblages.
Ce qui bloquait de base dans le code, c'est la position du j=1 qui faisait que ça tournait en boucle sur cette valeur et par conséquent ça cherchait systématiquement à renommer avec l'incrément 0001.
Pour la mise à jour dans l'explorateur, il faut sauvegarder pour que l'impact soit reflété sur le nom d'enregistrement des fichiers puisque la fonction rename ne fait que modifier temporairement les noms de fichiers (mis à jour dans le featuremanager uniquement).
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
Le code reste à adapter pour cibler les fichiers à renommer, de plus je n'ai pas cherché plus longtemps mais l'ordre est un peu aléatoire.
3 « J'aime »
Super Cyril,
merci énormément, j'adorerais que ce soit aussi facile que ca en a l'air !
Il ne me reste plus qu'a tester si une propriété de configuration de chaque des enfants existe et si c'est le cas je la renomme sinon je passe a l'enfant suivant. ( peu importe l'ordre.. )
Et ensuite, il faut que je gère correctement le compteur pour que le total de mon nom de fichier ne dépasse pas 12 digits.
Sinon avec les outil MycadTools auquel tu dois avoir accès vu ta médail sur ton profil, cela doit être faisable via ProjectManager sans avoir de connaissance en programmation
2 « J'aime »
Bonjour sbadenis,
Oui projectManager fonctionne mais c'est trop long pour le peu de programmation que ca coute.
Grace a Cyril, il ne me manque plus qu'a reussir a accéder aux propriétés de configurations dont je ne trouve aucune information sur internet et ce sera fini :)
Merci du conseil,
Cordialement,
Pas de soucis @vincent.bottier pour les propriétés de configurations voici un exemple de ma macrotèque:
'---------------------------------------------------------------------------
' 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 « J'aime »
Bonjour,
Voici un petit exemple pour relever la valeur de ta propriété :
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
Petite information aussi, si une pièce est présente plusieurs fois dans ton assemblage alors elle sera traitée autant de fois et prendra donc le nom du dernier compteur avec lequel elle à été traitée, je ne sais pas si cela est gênant pour ton application.
Cordialement,
5 « J'aime »
Bonjour,
merci pour vos réponses, je vais essayer d'adapter ce code !
@d.roger : je devrais réussir a lui dire que s'il a tant de digit dans son nom et que les 7 premiers sont égaux aux 7 premiers de l'assemblage alors il ne traite pas et ca n'effectuera pas de doublons dans ce cas :)
Je vous tiens au courant et posterais mon code final !
Merci encore de votre aide.
1 « J'aime »
Comme promis d.roger;
j'ai essayé avec votre code. J'ai une erreur sur la ligne : Set swCustProp = swModelChild.Extension.CustomPropertyManager("Défaut")
Pourtant la configuration de toutes mes pièces est bien celle-ci. Avez vous une idée ?
Merci
Bonsoir,
Il y a probablement un fichier qui n'a pas cette configuration dans ses paramètres.
Ci-joint le code modifié pour prendre en compte l'existence ou non de la configuration Défaut
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 « J'aime »
Bonjour,
je commence a faire les tests réels et effectivement je vois ce que vous vouliez me dire.
Le nom du composants dans les propriétés ne correspond pas au nom du fichier 3D.
J'ai pourtant ajouté une ligne et je pensais que ca fonctionnerait quitte a ce que tous les numéros ne soient pas pris. Et j'ai aussi des pièces qui ont une configurations "default" ( satanés américains :) )..
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
Pour le coup, il n'y a quasiment aucun composant qui ont le même nom dans l'arbre que dans le dossier windows..
Bonjour,
Je ne comprends pas ce que tu essaies de faire avec la ligne ajoutée.
De plus, comme je l'ai déjà dit dans la première réponse, s'il n'y pas d'enregistrement avec les paramètres de mise à jour des enfants, il n'y aura aucune modification des noms d'enregistrements des fichiers et sous-assemblages d'où l'absence de visibilité dans l'explorateur Windows.
Bonjour,
j'essaie que le nom de fichier windows corresponde au nom du composant.
Et pour moi, je fais bien une sauvegarde voir ci-dessous
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
Dim swModelDocExt As ModelDocExtension
Dim swCustProp As CustomPropertyManager
Dim bool As Boolean
Dim val As String
Dim valout As String
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 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 = 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
capture.png
La ligne swChildComp.Name2 = newName n'apporte rien de plus que ce que ne fait déjà la fonction de renommage.
Pour la capture d'écran, je ne vois pas ce qui cloche. Le nom de fichier est bon.
Reste à vérifier que les fichiers ne sont pas ouvert en lecture seule, je ne vois plus que ça.
Oui car je l'ai renommée a la main, mais quand j'exécute ma macro avec un assemblage quelquonque, il ne donne pas le même nom comme si le compteur n'agissait pas.
Et quand je renomme une pièce a la main, en faisant clic droit renommer la pièce, il change bien le nom windows mais pas le nom du composant.
Es ce normal ?
Je ne comprends pas le problème ou alors il y a une subtilité avec Swood que je ne maitrise pas.
Et bien je suis du genre un peu maniaque et je trouve confusant que le nom affiché dans le featuremanager ne soit pas le même que celui du fichier windows. Non ?
Y'a t'il une ligne de commande qui permettre de renommer le nom du composant que je puisse l'accorder avec le nom du fichier directement ?
C'est plus du paramétrage des modèles dans ce cas. Chez moi, nom de fichier = nom affiché dans le featuremanager.
D'accord,
eh bien je n'ai pas l'option d'afficher le nom du fichier ce qui me parait bizarre...
capture.png
Ca se cache dans "Montrer le nom des composants". Le nom de composant est identique au nom d'enregistrement.
Il faudrait regarder sinon dans les options générale au niveau des références externes si l'option "Mettre à jour les noms des composants lorsque les documents sont remplacés" est bien cochée.
1 « J'aime »
Super cette option des références externes n'était pas cochée :) !
Je le test sur plusieurs assemblages depuis ce matin, et j'ai encore une question désolé ^^
Es ce qu'il y a des cas ou la fonction rename ne fonctionne pas ?
Car la j'ai deux pièces qui ne sont pas renommées, pourtant que je passe le programme en pas a pas il passe bien dessus et déclenche la ligne : errorsRename = swModel.Extension.RenameDocument(newName)
Mais ne la renomme pas.. Es ce que vous avez une idée ?
Bon week end