Au détour du sondage, un abonné du blog m’a soulevé une question.

”Comment faire une spirale carrée sur Catia ?”

Une spirale carrée, c’est ça:

Spirale Carrée

Je ne sais pas pourquoi mais cela m’a travaillé un petit peu et je me suis pris au jeu.

Alors, Comment faire ?
Il n’y a pas, à priori, de fonction permettant, même de façon détournée, de réaliser un tracé de droites successives et perpendiculaires  formant  un escargot.

La construction étant logiquement inscrite dans une boucle, je suis donc parti sur une macro.

Une macro Vb.Net pour tracer une spirale carrée sur Catia V5

Les macros nous permettent d’automatiser, entre autre, la création d’entités, ici filaires, que nous aurions dû faire manuellement pour atteindre ce résultat.
Il y a bien sûr de nombreuses stratégies permettant d’arriver au but.
J’aurais pu par exemple tracer les diagonales et répartir des points qu’il aurait fallu relier.

J’ai opté pour un tracé successif de segments perpendiculaires et de longueurs croissantes et plutôt que de me positionner sur un des plans de départ et à l’origine du modèle j’ai opté pour un cas plus général qui s’appuie sur des éléments de référence dans une Catpart préparée à cet effet.

La vidéo de l’article

Préparation de la CatPart

Catia V5 - Spirale carrée - préparation modèle

Pour utiliser la macro, voilà comment doit être préparée la Catpart.
Nous devons y trouver un set géométrique nommé “Ref” ainsi que les trois éléments suivants :

  • Un plan servant de support pour la spirale nommé “PlanPourSpirale
  • Un point sur ce plan nommé “PointDepartSpirale” (début de la spirale en son centre)
  • Une ligne qui n’est pas obligatoirement liée au point précédent nommé “DirectiondepartSpirale” pour donner un angle global à la spirale par rapport au repère global de la part.

Il est très important de respecter les dénominations de ces éléments car la macro ira les rechercher par leur nom.

Comment ça marche ?

Dans le programme, il y a aussi des valeurs supplémentaires pour caractériser la spirale.
Nous avons:

Catia V5 - Spirale Carrée - VB.Net interface
  • Le nombre de tours de la spirale (par défaut 5 mais on peut changer)
  • L’écartement entre chaque ligne (par défaut 10 mm). Cela correspond à l’accroissement de la longueur des lignes consécutives.
  • La longueur initiale (par défaut 12mm). C’est la longueur du premier segment au centre de la spirale.

Dans les grandes lignes, c’est assez simple.
Si nous le faisions à la main nous ferions un premier segment partant du point “PointDepartSpirale” d’une longueur de 12mm (longueur initiale) dans la direction donnée par la “DirectiondepartSpirale” puis à partir de l’extrémité de notre premier segment nous construirions une nouvelle ligne perpendiculaire en appui sur le plan support “PlanPourSpirale” d’une longueur égale à la précédente + 10 mm (écartement) et ainsi de suite…

Catia V5 - Spirale Carrée - VB.Net

Le code

J’ai décidé de faire ce code en VB.Net pour en faire un petit exécutable (Windows form) en dehors de Catia.
J’utilise ici Visual Basic 2010 express (gratuit).
J’importe au préalable les DLL de catia dans projet/ajouter une référence puis l’onglet Com (voir cet article)

Les trois champs Textbox sont pré-remplis avec les valeurs 5,10 et 12. Il ont également des noms explicites

Pour que cela fonctionne, il faut que Catia soit déjà lancé et qu’il y ait bien les éléments présentés plus haut dans l’article.

Voici le code au complet.
J’ai beaucoup commenté de façon à vous y retrouver.

En haut, on trouve l’import des DLL.
En dessous se trouve la Class correspondant à Form1=la boite de dialogue renfermant les boutons.

La première subroutine est le click sur le bouton « Exectuter » qui construit véritablement la spirale.
La deuxième (en bas) correspond au click sur le bouton “quitter” qui a pour effet de fermer la boite Form1.

En pratique, j’ai fait dans Catia un enregistrement de macro en Catvba (VB6) sur quelques créations d’éléments filaires pour avoir la syntaxe et la trame du code de base.
J’ai ensuite fait un copié-collé du code VB6 dans Visual Basic 2010 et modifié un peu le code pour en faire du VB.Net.

Imports INFITF  'pour les documents, les fichiers, l'accès au système d'exploitation
Imports MECMOD  'Classe pour des esquisses et des géométries
Imports HybridShapeTypeLib 'Classe pour créer du surfacique
Imports PARTITF   'Classe pour tous les objets dans la conception de pièce solides PartDesign

Public Class Form1

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles CmdExecuter.Click


        'Déclaration variables

        Dim Longueur_départ As Double = Me.TextBox_LongInitiale.Text
        Dim Nombre_de_tours As Integer = Me.TextBoxNbTours.Text
        Dim Ecartement As Double = Me.TextBox_Ecartement.Text


        'Connexion à Catia

        Dim CATIA As INFITF.Application = GetObject(, "CATIA.Application")
        CATIA.Visible = True

        Dim partDocument1 As MECMOD.PartDocument = CATIA.ActiveDocument 'Document Catia actif

        Dim part1 As MECMOD.Part = partDocument1.Part 'déclaration et création de part1, le Doc actif.

        Dim hybridBodies1 As MECMOD.HybridBodies = part1.HybridBodies 'declaration des sets géométriques de la Catpart

        Dim selection1 As INFITF.Selection = partDocument1.Selection 'declaration d'un ensemble de selections (pour les cacher/afficher)
        Dim visPropertySet1 As INFITF.VisPropertySet = selection1.VisProperties 'déclaration des propriétés visuelles de la selection1


        '###################################
        'Préparation du modèle
        '###################################


        Dim hybridBody1 As MECMOD.HybridBody = hybridBodies1.Add() 'déclaration et on ajoute un set géométrique

        hybridBody1.Name = "Spirale Carrée" ' on le nomme 

        Dim hybridShapeFactory1 As MECMOD.Factory = part1.HybridShapeFactory 'déclaration et création du créateur des éléments surfaciques de la part

        Dim hybridBody2 As MECMOD.HybridBody = hybridBodies1.Item("Ref") 'déclaration du set géométrique comme étant celui qui se nomme "Ref" 

        Dim hybridShapes1 As MECMOD.HybridShapes = hybridBody2.HybridShapes 'déclaration des éléments surfaciques de "Ref"

        Dim hybridShapeLineAngle1 As MECMOD.HybridShape = hybridShapes1.Item("DirectionDepartSpirale") 'déclaration de la ligne de direction initiale

        Dim reference1 As INFITF.Reference = part1.CreateReferenceFromObject(hybridShapeLineAngle1) 'déclaration de la ref de direction initiale

        Dim hybridShapePlaneOffset1 As MECMOD.HybridShape = hybridShapes1.Item("PlanPourSpirale") 'déclaration du plan de support de la spirale

        Dim reference2 As INFITF.Reference = part1.CreateReferenceFromObject(hybridShapePlaneOffset1) 'déclaration de la ref du support

        Dim hybridShapePointOnPlane1 As MECMOD.HybridShape = hybridShapes1.Item("PointDepartSpirale") 'déclaration du point de départ de la spirale

        Dim reference3 As INFITF.Reference = part1.CreateReferenceFromObject(hybridShapePointOnPlane1) 'déclaration de la ref du point de départ

        part1.Update() ' met à jour la part pour réécrire l'arbre


        '###################################
        'Construction de la spirale
        '###################################


        'Création du premier segment

        Dim hybridShapeLineAngle2 As MECMOD.HybridShape = hybridShapeFactory1.AddNewLineAngle(reference1, reference2, reference3, False, 0.0, Longueur_départ, 0.0, False) 'déclaration et création de l'Objet ligne angle sur les trois ref initiales du set "ref"

        hybridBody1.AppendHybridShape(hybridShapeLineAngle2) 'Ajout de l'objet au set "Spirale Carrée"

        part1.InWorkObject = hybridShapeLineAngle2 ' la première ligne est l'objet de travail (facultatif)

        part1.Update() 'met à jour l'arbre pour y faire apparaitre l'objet


        ' création de son extrémité

        Dim reference4 As INFITF.Reference = part1.CreateReferenceFromObject(hybridShapeLineAngle2) 'déclaration et création de la reférence à partir de la ligne que l'on vient de créer

        Dim hybridShapeDirection1 As HybridShapeTypeLib.HybridShapeDirection = hybridShapeFactory1.AddNewDirection(reference4) 'déclaration et ajout de l'objet direction à partir de la ligne

        Dim hybridShapeExtremum1 As MECMOD.HybridShape = hybridShapeFactory1.AddNewExtremum(reference4, hybridShapeDirection1, 1) 'déclaration et création de l'objet extrémum

        hybridBody1.AppendHybridShape(hybridShapeExtremum1) 'ajout de l'objet extrémum dans le set géométrique "Spirale Carrée"

        part1.InWorkObject = hybridShapeExtremum1 ' l'extrémum est l'objet de travail (facultatif)

        selection1.Add(hybridShapeExtremum1) 'on selectionne l'extrémum
        visPropertySet1.SetShow(CatVisPropertyShow.catVisPropertyNoShowAttr) ' on cache l'extrémum
        selection1.Clear() 'on vide la selection





        ' On crée les ref à partir de ce dernier segment

        Dim reference6 As INFITF.Reference = part1.CreateReferenceFromObject(hybridShapeLineAngle2) 'déclaration et création de la ref ligne

        Dim reference7 As INFITF.Reference = part1.CreateReferenceFromObject(hybridShapePlaneOffset1) 'déclaration et création de la ref plan support (idem ref 2 d'ailleurs, on aurait pu s'en passer)

        Dim reference8 As INFITF.Reference = part1.CreateReferenceFromObject(hybridShapeExtremum1) ' déclaration et création de la ref point


        'On se lance dans une boucle

        Dim longueur As Double = Longueur_départ 'déclaration et création de la "longueur" qui sera incrémentée. Elle prend la valeur de départ

        Dim hybridShapeLineAngle3 As MECMOD.HybridShape 'déclaration de l'objet ligne

        Dim reference5 As INFITF.Reference 'déclaration d'un objet ref 
        Dim hybridShapeDirection2 As HybridShapeTypeLib.HybridShapeDirection 'déclaration d'un objet direction
        Dim hybridShapeExtremum2 As MECMOD.HybridShape 'déclaration d'un objet surfacique



        For nb_cotes As Integer = 1 To (4 * Nombre_de_tours) 'Le nombre de coté vaut 4 fois le nombre de tours



            longueur = longueur + Ecartement 'on incrémémente longueur de la valeur d'écartement

            'on trace la ligne perpendiculaire à la précédente

            hybridShapeLineAngle3 = hybridShapeFactory1.AddNewLineAngle(reference6, reference7, reference8, False, 0.0, longueur, 90.0, False) 'définition de la ligne perpendiculaire

            hybridBody1.AppendHybridShape(hybridShapeLineAngle3) 'on l'ajoute au sset géométrique "spirale carrée"

            part1.InWorkObject = hybridShapeLineAngle3 ' la ligne est l'objet de travail (facultatif)

            'on ajoute son point extrémité

            reference5 = part1.CreateReferenceFromObject(hybridShapeLineAngle3) 'définition de la ref5 (la dernière ligne tracée)

            hybridShapeDirection2 = hybridShapeFactory1.AddNewDirection(reference5) 'définition de la direction

            hybridShapeExtremum2 = hybridShapeFactory1.AddNewExtremum(reference5, hybridShapeDirection2, 1) 'définition de l'extrémum

            hybridBody1.AppendHybridShape(hybridShapeExtremum2) 'ajout de l'extrémum au set géométrique

            part1.InWorkObject = hybridShapeExtremum2 ' l'extrémum est l'objet de travail (facultatif)

            selection1.Add(hybridShapeExtremum2) 'on selectionne l'extrémum
            visPropertySet1.SetShow(CatVisPropertyShow.catVisPropertyNoShowAttr) ' on cache l'extrémum
            selection1.Clear() 'on vide la selection

            'On remplace les références

            reference6 = part1.CreateReferenceFromObject(hybridShapeLineAngle3) 'la ref passe sur la dernière ligne tracée

            reference7 = part1.CreateReferenceFromObject(hybridShapePlaneOffset1) 'Le plan est toujours le même ici ce n'était pas utile de redéfinir

            reference8 = part1.CreateReferenceFromObject(hybridShapeExtremum2) 'la ref passe sur le dernier point extrémum crée

            part1.Update() ' met à jour la part pour réécrire l'arbre à chaque tour de boucle


        Next


        part1.Update() ' met à jour la part définitivement


    End Sub

    Private Sub CmdQuitter_Click(sender As System.Object, e As System.EventArgs) Handles CmdQuitter.Click
        Me.Close()

    End Sub
End Class


L’exécutable à télécharger

Conclusion

Voici un nouvel exemple de construction à partir d’une macro en VB.Net.
Catia utilise nativement VB6 mais il est possible d’utiliser les DLL de Catia à travers VB.Net Express pour réaliser des interfaces graphiques sympas à l’extérieur de Catia. Il faut alors un peu adapter le code.

J’espère que cela vous inspirera pour vous lancer dans la folle aventure de la programmation sur Catia V5.
En attendant, si vous connaissez des gens passionnés par ce genre de démarche, partagez l’article avec eux ; )

A bientôt

No responses yet

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.