liblaf-melon 0.2.4__tar.gz → 0.2.6__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- liblaf_melon-0.2.6/PKG-INFO +154 -0
- liblaf_melon-0.2.6/README.md +109 -0
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/pyproject.toml +12 -23
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/__init__.pyi +12 -4
- liblaf_melon-0.2.6/src/liblaf/melon/__main__.py +4 -0
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/_version.py +2 -2
- liblaf_melon-0.2.6/src/liblaf/melon/cli/__init__.pyi +3 -0
- liblaf_melon-0.2.6/src/liblaf/melon/cli/__main__.py +4 -0
- liblaf_melon-0.2.6/src/liblaf/melon/cli/_app.py +25 -0
- liblaf_melon-0.2.6/src/liblaf/melon/cli/_info.py +43 -0
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/io/abc/_reader.py +1 -1
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/io/abc/_writer.py +1 -1
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/io/paraview/_series_writer.py +1 -1
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/io/pyvista/point_set/convert/_convert.py +2 -0
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/io/pyvista/point_set/convert/_poly_data.py +5 -1
- liblaf_melon-0.2.6/src/liblaf/melon/io/pyvista/point_set/convert/_trimesh.py +21 -0
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/io/pyvista/poly_data/reader/_obj.py +1 -1
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/io/wrap/landmarks/_reader.py +1 -1
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/io/wrap/landmarks/_writer.py +1 -1
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/io/wrap/polygons/_reader.py +1 -1
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/io/wrap/polygons/_writer.py +1 -1
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/plugin/_mesh_fix.py +8 -5
- liblaf_melon-0.2.6/src/liblaf/melon/proximity/__init__.pyi +21 -0
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/proximity/_abc.py +5 -5
- liblaf_melon-0.2.6/src/liblaf/melon/proximity/_nearest.py +27 -0
- liblaf_melon-0.2.6/src/liblaf/melon/proximity/_nearest_point.py +172 -0
- liblaf_melon-0.2.6/src/liblaf/melon/proximity/_nearest_point_on_surface.py +138 -0
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/triangle/__init__.pyi +2 -0
- liblaf_melon-0.2.6/src/liblaf/melon/triangle/_is_volume.py +10 -0
- liblaf_melon-0.2.6/src/liblaf/melon/utils/__init__.py +3 -0
- liblaf_melon-0.2.4/PKG-INFO +0 -53
- liblaf_melon-0.2.4/docs/README.md +0 -1
- liblaf_melon-0.2.4/src/liblaf/melon/proximity/__init__.pyi +0 -12
- liblaf_melon-0.2.4/src/liblaf/melon/proximity/_nearest.py +0 -11
- liblaf_melon-0.2.4/src/liblaf/melon/proximity/_nearest_point.py +0 -44
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/.gitignore +0 -0
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/LICENSE +0 -0
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/__init__.py +0 -0
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/_version.pyi +0 -0
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/barycentric/__init__.py +0 -0
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/barycentric/__init__.pyi +0 -0
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/barycentric/_points.py +0 -0
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/barycentric/_sample.py +0 -0
- {liblaf_melon-0.2.4/src/liblaf/melon/io → liblaf_melon-0.2.6/src/liblaf/melon/cli}/__init__.py +0 -0
- {liblaf_melon-0.2.4/src/liblaf/melon/io/abc → liblaf_melon-0.2.6/src/liblaf/melon/io}/__init__.py +0 -0
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/io/__init__.pyi +0 -0
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/io/_save.py +0 -0
- {liblaf_melon-0.2.4/src/liblaf/melon/io/paraview → liblaf_melon-0.2.6/src/liblaf/melon/io/abc}/__init__.py +0 -0
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/io/abc/__init__.pyi +0 -0
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/io/abc/_converter.py +0 -0
- {liblaf_melon-0.2.4/src/liblaf/melon/io/pyvista → liblaf_melon-0.2.6/src/liblaf/melon/io/paraview}/__init__.py +0 -0
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/io/paraview/__init__.pyi +0 -0
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/io/paraview/_pvd_writer.py +0 -0
- {liblaf_melon-0.2.4/src/liblaf/melon/io/pyvista/point_set → liblaf_melon-0.2.6/src/liblaf/melon/io/pyvista}/__init__.py +0 -0
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/io/pyvista/__init__.pyi +0 -0
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/io/pyvista/_convert.py +0 -0
- {liblaf_melon-0.2.4/src/liblaf/melon/io/pyvista/point_set/convert → liblaf_melon-0.2.6/src/liblaf/melon/io/pyvista/point_set}/__init__.py +0 -0
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/io/pyvista/point_set/__init__.pyi +0 -0
- {liblaf_melon-0.2.4/src/liblaf/melon/io/pyvista/poly_data → liblaf_melon-0.2.6/src/liblaf/melon/io/pyvista/point_set/convert}/__init__.py +0 -0
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/io/pyvista/point_set/convert/__init__.pyi +0 -0
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/io/pyvista/point_set/convert/_array.py +0 -0
- {liblaf_melon-0.2.4/src/liblaf/melon/io/pyvista/poly_data/convert → liblaf_melon-0.2.6/src/liblaf/melon/io/pyvista/poly_data}/__init__.py +0 -0
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/io/pyvista/poly_data/__init__.pyi +0 -0
- {liblaf_melon-0.2.4/src/liblaf/melon/io/pyvista/poly_data/reader → liblaf_melon-0.2.6/src/liblaf/melon/io/pyvista/poly_data/convert}/__init__.py +0 -0
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/io/pyvista/poly_data/convert/__init__.pyi +0 -0
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/io/pyvista/poly_data/convert/_convert.py +0 -0
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/io/pyvista/poly_data/convert/_mapping.py +0 -0
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/io/pyvista/poly_data/convert/_wrap.py +0 -0
- {liblaf_melon-0.2.4/src/liblaf/melon/io/pyvista/poly_data/writer → liblaf_melon-0.2.6/src/liblaf/melon/io/pyvista/poly_data/reader}/__init__.py +0 -0
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/io/pyvista/poly_data/reader/__init__.pyi +0 -0
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/io/pyvista/poly_data/reader/_load.py +0 -0
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/io/pyvista/poly_data/reader/_pyvista.py +0 -0
- {liblaf_melon-0.2.4/src/liblaf/melon/io/pyvista/unstructured_grid → liblaf_melon-0.2.6/src/liblaf/melon/io/pyvista/poly_data/writer}/__init__.py +0 -0
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/io/pyvista/poly_data/writer/__init__.pyi +0 -0
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/io/pyvista/poly_data/writer/_pyvista.py +0 -0
- {liblaf_melon-0.2.4/src/liblaf/melon/io/pyvista/unstructured_grid/convert → liblaf_melon-0.2.6/src/liblaf/melon/io/pyvista/unstructured_grid}/__init__.py +0 -0
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/io/pyvista/unstructured_grid/__init__.pyi +0 -0
- {liblaf_melon-0.2.4/src/liblaf/melon/io/pyvista/unstructured_grid/reader → liblaf_melon-0.2.6/src/liblaf/melon/io/pyvista/unstructured_grid/convert}/__init__.py +0 -0
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/io/pyvista/unstructured_grid/convert/__init__.pyi +0 -0
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/io/pyvista/unstructured_grid/convert/_convert.py +0 -0
- {liblaf_melon-0.2.4/src/liblaf/melon/io/pyvista/unstructured_grid/writer → liblaf_melon-0.2.6/src/liblaf/melon/io/pyvista/unstructured_grid/reader}/__init__.py +0 -0
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/io/pyvista/unstructured_grid/reader/__init__.pyi +0 -0
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/io/pyvista/unstructured_grid/reader/_pyvista.py +0 -0
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/io/pyvista/unstructured_grid/reader/_reader.py +0 -0
- {liblaf_melon-0.2.4/src/liblaf/melon/io/trimesh → liblaf_melon-0.2.6/src/liblaf/melon/io/pyvista/unstructured_grid/writer}/__init__.py +0 -0
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/io/pyvista/unstructured_grid/writer/__init__.pyi +0 -0
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/io/pyvista/unstructured_grid/writer/_pyvista.py +0 -0
- {liblaf_melon-0.2.4/src/liblaf/melon/io/trimesh/convert → liblaf_melon-0.2.6/src/liblaf/melon/io/trimesh}/__init__.py +0 -0
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/io/trimesh/__init__.pyi +0 -0
- {liblaf_melon-0.2.4/src/liblaf/melon/io/trimesh/reader → liblaf_melon-0.2.6/src/liblaf/melon/io/trimesh/convert}/__init__.py +0 -0
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/io/trimesh/convert/__init__.pyi +0 -0
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/io/trimesh/convert/_convert.py +0 -0
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/io/trimesh/convert/_poly_data.py +0 -0
- {liblaf_melon-0.2.4/src/liblaf/melon/io/trimesh/writer → liblaf_melon-0.2.6/src/liblaf/melon/io/trimesh/reader}/__init__.py +0 -0
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/io/trimesh/reader/__init__.pyi +0 -0
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/io/trimesh/reader/_reader.py +0 -0
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/io/trimesh/reader/_trimesh.py +0 -0
- {liblaf_melon-0.2.4/src/liblaf/melon/io/wrap → liblaf_melon-0.2.6/src/liblaf/melon/io/trimesh/writer}/__init__.py +0 -0
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/io/trimesh/writer/__init__.pyi +0 -0
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/io/trimesh/writer/_trimesh.py +0 -0
- {liblaf_melon-0.2.4/src/liblaf/melon/io/wrap/landmarks → liblaf_melon-0.2.6/src/liblaf/melon/io/wrap}/__init__.py +0 -0
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/io/wrap/__init__.pyi +0 -0
- {liblaf_melon-0.2.4/src/liblaf/melon/io/wrap/polygons → liblaf_melon-0.2.6/src/liblaf/melon/io/wrap/landmarks}/__init__.py +0 -0
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/io/wrap/landmarks/__init__.pyi +0 -0
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/io/wrap/landmarks/_utils.py +0 -0
- {liblaf_melon-0.2.4/src/liblaf/melon/mesh → liblaf_melon-0.2.6/src/liblaf/melon/io/wrap/polygons}/__init__.py +0 -0
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/io/wrap/polygons/__init__.pyi +0 -0
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/io/wrap/polygons/_utils.py +0 -0
- {liblaf_melon-0.2.4/src/liblaf/melon/plugin → liblaf_melon-0.2.6/src/liblaf/melon/mesh}/__init__.py +0 -0
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/mesh/__init__.pyi +0 -0
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/mesh/_graph.py +0 -0
- {liblaf_melon-0.2.4/src/liblaf/melon/plugin/wrap → liblaf_melon-0.2.6/src/liblaf/melon/plugin}/__init__.py +0 -0
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/plugin/__init__.pyi +0 -0
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/plugin/_tetwild.py +0 -0
- {liblaf_melon-0.2.4/src/liblaf/melon/proximity → liblaf_melon-0.2.6/src/liblaf/melon/plugin/wrap}/__init__.py +0 -0
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/plugin/wrap/__init__.pyi +0 -0
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/plugin/wrap/_annotate_landmarks.py +0 -0
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/plugin/wrap/_fast_wrapping.py +0 -0
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/plugin/wrap/annotate-landmarks.wrap +0 -0
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/plugin/wrap/fast-wrapping.wrap +0 -0
- {liblaf_melon-0.2.4/src/liblaf/melon/tetra → liblaf_melon-0.2.6/src/liblaf/melon/proximity}/__init__.py +0 -0
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/py.typed +0 -0
- {liblaf_melon-0.2.4/src/liblaf/melon/triangle → liblaf_melon-0.2.6/src/liblaf/melon/tetra}/__init__.py +0 -0
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/tetra/__init__.pyi +0 -0
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/tetra/_flip.py +0 -0
- {liblaf_melon-0.2.4/src/liblaf/melon/typed → liblaf_melon-0.2.6/src/liblaf/melon/triangle}/__init__.py +0 -0
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/triangle/_boolean.py +0 -0
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/triangle/_compute_edge_length.py +0 -0
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/triangle/_extract.py +0 -0
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/triangle/_ray.py +0 -0
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/triangle/_selection.py +0 -0
- {liblaf_melon-0.2.4/src/liblaf/melon/utils → liblaf_melon-0.2.6/src/liblaf/melon/typed}/__init__.py +0 -0
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/typed/__init__.pyi +0 -0
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/typed/_misc.py +0 -0
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/utils/__init__.pyi +0 -0
- {liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/utils/_typing.py +0 -0
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: liblaf-melon
|
|
3
|
+
Version: 0.2.6
|
|
4
|
+
Summary: Add your description here
|
|
5
|
+
Project-URL: Changelog, https://github.com/liblaf/melon/blob/main/CHANGELOG.md
|
|
6
|
+
Project-URL: Documentation, https://liblaf.github.io/melon/
|
|
7
|
+
Project-URL: Homepage, https://github.com/liblaf/melon
|
|
8
|
+
Project-URL: Issue Tracker, https://github.com/liblaf/melon/issues
|
|
9
|
+
Project-URL: Release Notes, https://github.com/liblaf/melon/releases
|
|
10
|
+
Project-URL: Source Code, https://github.com/liblaf/melon
|
|
11
|
+
Author-email: liblaf <30631553+liblaf@users.noreply.github.com>
|
|
12
|
+
License-Expression: MIT
|
|
13
|
+
License-File: LICENSE
|
|
14
|
+
Classifier: Development Status :: 4 - Beta
|
|
15
|
+
Classifier: Intended Audience :: Developers
|
|
16
|
+
Classifier: License :: OSI Approved
|
|
17
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
18
|
+
Classifier: Operating System :: OS Independent
|
|
19
|
+
Classifier: Programming Language :: Python
|
|
20
|
+
Classifier: Programming Language :: Python :: 3
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
22
|
+
Classifier: Typing :: Typed
|
|
23
|
+
Requires-Python: >=3.12
|
|
24
|
+
Requires-Dist: attrs<26,>=25.3.0
|
|
25
|
+
Requires-Dist: cyclopts<4,>=3.16.1
|
|
26
|
+
Requires-Dist: einops<0.9,>=0.8.1
|
|
27
|
+
Requires-Dist: glom<25,>=24.11.0
|
|
28
|
+
Requires-Dist: jaxtyping<0.4,>=0.3.2
|
|
29
|
+
Requires-Dist: lazy-loader<0.5,>=0.4
|
|
30
|
+
Requires-Dist: liblaf-grapes<0.2,>=0.1.27
|
|
31
|
+
Requires-Dist: loguru<0.8,>=0.7.3
|
|
32
|
+
Requires-Dist: meshio<6,>=5.3.5
|
|
33
|
+
Requires-Dist: networkx<4,>=3.4.2
|
|
34
|
+
Requires-Dist: numpy
|
|
35
|
+
Requires-Dist: polars<2,>=1.30.0
|
|
36
|
+
Requires-Dist: pydantic<3,>=2.11.4
|
|
37
|
+
Requires-Dist: pydicom<4,>=3.0.1
|
|
38
|
+
Requires-Dist: pymeshfix<0.18,>=0.17.1
|
|
39
|
+
Requires-Dist: pyvista<0.46,>=0.45.2
|
|
40
|
+
Requires-Dist: rich<15,>=14.0.0
|
|
41
|
+
Requires-Dist: scipy
|
|
42
|
+
Requires-Dist: tinyobjloader==2.0.0rc13
|
|
43
|
+
Requires-Dist: trimesh[easy]<5,>=4.6.10
|
|
44
|
+
Description-Content-Type: text/markdown
|
|
45
|
+
|
|
46
|
+
<div align="center" markdown><a name="readme-top"></a>
|
|
47
|
+
|
|
48
|
+
<img src="https://raw.githubusercontent.com/microsoft/fluentui-emoji/main/assets/Melon/3D/melon_3d.png" style="height: 120px" />
|
|
49
|
+
<img src="https://gw.alipayobjects.com/zos/kitchen/qJ3l3EPsdW/split.svg" style="height: 120px" />
|
|
50
|
+
<img src="https://api.iconify.design/logos/python.svg" style="height: 120px; padding: 12px" />
|
|
51
|
+
|
|
52
|
+
# Melon
|
|
53
|
+
|
|
54
|
+
TODO: DESCRIPTION <br />
|
|
55
|
+
[**Explore the docs »**](https://liblaf.github.io/melon/)
|
|
56
|
+
|
|
57
|
+
[](https://pypi.org/project/liblaf-melon)
|
|
58
|
+
[](https://pypi.org/project/liblaf-melon)
|
|
59
|
+
[](https://pypi.org/project/liblaf-melon)
|
|
60
|
+
[](https://codecov.io/gh/liblaf/melon)
|
|
61
|
+
[](https://github.com/liblaf/melon/actions/workflows/test.yaml)
|
|
62
|
+
<br />
|
|
63
|
+
[](https://github.com/liblaf/melon/graphs/contributors)
|
|
64
|
+
[](https://github.com/liblaf/melon/forks)
|
|
65
|
+
[](https://github.com/liblaf/melon/stargazers)
|
|
66
|
+
[](https://github.com/liblaf/melon/issues)
|
|
67
|
+
[](https://github.com/liblaf/melon/blob/main/LICENSE)
|
|
68
|
+
|
|
69
|
+
[Changelog](https://github.com/liblaf/melon/blob/main/CHANGELOG.md) · [Report Bug](https://github.com/liblaf/melon/issues) · [Request Feature](https://github.com/liblaf/melon/issues)
|
|
70
|
+
|
|
71
|
+

|
|
72
|
+
|
|
73
|
+
</div>
|
|
74
|
+
|
|
75
|
+
## ✨ Features
|
|
76
|
+
|
|
77
|
+
- [x] ✨ **TODO:** FEATURES;
|
|
78
|
+
|
|
79
|
+
<div align="right" markdown>
|
|
80
|
+
|
|
81
|
+
[](#readme-top)
|
|
82
|
+
|
|
83
|
+
</div>
|
|
84
|
+
|
|
85
|
+
## 📦 Installation
|
|
86
|
+
|
|
87
|
+
To install `liblaf-melon`, run the following command:
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
$ uv add liblaf-melon
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
<div align="right" markdown>
|
|
94
|
+
|
|
95
|
+
[](#readme-top)
|
|
96
|
+
|
|
97
|
+
</div>
|
|
98
|
+
|
|
99
|
+
## ⌨️ Local Development
|
|
100
|
+
|
|
101
|
+
You can use Github Codespaces for online development:
|
|
102
|
+
|
|
103
|
+
[](https://codespaces.new/liblaf/melon)
|
|
104
|
+
|
|
105
|
+
Or clone it for local development:
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
$ gh repo clone liblaf/melon
|
|
109
|
+
$ cd melon
|
|
110
|
+
$ just test
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
<div align="right" markdown>
|
|
114
|
+
|
|
115
|
+
[](#readme-top)
|
|
116
|
+
|
|
117
|
+
</div>
|
|
118
|
+
|
|
119
|
+
## 🤝 Contributing
|
|
120
|
+
|
|
121
|
+
Contributions of all types are more than welcome, if you are interested in contributing code, feel free to check out our GitHub [Issues](https://github.com/liblaf/melon/issues) to get stuck in to show us what you're made of.
|
|
122
|
+
|
|
123
|
+
[](https://github.com/liblaf/melon/pulls)
|
|
124
|
+
|
|
125
|
+
[](https://github.com/liblaf/melon/graphs/contributors)
|
|
126
|
+
|
|
127
|
+
<div align="right" markdown>
|
|
128
|
+
|
|
129
|
+
[](#readme-top)
|
|
130
|
+
|
|
131
|
+
</div>
|
|
132
|
+
|
|
133
|
+
## 🔗 Links
|
|
134
|
+
|
|
135
|
+
### More Projects
|
|
136
|
+
|
|
137
|
+
- **[🍇 grapes](https://github.com/liblaf/grapes)** - Powerful Python utilities for logging, timing, and more, making development smoother!
|
|
138
|
+
|
|
139
|
+
### Credits
|
|
140
|
+
|
|
141
|
+
- **Python** - <https://www.python.org/>
|
|
142
|
+
|
|
143
|
+
<div align="right" markdown>
|
|
144
|
+
|
|
145
|
+
[](#readme-top)
|
|
146
|
+
|
|
147
|
+
</div>
|
|
148
|
+
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
#### 📝 License
|
|
152
|
+
|
|
153
|
+
Copyright © 2025 [liblaf](https://github.com/liblaf). <br />
|
|
154
|
+
This project is [MIT](https://github.com/liblaf/melon/blob/main/LICENSE) licensed.
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
<div align="center" markdown><a name="readme-top"></a>
|
|
2
|
+
|
|
3
|
+
<img src="https://raw.githubusercontent.com/microsoft/fluentui-emoji/main/assets/Melon/3D/melon_3d.png" style="height: 120px" />
|
|
4
|
+
<img src="https://gw.alipayobjects.com/zos/kitchen/qJ3l3EPsdW/split.svg" style="height: 120px" />
|
|
5
|
+
<img src="https://api.iconify.design/logos/python.svg" style="height: 120px; padding: 12px" />
|
|
6
|
+
|
|
7
|
+
# Melon
|
|
8
|
+
|
|
9
|
+
TODO: DESCRIPTION <br />
|
|
10
|
+
[**Explore the docs »**](https://liblaf.github.io/melon/)
|
|
11
|
+
|
|
12
|
+
[](https://pypi.org/project/liblaf-melon)
|
|
13
|
+
[](https://pypi.org/project/liblaf-melon)
|
|
14
|
+
[](https://pypi.org/project/liblaf-melon)
|
|
15
|
+
[](https://codecov.io/gh/liblaf/melon)
|
|
16
|
+
[](https://github.com/liblaf/melon/actions/workflows/test.yaml)
|
|
17
|
+
<br />
|
|
18
|
+
[](https://github.com/liblaf/melon/graphs/contributors)
|
|
19
|
+
[](https://github.com/liblaf/melon/forks)
|
|
20
|
+
[](https://github.com/liblaf/melon/stargazers)
|
|
21
|
+
[](https://github.com/liblaf/melon/issues)
|
|
22
|
+
[](https://github.com/liblaf/melon/blob/main/LICENSE)
|
|
23
|
+
|
|
24
|
+
[Changelog](https://github.com/liblaf/melon/blob/main/CHANGELOG.md) · [Report Bug](https://github.com/liblaf/melon/issues) · [Request Feature](https://github.com/liblaf/melon/issues)
|
|
25
|
+
|
|
26
|
+

|
|
27
|
+
|
|
28
|
+
</div>
|
|
29
|
+
|
|
30
|
+
## ✨ Features
|
|
31
|
+
|
|
32
|
+
- [x] ✨ **TODO:** FEATURES;
|
|
33
|
+
|
|
34
|
+
<div align="right" markdown>
|
|
35
|
+
|
|
36
|
+
[](#readme-top)
|
|
37
|
+
|
|
38
|
+
</div>
|
|
39
|
+
|
|
40
|
+
## 📦 Installation
|
|
41
|
+
|
|
42
|
+
To install `liblaf-melon`, run the following command:
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
$ uv add liblaf-melon
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
<div align="right" markdown>
|
|
49
|
+
|
|
50
|
+
[](#readme-top)
|
|
51
|
+
|
|
52
|
+
</div>
|
|
53
|
+
|
|
54
|
+
## ⌨️ Local Development
|
|
55
|
+
|
|
56
|
+
You can use Github Codespaces for online development:
|
|
57
|
+
|
|
58
|
+
[](https://codespaces.new/liblaf/melon)
|
|
59
|
+
|
|
60
|
+
Or clone it for local development:
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
$ gh repo clone liblaf/melon
|
|
64
|
+
$ cd melon
|
|
65
|
+
$ just test
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
<div align="right" markdown>
|
|
69
|
+
|
|
70
|
+
[](#readme-top)
|
|
71
|
+
|
|
72
|
+
</div>
|
|
73
|
+
|
|
74
|
+
## 🤝 Contributing
|
|
75
|
+
|
|
76
|
+
Contributions of all types are more than welcome, if you are interested in contributing code, feel free to check out our GitHub [Issues](https://github.com/liblaf/melon/issues) to get stuck in to show us what you're made of.
|
|
77
|
+
|
|
78
|
+
[](https://github.com/liblaf/melon/pulls)
|
|
79
|
+
|
|
80
|
+
[](https://github.com/liblaf/melon/graphs/contributors)
|
|
81
|
+
|
|
82
|
+
<div align="right" markdown>
|
|
83
|
+
|
|
84
|
+
[](#readme-top)
|
|
85
|
+
|
|
86
|
+
</div>
|
|
87
|
+
|
|
88
|
+
## 🔗 Links
|
|
89
|
+
|
|
90
|
+
### More Projects
|
|
91
|
+
|
|
92
|
+
- **[🍇 grapes](https://github.com/liblaf/grapes)** - Powerful Python utilities for logging, timing, and more, making development smoother!
|
|
93
|
+
|
|
94
|
+
### Credits
|
|
95
|
+
|
|
96
|
+
- **Python** - <https://www.python.org/>
|
|
97
|
+
|
|
98
|
+
<div align="right" markdown>
|
|
99
|
+
|
|
100
|
+
[](#readme-top)
|
|
101
|
+
|
|
102
|
+
</div>
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
#### 📝 License
|
|
107
|
+
|
|
108
|
+
Copyright © 2025 [liblaf](https://github.com/liblaf). <br />
|
|
109
|
+
This project is [MIT](https://github.com/liblaf/melon/blob/main/LICENSE) licensed.
|
|
@@ -7,11 +7,10 @@ requires = ["hatch-vcs", "hatchling"]
|
|
|
7
7
|
|
|
8
8
|
[dependency-groups]
|
|
9
9
|
build = ["check-wheel-contents", "hatch", "twine"]
|
|
10
|
-
dev = ["icecream"]
|
|
10
|
+
dev = ["icecream", "liblaf-cherries>=0.1.2,<0.2", "pygltflib"]
|
|
11
11
|
docs = [
|
|
12
12
|
"gitpython",
|
|
13
13
|
"mdx-truly-sane-lists",
|
|
14
|
-
"mike",
|
|
15
14
|
"mkdocs",
|
|
16
15
|
"mkdocs-autorefs",
|
|
17
16
|
"mkdocs-gen-files",
|
|
@@ -51,40 +50,33 @@ classifiers = [
|
|
|
51
50
|
]
|
|
52
51
|
dependencies = [
|
|
53
52
|
"attrs>=25.3.0,<26",
|
|
53
|
+
"cyclopts>=3.16.1,<4",
|
|
54
54
|
"einops>=0.8.1,<0.9",
|
|
55
|
-
"fast-simplification>=0.1.11,<0.2",
|
|
56
55
|
"glom>=24.11.0,<25",
|
|
57
56
|
"jaxtyping>=0.3.2,<0.4",
|
|
58
57
|
"lazy-loader>=0.4,<0.5",
|
|
59
|
-
"liblaf-
|
|
60
|
-
"liblaf-grapes>=0.1.23,<0.2",
|
|
58
|
+
"liblaf-grapes>=0.1.27,<0.2",
|
|
61
59
|
"loguru>=0.7.3,<0.8",
|
|
62
|
-
"matplotlib>=3.10.3,<4",
|
|
63
60
|
"meshio>=5.3.5,<6",
|
|
64
|
-
"
|
|
65
|
-
"
|
|
66
|
-
"polars>=1.
|
|
67
|
-
"pooch>=1.8.2,<2",
|
|
68
|
-
"pyacvd>=0.3.2,<0.4",
|
|
61
|
+
"networkx>=3.4.2,<4",
|
|
62
|
+
"numpy",
|
|
63
|
+
"polars>=1.30.0,<2",
|
|
69
64
|
"pydantic>=2.11.4,<3",
|
|
70
65
|
"pydicom>=3.0.1,<4",
|
|
71
|
-
"pygltflib>=1.16.4,<2",
|
|
72
66
|
"pymeshfix>=0.17.1,<0.18",
|
|
73
|
-
"pyvista>=0.45.
|
|
67
|
+
"pyvista>=0.45.2,<0.46",
|
|
74
68
|
"rich>=14.0.0,<15",
|
|
75
|
-
"scipy
|
|
76
|
-
"
|
|
77
|
-
"
|
|
78
|
-
"trimesh[easy]>=4.6.8,<5",
|
|
79
|
-
"typer>=0.15.3,<0.16",
|
|
69
|
+
"scipy",
|
|
70
|
+
"tinyobjloader==2.0.0rc13",
|
|
71
|
+
"trimesh[easy]>=4.6.10,<5",
|
|
80
72
|
]
|
|
81
73
|
description = "Add your description here"
|
|
82
74
|
dynamic = ["version"]
|
|
83
75
|
keywords = []
|
|
84
76
|
license = "MIT"
|
|
85
77
|
name = "liblaf-melon"
|
|
86
|
-
readme = "
|
|
87
|
-
requires-python = ">=3.12
|
|
78
|
+
readme = "README.md"
|
|
79
|
+
requires-python = ">=3.12"
|
|
88
80
|
|
|
89
81
|
[project.scripts]
|
|
90
82
|
melon = "liblaf.melon.cli:main"
|
|
@@ -127,9 +119,6 @@ platforms = ["linux-64"]
|
|
|
127
119
|
[tool.pixi.pypi-dependencies]
|
|
128
120
|
"liblaf-melon" = { editable = true, path = "." }
|
|
129
121
|
|
|
130
|
-
[tool.pixi.pypi-options]
|
|
131
|
-
index-url = "https://mirrors.cernet.edu.cn/pypi/web/simple"
|
|
132
|
-
|
|
133
122
|
[tool.pixi.system-requirements]
|
|
134
123
|
cuda = "12"
|
|
135
124
|
libc = { family = "glibc", version = "2.41" }
|
|
@@ -18,19 +18,27 @@ from .io import (
|
|
|
18
18
|
)
|
|
19
19
|
from .plugin import annotate_landmarks, fast_wrapping, mesh_fix, tetwild
|
|
20
20
|
from .proximity import (
|
|
21
|
-
|
|
21
|
+
NearestAlgorithm,
|
|
22
|
+
NearestAlgorithmPrepared,
|
|
22
23
|
NearestPoint,
|
|
24
|
+
NearestPointOnSurface,
|
|
25
|
+
NearestPointOnSurfacePrepared,
|
|
26
|
+
NearestPointOnSurfaceResult,
|
|
23
27
|
NearestPointPrepared,
|
|
24
|
-
|
|
28
|
+
NearestPointResult,
|
|
25
29
|
NearestResult,
|
|
26
30
|
nearest,
|
|
27
31
|
)
|
|
28
32
|
|
|
29
33
|
__all__ = [
|
|
30
|
-
"
|
|
34
|
+
"NearestAlgorithm",
|
|
35
|
+
"NearestAlgorithmPrepared",
|
|
31
36
|
"NearestPoint",
|
|
37
|
+
"NearestPointOnSurface",
|
|
38
|
+
"NearestPointOnSurfacePrepared",
|
|
39
|
+
"NearestPointOnSurfaceResult",
|
|
32
40
|
"NearestPointPrepared",
|
|
33
|
-
"
|
|
41
|
+
"NearestPointResult",
|
|
34
42
|
"NearestResult",
|
|
35
43
|
"PVDWriter",
|
|
36
44
|
"SeriesWriter",
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
from typing import Annotated
|
|
2
|
+
|
|
3
|
+
import cyclopts
|
|
4
|
+
|
|
5
|
+
from liblaf import grapes
|
|
6
|
+
from liblaf.melon import _version
|
|
7
|
+
|
|
8
|
+
from . import _info
|
|
9
|
+
|
|
10
|
+
app = cyclopts.App(name="melon", version=_version.__version__)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
@app.meta.default
|
|
14
|
+
def init(
|
|
15
|
+
*tokens: Annotated[str, cyclopts.Parameter(show=False, allow_leading_hyphen=True)],
|
|
16
|
+
) -> None:
|
|
17
|
+
grapes.init_logging()
|
|
18
|
+
app(tokens)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
app.command(_info.info)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def main() -> None:
|
|
25
|
+
app.meta()
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
from collections.abc import Container
|
|
2
|
+
from pathlib import Path
|
|
3
|
+
|
|
4
|
+
import pyvista as pv
|
|
5
|
+
import rich.pretty
|
|
6
|
+
|
|
7
|
+
from liblaf.melon import io
|
|
8
|
+
|
|
9
|
+
POLY_DATA_SUFFIXES: Container[str] = {".obj", ".off", ".ply", ".stl", ".vtp"}
|
|
10
|
+
UNSTRUCTURED_GRID_SUFFIXES: Container[str] = {".msh", ".vtu"}
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def info(
|
|
14
|
+
path: Path,
|
|
15
|
+
/,
|
|
16
|
+
*,
|
|
17
|
+
point_data: bool = True,
|
|
18
|
+
cell_data: bool = True,
|
|
19
|
+
field_data: bool = True,
|
|
20
|
+
field_data_values: bool = False,
|
|
21
|
+
user_dict: bool = True,
|
|
22
|
+
) -> None:
|
|
23
|
+
if path.suffix in POLY_DATA_SUFFIXES:
|
|
24
|
+
mesh: pv.PolyData = io.load_poly_data(path)
|
|
25
|
+
elif path.suffix in UNSTRUCTURED_GRID_SUFFIXES:
|
|
26
|
+
mesh: pv.UnstructuredGrid = io.load_unstructured_grid(path)
|
|
27
|
+
else:
|
|
28
|
+
msg: str = f"Unsupported file format: {path.suffix}"
|
|
29
|
+
raise ValueError(msg)
|
|
30
|
+
rich.pretty.pprint(mesh)
|
|
31
|
+
if point_data:
|
|
32
|
+
rich.pretty.pprint(mesh.point_data)
|
|
33
|
+
if cell_data:
|
|
34
|
+
rich.pretty.pprint(mesh.cell_data)
|
|
35
|
+
if field_data:
|
|
36
|
+
rich.pretty.pprint(mesh.field_data)
|
|
37
|
+
if field_data_values:
|
|
38
|
+
for name, data in mesh.field_data.items():
|
|
39
|
+
rich.print(f"{name}: ", end="")
|
|
40
|
+
rich.pretty.pprint(data)
|
|
41
|
+
if user_dict:
|
|
42
|
+
rich.print("User Dict: ", end="")
|
|
43
|
+
rich.pretty.pprint(mesh.user_dict)
|
|
@@ -49,7 +49,7 @@ class ReaderDispatcher[T]:
|
|
|
49
49
|
for reader in self.readers:
|
|
50
50
|
if reader.match_path(path):
|
|
51
51
|
data: T = reader.load(path, **kwargs)
|
|
52
|
-
logger.debug('Loaded {} from "{}".', type(data), path)
|
|
52
|
+
logger.opt(depth=2).debug('Loaded {} from "{}".', type(data), path)
|
|
53
53
|
return data
|
|
54
54
|
raise UnsupportedReaderError(self.dtype, path)
|
|
55
55
|
|
|
@@ -54,6 +54,6 @@ class WriterDispatcher:
|
|
|
54
54
|
if writer.match_data(data) and writer.match_path(path):
|
|
55
55
|
Path(path).parent.mkdir(parents=True, exist_ok=True)
|
|
56
56
|
writer.save(path, data, **kwargs)
|
|
57
|
-
logger.debug('Saved {} to "{}".', type(data), path)
|
|
57
|
+
logger.opt(depth=2).debug('Saved {} to "{}".', type(data), path)
|
|
58
58
|
return
|
|
59
59
|
raise UnsupportedWriterError(data, path)
|
|
@@ -111,7 +111,7 @@ class SeriesWriter(Sequence[File], contextlib.AbstractContextManager):
|
|
|
111
111
|
self.save()
|
|
112
112
|
|
|
113
113
|
def save(self) -> None:
|
|
114
|
-
grapes.
|
|
114
|
+
grapes.save(self.file, self.series.model_dump(by_alias=True))
|
|
115
115
|
|
|
116
116
|
def start(self) -> None:
|
|
117
117
|
pass
|
{liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/io/pyvista/point_set/convert/_convert.py
RENAMED
|
@@ -4,7 +4,9 @@ from liblaf.melon.io.abc import ConverterDispatcher
|
|
|
4
4
|
|
|
5
5
|
from ._array import ArrayToPointSet
|
|
6
6
|
from ._poly_data import PolyDataToPointSet
|
|
7
|
+
from ._trimesh import TrimeshToPointSet
|
|
7
8
|
|
|
8
9
|
as_point_set = ConverterDispatcher(pv.PointSet)
|
|
9
10
|
as_point_set.register(ArrayToPointSet())
|
|
10
11
|
as_point_set.register(PolyDataToPointSet())
|
|
12
|
+
as_point_set.register(TrimeshToPointSet())
|
|
@@ -13,5 +13,9 @@ class PolyDataToPointSet(AbstractConverter):
|
|
|
13
13
|
|
|
14
14
|
@override
|
|
15
15
|
def convert(self, data: pv.PolyData, /, **kwargs) -> pv.PointSet:
|
|
16
|
+
point_normals: bool = kwargs.pop("point_normals", False)
|
|
16
17
|
data.active_scalars_name = None
|
|
17
|
-
|
|
18
|
+
result: pv.PointSet = data.cast_to_pointset(**kwargs)
|
|
19
|
+
if point_normals:
|
|
20
|
+
result.point_data["Normals"] = data.point_normals
|
|
21
|
+
return result
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
from typing import Any, override
|
|
2
|
+
|
|
3
|
+
import pyvista as pv
|
|
4
|
+
import trimesh as tm
|
|
5
|
+
|
|
6
|
+
from liblaf.melon import utils
|
|
7
|
+
from liblaf.melon.io.abc import AbstractConverter
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class TrimeshToPointSet(AbstractConverter):
|
|
11
|
+
@override
|
|
12
|
+
def match_from(self, data: Any, /) -> bool:
|
|
13
|
+
return utils.is_trimesh(data)
|
|
14
|
+
|
|
15
|
+
@override
|
|
16
|
+
def convert(self, data: tm.Trimesh, /, **kwargs) -> pv.PointSet:
|
|
17
|
+
point_normals: bool = kwargs.pop("point_normals", False)
|
|
18
|
+
result: pv.PointSet = pv.PointSet(data.vertices)
|
|
19
|
+
if point_normals:
|
|
20
|
+
result.point_data["Normals"] = data.vertex_normals
|
|
21
|
+
return result
|
{liblaf_melon-0.2.4 → liblaf_melon-0.2.6}/src/liblaf/melon/io/pyvista/poly_data/reader/_obj.py
RENAMED
|
@@ -9,7 +9,7 @@ from liblaf.melon.typed import PathLike
|
|
|
9
9
|
|
|
10
10
|
class ObjReader(AbstractReader):
|
|
11
11
|
extensions: Container[str] = {".obj"}
|
|
12
|
-
precedence: int = 1
|
|
12
|
+
precedence: int = 1 # prefer over pyvista.read
|
|
13
13
|
|
|
14
14
|
@override
|
|
15
15
|
def load(self, path: PathLike, /, **kwargs) -> pv.PolyData:
|
|
@@ -11,5 +11,5 @@ from ._utils import get_landmarks_path
|
|
|
11
11
|
|
|
12
12
|
def load_landmarks(path: str | os.PathLike[str]) -> Float[np.ndarray, "N 3"]:
|
|
13
13
|
path: Path = get_landmarks_path(path)
|
|
14
|
-
data: list[dict[str, float]] = grapes.
|
|
14
|
+
data: list[dict[str, float]] = grapes.load(path)
|
|
15
15
|
return np.asarray([[p["x"], p["y"], p["z"]] for p in data])
|
|
@@ -4,6 +4,7 @@ from typing import Any
|
|
|
4
4
|
import pyvista as pv
|
|
5
5
|
|
|
6
6
|
from liblaf import grapes
|
|
7
|
+
from liblaf.melon import io, triangle
|
|
7
8
|
|
|
8
9
|
|
|
9
10
|
def mesh_fix(
|
|
@@ -15,19 +16,21 @@ def mesh_fix(
|
|
|
15
16
|
remove_smallest_components: bool = False,
|
|
16
17
|
) -> pv.PolyData:
|
|
17
18
|
if grapes.has_module("pymeshfix"):
|
|
18
|
-
|
|
19
|
+
result: pv.PolyData = _pymeshfix(
|
|
19
20
|
mesh,
|
|
20
21
|
verbose=verbose,
|
|
21
22
|
joincomp=joincomp,
|
|
22
23
|
remove_smallest_components=remove_smallest_components,
|
|
23
24
|
)
|
|
24
25
|
elif shutil.which("MeshFix"):
|
|
25
|
-
|
|
26
|
+
result: pv.PolyData = _mesh_fix_exe(mesh, verbose=verbose)
|
|
26
27
|
else:
|
|
27
28
|
raise NotImplementedError
|
|
28
29
|
if check:
|
|
29
|
-
|
|
30
|
-
|
|
30
|
+
assert triangle.is_volume(result)
|
|
31
|
+
mesh: pv.PolyData = io.as_poly_data(mesh)
|
|
32
|
+
result.field_data.update(mesh.field_data)
|
|
33
|
+
return result
|
|
31
34
|
|
|
32
35
|
|
|
33
36
|
def _pymeshfix(
|
|
@@ -39,7 +42,7 @@ def _pymeshfix(
|
|
|
39
42
|
) -> pv.PolyData:
|
|
40
43
|
with grapes.optional_imports():
|
|
41
44
|
import pymeshfix
|
|
42
|
-
|
|
45
|
+
mesh: pv.PolyData = io.as_poly_data(mesh)
|
|
43
46
|
fix = pymeshfix.MeshFix(mesh)
|
|
44
47
|
fix.repair(
|
|
45
48
|
verbose=verbose,
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
from ._abc import NearestAlgorithm, NearestAlgorithmPrepared, NearestResult
|
|
2
|
+
from ._nearest import nearest
|
|
3
|
+
from ._nearest_point import NearestPoint, NearestPointPrepared, NearestPointResult
|
|
4
|
+
from ._nearest_point_on_surface import (
|
|
5
|
+
NearestPointOnSurface,
|
|
6
|
+
NearestPointOnSurfacePrepared,
|
|
7
|
+
NearestPointOnSurfaceResult,
|
|
8
|
+
)
|
|
9
|
+
|
|
10
|
+
__all__ = [
|
|
11
|
+
"NearestAlgorithm",
|
|
12
|
+
"NearestAlgorithmPrepared",
|
|
13
|
+
"NearestPoint",
|
|
14
|
+
"NearestPointOnSurface",
|
|
15
|
+
"NearestPointOnSurfacePrepared",
|
|
16
|
+
"NearestPointOnSurfaceResult",
|
|
17
|
+
"NearestPointPrepared",
|
|
18
|
+
"NearestPointResult",
|
|
19
|
+
"NearestResult",
|
|
20
|
+
"nearest",
|
|
21
|
+
]
|