Mesh to Part/it: Difference between revisions
(Updating to match new version of source page) |
Renatorivo (talk | contribs) (Created page with "Category:Python Code/it") |
||
(17 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
<languages/> |
|||
== Converting Part objects to Meshes == |
|||
{{docnav/it|[[Topological data scripting/it|Script di dati topologici]]|[[Scenegraph/it|Grafo della scena]]}} |
|||
== Convertire oggetti Parte in Mesh == |
|||
Converting higher-level objects such as [[Part Module|Part shapes]] into simpler objects such as [[Mesh Module|meshes]] is a pretty simple operation, where all faces of a Part object get triangulated. The result of that triangulation (tessellation) is then used to construct a mesh: (let's assume our document contains one part object) |
|||
<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> |
|||
Sometimes the triangulation of certain faces offered by OpenCascade is quite ugly. If the face has a rectangular parameter space and doesn't contain any holes or other trimming curves you can also create a mesh on your own: |
|||
<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 |
|||
La conversione di oggetti di alto livello come le [[Part Module/it|forme di Parte]] in oggetti semplici come gli [[Mesh Module/it|oggetti Mesh]] è una operazione piuttosto semplice, nella quale tutte le facce di un oggetto Parte vengono triangolate (suddivise in maglie di una rete). Il risultato di tale triangolazione (tassellatura) viene poi utilizzato per costruire un oggetto mesh: (supponiamo che il nostro documento contenga un oggetto Parte) |
|||
</syntaxhighlight> |
|||
{{Code|code= |
|||
== Converting Meshes to Part objects == |
|||
#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) |
|||
}} |
|||
A volte la triangolazione di alcune facce offerta da OpenCascade è abbastanza brutta. Se la faccia ha una forma rettangolare e non contiene buchi o altre curve di taglio è possibile creare una tassellatura da soli: |
|||
{{Code|code= |
|||
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() |
|||
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. |
|||
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 |
|||
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. |
|||
}} |
|||
== Convertire oggetti Mesh in Parte == |
|||
La conversione di oggetti Mesh in oggetti Parte è un'operazione estremamente importante nel lavoro CAD perché molto spesso i dati 3D si ricevono da altri in formato mesh o sono generati da altre applicazioni. I mesh sono molto pratici per rappresentare le geometrie di forma libera e grandi scene visive in quanto sono molto leggeri, ma per lavori CAD si preferiscono generalmente oggetti di livello superiore, che contengono molte più informazioni, come il concetto di solido, o facce composte da curve invece che da triangoli. |
|||
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) |
|||
Convertire gli oggetti mesh in oggetti di livello superiore, come sono gli oggetti gestiti dal [[Part Module/it|Modulo Parte]] di FreeCAD non è un'operazione facile. L'oggetto Mesh può contenere migliaia di triangoli (per esempio quando è generato da uno scanner 3D), e manipolare solidi costituiti dallo stesso numero di facce sarebbe estremamente pesante. Quindi, in genere, si desidera ottimizzare l'oggetto durante la conversione. |
|||
</syntaxhighlight> |
|||
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) |
|||
FreeCAD attualmente offre due metodi per convertire Mesh in oggetti Parte. Il primo metodo è una semplice conversione, diretta, senza alcuna ottimizzazione: |
|||
<syntaxhighlight> |
|||
{{Code|code= |
|||
# let's assume our document contains one Mesh object |
|||
import Mesh,Part |
|||
mesh = Mesh.createTorus() |
|||
faces = [] |
|||
shape = Part.Shape() |
|||
mesh = App.ActiveDocument.ActiveObject.Mesh |
|||
shape.makeShapeFromMesh(mesh.Topology,0.05) # the second arg is the tolerance for sewing |
|||
solid = Part.makeSolid(shape) |
|||
Part.show(solid) |
|||
for i in segments: |
|||
if len(i) > 0: |
|||
}} |
|||
# a segment can have inner holes |
|||
Il secondo metodo offre la possibilità di considerare complanari le sfaccettature delle maglie quando l'angolo tra di loro è inferiore a un certo valore. Questo permette di costruire delle forme molto più semplici: (supponiamo che il nostro documento contenga un oggetto Mesh) |
|||
wires = MeshPart.wireFromSegment(mesh, i) |
|||
{{Code|code= |
|||
# we assume that the exterior boundary is that one with the biggest bounding box |
|||
# let's assume our document contains one Mesh object |
|||
if len(wires) > 0: |
|||
import Mesh,Part,MeshPart |
|||
ext=None |
|||
faces = [] |
|||
max_length=0 |
|||
mesh = App.ActiveDocument.ActiveObject.Mesh |
|||
for i in wires: |
|||
segments = mesh.getPlanes(0.00001) # use rather strict tolerance here |
|||
if i.BoundBox.DiagonalLength > max_length: |
|||
max_length = i.BoundBox.DiagonalLength |
|||
ext = i |
|||
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/it|[[Topological data scripting/it|Script di dati topologici]]|[[Scenegraph/it|Grafo della scena]]}} |
|||
{{Userdocnavi/it}} |
|||
[[Category:Poweruser Documentation/it]] |
|||
[[Category:Python Code/it]] |
Revision as of 21:12, 30 April 2019
Convertire oggetti Parte in Mesh
La conversione di oggetti di alto livello come le forme di Parte in oggetti semplici come gli oggetti Mesh è una operazione piuttosto semplice, nella quale tutte le facce di un oggetto Parte vengono triangolate (suddivise in maglie di una rete). Il risultato di tale triangolazione (tassellatura) viene poi utilizzato per costruire un oggetto mesh: (supponiamo che il nostro documento contenga un oggetto Parte)
#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)
A volte la triangolazione di alcune facce offerta da OpenCascade è abbastanza brutta. Se la faccia ha una forma rettangolare e non contiene buchi o altre curve di taglio è possibile creare una tassellatura da soli:
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
Convertire oggetti Mesh in Parte
La conversione di oggetti Mesh in oggetti Parte è un'operazione estremamente importante nel lavoro CAD perché molto spesso i dati 3D si ricevono da altri in formato mesh o sono generati da altre applicazioni. I mesh sono molto pratici per rappresentare le geometrie di forma libera e grandi scene visive in quanto sono molto leggeri, ma per lavori CAD si preferiscono generalmente oggetti di livello superiore, che contengono molte più informazioni, come il concetto di solido, o facce composte da curve invece che da triangoli.
Convertire gli oggetti mesh in oggetti di livello superiore, come sono gli oggetti gestiti dal Modulo Parte di FreeCAD non è un'operazione facile. L'oggetto Mesh può contenere migliaia di triangoli (per esempio quando è generato da uno scanner 3D), e manipolare solidi costituiti dallo stesso numero di facce sarebbe estremamente pesante. Quindi, in genere, si desidera ottimizzare l'oggetto durante la conversione.
FreeCAD attualmente offre due metodi per convertire Mesh in oggetti Parte. Il primo metodo è una semplice conversione, diretta, senza alcuna ottimizzazione:
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)
Il secondo metodo offre la possibilità di considerare complanari le sfaccettature delle maglie quando l'angolo tra di loro è inferiore a un certo valore. Questo permette di costruire delle forme molto più semplici: (supponiamo che il nostro documento contenga un oggetto Mesh)
# let's assume our document contains one Mesh object
import Mesh,Part,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)
- Getting started
- Installation: Download, Windows, Linux, Mac, Additional components, Docker, AppImage, Ubuntu Snap
- Basics: About FreeCAD, Interface, Mouse navigation, Selection methods, Object name, Preferences, Workbenches, Document structure, Properties, Help FreeCAD, Donate
- Help: Tutorials, Video tutorials
- Workbenches: Std Base, Arch, Assembly, CAM, Draft, FEM, Inspection, Mesh, OpenSCAD, Part, PartDesign, Points, Reverse Engineering, Robot, Sketcher, Spreadsheet, Start, Surface, TechDraw, Test Framework, Web
- Hubs: User hub, Power users hub, Developer hub