Pourquoi les utilisateurs de SolidWorks Surfacing devraient apprendre l'API

Article par Adam Bridgman, CSWE mis à jour le 18 juillet 2013

Article

SolidWorks offre beaucoup de possibilités pour effectuer des sélections. Mais certaines choses ne sont tout simplement pas possibles. Mon collègue Alin parcourait les forums de SolidWorks et est tombé sur ce fil de discussion. Une fois la face problématique supprimée, le modèle ressemblait à ceci :

1

Il n'est pas très compliqué d'y remédier, comme le montrent les vidéos d'Alin publiées dans les deux premiers articles de cette série(épisode 1, épisode 2). Il est cependant assez long de faire toutes les sélections et de nettoyer le tout. Si cela ne concerne qu'un seul modèle, vous gagnerez quelques minutes, mais s'il s'agit d'un modèle sur cent, vous gagnerez des heures, voire des milliers ! Dans ce cas, une automatisation plus poussée vaut la peine, de sorte que votre ordinateur puisse faire votre travail pendant que vous dormez.

La première étape consiste à analyser les méthodes possibles et la manière de les réaliser. Dans le cours sur l'API, vous apprenez à parcourir la géométrie des pièces et le modèle d'objet, ce qui constitue un bon point de départ. Nous nous connectons d'abord à SolidWorks, puis au modeldoc (objet général pour tout ce que les pièces, les assemblages et les mises en plan ont en commun), puis au partdoc, puis aux corps, puis aux faces, puis aux boucles, puis aux arêtes.

Le code pour faire cela ressemble à ceci :

Set swApp = Application.SldWorks 'Connexion à SolidWorks
Set swModel = swApp.ActiveDoc 'Connexion à ModelDoc
Set swPartDoc = swModel 'Connexion à PartDoc
vBodies = swPartDoc.GetBodies2(swAllBodies, True) 'Obtenir des corps
For i = LBound(vBodies) To UBound(vBodies)
Set swBody = vBodies(i)
vFaces = swBody.GetFaces 'Obtenir les visages
For j = LBound(vFaces) To UBound(vFaces)
Set swFace = vFaces(j)
vLoops = swFace.GetLoops 'Obtenir les boucles
For k = LBound(vLoops) To UBound(vLoops)
Set swLoop = vLoops(k)
Si swLoop.IsOuter Alors
vEdges = swLoop.GetEdges 'Obtenir les arêtes
For l = LBound(vEdges) To UBound(vEdges)
Set swEdge = vEdges(l)
Next
End If
Suivant
Suivant
Suivant

 

Si nous ajoutons quelques lignes de code après Set swEdge = vEdges(l), nous sélectionnerons tous les bords extérieurs

Set swEntity = swEdge
swEntity.Select True

Presque tout ce qui peut être sélectionné dans la zone graphique de SolidWorks est un sous-ensemble d'Entité, ce qui inclut les corps, les corps surfaciques, les arêtes, les boucles, etc. Puisqu'il s'agit d'un sous-ensemble, nous pouvons toujours définir l'entité comme étant égale à n'importe lequel de ces objets. Les entités comprennent également une méthode de sélection. Comme je n'ai pas besoin de filtrer quoi que ce soit dans ma sélection, j'ai utilisé Select au lieu de Select4. Le vrai est pour la sélection par appendice (se comporte comme si je maintenais la touche Ctrl enfoncée).

Voici à quoi ressemblera la sélection

2

Voici à quoi ressemble la sélection si nous changeons If swLoop.IsOuter Then en If swLoop.IsOuter = False Then

3

A propos, sélectionner une entité à la fois comme cela prend beaucoup plus de temps que nécessaire parce qu'il y a une animation. Il existe un moyen de contourner ce problème, si vous êtes intéressé, veuillez commenter ci-dessous.

Aucune de ces méthodes ne donne les résultats que nous recherchons. Examinons donc de près le problème : qu'ont en commun tous les bords que nous voulons sélectionner ?

4

Toutes les arêtes auxquelles il manque une face n'ont qu'une seule face adjacente. Il se trouve que l'objet arête possède également une méthode appelée GetTwoAdjacentFaces2, devinez ce qu'elle peut faire pour nous. Nous pouvons retirer le code pour traverser les boucles et ensuite ajouter le code qui tire profit de cette méthode :
Sub main()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swPartDoc As SldWorks.PartDoc
Dim swBody As SldWorks.Body2
Dim swFace As SldWorks.Face2
'Dim swLoop As SldWorks.Loop2
Dim swEdge As SldWorks.Edge
Dim swEntity As SldWorks.Entity

Dim swAdjFace1 As SldWorks.Face2
Dim swAdjFace2 As SldWorks.Face2

Dim vBodies As Variant
Dim vFaces As Variant
Dim vLoops As Variant
Dim vEdges As Variant
Dim vAdjFaces En tant que Variante

Dim i As Integer, j As Integer, k As Integer, l As Integer

Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
Set swPartDoc = swModel
vBodies = swPartDoc.GetBodies2(swAllBodies, True)
For i = LBound(vBodies) To UBound(vBodies)
Set swBody = vBodies(i)
vFaces = swBody.GetFaces
For j = LBound(vFaces) To UBound(vFaces)
Set swFace = vFaces(j)
vEdges = swFace.GetEdges
For k = LBound(vEdges) To UBound(vEdges)
Set swEdge = vEdges(k)

vAdjFaces = swEdge.GetTwoAdjacentFaces2
Set swAdjFace1 = vAdjFaces(0)
Set swAdjFace2 = vAdjFaces(1)

Si swAdjFace1 n'est rien ou swAdjFace2 n'est rien alors
Set swEntity = swEdge
swEntity.Select True
End If
Suivant
Suivant
Suivant

End Sub

Les déclarations Dim en haut ne sont pas nécessaires mais elles facilitent l'écriture, la modification et la maintenance du code. Les nouvelles lignes sont :

vAdjFaces = swEdge.GetTwoAdjacentFaces2
Set swAdjFace1 = vAdjFaces(0)
Set swAdjFace2 = vAdjFaces(1)

Si swAdjFace1 n'est rien ou swAdjFace2 n'est rien alors
Set swEntity = swEdge
swEntity.Select True
End If

Ce qui signifie simplement, pour cette arête (et nous le faisons pour chaque arête) obtenir les deux faces adjacentes, s'il n'y a qu'une seule face adjacente alors sélectionner l'arête.

Le résultat de l'exécution de ce code ressemble à ceci :

5

Puisqu'une surface planaire n'a pas d'options autres que la sélection, nous pouvons simplement ajouter swModel.InsertPlanarRefSurface juste avant End Sub et cela ajoutera la surface planaire.

 

 

 

Liens connexes

Obtenez des services SOLIDWORKS certifiés de Javelin

Javelin Experts peut vous aider à :

Trouver du contenu connexe par TAG :

Adam Bridgman, CSWE

Adam Bridgman, expert certifié SOLIDWORKS, fournit aux clients une assistance technique et une formation.