Mesh to Part/it: Difference between revisions
Renatorivo (talk | contribs) (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…') |
Renatorivo (talk | contribs) No edit summary |
||
Line 93: | Line 93: | ||
{{docnav/it|[[Topological data scripting/it|Script di dati topologici]]|[[Scenegraph/it| |
{{docnav/it|[[Topological data scripting/it|Script di dati topologici]]|[[Scenegraph/it|Grafo della scena]]}} |
||
{{languages/it | {{en|Mesh to Part}} {{es|Mesh to Part/es}} {{ru|Mesh to Part/ru}} {{se|Mesh to Part/se}} }} |
{{languages/it | {{en|Mesh to Part}} {{es|Mesh to Part/es}} {{ru|Mesh to Part/ru}} {{se|Mesh to Part/se}} }} |
Revision as of 18:18, 18 May 2012
traduzione provvisoria (renatorivo)
Da Mesh a Parte
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 (suddivisione in maglie di una rete). Il risultato di tale triangolazione (tassellatura) viene poi utilizzato per costruire un mesh:
#supponiamo che il nostro documento contiene un oggetto Parte 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)
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:
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 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.
Convertire gli oggetti mesh in oggetti di livello superiore (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 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)