Problem tworzenia naprężeń ślizgowych

Cześć,

Mam makro, które wstawia części i tworzy ograniczenia, działa świetnie, gdy chcę tworzyć ograniczenia suwaka za pomocą dwustronnego suwaka równoległego, ale nie z okrągłym suwakiem. Robiąc to ręcznie, nie stanowi to problemu, więc aby zobaczyć, skąd pochodzi problem, stworzyłem uproszczony model z okrągłym suwakiem i równoległym oraz dwoma odpowiadającymi mu ograniczeniami slajdów stworzonymi ręcznie.

Kiedy chcę odtworzyć nowe ograniczenie z tym, które wcześniej stworzyłem ręcznie, wszystko działa poprawnie, ale nie wtedy, gdy tworzę je od zera.

Po zbadaniu okazuje się, że obiekt WidthMateFeatureData użyty do utworzenia nowego ograniczenia domyślnie akceptuje tylko 2 ściany (przy tworzeniu za pomocą createMateData(11)) i " odmawia" modyfikacji za pomocą jednostronnego przesuwu.

Natomiast gdy jest wykonywany ręcznie za pomocą jednostronnego suwaka, " odmawia" przerobienia na dwustronny zamek.
Wiesz, jak sprawić, by obiekt WidthMateFeatureData akceptował suwak okrągły od zera? (Atrybut TabSelection o rozmiarze 1)
Albo trik, żeby utworzyć ograniczenie szerokości za pomocą suwaka okrągłego?

Dokładniej, oto fragment mojego kodu skomentowanego

'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

Witam @Léo_RHODES1 i witamy na tym forum...

Rzeczywiście, funkcja " CreateMate " uparcie odmawia stworzenia ograniczenia " Slide " za pomocą suwaka posiadającego jedynie powierzchnię cylindryczną.
Jeśli jest rozwiązanie, jest dobrze ukryte... :joy:

Z kolei funkcja " AddMate5 ", uznana za przestarzałą, ponieważ jest starsza, spełnia swoje zadanie.

Poniższy kod opiera się na moim podstawowym przykładzie.

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 polubienia

Dzięki za odpowiedź! Zmiany wprowadzę w poniedziałek rano i będę informować o wyniku!

1 polubienie

Zintegrowałem to z moim kodem i wydaje się, że działa dobrze! Do zobaczenia w użyciu!

Dziękuję, usunąłeś piękny cierń w moim boku!