PyMesh

Geometry processing for Python — booleans, repair, remeshing, and more

pip install pymesh2 --find-links https://github.com/PozzettiAndrea/PyMesh/releases/latest/download/

Boolean Operations

CSG union, intersection, and difference via IGL/CGAL

import pymesh
import numpy as np

box_a = pymesh.generate_box_mesh(
    np.array([0, 0, 0]),
    np.array([1, 1, 1]))
box_b = pymesh.generate_box_mesh(
    np.array([0.5, 0.5, 0.5]),
    np.array([1.5, 1.5, 1.5]))

result = pymesh.boolean(
    box_a, box_b, "union",
    engine="igl")

0.00s — 16 → 20 verts, 24 → 36 faces

Before Input
After Union
import pymesh
import numpy as np

box_a = pymesh.generate_box_mesh(
    np.array([0, 0, 0]),
    np.array([1, 1, 1]))
box_b = pymesh.generate_box_mesh(
    np.array([0.5, 0.5, 0.5]),
    np.array([1.5, 1.5, 1.5]))

result = pymesh.boolean(
    box_a, box_b, "intersection",
    engine="igl")

0.00s — 16 → 8 verts, 24 → 12 faces

Before Input
After Intersection
import pymesh
import numpy as np

box_a = pymesh.generate_box_mesh(
    np.array([0, 0, 0]),
    np.array([1, 1, 1]))
box_b = pymesh.generate_box_mesh(
    np.array([0.5, 0.5, 0.5]),
    np.array([1.5, 1.5, 1.5]))

result = pymesh.boolean(
    box_a, box_b, "difference",
    engine="igl")

0.00s — 16 → 14 verts, 24 → 24 faces

Before Input
After Difference

Mesh Repair

Remove isolated vertices, duplicated faces, degenerate triangles

import pymesh

# mesh has extra isolated vertices
clean, info = pymesh.remove_isolated_vertices(mesh)
print(f"Removed {info['num_vertex_removed']} vertices")

0.00s — 10 → 8 verts, 12 → 12 faces

Before Input
After Cleaned
import pymesh

# mesh has duplicated faces
clean, info = pymesh.remove_duplicated_faces(mesh)

0.00s — 8 → 8 verts, 16 → 12 faces

Before Input
After Cleaned

Remeshing

Edge splitting, collapse, and adaptive refinement

import pymesh

sphere = pymesh.generate_icosphere(
    1.0, [0, 0, 0],
    refinement_order=2)

refined, _ = pymesh.split_long_edges(
    sphere, 0.2)

0.00s — 162 → 642 verts, 320 → 1,280 faces

Before Input
After Refined

Convex Hull

Compute the convex hull of a mesh

import pymesh

mesh = pymesh.generate_box_mesh(
    np.array([0, 0, 0]),
    np.array([1, 1, 1]))

hull = pymesh.convex_hull(mesh)

0.00s — 8 → 8 verts, 12 → 12 faces

Before Input
After Convex Hull