Mesh to Part/it: Difference between revisions

From FreeCAD Documentation
(Created page with 'traduzione provvisoria (renatorivo) =Da Mesh a Parte= == Convertire oggetti Parte in Mesh == La conversione di oggetti di alto livello come le [[Part Module/it|forme di Parte…')
 
No edit summary
 
(39 intermediate revisions by 5 users not shown)
Line 1: Line 1:
<languages/>
traduzione provvisoria (renatorivo)


{{TOCright}}
=Da Mesh a Parte=


== Convertire oggetti Parte in Mesh ==
==Convertire oggetti Parte in 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 (suddivisione in maglie di una rete). Il risultato di tale triangolazione (tassellatura) viene poi utilizzato per costruire un mesh:
La conversione di oggetti di alto livello come le [[Part_Workbench/it|forme di Parte]] in oggetti semplici come gli [[Mesh_Workbench/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:


{{Code|code=
#supponiamo che il nostro documento contiene un oggetto Parte
import Mesh
import Mesh
faces = []
shape = FreeCAD.ActiveDocument.ActiveObject.Shape
triangles = shape.tessellate(1) # il numero rappresenta la precisione della tassellatura)
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)


obj = FreeCADGui.Selection.getSelection()[0] # a Part object must be preselected
A volte la triangolazione di alcune facce offerta da OpenCascade è abbastanza brutta. Se la faccia ha uno spazio di parametri rettangolare e non contiene buchi o altre curve di taglio è anche possibile creare una tassellatura da soli:
shp = obj.Shape
faces = []


triangles = shp.tessellate(1) # the number represents the precision of the tessellation
import Mesh
for tri in triangles[1]:
def makeMeshFromFace(u,v,face):
face = []
(a,b,c,d)=face.ParameterRange
for i in tri:
pts=[]
face.append(triangles[0][i])
for j in range(v):
faces.append(face)
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


m = Mesh.Mesh(faces)
== Convertire oggetti Mesh in Parte ==
Mesh.show(m)
}}


Esempio alternativo::
La conversione di oggetti Mesh in oggetti Parte è un'operazione estremamente importante nel lavoro CAD, perché molto spesso si ricevono i dati 3D in formato mesh da altre persone o 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 CAD si preferiscono generalmente oggetti di livello superiore che contengono molte più informazioni, come il concetto di solido, o facce composte da curve invece di triangoli.


{{Code|code=
Convertire gli oggetti mesh in oggetti di livello superiore (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.
import Mesh
import MeshPart


obj = FreeCADGui.Selection.getSelection()[0] # a Part object must be preselected
FreeCAD attualmente offre due metodi per convertire Mesh in oggetti Parte. Il primo metodo è una semplice conversione, diretta, senza alcuna ottimizzazione:
shp = obj.Shape


mesh = FreeCAD.ActiveDocument.addObject("Mesh::Feature", "Mesh")
import Mesh,Part
mesh = Mesh.createTorus()
mesh.Mesh = MeshPart.meshFromShape(
shape = Part.Shape()
Shape=shp,
LinearDeflection=0.01,
shape.makeShapeFromMesh(mesh.Topology,0.05) # the second arg is the tolerance for sewing
AngularDeflection=0.025,
solid = Part.makeSolid(shape)
Relative=False)
Part.show(solid)
}}


==Convertire Mesh in oggetti Parte==
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:


La conversione delle mesh in oggetti parte è un'operazione comune. Molto spesso riceverai dati 3D in formato mesh. Le mesh sono abbastanza pratiche per rappresentare la geometria a forma libera e grandi scene visive, in quanto sono molto leggere. Ma in FreeCAD generalmente preferiamo oggetti di livello superiore, solidi, che possono trasportare molte più informazioni e consentire facce curve.
# supponiamo che il nostro documento contiene un oggetto Mesh
import Mesh,Part,MeshPart
faces = []
mesh = App.ActiveDocument.ActiveObject.Mesh
segments = mesh.getPlanes(0.00001) # tolleranza molto piccola
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 lsit
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)


Convertire gli oggetti mesh in oggetti di livello superiore, come sono gli oggetti gestiti dal [[Part_Workbench/it|Ambiente 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 difficile. 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:


{{Code|code=
{{docnav/it|[[Topological data scripting/it|Script di dati topologici]]|[[Scenegraph/it|Scenografia]]}}
import Mesh
import Part


mesh = Mesh.createTorus()
{{languages/it | {{en|Mesh to Part}} {{es|Mesh to Part/es}} {{ru|Mesh to Part/ru}} {{se|Mesh to Part/se}} }}
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, riducendo il numero di facce nel risultato finale:
[[Category:Poweruser Documentation/it]]

[[Category:Python Code/it]]
{{Code|code=
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)
}}


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

Latest revision as of 23:38, 28 September 2022

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:

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)

Esempio alternativo::

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)

Convertire Mesh in oggetti Parte

La conversione delle mesh in oggetti parte è un'operazione comune. Molto spesso riceverai dati 3D in formato mesh. Le mesh sono abbastanza pratiche per rappresentare la geometria a forma libera e grandi scene visive, in quanto sono molto leggere. Ma in FreeCAD generalmente preferiamo oggetti di livello superiore, solidi, che possono trasportare molte più informazioni e consentire facce curve.

Convertire gli oggetti mesh in oggetti di livello superiore, come sono gli oggetti gestiti dal Ambiente 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 difficile. 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
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)

Il secondo metodo offre la possibilità di considerare complanari le sfaccettature delle maglie quando l'angolo tra di loro è inferiore a un certo valore, riducendo il numero di facce nel risultato finale:

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)