SolidWorks ReplaceComponents

Bonjour le forum!

 

J'ai une petite question concernant la fonction "ReplaceComponents" de l'API Solidworks

 

Voilà, j'ai réussi à faire fonctionner la macro concernant la selection manuelle et le remplacement de pièc, chouette!

(petite danse de la victoire: <o> _o>  _o_ \o/)

 

Mon soucis  arrive maintenant... Présentation de la macro à un collègue, il s'amusent à remplacer  des pièces déjà présentent dans l'assemblages

C'est sympa, on remplace une vis par une flasque etc.

 

Il décide d'essayer la macro de façon plus constructive. Entre donc le chemin et le nom de la pièce de remplacement, selectionne la pièce dans l'assemblage et......

Et bien rien... La pièce dans l'assemblage est selectionnée, mais pas remplacée...

 

Explication plus précise et concise:

 

Pièce de l'assemblage à remplacer + pièce de remplacement dans l'assemblage => Fonctionne.

 

Pièce de l'assemblage à remplacer + pièce de remplacement pas dans l'assemblage => Néant.

 

Voici en pièce jointe la macro en question =)

 

Si vous avez des idées d'un truc que j'aurais oublier / fait comme  erreur =/

 

Amicalement,

Yoann


vba_remplacement_piece.txt

Bonjour,

 

Deux petites suggestions sans me plonger dans le code :

 

Essayer d'ouvrir la pièce dans SolidWorks (vu qu'on a le chemin complet) puis essayer le remplacement.

 

Sinon, méthode un peu barbare, insérer la pièce dans l'assemblage, remplacer l'existante, puis la supprimer (vérifier qu'on supprime bien la première instance !)

1 « J'aime »

Bonjour Lucas :)

 

J'ai tenter la première méthode, il semblerait que la pièce de remplacement doit être ouverte pour être prise en compte (et accessible en écriture peut être. Si c'est le cas, ça va m'ennuyer un peu les pièces étant sur EPDM...)

 

Mais en essayant de l'ouvrir à part, le remplacement ne prend pas en compte l'occurence de la pièce à changer =o

 

Exemple:

 

Dans mon assemblage j'ai:

 

SE-01

   -piece01<1>

   -pièce02<1>

 

SE-02

   -....

   -....

 

-Pièce03<1>

-pièce01<5>

-pièce02<9>

 

Et lorsque, je veux changer la "pièce01<5>" par exemple, je la selectionne (en mettant pièce01-5), jusque là tout fonctionne bien, j'entre le nom de la pièce de remplacement ouverte à côté égalemen, et ça me change non pas la "pièce01<5>" comme selectionée mais la "pièce01<1>" =o

 

La fonction ne prendrait donc pas en compte l'occurence comme je le pensais?

Car par contre quand je veux changer la "Piece03<1>" (ou peut importe l'occurence tant qu'elle soit la plus haute dans l'arbre), là je n'ai aucun soucis =/

 

Oui il faut que la pièce soit charger en memoire de plus voici l'aide traduite

 

Vous ne pouvez pas remplacer un composant sélectionné avec un composant du même nom même si les composants sont dans des dossiers différents. 

 

Le composant doit être un élément de niveau supérieur. Il ne peut pas être un composant d'un sous-ensemble. Si l'application a besoin de remplacer un composant du sous-ensemble, alors il doit ouvrir le sous-ensemble et obtenir le composant de cet assemblage

 

Cette méthode ferme tous les fichiers composant lorsqu'il est appelé dans un assemblage. Si les composants ont été modifiés, alors ces modifications ne sont pas automatiquement enregistrés. Vous devez enregistrer les modifications avant que les fichiers sont fermés.

 

pour eviter l'effait de changement de document avant d'ouvrir la piece on peux utiliser l'api

swapp.DocumentVisible(False, swDocumentTypes_e.swDocPART) bien penser a remettre a True apres ouverture

le document sera ouvert mais non visible

 

Pour le remplacement des occurrences cela doit fonctionner, car la commande remplace la piece selectionnée meme si elle a d'autres occurences, c'est la selection qui sera remplacée

 

 

 

 

 

4 « J'aime »

Bonjour jfaradon!

 

Merci de ta réponse :-)

 

je me demandais en effet si j'avais bien compris cette partie de l'aide api au vu de ce que celà donnait chez moi. Maintenant je suis certain que ya un binz quelque part x)

 

En effet, en plus de me remplacer une pièce non selectionnée (et cachée!) cette dernière se situe...dans un sous-ensemble! =o

 

J'ai rajouter ceci: "Set swModel = swApp.OpenDoc6(swNewfile, 1, 0, "", Longstatus, Longwarnings)"

 

Afin d'ouvrir la pièce de remplacement avant, mais ça veut pas visiblement x) j'verrais ça plus tard

 

en pièce jointe voici un screenshot avant/après la fonction replace.

 

La pièce surlignée dans l'arbre étant celle qui se  retrouve remplacée =/

 

 


replace.png

C'est une fonction que j'ai deja utilisé et qui fonctionne ... je vois pas trop ce qui peux se passer chez toi

surtout que d'apres ce que je vois l'inversion se fait entre des pieces qui n'ont pas le meme nom ?

 

Mais c'est compliqué de demander à l'utilisateur de rentrer le nom du composant + l'occurrence pourquoi ne pas lui demander de selectionner le composant dans l'arbre du coup plus de risque d'erreur dans les noms

 

Sinon la fonction l'exemple que je met dans la question precedant de Jean-Bapt' que je recolle ici permet d'obtenir les noms et de les proposer dans un menu deroulant style Combobox

 

 

Dim swDoc As SldWorks.ModelDoc2

Dim swAss As SldWorks.AssemblyDoc

Dim stOldFileName As String, stNewFileName As String

Dim bStatus As Boolean

 

Sub main()

 

    Set swApp = Application.SldWorks

    Set swDoc = swApp.ActiveDoc

    

    If swDoc Is Nothing Then Exit Sub

    If swDoc.GetType <> swDocumentTypes_e.swDocASSEMBLY Then Exit Sub

    

    Set swAss = swDoc

   

    Dim swComponents As Variant: swComponents = swAss.GetComponents(True)

    

    For i = 0 To UBound(swComponents)

        MsgBox swComponents(i).Name

    Next

    

 

End Sub

 

 

 

4 « J'aime »

Bonsoir à tous,

 

Yoann, si le remplacement d'une 'ancienne' pièce par une 'nouvelle' pièce dans un assemblage est le sujet, je me permets d'être septique. Pourquoi ?

Déjà les contraintes existantes entre l'ancienne' et les autres pièces, à mon avis, deviennent quasi toutes bancales! A moins que l'ancienne et la nouvelle aient beaucoup de similitudes (familles de pièces). A moins qu'il existe un super méga SW qui gère cela? Faut pas réver !!

Question limite, un assemblage étant ouvert, le remplacement d'une pièce d'un sous assemblage est impossible. il faudra alors ouvrir le sous assemblage pour que cela devienne possible.

Question occurrence, c'est bien SW qui alloue l'occurrence lors de l'ajout manuel d'une pièce 'clone' dans un assemblage, il le gère. La macro devra aussi prendre en compte l'occurrence de l'ancienne pièce.

 

Pour finir la méthode [ReplaceComponents] ne fait pas tout !

A mon avis, elle gère seulement le remplacement d'une 'ancienne' pièce par une 'nouvelle' pièce si et seulement si cette dernière est ouverte, ou, plus restrictif encore, ouverte et présente dans l'assemblage.

 

Alors l'idée, comme le dit Lucas dans le cadre d'une nouvelle pièce de remplacement étrangère à l'assemblage, est de l'ouvrir, de l'insérer dans l'assemblage, repérer son occurrence, et pour finir remplacer, l'ancienne par la nouvelle.

 

A+

 

MC

1 « J'aime »

Bonjour

 

Je tiens d'abord à m'excuser du temps de réponse, j'ai dû travailler sur tout autre chose et n'avait pas eu le temps d'y replonger donc

 

 

@CaronMaxime: Mettre la fonction de remplacement de pièce en macro complète est en effet plus qu'audacieux, du fait des contraintes par exemple. Mais mon but est bien précis ne t'en fais pas! Mon but est lié à des changements de formats qui d'ordinaires sont plutôt long niveau manip' pour les opérateurs. Je test également ma macro (qui n'est pas seulement constituée de replacecomponent mais également de changement de côtes de contraintes dans l'assemblage par exemple.

 

 

Pour ce qui est des contraintes bancales, elles le sont en effet un peu, mais en passant par la fonction de base de solidworks, il leur arrive la même chose ^^

 

@jfaradon: Merci pour ta macro :o elle m'a en effet été très utile afin de créer la combobox de selection que tu évoques :-)

 

Je vais d'ailleurs enfin clore cette question grâce à cela :-)

 

Amicalement,

 

Yoann