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
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.
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 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...
Honderden!? Snel, een afbeelding om het ding te illustreren en te waarderen...
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...