Mesh to Part/it: Difference between revisions
Renatorivo (talk | contribs) |
(Updating to match new version of source page) |
||
(24 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
<languages/> |
|||
== Da Mesh a Parte e viceversa== |
|||
=== Convertire oggetti Parte in Mesh === |
|||
{{TOCright}} |
|||
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: |
|||
<div class="mw-translate-fuzzy"> |
|||
#supponiamo che il nostro documento contenga un oggetto Parte |
|||
== Convertire oggetti Parte in Mesh == |
|||
import Mesh |
|||
</div> |
|||
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) |
|||
<div class="mw-translate-fuzzy"> |
|||
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: |
|||
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) |
|||
</div> |
|||
{{Code|code= |
|||
import Mesh |
|||
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 |
|||
obj = FreeCADGui.Selection.getSelection()[0] # a Part object must be preselected |
|||
=== Convertire oggetti Mesh in Parte === |
|||
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) |
|||
}} |
|||
Alternative example: |
|||
{{Code|code= |
|||
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) |
|||
}} |
|||
<div class="mw-translate-fuzzy"> |
|||
== Convertire oggetti Mesh in Parte == |
|||
</div> |
|||
<div class="mw-translate-fuzzy"> |
|||
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. |
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. |
||
</div> |
|||
<div class="mw-translate-fuzzy"> |
|||
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. |
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. |
||
</div> |
|||
<div class="mw-translate-fuzzy"> |
|||
FreeCAD attualmente offre due metodi per convertire Mesh in oggetti Parte. Il primo metodo è una semplice conversione, diretta, senza alcuna ottimizzazione: |
FreeCAD attualmente offre due metodi per convertire Mesh in oggetti Parte. Il primo metodo è una semplice conversione, diretta, senza alcuna ottimizzazione: |
||
</div> |
|||
{{Code|code= |
|||
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) |
|||
}} |
|||
<div class="mw-translate-fuzzy"> |
|||
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) |
|||
</div> |
|||
{{Code|code= |
|||
import Mesh,Part |
|||
import Mesh |
|||
mesh = Mesh.createTorus() |
|||
import Part |
|||
import MeshPart |
|||
shape.makeShapeFromMesh(mesh.Topology,0.05) # the second arg is the tolerance for sewing |
|||
solid = Part.makeSolid(shape) |
|||
Part.show(solid) |
|||
obj = FreeCADGui.Selection.getSelection()[0] # a Mesh object must be preselected |
|||
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: |
|||
mesh = obj.Mesh |
|||
segments = mesh.getPlanarSegments(0.00001) # use rather strict tolerance here |
|||
faces = [] |
|||
for i in segments: |
|||
# supponiamo che il nostro documento contenga un oggetto Mesh |
|||
if len(i) > 0: |
|||
import Mesh,Part,MeshPart |
|||
# a segment can have inner holes |
|||
faces = [] |
|||
wires = MeshPart.wireFromSegment(mesh, i) |
|||
mesh = App.ActiveDocument.ActiveObject.Mesh |
|||
# we assume that the exterior boundary is that one with the biggest bounding box |
|||
segments = mesh.getPlanes(0.00001) # tolleranza molto piccola |
|||
if len(wires) > 0: |
|||
ext = None |
|||
for i in segments: |
|||
max_length=0 |
|||
for i in wires: |
|||
if i.BoundBox.DiagonalLength > max_length: |
|||
wires = MeshPart.wireFromSegment(mesh, i) |
|||
max_length = i.BoundBox.DiagonalLength |
|||
# we assume that the exterior boundary is that one with the biggest bounding box |
|||
ext = i |
|||
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) |
|||
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)) |
|||
{{docnav/it|[[Topological data scripting/it|Script di dati topologici]]|[[Scenegraph/it|Grafo della scena]]}} |
|||
Part.show(solid) |
|||
}} |
|||
{{languages/it | {{en|Mesh to Part}} {{cn|Mesh to Part/cn}} {{fr|Mesh to Part/fr}} {{es|Mesh to Part/es}} {{jp|Mesh to Part/jp}} {{ru|Mesh to Part/ru}} {{se|Mesh to Part/se}} }} |
|||
{{Powerdocnavi{{#translation:}}}} |
|||
[[Category:Poweruser Documentation/it]] |
|||
[[Category: |
[[Category:Developer Documentation{{#translation:}}]] |
||
[[Category:Python Code{{#translation:}}]] |
|||
{{Mesh Tools navi{{#translation:}}}} |
|||
{{clear}} |
Revision as of 21:13, 23 August 2020
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)
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)
Alternative example:
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 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
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. Questo permette di costruire delle forme molto più semplici: (supponiamo che il nostro documento contenga un oggetto Mesh)
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)
- FreeCAD scripting: Python, Introduction to Python, Python scripting tutorial, FreeCAD Scripting Basics
- Modules: Builtin modules, Units, Quantity
- Workbenches: Workbench creation, Gui Commands, Commands, Installing more workbenches
- Meshes and Parts: Mesh Scripting, Topological data scripting, Mesh to Part, PythonOCC
- Parametric objects: Scripted objects, Viewproviders (Custom icon in tree view)
- Scenegraph: Coin (Inventor) scenegraph, Pivy
- Graphical interface: Interface creation, Interface creation completely in Python (1, 2, 3, 4, 5), PySide, PySide examples beginner, intermediate, advanced
- Macros: Macros, How to install macros
- Embedding: Embedding FreeCAD, Embedding FreeCADGui
- Other: Expressions, Code snippets, Line drawing function, FreeCAD vector math library (deprecated)
- Hubs: User hub, Power users hub, Developer hub
- Miscellaneous: Import mesh, Export mesh, Create mesh from shape, Regular solid, Unwrap Mesh, Unwrap Face
- Modifying: Harmonize normals, Flip normals, Fill holes, Close hole, Add triangle, Remove components, Remove components by hand, Smooth, Refinement, Decimation, Scale
- Boolean: Union, Intersection, Difference
- Cutting: Cut mesh, Trim mesh, Trim mesh with a plane, Create section from mesh and plane, Cross-sections
- Components and segments: Merge, Split by components, Create mesh segments, Create mesh segments from best-fit surfaces