Difference between revisions of "Mesh to Part/fr"

From FreeCAD Documentation
Jump to navigation Jump to search
(Created page with "''Le code suivant suppose que notre document contient un objet Mesh.''")
 
(14 intermediate revisions by 2 users not shown)
Line 1: Line 1:
 
<languages/>
 
<languages/>
{{docnav/fr
+
 
|[[Topological data scripting/fr|Script pour les pièces]]
+
{{Docnav/fr
|[[Scenegraph/fr|Scène graphique]]
+
|[[Topological_data_scripting/fr|Script pour les pièces]]
 +
|[[Scenegraph/fr|Graphe de scène]]
 
}}
 
}}
 +
 +
{{TOCright}}
  
 
== Conversion d'objets Part en maillages ==
 
== Conversion d'objets Part en maillages ==
  
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, , 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 />
+
La conversion d'objets de niveau supérieur tels que les objets [[Part Module/fr|Part]] en objets plus simples tels qu'en [[Mesh Module/fr|maillages]] est une opération assez simple 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:
Le résultat de cette triangulation ([http://en.wikipedia.org/wiki/Tessellation tessellation]) est ensuite utilisé pour construire un maillage (Mesh):
+
 
 +
''Le code suivant suppose que notre document contient un objet Part.''
 +
 
 
{{Code|code=
 
{{Code|code=
#let's assume our document contains one part object
+
# let's assume our document contains one Part object
 
import Mesh
 
import Mesh
 
faces = []
 
faces = []
 
shape = FreeCAD.ActiveDocument.ActiveObject.Shape
 
shape = FreeCAD.ActiveDocument.ActiveObject.Shape
triangles = shape.tessellate(1) # the number represents the precision of the tessellation)
+
triangles = shape.tessellate(1) # the number represents the precision of the tessellation
 
for tri in triangles[1]:
 
for tri in triangles[1]:
 
     face = []
 
     face = []
     for i in range(3):
+
     for i in tri:
        vindex = tri[i]
+
         face.append(triangles[0][i])
         face.append(triangles[0][vindex])
 
 
     faces.append(face)
 
     faces.append(face)
 +
 
m = Mesh.Mesh(faces)
 
m = Mesh.Mesh(faces)
 
Mesh.show(m)
 
Mesh.show(m)
 
}}
 
}}
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:
+
 
 +
Parfois, la triangulation de certains faces offerte par OpenCascade est assez laide. Si la face a un espace paramétrique rectangulaire et ne contient pas de trous ou d'autres courbes de coupe, vous pouvez également créer un maillage manuellement:
 +
 
 
{{Code|code=
 
{{Code|code=
 
import Mesh
 
import Mesh
def makeMeshFromFace(u,v,face):
+
def makeMeshFromFace(u, v, face):
(a,b,c,d)=face.ParameterRange
+
    (a, b, c, d) = face.ParameterRange
pts=[]
+
    pts = []
for j in range(v):
+
    for j in range(v):
for i in range(u):
+
        for i in range(u):
s=1.0/(u-1)*(i*b+(u-1-i)*a)
+
            s = 1.0 / (u - 1) * (i * b + (u - 1 - i) * a)
t=1.0/(v-1)*(j*d+(v-1-j)*c)
+
            t = 1.0 / (v - 1) * (j * d + (v - 1 - j) * c)
pts.append(face.valueAt(s,t))
+
            pts.append(face.valueAt(s, t))
  
mesh=Mesh.Mesh()
+
    mesh = Mesh.Mesh()
for j in range(v-1):
+
    for j in range(v - 1):
for i in range(u-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 + 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.addFacet(pts[u * (j + 1) + i], pts[u * j + i + 1], pts[u * (j + 1) + i + 1])
  
return mesh
+
    return mesh
 
}}
 
}}
== Conversion de Mailles en Part objects ==
 
  
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.
+
== 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 très 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 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 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.
  
FreeCAD propose actuellement deux méthodes pour convertir des Parts objets en mailles.
+
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:
La première méthode est simple, la conversion directe, sans aucune optimisation:
+
 
 
{{Code|code=
 
{{Code|code=
import Mesh,Part
+
import Mesh
 +
import Part
 +
 
 
mesh = Mesh.createTorus()
 
mesh = Mesh.createTorus()
 
shape = Part.Shape()
 
shape = Part.Shape()
shape.makeShapeFromMesh(mesh.Topology,0.05) # the second arg is the tolerance for sewing
+
shape.makeShapeFromMesh(mesh.Topology, 0.05) # the second arg is the tolerance for sewing
 
solid = Part.makeSolid(shape)
 
solid = Part.makeSolid(shape)
 
Part.show(solid)
 
Part.show(solid)
 +
}}
 +
 +
La seconde méthode, offre la possibilité d'examiner les aspects de maillages coplanaires lorsque l'angle entre eux est sous une certaine valeur. Cela permet de construire des formes beaucoup plus simples:
 +
 +
''Le code suivant suppose que notre document contient un objet Mesh.''
  
}}
 
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:
 
 
{{Code|code=
 
{{Code|code=
 
# let's assume our document contains one Mesh object
 
# let's assume our document contains one Mesh object
import Mesh,Part,MeshPart
+
import Mesh
 +
import Part
 +
import MeshPart
 +
 
 
faces = []
 
faces = []
 
mesh = App.ActiveDocument.ActiveObject.Mesh
 
mesh = App.ActiveDocument.ActiveObject.Mesh
Line 76: Line 91:
 
     # 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:
Line 92: Line 107:
 
         faces.append(Part.Face(wires))
 
         faces.append(Part.Face(wires))
  
shell=Part.Compound(faces)
+
shell = Part.Compound(faces)
 
Part.show(shell)
 
Part.show(shell)
#solid = Part.Solid(Part.Shell(faces))
+
# solid = Part.Solid(Part.Shell(faces))
#Part.show(solid)
+
# Part.show(solid)
 +
}}
  
 +
{{Docnav/fr
 +
|[[Topological_data_scripting/fr|Script pour les pièces]]
 +
|[[Scenegraph/fr|Graphe de scène]]
 
}}
 
}}
{{docnav/fr|[[Topological data scripting/fr|Topological data scripting]]|[[Scenegraph/fr|Scenegraph]]}}
 
  
{{Userdocnavi{{#translation:}}}}
+
{{Powerdocnavi{{#translation:}}}}
[[Category:Poweruser Documentation{{#translation:}}]]
 
 
[[Category:Python Code{{#translation:}}]]
 
[[Category:Python Code{{#translation:}}]]

Latest revision as of 13:16, 31 May 2020

Other languages:
Bahasa Indonesia • ‎Deutsch • ‎English • ‎Türkçe • ‎español • ‎français • ‎italiano • ‎română • ‎svenska • ‎čeština • ‎русский • ‎日本語
Arrow-left.svg Page précédente : Script pour les pièces
Page suivante : Graphe de scène Arrow-right.svg

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 assez simple 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:

Le code suivant suppose que notre document contient un objet Part.

# let's assume our document contains one Part object
import Mesh
faces = []
shape = FreeCAD.ActiveDocument.ActiveObject.Shape
triangles = shape.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)

Parfois, la triangulation de certains faces offerte par OpenCascade est assez laide. Si la face a un espace paramétrique rectangulaire et ne contient pas de trous ou d'autres courbes de coupe, vous pouvez également créer un maillage manuellement:

import Mesh
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))

    mesh = Mesh.Mesh()
    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])

    return mesh

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 très 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 des mailles en un de ces objets de niveau supérieur (gérée par le 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.

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 seconde méthode, offre la possibilité d'examiner les aspects de maillages coplanaires lorsque l'angle entre eux est sous une certaine valeur. Cela permet de construire des formes beaucoup plus simples:

Le code suivant suppose que notre document contient un objet Mesh.

# let's assume our document contains one Mesh object
import Mesh
import Part
import MeshPart

faces = []
mesh = App.ActiveDocument.ActiveObject.Mesh
segments = mesh.getPlanes(0.00001) # use rather strict tolerance here
 
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))

shell = Part.Compound(faces)
Part.show(shell)
# solid = Part.Solid(Part.Shell(faces))
# Part.show(solid)
Arrow-left.svg Page précédente : Script pour les pièces
Page suivante : Graphe de scène Arrow-right.svg