import numpy as np
from numpy.typing import NDArray

class PyTMesh:
    def __init__(self) -> None: ...
    def load_file(self, filename: str) -> None: ...
    def save_file(self, filename: str, back_approx: bool = False) -> None: ...
    def load_array(
        self,
        points_arr: NDArray[np.float64],
        faces_arr: NDArray[np.int32],
    ) -> None: ...
    def fix_connectivity(self) -> None: ...
    def join_closest_components(self) -> None: ...
    def set_quiet(self, quiet: int) -> None: ...
    def clean(self, max_iters: int = 10, inner_loops: int = 3) -> bool: ...
    def fill_small_boundaries(self, nbe: int = 0, refine: bool = True) -> int: ...
    def strong_degeneracy_removal(self, max_iter: int) -> bool: ...
    def strong_intersection_removal(self, max_iter: int) -> bool: ...
    def select_intersecting_triangles(
        self, tris_per_cell: int = 50, justproper: bool = False
    ) -> NDArray[np.int32]: ...
    def remove_smallest_components(self) -> int: ...
    def return_arrays(self) -> tuple[NDArray[np.float64], NDArray[np.int32]]: ...
    def return_points(self) -> NDArray[np.float64]: ...
    def return_faces(self) -> NDArray[np.int32]: ...
    def _boundaries(self) -> None: ...
    @property
    def n_boundaries(self) -> int: ...
    @property
    def n_faces(self) -> int: ...
    @property
    def n_points(self) -> int: ...

def clean_from_file(
    infile: str,
    outfile: str,
    verbose: bool = False,
    joincomp: bool = False,
) -> None: ...
def clean_from_arrays(
    v: NDArray[np.float64],
    f: NDArray[np.int32],
    verbose: bool = False,
    joincomp: bool = False,
    remove_smallest_components: bool = True,
) -> tuple[NDArray[np.float64], NDArray[np.int32]]: ...
