Pourquoi les utilisateurs de SolidWorks Surfacing devraient apprendre l'API

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

Article

SolidWorks offre de nombreuses possibilités de sélection. Mais certaines choses ne sont tout simplement pas possibles dans la boîte. Mon collègue Alin a parcouru les forums SolidWorks et est tombé sur ce fil de discussion. Une fois la face problématique supprimée, le modèle ressemblait à ceci :

1

La réparation n'est pas très compliquée, 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 n'affecte qu'un seul modèle, vous économiserez quelques minutes, mais s'il s'agit d'un modèle sur cent, vous économiserez 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 mettre en œuvre. Dans le cours 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 ce faire ressemble à ceci :

Set swApp = Application.SldWorks 'Se connecter à SolidWorks
Set swModel = swApp.ActiveDoc 'Se connecter à ModelDoc
Set swPartDoc = swModel 'Connecter au PartDoc
vBodies = swPartDoc.GetBodies2(swAllBodies, True) 'Obtenir les 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
Fin Si
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. Comme 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, puisque je n'ai pas besoin de filtrer quoi que ce soit dans ma sélection, j'ai utilisé Select au lieu de Select4. The true permet d'ajouter une sélection (comme si l'on maintenait la touche Ctrl enfoncée).

Voici à quoi ressemblera la sélection

2

Voici à quoi ressemble la sélection si nous remplaçons If swLoop.IsOuter Then par If swLoop.IsOuter = False Then

3

D'ailleurs, la sélection d'une entité à la fois prend beaucoup plus de temps que nécessaire car il y a une animation. Il existe un moyen de contourner ce problème, si vous êtes intéressé, merci de commenter ci-dessous.

Aucune de ces méthodes ne donne les résultats que nous recherchons. Examinons donc le problème de plus près : quel est le point commun entre toutes les arêtes que nous voulons sélectionner ?

4

Toutes les arêtes auxquelles il manque une face n'ont qu'une 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 supprimer le code qui traverse les boucles et ajouter le code qui tire parti 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 As Variant

Dim i Comme Entier, j Comme Entier, k Comme Entier, l Comme Entier

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)

If swAdjFace1 Is Nothing Or swAdjFace2 Is Nothing Then
Set swEntity = swEdge
swEntity.Select True
Fin Si
Suivant
Suivant
Suivant

End Sub

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

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

If swAdjFace1 Is Nothing Or swAdjFace2 Is Nothing Then
Set swEntity = swEdge
swEntity.Select True
Fin Si

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

Le résultat de l'exécution de ce code est le suivant :

5

Comme une surface plane n'a pas d'autres options que la sélection, il suffit d'ajouter swModel.InsertPlanarRefSurface juste avant End Sub pour ajouter la surface plane.

 

 

 

Trouver du contenu connexe par TAG :

Adam Bridgman, CSWE

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