Importer des pièces dans un assemblage avec origine identique

Bonjour,

 

Je souhaite importer deux pièces dans un assemblage et de faire en sorte que leur origines soient confondu sur celle de l'assemblage.

 

C'est quel que chose de facile manuellement mais la macro que j'obtien ne le fait pas...

 

merci de votre aide

 

Code:

Sub Assemblage()

 

Dossier_dest = "D:\Projet TRAPRO III\Test Macro\"

 

Set swApp = Application.SldWorks

 

Set Part = swApp.NewDocument("C:\ProgramData\SolidWorks\SolidWorks 2012\templates\Assemblage.asmdot", 0, 0, 0)

swApp.ActivateDoc2 "Assemblage1", False, longstatus

Set Part = swApp.ActiveDoc

Dim myModelView As Object

Set myModelView = Part.ActiveView

myModelView.FrameState = swWindowState_e.swWindowMaximized

boolstatus = Part.AddComponent(Dossier_dest & nom & ".SLDPRT", 0, 0, 0)

boolstatus = Part.AddComponent("D:\Projet TRAPRO III\TRAPRO DESIGN +\01-Bibliothèque technique Bague\Nouveau\Bague couronne 25.SLDPRT", 0, 0, 0)

 

End sub

Regardez dasn l'aide API (menu SolidWorks ?/Aide API)

Recherchez la commande AddComponent5

Il y a des exemples de code que vous pouvez reprendre 

3 « J'aime »

Je vois pas trop l'intéret parce que quand tu fais importer et que tu clique directement sur OK, ça colle les origines ensemble.

Peut être peut tu :

1- Libérer la pièce

2- ajouter une contrainte de coincidence sur l'origine de l'assemblage et sur l'origine de la pièce en cochant alligner les axes (je crois de tête).

3- Fixer la pièce

4- Supprimer la contrainte créé.

 

Je me permets de reprendre cette question qui n'a pas été marquée comme résolue puisque je me trouve face à un problème similaire.

Je souhaite insérer des pièces dans un assemblage en commençant par insérer une esquisses (dont les lignes servent de références pour l'assemblages d'autre pièces) et je n'arrive pas à rendre coincidentes les deux originies (via les fonction AddComponent, AddComponent2 ni même AddComponent5).

A savoir que je suis sous SolidWorks 2012.

Merci de votre aide

As tu regardé ce lien ? http://help.solidworks.com/2012/English/api/sldworksapi/Add_Component_and_Mate_Example_VB.htm

Bonjour,

J'avais déjà vu ce lien, mais mes essais n'étaient pas du tout concluant. J'ai cependant repris mon code pour le faire coincider à cet exemple mais un message d'erreur apparait :

"Erreur d'exécution '91':

Variable obket ou varaible de bloc With non définie"

Pour la ligne 100 : matefeature.Name = MateName

J'ai mis mon code en pièce jointe si ça peut permettre de le comprendre (mais il est relié à un userform)


createass.txt

Bonsoir,

Vous trouverez en pièces jointes une macro commentée qui permet de placer deux documents pièces et de rajouter une contrainte sur les origines.

Pour que ça fonctionne chez vous, modifiez le chemin d'accès au pièces et ouvrez un nouvel assemblage.

La macro est commentée, vous devriez assez facilement la comprendre.

Bon code.


insertion_pieces.swp
2 « J'aime »

Merci beaucoup je pense (j'espère) que ça va me sortir d'un beau pétrin !

1 « J'aime »

Bonjour,

Oui c'est encore moi, je reviens mais en fait le problème n'a pas été réglé. Je l'avais constaté il y a longtemps mais je m'etais du coup attachée à d'autres fonctions de mon programme, peu importe.

Malgrè ce beau programme réalisé par Yves T. je me heurte toujours au même problème : ma pièce est toujours fixée dès l'insertion et ne s'ajoute pas origine sur origine. J'ai beau essayer de fixer, libérer la pièce de tourner les lignes dans tous les sens rien y fait !

Merci pour votre aide.

Je joins ma macro, qui est très certainement pas très claire au vu du nombre de moficiations et d'essais que j'ai fait.


createass_v2.txt

Bonjour,

Comment fournissez vous les paramètres de la sub main?

Sub main(oCabineCode As String, SelectedFile As String, TracePath As String)

Vous n'avez fait aucun test sur les paramètres pour vérifier qu'ils ont bien une valeur avant de continuer le code.

Pourquoi réassigner une valeur à swApp en cour de programme?

Sans explications de votre part sur ce que vous pensiez faire avec :

Set swApp = _
Application.SldWorks

Set Part = swApp.NewDocument("C:\ProgramData\SolidWorks\SolidWorks 2012\templates\Assemblage.asmdot", 0, 0, 0)
Set swModel = swApp.ActivateDoc2(oCabineCode, False, longstatus)
Set Part = swApp.ActiveDoc
Dim myModelView As Object
Set myModelView = Part.ActiveView
myModelView.FrameState = swWindowState_e.swWindowMaximized

longstatus = Part.SaveAs3(SelectedFile, 0, 2)

Set Part = swApp.ActivateDoc2(oCabineCode, False, errors)
Dim TmpTitle As String
TmpTitle = swApp.ActiveDoc.GetTitle
swApp.CloseDoc TmpTitle

Je ne comprends pas à quoi ça sert :)

J'ai regardé un peu plus en détail votre code. Il y a pas mal d'erreurs. Reprenez la macro que j'ai posté. Elle fonctionne dans tout les cas de figure et pour une version de SW >2010.

Si vous avez déjà les noms de fichier à ajouter à l'assemblage, mettez les soit dans une variable globale (tableau de String) soit dans une propriété.

Si vous souhaitez permettre à l'utilisateur de choisir les documents à insérer, utilisez : swApp.GetOpenFileName(). Ca affichera l'OpenFileDialog de SW à laquelle vous pourez spécifier plusieurs options.

Evitez de réasigner des variables quand elles ne changent pas. Autant que possible, ne réafectez pas de valeur à swApp.

Vous pouvez réassigner une valeur aux autres variables.

Evitez de devoir passer des paramètres à la procédure  Main(). Il vaut mieux écrire une deuxième procédure qui sera appelée par Main qui elle aura des paramètres.

Style :

Sub Main()

FaireLeCalcul  Param1, Param2,Param3

End Sub

Sub FaireLeCalcul( ByVal Param1 As Blabla, ... )

End Sub

C'est plus lisible et plus parlant. Ca permet aussi de mieux écrire son code sans se mélanger surtout quand on débute en programation.

Pour moi, votre code ne fonctionne pas car une variable ne doit pas avoir la valeur prévue. Si vous ne faites pas de test sur les variables de type String, ça peut être dangereux. Une variable de type String à la valeur "String Empty" lors de son initialisation. C'est pour celà que dans beaucoup de languages de programation, on teste la valeur d'une variable.

Dans la macro que j'ai posté, je ne l'ai pas fait car il faut bien que vous mettez un peu du votre :)

Cordialement.

1 « J'aime »

Bonjour,

merci pour le retour. Je vais répondre petit à petit aux différentes interrogations que vous avez formulées (en fonction de mes essais et modifications) et expliquer mon programme.

Au lancement du programme j'ai un UF qui s'ouvre dans lequel l'itilsateur renseigne le nom de l'assemblage (oCabineCode) puis le dossier dans lequel il souhaite enregistrer l'assemblage (SelectedFile) et enfin l'élément de référence de cet assemblage par son chemin (Tracepath). Avec tous les essais réalisés je sai sque je n'ai aucun soucis sur ces différentes données. en cliquant sur "Créer l'assemblage" c'est ce programme qui se lance et qui va donc ouvrir un nouvel assemblage, l'enregistrer sous pour lui attribuer le nom souhaité et l'enregistrer dans le répertoire cible. Cest ce que fait ce petit bout de programme que vous avez extrait dans votre premier message d'hier. Lorsque je fais cet enregistrement je me retrouve en fait avec 2 assemblage "AssemblageX" et "oCabineCode" pour éviter les problèmes je ferme donc "AssemblageX".

Malgré la commande "Set Part = swApp.ActivateDoc2(oCabineCode, False, errors)" sinon je me retrouve toujours avec "AssemblageX" comme part actif. C'est donc pour ça que je réatribue une vlaeur à swApp. C'est aussi plus "simple" pour moi puisque je peux identifier mon assemblage par son nom, que je connais, alors que si c'est Assemblage"X" ça devient plus compliqué, enfin il me semble.

je vais essayer cependant de reprendre vos indications proposées dans le second message pour résoudre ce petit contre temps.

Merci encore de votre intéret.

Bon, j'ai bien entendu et essayer de suivre vos conseil j'ai relu, revu et supprimé pas mal de lignes de mon code. J'ai vérifier toutes les données de mes variables String, a priori je n'ai pas d'erreur de ce coté là non plus. Ma pièce s'intégre bien à mon assemble mais lorsque j'arrive à la contrainte ça rate encore !

Je me retrouve avec une erreur "438 : Propriété ou méthode non gérée par cet objet" et lorsque je fais des recherches sur l'aide API SM je ne trouve pas d'aide pour la fonction "AddMate5" or c'est cette ligne, et il s'agit de la dernière de mon code, qui provoque l'erreur. Le composant est ajouté fixe et j'ai toujours beau lancer la méthode UnfixComponent rien à faire.

Au pire je fais la manipulatin à la main, c'est ce que je fais depuis le début mais c'est un peu ... pénible.

Bonjour,

avez-vous vos 3 plans dans vos pièces ainsi que dans l'aasemblage??? Je pense que votre origine se trouve a l'intersection des 3 plans!!! Pourquoi ne pas voir avec votre pour la contrainte des plan entre eux, là vos pièce auraient la même origine et serais tout de suite contraintes...

1 « J'aime »

Mes excuses, AddMate5 n'est apparu qu'à partir de Sw 2015. Pous SW 2012, utilisez AddMate3.

Vous trouverez toutes les informations pour l'utilisation de la méthode dans l'aide SW API.

Bonjour,

Me revoilà avec toujours le même souci :

Je suis sur SW2012 et lorsque j'ajoute ma première pièce dans l'assemblage elle est fixée, je parviens à y ajouter des contraintes pour faire coincider les origines et les plans de références mais du coup elle est surcontrainte (il est impssible d'activer les contraintes puisqu'elles sont appliquées à un composant fixe). J'ai beau ajouté dans le code les lignes :

Part.FixComponent ou

Part.UnfixComponent

Cela ne change rien.

J'ai essayé avec la première formule puisque lorsque je fais un enregistrement de macro c'est celle qui apparait pour libérer ET fixer la pièce sous SW2012.

J'ai essayé avec la seconde mais cela ne fonctionne pas non plus.

Pour le moment mon programme tourne parfaitement sauf sur ce point (je fais donc des pauses pour libérer manuellement les premières pièces de chaque sous assemblages que je crée, et j'en fais 7 du coup c'est un peu pénible et le programme perd en fluidité).

Si vous avez une solution vous m'aideriez beaucoup.

Merci d'avance et encore !

Bonjour Mouette,

Si le code est toujours celui joint en page 1 de ce sujet je pense qu'il faudrait plutôt réaliser la concatenation de TraceName & "@" & AssemblyName dans une variable et l'appeler ensuite.

Je pense que ceci peut expliquer le problème. Sinon en plaçant un arrêt dans le code et en déroulant en pas-à-pas à partir de ce point ça permettra de vérifier si le modèle est bien sélectionné dans le FeatureManager.

boolstatus = Part.Extension.SelectByID2(TraceName & "@" & AssemblyName, "COMPONENT", 0, 0, 0, False, 0, Nothing, 0)
Part.UnfixComponent

 

1 « J'aime »

C'est bien toujours le même code.

Merci Cyril cela résoud mon problème !

il manquait surtout l'incrément dans le nom de l'élément après "TraceName"

boolstatus = Part.Extension.SelectByID2(TraceName & "-1@" & AssemblyName, "COMPONENT", 0, 0, 0, False, 0, Nothing, 0)
Part.UnfixComponent

Maintenant ça fonctionne parfaitement, encore merci !