Manual:Creating and manipulating geometry/fr

Dans les chapitres précédents, nous avons appris les différents ateliers de FreeCAD, et que chacun d'entre eux met en œuvre ses propres outils et types de géométrie. Les mêmes concepts s'appliquent lorsque vous travaillez à partir du code Python.

Nous avons également vu que la grande majorité des ateliers de FreeCAD dépendent d'un atelier très fondamental : l’atelier Part (Part Workbench). En fait, d'autres ateliers, tels que Draft ou Arch, font exactement ce que nous allons faire dans ce chapitre : ils utilisent le code Python pour créer et manipuler la géométrie Part.

Donc, la première chose que nous devons faire pour travailler avec la géométrie des pièces, c'est de faire l’équivalent en Python à la connexion vers l’atelier Part : importer le module Part :

import Part

Prenez une minute pour explorer le contenu du module Part, en tapant Part. Et la navigation à travers les différentes méthodes proposées ici. Le module Part offre plusieurs fonctions commodes telles que makeBox, makeCircle, etc ... qui vont créer un objet pour vous instantanément. Essayez ceci, par exemple :

Part.makeBox(3,5,7)

Lorsque vous appuyez sur Entrée après avoir tapé la ligne ci-dessus, rien n'apparaîtra dans la vue 3D, mais quelque chose comme ça sera imprimé dans la console Python  :



C'est là qu'un concept important intervient. Ce que nous avons créé ici est une forme de pièce. Ce n'est pas un document objet de FreeCAD (pas encore). Dans FreeCAD, les objets et leur géométrie sont indépendants. Pensez à un document objet de FreeCAD en tant que conteneur, qui accueillera une forme. Les objets paramétriques auront également des propriétés telles que Longueur et Largeur et recalculeront leur forme à la volée, chaque fois que l'une des propriétés change. Ce que nous avons fait ici est de calculer une forme manuellement.

Nous pouvons maintenant créer facilement un document objet "générique" dans le document actuel (assurez-vous que vous avez au moins un nouveau document ouvert), et donnez-lui une forme de boîte comme nous venons de le faire :

boxShape = Part.makeBox(3,5,7) myObj = FreeCAD.ActiveDocument.addObject("Part::Feature","MyNewBox") myObj.Shape = boxShape FreeCAD.ActiveDocument.recompute

Notez comment nous avons traité myObj.Shape, voyez que cela se fait exactement comme nous l'avons fait dans le chapitre précédent, lorsque nous avons changé d'autres propriétés d'un objet, comme box.Height=5. En réalité, Shape est également une propriété, tout comme Hauteur. Seulement il faut une forme de Part (Part Shape), pas un nombre. Au prochain chapitre, nous examinerons plus en profondeur la façon dont ces objets paramétriques sont construits.

Pour l'instant, explorons nos formes de pièces plus en détail. À la fin du chapitre à propos de la modélisation traditionnelle avec l’atelier Part ([Manual:Traditional modeling, the CSG way|traditional modeling with the Part Workbench]) nous avons montré un tableau qui explique comment les formes sont construites dans Part ainsi que leurs différents composants (sommets, arêtes, faces, etc. ou Vertices, edges, faces, etc). Les mêmes composants existent ici et peuvent être récupérés à partir de Python. Toute forme de Part a toujours les attributs suivants : sommets, arêtes, lignes, faces, coquilles et solides (Vertexes, Edges, Wires, Faces, Shells and Solids). Tous constituent des listes, qui peuvent contenir n'importe quel nombre d'éléments ou être vides :

print(boxShape.Vertexes) print(boxShape.Edges) print(boxShape.Wires) print(boxShape.Faces) print(boxShape.Shells) print(boxShape.Solids)

Par exemple, découvrons la zone de chaque face de notre forme de boîte ci-dessus :

for f in boxShape.Faces: print(f.Area)

Ou, pour chaque arête, son point de départ et son point final :

for e in boxShape.Edges: print("New edge") print("Start point:") print(e.Vertexes[0].Point) print("End point:") print(e.Vertexes[1].Point)

Comme vous le voyez, si notre boxShape a un attribut "Vertexes", chaque Edge de la BoxShape a également un attribut "Vertexes". Comme nous pouvons nous y attendre, le BoxShape aura 8 sommets (Vertexes), tandis que l’arête en aura seulement 2, qui font partie de la liste des 8.

Nous pouvons toujours vérifier quel est le type de forme :

print(boxShape.ShapeType) print(boxShape.Faces[0].ShapeType) print (boxShape.Vertexes[2].ShapeType)

Donc, pour reprendre tout le diagramme des Formes Part : Tout commence par Vertices (sommets). Avec un ou deux sommets, vous formez un Edge (arête) (les cercles complets n'ont qu'un seul sommet). Avec une ou plusieurs arêtes, vous formez une ligne composite (wire). Avec une ou plusieurs lignes fermées, vous formez une face (les lignes supplémentaires deviennent des «trous» dans la face). Avec une ou plusieurs Faces, vous créez une coquille (Shell). Quand une coquille est entièrement fermée (étanche), vous pouvez former un solide. Et enfin, vous pouvez joindre n'importe quel nombre de Formes (Shapes) de tous types ensemble, ce qui s'appelle alors un Composé (Compound).

Nous pouvons maintenant essayer de créer des formes complexes à partir de zéro, en construisant tous leurs composants un par un. Par exemple, essayons de créer un volume comme celui-ci :



Nous commencerons par créer une forme planaire comme celle-ci :



D'abord, créons les quatre points de base :

V1 = FreeCAD.Vector(0,10,0) V2 = FreeCAD.Vector(30,10,0) V3 = FreeCAD.Vector(30,-10,0) V4 = FreeCAD.Vector(0,-10,0)

Ensuite, nous pouvons créer les deux segments de droites :



L1 = Part.Line(V1,V2) L2 = Part.Line(V4,V3)

Notez-vous que nous n'avons pas eu besoin de créer Vertices ? Nous pourrions immédiatement créer Parts.Lines à partir des Vecteurs FreeCAD. C'est parce que nous n'avons pas encore créé Edges. Un Part.Line (aussi bien que Part.Circle, Part.Arc, Part.Ellipse ou Part.BSpline) ne crée pas un Edge, mais plutôt une géométrie de base sur laquelle un Edge sera créé. Les arêtes (Edges) sont toujours fabriquées à partir d'une telle géométrie de base, qui est dénommée son attribut Curve. Donc, si vous avez un Edge, faire :

print(Edge.Curve)

vous montrera de quel type de Edge il s’agit, c'est-à-dire s'il est basé sur une ligne, un arc, etc. Mais revenons à notre exercice et construisons les segments d'arc. Pour cela, nous aurons besoin d'un troisième point, afin que nous puissions utiliser le commode Part.Arc, qui prend 3 points :



VC1 = FreeCAD.Vector(-10,0,0) C1 = Part.Arc(V1,VC1,V4) VC2 = FreeCAD.Vector(40,0,0) C2 = Part.Arc(V2,VC2,V3)

Maintenant, nous avons 2 lignes (L1 et L2) et 2 arcs (C1 et C2). Nous devons les transformer en arêtes (edges) :

E1 = Part.Edge(L1) E2 = Part.Edge(L2) E3 = Part.Edge(C1) E4 = Part.Edge(C2)

Alternativement, les géométries de base ont également une fonction toShape qui fait exactement la même chose :

E1 = L1.toShape E2 = L2.toShape ...

Une fois que nous avons une série d’arêtes (Edges), nous pouvons maintenant former une ligne composite (Wire), en lui donnant une liste d’arêtes (Edges). Nous n’avons pas besoin de prendre soin de l’ordre.

W = Part.Wire([E1,E4,E2,E3])

Et nous pouvons vérifier si notre Wire (ligne composite) a été correctement compris, et qu'il est correctement fermé :

print( W.isClosed )

Which will print "True" or "False". In order to make a Face, we need closed Wires, so it is always a good idea to check that before creating the Face. Now we can create a Face, by giving it a single Wire (or a list of Wires if we had holes):

F = Part.Face(W)

Then we extrude it:

P = F.extrude(FreeCAD.Vector(0,0,10))

Note that P is already a Solid:

print(P.ShapeType)

Because when extruding a single Face, we always get a Solid. This wouldn't be the case, for example, if we had extruded the Wire instead:

S = W.extrude(FreeCAD.Vector(0,0,10)) print(s.ShapeType)

Which will of course give us a hollow shell, with the top and bottom faces missing.

Now that we have our final Shape, we are anxious to see it on screen! So let's create a generic object, and attribute it our new Solid:

myObj2 = FreeCAD.ActiveDocument.addObject("Part::Feature","My_Strange_Solid") myObj2.Shape = P FreeCAD.ActiveDocument.recompute

Alternatively, the Part module also provides a shortcut that does the above operation quicker (but you cannot choose the name of the object):

Part.show(P)

All of the above, and much more, is explained in detail on the Part Scripting page, together with examples.

Read more:


 * The Part Workbench
 * Part scripting