{"id":34621991,"url":"https://github.com/pyvista/pymeshfix","last_synced_at":"2026-04-24T00:01:07.506Z","repository":{"id":37488704,"uuid":"68728824","full_name":"pyvista/pymeshfix","owner":"pyvista","description":"Python Wrapper for MeshFix: easily repair holes in surface meshes","archived":false,"fork":false,"pushed_at":"2026-04-02T02:40:05.000Z","size":59494,"stargazers_count":380,"open_issues_count":2,"forks_count":33,"subscribers_count":13,"default_branch":"main","last_synced_at":"2026-04-02T15:49:37.658Z","etag":null,"topics":["3d","3d-reconstruction","mesh","mesh-processing"],"latest_commit_sha":null,"homepage":"http://pymeshfix.pyvista.org","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pyvista.png","metadata":{"files":{"readme":"README.rst","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2016-09-20T15:59:08.000Z","updated_at":"2026-04-02T06:54:13.000Z","dependencies_parsed_at":"2023-02-09T13:45:15.168Z","dependency_job_id":"66dfe4dd-a89c-4c83-9d4c-f600e549bb60","html_url":"https://github.com/pyvista/pymeshfix","commit_stats":{"total_commits":107,"total_committers":5,"mean_commits":21.4,"dds":"0.20560747663551404","last_synced_commit":"ce69762a29602b2fb13b53df6e73ebddf7963b55"},"previous_names":[],"tags_count":21,"template":false,"template_full_name":null,"purl":"pkg:github/pyvista/pymeshfix","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pyvista%2Fpymeshfix","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pyvista%2Fpymeshfix/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pyvista%2Fpymeshfix/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pyvista%2Fpymeshfix/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pyvista","download_url":"https://codeload.github.com/pyvista/pymeshfix/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pyvista%2Fpymeshfix/sbom","scorecard":{"id":752495,"data":{"date":"2025-08-11","repo":{"name":"github.com/pyvista/pymeshfix","commit":"fcf0265b37c704c8e4a0749adb258e36089859e6"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":4.5,"checks":[{"name":"Maintained","score":2,"reason":"3 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 2","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Code-Review","score":6,"reason":"Found 5/8 approved changesets -- score normalized to 6","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/build-and-deploy.yml:1","Warn: no topLevel permission defined: .github/workflows/docbuild.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build-and-deploy.yml:25: update your workflow using https://app.stepsecurity.io/secureworkflow/pyvista/pymeshfix/build-and-deploy.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/build-and-deploy.yml:28: update your workflow using https://app.stepsecurity.io/secureworkflow/pyvista/pymeshfix/build-and-deploy.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build-and-deploy.yml:30: update your workflow using https://app.stepsecurity.io/secureworkflow/pyvista/pymeshfix/build-and-deploy.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build-and-deploy.yml:39: update your workflow using https://app.stepsecurity.io/secureworkflow/pyvista/pymeshfix/build-and-deploy.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build-and-deploy.yml:40: update your workflow using https://app.stepsecurity.io/secureworkflow/pyvista/pymeshfix/build-and-deploy.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build-and-deploy.yml:59: update your workflow using https://app.stepsecurity.io/secureworkflow/pyvista/pymeshfix/build-and-deploy.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build-and-deploy.yml:72: update your workflow using https://app.stepsecurity.io/secureworkflow/pyvista/pymeshfix/build-and-deploy.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/build-and-deploy.yml:77: update your workflow using https://app.stepsecurity.io/secureworkflow/pyvista/pymeshfix/build-and-deploy.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/build-and-deploy.yml:83: update your workflow using https://app.stepsecurity.io/secureworkflow/pyvista/pymeshfix/build-and-deploy.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/docbuild.yml:17: update your workflow using https://app.stepsecurity.io/secureworkflow/pyvista/pymeshfix/docbuild.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/docbuild.yml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/pyvista/pymeshfix/docbuild.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/docbuild.yml:28: update your workflow using https://app.stepsecurity.io/secureworkflow/pyvista/pymeshfix/docbuild.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/docbuild.yml:39: update your workflow using https://app.stepsecurity.io/secureworkflow/pyvista/pymeshfix/docbuild.yml/main?enable=pin","Warn: pipCommand not pinned by hash: .github/workflows/build-and-deploy.yml:46","Warn: pipCommand not pinned by hash: .github/workflows/build-and-deploy.yml:52","Warn: pipCommand not pinned by hash: .github/workflows/build-and-deploy.yml:55","Warn: pipCommand not pinned by hash: .github/workflows/docbuild.yml:32","Warn: pipCommand not pinned by hash: .github/workflows/docbuild.yml:35","Info:   0 out of   8 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   5 third-party GitHubAction dependencies pinned","Info:   0 out of   5 pipCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: GNU General Public License v3.0: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"Signed-Releases","score":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact v0.17.1 not signed: https://api.github.com/repos/pyvista/pymeshfix/releases/214892755","Warn: release artifact v0.17.0 not signed: https://api.github.com/repos/pyvista/pymeshfix/releases/161720856","Warn: release artifact v0.16.3 not signed: https://api.github.com/repos/pyvista/pymeshfix/releases/143501175","Warn: release artifact v0.17.1 does not have provenance: https://api.github.com/repos/pyvista/pymeshfix/releases/214892755","Warn: release artifact v0.17.0 does not have provenance: https://api.github.com/repos/pyvista/pymeshfix/releases/161720856","Warn: release artifact v0.16.3 does not have provenance: https://api.github.com/repos/pyvista/pymeshfix/releases/143501175"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Packaging","score":10,"reason":"packaging workflow detected","details":["Info: Project packages its releases by way of GitHub Actions.: .github/workflows/build-and-deploy.yml:64"],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 30 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-22T20:44:34.160Z","repository_id":37488704,"created_at":"2025-08-22T20:44:34.161Z","updated_at":"2025-08-22T20:44:34.161Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32203362,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-23T20:19:26.138Z","status":"ssl_error","status_checked_at":"2026-04-23T20:19:23.520Z","response_time":53,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["3d","3d-reconstruction","mesh","mesh-processing"],"created_at":"2025-12-24T15:24:42.820Z","updated_at":"2026-04-24T00:01:07.494Z","avatar_url":"https://github.com/pyvista.png","language":"C++","funding_links":[],"categories":["Mesh Processing"],"sub_categories":[],"readme":"###########\n PyMeshFix\n###########\n\n.. |pypi| image:: https://img.shields.io/pypi/v/pymeshfix.svg?logo=python\u0026logoColor=white\n   :target: https://pypi.org/project/pymeshfix/\n\nPython/Cython wrapper of Marco Attene's wonderful, award-winning\n`MeshFix \u003chttps://github.com/MarcoAttene/MeshFix-V2.1\u003e`__ software. This\nmodule brings the speed of C++ with the portability and ease of\ninstallation of Python.\n\nThis software takes as input a polygon mesh and produces a copy of the\ninput where all the occurrences of a specific set of \"defects\" are\ncorrected. MeshFix has been designed to correct typical flaws present in\nraw digitized mesh models, thus it might fail or produce coarse results\nif run on other sorts of input meshes (e.g. tessellated CAD models).\n\nThe input is assumed to represent a single closed solid object, thus the\noutput will be a single watertight triangle mesh bounding a polyhedron.\nAll the singularities, self-intersections and degenerate elements are\nremoved from the input, while regions of the surface without defects are\nleft unmodified.\n\nUses MeshFix v2.1 with several quality of life fixes.\n\n**************\n Installation\n**************\n\nFrom `PyPI \u003chttps://pypi.python.org/pypi/pymeshfix\u003e`__\n\n.. code:: bash\n\n   pip install pymeshfix\n\nFrom source at `GitHub \u003chttps://github.com/pyvista/pymeshfix\u003e`__\n\n.. code:: bash\n\n   git clone https://github.com/pyvista/pymeshfix\n   cd pymeshfix\n   pip install .\n\n**************\n Dependencies\n**************\n\nRequires ``numpy`` and optionally ``pyvista``.\n\nIf you'd like to install PyVista, you can install it with:\n\n.. code::\n\n   pip install pymeshfix[extras]\n\nInstall PyVista to allow you to plot directly from ``pymeshfix``.\n\n**********\n Examples\n**********\n\nTest installation with the following from Python:\n\n.. code:: python\n\n   from pymeshfix import examples\n\n   # Test of pymeshfix without VTK module\n   examples.native()\n\n   # Performs same mesh repair while leveraging VTK's plotting/mesh loading\n   examples.with_vtk()\n\n**************\n Easy Example\n**************\n\nThis example uses the Cython wrapper directly. No bells or whistles\nhere:\n\n.. code:: python\n\n   import pymeshfix\n\n   # Read mesh from infile and output cleaned mesh to outfile\n   pymeshfix.clean_from_file(infile, outfile)\n\nThis example assumes the user has vertex and faces arrays in Python.\n\n.. code:: python\n\n   import pymeshfix\n\n   # Generate vertex and face arrays of cleaned mesh\n   # where v and f are numpy arrays\n   vclean, fclean = pymeshfix.clean_from_arrays(v, f)\n\n****************************************\n Complete Examples with and without VTK\n****************************************\n\nOne of the main reasons to bring MeshFix to Python is to allow the\nlibrary to communicate to other Python libraries without having to use\nfiles. Therefore, this example assumes that you have a mesh within\nmemory and wish to repair it using MeshFix.\n\n.. code:: python\n\n   import pymeshfix\n\n   # Create object from vertex and face arrays\n   meshfix = pymeshfix.MeshFix(v, f)\n\n   # Plot input\n   meshfix.plot()\n\n   # Repair input mesh\n   meshfix.repair()\n\n   # Access the repaired mesh with vtk\n   mesh = meshfix.mesh\n\n   # Or, access the resulting arrays directly from the object\n   meshfix.points # numpy np.float64 array\n   meshfix.faces # numpy np.int32 array\n\n   # View the repaired mesh (requires pyvista)\n   meshfix.plot()\n\n   # Save the mesh\n   meshfix.write('out.ply')\n\nAlternatively, the user could use the Cython wrapper of MeshFix directly\nif vtk is unavailable or they wish to have more control over the\ncleaning algorithm.\n\n.. code:: python\n\n   import pymeshfix\n\n   # Create TMesh object\n   tin = pymeshfix.PyTMesh()\n\n   tin.LoadFile(infile)\n   # tin.load_array(v, f) # or read arrays from memory\n\n   # Attempt to join nearby components\n   # tin.join_closest_components()\n\n   # Fill holes\n   tin.fill_small_boundaries()\n   print(f'There are {tin.boundaries()} boundaries')\n\n   # Clean (removes self intersections)\n   tin.clean(max_iters=10, inner_loops=3)\n\n   # Check mesh for holes again\n   print(f'There are {tin.boundaries()} boundaries')\n\n   # Clean again if necessary...\n\n   # Output mesh\n   tin.save_file(outfile)\n\n    # or return numpy arrays\n   vclean, fclean = tin.return_arrays()\n\n*******************************\n Algorithm and Citation Policy\n*******************************\n\nTo better understand how the algorithm works, please refer to the\nfollowing paper:\n\n   M. Attene. A lightweight approach to repairing digitized polygon\n   meshes. The Visual Computer, 2010. (c) Springer. DOI:\n   10.1007/s00371-010-0416-3\n\nThis software is based on ideas published therein. If you use MeshFix\nfor research purposes you should cite the above paper in your published\nresults. MeshFix cannot be used for commercial purposes without a proper\nlicensing contract.\n\n***********\n Copyright\n***********\n\nMeshFix is Copyright(C) 2010: IMATI-GE / CNR\n\nAll rights reserved.\n\nThis program is dual-licensed as follows:\n\n(1) You may use MeshFix as free software; you can redistribute it and/or\nmodify it under the terms of the GNU General Public License as published\nby the Free Software Foundation; either version 3 of the License, or (at\nyour option) any later version.\n\nIn this case the program is distributed in the hope that it will be\nuseful, but WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\nPublic License (http://www.gnu.org/licenses/gpl.txt) for more details.\n\n(2) You may use MeshFix as part of a commercial software. In this case a\nproper agreement must be reached with the Authors and with IMATI-GE/CNR\nbased on a proper licensing contract.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpyvista%2Fpymeshfix","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpyvista%2Fpymeshfix","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpyvista%2Fpymeshfix/lists"}