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!
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…
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.
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
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??
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
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!