Skip to main content

A data-oriented wrapper library for the Blender Python API

Project description

databpy

codecov pypi tests deployment

A set of data-oriented wrappers around the python API of Blender.

This was originally used internally inside of Molecular Nodes but was broken out into a separate python module for re-use in other projects.

Installation

Available on PyPI, install with pip:

pip install databpy

[!CAUTION]

bpy (Blender as a python module) is listed as an optional dependency, so that if you install databpy inside of Blender you won’t install a redundant version of bpy. If you are using this outside of Blender, you will need to specifically request bpy with either of these methods:

# install wtih bpy dependency
pip install 'databpy[bpy]'

# install both packages
pip install databpy bpy

# install with all optional dependencies
pip install 'databpy[all]'

Usage

The main use cases are to create objects, store and retrieve attributes from them. The functions are named around nodes in Geometry Nodes Store Named Attribute and Named Attribute

import databpy as db

db.store_named_attribute() # store a named attribute on a mesh object
db.named_attribute()       # retrieve a named attribute from a mesh object

Here’s an example on how to store an attribute:

import numpy as np
import databpy as db

coords = np.array([
    [0, 0, 0],
    [0, 5, 0],
    [5, 0, 0],
    [5, 5, 0]
])

obj = db.create_object(coords, name="Box")
db.store_named_attribute(obj, np.array([10, 20, 31, 42]), "vals")

image

This module is mainly used to create mesh objects and work with their attributes. It is built to store and retrieve data using NumPy arrays:

import numpy as np
import databpy as db
np.random.seed(6)

# Create a mesh object
random_verts = np.random.rand(10, 3)

obj = db.create_object(random_verts, name="RandomMesh")

obj.name
'RandomMesh'

Access attributes from the object’s mesh.

db.named_attribute(obj, 'position')
array([[0.8928602 , 0.3319798 , 0.8212291 ],
       [0.04169663, 0.10765668, 0.59505206],
       [0.52981734, 0.41880742, 0.33540785],
       [0.62251943, 0.43814144, 0.7358821 ],
       [0.5180364 , 0.5788586 , 0.6453551 ],
       [0.99022424, 0.8198582 , 0.41320094],
       [0.8762677 , 0.82375944, 0.05447451],
       [0.7186372 , 0.8021706 , 0.7364066 ],
       [0.7091318 , 0.5409368 , 0.12482417],
       [0.9576473 , 0.4032563 , 0.21695116]], dtype=float32)

BlenderObject class (bob)

This is a convenience class that wraps around the bpy.types.Object, and provides access to all of the useful functions. We can wrap an existing Object or return one when creating a new object.

This just gives us access to the named_attribute() and store_named_attribute() functions on the object class, but also provides a more intuitive way to access the object’s attributes.

bob = db.BlenderObject(obj)       # wraps the existing object 
bob = db.create_bob(random_verts) # creates a new object and returns it already wrapped

# these two are identical
bob.named_attribute('position')
bob.position
AttributeArray(name='position', object='NewObject', mesh='NewObject', domain=POINT, type=FLOAT_VECTOR, shape=(10, 3), dtype=float32)
array([[0.8928602 , 0.3319798 , 0.8212291 ],
       [0.04169663, 0.10765668, 0.59505206],
       [0.52981734, 0.41880742, 0.33540785],
       [0.62251943, 0.43814144, 0.7358821 ],
       [0.5180364 , 0.5788586 , 0.6453551 ],
       [0.99022424, 0.8198582 , 0.41320094],
       [0.8762677 , 0.82375944, 0.05447451],
       [0.7186372 , 0.8021706 , 0.7364066 ],
       [0.7091318 , 0.5409368 , 0.12482417],
       [0.9576473 , 0.4032563 , 0.21695116]], dtype=float32)

We can clear all of the data from the object and initialise a new mesh underneath:

bob.new_from_pydata(np.random.randn(5, 3))
bob.position
AttributeArray(name='position', object='NewObject', mesh='NewObject', domain=POINT, type=FLOAT_VECTOR, shape=(5, 3), dtype=float32)
array([[ 0.82465386, -1.1764315 ,  1.5644896 ],
       [ 0.7127051 , -0.1810066 ,  0.53419954],
       [-0.58661294, -1.4818532 ,  0.8572476 ],
       [ 0.94309896,  0.11444143, -0.02195668],
       [-2.1271446 , -0.83440745, -0.4655083 ]], dtype=float32)

Example with Polars data

import polars as pl
import databpy as db
from io import StringIO

json_file = StringIO("""
{
  "Dino": [
    [55.3846, 97.1795, 0.0],
    [51.5385, 96.0256, 0.0]
  ],
  "Star": [
    [58.2136, 91.8819, 0.0],
    [58.1961, 92.215, 0.0]
  ]
}
""")

df = pl.read_json(json_file)
columns_to_explode = [col for col in df.columns if df[col].dtype == pl.List(pl.List)]
df = df.explode(columns_to_explode)

vertices = np.zeros((len(df), 3), dtype=np.float32)
bob = db.create_bob(vertices, name="DinoStar")

for col in df.columns:
    data = np.vstack(df.get_column(col).to_numpy())
    bob.store_named_attribute(data, col)

bob.named_attribute("Dino")
array([[55.3846, 97.1795,  0.    ],
       [51.5385, 96.0256,  0.    ]], dtype=float32)
bob.named_attribute("Star")
array([[58.2136, 91.8819,  0.    ],
       [58.1961, 92.215 ,  0.    ]], dtype=float32)

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

databpy-0.6.2.tar.gz (59.1 kB view details)

Uploaded Source

Built Distribution

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

databpy-0.6.2-py3-none-any.whl (42.6 kB view details)

Uploaded Python 3

File details

Details for the file databpy-0.6.2.tar.gz.

File metadata

  • Download URL: databpy-0.6.2.tar.gz
  • Upload date:
  • Size: 59.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for databpy-0.6.2.tar.gz
Algorithm Hash digest
SHA256 17f56a0e6c7bab9941a460ab8a0b2a9af0adb14cfff8761180206399b25e5543
MD5 82f9402d5d1ad019338c784019d4286b
BLAKE2b-256 c176a9d8f9ae3045ea7e2081ea04d0065a7afde0f757ccc73890402ac061bfd0

See more details on using hashes here.

Provenance

The following attestation bundles were made for databpy-0.6.2.tar.gz:

Publisher: ci-cd.yml on BradyAJohnston/databpy

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file databpy-0.6.2-py3-none-any.whl.

File metadata

  • Download URL: databpy-0.6.2-py3-none-any.whl
  • Upload date:
  • Size: 42.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for databpy-0.6.2-py3-none-any.whl
Algorithm Hash digest
SHA256 ef9c84f79f79e3cada7e6f4392d9c80c8ccdc693dcb41d58de04de6b3d54704f
MD5 c1497593054c75f8a74b20be15eb5750
BLAKE2b-256 cf1fc6dfe20b0233f37cf0744d8ffda8144cd58700e8137bfa96b7e5c9e9617e

See more details on using hashes here.

Provenance

The following attestation bundles were made for databpy-0.6.2-py3-none-any.whl:

Publisher: ci-cd.yml on BradyAJohnston/databpy

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

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