Mesh to Part/fr: Difference between revisions
Renatorivo (talk | contribs) (Created page with "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...") |
(Updating to match new version of source page) |
||
(23 intermediate revisions by 5 users not shown) | |||
Line 1: | Line 1: | ||
<languages/> |
|||
== Converting Part objects to Meshes/fr == |
|||
{{docnav/fr |
|||
|[[Topological data scripting/fr|Script pour les pièces]] |
|||
|[[Scenegraph/fr|Scène graphique]] |
|||
}} |
|||
== 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| |
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): |
Le résultat de cette triangulation ([http://en.wikipedia.org/wiki/Tessellation tessellation]) est ensuite utilisé pour construire un maillage (Mesh): |
||
{{Code|code= |
|||
<syntaxhighlight> |
|||
#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 range(3): |
|||
vindex = tri[i] |
|||
face.append(triangles[0][vindex]) |
|||
faces.append(face) |
|||
m = Mesh.Mesh(faces) |
|||
Mesh.show(m) |
|||
}} |
|||
</syntaxhighlight> |
|||
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 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: |
||
{{Code|code= |
|||
<syntaxhighlight> |
|||
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 |
|||
mesh=Mesh.Mesh() |
|||
</syntaxhighlight> |
|||
for j in range(v-1): |
|||
== Converting Meshes to Part objects == |
|||
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 |
|||
Converting Meshes to Part objects is an extremely important operation in CAD work, because very often you receive 3D data in mesh format from other people or outputted from other applications. Meshes are very practical to represent free-form geometry and big visual scenes, as it is very lightweight, but for CAD we generally prefer higher-level objects that carry much more information, such as the idea of solid, or faces made of curves instead of triangles. |
|||
}} |
|||
== Conversion de maillages en objet Part == |
|||
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. |
|||
Converting meshes to those higher-level objects (handled by the [[Part Module]] in FreeCAD) is not an easy operation. Meshes can be made of thousands of triangles (for example when generated by a 3D scanner), and having solids made of the same number of faces would be extremely heavy to manipulate. So you generally want to optimize the object when converting. |
|||
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 currently offers two methods to convert Meshes to Part objects. The first method is a simple, direct conversion, without any optimization: |
|||
<syntaxhighlight> |
|||
import Mesh,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) |
|||
FreeCAD propose actuellement deux méthodes pour convertir des Parts objets en mailles. |
|||
</syntaxhighlight> |
|||
La première méthode est simple, la conversion directe, sans aucune optimisation: |
|||
The second method offers the possibility to consider mesh facets coplanar when the angle between them is under a certain value. This allows to build much simpler shapes: (let's assume our document contains one Mesh object) |
|||
{{Code|code= |
|||
<syntaxhighlight> |
|||
import Mesh |
|||
# let's assume our document contains one Mesh object |
|||
import Part |
|||
faces = [] |
|||
mesh = Mesh.createTorus() |
|||
mesh = App.ActiveDocument.ActiveObject.Mesh |
|||
shape = Part.Shape() |
|||
segments = mesh.getPlanes(0.00001) # use rather strict tolerance here |
|||
shape.makeShapeFromMesh(mesh.Topology,0.05) # the second arg is the tolerance for sewing |
|||
solid = Part.makeSolid(shape) |
|||
for i in segments: |
|||
Part.show(solid) |
|||
if len(i) > 0: |
|||
}} |
|||
# a segment can have inner holes |
|||
wires = MeshPart.wireFromSegment(mesh, i) |
|||
La seconde méthode, offre la possibilité d'examiner les aspects de mailles coplanaires, lorsque l'angle entre eux est sous une certaine valeur. |
|||
# we assume that the exterior boundary is that one with the biggest bounding box |
|||
Cela permet de construire des formes beaucoup plus simples: |
|||
if len(wires) > 0: |
|||
{{Code|code= |
|||
ext=None |
|||
# let's assume our document contains one Mesh object |
|||
max_length=0 |
|||
import Mesh |
|||
for i in wires: |
|||
import Part |
|||
if i.BoundBox.DiagonalLength > max_length: |
|||
import MeshPart |
|||
max_length = i.BoundBox.DiagonalLength |
|||
ext = i |
|||
faces = [] |
|||
mesh = App.ActiveDocument.ActiveObject.Mesh |
|||
segments = mesh.getPlanes(0.00001) # use rather strict tolerance here |
|||
for i in segments: |
|||
wires.remove(ext) |
|||
if len(i) > 0: |
|||
# all interior wires mark a hole and must reverse their orientation, otherwise Part.Face fails |
|||
# a segment can have inner holes |
|||
wires = MeshPart.wireFromSegment(mesh, i) |
|||
i.reverse() |
|||
# we assume that the exterior boundary is that one with the biggest bounding box |
|||
if len(wires) > 0: |
|||
# make sure that the exterior wires comes as first in the lsit |
|||
ext = None |
|||
max_length=0 |
|||
for i in wires: |
|||
if i.BoundBox.DiagonalLength > max_length: |
|||
shell=Part.Compound(faces) |
|||
max_length = i.BoundBox.DiagonalLength |
|||
Part.show(shell) |
|||
ext = i |
|||
#solid = Part.Solid(Part.Shell(faces)) |
|||
#Part.show(solid) |
|||
wires.remove(ext) |
|||
</syntaxhighlight> |
|||
# all interior wires mark a hole and must reverse their orientation, otherwise Part.Face fails |
|||
{{docnav|Topological data scripting|Scenegraph}} |
|||
for i in wires: |
|||
i.reverse() |
|||
# make sure that the exterior wires comes as first in the list |
|||
[[Category:Poweruser Documentation]] |
|||
wires.insert(0, ext) |
|||
[[Category:Python Code]] |
|||
faces.append(Part.Face(wires)) |
|||
shell = Part.Compound(faces) |
|||
{{clear}} |
|||
Part.show(shell) |
|||
<languages/> |
|||
# solid = Part.Solid(Part.Shell(faces)) |
|||
# Part.show(solid) |
|||
}} |
|||
{{docnav/fr |
|||
|[[Topological data scripting/fr|Script pour les pièces]] |
|||
|[[Scenegraph/fr|Scène graphique]] |
|||
}} |
|||
{{Powerdocnavi{{#translation:}}}} |
|||
[[Category:Python Code{{#translation:}}]] |
Revision as of 10:58, 24 May 2020
Conversion d'objets Part en maillages
La conversion des objets de haut niveau tels que les objets (formes) en objets simples comme les maillages (Mesh) est une opération facile, où, toutes les faces d'un Objet Part deviennent une composition de triangles (exemple sur le site de coin3d un des moteurs de FreeCAD).
Le résultat de cette triangulation (tessellation) est ensuite utilisé pour construire un maillage (Mesh):
#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 range(3):
vindex = tri[i]
face.append(triangles[0][vindex])
faces.append(face)
m = Mesh.Mesh(faces)
Mesh.show(m)
Parfois, la triangulation de certaines faces offertes par 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:
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 objet Part
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.
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 Parts objets en mailles. 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 mailles coplanaires, lorsque l'angle entre eux est sous une certaine valeur. Cela permet de construire des formes beaucoup plus simples:
# 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)
- Scripts FreeCAD : Python, Introduction à Python, Tutoriel sur les scripts Python, Débuter avec les scripts
- Modules : Modules intégrés, Unités, Quantity
- Ateliers : Création d'atelier, Commands Gui, Les commandes, Installer des ateliers supplémentaires
- Maillages et objets Parts : Scripts Mesh, Script de données topologiques, Conversion objet Mesh en Part, PythonOCC
- Objets paramétriques : Objets créés par script, Viewproviders (Icône personnalisée dans l'arborescence)
- Scénographie : Graphe de scène Coin (Inventor), Pivy
- Interface graphique : Création d'interface, Création d'une boite de dialogue (1, 2, 3, 4, 5), PySide, Exemples PySide débutant, intermédiaire, expérimenté
- Macros : Macros, Comment installer des macros
- Intégration : Intégrer FreeCAD, Intégration de FreeCADGui
- Autre : Expressions, Extraits de codes, Fonction - tracer une ligne, Bibliothèque mathématique vectorielle de FreeCAD (déprécié)