Macro Insertion Force à partir d'un jeu de sélection

Bonjour,

Je travaille sur Solidworks 2019 prenium… complément « simulation »

Je souhaite faire une macro qui insert une force en automatique. L’idée…

  • récupérer un jeu de sélection déjà créé contenant plusieurs faces
  • insérer une force de 1N sur chaque face du jeu de sélection
  • « cacher » la force car il peut y avoir plus de 1000 faces dans le jeu de sélection

J’ai réussi à faire une force par face en mettant la commande dans une boucle mais du coup le rapport de simulation devient très lourd et illisible.

Manuellement, quand je créé l’étude de simulation, voici ma méthode:

  • je sélectionne une des faces du jeu de sélection
  • j’insère une force de 1N
  • je « cache » la force
  • j’édite la force
    - je supprime la face préalablement sélectionnée
    - je sélectionne le jeu de sélection (toutes les faces du jeu s’intègrent dans une seule force"

L’idée sera aussi de faire la même chose avec les zones d’appuis fixes dans un 2eme temps…

Help! merci d’avance à tous les pros de la programmation!

Bonjour,
Ici, celui qui maîtrise le mieux la force c’est @OBI_WAN ! Mais je crois qu’il ne te sera d’aucune aide, jeune padawan.

(désolé, fallait que jla fasse)

3 « J'aime »

Bonjour;

Vous travaillez sur un assemblage ou sur un pièce ? Et quel type ? (Poutre(s),Faible épaisseurs, mécanosoudées… autre)

Ce serait intéressant d’avoir une idée de la géométrie (1000 faces ???) sur laquelle vous appliquer votre force de 1N (1Newton, c’est pas beaucoup … ne serait-il pas plus simple de jouer avec la gravité, ou les masses ?
… Ma curiosité ne sera pas contre une petite capture écran …ou mieux le fichier *.sld… (Solidworks 2019 (c’est vieillot ça: 2019) à l’avantage pour pouvoir être exploité par un grand nombre des forumistes ici présents… :yum:

Cordialement.

1 « J'aime »

Merci pour l’intérêt pour le sujet!
L’étude statique est faite soit dans un fichier pièce soit sur une pièce dans un assemblage.
Dans tous les cas, la pièce est un volume (extrusion) d’environ 1.6mm d’épaisseur.
Je peux fournir un fichier sld en message privé si besoin.

1000 faces, 1,6mm d’épaisseur… c’est une pièce du genre grillagée, moletée, gaufrée ?

les paris sont ouverts!
non c’est du genre carte électronique

Arf je connais que ça… Ça explique le 1,6mm, j’aurais pu y penser mais pour qu’il y ait 1000 faces, soit elle a une forme sacrément originale, pleine de trous et de découpes, soit tu inclus les composants mais là ça change tout à la simulation.

Je suppose que les points d’appuis fixes dont tu parles sont les zones de maintien et fixation de la pcb.

Le but de la simulation est-il de simuler une déformation de la pcb, si par exemple elle est dans un boitier flexible, ou de simuler sa déformation si un objet vient appuyer dessus ?

@Sylk je métrise la Force et sa capacités extraordinaires, telles que la télékinésie, la clairvoyance et la manipulation de l’esprit. j’ai été, formés dans l’art de la maîtrise de soi et de la méditation.
mais avec solidworks on est dans un autre monde seul Dassault en a la maitrise… en fait non je pense que même eu savent pas :rofl: :rofl: :rofl:

6 « J'aime »

Pour info, voici le code que j’utilise pour insérer la force à chaque surface dans la boucle:

Dim swApp As Object

Dim Part As Object
Dim boolstatus As Boolean
Dim longstatus As Long, longwarnings As Long

Sub insert_force(DispatchObj1 As Object)

Set swApp = Application.SldWorks

Set Part = swApp.ActiveDoc
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()

DispArray = Array(DispatchObj1)             'Récupération de la surface

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)

' Redraw
Part.GraphicsRedraw2
Set StudyManagerObj = Nothing
Set ActiveDocObj = Nothing
Set CWAddinCallBackObj = Nothing
Set COSMOSWORKSObj = Nothing
End Sub

Mais comment « regrouper » plusieurs surface dans un « lot » qui serait appeler par la commande d’insertions???
A moins que ce ne soit pas la bonne logique??

Attention pour le code utiliser la balise:
image
Sinon la traduction de bing fait des dégâts:
image
Pour le reste pas d’idées pour ton soucis.

2 « J'aime »

Vous pouvez essayer « Selection list » mais je ne sais pas si on peut l’appliquer avec « Simulation »:
https://help.solidworks.com/2019/english/api/sldworksapi/Selection_Lists_VB.htm
ou

[Hors Sujet-ON]
t’as oublié le voyage dans le temps @OBI_WAN
[Hors Sujet-OFF]

2 « J'aime »

Peut-être plutôt passer par une loop « for », « until » ou « while » pour collecter/affecter chaque face ?

Ou mieux, je laisse répondre les pro de la macro. Moi ça fait trop longtemps que j’ai plus codé une ligne…

Bonjour fgauvreau,
Essaye ça. Ça percourira les jeux de selections et créera une force cachée pour chacun (par contre sans l’étape de la créer juste sur la première face. Je n’ai peut être pas bien compris le pourquoi de cette étape)

Option Explicit
Dim swApp As SldWorks.SldWorks
Sub main()
    Dim swModel As SldWorks.ModelDoc2
    Dim swFeat As SldWorks.Feature
    Dim swSelectionSetFolder As SldWorks.SelectionSetFolder
    Dim vSels As Variant
    Dim vSel As Variant
    Dim swSelSet As SldWorks.SelectionSet
    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
    Set swFeat = swModel.FirstFeature

    While Not swFeat Is Nothing
        If swFeat.Name = "Selection Sets" Then
            Set swSelectionSetFolder = swFeat.GetSpecificFeature2
            vSels = swSelectionSetFolder.GetSelectionSets
            For Each vSel In vSels
                Set swSelSet = vSel
                Debug.Print "Nom du jeu de Selection: " & swSelSet.GetName
                swModel.ClearSelection2 True
                CreateForce swSelSet
            Next
        End If
        Set swFeat = swFeat.GetNextFeature
    Wend
End Sub

Sub CreateForce(swSelSet As SldWorks.SelectionSet)
    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

    vSelItems = swSelSet.GetSelectionSetItems
    vSelItemTypes = swSelSet.GetSelectionSetItemTypes

    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
3 « J'aime »

Merci beaucoup!
C’est exactement ce qu’il me fallait…
J’ai pu intégrer le code dans ma macro en gérant la valeur de la force suivant le jeu de sélection et en créant des appuis fixes sur le même principe.

StudyObj.ShowOrHideForce = FalseTexte préformaté
nickel pour alléger le traitement!

1 « J'aime »