Wstawianie sił na powierzchni części w zespole

Utworzyłem makro do automatycznego wstawiania sił ze zbioru wyboru powierzchni do elementu.
W niektórych przypadkach muszę zrobić to samo, ale w kontekście zgromadzenia. Zbiory wskazań znajdują się zawsze w jednej z części zespołu. Polecenie działa, ale nie jest wybrana żadna powierzchnia...

Wstawię kod używany do informacji:

Public Sub CreateForce200(swSelSet As SldWorks.SelectionSet)
    Dim swApp As Object
    Set swApp = Application.SldWorks
    
    Dim COSMOSWORKSObj As Object
    Dim CWAddinCallBackObj As Object
    
    Set CWAddinCallBackObj = swApp.GetAddInObject("CosmosWorks.CosmosWorks")
    Set COSMOSWORKSObj = CWAddinCallBackObj.CosmosWorks

    Dim ActiveDocObj As Object
    Dim StudyManagerObj As Object
    Dim LoadsAndRestraintsManagerObj As Object
    Dim ErrorCodeObj As Long
    Dim ContactManagerObj As Object
    Set ActiveDocObj = COSMOSWORKSObj.ActiveDoc()
    Set StudyManagerObj = ActiveDocObj.StudyManager()
    Dim StudyObj As Object
    Set StudyObj = StudyManagerObj.GetStudy(0)
    Set LoadsAndRestraintsManagerObj = StudyObj.LoadsAndRestraintsManager()

    Dim vSelItems As Variant
    Dim vSelItemTypes As Variant
    Dim swSelItem As SldWorks.SelectionSetItem
    Dim swFace As SldWorks.Face2
    Dim j As Integer
    Dim errors As Long
    

    vSelItems = swSelSet.GetSelectionSetItems
    vSelItemTypes = swSelSet.GetSelectionSetItemTypes

    Debug.Print "Nom du jeu de Selection: " & swSelSet.GetName
    
    'Contrôle pièce activée
    'Dim swPart As SldWorks.PartDoc
    'Set swPart = swApp.ActivateDoc3(nameCarte2, True, swRebuildOnActivation_e.swUserDecision, errors)
    

    Dim DispArray As Variant
    Dim cnt As Long
    cnt = UBound(vSelItems)
    Dim myArray()
    ReDim Preserve myArray(cnt)

    For j = 0 To cnt
        Set swSelItem = vSelItems(j)
        If vSelItemTypes(j) = swSelectType_e.swSelFACES Then
            Set myArray(j) = swSelItem.GetCorrespondingItem
        End If
    Next
    DispArray = myArray

    Dim CWForceObj As Object
    Dim DistanceValues As Variant
    Dim ForceValues As Variant
    Dim ComponentValues As Variant
    Dim data(6) As Double
    data(0) = 1: data(1) = 1: data(2) = 1: data(3) = 1: data(4) = 1: data(5) = 1
    ComponentValues = data

    Set CWForceObj = LoadsAndRestraintsManagerObj.AddForce3(1, 0, -1, 0, 0, 0, (DistanceValues), (ForceValues), 0, False, 0, 0, 0, 1, (ComponentValues), False, False, (DispArray), Nothing, False, ErrorCodeObj)

    StudyObj.ShowOrHideForce = False

    Set StudyManagerObj = Nothing
    Set ActiveDocObj = Nothing
    Set CWAddinCallBackObj = Nothing
    Set COSMOSWORKSObj = Nothing
End Sub

Witaj @fgauvreau ,

Mój wniosek na temat pochodzenia tej odmowy tworzenia wysiłku: adresy obiektów zwracanych przez " Elementy " zbioru selekcji nie wskazują na twarze wyboru. Wydaje się, że konieczne jest użycie metody " GetCorrespondingItem " przedmiotu, aby uzyskać poprawny adres.

Dodam jeszcze, że ilość i różnorodność parametrów funkcji " AddEffort3 " nie pomaga w eksploracji...

Proponuję działające rozwiązanie w załączonym makrze, w którym starałem się użyć zmiennych typu CW, a nie typów "obiektowych " , dodając do listy odniesień " bibliotekę typów Solidworks Simulation 20XX".
Parametry wysiłku są nieco inne niż te z twojej początkowej propozycji (wysiłek z odniesieniem do kierunku), ale makro działa i może być wykorzystane jako podstawa do porównania w celu zidentyfikowania usterek.

Makro wykorzystuje dwa podejścia do wybierania obiektów, albo za pomocą klasycznych funkcji SelectionManager modelu, albo za pomocą " Elementów " zbioru wskazań.

Niestety, żaden z nich nie zadziała, jeśli zbiór zaznaczeń należy do pomieszczenia. Jego wybór nie daje takiego samego zachowania, jak w przypadku, gdy należy do zespołu. Mimo że jednostki są zidentyfikowane, nie są zgodne (?), a funkcja " AddEffort3 " zwraca kod błędu.

Załącznik do makra, a także dokument montażowy używany do moich testów (SW2022). Zbiór wskazań składa się z 3 płaskich ścian.

Chute.zip (537,0 KB)
CWCreationEffort.swp (71,5 KB)

2 polubienia

Bardzo dziękuję za odpowiedź i poświęcony czas.
Przyznaję, że jestem " trochę " poniżej twojego poziomu w programowaniu...
Nie mogłem użyć twoich plików, ponieważ obecnie używam wersji 2019.

Makro działa, jeśli zbiory wskazań znajdują się na poziomie zespołu.

Ręcznie należy wybrać zbiór wskazań, który znajduje się w pomieszczeniu i utworzyć nowy zbiór wskazań.
Ale jak przepisać to na kod???

Musimy edytować i zmieniać referencje, aby używać tych z 2019 roku zamiast z 2022 roku.

Witam

Pomoc API Solidworks nie wspomina o żadnych funkcjach, które mogą utworzyć zbiór wskazań (ISselectionSetFolder). Ani w części, ani w zespole.
Możliwym rozwiązaniem byłoby wybranie elementów gry znajdujących się w pokoju i trzymanie ich w tablicy, aby zastosować do nich wysiłek.

Wada: zbiór wskazań nie jest przechowywany na poziomie drzewa konstrukcyjnego zespołu w celu ewentualnego późniejszego wykorzystania, co pozwala na łatwe odnalezienie elementów.

Podsumowując, trudno mi dostrzec zainteresowanie tym podejściem w porównaniu z funkcjami symulacji oprogramowania, które pozwalają na wielokrotny wybór podczas tworzenia wysiłków.

Mam makro, które grupuje powierzchnie części według określonych kryteriów w zbiorach wskazań.
To normalne, że masz problem ze zrozumieniem sensu takiego żądania, jeśli masz tylko kilka sił do włożenia... Ale wyobraź sobie, że masz kilkaset... :slight_smile:

Witaj @fgauvreau ,

Setki!? Szybki, obraz, aby zilustrować i docenić rzecz... :smile:

Biorąc to pod uwagę, lepiej rozumiem twoje zainteresowanie zbiorami wyboru.

W przeciwieństwie do tego, o czym wspomniałem wcześniej, w VBA możliwe jest tworzenie/usuwanie zbiorów wskazań. Funkcje znajdują się w interfejsie IModelDocExtension dokumentu. Są one nazywane SaveSelection i DeleteSelection2.

Pozostaje tylko wyobrazić sobie mały moduł zarządzania, który pozwoliłby wybrać " SetSelection " należące do części, a następnie wstawić je do zespołu, jedna po drugiej lub zgrupowane razem...