Krachten op het oppervlak van een onderdeel in een assemblage plaatsen

Ik heb een macro gemaakt om automatisch krachten van een oppervlakteselectieset in een onderdeel in te voegen.
In sommige gevallen moet ik hetzelfde doen, maar dan in de context van een montage. De selectiesets zitten altijd in een van de onderdelen van het geheel. Het commando werkt, maar er is geen oppervlak geselecteerd...

Ik zal de code die voor info wordt gebruikt:

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

Hallo @fgauvreau ,

Mijn conclusie over de oorsprong van deze weigering om een inspanning te leveren: de adressen van de objecten die door de " Items " van de selectieset worden teruggestuurd, verwijzen niet naar de vlakken van de selectie. Het lijkt noodzakelijk om de " GetCorrespondingItem " -methode van het item te gebruiken om het juiste adres te krijgen.

Ik zou hieraan willen toevoegen dat het aantal en de verscheidenheid aan parameters van de functie " AddEffort3 " niet helpen bij het verkennen...

Ik stel een werkende oplossing voor in de bijgevoegde macro, waarin ik heb geprobeerd CW-getypeerde variabelen te gebruiken, in plaats van "object " -typen, door de " Solidworks Simulation 20XX type library " toe te voegen aan de lijst met referenties.
De parameters van de inspanning zijn een beetje anders dan die van uw oorspronkelijke voorstel (inspanning met richtingsreferentie), maar de macro werkt en kan worden gebruikt als vergelijkingsbasis om te proberen storingen te identificeren.

De macro gebruikt twee benaderingen voor het selecteren van objecten, ofwel met de klassieke functies van de SelectionManager van het model of met de " Items " van de selectieset.

Helaas zal geen van hen werken als de selectieset bij een kamer hoort. De selectie ervan geeft niet hetzelfde gedrag als wanneer het tot de assemblage behoort. Hoewel de entiteiten zijn geïdentificeerd, zijn ze niet compatibel (?) en de functie " AddEffort3 " retourneert een foutcode.

Macro-bijlage, evenals het montagedocument dat ik heb gebruikt voor mijn tests (SW2022). De selectieset heeft 3 platte vlakken.

Chute.zip (537.0 KB)
CWCreationEffort.swp (71.5 kB)

2 likes

Hartelijk dank voor uw antwoord en de bestede tijd.
Ik geef toe dat ik " een beetje " onder je niveau in programmeren ...
Ik kon uw bestanden niet gebruiken omdat ik momenteel de 2019-versie gebruik.

De macro werkt als de selectiesets zich op assemblageniveau bevinden.

Handmatig moet u de selectieset selecteren die zich in de ruimte bevindt en een nieuwe selectieset maken.
Maar hoe zet je dit om in code???

We moeten de referenties bewerken en wijzigen om die van 2019 te gebruiken in plaats van 2022.

Hallo

De Solidworks API Help vermeldt geen functies die een selectieset (ISselectionSetFolder) kunnen maken. Noch in een deel, noch in een assemblage.
Een mogelijke oplossing zou zijn om de spelentiteiten in de kamer te selecteren en ze in een array te bewaren om er moeite voor te doen.

Nadeel: de selectieset wordt niet op het niveau van de montageconstructieboom bewaard voor eventueel later gebruik, waardoor de entiteiten gemakkelijk terug te vinden zijn.

Tot slot vind ik het moeilijk om het belang van deze aanpak in te zien in vergelijking met de functies van SW-simulatie die meerdere selecties mogelijk maken bij het maken van inspanningen.

Ik heb een macro die deeloppervlakken groepeert op basis van bepaalde criteria in selectiesets.
Het is normaal dat je moeite hebt om het nut van zo'n verzoek te begrijpen als je maar een paar krachten hoeft in te voegen... Maar stel je voor dat je er enkele honderden hebt... :slight_smile:

Hallo @fgauvreau ,

Honderden!? Snel, een afbeelding om het ding te illustreren en te waarderen... :smile:

Dat gezegd hebbende, begrijp ik uw interesse in selectiesets beter.

In tegenstelling tot wat ik eerder noemde, is het mogelijk om selectiesets aan te maken/verwijderen in VBA. De functies bevinden zich in de IModelDocExtension-interface van het document. Ze heten SaveSelection en DeleteSelection2.

Het enige dat overblijft is om je een kleine beheermodule voor te stellen waarmee je " SetSelection " kunt selecteren die bij onderdelen hoort en ze vervolgens één voor één in de assemblage kunt invoegen, of gegroepeerd...