99 lines
5.4 KiB
HTML
99 lines
5.4 KiB
HTML
<html><head><title>Mesh to Part/it</title><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><link type='text/css' href='wiki.css' rel='stylesheet'></head><body><h1>Mesh to Part/it</h1></div>
|
|
|
|
<div id="mw-content-text" lang="it" dir="ltr" class="mw-content-ltr"><hr/><div class="mw-parser-output"><h2><span class="mw-headline" id="Convertire_oggetti_Parte_in_Mesh">Convertire oggetti Parte in Mesh</span></h2>
|
|
<p>La conversione di oggetti di alto livello come le <a href="https://www.freecadweb.org/wiki/index.php?title=Part_Module/it" title="Part Module/it">forme di Parte</a> in oggetti semplici come gli <a href="https://www.freecadweb.org/wiki/index.php?title=Mesh_Module/it" class="mw-redirect" title="Mesh Module/it">oggetti Mesh</a> è 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)
|
|
</p>
|
|
<pre>#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) </pre>
|
|
<p>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:
|
|
</p>
|
|
<pre>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 </pre>
|
|
<h2><span class="mw-headline" id="Convertire_oggetti_Mesh_in_Parte">Convertire oggetti Mesh in Parte</span></h2>
|
|
<p>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.
|
|
</p><p>Convertire gli oggetti mesh in oggetti di livello superiore, come sono gli oggetti gestiti dal <a href="https://www.freecadweb.org/wiki/index.php?title=Part_Module/it" title="Part Module/it">Modulo Parte</a> 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.
|
|
</p><p>FreeCAD attualmente offre due metodi per convertire Mesh in oggetti Parte. Il primo metodo è una semplice conversione, diretta, senza alcuna ottimizzazione:
|
|
</p>
|
|
<pre>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) </pre>
|
|
<p>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)
|
|
</p>
|
|
<pre># 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 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) </pre>
|
|
|
|
<div style="clear:both"></div>
|
|
</div>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
</div><div class="printfooter">
|
|
Online version: "<a dir="ltr" href="https://www.freecadweb.org/wiki/index.php?title=Mesh_to_Part/it&oldid=138218">http://www.freecadweb.org/wiki/index.php?title=Mesh_to_Part/it&oldid=138218</a>"</div>
|
|
<div id="catlinks" class="catlinks" data-mw="interface"></div><div class="visualClear"></div>
|
|
</div>
|
|
</div>
|
|
<div id="mw-navigation">
|
|
<h2>Navigation menu</h2>
|
|
|
|
</body></html> |