J’ai créé une macro pour insérer automatiquement des forces à partir d’un jeu de sélection de surface dans une pièce.
Dans certains cas, j’ai besoin de faire la même chose mais dans le contexte d’un assemblage. Les jeux de sélection sont toujours dans une des pièces de l’assemblage. La commande fonctionne mais aucune surface n’est sélectionnée…
Je vous mets le code utilisé pour info:
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
Ma conclusion sur l’origine de ce refus de créer un effort : les adresses des objets renvoyés par les « Item » de l’ensemble de sélection ne pointent pas sur les faces de la sélection. Il semble nécessaire de faire appel à la méthode « GetCorrespondingItem » de l’item pour obtenir la bonne adresse.
Je me permets d’ajouter que le nombre et la variété des paramètres de la fonction « AddEffort3 » n’aident pas à l’exploration…
Je propose une solution fonctionnelle dans la macro jointe, dans laquelle je me suis efforcé d’utiliser des variables typées de CW, plutôt que des types « objet », en ajoutant la bibliothèque « Solidworks Simulation 20XX type library » à la liste des références.
Les paramètres de l’effort sont un peu différents de ceux de votre proposition initiale (effort avec référence de direction), mais la macro fonctionne et peut servir de base de comparaison pour tenter d’identifier des dysfonctionnements.
La macro utilise utilise deux approches de sélection des objets, soit avec les fonctions classiques du SelectionManager du modèle, soit avec les « Item » de l’ensemble de sélection.
Malheureusement, aucune ne donne de résultat si l’ensemble de sélection appartient à une pièce. Sa sélection ne donne pas le même comportement que lorsqu’il appartient à l’assemblage. Bien qu’identifiées, les entités ne sont pas conformes (?) et la fonction « AddEffort3 » renvoie un code d’erreur.
Macro en pièce jointe, ainsi que le document d’assemblage utilisé pour mes tests (SW2022). L’ensemble de sélection comporte 3 faces planes.
Merci beaucoup pour votre réponse et le temps passé.
J’avoue être « un peu » en dessous de votre niveau en programmation…
Je n’ai pas pu me servir de vos fichiers car j’utilise pour le moment la version 2019.
La macro fonctionne si on les jeux de sélection sont au niveau de l’assemblage.
Manuellement, il faut sélectionner le jeu de sélection qui est dans la pièce et créer un nouveau jeu de sélection.
Mais comment retranscrire cela en code???
L’aide de l’API de Solidworks ne mentionne aucune fonction susceptible de créer un ensemble de sélection (ISelectionSetFolder). Ni dans une pièce, ni dans un assemblage.
Une solution possible passerait par la sélection des entités du jeu inclus dans la pièce, et leur conservation dans un tableau, pour leur appliquer des efforts.
Inconvénient: le set de sélection n’est pas conservé au niveau de l’arbre de construction de l’assemblage pour un éventuel usage ultérieur, permettant de retrouver facilement les entités.
Pour conclure, j’ai du mal à percevoir l’intérêt de cette démarche par rapport aux fonctions de SW Simulation qui permettent des sélections multiples lors de la création d’efforts.
J’ai une macro qui regroupe des surfaces de pièce suivant certains critères dans des jeux de sélection.
C’est normal d’avoir du mal à comprendre l’intérêt d’une telle demande si vous n’avez que quelques forces à insérer… Mais imaginez que vous en ayez plusieurs centaines…
Des centaines !? Vite, une image pour illustrer et apprécier la chose…
Ceci étant, je comprends mieux votre intérêt pour les ensembles de sélection.
Contrairement à ce que j’ai indiqué précédemment, il est possible de créer/supprimer des ensembles de sélection en VBA. Les fonctions sont dans l’interface IModelDocExtension du document. Elles se nomment SaveSelection et DeleteSelection2.
Reste à imaginer un petit module de gestion qui permettrait de sélectionner des « SetSelection » appartenant à des pièces, puis de les insérer dans l’assemblage, un par un, ou regroupés…