Mesh to Part/fr: Difference between revisions

From FreeCAD Documentation
No edit summary
No edit summary
 
(26 intermediate revisions by 3 users not shown)
Line 1: Line 1:
<languages/>
<languages/>

{{Docnav/fr
|[[Topological_data_scripting/fr|Script pour les pièces]]
|[[Scenegraph/fr|Graphe de scène]]
}}


{{TOCright}}
{{TOCright}}
Line 10: Line 5:
== Conversion d'objets Part en maillages ==
== Conversion d'objets Part en maillages ==


La conversion d'objets de niveau supérieur tels que les objets [[Part_Workbench/fr|Part]] en objets plus simples tels qu'en [[Mesh_Workbench/fr|maillages]] est une opération directe où toutes les faces d'un objet Part sont triangulées. Le résultat de cette triangulation (pavage ou tessellation) est ensuite utilisé pour construire un maillage:
<div class="mw-translate-fuzzy">
La conversion des objets de haut niveau tels que les objets ([[Part Module/fr|formes]]) en objets simples comme les [[Mesh Module/fr|maillages]] (Mesh) est une opération facile, où, toutes les faces d'un Objet Part deviennent une composition de triangles [http://www.coin3d.org/usage/casestudies/users/usageexample.2008-05-30.6001136448/4DVista.PNG (exemple sur le site de coin3d un des moteurs de FreeCAD)].<br />
Le résultat de cette triangulation ([http://en.wikipedia.org/wiki/Tessellation tessellation]) est ensuite utilisé pour construire un maillage (Mesh):
</div>

''The following code assumes our document contains one Part object.''


{{Code|code=
{{Code|code=
# let's assume our document contains one Part object
import Mesh
import Mesh

obj = FreeCADGui.Selection.getSelection()[0] # a Part object must be preselected
shp = obj.Shape
faces = []
faces = []

shape = FreeCAD.ActiveDocument.ActiveObject.Shape
triangles = shape.tessellate(1) # the number represents the precision of the tessellation
triangles = shp.tessellate(1) # the number represents the precision of the tessellation
for tri in triangles[1]:
for tri in triangles[1]:
face = []
face = []
Line 33: Line 25:
}}
}}


Exemple alternatif:
<div class="mw-translate-fuzzy">
Parfois, la triangulation de certaines faces offertes par [http://www.opencascade.org/ OpenCascade] sont assez laid. Si une face a un forme rectangulaire et ne contient pas de trous ou n'est pas limité par des courbes, vous pouvez également créer un maillage sur cette forme:
</div>


{{Code|code=
{{Code|code=
import Mesh
import Mesh
import MeshPart
def makeMeshFromFace(u, v, face):
(a, b, c, d) = face.ParameterRange
pts = []
for j in range(v):
for i in range(u):
s = 1.0 / (u - 1) * (i * b + (u - 1 - i) * a)
t = 1.0 / (v - 1) * (j * d + (v - 1 - j) * c)
pts.append(face.valueAt(s, t))


obj = FreeCADGui.Selection.getSelection()[0] # a Part object must be preselected
mesh = Mesh.Mesh()
shp = obj.Shape
for j in range(v - 1):
for i in range(u - 1):
mesh.addFacet(pts[u * j + i], pts[u * j + i + 1], pts[u * (j + 1) + i])
mesh.addFacet(pts[u * (j + 1) + i], pts[u * j + i + 1], pts[u * (j + 1) + i + 1])


mesh = FreeCAD.ActiveDocument.addObject("Mesh::Feature", "Mesh")
return mesh
mesh.Mesh = MeshPart.meshFromShape(
Shape=shp,
LinearDeflection=0.01,
AngularDeflection=0.025,
Relative=False)
}}
}}


== Conversion de maillages en objets Part ==
<div class="mw-translate-fuzzy">
== Conversion de maillages en objet Part ==
</div>


La conversion de maillages en objets Part est une opération très courante. Très souvent, vous recevez des données 3D dans un format maillé. Les maillages sont plutôt pratiques pour représenter la géométrie de forme libre et les grandes scènes visuelles car ils sont très légers. Dans FreeCAD, nous préférons généralement les objets de niveau supérieur, les solides, qui peuvent comporter beaucoup plus d'informations et permettre des faces courbes.
<div class="mw-translate-fuzzy">
La conversion des mailles en Part objets est une opération extrêmement importante en CAO, car, très souvent vous recevrez des données 3D au format Mesh (maillage) à partir d'autres utilisateurs ou émis par d'autres applications de CAO. Les Mailles sont très pratiques pour représenter les formes géométriques libres et de grandes scènes visuelles, car il est très léger, mais pour la CAO nous préférons généralement des objets de niveau supérieur qui portent beaucoup plus d'informations comme, l'idée de solides, ou faces sont faites de courbes au lieu de triangles.
</div>


La conversion des mailles en un de ces objets de niveau supérieur (gérée par le [[Part Module/fr|Part Module]] dans FreeCAD) n'est pas une opération facile. Les Mailles peuvent êtres faites de milliers de triangles (par exemple lorsqu'ils sont générés par un scanner 3D), et des solides faits du même nombre de faces serait extrêmement lourd à manipuler. Donc, vous voudrez généralement voir l'objet optimisé lors de la conversion.
La conversion es mailles en un de ces objets de niveau supérieur (gérés par l'[[Part_Workbench/fr|atelier Part]] dans FreeCAD) n'est pas une opération facile. Le maillage peut contenir des milliers de triangles (par exemple lorsqu'ils sont générés par un scanner 3D) et les solides constitués du même nombre de faces seraient extrêmement difficiles à manipuler. Donc, vous voudrez généralement voir l'objet optimisé lors de la conversion.


FreeCAD propose actuellement deux méthodes pour convertir des objets Part en maillage. La première méthode est simple, la conversion directe, sans aucune optimisation:
<div class="mw-translate-fuzzy">
FreeCAD propose actuellement deux méthodes pour convertir des Parts objets en mailles.
La première méthode est simple, la conversion directe, sans aucune optimisation:
</div>


{{Code|code=
{{Code|code=
Line 83: Line 61:
}}
}}


La deuxième méthode offre la possibilité de considérer les facettes du maillage coplanaires lorsque l'angle entre elles est inférieur à une certaine valeur, ce qui réduit le nombre de faces dans le résultat final:
<div class="mw-translate-fuzzy">
La seconde méthode, offre la possibilité d'examiner les aspects de mailles coplanaires, lorsque l'angle entre eux est sous une certaine valeur.
Cela permet de construire des formes beaucoup plus simples:
</div>

''The following code assumes our document contains one Mesh object.''


{{Code|code=
{{Code|code=
# let's assume our document contains one Mesh object
import Mesh
import Mesh
import Part
import Part
import MeshPart
import MeshPart


obj = FreeCADGui.Selection.getSelection()[0] # a Mesh object must be preselected
mesh = obj.Mesh
segments = mesh.getPlanarSegments(0.00001) # use rather strict tolerance here
faces = []
faces = []

mesh = App.ActiveDocument.ActiveObject.Mesh
segments = mesh.getPlanes(0.00001) # use rather strict tolerance here
for i in segments:
for i in segments:
if len(i) > 0:
if len(i) > 0:
# a segment can have inner holes
# a segment can have inner holes
wires = MeshPart.wireFromSegment(mesh, i)
wires = MeshPart.wireFromSegment(mesh, i)
# we assume that the exterior boundary is that one with the biggest bounding box
# we assume that the exterior boundary is that one with the biggest bounding box
if len(wires) > 0:
if len(wires) > 0:
ext = None
ext = None
max_length=0
max_length=0
for i in wires:
for i in wires:
if i.BoundBox.DiagonalLength > max_length:
if i.BoundBox.DiagonalLength > max_length:
max_length = i.BoundBox.DiagonalLength
max_length = i.BoundBox.DiagonalLength
ext = i
ext = i


wires.remove(ext)
wires.remove(ext)
# all interior wires mark a hole and must reverse their orientation, otherwise Part.Face fails
# all interior wires mark a hole and must reverse their orientation, otherwise Part.Face fails
for i in wires:
for i in wires:
i.reverse()
i.reverse()


# make sure that the exterior wires comes as first in the list
# make sure that the exterior wires comes as first in the list
wires.insert(0, ext)
wires.insert(0, ext)
faces.append(Part.Face(wires))
faces.append(Part.Face(wires))


shell = Part.Compound(faces)
solid = Part.Solid(Part.Shell(faces))
Part.show(shell)
Part.show(solid)
# solid = Part.Solid(Part.Shell(faces))
# Part.show(solid)
}}
}}


{{Docnav/fr
|[[Topological_data_scripting/fr|Script pour les pièces]]
|[[Scenegraph/fr|Graphe de scène]]
}}


{{Powerdocnavi{{#translation:}}}}
{{Powerdocnavi{{#translation:}}}}
[[Category:Developer Documentation{{#translation:}}]]
[[Category:Python Code{{#translation:}}]]
[[Category:Python Code{{#translation:}}]]
{{Mesh Tools navi{{#translation:}}}}

Latest revision as of 12:34, 28 August 2021

Conversion d'objets Part en maillages

La conversion d'objets de niveau supérieur tels que les objets Part en objets plus simples tels qu'en maillages est une opération directe où toutes les faces d'un objet Part sont triangulées. Le résultat de cette triangulation (pavage ou tessellation) est ensuite utilisé pour construire un maillage:

import Mesh

obj = FreeCADGui.Selection.getSelection()[0] # a Part object must be preselected
shp = obj.Shape
faces = []

triangles = shp.tessellate(1) # the number represents the precision of the tessellation
for tri in triangles[1]:
    face = []
    for i in tri:
        face.append(triangles[0][i])
    faces.append(face)

m = Mesh.Mesh(faces)
Mesh.show(m)

Exemple alternatif:

import Mesh
import MeshPart

obj = FreeCADGui.Selection.getSelection()[0] # a Part object must be preselected
shp = obj.Shape

mesh = FreeCAD.ActiveDocument.addObject("Mesh::Feature", "Mesh")
mesh.Mesh = MeshPart.meshFromShape(
        Shape=shp,
        LinearDeflection=0.01,
        AngularDeflection=0.025,
        Relative=False)

Conversion de maillages en objets Part

La conversion de maillages en objets Part est une opération très courante. Très souvent, vous recevez des données 3D dans un format maillé. Les maillages sont plutôt pratiques pour représenter la géométrie de forme libre et les grandes scènes visuelles car ils sont très légers. Dans FreeCAD, nous préférons généralement les objets de niveau supérieur, les solides, qui peuvent comporter beaucoup plus d'informations et permettre des faces courbes.

La conversion es mailles en un de ces objets de niveau supérieur (gérés par l'atelier Part dans FreeCAD) n'est pas une opération facile. Le maillage peut contenir des milliers de triangles (par exemple lorsqu'ils sont générés par un scanner 3D) et les solides constitués du même nombre de faces seraient extrêmement difficiles à manipuler. Donc, vous voudrez généralement voir l'objet optimisé lors de la conversion.

FreeCAD propose actuellement deux méthodes pour convertir des objets Part en maillage. La première méthode est simple, la conversion directe, sans aucune optimisation:

import Mesh
import Part

mesh = Mesh.createTorus()
shape = Part.Shape()
shape.makeShapeFromMesh(mesh.Topology, 0.05) # the second arg is the tolerance for sewing
solid = Part.makeSolid(shape)
Part.show(solid)

La deuxième méthode offre la possibilité de considérer les facettes du maillage coplanaires lorsque l'angle entre elles est inférieur à une certaine valeur, ce qui réduit le nombre de faces dans le résultat final:

import Mesh
import Part
import MeshPart

obj = FreeCADGui.Selection.getSelection()[0] # a Mesh object must be preselected
mesh = obj.Mesh
segments = mesh.getPlanarSegments(0.00001) # use rather strict tolerance here
faces = []

for i in segments:
    if len(i) > 0:
        # a segment can have inner holes
        wires = MeshPart.wireFromSegment(mesh, i)
        # we assume that the exterior boundary is that one with the biggest bounding box
        if len(wires) > 0:
            ext = None
            max_length=0
            for i in wires:
                if i.BoundBox.DiagonalLength > max_length:
                    max_length = i.BoundBox.DiagonalLength
                    ext = i

            wires.remove(ext)
            # all interior wires mark a hole and must reverse their orientation, otherwise Part.Face fails
            for i in wires:
                i.reverse()

            # make sure that the exterior wires comes as first in the list
            wires.insert(0, ext)
            faces.append(Part.Face(wires))

solid = Part.Solid(Part.Shell(faces))
Part.show(solid)