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).
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)
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.
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
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 :)
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.
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.
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...
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.
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.