99 lines
5.2 KiB
HTML
99 lines
5.2 KiB
HTML
<html><head><title>Mesh to Part/es</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/es</h1></div>
|
|
|
|
<div id="mw-content-text" lang="es" dir="ltr" class="mw-content-ltr"><hr/><div class="mw-parser-output"><h2><span class="mw-headline" id="Convertir_Objetos_parte_en_mallas">Convertir Objetos parte en mallas</span></h2>
|
|
<p>La conversión de objetos de alto nivel, tales como <a href="https://www.freecadweb.org/wiki/index.php?title=Part_Module/es" title="Part Module/es">formas de Piezas</a> en objetos más simples como <a href="https://www.freecadweb.org/wiki/index.php?title=Mesh_Module/es" class="mw-redirect" title="Mesh Module/es">mallas</a> es una operación bastante sencilla, en la que todas las caras de un objeto Pieza son triangularizadas. El resultado de esa triangulación (o teselado) se utiliza para construir una malla:
|
|
</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>En ocasiones, la triangulación ofrecida por <i>OpenCascade</i> para algunas caras es bastante fea. Si la cara tiene un espacio de parámetros rectangular y no contiene ningún agujero o curvas de corte también puedes crear una malla por tu cuenta:
|
|
</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="Convertir_Mallas_en_objetos_Pieza">Convertir Mallas en objetos Pieza</span></h2>
|
|
<p>La conversión de mallas en objetos Pieza es una operación muy importante en el trabajo de CAD, ya que a menudo se reciben datos 3D en formato de malla de otras personas o son generados con otras aplicaciones. Las mallas son muy prácticas para representar la geometría de forma libre y para grandes escenas visuales, ya que son muy ligeras. Pero, por lo general, el CAD prefiere objetos de nivel superior que llevan mucha más información, como la idea de sólidos, o caras hechas de curvas, en lugar de triángulos.
|
|
</p><p>La conversión de las mallas a esos objetos de nivel superior (manejados por el <a href="https://www.freecadweb.org/wiki/index.php?title=Part_Module/es" title="Part Module/es">Módulo de Piezas</a> en FreeCAD) no es una operación fácil. Las mallas pueden tener miles de triángulos (por ejemplo, los generados por un escáner 3D), y si los sólidos se hacen con el mismo número de caras, serían extremadamente pesados de manipular. Así que por lo general, se desea optimizar el objeto durante la conversión.
|
|
</p><p>FreeCAD actualmente ofrece dos métodos para convertir mallas en piezas. El primer método es una conversión sencilla, directa, sin ningún tipo de optimización:
|
|
</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>El segundo método ofrece la posibilidad de considerar coplanares las facetas de malla que forman entre si un pequeño ángulo. Esto permite la construcción de formas mucho más simples:
|
|
</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/es&oldid=138216">http://www.freecadweb.org/wiki/index.php?title=Mesh_to_Part/es&oldid=138216</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> |