Da Mesh a Parte e viceversa

From FreeCAD Documentation
Revision as of 20:47, 30 September 2014 by Renatorivo (talk | contribs) (Created page with "Convertire gli oggetti mesh in oggetti di livello superiore, come sono gli oggetti gestiti dal Modulo Parte di FreeCAD non è un'operazione facile. L'ogget...")

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 currently offers two methods to convert Meshes to Part objects. The first method is a simple, direct conversion, without any optimization:

 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)

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)

 # 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)
Topological data scripting
Scenegraph