Skip to main content

A lightweight library for NURBS curves and surfaces

Project description

nurbspy

Description

nurbspy is a Python package to create and work with 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!

     

Capabilities

nurbspy has the following features to create and use NURBS curves:

  • Constructors for rational and non-rational Bézier and B-Spline curves
  • Methods to evaluate curve coordinates
  • Methods to evaluate arbitrary-order derivatives analytically
  • Methods to evaluate the tangent, normal, and binormal unitary vectors (Frenet-Serret frame of reference)
  • Methods to compute the curvature and torsion
  • Methods to compute the arc-length of the curve by numerical quadrature
  • Methods to visualize the curve using the Matplotlib library

In addition, nurbspy provides the following capabilities to create and use NURBS surfaces:

  • Constructors for rational and non-rational Bézier and B-Spline surfaces
  • Additional constructors for some common special surfaces:
    • Bilinear surfaces
    • Ruled surfaces
    • Extruded surfaces
    • Revolution surfaces
    • Coons surfaces
  • Methods to evaluate surface coordinates
  • Methods to evaluate arbitrary-order derivatives analytically
  • Methods to evaluate the unitary normal vector
  • Methods to evaluate the mean and Gaussian curvatures
  • Methods to compute u- and v-isoparametic curves
  • Methods to visualize the surface using the Matplotlib library

In addition, nurbspy can work with real and complex data types natively. This allows to compute accurate (down to machine epsilon!) shape derivatives using the complex step method and avoid the numerical error incurred by finite-difference derivative approximations. This shape sensitivity information is necessary to solve shape optimization problems with many design variables using gradient based-optimization algorithms. To our knowledge, nurbspy is the only Python package that provides the flexibility to work with complex numbers right away.

Installation

nurbspy has the following mandatory runtime dependencies:

  • numpy (multidimensional array library)
  • scipy (scientific computing library)
  • numba (just-in-time Python compiler)
  • matplotlib (visualization library)

In addition nurbspy uses pytest for local tests.

nurbspy is available on Linux via the pip package manager. The installation with pip is straightfoward:

pip install nurbspy

nurbspy is also available on Linux via the conda package manager thanks to the infrastructure provided by conda-forge. In order to install nurbspy via conda you need to add conda-forge to your channels and then use the install command

conda config --add channels conda-forge
conda install nurbspy
not yet available :(

You can verify that nurbspy was successfully installed by running the examples provided below.

Minimum 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 code snippet 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 succesful, you should be able to see the Bézier curve when you execute the previous code snippet.

Check out the curve demos 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 curve 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 succesful, you should be able to see the Bézier surface when you execute the previous code snippet.

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

Contact information

nurbspy was 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. Please, drop us an email to roberto.agromayor@ntnu.no if you have questions about the code or you have a bug to report!

Project details


Download files

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

Source Distribution

nurbspy-0.0.2.tar.gz (28.7 kB view details)

Uploaded Source

Built Distribution

nurbspy-0.0.2-py3-none-any.whl (32.4 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: nurbspy-0.0.2.tar.gz
  • Upload date:
  • Size: 28.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.23.0 setuptools/46.0.0 requests-toolbelt/0.9.1 tqdm/4.43.0 CPython/3.7.6

File hashes

Hashes for nurbspy-0.0.2.tar.gz
Algorithm Hash digest
SHA256 0a1baa0d444900144e74ee5cffa72be72b272500c4ef2fede903b1e1c1cc1bb5
MD5 932d8a9c07caf0ba8675d3e565472903
BLAKE2b-256 6402e545ff96034746762a8c1a37a2b2b7bfe25c625493a69c48a2f7ceeb4b62

See more details on using hashes here.

File details

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

File metadata

  • Download URL: nurbspy-0.0.2-py3-none-any.whl
  • Upload date:
  • Size: 32.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.23.0 setuptools/46.0.0 requests-toolbelt/0.9.1 tqdm/4.43.0 CPython/3.7.6

File hashes

Hashes for nurbspy-0.0.2-py3-none-any.whl
Algorithm Hash digest
SHA256 45d391eac9ecd630f27fc58186f2ad68221f8fbfe2059c7bb499c7b1ff00aee5
MD5 b454025e9eaef97abfcbca2bb0bd7624
BLAKE2b-256 2269835cd25216cb754d76447f13d6c9bdfd442a3e431875c2214e96889f480c

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page