Macro pour remplacer en masse des parts d'un assemblage par équivalence de nom?

Salut tout le monde,

Après utilisation de « CircuitwWorks », j’obtiens un assemblage constitué de plusieurs parts. Ceux-ci sont issus d’un dossier « Components ».

Par ailleurs, je dispose d’un autre répertoire indépendant « Database » dans lequel se trouvent d’autres parts.

Savez-vous s’il existe un moyen via une macro de remplacer les parts de l’assemblage venant du dossier Components par ceux du dossier Database ?

Pour aider à l’identification et remplacement, les noms des parts utilisés dans Composants et Database ont des similarités (mais ne sont pas identiques pour autant) : par exemple « Toto-xxx-123-abs.SLDPRT » doit être remplacé par « Toto_.SLDPRT ».

L’image en pièce est peut-être plus parlante…

On a un début de macro ici, mais ce n’est peut-être pas le bon départ ?

Merci d’avance et bonne journée !

Gwen.

Bonjour

Si une macro n’est pas indispensable, il existe un moyen de remplacer les composants via le menu contextuel des composants dans le featureManager.

Sélectionner tous les composants identiques > clic droit sur l’un des éléments sélectionnés > Remplacer les composants.

Répéter pour chaque composant différent.

Bonjour Sylk,

Merci pour votre retour !

Le hic, c’est que cette action peut être répétée de nombreuses fois… peut-être même au-delà de 100, donc très long :open_mouth:

1 « J'aime »

Bonjour;

Dans votre cas la macro qui s’approche le plus de votre besoin est plutôt celle ci:

' Définition du répertoire contenant les fichiers de remplacement
Const REPLACEMENT_DIR As String = "D:\Assembly\Replacement"
' Définition du suffixe qui sera ajouté au nom du fichier de remplacement
Const SUFFIX As String = "_new"

' Déclaration de l’objet principal SolidWorks
Dim swApp As SldWorks.SldWorks

Sub main()

    ' Récupère l’instance de l’application SolidWorks active
    Set swApp = Application.SldWorks
    
    Dim swModel As SldWorks.ModelDoc2
    
    ' Récupère le document SolidWorks actuellement actif (pièce, assemblage ou mise en plan)
    Set swModel = swApp.ActiveDoc
    
    ' Vérifie qu’un document est bien ouvert
    If Not swModel Is Nothing Then
        
        ' Convertit le document actif en document d’assemblage
        Dim swAssy As SldWorks.AssemblyDoc
        Set swAssy = swModel
        
        ' Accède au gestionnaire de sélection pour récupérer les objets sélectionnés
        Dim swSelMgr As SldWorks.SelectionMgr
        Set swSelMgr = swModel.SelectionManager
        
        Dim i As Integer
        
        ' Parcourt chaque objet actuellement sélectionné dans l’assemblage
        For i = 1 To swSelMgr.GetSelectedObjectCount2(-1)
            
            ' Vérifie si l’objet sélectionné est bien un composant d’assemblage
            If swSelMgr.GetSelectedObjectType3(i, -1) = swSelectType_e.swSelCOMPONENTS Then
                
                ' Déclaration et récupération du composant sélectionné
                Dim swComp As SldWorks.Component2
                Set swComp = swSelMgr.GetSelectedObject6(i, -1)
                
                ' Suspend la gestion de la liste de sélection pour éviter les interférences
                Debug.Print swSelMgr.SuspendSelectionList
                
                ' Ajoute explicitement le composant à la liste de sélection
                swSelMgr.AddSelectionListObject swComp, Nothing
                
                ' Remplace le composant sélectionné par son équivalent dans le dossier de remplacement
                ' La fonction GetReplacementPath crée le chemin du nouveau fichier
                swAssy.ReplaceComponents2 GetReplacementPath(swComp), swComp.ReferencedConfiguration, False, swReplaceComponentsConfiguration_e.swReplaceComponentsConfiguration_MatchName, True
                    
                ' Réactive la gestion de la sélection une fois le remplacement effectué
                swSelMgr.ResumeSelectionList
                
            End If
        Next
        
    Else
        ' Message d’erreur si aucun assemblage n’est ouvert
        MsgBox ("Veuillez ouvrir un document d’assemblage avant d’exécuter la macro")
    End If
    
End Sub

' Fonction utilitaire : génère le chemin complet du fichier de remplacement
Function GetReplacementPath(comp As SldWorks.Component2)
    
    Dim replFilePath As String
    Dim compPath As String
    compPath = comp.GetPathName() ' Récupère le chemin complet du composant d’origine
                
    Dim dir As String
    dir = REPLACEMENT_DIR ' Dossier de remplacement prédéfini
    
    ' Ajoute un "\" à la fin du chemin si nécessaire
    If Right(dir, 1) <> "\" Then
        dir = dir & "\"
    End If
    
    ' Extrait uniquement le nom du fichier (sans le chemin)
    Dim fileName As String
    fileName = Right(compPath, Len(compPath) - InStrRev(compPath, "\"))
    
    ' Si un suffixe est défini, on le rajoute avant l’extension du fichier
    If SUFFIX <> "" Then
        
        Dim ext As String
        ' Suppose que tous les fichiers ont une extension de type .SLDxxx (ex : .SLDPRT, .SLDASM)
        ext = Right(fileName, Len(".SLDXXX"))
        
        ' Insertion du suffixe avant l’extension
        fileName = Left(fileName, Len(fileName) - Len(ext)) & SUFFIX & ext
        
    End If
    
    ' Construit le chemin complet du fichier de remplacement
    replFilePath = dir & fileName
                
    ' Retourne le chemin généré à la fonction appelante
    GetReplacementPath = replFilePath
    
End Function

(Macro d’origine:)

Fonction de base:
https://help.solidworks.com/2017/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.iassemblydoc~replacecomponents2.html

Avec quelques modification minimes vous devriez pouvoir faire vos substitutions souhaitées.

Merci pour votre retour, je vais tenter cela !

Bon week-end,

Gwen.