Problème à la création de contrainte glissière

Bonjour,

J’ai une macro qui insère des pièces et crée des contraintes, elle fonctionne très bien quand je veux créer des contraintes glissière avec un coulisseau à deux faces parallèles, mais pas avec un coulisseau rond. En le faisant à la main cela ne pose pas de problème, donc pour voir d’où vient le problème j’ai crée un modèle simplifié avec un coulisseau rond et un parallèle et deux contraintes glissières correspondantes créées à la main.

Quand je veux recréer une nouvelle contrainte avec celle précédemment créée à la main, tout fonctionne bien, mais pas quand je la crée de zéro.

Après investigation, il semblerait que l’objet WidthMateFeatureData utilisé pour créer une nouvelle contrainte n’accepte par défaut (quand il est créé avec createMateData(11)) que 2 faces et « refuse » sa modification avec un coulisseau à une seule face.

A l’inverse, quand on le crée à la main avec un coulisseau à une seul face, il « refuse » d’être modifié en coulisseau à deux faces.
Est-ce que vous savez comment faire pour que l’objet WidthMateFeatureData accepte un coulisseau rond à partir de zéro ? (attribut TabSelection de taille 1)
Ou bien une astuce pour pouvoir créer une contrainte largeur avec un coulisseau rond?

Pour être plus précis voici un morceau de mon code commenté

'swCircularMateData : objet WidthMateFeatureData d’une contrainte glissière avec un coulisseau rond (créée à la main)
'swOldMateData : objet WidthMateFeatureData d’une contrainte glissière avec un coulisseau à deux faces parallèles (créée à la main)

Set swTestMateData = swCircularMateData 'récupère l'objet WidthMateFeatureData créé à la main
swAssembly.CreateMate swTestMateData 'crée la contrainte sans problème

Set swTestMateData = swAssembly.CreateMateData(11) 'crée un objet WidthMateFeatureData vide
'Recopie l'intégralité des attributs de l'objet
swTestMateData.ConstraintType = swCircularMateData.ConstraintType
swTestMateData.DistanceFromEnd = swCircularMateData.DistanceFromEnd
swTestMateData.FlipDimension = swCircularMateData.FlipDimension
swTestMateData.PercentDistanceFromEnd = swCircularMateData.PercentDistanceFromEnd
swTestMateData.TabSelection = swCircularMateData.TabSelection
swTestMateData.WidthSelection = swCircularMateData.WidthSelection

swAssembly.CreateMate swTestMateData 'la contrainte ne se crée pas
vTest = swTestMateData.TabSelection 'en inspectant l'attribut TabSelection, il s'avère être vide

swTestMateData.TabSelection = swParalleleMateData.TabSelection 'recopie l'attribut TabSelection de la contrainte avec le coulisseau parallele
swAssembly.CreateMate swTestMateData 'crée la contrainte sans problème

Bonjour @Léo_RHODES1 , et bienvenu sur ce forum…

Effectivement, la fonction « CreateMate » refuse obstinément de créer une contrainte de type « Glissière » avec un coulisseau ne comprenant qu’une surface cylindrique.
S’il y a une solution, elle est bien cachée… :joy:

En revanche, la fonction « AddMate5 », déclarée obsolète car plus ancienne, fait le travail.

Le code ci-dessous fonctionne sur mon exemple élémentaire.

Option Explicit
    
' Génération d'une contrainte d'assemblage de type glissière, entre deux faces planes d'une pièce
' et une face cylindrique d'une autre.
' La fonction de l'API utilisée est AddMate5, obsolète, mais qui a le mérite de fonctionner...
    
    Dim swApp As SldWorks.SldWorks
    Dim swModel As ModelDoc2
    Dim swAssemb As AssemblyDoc
    Dim swSelMgr As SelectionMgr

Sub Main()
    
    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
    Set swAssemb = swModel
    Set swSelMgr = swModel.SelectionManager

    ' Sélection des faces dans l'ordre: 2 plans parallèles d'une pièce, un cylindre d'une autre
    Dim faceWidth(1) As Face2
    Dim faceTab(0) As Face2
    
    Set faceWidth(0) = swSelMgr.GetSelectedObject6(1, -1)
    Set faceWidth(1) = swSelMgr.GetSelectedObject6(2, -1)
    Set faceTab(0) = swSelMgr.GetSelectedObject6(3, -1)
    
    ' Application des Marks exigés par AddMate5
    swModel.ClearSelection2 True
    Dim swSelData As SldWorks.SelectData
    Set swSelData = swSelMgr.CreateSelectData
    
    swSelData.Mark = 1
    faceWidth(0).Select4 True, swSelData
    faceWidth(1).Select4 True, swSelData
    swSelData.Mark = 16
    faceTab(0).Select4 True, swSelData

    ' Création de la contrainte
    Dim swMate As SldWorks.Mate2
    Dim errorStatus As Long
    
    ' Le paramètre 0 après swMateWIDTH correspond à l'option "Centré"
    Set swMate = swAssemb.AddMate5(swMateWIDTH, 0, False, 0, 0, 0, 0, 0, 0, 0, 0, False, False, 0, errorStatus)

    If swMate Is Nothing Then
        MsgBox "Erreur AddMate5. Code : " & errorStatus, vbCritical
    Else
        MsgBox "Contrainte créée avec AddMate5."
        swModel.ClearSelection2 True
    End If
End Sub
4 « J'aime »

Merci pour la réponse! Je fais les modif lundi matin et te tiens au courant du résultat!

1 « J'aime »

J’ai intégré ça à mon code et ça à l’air de bien fonctionner! A voir à l’utilisation!

Merci, tu m’as enlevé une belle épine du pied!