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