Renommer tous les composants d'un assemblage même ceux inclus dans un sous assemblage

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

Bonjour, 

après utilisation intensive de la macro. Je m'apercois que selon la configuration de mes pièces j'ai souvent une erreur car nous avons les deux langues ( default et défaut ). Comment puis passer outre cette erreur et prendre les deux cas en considération ? 

Merci d'avance, 

bonne journée 

Bonjour,

Je n'avais pas vu la première question.

Pour le problème de renommage, il faut regarder ce que retourne la variable ErrorsRename et voir dans l'aide à quoi correspond cette erreur: 

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

Pour le reste, il faut ajouter un contrôle complémentaire comme dans le code ci-dessous:

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

 

Oui j'y avais pensé mais deja au "set swCust...." comme ile ne trouve pas la configuration il plante et je ne sais pas comment faire. 

Pour la première question, c'est en fait que la pièce existant deja dans l'explorer windows mais n'était pas dans l'assemblage.

Bonjour,

Je pense que ça vient d'autre chose. Personnellement je n'ai aucun problème de fonctionnement même si la configuration n'existe pas.

swCustProp reste vide et par conséquent il n'y a pas de renommage ni quoi que ce soit d'autre de fait sur le fichier concerné.

Est-ce que le code a été intégré en l'état dans votre macro ou a-t-il été modifié pour intégrer à votre code?

Bonjour Cyril, 

je poste tout mon code. J'ai mis deux boucles car si j'ai deja renommé mes pièces cela ne fonctionnait pas donc je les renomme en premier avec un compteur ( 1,2,3,4...) puis je les renomme avec la règle. 

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 j As Long
Dim h 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
h = 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 swModelChild As SldWorks.ModelDoc2
    Dim swCustProp As CustomPropertyManager
    Dim val As String
    Dim valout As String
    Dim i As Long
    
    Dim status2 As Boolean
    Dim val1 As String
    Dim valout1 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("Default") 'mettre le nom de la configuration comprenant la propriété
        If Not swCustProp Is Nothing Then
            status = swCustProp.Get4("SWOODCP_PanelStockLength", False, val, valout)
            status2 = swCustProp.Get4("QUINCAILLERIE", False, val1, valout1)
            
            If valout <> "" Or valout1 <> "" Then
                newName = h
                errorsRename = swModel.Extension.RenameDocument(newName)
                Debug.Print swModelChild.GetTitle & " : " & h & " - " & errorsRename
                h = h + 1
            End If
        End If
    Next i
    
        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)
            status2 = swCustProp.Get4("QUINCAILLERIE", False, val1, valout1)
            
            If valout <> "" Or valout1 <> "" Then
                newName = NomParent & "-000" & j
                If Len(newName) > 12 Then
                    newName = Left(newName, 8) & Right(newName, 4)
                End If
                errorsRename = swModel.Extension.RenameDocument(newName)
                Debug.Print swModelChild.GetTitle & " : " & j & " - " & errorsRename
                j = j + 1
            End If
        End If
    Next i
End Sub

 

Je n'ai pas encore vérifié mais en première approche je pense que le problème provient de la seconde boucle.

La variable swChild est probablement vidée une fois le premier traitement passé.

Bonjour Cyril, 

swChild n'est pas remise a nothing, je ne comprend pas comment elle serait vide.

Bonjour,

Personnellement je n'ai aucun problème avec cette macro. En l'état je ne vois pas ce qui bloque (j'ai des fichiers qui n'ont aucune configuration nommée comme celles ciblées et ça passe à la suite sans problème).

Quel est le message d'erreur remonté?

Bonjour, 

j'ai trouvé une solution avec getactiveconfiguration comme ca je prend toutes les configurations en compte pas de soucis de traduction. 

Bonjour Cyril, 

j'ai encore fais quelques test et j'ai un exemple que je joins dans un fichier ZIP. 

j'ai l'impression qu'il ne passe pas sur tous les fichiers de l'assemblage et je ne comprend vraiment pas pourquoi... Finalement mes vacances n'ont pas servies :D ! 

Merci de votre aide d'avance, 

bonne journée 

Vincent 


1500000-0000.zip
renaming.swp