Script de données topologiques

From FreeCAD Documentation
Revision as of 16:35, 16 June 2020 by Donatello (talk | contribs)

Introduction

Ici, nous vous expliquerons comment contrôler le Module Part directement à partir de l'interpréteur FreeCAD Python, ou à partir de n'importe quel script externe. Les principes de base des scripts de données topologiques sont décrits dans Module de pièces expliquant les concepts. Assurez-vous de parcourir la section Script et les pages les bases si vous avez besoin de plus d'informations sur le fonctionnement des scripts Python dans FreeCAD. Si vous êtes nouveau sur Python, c'est une bonne idée de lire d'abord l'Introduction à Python.

Diagramme de classe

Voici un aperçu du Langage de Modélisation Unifié (UML) de la classe la plus importante du module Part : Classes Python du module Part

En haut

Géométrie

Les objets géométriques sont les éléments constitutifs de tous les objets topologiques :

  • Geom Classe de base des objets géométriques.
  • Ligne Une ligne droite en 3D, définie par le point de départ et le point d'arrivée.
  • Cercle Cercle ou arc de cercle, défini par un centre, un point de départ et d'arrivée.
  • ...... Etc.

En haut

Topologie

Les types de données topologiques suivants sont disponibles :

  • Composé Un groupe de tout type d'objets topologiques.
  • Compsolid Un solide composite est un ensemble de solides reliés par leurs faces. Il étend les notions de FORME FILAIRE et de COQUE aux solides.
  • Solide Une partie de l'espace limité par des coques. C'est en trois dimensions.
  • Coque Un ensemble de faces reliées par leurs arrêtes. Une coque peut être ouverte ou fermée.
  • Face En 2D, elle fait partie d'un plan ; en 3D elle fait partie d'une surface. Sa géométrie est contrainte (rognée) par des contours. C'est bidimensionnel.
  • Forme filaire Un ensemble d'arêtes reliées par leurs sommets. Il peut s'agir d'un contour ouvert ou fermé selon que les bords sont liés ou non.
  • Arête Un élément topologique correspondant à une courbe restreinte. Une arête est généralement limitée par des sommets. Elle a une dimension.
  • Sommet Un élément topologique correspondant à un point. Il a une dimension nulle.
  • Forme Terme générique couvrant tout ce qui précède.

En haut

Exemple rapide : Création topologique simple

Wire

Nous allons maintenant créer une topologie, en la construisant à partir d'une géométrie plus simple. Comme étude de cas, nous utiliserons une ensemble comme illustré ci-dessus, qui se compose de quatre sommets, deux arcs et deux lignes.

En haut

Création de la géométrie

Nous créons d'abord les parties géométriques distinctes de ce fil. S'assurer que les éléments qui doivent être connectées ultérieurement partagent les mêmes sommets.

Donc, nous créons d'abord les sommets :

import Part
from FreeCAD import Base
V1 = Base.Vector(0, 10, 0)
V2 = Base.Vector(30, 10, 0)
V3 = Base.Vector(30, -10, 0)
V4 = Base.Vector(0, -10, 0)

En haut

Arc

Cercle


Pour chaque arc, nous avons besoin d'un point de repère :

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

En haut

Ligne

Line


Les segments de ligne peuvent être créés à partir de deux points :

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

En haut

Relier le tout

La dernière étape consiste à assembler les éléments géométriques de base et façonner une forme topologique :

S1 = Part.Shape([C1, L1, C2, L2])

En haut

Construire un prisme

Maintenant, extrudez la forme filaire dans une direction et créez une forme 3D véritable :

W = Part.Wire(S1.Edges)
P = W.extrude(Base.Vector(0, 0, 10))

En haut

Affichons le tout

Part.show(P)

En haut

Création de formes basiques

Vous pouvez facilement créer des objets topologiques de base avec les méthodes make...() du module Part (atelier pièce) :

b = Part.makeBox(100, 100, 100)
Part.show(b)

Quelques méthodes make...() disponibles :

  • makeBox(l, w, h) Crée une boîte située en p et pointant dans la direction d avec les dimensions longueur, largeur et hauteur.
  • makeCircle(radius) Dessine un cercle avec un rayon donné.
  • makeCone(radius1, radius2, height) Crée un cône avec rayons1, rayon2 et hauteur donnés.
  • makeCylinder(radius, height) Crée un cylindre avec un rayon et une hauteur donnés.
  • makeLine((x1, y1, z1), (x2, y2, z2)) Trace un segment à partir de deux points.
  • makePlane(length, width) Crée un plan avec la longueur et la largeur.
  • makePolygon(list) Crée un polygone à partir d'une liste de points.
  • makeSphere(radius) Crée une sphère avec un rayon donné.
  • makeTorus(radius1, radius2) Crée un tore avec les rayons donnés.

Voir la page de l'API Part pour une liste complète des méthodes disponibles du module Part.

En haut

Importer les modules nécessaires

Nous devons d'abord importer le module Part, pour pouvoir utiliser son contenu en Python. Nous importerons également le module Base depuis l'intérieur du module FreeCAD :

import Part
from FreeCAD import Base

En haut

Création d'un Vecteur

Création d'un Vecteur

Les Vecteurs constituent l'une des informations les plus importantes, lors de la construction des formes géométriques. Ils contiennent généralement trois nombres (mais pas systématiquement) : les coordonnées cartésiennes X, Y et Z. Vous créer un vecteur comme ceci :

myVector = Base.Vector(3, 2, 0)

Nous venons de créer un vecteur aux coordonnées X=3, Y=2, Z=0. Dans le module Part, les vecteurs sont utilisés partout. Part shapes utilise également un autre type de représentation ponctuelle appelée sommet, qui est simplement un conteneur pour un vecteur. Vous accédez au vecteur d'un sommet comme ceci :

myVertex = myShape.Vertexes[0]
print myVertex.Point
> Vector (3, 2, 0)

En haut

Création d'une arête (edge)

Une arête (bord) n'est rien d'autre qu'une ligne avec deux Vertex (sommets):

An edge is nothing but a line with two vertices:

edge = Part.makeLine((0, 0, 0), (10, 0, 0))
edge.Vertexes
> [<Vertex object at 01877430>, <Vertex object at 014888E0>]

PS: Vous pouvez aussi créer un arête en donnant deux Vecteurs:

vec1 = Base.Vector(0, 0, 0)
vec2 = Base.Vector(10, 0, 0)
line = Part.LineSegment(vec1, vec2)
edge = line.toShape()

Vous pouvez trouver la longueur et le centre d'une arête comme ceci:

edge.Length
> 10.0
edge.CenterOfMass
> Vector (5, 0, 0)

top

Mise en forme à l'écran

Jusqu'à présent, nous avons créé un objet a arêtes vives (bords), mais il n'est pas visible à l'écran.
C'est parce que nous n'avons manipulé que des objets en Python.
L'écran FreeCAD n'affiche uniquement que les vues 3D que vous lui demandez d'afficher.
Pour cela, nous utilisons une méthode simple:

So far we created an edge object, but it doesn't appear anywhere on the screen. This is because the FreeCAD 3D scene only displays what you tell it to display. To do that, we use this simple method:

Part.show(edge)

La fonction show crée un objet dans notre document FreeCAD et assigne notre forme "edge" à cela.
Utilisez cette commande chaque fois que vous voudrez afficher votre forme géométrique à l'écran.

top

Création d'un contour (Wire)

Un contour est une ligne multi-arêtes, et peut être créé dans une liste d'arêtes ou même une liste de lignes (fils):

A wire is a multi-edge line and can be created from a list of edges or even a list of wires:

edge1 = Part.makeLine((0, 0, 0), (10, 0, 0))
edge2 = Part.makeLine((10, 0, 0), (10, 10, 0))
wire1 = Part.Wire([edge1, edge2]) 
edge3 = Part.makeLine((10, 10, 0), (0, 10, 0))
edge4 = Part.makeLine((0, 10, 0), (0, 0, 0))
wire2 = Part.Wire([edge3, edge4])
wire3 = Part.Wire([wire1, wire2])
wire3.Edges
> [<Edge object at 016695F8>, <Edge object at 0197AED8>, <Edge object at 01828B20>, <Edge object at 0190A788>]
Part.show(wire3)

Part.show (wire3) permet d'afficher les 4 bords qui composent notre contour filaire.
D'autres informations utiles, peuvent être facilement récupérées:

wire3.Length
> 40.0
wire3.CenterOfMass
> Vector (5, 5, 0)
wire3.isClosed()
> True
wire2.isClosed()
> False

top

Création d'une face

Seul les faces à contour fermés seront valides.
Dans cet exemple, wire3 est un contour fermé, et Wire2 est un contour ouvert (voir ci-dessus)

Only faces created from closed wires will be valid. In this example, wire3 is a closed wire but wire2 is not (see above)

face = Part.Face(wire3)
face.Area
> 99.99999999999999
face.CenterOfMass
> Vector (5, 5, 0)
face.Length
> 40.0
face.isValid()
> True
sface = Part.Face(wire2)
face.isValid()
> False

Seul les faces auront une superficie, mais les lignes et les bords (arêtes) n'en possède pas .

top

Création d'un cercle

Un cercle est créé simplement comme ceci:

A circle can be created like this:

circle = Part.makeCircle(10)
circle.Curve
> Circle (Radius : 10, Position : (0, 0, 0), Direction : (0, 0, 1))

Si vous voulez le créer à une certaine position et avec une certaine direction:

ccircle = Part.makeCircle(10, Base.Vector(10, 0, 0), Base.Vector(1, 0, 0))
ccircle.Curve
> Circle (Radius : 10, Position : (10, 0, 0), Direction : (1, 0, 0))

ccircle sera créé à une distance de 10 de l’origine x et sera face à l'extérieur le long de l'axe des x. Remarque: makeCircle accepte uniquement Base.Vector() pour la position et les paramètres normaux, pas les tuples. Vous pouvez également créer une partie du cercle en donnant un angle de début et de fin:

from math import pi
arc1 = Part.makeCircle(10, Base.Vector(0, 0, 0), Base.Vector(0, 0, 1), 0, 180)
arc2 = Part.makeCircle(10, Base.Vector(0, 0, 0), Base.Vector(0, 0, 1), 180, 360)

Si nous joignions les deux arcs arc1 et arc2 nous obtiendrons un cercle.
L'angle fourni doit être exprimé en degrés, s'il sont en radians, vous devez les convertir en degrès avec la formule: degrés = radians * 180/PI ou en utilisant le module mathématiques Python (après avoir fait import math, bien sûr):

import math
degrees = math.degrees(radians)

top

Création d'un arc sur des points (repères)

Malheureusement, il n'existe pas de fonction makeArc mais nous avons la fonction Part.Arc pour créer un arc sur trois points de référence.
Fondamentalement, nous pouvons supposer un arc attaché sur un point de départ, passant sur un point central et se termine sur un point final en .
Part.Arc crée un objet arc pour lequel .ToShape() doit être appelée pour obtenir un objet ligne (edge), de cette manière nous utiliserons Part.LineSegment au lieu de Part.makeLine.

Unfortunately there is no makeArc() function, but we have the Part.Arc() function to create an arc through three points. It creates an arc object joining the start point to the end point through the middle point. The arc object's toShape() function must be called to get an edge object, the same as when using Part.LineSegment instead of Part.makeLine.

arc = Part.Arc(Base.Vector(0, 0, 0), Base.Vector(0, 5, 0), Base.Vector(5, 5, 0))
arc
> <Arc object>
arc_edge = arc.toShape()
Part.show(arc_edge)

Arc travaille uniquement avec Base.Vector() pour les points mais pas pour les tuples.
arc_edge est ce qui sera affiché à l'aide Part.show (arc_edge).
Vous pouvez également obtenir un arc de cercle en utilisant une partie de cercle:

from math import pi
circle = Part.Circle(Base.Vector(0, 0, 0), Base.Vector(0, 0, 1), 10)
arc = Part.Arc(circle,0,pi)

Les arcs Arc sont des lignes (edges). Ils peuvent donc être utilisés aussi comme contour en filaire.

top

Création de polygones

Un polygone est tout simplement une ligne (wire) avec de multiples lignes droites.
La fonction makePolygon crée une liste de points et crée une ligne de points en points:

A polygon is simply a wire with multiple straight edges. The makePolygon() function takes a list of points and creates a wire through those points:

lshape_wire = Part.makePolygon([Base.Vector(0, 5, 0), Base.Vector(0, 0, 0), Base.Vector(5, 0, 0)])

top

Création de courbes de Bézier

Les courbes de Bézier sont utilisées pour modéliser des courbes lisses à l'aide d'une série de repères (points de contrôle) avec un nombre de repères représentants la précision (fluidité de la courbe) optionnel. La fonction ci-dessous fait un Part.BezierCurve avec une série de points FreeCAD.Vector. (Note : l'indice du premier repère et du nombre commencent à 1, et pas à 0.)

Bézier curves are used to model smooth curves using a series of poles (points) and optional weights. The function below makes a Part.BezierCurve() from a series of FreeCAD.Vector() points. Note: when "getting" and "setting" a single pole or weight, indices start at 1, not 0.

def makeBCurveEdge(Points):
   geomCurve = Part.BezierCurve()
   geomCurve.setPoles(Points)
   edge = Part.Edge(geomCurve)
   return(edge)

top

Création d'une forme plane

Une forme plane, est tout simplement une surface plane rectangulaire.
La méthode utilisée pour créer une forme plane est la suivante: makePlane(longueur, largeur, [point de départ, direction]).
Par défaut point de départ = Vecteur(0,0,0) et direction = Vecteur(0,0,1).
L'utilisation point de départ = Vecteur(0,0,1) va créer la forme sur l' axe z positif, tandis que direction = Vecteur(1,0,0) va créer la forme sur l'axe x positif:
(Pour s'y retrouver un peu sur les axes, Vecteur ( 0 , 0 , 1 ) est égal à Vecteur ( X=0 , Y=0 , Z=1 ) l'ordre des axes sera toujours ( x , y , z ))

A Plane is a flat rectangular surface. The method used to create one is makePlane(length, width, [start_pnt, dir_normal]). By default start_pnt = Vector(0, 0, 0) and dir_normal = Vector(0, 0, 1). Using dir_normal = Vector(0, 0, 1) will create the plane facing in the positive Z axis direction, while dir_normal = Vector(1, 0, 0) will create the plane facing in the positive X axis direction:

plane = Part.makePlane(2, 2)
plane
> <Face object at 028AF990>
plane = Part.makePlane(2, 2, Base.Vector(3, 0, 0), Base.Vector(0, 1, 0))
plane.BoundBox
> BoundBox (3, 0, 0, 5, 0, 2)

BoundBox est un rectangle qui possède une diagonale commençant sur le plan (3,0,0) et se terminant à (5,0,2).
L'épaisseur de la boîte (Box) dans l'axe y est égal à zéro, car notre forme est totalement plane.

PS: makePlane accepte uniquement Base.Vector() pour start_pnt et dir_normal mais pas les tuples.

top

Création d'une ellipse

Pour créer une ellipse, il existe plusieurs façons:

There are several ways to create an ellipse:

Part.Ellipse()

Créez une ellipse avec un grand rayon = 2 et un petit rayon = 1 et un centre = (0,0,0).

Part.Ellipse(Ellipse)

Créez une copie des données de l'ellipse

Part.Ellipse(S1, S2, Center)

Crée une ellipse positionnée au point "Center", le plan de l'ellipse est défini par Center, S1 et S2,
le grand axe est définit par Center et S1,
son grand rayon est la distance entre Center et S1,
son petit rayon est la distance entre S2 et le grand axe.

Part.Ellipse(Center, MajorRadius, MinorRadius)

Crée une ellipse avec un grand rayon MajorRadius et un petit rayon MinorRadius et situé dans le plan défini par (0,0,1)

eli = Part.Ellipse(Base.Vector(10, 0, 0), Base.Vector(0, 5, 0), Base.Vector(0, 0, 0))
Part.show(eli.toShape())

Dans le code ci-dessus, nous avons passé S1 (Grand rayon), S2 (Petit rayon) et le centre (les coordonnées centrales).
De même que l'Arc, l'Ellipse crée également un objet Ellipse mais pas d'arête (bords), nous avons donc besoin de le convertir en arête à l'aide toShape() pour l'afficher.

PS: Arc accepte uniquement Base.Vector() pour les points mais pas les tuples.

eli = Part.Ellipse(Base.Vector(0, 0, 0), 10, 5)
Part.show(eli.toShape())

pour construire l'Ellipse ci-dessus, nous avons entré les coordonnées centrales, le Grand rayon et le Petit rayon.

top

Création d'un Tore

Nous créons un Tore en utilisant la méthode makeTorus( rayon1 , rayon2 , [ pnt , dir , angle1 , angle2 , angle ] ).
Par défaut,
Rayon1 = est le rayon du grande cercle
Rayon2 = est le rayon du petit cercle,
pnt = Vecteur(0,0,0),pnt est le centre de tore
dir = Vecteur(0,0,1), dir est la direction normale
angle1 = 0, est l'angle de début pour le petit cercle exprimé en radians
angle2 = 360 est l'angle de fin pour le petit cercle exprimé en radians
angle = 360 le dernier paramètre est la section du tore

Using makeTorus(radius1, radius2, [pnt, dir, angle1, angle2, angle]). By default pnt = Vector(0, 0, 0), dir = Vector(0, 0, 1), angle1 = 0, angle2 = 360 and angle = 360. Consider a torus as small circle sweeping along a big circle. Radius1 is the radius of the big circle, radius2 is the radius of the small circle, pnt is the center of the torus and dir is the normal direction. angle1 and angle2 are angles in degrees for the small circle; the last angle parameter is to make a section of the torus:

torus = Part.makeTorus(10, 2)

Le code ci-dessus créera un tore avec un diamètre de 20 (rayon de 10) et une épaisseur de 4 (rayon du petite cercle 2)

tor=Part.makeTorus(10, 5, Base.Vector(0, 0, 0), Base.Vector(0, 0, 1), 0, 180)

Le code ci-dessus créera une portion du tore.

tor=Part.makeTorus(10, 5, Base.Vector(0, 0, 0), Base.Vector(0, 0, 1), 0, 360, 180)

Le code ci-dessus créera un demi tore; seul le dernier paramètre change à savoir l'angle et les angles restants sont prédéfinis.
En donnant un angle de 180 degrés, créez un tore de 0 à 180 degrés, c'est à dire un demi tore.

top

Création d'un cube ou d'un parallélépipède

Utilisez makeBox(length,width,height,[pnt,dir]).
Par défaut pnt=Vector(0,0,0) and dir=Vector(0,0,1).

Using makeBox(length, width, height, [pnt, dir]). By default pnt = Vector(0, 0, 0) and dir = Vector(0, 0, 1).

box = Part.makeBox(10, 10, 10)
len(box.Vertexes)
> 8

top

Création d'une Sphère

Nous utiliserons makeSphere ( rayon , [ pnt , dir , angle1 , angle2 , angle3 ] ).
rayon = rayon de la sphère par défaut,
pnt = Vecteur (0,0,0),
dir = Vecteur (0,0,1),
angle1 = -90, verticale minimale de la sphère
angle2 = 90, verticale maximale de la sphère
angle3 = 360, le diamètre de la sphère.

Using makeSphere(radius, [pnt, dir, angle1, angle2, angle3]). By default pnt = Vector(0, 0, 0), dir = Vector(0, 0, 1), angle1 = -90, angle2 = 90 and angle3 = 360. angle1 and angle2 are the vertical minimum and maximum of the sphere, angle3 is the sphere diameter.

sphere = Part.makeSphere(10)
hemisphere = Part.makeSphere(10, Base.Vector(0, 0, 0), Base.Vector(0, 0, 1), -90, 90, 180)

top

Création d'un Cylindre

Nous utiliserons makeCylinder(radius,height,[pnt,dir,angle]).
Par défaut,
pnt=Vector(0,0,0), dir=Vector(0,0,1) et angle=360.

Using makeCylinder(radius, height, [pnt, dir, angle]). By default pnt = Vector(0, 0, 0), dir = Vector(0, 0, 1) and angle = 360.

cylinder = Part.makeCylinder(5, 20)
partCylinder = Part.makeCylinder(5, 20, Base.Vector(20, 0, 0), Base.Vector(0, 0, 1), 180)

top

Création d'un Cône

Nous utiliserons makeCone(radius1,radius2,height,[pnt,dir,angle]).
Par défaut,
pnt=Vector(0,0,0), dir=Vector(0,0,1) et angle=360.

Using makeCone(radius1, radius2, height, [pnt, dir, angle]). By default pnt = Vector(0, 0, 0), dir = Vector(0, 0, 1) and angle = 360.

cone = Part.makeCone(10, 0, 20)
semicone = Part.makeCone(10, 0, 20, Base.Vector(20, 0, 0), Base.Vector(0, 0, 1), 180)

top

Modification d'une forme

Il y a plusieurs manières de modifier des formes. Certaines sont de simples opérations de transformation telles que le déplacement ou la rotation de formes, d'autres sont plus complexes telles que fusion et soustraction d'une forme à une autre.

There are several ways to modify shapes. Some are simple transformation operations such as moving or rotating shapes, others are more complex, such as unioning and subtracting one shape from another.

top

Opérations de Transformation

Transformer une forme

La transformation est l'action de déplacer une forme d'un endroit à un autre.
Toute forme (arête, face, cube, etc ..) peut être transformé de la même manière:

Translating is the act of moving a shape from one place to another. Any shape (edge, face, cube, etc...) can be translated the same way:

myShape = Part.makeBox(2, 2, 2)
myShape.translate(Base.Vector(2, 0, 0))

Cette commande va déplacer notre forme "myShape" de 2 unités dans la direction x.

top

Rotation d'une forme

Pour faire pivoter une forme, vous devez spécifier le centre de rotation, l'axe, et l'angle de rotation:

To rotate a shape, you need to specify the rotation center, the axis, and the rotation angle:

myShape.rotate(Base.Vector(0, 0, 0),Base.Vector(0, 0, 1), 180)

Cette opération va faire pivoter notre forme de 180 degrés sur l'axe z.

top

Transformations génériques avec matrices

Une matrice est un moyen très simple de mémoriser les transformations dans le mode 3D. Dans une seule matrice, vous pouvez définir les valeurs de transformation, rotation et mise à l'échelle à appliquer à un objet.
Par exemple:

A matrix is a very convenient way to store transformations in the 3D world. In a single matrix, you can set translation, rotation and scaling values to be applied to an object. For example:

myMat = Base.Matrix()
myMat.move(Base.Vector(2, 0, 0))
myMat.rotateZ(math.pi/2)

PS: les matrices de FreeCAD travaillent en radians. En outre presque toutes les opérations matricielles qui travaillent avec un vecteur peut aussi avoir 3 nombres de sorte que ces 2 lignes effectuent le même travail:

myMat.move(2, 0, 0)
myMat.move(Base.Vector(2, 0, 0))

Lorsque notre matrice est paramétrée, nous pouvons l'appliquer à notre forme. FreeCAD fournit nous fournit 2 méthodes: transformShape() et transformGeometry().
La différence est que, avec la première, vous ne verez pas de différence (voir "mise à l'échelle d'une forme" ci-dessous).
Donc, nous pouvons opérer notre transformation comme ceci:

myShape.transformShape(myMat)

ou

myShape.transformGeometry(myMat)

top

Echelle du dessin (forme)

Changer l'échelle d'une forme est une opération plus dangereuse, car, contrairement à la translation ou à la rotation, le changement d'échelle non uniforme (avec des valeurs différentes pour x, y et z) peut modifier la structure de la forme!
Par exemple, le redimensionnement d'un cercle avec une valeur plus élevée horizontalement que verticalement le transformera en une ellipse, qui mathématiquement très différent.
Pour modifier l'échelle, nous ne pouvons pas utiliser le transformShape, nous devons utiliser transformGeometry():

Scaling a shape is a more dangerous operation because, unlike translation or rotation, scaling non-uniformly (with different values for X, Y and Z) can modify the structure of the shape. For example, scaling a circle with a higher value horizontally than vertically will transform it into an ellipse, which behaves mathematically very differently. For scaling, we cannot use the transformShape(), we must use transformGeometry():

myMat = Base.Matrix()
myMat.scale(2, 1, 1)
myShape=myShape.transformGeometry(myMat)

top

Opérations Booléennes

Soustraction

Soustraire une forme d'une autre est appelé, dans le jargon OCC/FreeCAD "cut" (coupe) et,
se fait de cette manière:

Subtracting a shape from another one is called "cut" in FreeCAD and is done like this:

cylinder = Part.makeCylinder(3, 10, Base.Vector(0, 0, 0), Base.Vector(1, 0, 0))
sphere = Part.makeSphere(5, Base.Vector(5, 0, 0))
diff = cylinder.cut(sphere)

top

Intersection

De la même manière, l'intersection entre 2 formes est appelé "common" et se fait de cette manière:

The same way, the intersection between two shapes is called "common" and is done this way:

cylinder1 = Part.makeCylinder(3, 10, Base.Vector(0, 0, 0), Base.Vector(1, 0, 0))
cylinder2 = Part.makeCylinder(3, 10, Base.Vector(5, 0, -5), Base.Vector(0, 0, 1))
common = cylinder1.common(cylinder2)

top

Fusion

La fusion "fuse", fonctionne de la même manière:

Union is called "fuse" and works the same way:

cylinder1 = Part.makeCylinder(3, 10, Base.Vector(0, 0, 0), Base.Vector(1, 0, 0))
cylinder2 = Part.makeCylinder(3, 10, Base.Vector(5, 0, -5), Base.Vector(0, 0, 1))
fuse = cylinder1.fuse(cylinder2)

top

Section

Une section, est l'intersection entre une forme solide et une forme plane.
Elle retournera une courbe d'intersection et sera composée de bords (edges, arêtes).

A "section" is the intersection between a solid shape and a plane shape. It will return an intersection curve, a compound curve composed of edges.

cylinder1 = Part.makeCylinder(3, 10, Base.Vector(0, 0, 0), Base.Vector(1, 0, 0))
cylinder2 = Part.makeCylinder(3, 10, Base.Vector(5, 0, -5), Base.Vector(0, 0, 1))
section = cylinder1.section(cylinder2)
section.Wires
> []
section.Edges
> [<Edge object at 0D87CFE8>, <Edge object at 019564F8>, <Edge object at 0D998458>, 
 <Edge  object at 0D86DE18>, <Edge object at 0D9B8E80>, <Edge object at 012A3640>, 
 <Edge object at 0D8F4BB0>]

top

Extrusion

L'extrusion est une action de "pousser" une forme plane dans une certaine direction et résultant en un corps solide.
Par exemple, pousser sur un cercle pour le transformer en tube:

Extrusion is the act of "pushing" a flat shape in a certain direction, resulting in a solid body. Think of a circle becoming a tube by "pushing it out":

circle = Part.makeCircle(10)
tube = circle.extrude(Base.Vector(0, 0, 2))

Si votre cercle est vide, vous obtiendrez un tube vide.
Mais si votre cercle est un disque avec une face pleine, vous obtiendrez un cylindre solide:

wire = Part.Wire(circle)
disc = Part.Face(wire)
cylinder = disc.extrude(Base.Vector(0, 0, 2))

top

Exploration de la forme (shape)

Vous pouvez facilement explorer la structure de ses données topologique:

You can easily explore the topological data structure:

import Part
b = Part.makeBox(100, 100, 100)
b.Wires
w = b.Wires[0]
w
w.Wires
w.Vertexes
Part.show(w)
w.Edges
e = w.Edges[0]
e.Vertexes
v = e.Vertexes[0]
v.Point

En tapant ce code dans l'interpréteur Python, vous aurez une bonne compréhension de la structure de Part objets.
Ici, notre commande makebox() créé une forme solide. Ce solide, comme tous les solides Part, contiennent des faces. Une face est constituée de lignes, qui sont un ensemble de bords, arêtes qui délimitent la face. Chaque face a au moins un contour fermé (il peut en avoir plus si la face comporte un ou plusieurs trou). Dans une ligne, nous pouvons voir chaque côté séparément, et nous pouvons voir les sommets (Vertex) de chaque bord ou arête. Lignes et arêtes n'ont que deux sommets, évidemment.

top

Analyse des arêtes (Edge)

Dans le cas d'un bord (ou arête), qui est une courbe arbitraire, il est fort probable que vous voulez faire une discrétisation. Dans FreeCAD, les bords sont paramétrés par leurs longueurs.
Cela signifie, que vous pouvez suivre une arête/courbe par sa longueur:

In case of an edge, which is an arbitrary curve, it's most likely you want to do a discretization. In FreeCAD the edges are parametrized by their lengths. That means you can walk an edge/curve by its length:

import Part
box = Part.makeBox(100, 100, 100)
anEdge = box.Edges[0]
print(anEdge.Length)

Maintenant, vous pouvez accéder à un grand nombre de propriétés de l'arête en utilisant sa longueur comme une position.
C'est à dire que, si l'arête(ou bord) a une longueur de 100 mm la position de départ est 0 et sa position extrème est 100.

anEdge.tangentAt(0.0)          # tangent direction at the beginning
anEdge.valueAt(0.0)            # Point at the beginning
anEdge.valueAt(100.0)          # Point at the end of the edge
anEdge.derivative1At(50.0)     # first derivative of the curve in the middle
anEdge.derivative2At(50.0)     # second derivative of the curve in the middle
anEdge.derivative3At(50.0)     # third derivative of the curve in the middle
anEdge.centerOfCurvatureAt(50) # center of the curvature for that position
anEdge.curvatureAt(50.0)       # the curvature
anEdge.normalAt(50)            # normal vector at that position (if defined)

top

Utilisation de la sélection

Ici, nous allons voir comment nous pouvons utiliser la fonction de sélection, quand l'utilisateur a fait une sélection dans la visionneuse.
Tout d'abord, nous créons une boîte (box) et nous l'affichons dans la fen^etre de vue.

Here we see now how we can use a selection the user did in the viewer. First of all we create a box and show it in the viewer.

import Part
Part.show(Part.makeBox(100, 100, 100))
Gui.SendMsgToActiveView("ViewFit")

Sélectionnez maintenant des faces ou arêtes.
Avec ce script, vous pouvez parcourir tous les objets sélectionnés et visionner leurs sous-éléments:

for o in Gui.Selection.getSelectionEx():
    print(o.ObjectName)
    for s in o.SubElementNames:
        print("name: ", s)
        for s in o.SubObjects:
            print("object: ", s)

Sélectionnez quelques bords et ce script va calculer la longueur:

length = 0.0
for o in Gui.Selection.getSelectionEx():
    for s in o.SubObjects:
        length += s.Length

print("Length of the selected edges: ", length)

top

Exemple Complet: "The OCC bottle"

L'exemple OpenCasCade Technology Tutorial vous montre comment faire une bouteille.

C’est un bon exercice pour FreeCAD. Si vous suivez notre exemple ci-dessous et la page OCC simultanément, vous verre comment les structures OCC sont implémentées dans FreeCAD. Le script complet ci-dessous est également inclus dans l’installation de FreeCAD (dans le dossier Mod / Part) et peut être appelé à partir de l'interpréteur Python en tapant:

A typical example found on the OpenCasCade Technology website is how to build a bottle. This is a good exercise for FreeCAD too. In fact, if you follow our example below and the OCC page simultaneously, you will see how well OCC structures are implemented in FreeCAD. The script is included in the FreeCAD installation (inside the Mod/Part folder) and can be called from the Python interpreter by typing:

import Part
import MakeBottle
bottle = MakeBottle.makeBottle()
Part.show(bottle)

top

Le script complet

Ici, le script complet de MakeBottle.py (extension .py):

For the purpose of this tutorial we will consider a reduced version of the script. In this version the bottle will not be hollowed out, and the neck of the bottle will not be threaded.

import Part, math
from FreeCAD import Base

def makeBottleTut(myWidth = 50.0, myHeight = 70.0, myThickness = 30.0):
    aPnt1=Base.Vector(-myWidth / 2., 0, 0)
    aPnt2=Base.Vector(-myWidth / 2., -myThickness / 4., 0)
    aPnt3=Base.Vector(0, -myThickness / 2., 0)
    aPnt4=Base.Vector(myWidth / 2., -myThickness / 4., 0)
    aPnt5=Base.Vector(myWidth / 2., 0, 0)

    aArcOfCircle = Part.Arc(aPnt2, aPnt3, aPnt4)
    aSegment1=Part.LineSegment(aPnt1, aPnt2)
    aSegment2=Part.LineSegment(aPnt4, aPnt5)

    aEdge1=aSegment1.toShape()
    aEdge2=aArcOfCircle.toShape()
    aEdge3=aSegment2.toShape()
    aWire=Part.Wire([aEdge1, aEdge2, aEdge3])

    aTrsf=Base.Matrix()
    aTrsf.rotateZ(math.pi) # rotate around the z-axis

    aMirroredWire=aWire.copy()
    aMirroredWire.transformShape(aTrsf)
    myWireProfile=Part.Wire([aWire, aMirroredWire])

    myFaceProfile=Part.Face(myWireProfile)
    aPrismVec=Base.Vector(0, 0, myHeight)
    myBody=myFaceProfile.extrude(aPrismVec)

    myBody=myBody.makeFillet(myThickness / 12.0, myBody.Edges)

    neckLocation=Base.Vector(0, 0, myHeight)
    neckNormal=Base.Vector(0, 0, 1)

    myNeckRadius = myThickness / 4.
    myNeckHeight = myHeight / 10.
    myNeck = Part.makeCylinder(myNeckRadius, myNeckHeight, neckLocation, neckNormal)
    myBody = myBody.fuse(myNeck)

    return myBody

el = makeBottleTut()
Part.show(el)

top

Détail et déroulement MakeBottle.py

import Part, math
from FreeCAD import Base

Nous aurons bien sûr besoin du module Part, mais aussi du module FreeCAD.Base, qui contient des structures FreeCAD de base comme des vecteurs et des matrices.

def makeBottleTut(myWidth = 50.0, myHeight = 70.0, myThickness = 30.0):
    aPnt1=Base.Vector(-myWidth / 2., 0, 0)
    aPnt2=Base.Vector(-myWidth / 2., -myThickness / 4., 0)
    aPnt3=Base.Vector(0, -myThickness / 2., 0)
    aPnt4=Base.Vector(myWidth / 2., -myThickness / 4., 0)
    aPnt5=Base.Vector(myWidth / 2., 0, 0)

Ici, nous définissons notre fonction MakeBottle.
Cette fonction peut être appelée sans argument, comme nous l'avons fait ci-dessus, les valeurs par défaut, de largeur, hauteur et épaisseur seront utilisés.
Ensuite, nous définissons une paire de points qui seront utilisés pour la construction de notre profil de base.

...
    aArcOfCircle = Part.Arc(aPnt2, aPnt3, aPnt4)
    aSegment1=Part.LineSegment(aPnt1, aPnt2)
    aSegment2=Part.LineSegment(aPnt4, aPnt5)

C'est ici que nous définissons les formes géométriques: un arc composé de 3 points et deux segments de ligne de 2 points chacun.

...
    aEdge1=aSegment1.toShape()
    aEdge2=aArcOfCircle.toShape()
    aEdge3=aSegment2.toShape()
    aWire=Part.Wire([aEdge1, aEdge2, aEdge3])

Vous vous souvenez de la différence entre la géométrie et les formes? Nous allons construire les formes de notre forme géométrique. Trois bords (bords ou arêtes peuvent être des segments de droites ou des courbes) puis nous raccordons tous les sommets.

...
    aTrsf=Base.Matrix()
    aTrsf.rotateZ(math.pi) # rotate around the z-axis

    aMirroredWire=aWire.copy()
    aMirroredWire.transformShape(aTrsf)
    myWireProfile=Part.Wire([aWire, aMirroredWire])

Jusqu'à présent, nous n'avons construit qu'un demi profil. Au lieu de construire le profil entier de la même manière, nous pouvons simplement reproduire ce que nous avons fait et coller les deux moitiés ensemble. Nous créons d'abord une matrice. Une matrice est un moyen très courant d'appliquer des transformations à des objets du monde 3D car elle peut contenir dans une structure toutes les transformations de base que peuvent subir les objets 3D (déplacement, rotation et mise à l'échelle). Après avoir créé la matrice, nous en faisons une symétrie puis nous créons une copie de notre fil avec cette matrice de transformation qui lui est appliquée. Nous avons maintenant deux fils et nous pouvons en faire un troisième, les fils étant en réalité des listes de bords.

...
    myFaceProfile=Part.Face(myWireProfile)
    aPrismVec=Base.Vector(0, 0, myHeight)
    myBody=myFaceProfile.extrude(aPrismVec)

    myBody=myBody.makeFillet(myThickness / 12.0, myBody.Edges)

Maintenant, nous avons un contour fermé, il peut être transformé en une face. Une fois que nous avons une face, nous pouvons l'extruder.
Une fois fait, nous avons un solide. Puis, nous appliquons un filet à notre objet car nous voulons lui donner un aspect "design", n'est-ce pas?

...
    neckLocation=Base.Vector(0, 0, myHeight)
    neckNormal=Base.Vector(0, 0, 1)

    myNeckRadius = myThickness / 4.
    myNeckHeight = myHeight / 10.
    myNeck = Part.makeCylinder(myNeckRadius, myNeckHeight, neckLocation, neckNormal)

À ce stade, le corps de notre bouteille est fabriqué mais nous devons encore créer un goulot. On fait un nouveau solide avec un cylindre.

...
    myBody = myBody.fuse(myNeck)

L'opération de fusion, qui dans d'autres applications est parfois appelé union, est très puissante.
Cette opération prendra soin de coller ce qui doit être collé et enlever ce qui doit être enlevé.

...
    return myBody

Puis, nous revenons à notre bouteille (Part solid), qui est le résultat de notre fonction.

el = makeBottleTut()
Part.show(el)

Enfin, nous appelons la fonction pour créer la pièce puis la rendons visible.

top

Cube percé

Ici un exemple complet de construction d'un cube percé.

Here is a complete example of building a pierced box.

La construction se fait face par face et quand le cube est terminé, il est évidé d'un cylindre traversant.

import Part, math
from FreeCAD import Base

size = 10
poly = Part.makePolygon([(0, 0, 0), (size, 0, 0), (size, 0, size), (0, 0, size), (0, 0, 0)])

face1 = Part.Face(poly)
face2 = Part.Face(poly)
face3 = Part.Face(poly)
face4 = Part.Face(poly)
face5 = Part.Face(poly)
face6 = Part.Face(poly)
     
myMat = Base.Matrix()

myMat.rotateZ(math.pi / 2)
face2.transformShape(myMat)
face2.translate(Base.Vector(size, 0, 0))

myMat.rotateZ(math.pi / 2)
face3.transformShape(myMat)
face3.translate(Base.Vector(size, size, 0))

myMat.rotateZ(math.pi / 2)
face4.transformShape(myMat)
face4.translate(Base.Vector(0, size, 0))

myMat = Base.Matrix()

myMat.rotateX(-math.pi / 2)
face5.transformShape(myMat)

face6.transformShape(myMat)               
face6.translate(Base.Vector(0, 0, size))

myShell = Part.makeShell([face1, face2, face3, face4, face5, face6])   
mySolid = Part.makeSolid(myShell)

myCyl = Part.makeCylinder(2, 20)
myCyl.translate(Base.Vector(size / 2, size / 2, 0))

cut_part = mySolid.cut(myCyl)

Part.show(cut_part)

top

Chargement et sauvegarde

Il ya plusieurs façons de sauver votre travail dans le Part Module . Vous pouvez bien sûr sauvegarder votre document au format FreeCAD, mais vous pouvez également enregistrer les objets directement dans un format courant de CAO, tels que BREP, IGS, STEP et STL.

There are several ways to save your work. You can of course save your FreeCAD document, but you can also save Part objects directly to common CAD formats, such as BREP, IGS, STEP and STL.

L'enregistrement d'une forme (un projet) dans un fichier est facile, il y a les fonctions exportBrep(), exportIges(), exportStl() et exportStep() qui sont des méthodes disponibles pour toutes les formes d'objets.
Donc, en faisant:

import Part
s = Part.makeBox(10, 10, 10)
s.exportStep("test.stp")

Ceci sauve votre box (cube) dans le format .STP. Pour charger un fichier BREP, IGES ou STEP:

import Part
s = Part.Shape()
s.read("test.stp")

Pour convertir un fichier STEP en fichier IGS:

import Part
 s = Part.Shape()
 s.read("file.stp")       # incoming file igs, stp, stl, brep
 s.exportIges("file.igs") # outbound file igs

En haut