Repositionner composant par macro API

Bonjour,

 

Depuis ce matin je cherche une solution a mon problème mais impossible a trouver. Je voudrais insérer des composants et les repositionner dans un assemblage suivant l'origine de l'assemblage ou certain point, point 1, point 2 ...

 

Je réussis a crée un assemblage en automatique, a ouvrir tous mes fichiers et même a les insérer dans mon assemblage. Le premier composant n'ai même pas insérer a l'origine de l'assemblage et je ne sais pas comment on peu repositionner les ensemble sur les origines ou sur des points.

Si quelqu'un connais ces deux petite ligne de code, voici les ligne de code qui sont intéressante : 

'Ouverture de l'assemblage
Set Part = swApp.OpenDoc6(ActiveSheet.Range("H100"), 2, 0, "", longstatus, longwarnings)
swApp.ActivateDoc2 ActiveSheet.Range("H100"), False, longstatus

'--------------------------------------------
'assemblage des plans
boolstatus = Part.AddComponent(ActiveSheet.Range("H101"), ActiveSheet.Range("E101"), ActiveSheet.Range("F101"), ActiveSheet.Range("G101"))
boolstatus = Part.AddComponent(ActiveSheet.Range("H102"), ActiveSheet.Range("E102"), ActiveSheet.Range("F102"), ActiveSheet.Range("G102"))

 

 

il me faudrait juste des ligne en plus entre chaque insertion pour définir le point de positionnement de chaque pièce/ensembles.

 

Bonjour,

Regardez voir  ici si ça peut vous aider..

Merci de ta réponse rapide, mais je voulais directement les ligne de code et ne pas me creuser la tête :'(

 

Plus sérieusement, je réussis a insérer mes pièces je veux les déplacer après insertion. Je n'arrive pas a trouver la fonction. 

Pour rebondir sur ton poste, il existe un moyen pour charger le composant directement dans l'assemblage sans le pré-chargé ?

Bonjour,

Il y a surement ce que tu veux dans cette discussion.

Cordialement,

Bonjour a toi d.roger.

Déjà je tien a te remercier de ta réponse tu a poster juste après que j'ai trouver la fonction "mate" j'ai réaliser qu'on pouvais encore faire des macro a la "main" pour comparer et se débloquer.

Du coup j'arrive a quelque chose comme ça :

'assemblage des plans
boolstatus = Part.AddComponent(ActiveSheet.Range("H101"), ActiveSheet.Range("E101"), ActiveSheet.Range("F101"), ActiveSheet.Range("G101"))
    'positionnement de la pièce
            'suppression du "fixe" sur la première pièce
            boolstatus = Part.Extension.SelectByID2("K101", "COMPONENT", 0, 0, 0, False, 0, Nothing, 0)
            Part.unFixComponent
    Part.ClearSelection2 True
    boolstatus = Part.Extension.SelectByID2("J100", "EXTSKETCHPOINT", 0, 0, 0, False, 1, Nothing, 0)
    boolstatus = Part.Extension.SelectByID2("J101" & "K101", "EXTSKETCHPOINT", 0, 0, 0, True, 1, Nothing, 0)
   ' Dim swMate As Mate2
    Set swMate = Part.AddMate5(20, -1, False, 0.824524202641418, 0.001, 0.001, 0.001, 0.001, 0.5235987755983, 0.5235987755983, 0.5235987755983, False, False, 0, longstatus)
    Part.ClearSelection2 True
    boolstatus = Part.Extension.SelectByID2("K101", "COMPONENT", 0, 0, 0, False, 0, Nothing, 0)
    Part.FixComponent
    Part.ClearSelection2 True

 

Mon problème c'est qu'il ne sélectionne pas mon composant qui es en énumérer "K101", donc pas de contrainte ni rien de mis. Quel macro, plein de ligne pour rien :'(

 

Merci a vous pour votre aide, j'attend encore le bon lien ou une solution.

A quoi correspondent tes "J100", "J101" et "K101" ?

Vu le bout de code, je supposes que ce sont des valeurs prises dans des cellules d'un fichier Excel mais ces valeurs respectent-elles le nommage nécessaire ?

Par exemple :

- pour "K101", si c'est un composant nommé "Pièce1" faisant parti d'un assemblage nommé "Assemblage2" cela doit donné "Pièce1-1@Assemblage2".

- pour "J100", si c'est l'origine de Assemblage2, cela doit donné "Point1@Origine@Assemblage2".

- pour "J101", si c'est l'origine de Pièce1, cela doit donné "Point1@Origine@Pièce1-1@Assemblage2".

Met la ligne "MsgBox (longstatus)" après la ligne "Set swMate = Part.AddMate5(20, -1, False, 0.824524202641418, 0.001, 0.001, 0.001, 0.001, 0.5235987755983, 0.5235987755983, 0.5235987755983, False, False, 0, longstatus)", cela te permettra de récupérer le code de l'erreur, à comparer avec ceux-ci.

Et bien sûr, comme indiqué dans l'autre discussion, vérifie bien que tes pièces sont en mode résolues dans Solidworks, sinon ça ne marche pas...

Cordialement,

2 « J'aime »

Bonjour

 

Déjà désolé pour cette attente avant de répondre, je viens de me repenché sur mon sujet et voila ce qui en resort :

Ma macro ouvre bien toutes mes pièces/assemblage, avant d'ouvrir l'assemblage principale et d'insérer les divers composant, je vais surement devoir trouver un moyen pour les ouvrires et fermée a tour de rôle sinon ça va être lourd.

 

Lors de l'insertion de mes divers composant dans mon assemblages, ils sont bien en résolue mais se positionne tous a leur point de gravité malgré mon swMate. Je suis donc bloquer pour le moment.

 

Merci de ta réponse d.roger. les cases qui sont en référence sont, normalement, bien remplie. J'ai insérer la ligne MsgBox (longstatus), il me renvoi le message 4 = Incorrect selections for mate. Donc j'en conclue que mes case ne sont pas correctement rempli.

En J, je place mes point de référence 'Point1@Origine@'. Pour l'origine de l'assemblage j'ai juste 'Point1@Origine'

En K je nomme mes composant 'Pièce1-1@assemblage1'

Cette parti es a retravailler là je veux juste faire fonctionner mon montage, mais avec mes deux ligne de code :

boolstatus = Part.Extension.SelectByID2("J100", "EXTSKETCHPOINT", 0, 0, 0, False, 1, Nothing, 0)
boolstatus = Part.Extension.SelectByID2("J101" & "K101", "EXTSKETCHPOINT", 0, 0, 0, True, 1, Nothing, 0)

 

Normalement je n'ai pas d'erreur, si ?

 

Dernière chose, mes composant ne se fixe pas dans mon assemblage après ma macro pourtant j'ai ces trois ligne là :

    boolstatus = Part.Extension.SelectByID2("K101", "COMPONENT", 0, 0, 0, False, 0, Nothing, 0)
    Part.FixComponent
    Part.ClearSelection2 True

 

 

Merci a toi je vous tien au courant de mon avancement.

Bonjour,

Tes sélections ne sont donc pas bonnes puisque solidworks cherche des éléments qui se nomment "J100", "J101" et "K101" dans tes pièces et assemblages, il te faut récupérer les valeurs des cellules  dans Excel puis les passer dans des variables de type string que ensuite tu affectes à tes fonctions SelectByID2.

Dim FirstSelection As String
FirstSelection = 'valeur de la cellule Excel (attention ce n'est pas le numéro de la cellule)'
Dim SecondSelection As String
SecondSelection = 'valeur de la cellule Excel (attention ce n'est pas le numéro de la cellule)'
        
Part.ClearSelection2 True
boolstatus = swAssemblyDoc.Extension.SelectByID2(FirstSelection, "EXTSKETCHPOINT", 0, 0, 0, False, 1, Nothing, 0)
boolstatus = swAssemblyDoc.Extension.SelectByID2(SecondSelection, "EXTSKETCHPOINT", 0, 0, 0, True, 1, Nothing, 0)

Cordialement,

Bonjour,

 

Effectivement renvoyé la valeur J100 ou J101 n'étais pas une bonne idée, erreur de débutant ou de quelqu'un de peu habituer a du VBA. Du coup j'ai repris ce qu'il y avais dans le poste d'avant pour avancer voila ce que ca donne :

 

        For i = 101 To 103
boolstatus = Part.AddComponent(ActiveSheet.Range("H" & i), 0, 0, 0)

Dim CompInsert As String
CompInsert = ActiveSheet.Range("E" & i) & "-1@" & ActiveSheet.Range("E100")
Dim FirstSelection As String
FirstSelection = "Point1@Origine@" & CompInsert
Dim SecondSelection As String
SecondSelection = "Point1@Origine"

    'positionnement de la pièce
            'suppression du "fixe" sur la première pièce
            boolstatus = Part.Extension.SelectByID2(CompInsert, "COMPONENT", 0, 0, 0, False, 0, Nothing, 0)
            Part.unFixComponent

Part.ClearSelection2 True
boolstatus = Part.Extension.SelectByID2(FirstSelection, "EXTSKETCHPOINT", 0, 0, 0, False, 1, Nothing, 0)
boolstatus = Part.Extension.SelectByID2(SecondSelection, "EXTSKETCHPOINT", 0, 0, 0, True, 1, Nothing, 0)
            
Set swMate = Part.AddMate5(20, -1, False, 0, 0.001, 0.001, 0.001, 0.001, 0.5235987755983, 0.5235987755983, 0.5235987755983, False, False, 0, longstatus)

 

Pour le moment ma macro réussis a faire ces opération là :

Ouvrir tous les composant un a un, pour éviter le mode non résolue, je réfléchirais plus tard a une solution moins lourde.

Elle ouvre mon assemblage principal ou elle viens insérer les composants.

Elle rend le composant "libre". (Variable "CompInsert" ok)

Elle place mes composant origine/origine et les fixe.

 

Merci pour votre aide, maintenant faut que je trouve un moyen pour ouvrir mes composant directement dans mon assemble et les rendre résolue.

Pas besoin d'ouvrir tous les composants pour les mettre sur résolu, il suffit de lister les fils de l'assemblage chargé dans Solidworks à l'aide de la fonction "GetRootComponent3" puis de les mettre en mode résolu à l'aide de la fonction "SetComponentSuppression".

Cordialement,