Lynkoa

PB Fonctionnement "selectbyid2" dans une macro pour placer en auto des composants dans un asm
  • Topic:
    • SOLIDWORKS

  • 2 réponses
  • 219 vues

Par sebastien.bonnemaille Le 20 octobre 2021

Bonjour à tous,

Un collègue a créé une macro pour placer automatiquement des guides sur une implantation de convoyeurs. Cette macro fonctionne bien sur son poste, alors que sur le mien qui a la même config (HP Z4), les pièces s'ajoutent à l'asm mais aucune contraintes n'est créée et toutes les pièces ajoutées placent leur centre de visualisation sur l'origine de l'asm.

Voici un extrait de la macro pour les contraintes des nouvelles pièces:

'----------------------------------
            'Insérer et contraindre les guides
            '----------------------------------
            
            If TRM_aval Or CInt(longueur) > 1044 Then
            
                'Insérer et contraindre guide entrée droite
                If tole_à_droite = False Then
                
                    Set comp = Assembly.AddComponent5(lien_guide, 0, "", False, "", 0, 0, 0) 'Insérer guide dans l'assemblage
                    
                    If Not comp Is Nothing Then
                        guide = comp.Name2
                        Call Assembly.Extension.SelectByID2("Entrée@" & convoyeur & "@" & AssemblyTitle, "COORDSYS", 0, 0, 0, False, 0, Nothing, 0) 'Sélectionner repère 1
                        Call Assembly.Extension.SelectByID2("Entrée Droite " & larg & "@" & guide & "@" & AssemblyTitle, "COORDSYS", 0, 0, 0, True, 1, Nothing, 0) 'Sélectionner repère 2
                        Call Assembly.AddMate5(20, -1, False, 0, 0, 0, 0, 0, 0, 0, 0, False, False, 0, longstatus) 'Contraindre repère 1 sur repère 2
                        Assembly.ClearSelection2 True
                    End If
                    
                End If

 

Merci pour vos réponses

Meilleure réponse

sebastien.bonnemaille | 747 point(s)

Bonjour, 

Problème résolu, avec la fonction Select2, ce mode de sélection est plus robuste et fonctionne sur les différents PC de notre BE. Voici comment on a réécrit le programme:

Public Function contraindre(composant1 As SldWorks.Component2, repère1 As String, composant2 As SldWorks.Component2, repère2 As String)
'Fonction pour contraindre 2 composant à l'aide de leurs repères

Dim feat As SldWorks.Feature
                        
Set feat = composant1.FirstFeature

While Not feat Is Nothing 'Passe en revue tous les éléments de l'arbre du composant 1
    If feat.Name = repère1 Then
        Call feat.Select2(False, 0) 'Sélectionner repère 1
    End If
    Set feat = feat.GetNextFeature
Wend
                        
                        
Set feat = composant2.FirstFeature

While Not feat Is Nothing 'Passe en revue tous les éléments de l'arbre du composant 2
    If feat.Name = repère2 Then
        Call feat.Select2(True, 1) 'Sélectionner repère 2
    End If
    Set feat = feat.GetNextFeature
Wend

Call Application.SldWorks.ActiveDoc.AddMate5(20, -1, False, 0, 0, 0, 0, 0, 0, 0, 0, False, False, 0, longstatus) 'Contraindre repère 1 sur repère 2
Application.SldWorks.ActiveDoc.ClearSelection2 True
                    
End Function
 

Les autres réponses

sebastien.bonnemaille | 747 point(s)

Bonjour, 

Problème résolu, avec la fonction Select2, ce mode de sélection est plus robuste et fonctionne sur les différents PC de notre BE. Voici comment on a réécrit le programme:

Public Function contraindre(composant1 As SldWorks.Component2, repère1 As String, composant2 As SldWorks.Component2, repère2 As String)
'Fonction pour contraindre 2 composant à l'aide de leurs repères

Dim feat As SldWorks.Feature
                        
Set feat = composant1.FirstFeature

While Not feat Is Nothing 'Passe en revue tous les éléments de l'arbre du composant 1
    If feat.Name = repère1 Then
        Call feat.Select2(False, 0) 'Sélectionner repère 1
    End If
    Set feat = feat.GetNextFeature
Wend
                        
                        
Set feat = composant2.FirstFeature

While Not feat Is Nothing 'Passe en revue tous les éléments de l'arbre du composant 2
    If feat.Name = repère2 Then
        Call feat.Select2(True, 1) 'Sélectionner repère 2
    End If
    Set feat = feat.GetNextFeature
Wend

Call Application.SldWorks.ActiveDoc.AddMate5(20, -1, False, 0, 0, 0, 0, 0, 0, 0, 0, False, False, 0, longstatus) 'Contraindre repère 1 sur repère 2
Application.SldWorks.ActiveDoc.ClearSelection2 True
                    
End Function
 

mandragore | 3811 point(s)

Bonjour,

 

J'ai le même principe de macro et ca fonctionne très bien sur tous les PC du BE, juste je met mon clearselection avant.

 

'--------------------------
'positionnement de la pièce
    'Variable
Dim CompInsert As String            'Pièce qui viens d'etre inserer dans l'assemblage
CompInsert = ActiveSheet.Range("B" & i) & "-1@" & ActiveSheet.Range("B" & a)
Dim FirstSelection As String        'Constante, position de l'origine du composant
FirstSelection = "Point1@Origine@" & CompInsert
Dim SecondSelection As String       'A définir, chaque composant a une place différente
SecondSelection = ActiveSheet.Range("C" & i)      'suivant une esquisse et un point potentiellement différent

    'suppression du "Fixe" sur la première pièce
    boolstatus = swModel.Extension.SelectByID2(CompInsert, "COMPONENT", 0, 0, 0, False, 0, Nothing, 0)
    swModel.UnfixComponent

    'Selection du composant et ajout contrainte coincident origine/origine
    swModel.ClearSelection2 True
    boolstatus = swModel.Extension.SelectByID2(FirstSelection, "EXTSKETCHPOINT", 0, 0, 0, False, 1, Nothing, 0)
    boolstatus = swModel.Extension.SelectByID2(SecondSelection, "COORDSYS", 0, 0, 0, True, 1, Nothing, 0)
    Set swMate = swModel.AddMate5(20, -1, False, 0, 0.001, 0.001, 0.001, 0.001, 0.5235987755983, 0.5235987755983, 0.5235987755983, False, False, 0, longstatus)

    'Remettre la pièce "Fixe"
    boolstatus = swModel.Extension.SelectByID2(CompInsert, "COMPONENT", 0, 0, 0, False, 0, Nothing, 0)
    swModel.FixComponent
    swModel.ClearSelection2 True

 

J'ai fais un assemblage automatique de plusieurs niveau d'une 60ene de composant. Donc je les remets 'fixe' après mon positionnement ca rend l'assemblage utilisable après.

Je part d'une feuille excel ou je compile toutes mes données au préalable, ca me permet de détecter les erreurs quand il y en a.