Topological data scripting/fr: Difference between revisions

From FreeCAD Documentation
(Created page with "Nous utiliserons {{incode|makeCone(radius1, radius2, height, [pnt, dir, angle])}}. Par défaut, pnt = Vector(0, 0, 0), dir = Vector(0, 0, 1) et angle = 360.")
No edit summary
 
(115 intermediate revisions by 4 users not shown)
Line 2: Line 2:


{{Docnav/fr
{{Docnav/fr
|[[Part_scripting/fr|Part Écrire un script]]
|[[FreeCAD_Scripting_Basics/fr|Débuter avec les scripts FreeCAD]]
|[[Mesh_Scripting/fr|Script pour le maillage]]
|[[Scripted_objects/fr|Objets créés par script]]
}}
}}


{{TOCright}}
{{TOCright}}


<span id="Introduction"></span>
== Introduction ==
== Introduction ==


Ici, nous vous expliquerons comment contrôler le [[Part_Module/fr|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 le [[Part_Module#Explaining_the_concepts/fr|Module Part expliquant les concepts]]. Assurez-vous de parcourir la section [[Scripting/fr|Script]] et les pages [[FreeCAD_Scripting_Basics/fr|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_to_Python/fr|Introduction à Python]].
Ici, nous vous expliquerons comment contrôler l'[[Part_Workbench/fr|atelier 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 le [[Part_Workbench#Explaining_the_concepts/fr|Module Part expliquant les concepts]]. Assurez-vous de parcourir la section [[Scripting/fr|Script]] et les pages [[FreeCAD_Scripting_Basics/fr|bases pour script dans Freecad]] 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_to_Python/fr|Introduction à Python]].


<span id="See_also"></span>
===Diagramme de classe===
===Voir aussi===


* [[Part_scripting/fr|Part �crire un script]]
Voici un aperçu du [https://fr.wikipedia.org/wiki/UML_(informatique) Langage de Modélisation Unifié (UML)] de la classe la plus importante du module Part :
* [[OpenCASCADE/fr|OpenCASCADE]]
[[Image: Part_Classes.jpg|Classes Python du module Part]]


<span id="Class_diagram"></span>
[[#top|En haut]]
==Diagramme de classe==


Voici un aperçu du [https://fr.wikipedia.org/wiki/UML_(informatique) Langage de Modélisation Unifié (UML)] de la classe la plus importante du module Part :
[[Image: Part_Classes.jpg|Classes Python du module Part]]
{{Top}}
<span id="Geometry"></span>
===Géométrie===
===Géométrie===


Line 25: Line 32:
* '''Ligne''' Une ligne droite en 3D, définie par le point de départ et le point d'arrivée.
* '''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.
* '''Cercle''' Cercle ou arc de cercle, défini par un centre, un point de départ et d'arrivée.
* '''......''' Etc.
* Etc...
{{Top}}

<span id="Topology"></span>
[[#top|En haut]]

===Topologie===
===Topologie===


Line 41: Line 47:
* '''Sommet''' Un élément topologique correspondant à un point. Il a une dimension nulle.
* '''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.
* '''Forme''' Terme générique couvrant tout ce qui précède.
{{Top}}

<span id="Example:_Create_simple_topology"></span>
[[#top|En haut]]

===Exemple rapide : Création topologique simple===
===Exemple rapide : Création topologique simple===


[[Image:Wire.png|Wire]]
[[Image:Wire.png|Wire]]


Nous allons maintenant créer une topologie, en la construisant à partir d'une géométrie plus simple.
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.
{{Top}}
Comme étude de cas, nous utiliserons une ensemble comme illustré ci-dessus, qui se compose de quatre sommets, deux arcs et deux lignes.
<span id="Create_geometry"></span>

[[#top|En haut]]

====Création de la géométrie====
====Création de la géométrie====


Line 60: Line 63:


{{Code|code=
{{Code|code=
import FreeCAD as App
import Part
import Part
V1 = App.Vector(0, 10, 0)
from FreeCAD import Base
V1 = Base.Vector(0, 10, 0)
V2 = App.Vector(30, 10, 0)
V2 = Base.Vector(30, 10, 0)
V3 = App.Vector(30, -10, 0)
V3 = Base.Vector(30, -10, 0)
V4 = App.Vector(0, -10, 0)
V4 = Base.Vector(0, -10, 0)
}}
}}
{{Top}}

<span id="Arc"></span>
[[#top|En haut]]

====Arc====
====Arc====


Line 78: Line 80:


{{Code|code=
{{Code|code=
VC1 = Base.Vector(-10, 0, 0)
VC1 = App.Vector(-10, 0, 0)
C1 = Part.Arc(V1, VC1, V4)
C1 = Part.Arc(V1, VC1, V4)
VC2 = Base.Vector(40, 0, 0)
VC2 = App.Vector(40, 0, 0)
C2 = Part.Arc(V2, VC2, V3)
C2 = Part.Arc(V2, VC2, V3)
}}
}}
{{Top}}

<span id="Line"></span>
[[#top|En haut]]

====Ligne====
====Ligne====


Line 97: Line 98:
L2 = Part.LineSegment(V3, V4)
L2 = Part.LineSegment(V3, V4)
}}
}}
{{Top}}

<span id="Put_it_all_together"></span>
[[#top|En haut]]

===Relier le tout===
===Relier le tout===


Line 107: Line 107:
S1 = Part.Shape([C1, L1, C2, L2])
S1 = Part.Shape([C1, L1, C2, L2])
}}
}}
{{Top}}

<span id="Make_a_prism"></span>
[[#top|En haut]]

===Construire un prisme===
===Construire un prisme===


Line 116: Line 115:
{{Code|code=
{{Code|code=
W = Part.Wire(S1.Edges)
W = Part.Wire(S1.Edges)
P = W.extrude(Base.Vector(0, 0, 10))
P = W.extrude(App.Vector(0, 0, 10))
}}
}}
{{Top}}

<span id="Show_it_all"></span>
[[#top|En haut]]

===Affichons le tout===
===Affichons le tout===


Line 126: Line 124:
Part.show(P)
Part.show(P)
}}
}}
{{Top}}

<span id="Create_basic_shapes"></span>
[[#top|En haut]]

==Création de formes basiques==
==Création de formes basiques==


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


{{Code|code=
{{Code|code=
Line 139: Line 136:


Quelques méthodes {{incode|make...()}} disponibles :
Quelques méthodes {{incode|make...()}} disponibles :
* {{incode|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.
* {{incode|makeBox(l, w, h, [p, d])}} Crée une boîte située en p et pointant dans la direction d avec les dimensions longueur, largeur et hauteur.
* {{incode|makeCircle(radius)}} Dessine un cercle avec un rayon donné.
* {{incode|makeCircle(radius)}} Dessine un cercle avec un rayon donné.
* {{incode|makeCone(radius1, radius2, height)}} Crée un cône avec rayons1, rayon2 et hauteur donnés.
* {{incode|makeCone(radius1, radius2, height)}} Crée un cône avec rayons1, rayon2 et hauteur donnés.
Line 148: Line 145:
* {{incode|makeSphere(radius)}} Crée une sphère avec un rayon donné.
* {{incode|makeSphere(radius)}} Crée une sphère avec un rayon donné.
* {{incode|makeTorus(radius1, radius2)}} Crée un tore avec les rayons donnés.
* {{incode|makeTorus(radius1, radius2)}} Crée un tore avec les rayons donnés.
Voir la page de l'[[Part_API/fr|API Part]] pour une liste complète des méthodes disponibles du module Part.
Voir la page de l'[[Part_API/fr|API Part]] ou cette [https://freecad-python-stubs.readthedocs.io/en/latest/autoapi/Part/ documentation autogénérée de l'API Python de Part] pour une liste complète des méthodes disponibles du module Part.
{{Top}}

<span id="Import_modules"></span>
[[#top|En haut]]

===Importer les modules nécessaires===
===Importer les modules nécessaires===


Nous devons d'abord importer le module Part, pour pouvoir utiliser son contenu en Python.
Tout d'abord, nous devons importer les modules FreeCAD et Part afin de pouvoir utiliser leur contenu en Python :
Nous importerons également le module Base depuis l'intérieur du module FreeCAD :


{{Code|code=
{{Code|code=
import FreeCAD as App
import Part
import Part
from FreeCAD import Base
}}
}}
{{Top}}
<span id="Create_a_vector"></span>
===Création d'un vecteur===


Les [https://fr.wikipedia.org/wiki/Vecteur 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 :
[[#top|En haut]]

===Création d'un Vecteur===

==== Création d'un Vecteur ====

Les [https://fr.wikipedia.org/wiki/Vecteur 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 :


{{Code|code=
{{Code|code=
myVector = Base.Vector(3, 2, 0)
myVector = App.Vector(3, 2, 0)
}}
}}


Nous venons de créer un vecteur aux coordonnées X=3, Y=2, Z=0. Dans le module Part,
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 :
les vecteurs sont utilisés partout. Part shape 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 :


{{Code|code=
{{Code|code=
myVertex = myShape.Vertexes[0]
myVertex = myShape.Vertexes[0]
print myVertex.Point
print(myVertex.Point)
> Vector (3, 2, 0)
> Vector (3, 2, 0)
}}
}}
{{Top}}

<span id="Create_an_edge"></span>
[[#top|En haut]]

===Création d'une arête===
===Création d'une arête===


Line 199: Line 188:


{{Code|code=
{{Code|code=
vec1 = Base.Vector(0, 0, 0)
vec1 = App.Vector(0, 0, 0)
vec2 = Base.Vector(10, 0, 0)
vec2 = App.Vector(10, 0, 0)
line = Part.LineSegment(vec1, vec2)
line = Part.LineSegment(vec1, vec2)
edge = line.toShape()
edge = line.toShape()
Line 213: Line 202:
> Vector (5, 0, 0)
> Vector (5, 0, 0)
}}
}}
{{Top}}

<span id="Put_the_shape_on_screen"></span>
[[#top|En haut]]

===Mise en forme à l'écran===
===Mise en forme à l'écran===


Line 225: Line 213:


La fonction show crée un objet dans notre document FreeCAD et lui assigne notre forme "filaire". Utilisez-la chaque fois qu'il est temps d'afficher votre création à l'écran.
La fonction show crée un objet dans notre document FreeCAD et lui assigne notre forme "filaire". Utilisez-la chaque fois qu'il est temps d'afficher votre création à l'écran.
{{Top}}

<span id="Create_a_wire"></span>
[[#top|En haut]]

===Création d'un contour (ou forme filaire)===
===Création d'un contour (ou forme filaire)===


Un contour est une ligne brisée, à arêtes multiples et peut être créé à partir d'une liste d'arêtes ou même une liste de contours (ou de formes filaires) :
Un contour est une polyligne, à arêtes multiples et peut être créé à partir d'une liste d'arêtes ou même une liste de contours (ou de formes filaires) :


{{Code|code=
{{Code|code=
Line 257: Line 244:
> False
> False
}}
}}
{{Top}}

<span id="Create_a_face"></span>
[[#top|En haut]]

===Création d'une face===
===Création d'une face===


Seules les faces créées à partir de formes filaires fermées seront valides. Dans cet exemple, wire3 est un contour fermé mais wire2 ne l'est pas (voir ci-dessus):
Seules les faces créées à partir de formes filaires fermées seront valides. Dans cet exemple, wire3 est un contour fermé mais wire2 ne l'est pas (voir ci-dessus) :


{{Code|code=
{{Code|code=
Line 275: Line 261:
> True
> True
sface = Part.Face(wire2)
sface = Part.Face(wire2)
face.isValid()
sface.isValid()
> False
> False
}}
}}


Seules les faces auront une superficie, mais pas les contours et les arêtes.
Seules les faces auront une superficie, mais pas les contours et les arêtes.
{{Top}}

<span id="Create_a_circle"></span>
[[#top|En haut]]

===Création d'un cercle===
===Création d'un cercle===


Line 296: Line 281:


{{Code|code=
{{Code|code=
ccircle = Part.makeCircle(10, Base.Vector(10, 0, 0), Base.Vector(1, 0, 0))
ccircle = Part.makeCircle(10, App.Vector(10, 0, 0), App.Vector(1, 0, 0))
ccircle.Curve
ccircle.Curve
> Circle (Radius : 10, Position : (10, 0, 0), Direction : (1, 0, 0))
> Circle (Radius : 10, Position : (10, 0, 0), Direction : (1, 0, 0))
}}
}}


ccircle sera créé à une distance de 10 de l'origine X et sera orienté vers l'extérieur le long de l'axe X. Remarque : {{incode|makeCircle()}} accepte uniquement {{incode|Base.Vector ()}} pour la position et les paramètres habituels et pas les tuples (n-uplet). Vous pouvez également créer des parties du cercle, en donnant un angle de départ et de fin :
ccircle sera créé à la distance 10 de l'origine X et sera orienté vers l'extérieur le long de l'axe X. Remarque : {{incode|makeCircle()}} n'accepte que {{incode|App.Vector()}} pour les paramètres position et les paramètres normaux, et non les tuples. Vous pouvez également créer une partie du cercle en donnant un angle de départ et un angle d'arrivée :


{{Code|code=
{{Code|code=
from math import pi
from math import pi
arc1 = Part.makeCircle(10, Base.Vector(0, 0, 0), Base.Vector(0, 0, 1), 0, 180)
arc1 = Part.makeCircle(10, App.Vector(0, 0, 0), App.Vector(0, 0, 1), 0, 180)
arc2 = Part.makeCircle(10, Base.Vector(0, 0, 0), Base.Vector(0, 0, 1), 180, 360)
arc2 = Part.makeCircle(10, App.Vector(0, 0, 0), App.Vector(0, 0, 1), 180, 360)
}}
}}


Line 315: Line 300:
degrees = math.degrees(radians)
degrees = math.degrees(radians)
}}
}}
{{Top}}

<span id="Create_an_arc_along_points"></span>
[[#top|En haut]]

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


Malheureusement, il n'y a pas de fonction {{incode|makeArc()}}, mais nous avons la fonction {{incode|Part.Arc()}} pour créer un arc de cercle passant par trois points. Il crée un objet arc, joignant le point de départ au point d'arrivée, en passant par le point médian.
Malheureusement, il n'y a pas de fonction {{incode|makeArc()}}, mais nous avons la fonction {{incode|Part.Arc()}} pour créer un arc de cercle passant par trois points. Il crée un objet arc, joignant le point de départ au point d'arrivée, en passant par le point médian. La fonction {{incode|toShape()}} de l'objet arc, doit être appelée pour obtenir un objet filaire, comme lorsque vous utilisez {{incode|Part.LineSegment}} au lieu de {{incode|Part.makeLine}}.
La fonction {{incode|toShape()}} de l'objet arc, doit être appelée pour obtenir un objet filaire, comme lorsque vous utilisez {{incode|Part.LineSegment}} au lieu de {{incode|Part.makeLine}}.


{{Code|code=
{{Code|code=
arc = Part.Arc(Base.Vector(0, 0, 0), Base.Vector(0, 5, 0), Base.Vector(5, 5, 0))
arc = Part.Arc(App.Vector(0, 0, 0), App.Vector(0, 5, 0), App.Vector(5, 5, 0))
arc
arc
> <Arc object>
> <Arc object>
Line 331: Line 314:
}}
}}


{{incode|Arc()}} accepte uniquement {{incode|Base.Vector()}} pour les points et pas les tuples. Vous pouvez également obtenir un arc, en utilisant une partie d'un cercle :
{{incode|Arc()}} n'accepte que {{incode|App.Vector()}} pour les points et non les tuples. Vous pouvez également obtenir un arc en utilisant une partie d'un cercle :


{{Code|code=
{{Code|code=
from math import pi
from math import pi
circle = Part.Circle(Base.Vector(0, 0, 0), Base.Vector(0, 0, 1), 10)
circle = Part.Circle(App.Vector(0, 0, 0), App.Vector(0, 0, 1), 10)
arc = Part.Arc(circle,0,pi)
arc = Part.Arc(circle,0,pi)
}}
}}


Les arcs sont des arêtes valides comme les segments, ils peuvent donc également être utilisés dans les contours (ou forme filaire).
Les arcs sont des arêtes valides comme les segments, ils peuvent donc également être utilisés dans les contours (ou forme filaire).
{{Top}}

<span id="Create_a_polygon"></span>
[[#top|En haut]]

===Création de polygones===
===Création de polygones===


Line 348: Line 330:


{{Code|code=
{{Code|code=
lshape_wire = Part.makePolygon([Base.Vector(0, 5, 0), Base.Vector(0, 0, 0), Base.Vector(5, 0, 0)])
lshape_wire = Part.makePolygon([App.Vector(0, 5, 0), App.Vector(0, 0, 0), App.Vector(5, 0, 0)])
}}
}}
{{Top}}

<span id="Create_a_Bézier_curve"></span>
[[#top|En haut]]

===Création de courbes de Bézier===
===Création de courbes de Bézier===


Line 364: Line 345:
return(edge)
return(edge)
}}
}}
{{Top}}

<span id="Create_a_plane"></span>
[[#top|En haut]]

===Création d'un plan===
===Création d'un plan===


Un plan est une surface rectangulaire plate. La méthode utilisée pour le créer est {{incode|makePlane(longueur, largeur, [start_pnt, dir_normal])}}. Par défaut start_pnt = Vector(0, 0, 0) et dir_normal = Vector(0, 0, 1). L'utilisation de dir_normal = Vector(0, 0, 1) créera le plan orienté dans la direction positive de l'axe Z, tandis que dir_normal = Vector(1, 0, 0) créera le plan orienté dans la direction positive de l'axe X :
Un plan est une surface rectangulaire plate. La méthode utilisée pour le créer est {{incode|makePlane(length, width, [start_pnt, dir_normal])}}. Par défaut start_pnt = Vector(0, 0, 0) et dir_normal = Vector(0, 0, 1). L'utilisation de dir_normal = Vector(0, 0, 1) créera le plan orienté dans la direction positive de l'axe Z, tandis que dir_normal = Vector(1, 0, 0) créera le plan orienté dans la direction positive de l'axe X :


{{Code|code=
{{Code|code=
Line 375: Line 355:
plane
plane
> <Face object at 028AF990>
> <Face object at 028AF990>
plane = Part.makePlane(2, 2, Base.Vector(3, 0, 0), Base.Vector(0, 1, 0))
plane = Part.makePlane(2, 2, App.Vector(3, 0, 0), App.Vector(0, 1, 0))
plane.BoundBox
plane.BoundBox
> BoundBox (3, 0, 0, 5, 0, 2)
> BoundBox (3, 0, 0, 5, 0, 2)
}}
}}


{{incode|BoundBox}} est un cuboïde entourant le plan avec une diagonale commençant à
{{incode|BoundBox}} est un cuboïde entourant le plan avec une diagonale commençant à (3, 0, 0) et se terminant en (5, 0, 2). Ici, l'épaisseur du {{incode|BoundBox}} le long de l'axe Y est nulle, puisque notre forme est totalement plate.
(3, 0, 0) et se terminant en (5, 0, 2). Ici, l'épaisseur du {{incode|BoundBox}} le long de l'axe Y est nulle, puisque notre forme est totalement plate.

Remarque : {{incode|makePlane()}} accepte uniquement {{incode|Base.Vector()}} pour start_pnt et dir_normal et pas les tuples.

[[#top|En haut]]


Remarque : {{incode|makePlane()}} accepte uniquement {{incode|App.Vector()}} pour start_pnt et dir_normal et pas les tuples.
{{Top}}
<span id="Create_an_ellipse"></span>
===Création d'une ellipse===
===Création d'une ellipse===


Line 407: Line 385:
}}
}}


Crée une ellipse centrée sur le point Centre, où le plan de l'ellipse est défini par Centre, S1 et S2, son grand axe est défini par Centre et S1, son grand rayon est la distance entre Centre et S1 et son petit rayon est la distance entre S2 et le grand axe.
Crée une ellipse centrée sur le point Centre, où le plan de l'ellipse est défini par Center, S1 et S2, son grand axe est défini par Center et S1, son grand rayon est la distance entre Center et S1 et son petit rayon est la distance entre S2 et le grand axe.


{{Code|code=
{{Code|code=
Line 413: Line 391:
}}
}}


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


{{Code|code=
{{Code|code=
eli = Part.Ellipse(Base.Vector(10, 0, 0), Base.Vector(0, 5, 0), Base.Vector(0, 0, 0))
eli = Part.Ellipse(App.Vector(10, 0, 0), App.Vector(0, 5, 0), App.Vector(0, 0, 0))
Part.show(eli.toShape())
Part.show(eli.toShape())
}}
}}
Line 423: Line 400:
Dans le code ci-dessus, nous avons passé S1, S2 et le centre. De même que l'{{incode|Arc}}, l'{{incode|Ellipse}} crée un objet ellipse et non une arête, nous devons donc le convertir en arête en utilisant {{incode|toShape()}} pour l'affichage.
Dans le code ci-dessus, nous avons passé S1, S2 et le centre. De même que l'{{incode|Arc}}, l'{{incode|Ellipse}} crée un objet ellipse et non une arête, nous devons donc le convertir en arête en utilisant {{incode|toShape()}} pour l'affichage.


Remarque : {{incode|Ellipse()}} n'accepte que {{incode|Base.Vector()}} pour les points et pas les tuples.
Remarque : {{incode|Ellipse()}} n'accepte que {{incode|App.Vector()}} pour les points et pas les tuples.


{{Code|code=
{{Code|code=
eli = Part.Ellipse(Base.Vector(0, 0, 0), 10, 5)
eli = Part.Ellipse(App.Vector(0, 0, 0), 10, 5)
Part.show(eli.toShape())
Part.show(eli.toShape())
}}
}}


Pour construire l'Ellipse ci-dessus, nous avons entré les coordonnées centrales, le Grand rayon et le Petit rayon.
Pour construire l'Ellipse ci-dessus, nous avons entré les coordonnées centrales, le Grand rayon et le Petit rayon.
{{Top}}
<span id="Create_a_torus"></span>
===Création d'un tore===


Utilisation de {{incode|makeTorus(radius1, radius2, [pnt, dir, angle1, angle2, angle])}}. Par défaut pnt = Vector (0, 0, 0), dir = Vector (0, 0, 1), angle1 = 0, angle2 = 360 et angle = 360. Considérez un tore comme un petit cercle balayant un grand cercle. Radius1 est le rayon du grand cercle, radius2 est le rayon du petit cercle, pnt est le centre du tore et dir est la direction normale. Angle1 et angle2 sont des angles en degrés pour le petit cercle; le dernier paramètre d'angle est la section du tore :
[[#top|En haut]]

===Création d'un Tore===

Utilisation de {{incode|makeTorus(radius1, radius2, [pnt, dir, angle1, angle2, angle])}}.
Par défaut pnt = Vector (0, 0, 0), dir = Vector (0, 0, 1), angle1 = 0, angle2 = 360 et angle = 360.
Considérez un tore comme un petit cercle balayant un grand cercle. Radius1 est le
rayon du grand cercle, radius2 est le rayon du petit cercle, pnt est le centre
du tore et dir est la direction normale. angle1 et angle2 sont des angles en
degrés pour le petit cercle; le dernier paramètre d'angle est la section du tore :


{{Code|code=
{{Code|code=
Line 450: Line 421:


{{Code|code=
{{Code|code=
tor=Part.makeTorus(10, 5, Base.Vector(0, 0, 0), Base.Vector(0, 0, 1), 0, 180)
tor=Part.makeTorus(10, 5, App.Vector(0, 0, 0), App.Vector(0, 0, 1), 0, 180)
}}
}}


Line 456: Line 427:


{{Code|code=
{{Code|code=
tor=Part.makeTorus(10, 5, Base.Vector(0, 0, 0), Base.Vector(0, 0, 1), 0, 360, 180)
tor=Part.makeTorus(10, 5, App.Vector(0, 0, 0), App.Vector(0, 0, 1), 0, 360, 180)
}}
}}


Le code ci-dessus créera un semi-tore ; seul le dernier paramètre est modifié, c'est-à-dire que les angles restants sont des valeurs par défaut. Attribuer l'angle 180 créera le tore de 0 à 180, c'est-à-dire un demi tore.
Le code ci-dessus créera un semi-tore ; seul le dernier paramètre est modifié, c'est-à-dire que les angles restants sont des valeurs par défaut. Attribuer l'angle 180 créera le tore de 0 à 180, c'est-à-dire un demi tore.
{{Top}}

<span id="Create_a_box_or_cuboid"></span>
[[#top|En haut]]

===Création d'un pavé ou d'un cuboïde===
===Création d'un pavé ou d'un cuboïde===


Line 473: Line 443:
> 8
> 8
}}
}}
{{Top}}
<span id="Create_a_sphere"></span>
===Création d'une sphère===


Utilisation de {{incode|makeSphere(radius, [pnt, dir, angle1, angle2, angle3])}}. Par défaut pnt = Vector(0, 0, 0), dir = Vector(0, 0, 1), angle1 = -90, angle2 = 90 et angle3 = 360. Angle1 et angle2 correspondent au minimum et au maximum vertical de la sphère, angle3 est le diamètre de la sphère.
[[#top|En haut]]

===Création d'une Sphère===

Utilisation de {{incode|makeSphere(radius, [pnt, dir, angle1, angle2, angle3])}}. Par défaut pnt = Vector(0, 0, 0), dir = Vector(0, 0, 1), angle1 = -90, angle2 = 90 et angle3 = 360. Angle1 et angle2 correspondent au minimum et au maximum vertical de la sphère, angle3
est le diamètre de la sphère.


{{Code|code=
{{Code|code=
sphere = Part.makeSphere(10)
sphere = Part.makeSphere(10)
hemisphere = Part.makeSphere(10, Base.Vector(0, 0, 0), Base.Vector(0, 0, 1), -90, 90, 180)
hemisphere = Part.makeSphere(10, App.Vector(0, 0, 0), App.Vector(0, 0, 1), -90, 90, 180)
}}
}}
{{Top}}

<span id="Create_a_cylinder"></span>
[[#top|En haut]]

=== Création d'un cylindre ===
=== Création d'un cylindre ===


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

{{Code|code=
{{Code|code=
cylinder = Part.makeCylinder(5, 20)
cylinder = Part.makeCylinder(5, 20)
partCylinder = Part.makeCylinder(5, 20, Base.Vector(20, 0, 0), Base.Vector(0, 0, 1), 180)
partCylinder = Part.makeCylinder(5, 20, App.Vector(20, 0, 0), App.Vector(0, 0, 1), 180)
}}
}}
{{Top}}
[[#top|En haut]]
<span id="Create_a_cone"></span>

=== Création d'un cône ===
=== Création d'un cône ===


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

{{Code|code=
{{Code|code=
cone = Part.makeCone(10, 0, 20)
cone = Part.makeCone(10, 0, 20)
semicone = Part.makeCone(10, 0, 20, Base.Vector(20, 0, 0), Base.Vector(0, 0, 1), 180)
semicone = Part.makeCone(10, 0, 20, App.Vector(20, 0, 0), App.Vector(0, 0, 1), 180)
}}
}}
{{Top}}
[[#top|top]]
<span id="Modify_shapes"></span>

<div class="mw-translate-fuzzy">
== Modification d'une forme ==
== 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.
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.
{{Top}}
</div>
<span id="Transform_operations"></span>
== Opérations de transformation ==


<span id="Translate_a_shape"></span>
There are several ways to modify shapes. Some are simple transformation operations
=== Transformer une forme ===
such as moving or rotating shapes, others are more complex, such as unioning and
subtracting one shape from another.


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ée de la même manière :
[[#top|top]]


<div class="mw-translate-fuzzy">
=== Opérations de Transformation ===
</div>

<div class="mw-translate-fuzzy">
==== Transformer une forme ====

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

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:
{{Code|code=
{{Code|code=
myShape = Part.makeBox(2, 2, 2)
myShape = Part.makeBox(2, 2, 2)
myShape.translate(Base.Vector(2, 0, 0))
myShape.translate(App.Vector(2, 0, 0))
}}
}}
<div class="mw-translate-fuzzy">
Cette commande va déplacer notre forme "'''myShape'''" de 2 unités dans la direction x.
</div>

[[#top|top]]


Cette commande va déplacer notre forme "myShape" de 2 unités dans la direction X.
<div class="mw-translate-fuzzy">
{{Top}}
==== Rotation d'une forme ====
<span id="Rotate_a_shape"></span>
=== Rotation d'une forme ===


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


To rotate a shape, you need to specify the rotation center, the axis,
and the rotation angle:
{{Code|code=
{{Code|code=
myShape.rotate(Base.Vector(0, 0, 0),Base.Vector(0, 0, 1), 180)
myShape.rotate(App.Vector(0, 0, 0),App.Vector(0, 0, 1), 180)
}}
}}

Cette opération va faire pivoter notre forme de 180 degrés sur l'axe z.
Cette opération va faire pivoter notre forme de 180 degrés sur l'axe z.
{{Top}}
<span id="Matrix_transformations"></span>
=== 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 :
[[#top|top]]


<div class="mw-translate-fuzzy">
==== 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.<br />
Par exemple:
</div>

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:
{{Code|code=
{{Code|code=
myMat = Base.Matrix()
myMat = App.Matrix()
myMat.move(Base.Vector(2, 0, 0))
myMat.move(App.Vector(2, 0, 0))
myMat.rotateZ(math.pi/2)
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:
PS: les matrices de FreeCAD travaillent en radians. En outre presque toutes les opérations matricielles qui travaillent avec un vecteur peuvent aussi avoir 3 nombres de sorte que ces 2 lignes effectuent le même travail :

{{Code|code=
{{Code|code=
myMat.move(2, 0, 0)
myMat.move(2, 0, 0)
myMat.move(Base.Vector(2, 0, 0))
myMat.move(App.Vector(2, 0, 0))
}}
}}

<div class="mw-translate-fuzzy">
Lorsque notre matrice est paramétrée, nous pouvons l'appliquer à notre forme. FreeCAD fournit nous fournit 2 méthodes: '''transformShape()''' et '''transformGeometry(''').<br />
Lorsque notre matrice est paramétrée, nous pouvons l'appliquer à notre forme. FreeCAD fournit nous fournit 2 méthodes : {{incode|transformShape()}} et {{incode|transformGeometry()}}. La différence est que, avec la première, vous ne verez pas de différence (voir [[#Mettre à l'échelle une forme|Mettre à l'échelle une forme]] ci-dessous). Donc, nous pouvons opérer notre transformation comme ceci :

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).<br />
Donc, nous pouvons opérer notre transformation comme ceci:
</div>
{{Code|code=
{{Code|code=
myShape.transformShape(myMat)
myShape.transformShape(myMat)
}}
}}

ou
ou

{{Code|code=
{{Code|code=
myShape.transformGeometry(myMat)
myShape.transformGeometry(myMat)
}}
}}
{{Top}}
[[#top|top]]
<span id="Scale_a_shape"></span>
=== Mettre à l'échelle une forme ===


La mise à l'échelle d'une forme est une opération plus dangereuse car, contrairement à la traduction ou rotation, mise à l'échelle non uniforme (avec des valeurs différentes pour X, Y et Z) peut modifier la structure de la forme. Par exemple, mettre à l'échelle un cercle avec une valeur plus élevée horizontalement que verticalement le transformera en un ellipse, qui se comporte mathématiquement très différemment. Pour la mise à l'échelle, nous ne peut pas utiliser {{incode|transformShape()}}, nous devons utiliser {{incode|transformGeometry()}} :
<div class="mw-translate-fuzzy">
==== 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!<br />
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.<br />
Pour modifier l'échelle, nous ne pouvons pas utiliser le transformShape, nous devons utiliser '''transformGeometry()''':
</div>

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 {{incode|transformShape()}}, we must use {{incode|transformGeometry()}}:
{{Code|code=
{{Code|code=
myMat = Base.Matrix()
myMat = App.Matrix()
myMat.scale(2, 1, 1)
myMat.scale(2, 1, 1)
myShape=myShape.transformGeometry(myMat)
myShape=myShape.transformGeometry(myMat)
}}
}}
{{Top}}
[[#top|top]]
<span id="Boolean_operations"></span>
== Opérations Booléennes ==


<span id="Subtraction"></span>
<div class="mw-translate-fuzzy">
=== Opérations Booléennes ===
=== Soustraction ===
</div>


Soustraire une forme d'une autre est appelé, dans le jargon de FreeCAD "cut" (coupe) et se fait de cette manière :
<div class="mw-translate-fuzzy">
==== Soustraction ====


Soustraire une forme d'une autre est appelé, dans le jargon [http://www.opencascade.org/org/doc/ OCC]/FreeCAD "'''cut'''" (coupe) et,<br />
se fait de cette manière:
</div>

Subtracting a shape from another one is called "cut" in FreeCAD
and is done like this:
{{Code|code=
{{Code|code=
cylinder = Part.makeCylinder(3, 10, Base.Vector(0, 0, 0), Base.Vector(1, 0, 0))
cylinder = Part.makeCylinder(3, 10, App.Vector(0, 0, 0), App.Vector(1, 0, 0))
sphere = Part.makeSphere(5, Base.Vector(5, 0, 0))
sphere = Part.makeSphere(5, App.Vector(5, 0, 0))
diff = cylinder.cut(sphere)
diff = cylinder.cut(sphere)
}}
}}
{{Top}}
[[#top|top]]
<span id="Intersection"></span>

=== Intersection ===
<div class="mw-translate-fuzzy">
==== Intersection ====


De la même manière, l'intersection entre 2 formes est appelé "'''common'''" et se fait de cette manière:
De la même manière, l'intersection entre 2 formes est appelé "common" (commun) et se fait de cette manière :
</div>


The same way, the intersection between two shapes is called "common" and is done
this way:
{{Code|code=
{{Code|code=
cylinder1 = Part.makeCylinder(3, 10, Base.Vector(0, 0, 0), Base.Vector(1, 0, 0))
cylinder1 = Part.makeCylinder(3, 10, App.Vector(0, 0, 0), App.Vector(1, 0, 0))
cylinder2 = Part.makeCylinder(3, 10, Base.Vector(5, 0, -5), Base.Vector(0, 0, 1))
cylinder2 = Part.makeCylinder(3, 10, App.Vector(5, 0, -5), App.Vector(0, 0, 1))
common = cylinder1.common(cylinder2)
common = cylinder1.common(cylinder2)
}}
}}
{{Top}}
[[#top|top]]
<span id="Union"></span>
=== Fusion ===


L'union est appelé "fuse" (fusion) et fonctionne de la même manière :
<div class="mw-translate-fuzzy">
==== Fusion ====


La fusion "'''fuse'''", fonctionne de la même manière:
</div>

Union is called "fuse" and works the same way:
{{Code|code=
{{Code|code=
cylinder1 = Part.makeCylinder(3, 10, Base.Vector(0, 0, 0), Base.Vector(1, 0, 0))
cylinder1 = Part.makeCylinder(3, 10, App.Vector(0, 0, 0), App.Vector(1, 0, 0))
cylinder2 = Part.makeCylinder(3, 10, Base.Vector(5, 0, -5), Base.Vector(0, 0, 1))
cylinder2 = Part.makeCylinder(3, 10, App.Vector(5, 0, -5), App.Vector(0, 0, 1))
fuse = cylinder1.fuse(cylinder2)
fuse = cylinder1.fuse(cylinder2)
}}
}}
{{Top}}
[[#top|top]]
<span id="Section"></span>

=== Section ===
<div class="mw-translate-fuzzy">
==== Section ====


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


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.
{{Code|code=
{{Code|code=
cylinder1 = Part.makeCylinder(3, 10, Base.Vector(0, 0, 0), Base.Vector(1, 0, 0))
cylinder1 = Part.makeCylinder(3, 10, App.Vector(0, 0, 0), App.Vector(1, 0, 0))
cylinder2 = Part.makeCylinder(3, 10, Base.Vector(5, 0, -5), Base.Vector(0, 0, 1))
cylinder2 = Part.makeCylinder(3, 10, App.Vector(5, 0, -5), App.Vector(0, 0, 1))
section = cylinder1.section(cylinder2)
section = cylinder1.section(cylinder2)
section.Wires
section.Wires
Line 680: Line 598:
<Edge object at 0D8F4BB0>]
<Edge object at 0D8F4BB0>]
}}
}}
{{Top}}
[[#top|top]]
<span id="Extrusion"></span>
=== Extrusion ===


L'extrusion est une action de "pousser" une forme plane dans une certaine direction et résultant en un corps solide. Pensez à un cercle devenant un tube en le "poussant" :
<div class="mw-translate-fuzzy">
==== Extrusion ====


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

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":
{{Code|code=
{{Code|code=
circle = Part.makeCircle(10)
circle = Part.makeCircle(10)
tube = circle.extrude(Base.Vector(0, 0, 2))
tube = circle.extrude(App.Vector(0, 0, 2))
}}
}}

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

{{Code|code=
{{Code|code=
wire = Part.Wire(circle)
wire = Part.Wire(circle)
disc = Part.Face(wire)
disc = Part.Face(wire)
cylinder = disc.extrude(Base.Vector(0, 0, 2))
cylinder = disc.extrude(App.Vector(0, 0, 2))
}}
}}
{{Top}}
[[#top|top]]
<span id="Explore_shapes"></span>
== Exploration de formes ==


Vous pouvez facilement explorer la structure de ses données topologique :
<div class="mw-translate-fuzzy">
== Exploration de la forme (shape) ==


Vous pouvez facilement explorer la structure de ses données topologique:
</div>

You can easily explore the topological data structure:
{{Code|code=
{{Code|code=
import Part
import Part
Line 726: Line 637:
v.Point
v.Point
}}
}}
<div class="mw-translate-fuzzy">
En tapant ce code dans l'interpréteur Python, vous aurez une bonne compréhension de la structure de '''Part objets'''.<br />
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.
</div>


En tapant les lignes ci-dessus dans l'interpréteur Python, vous gagnerez une bonne compréhension de la structure des objets Part. Ici, notre commande {{incode|makeBox ()}} créé une forme solide. Ce solide, comme tous les solides de pièce, contient des faces. Les faces contiennent toujours des fils, qui sont des listes d'arêtes qui bordent la face. Chaque face a au moins un fil fermé (il peut en avoir plus si la face a un trou). Dans le fil, nous pouvons regarder chaque bord séparément et à l'intérieur de chaque bord, nous pouvons voir les sommets. Les arêtes droites n'ont que deux sommets, évidemment.
[[#top|top]]
{{Top}}

<span id="Edge_analysis"></span>
<div class="mw-translate-fuzzy">
=== Analyse des arêtes (Edge) ===
=== 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.<br />
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 :
Cela signifie, que vous pouvez suivre une arête/courbe par sa longueur:
</div>


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:
{{Code|code=
{{Code|code=
import Part
import Part
Line 749: Line 651:
print(anEdge.Length)
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.<br />
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'''.
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.

{{Code|code=
{{Code|code=
anEdge.tangentAt(0.0) # tangent direction at the beginning
anEdge.tangentAt(0.0) # tangent direction at the beginning
Line 762: Line 665:
anEdge.normalAt(50) # normal vector at that position (if defined)
anEdge.normalAt(50) # normal vector at that position (if defined)
}}
}}
{{Top}}
[[#top|top]]
<span id="Use_a_selection"></span>

<div class="mw-translate-fuzzy">
=== Utilisation de la sélection ===
=== 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.<br />
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être de vue.
Tout d'abord, nous créons une boîte (box) et nous l'affichons dans la fen^etre de vue.
</div>


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.
{{Code|code=
{{Code|code=
import Part
import Part
Line 778: Line 676:
Gui.SendMsgToActiveView("ViewFit")
Gui.SendMsgToActiveView("ViewFit")
}}
}}

Sélectionnez maintenant des faces ou arêtes.<br />
Avec ce script, vous pouvez parcourir tous les objets sélectionnés et visionner leurs sous-éléments:
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 :

{{Code|code=
{{Code|code=
for o in Gui.Selection.getSelectionEx():
for o in Gui.Selection.getSelectionEx():
Line 788: Line 687:
print("object: ", s)
print("object: ", s)
}}
}}

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

{{Code|code=
{{Code|code=
length = 0.0
length = 0.0
Line 797: Line 698:
print("Length of the selected edges: ", length)
print("Length of the selected edges: ", length)
}}
}}
{{Top}}
[[#top|top]]
<span id="Example:_The_OCC_bottle"></span>
==Exemple : la bouteille OCC==


Un exemple typique trouvé sur le [https://www.opencascade.com/doc/occt-6.9.0/overview/html/occt__tutorial.html site Web OpenCasCade Technology] est de savoir comment construire une bouteille. C'est aussi un bon exercice pour FreeCAD. En fait, si vous suivez notre exemple ci-dessous et la page OCC simultanément, vous verrez à quel point les structures OCC sont bien implémentées dans FreeCAD. Le script est inclus dans l'installation de FreeCAD (dans le dossier {{FileName|Mod/Part}}) et peut être appelé à partir de l'interpréteur Python en tapant :
<div class="mw-translate-fuzzy">
== Exemple Complet: "The OCC bottle" ==


L'exemple [http://www.opencascade.com/doc/occt-6.9.0/overview/html/occt__tutorial.html#sec1 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:
</div>

A typical example found on the [https://www.opencascade.com/doc/occt-6.9.0/overview/html/occt__tutorial.html 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 {{FileName|Mod/Part}} folder) and can be called from the Python interpreter by typing:
{{Code|code=
{{Code|code=
import Part
import Part
Line 814: Line 710:
Part.show(bottle)
Part.show(bottle)
}}
}}
{{Top}}
[[#top|top]]
<span id="The_script"></span>

=== Le script ===
<div class="mw-translate-fuzzy">
=== Le script complet ===


Pour les besoins de ce tutoriel, nous considérerons une version réduite du script. Dans cette version, le flacon ne sera pas évidé et le goulot du flacon ne sera pas fileté.
Ici, le script complet de '''MakeBottle.py''' (extension .py):
</div>


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.
{{Code|code=
{{Code|code=
import FreeCAD as App
import Part, math
import Part, math
from FreeCAD import Base


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


aArcOfCircle = Part.Arc(aPnt2, aPnt3, aPnt4)
aArcOfCircle = Part.Arc(aPnt2, aPnt3, aPnt4)
Line 843: Line 736:
aWire=Part.Wire([aEdge1, aEdge2, aEdge3])
aWire=Part.Wire([aEdge1, aEdge2, aEdge3])


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


Line 851: Line 744:


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


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


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


myNeckRadius = myThickness / 4.
myNeckRadius = myThickness / 4.
Line 869: Line 762:
Part.show(el)
Part.show(el)
}}
}}
{{Top}}
[[#top|top]]
<span id="Detailed_explanation"></span>
===Explications détaillées===


<div class="mw-translate-fuzzy">
=== Détail et déroulement '''MakeBottle.py''' ===
</div>
{{Code|code=
{{Code|code=
import FreeCAD as App
import Part, math
import Part, math
from FreeCAD import Base
}}
}}

<div class="mw-translate-fuzzy">
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.
Nous aurons, bien sûr, besoin des modules {{incode|FreeCAD}} et {{incode|Part}}.
</div>


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


Ici, nous définissons notre fonction {{incode|makeBottleTut}}. 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.
<div class="mw-translate-fuzzy">
Ici, nous définissons notre fonction MakeBottle.<br />
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.<br />
Ensuite, nous définissons une paire de points qui seront utilisés pour la construction de notre profil de base.
</div>


{{Code|code=
{{Code|code=
Line 904: Line 791:
}}
}}


Ici, nous définissons la géométrie : un arc, composé de trois points et deux segments de ligne, composés de deux points.
<div class="mw-translate-fuzzy">
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.
</div>


{{Code|code=
{{Code|code=
Line 916: Line 801:
}}
}}


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.
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.
Trois bords (bords ou arêtes peuvent être des segments de droites ou des courbes) puis nous raccordons tous les sommets.


{{Code|code=
{{Code|code=
...
...
aTrsf=Base.Matrix()
aTrsf=App.Matrix()
aTrsf.rotateZ(math.pi) # rotate around the z-axis
aTrsf.rotateZ(math.pi) # rotate around the z-axis


Line 929: Line 814:
}}
}}


Jusqu'à présent, nous n'avons construit qu'un demi-profil. Au lieu de construire tout le profil de la même manière, nous pouvons simplement refléter 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 aux objets du monde 3D, car il peut contenir dans une seule structure tous les les transformations que les objets 3D peuvent subir (déplacement, rotation et échelle). Après avoir créé la matrice, nous la reflétons, puis nous créons une copie de notre fil et lui appliquer la matrice de transformation. Nous avons maintenant deux fils, et nous pouvons en faire un troisième fil, car les fils sont en fait des listes d'arêtes.
<div class="mw-translate-fuzzy">
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.
</div>


{{Code|code=
{{Code|code=
...
...
myFaceProfile=Part.Face(myWireProfile)
myFaceProfile=Part.Face(myWireProfile)
aPrismVec=Base.Vector(0, 0, myHeight)
aPrismVec=App.Vector(0, 0, myHeight)
myBody=myFaceProfile.extrude(aPrismVec)
myBody=myFaceProfile.extrude(aPrismVec)


Line 942: Line 825:
}}
}}


Maintenant, nous avons un contour fermé, il peut être transformé en une face. Une fois que nous avons une face, nous pouvons l'extruder.<br />
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 ?

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?
{{Code|code=
{{Code|code=
...
...
neckLocation=Base.Vector(0, 0, myHeight)
neckLocation=App.Vector(0, 0, myHeight)
neckNormal=Base.Vector(0, 0, 1)
neckNormal=App.Vector(0, 0, 1)


myNeckRadius = myThickness / 4.
myNeckRadius = myThickness / 4.
Line 953: Line 836:
myNeck = Part.makeCylinder(myNeckRadius, myNeckHeight, neckLocation, neckNormal)
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.
À 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.

{{Code|code=
{{Code|code=
...
...
myBody = myBody.fuse(myNeck)
myBody = myBody.fuse(myNeck)
}}
}}

<div class="mw-translate-fuzzy">
L'opération de fusion, qui dans d'autres applications est parfois appelé union, est très puissante.<br />
L'opération de fusion est très puissante. Elle se charge de coller ce qui doit l'être et de retirer les pièces qui doivent l'être.

Cette opération prendra soin de coller ce qui doit être collé et enlever ce qui doit être enlevé.
</div>
{{Code|code=
{{Code|code=
...
...
return myBody
return myBody
}}
}}

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

{{Code|code=
{{Code|code=
el = makeBottleTut()
el = makeBottleTut()
Part.show(el)
Part.show(el)
}}
}}
Enfin, nous appelons la fonction pour créer la pièce puis la rendons visible.


Enfin, nous appelons la fonction pour créer la pièce puis la rendons visible.
[[#top|top]]
{{Top}}

<span id="Example:_Pierced_box"></span>
<div class="mw-translate-fuzzy">
==Cube percé==
==Exemple : cube percé==


Ici un exemple complet de construction d'un cube percé.
Ici un exemple complet de construction d'un cube percé.
</div>


La construction se fait face par face. Quand le cube est terminé, il est évidé d'un cylindre traversant.
Here is a complete example of building a pierced box.


<div class="mw-translate-fuzzy">
La construction se fait face par face et quand le cube est terminé, il est évidé d'un cylindre traversant.
</div>
{{Code|code=
{{Code|code=
import FreeCAD as App
import Part, math
import Part, math
from FreeCAD import Base


size = 10
size = 10
Line 1,000: Line 881:
face6 = Part.Face(poly)
face6 = Part.Face(poly)
myMat = Base.Matrix()
myMat = App.Matrix()


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


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


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


myMat = Base.Matrix()
myMat = App.Matrix()


myMat.rotateX(-math.pi / 2)
myMat.rotateX(-math.pi / 2)
Line 1,020: Line 901:


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


myShell = Part.makeShell([face1, face2, face3, face4, face5, face6])
myShell = Part.makeShell([face1, face2, face3, face4, face5, face6])
Line 1,026: Line 907:


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


cut_part = mySolid.cut(myCyl)
cut_part = mySolid.cut(myCyl)
Line 1,032: Line 913:
Part.show(cut_part)
Part.show(cut_part)
}}
}}
{{Top}}
[[#top|top]]
<span id="Loading_and_saving"></span>

<div class="mw-translate-fuzzy">
== Chargement et sauvegarde ==
== 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 [http://fr.wikipedia.org/wiki/B-Rep BREP], [http://fr.wikipedia.org/wiki/Initial_Graphics_Exchange_Specification IGS], [http://en.wikipedia.org/wiki/Step_(software) STEP] et [http://fr.wikipedia.org/wiki/STL_(format) STL].
Il existe plusieurs façons de sauvegarder votre travail. Vous pouvez bien sûr enregistrer votre document FreeCAD, mais vous pouvez également enregistrer des objets [[Part_Workbench/fr|Part]] directement dans des formats CAO courants, tels que BREP, IGS, STEP et STL.
</div>


L'enregistrement d'une forme (un projet) dans un fichier est facile, il y a les fonctions {{incode|exportBrep()}}, {{incode|exportIges()}}, {{incode|exportStep()}} et {{incode|exportStl()}} qui sont des méthodes disponibles pour toutes les formes d'objets. Donc, en faisant :
There are several ways to save your work. You can of course save your FreeCAD document, but you can also save [[Part_workbench|Part]] objects directly to common CAD formats, such as BREP, IGS, STEP and STL.


<div class="mw-translate-fuzzy">
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.<br />
Donc, en faisant:
</div>
{{Code|code=
{{Code|code=
import Part
import Part
Line 1,051: Line 926:
s.exportStep("test.stp")
s.exportStep("test.stp")
}}
}}

<div class="mw-translate-fuzzy">
Ceci sauve votre box (cube) dans le format '''.STP'''. Pour charger un fichier BREP, IGES ou STEP:
enregistrera notre boîte dans un fichier STEP. Pour charger un fichier BREP, IGES ou STEP :

</div>
{{Code|code=
{{Code|code=
import Part
import Part
Line 1,059: Line 934:
s.read("test.stp")
s.read("test.stp")
}}
}}

Pour convertir un fichier STEP en fichier IGS:
Pour convertir un fichier STEP en fichier IGS :

{{Code|code=
{{Code|code=
import Part
import Part
Line 1,066: Line 943:
s.exportIges("file.igs") # outbound file igs
s.exportIges("file.igs") # outbound file igs
}}
}}
{{Top}}
[[#top|En haut]]


{{Docnav/fr
{{Docnav/fr
|[[Part_scripting/fr|Part Écrire un script]]
|[[FreeCAD_Scripting_Basics/fr|Débuter avec les scripts FreeCAD]]
|[[Mesh_Scripting/fr|Script pour le maillage]]
|[[Scripted_objects/fr|Objets créés par script]]
}}
}}


Line 1,076: Line 953:
[[Category:Developer Documentation{{#translation:}}]]
[[Category:Developer Documentation{{#translation:}}]]
[[Category:Python Code{{#translation:}}]]
[[Category:Python Code{{#translation:}}]]
{{clear}}

Latest revision as of 19:49, 12 October 2023

Introduction

Ici, nous vous expliquerons comment contrôler l'atelier 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 le Module Part expliquant les concepts. Assurez-vous de parcourir la section Script et les pages bases pour script dans Freecad 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.

Voir aussi

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 FreeCAD as App
import Part
V1 = App.Vector(0, 10, 0)
V2 = App.Vector(30, 10, 0)
V3 = App.Vector(30, -10, 0)
V4 = App.Vector(0, -10, 0)

En haut

Arc

Cercle


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

VC1 = App.Vector(-10, 0, 0)
C1 = Part.Arc(V1, VC1, V4)
VC2 = App.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(App.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...() de l'atelier Part :

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

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

  • makeBox(l, w, h, [p, d]) 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 ou cette documentation autogénérée de l'API Python de Part pour une liste complète des méthodes disponibles du module Part.

En haut

Importer les modules nécessaires

Tout d'abord, nous devons importer les modules FreeCAD et Part afin de pouvoir utiliser leur contenu en Python :

import FreeCAD as App
import Part

En haut

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 = App.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

Une arête n'est rien d'autre qu'un segment avec deux sommets :

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

Remarque : Vous pouvez également créer une arête en passant deux vecteurs :

vec1 = App.Vector(0, 0, 0)
vec2 = App.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)

En haut

Mise en forme à l'écran

Jusqu'à présent, nous avons créé un objet filaire, mais il n'apparaît nulle part à l'écran. En effet, la scène FreeCAD 3D affiche uniquement ce que vous lui demandez d'afficher. Pour ce faire, nous utilisons cette simple méthode :

Part.show(edge)

La fonction show crée un objet dans notre document FreeCAD et lui assigne notre forme "filaire". Utilisez-la chaque fois qu'il est temps d'afficher votre création à l'écran.

En haut

Création d'un contour (ou forme filaire)

Un contour est une polyligne, à arêtes multiples et peut être créé à partir d'une liste d'arêtes ou même une liste de contours (ou de formes filaires) :

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) affichera les 4 bords qui composent notre forme 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

En haut

Création d'une face

Seules les faces créées à partir de formes filaires fermées seront valides. Dans cet exemple, wire3 est un contour fermé mais wire2 ne l'est pas (voir ci-dessus) :

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)
sface.isValid()
> False

Seules les faces auront une superficie, mais pas les contours et les arêtes.

En haut

Création d'un cercle

Un cercle peut être créé comme ceci :

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, App.Vector(10, 0, 0), App.Vector(1, 0, 0))
ccircle.Curve
> Circle (Radius : 10, Position : (10, 0, 0), Direction : (1, 0, 0))

ccircle sera créé à la distance 10 de l'origine X et sera orienté vers l'extérieur le long de l'axe X. Remarque : makeCircle() n'accepte que App.Vector() pour les paramètres position et les paramètres normaux, et non les tuples. Vous pouvez également créer une partie du cercle en donnant un angle de départ et un angle d'arrivée :

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

Les angles doivent être renseignés en degrés. Si vous avez des radians, convertissez-les simplement en utilisant la formule : degrés = radians * 180/pi ou en utilisant le module math de Python :

import math
degrees = math.degrees(radians)

En haut

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

Malheureusement, il n'y a pas de fonction makeArc(), mais nous avons la fonction Part.Arc() pour créer un arc de cercle passant par trois points. Il crée un objet arc, joignant le point de départ au point d'arrivée, en passant par le point médian. La fonction toShape() de l'objet arc, doit être appelée pour obtenir un objet filaire, comme lorsque vous utilisez Part.LineSegment au lieu de Part.makeLine.

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

Arc() n'accepte que App.Vector() pour les points et non les tuples. Vous pouvez également obtenir un arc en utilisant une partie d'un cercle :

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

Les arcs sont des arêtes valides comme les segments, ils peuvent donc également être utilisés dans les contours (ou forme filaire).

En haut

Création de polygones

Un polygone est simplement une forme filaire, avec plusieurs bords droits. La fonction makePolygon() prend une liste de points et crée un contour, passant à travers ces points :

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

En haut

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 points de contrôle et de poids facultatifs. La fonction ci-dessous crée un Part.BezierCurve(), à partir d'une série de points FreeCAD.Vector(). Remarque : lors de "l'obtention" et du "réglage" d'un seul pôle ou poids, les indices commencent à 1, pas à 0.

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

En haut

Création d'un plan

Un plan est une surface rectangulaire plate. La méthode utilisée pour le créer est makePlane(length, width, [start_pnt, dir_normal]). Par défaut start_pnt = Vector(0, 0, 0) et dir_normal = Vector(0, 0, 1). L'utilisation de dir_normal = Vector(0, 0, 1) créera le plan orienté dans la direction positive de l'axe Z, tandis que dir_normal = Vector(1, 0, 0) créera le plan orienté dans la direction positive de l'axe X :

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

BoundBox est un cuboïde entourant le plan avec une diagonale commençant à (3, 0, 0) et se terminant en (5, 0, 2). Ici, l'épaisseur du BoundBox le long de l'axe Y est nulle, puisque notre forme est totalement plate.

Remarque : makePlane() accepte uniquement App.Vector() pour start_pnt et dir_normal et pas les tuples.

En haut

Création d'une ellipse

Il existe plusieurs façons de créer une ellipse :

Part.Ellipse()

Crée une ellipse avec un grand rayon de 2 et un petit rayon de 1 avec le centre à (0, 0, 0).

Part.Ellipse(Ellipse)

Crée une copie de l'ellipse donnée.

Part.Ellipse(S1, S2, Center)

Crée une ellipse centrée sur le point Centre, où le plan de l'ellipse est défini par Center, S1 et S2, son grand axe est défini par Center et S1, son grand rayon est la distance entre Center et S1 et 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, situé dans le plan défini par le Centre et la normale (0, 0, 1).

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

Dans le code ci-dessus, nous avons passé S1, S2 et le centre. De même que l'Arc, l'Ellipse crée un objet ellipse et non une arête, nous devons donc le convertir en arête en utilisant toShape() pour l'affichage.

Remarque : Ellipse() n'accepte que App.Vector() pour les points et pas les tuples.

eli = Part.Ellipse(App.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.

En haut

Création d'un tore

Utilisation de makeTorus(radius1, radius2, [pnt, dir, angle1, angle2, angle]). Par défaut pnt = Vector (0, 0, 0), dir = Vector (0, 0, 1), angle1 = 0, angle2 = 360 et angle = 360. Considérez un tore comme un petit cercle balayant un grand cercle. Radius1 est le rayon du grand cercle, radius2 est le rayon du petit cercle, pnt est le centre du tore et dir est la direction normale. Angle1 et angle2 sont des angles en degrés pour le petit cercle; le dernier paramètre d'angle est la section du tore :

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, App.Vector(0, 0, 0), App.Vector(0, 0, 1), 0, 180)

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

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

Le code ci-dessus créera un semi-tore ; seul le dernier paramètre est modifié, c'est-à-dire que les angles restants sont des valeurs par défaut. Attribuer l'angle 180 créera le tore de 0 à 180, c'est-à-dire un demi tore.

En haut

Création d'un pavé ou d'un cuboïde

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

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

En haut

Création d'une sphère

Utilisation de makeSphere(radius, [pnt, dir, angle1, angle2, angle3]). Par défaut pnt = Vector(0, 0, 0), dir = Vector(0, 0, 1), angle1 = -90, angle2 = 90 et angle3 = 360. Angle1 et angle2 correspondent au minimum et au maximum vertical de la sphère, angle3 est le diamètre de la sphère.

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

En haut

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.

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

En haut

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.

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

En haut

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.

En haut

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ée de la même manière :

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

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

En haut

Rotation d'une forme

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

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

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

En haut

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 :

myMat = App.Matrix()
myMat.move(App.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 peuvent aussi avoir 3 nombres de sorte que ces 2 lignes effectuent le même travail :

myMat.move(2, 0, 0)
myMat.move(App.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 Mettre à l'échelle une forme ci-dessous). Donc, nous pouvons opérer notre transformation comme ceci :

myShape.transformShape(myMat)

ou

myShape.transformGeometry(myMat)

En haut

Mettre à l'échelle une forme

La mise à l'échelle d'une forme est une opération plus dangereuse car, contrairement à la traduction ou rotation, mise à l'échelle non uniforme (avec des valeurs différentes pour X, Y et Z) peut modifier la structure de la forme. Par exemple, mettre à l'échelle un cercle avec une valeur plus élevée horizontalement que verticalement le transformera en un ellipse, qui se comporte mathématiquement très différemment. Pour la mise à l'échelle, nous ne peut pas utiliser transformShape(), nous devons utiliser transformGeometry() :

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

En haut

Opérations Booléennes

Soustraction

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

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

En haut

Intersection

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

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

En haut

Fusion

L'union est appelé "fuse" (fusion) et fonctionne de la même manière :

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

En haut

Section

Une "section" est l'intersection entre une forme solide et une forme plane. Elle renvoie une courbe d'intersection, une courbe composée d'arêtes.

cylinder1 = Part.makeCylinder(3, 10, App.Vector(0, 0, 0), App.Vector(1, 0, 0))
cylinder2 = Part.makeCylinder(3, 10, App.Vector(5, 0, -5), App.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>]

En haut

Extrusion

L'extrusion est une action de "pousser" une forme plane dans une certaine direction et résultant en un corps solide. Pensez à un cercle devenant un tube en le "poussant" :

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

Si votre cercle est vide, vous obtiendrez un tube vide. 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(App.Vector(0, 0, 2))

En haut

Exploration de formes

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

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 les lignes ci-dessus dans l'interpréteur Python, vous gagnerez une bonne compréhension de la structure des objets Part. Ici, notre commande makeBox () créé une forme solide. Ce solide, comme tous les solides de pièce, contient des faces. Les faces contiennent toujours des fils, qui sont des listes d'arêtes qui bordent la face. Chaque face a au moins un fil fermé (il peut en avoir plus si la face a un trou). Dans le fil, nous pouvons regarder chaque bord séparément et à l'intérieur de chaque bord, nous pouvons voir les sommets. Les arêtes droites n'ont que deux sommets, évidemment.

En haut

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 :

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)

En haut

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être de vue.

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)

En haut

Exemple : la bouteille OCC

Un exemple typique trouvé sur le site Web OpenCasCade Technology est de savoir comment construire une bouteille. C'est aussi un bon exercice pour FreeCAD. En fait, si vous suivez notre exemple ci-dessous et la page OCC simultanément, vous verrez à quel point les structures OCC sont bien implémentées dans FreeCAD. Le script est inclus dans l'installation de FreeCAD (dans le dossier Mod/Part) et peut être appelé à partir de l'interpréteur Python en tapant :

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

En haut

Le script

Pour les besoins de ce tutoriel, nous considérerons une version réduite du script. Dans cette version, le flacon ne sera pas évidé et le goulot du flacon ne sera pas fileté.

import FreeCAD as App
import Part, math

def makeBottleTut(myWidth = 50.0, myHeight = 70.0, myThickness = 30.0):
    aPnt1=App.Vector(-myWidth / 2., 0, 0)
    aPnt2=App.Vector(-myWidth / 2., -myThickness / 4., 0)
    aPnt3=App.Vector(0, -myThickness / 2., 0)
    aPnt4=App.Vector(myWidth / 2., -myThickness / 4., 0)
    aPnt5=App.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=App.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=App.Vector(0, 0, myHeight)
    myBody=myFaceProfile.extrude(aPrismVec)

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

    neckLocation=App.Vector(0, 0, myHeight)
    neckNormal=App.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)

En haut

Explications détaillées

import FreeCAD as App
import Part, math

Nous aurons, bien sûr, besoin des modules FreeCAD et Part.

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

Ici, nous définissons notre fonction makeBottleTut. 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)

Ici, nous définissons la géométrie : un arc, composé de trois points et deux segments de ligne, composés de deux points.

...
    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=App.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 tout le profil de la même manière, nous pouvons simplement refléter 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 aux objets du monde 3D, car il peut contenir dans une seule structure tous les les transformations que les objets 3D peuvent subir (déplacement, rotation et échelle). Après avoir créé la matrice, nous la reflétons, puis nous créons une copie de notre fil et lui appliquer la matrice de transformation. Nous avons maintenant deux fils, et nous pouvons en faire un troisième fil, car les fils sont en fait des listes d'arêtes.

...
    myFaceProfile=Part.Face(myWireProfile)
    aPrismVec=App.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=App.Vector(0, 0, myHeight)
    neckNormal=App.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 est très puissante. Elle se charge de coller ce qui doit l'être et de retirer les pièces qui doivent l'être.

...
    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.

En haut

Exemple : cube percé

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

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

import FreeCAD as App
import Part, math

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 = App.Matrix()

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

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

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

myMat = App.Matrix()

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

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

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

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

cut_part = mySolid.cut(myCyl)

Part.show(cut_part)

En haut

Chargement et sauvegarde

Il existe plusieurs façons de sauvegarder votre travail. Vous pouvez bien sûr enregistrer votre document FreeCAD, mais vous pouvez également enregistrer des objets Part directement dans des formats CAO courants, tels que BREP, IGS, STEP et STL.

L'enregistrement d'une forme (un projet) dans un fichier est facile, il y a les fonctions exportBrep(), exportIges(), exportStep() et exportStl() 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")

enregistrera notre boîte dans un fichier STEP. 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