Source code for capytaine.meshes.export

import numpy as np
import xarray as xr

from capytaine.tools.optional_imports import import_optional_dependency


[docs] def export_mesh(mesh, format: str): format = format.lower() if format == "pyvista": return export_to_pyvista(mesh) elif format == "xarray": return export_to_xarray(mesh) elif format == "meshio": return export_to_meshio(mesh) elif format == "trimesh": return export_to_trimesh(mesh) else: raise ValueError(f"Unrecognized output format: {format}")
[docs] def export_to_pyvista(mesh): """ Build a PyVista UnstructuredGrid from a list of faces (triangles or quads). """ pv = import_optional_dependency("pyvista") # flatten into the VTK cell‐array format: [n0, i0, i1, ..., in-1, n1, j0, j1, ...] flat_cells = [] cell_types = [] for face in mesh._faces: n = len(face) flat_cells.append(n) flat_cells.extend(face) if n == 3: cell_types.append(pv.CellType.TRIANGLE) elif n == 4: cell_types.append(pv.CellType.QUAD) else: # if you ever have ngons, you can map them as POLYGON: cell_types.append(pv.CellType.POLYGON) cells_array = np.array(flat_cells, dtype=np.int64) cell_types = np.array(cell_types, dtype=np.uint8) return pv.UnstructuredGrid(cells_array, cell_types, mesh.vertices.astype(np.float32))
[docs] def export_to_xarray(mesh): return xr.Dataset( { "mesh_vertices": ( ["face", "vertices_of_face", "space_coordinate"], mesh.as_array_of_faces() ) }, coords={ "space_coordinate": ["x", "y", "z"], })
[docs] def export_to_meshio(mesh): meshio = import_optional_dependency("meshio") quads = [f for f in mesh._faces if len(f) == 4] tris = [f for f in mesh._faces if len(f) == 3] cells = [] if quads: cells.append(meshio.CellBlock("quad", np.array(quads, dtype=np.int32))) if tris: cells.append(meshio.CellBlock("triangle", np.array(tris, dtype=np.int32))) return meshio.Mesh(points=mesh.vertices, cells=cells)
[docs] def export_to_trimesh(mesh): trimesh = import_optional_dependency("trimesh") triangle_faces = [] for face in mesh._faces: if len(face) == 4 and face[3] != face[2]: triangle_faces.append([face[0], face[1], face[2]]) triangle_faces.append([face[0], face[2], face[3]]) else: triangle_faces.append(face[:3]) return trimesh.Trimesh( vertices=mesh.vertices, faces=np.array(triangle_faces), process=False )