Convertir objetos de nivel superior, como las formas piezas, en objetos más simples, como las mallas, es una operación bastante sencilla en la que todas las caras de un objeto Pieza se triangulan. El resultado de esa triangulación (teselación) se utiliza luego para construir una malla:
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)
Ejemplo alternativo:
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)
Convertir mallas en objetos Pieza es una operación común. Con frecuencia, recibirá datos 3D en formato de malla. Las mallas son muy prácticas para representar geometría de forma libre y escenas visuales extensas, ya que son muy ligeras. Sin embargo, en FreeCAD generalmente preferimos objetos de nivel superior, los sólidos, que pueden contener mucha más información y permiten caras curvas.
Convertir mallas en objetos de nivel superior (gestionados por el Entorno de Trabajo de Piezas en FreeCAD) no es una operación sencilla. Las mallas pueden contener miles de triángulos (por ejemplo, cuando se generan mediante un escáner 3D), y los sólidos con el mismo número de caras serían extremadamente difíciles de manipular. Por lo tanto, generalmente conviene optimizar el objeto durante la conversión.
FreeCAD ofrece actualmente dos métodos para convertir mallas en objetos Pieza. El primer método es una conversión simple y directa sin ninguna optimización:
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)
El segundo método ofrece la posibilidad de considerar las facetas de la malla como coplanares cuando el ángulo entre ellas es inferior a un cierto valor, reduciendo así el número de caras en el resultado final:
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)