Skip to main content

nurbspy

Description

nurbspy is a Python package for Non-Uniform Rational Basis Spline (NURBS) curves and surfaces. The classes and methods were inspired by the algorithms presented in The NURBS Book and the code was implemented using vectorized Numpy functions and Numba's just-in-time compilation decorators to achieve C-like speed.

nurbspy aims to be a simple NURBS library, not a fully fledged CAD kernel. If you need a powerful, open source CAD kernel we recommend you to check out the C++ OpenCascade library. If you feel that OpenCascade is too complex or you are not sure how to start using it, this repository might be useful for you!

📚 Documentation: https://turbo-sim.github.io/nurbspy/

Capabilities

nurbspy represents both curves and surfaces as rational or non-rational Bézier / B-Spline / NURBS geometries, built directly from control points, weights, and knot vectors. For both, it provides:

  • Evaluation of coordinates and arbitrary-order analytical derivatives
  • Curvature (and, for surfaces, mean and Gaussian curvature)
  • Point projection / point inversion
  • Matplotlib-based visualization

Curves additionally offer the tangent, normal, and binormal unit vectors (Frenet-Serret frame), torsion, and arc-length by numerical quadrature. Surfaces additionally offer unit normal vectors, u- and v-isoparametric curves, and constructors for common special surfaces: bilinear, ruled, extruded, revolution, and Coons.

nurbspy also works with real and complex data types natively, so shape derivatives can be computed to machine precision with the complex-step method instead of finite differences. This is useful for shape-optimization problems with many design variables that rely on gradient-based algorithms; nurbspy is, to our knowledge, the only Python NURBS package with native complex-number support.

An optional JAX backend (nurbspy.jax) additionally provides automatic differentiation and JIT compilation, see Installation.

See the documentation for the theory behind these capabilities (Bézier, B-Spline, NURBS, and G² continuity) and the examples gallery, with complete scripts and their numerical and graphical output.

Installation

nurbspy requires Python 3.11 to 3.13. Install the latest release from PyPI:

pip install nurbspy

To also install the optional JAX backend and its supporting libraries:

pip install "nurbspy[jax]"

Use import nurbspy as nrb for the NumPy interface, or import nurbspy.jax as nrb for the JAX interface. The default installation does not install JAX. The JAX backend currently uses the CPU.

Verify the installation:

python -c "import nurbspy; print(nurbspy.__version__)"

If you installed the JAX extra, check it with:

python -c "import nurbspy.jax"

For installing from source, contributing, and running the test suite, see Getting started in the documentation.

Minimal working examples

NURBS curves

nurbspy can be used to create Bézier, B-Spline and NURBS curves. The type of curve depends on the arguments used to initialize the curve class. As an example, the following piece of code can be used to generate a degree four Bézier curve in two dimensions:

# Import packages
import numpy as np
import nurbspy as nrb
import matplotlib.pyplot as plt

# Define the array of control points
P = np.zeros((2,5))
P[:, 0] = [0.20, 0.50]
P[:, 1] = [0.40, 0.70]
P[:, 2] = [0.80, 0.60]
P[:, 3] = [0.80, 0.40]
P[:, 4] = [0.40, 0.20]

# Create and plot the Bezier curve
bezierCurve = nrb.NurbsCurve(control_points=P)
bezierCurve.plot()
plt.show()

If the installation was successful, you should be able to see the Bézier curve when you execute the previous code snippet.

Check out the documentation examples directory to see more examples showing the capabilities of the library and how to use them.

NURBS surfaces

Similarly, nurbspy can be used to create Bézier, B-Spline and NURBS surfaces. The type of surface depends on the arguments used to initialize the surface class. As an example, the following code snippet can be used to generate a simple Bézier surface of degree 3 in the u-direction and degree 2 in the v-direction:

# Import packages
import numpy as np
import nurbspy as nrb
import matplotlib.pyplot as plt

# Define the array of control points
n_dim, n, m = 3, 4, 3
P = np.zeros((n_dim, n, m))

# First row
P[:, 0, 0] = [0.00, 0.00, 0.00]
P[:, 1, 0] = [1.00, 0.00, 1.00]
P[:, 2, 0] = [2.00, 0.00, 1.00]
P[:, 3, 0] = [3.00, 0.00, 0.00]

# Second row
P[:, 0, 1] = [0.00, 1.00, 1.00]
P[:, 1, 1] = [1.00, 1.00, 2.00]
P[:, 2, 1] = [2.00, 1.00, 2.00]
P[:, 3, 1] = [3.00, 1.00, 1.00]

# Third row
P[:, 0, 2] = [0.00, 2.00, 0.00]
P[:, 1, 2] = [1.00, 2.00, 1.00]
P[:, 2, 2] = [2.00, 2.00, 1.00]
P[:, 3, 2] = [3.00, 2.00, 0.00]

# Create and plot the Bezier surface
bezierSurface = nrb.NurbsSurface(control_points=P)
bezierSurface.plot(control_points=True, isocurves_u=6, isocurves_v=6)
plt.show()

If the installation was successful, you should be able to see the Bézier surface when you execute the previous script.

Check out the documentation examples directory to see more examples showing the capabilities of the library and how to use them.

Contact information

nurbspy was originally developed by Roberto Agromayor under the supervision of Associate Professor Lars O. Nord at the Norwegian University of Science and Technology (NTNU) as part of his PhD on turbomachinery shape optimization, and has since been maintained and extended. Please, drop us an email to roberto.agromayor@ntnu.no if you have questions about the code or you have a bug to report!

Download files

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

Source Distribution

nurbspy-1.3.0.tar.gz (55.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

nurbspy-1.3.0-py3-none-any.whl (60.9 kB view details)

Uploaded Python 3

File details

Details for the file nurbspy-1.3.0.tar.gz.

File metadata

  • Download URL: nurbspy-1.3.0.tar.gz
  • Upload date:
  • Size: 55.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.8.2 CPython/3.12.14 Linux/6.17.0-1022-azure

File hashes

Hashes for nurbspy-1.3.0.tar.gz
Algorithm Hash digest
SHA256 daa34bda9c400b54c311f0bc2994bac8b9283a641ce510e820a5e62d96ca07a4
MD5 3a3fac7278bc58b6ce1777fc1b3c8957
BLAKE2b-256 fa820724c069eef221d252ebecc50f1909318bc8ea7eadee7030755114caa963

See more details on using hashes here.

File details

Details for the file nurbspy-1.3.0-py3-none-any.whl.

File metadata

  • Download URL: nurbspy-1.3.0-py3-none-any.whl
  • Upload date:
  • Size: 60.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.8.2 CPython/3.12.14 Linux/6.17.0-1022-azure

File hashes

Hashes for nurbspy-1.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 84b3532c85f80bf2d50f5fcbdbb4c44643007ef77d3706d9a3e2b1d09f8ec6f5
MD5 dabe337a429cfc51db8c48b14cbc096f
BLAKE2b-256 866a3b05440f7bd4b52bf28bb823b41bbfb111e99936ea86523072c34ddf4815

See more details on using hashes here.

Release history Release notifications | RSS feed

1.3.2

2 files

1.3.1

2 files

This release

1.3.0 This release

2 files

1.2.4

2 files

1.2.3

2 files

1.2.2

2 files

1.2.1

2 files

1.2.0

2 files

1.1.5

2 files

1.1.2

2 files

1.1.1

2 files

1.1.0

2 files

1.0.4

2 files

1.0.3

2 files

1.0.2

2 files

1.0.1

2 files

1.0.0

2 files

0.0.3

2 files

0.0.2

2 files

0.0.1

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page