https://github.com/libigl/libigl-python-bindings
libigl python bindings
https://github.com/libigl/libigl-python-bindings
conda easy-to-use fast geometry-processing python
Last synced: 14 days ago
JSON representation
libigl python bindings
- Host: GitHub
- URL: https://github.com/libigl/libigl-python-bindings
- Owner: libigl
- License: gpl-3.0
- Created: 2019-03-29T14:39:48.000Z (about 6 years ago)
- Default Branch: main
- Last Pushed: 2024-10-29T21:26:44.000Z (6 months ago)
- Last Synced: 2024-10-29T21:31:25.401Z (6 months ago)
- Topics: conda, easy-to-use, fast, geometry-processing, python
- Language: C++
- Homepage: https://libigl.github.io/libigl-python-bindings/
- Size: 71.2 MB
- Stars: 317
- Watchers: 13
- Forks: 62
- Open Issues: 46
-
Metadata Files:
- Readme: README.md
- License: LICENSE.GPL
Awesome Lists containing this project
README
# libigl Python Bindings
[](https://pypi.org/project/libigl/)
[](https://github.com/libigl/libigl-python-bindings/actions/workflows/wheels.yml?query=branch%3Amain)This repository contains the source code for the python bindings for the C++
[libigl](https://github.com/libigl/libigl) library written using
[nanobind](https://nanobind.readthedocs.io/en/latest/). Functions allow NumPy
arrays as input and output for dense matrices and vectors and SciPy sparse
matrices for sparse matrices.## Installation
```
python -m pip install libigl
```## Documentation
| :warning: WARNING |
|:----------------------------|
| The [python-binding documentation](https://libigl.github.io/libigl-python-bindings/) is perennially out of date and will likely be removed/changed. |* A tutorial on how to use the bindings can be found [here](https://libigl.github.io/libigl-python-bindings/tutorials/)
* A function reference can be found [here](https://libigl.github.io/libigl-python-bindings/igl_docs/)## Getting the current version of libigl within python code
Since version 2.5.4.dev0, the `igl.__version__` attribute has been removed. To
get the version of the libigl package you're using within your python code, you
can use the following code:```
import importlib.metadata
libigl_version = importlib.metadata.version('libigl')
```The version of libigl is defined in the [pyproject.toml](./pyproject.toml) file.
## Compiling and modifying the bindiings
According to the [scikit-build-core documentation](https://scikit-build-core.readthedocs.io/en/latest/configuration.html#editable-installs), the way to make an editable (incremental) build is to:
1. Preinstall the dependencies (at the top of pyproject.toml
2. Then use this very long command:```
python -m pip install --no-build-isolation --config-settings=editable.rebuild=true -Cbuild-dir=build -ve.
```### Adding a missing binding
Bindings are fairly mechanical to write. For example, suppose we didn't have a
binding for the c++ function `igl::moments`. The first step would be to look at
the corresponding `.h` header file in the C++ libigl library:
[moments.h](https://github.com/libigl/libigl/blob/main/include/igl/moments.h).Then we would create the [src/moments.cpp](src/moments.cpp) file in this project
which uses `Eigen::MatrixXN` for numeric types and `Eigen::MatrixXI` for integer
types. Typically this requires a simple wrapper around the function matching
its signature to these types and some boilerplate `void bind_moments(...` code which adds the function to the python module.Simply adding this `.cpp` file will be enough to add the bindings on the next
build.If submitting a pull request with a new binding, please also add an execution
test in `tests/test_all.py` to ensure the binding can at least be called as
expected.## Testing cibuildwheel locally
Install whichever version of Python from the [official website](https://www.python.org/downloads/) and then run:
/Library/Frameworks/Python.framework/Versions/[version]/bin/python -m pip install cibuildwheel
CIBW_BUILD="cp311-*" python -m cibuildwheel --output-dir wheelhouse --platform macos## Downloading all the artifacts
A successful [.github/workflows/wheels.yml](.github/workflows/wheels.yml) run will a lot of `.whl` files. To download these all at once, you can use the following command:
mkdir wheelhouse
cd wheelhouse
gh run download [runid]Then these can be uploaded to pypi using:
python -m twine upload --repository testpypi wheelhouse/*/*.whl wheelhouse/*/*.tar.gz
## Acknowledgements
The original python bindings were generated and maintained by
[@teseoch](https://github.com/teseoch),
[@KarlLeell](https://github.com/KarlLeell),
[@fwilliams](https://github.com/fwilliams),
[@skoch9](https://github.com/skoch9), and
[@danielepanozzo](https://github.com/danielepanozzo)The modern python bindings (since 2.5.4.dev0) can largely be blamed on
[@alecjacobson](https://github.com/alecjacobson).