Skip to main content

Repairs triangular meshes

Project description

https://travis-ci.org/akaszynski/pymeshfix.svg?branch=master

Python/Cython wrapper of Marco Attene’s wonderful, award-winning MeshFix software. This module brings the speed of C++ with the portability and ease of installation of Python.

This software takes as input a polygon mesh and produces a copy of the input where all the occurrences of a specific set of “defects” are corrected. MeshFix has been designed to correct typical flaws present in raw digitized mesh models, thus it might fail or produce coarse results if run on other sorts of input meshes (e.g. tessellated CAD models).

The input is assumed to represent a single closed solid object, thus the output will be a single watertight triangle mesh bounding a polyhedron. All the singularities, self-intersections and degenerate elements are removed from the input, while regions of the surface without defects are left unmodified.

Installation

From PyPI

pip install pymeshfix

From source at GitHub

git clone https://github.com/akaszynski/pymeshfix
cd pymeshfix
pip install .

Dependencies

Requires numpy and pyvista

Examples

Test installation with the following from Python:

from pymeshfix import examples

# Test of pymeshfix without VTK module
examples.native()

# Performs same mesh repair while leveraging VTK's plotting/mesh loading
examples.with_vtk()

Easy Example

This example uses the Cython wrapper directly. No bells or whistles here:

from pymeshfix import _meshfix

# Read mesh from infile and output cleaned mesh to outfile
_meshfix.clean_from_file(infile, outfile)

This example assumes the user has vertex and faces arrays in Python.

from pymeshfix import _meshfix

# Generate vertex and face arrays of cleaned mesh
# where v and f are numpy arrays or python lists
vclean, fclean = _meshfix.clean_from_arrays(v, f)

Complete Examples with and without VTK

One of the main reasons to bring MeshFix to Python is to allow the library to communicate to other python programs without having to use the hard drive. Therefore, this example assumes that you have a mesh within memory and wish to repair it using MeshFix.

import pymeshfix

# Create object from vertex and face arrays
meshfix = pymeshfix.MeshFix(v, f)

# Plot input
meshfix.plot()

# Repair input mesh
meshfix.repair()

# Access the repaired mesh with vtk
mesh = meshfix.mesh

# Or, access the resulting arrays directly from the object
meshfix.v # numpy np.float array
meshfix.f # numpy np.int32 array

# View the repaired mesh (requires vtkInterface)
meshfix.plot()

# Save the mesh
meshfix.write('out.ply')

Alternatively, the user could use the Cython wrapper of MeshFix directly if vtk is unavailable or they wish to have more control over the cleaning algorithm.

from pymeshfix import _meshfix

# Create TMesh object
tin = _meshfix.PyTMesh()

tin.LoadFile(infile)
# tin.load_array(v, f) # or read arrays from memory

# Attempt to join nearby components
# tin.join_closest_components()

# Fill holes
tin.fill_small_boundaries()
print('There are {:d} boundaries'.format(tin.boundaries())

# Clean (removes self intersections)
tin.clean(max_iters=10, inner_loops=3)

# Check mesh for holes again
print('There are {:d} boundaries'.format(tin.boundaries())

# Clean again if necessary...

# Output mesh
tin.save_file(outfile)

 # or return numpy arrays
vclean, fclean = tin.return_arrays()

Algorithm and Citation Policy

To better understand how the algorithm works, please refer to the following paper:

  1. Attene. A lightweight approach to repairing digitized polygon meshes. The Visual Computer, 2010. (c) Springer. DOI: 10.1007/s00371-010-0416-3

This software is based on ideas published therein. If you use MeshFix for research purposes you should cite the above paper in your published results. MeshFix cannot be used for commercial purposes without a proper licensing contract.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Files for pymeshfix, version 0.13.1
Filename, size File type Python version Upload date Hashes
Filename, size pymeshfix-0.13.1-cp27-cp27m-macosx_10_6_intel.whl (1.7 MB) File type Wheel Python version cp27 Upload date Hashes View hashes
Filename, size pymeshfix-0.13.1-cp27-cp27m-manylinux1_x86_64.whl (2.1 MB) File type Wheel Python version cp27 Upload date Hashes View hashes
Filename, size pymeshfix-0.13.1-cp27-cp27mu-manylinux1_x86_64.whl (2.1 MB) File type Wheel Python version cp27 Upload date Hashes View hashes
Filename, size pymeshfix-0.13.1-cp35-cp35m-macosx_10_6_intel.whl (1.6 MB) File type Wheel Python version cp35 Upload date Hashes View hashes
Filename, size pymeshfix-0.13.1-cp35-cp35m-manylinux1_x86_64.whl (2.1 MB) File type Wheel Python version cp35 Upload date Hashes View hashes
Filename, size pymeshfix-0.13.1-cp35-cp35m-win_amd64.whl (1.3 MB) File type Wheel Python version cp35 Upload date Hashes View hashes
Filename, size pymeshfix-0.13.1-cp36-cp36m-macosx_10_6_intel.whl (1.6 MB) File type Wheel Python version cp36 Upload date Hashes View hashes
Filename, size pymeshfix-0.13.1-cp36-cp36m-manylinux1_x86_64.whl (2.1 MB) File type Wheel Python version cp36 Upload date Hashes View hashes
Filename, size pymeshfix-0.13.1-cp36-cp36m-win_amd64.whl (1.3 MB) File type Wheel Python version cp36 Upload date Hashes View hashes
Filename, size pymeshfix-0.13.1-cp37-cp37m-macosx_10_6_intel.whl (1.6 MB) File type Wheel Python version cp37 Upload date Hashes View hashes
Filename, size pymeshfix-0.13.1-cp37-cp37m-manylinux1_x86_64.whl (2.1 MB) File type Wheel Python version cp37 Upload date Hashes View hashes
Filename, size pymeshfix-0.13.1-cp37-cp37m-win_amd64.whl (1.3 MB) File type Wheel Python version cp37 Upload date Hashes View hashes
Filename, size pymeshfix-0.13.1.tar.gz (1.3 MB) File type Source Python version None Upload date Hashes View hashes

Supported by

Elastic Elastic Search Pingdom Pingdom Monitoring Google Google BigQuery Sentry Sentry Error logging AWS AWS Cloud computing DataDog DataDog Monitoring Fastly Fastly CDN SignalFx SignalFx Supporter DigiCert DigiCert EV certificate StatusPage StatusPage Status page