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

Note how we handled myObj.Shape, see that it is done exactly like we did in the previous chapter, when we changed other properties of an object, such as  box.Height = 5. In fact, Shape is also a property, just like Height. Only it takes a Part Shape, not a number. In next chapter we will have a deeper look at how those parametric objects are constructed.

For now, let's explore our Part Shapes more in detail. At the end of the chapter about [Manual:Traditional modeling, the CSG way|traditional modeling with the Part Workbench] we showed a table that explains how Part Shapes are constructed, and their different components (Vertices, edges, faces, etc). The exact same components exist here and can be retrieved from Python. All Part Shape always have the following attributes:Vertexes, Edges, Wires, Faces, Shells and Solids. All of them are lists, that can contain any number of elements or be empty:

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

For example, let's find the area of each face of our box shape above:

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

Or, for each edge, its start point and end point:

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

As you see, if our boxShape has a "Vertexes" attribute, each Edge of the boxShape also has a "Vertexes" attribute. As we can expect, the boxShape will have 8 vertices, while the edge will only have 2, which are both part of the list of 8.

We can always check what is the type of a shape:

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

So to resume the whole diagram of Part Shapes: Everything starts with Vertices. With one or two vertices, you form an Edge (full circles have only one vertex). With one or more Edges, you form a Wire. With one or more closed Wires, you form a Face (the additional Wires become "holes" in the Face). With one or more Faces, you form a Shell. When a Shell is fully closed (watertight), you can form a Solid from it. And finally, you can join any number of Shapes of any types together, which is then called a Compound.

We can now try creating complex shapes from scratch, by constructing all their components one by one. For example, let's try to create a volume like this:



We will start by creating a planar shape like this:



First, let's create the four base points:

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

Then we can create the two linear segments:



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

Note that we didn't need to create Vertices? We could immediately create Part.Lines from FreeCAD Vectors. This is because here we haven't created Edges yet. A Part.Line (as well as Part.Circle, Part.Arc, Part.Ellipse or Part.BSpline) does not create an Edge, but rather a base geometry on which an Edge will be created. Edges are always made from such a base geometry, which is stored its Curve attribute. So if you have an Edge, doing:

print(Edge.Curve)

will show you what kind of Edge this is, that is, if it is based on a line, an arc, etc... But let's come back to our exercise, and build the arc segments. For this, we will need a third point, so we can use the convenient Part.Arc, which takes 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)

Now we have 2 lines (L1 and L2) and 2 arcs (C1 and C2). We need to turn them into edges:

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

Alternatively, base geometries also have a toShape function that do exactly the same thing:

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

Once we have a series of Edges, we can now form a Wire, by giving it a list of Edges. We do need to take care of the order.

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

And we can check if our Wire was correctly understood, and that it is correctly closed:

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