databpy
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
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
# store and retrieve attributes from a mesh, point cloud, or curves object
db.store_named_attribute()
db.named_attribute()
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")
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.
# wrap an existing object or create a new one
bob = db.BlenderObject(obj)
bob = db.create_bob(random_verts)
# 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, empty_as_null=True)
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)
Metadata
Release files for databpy 0.10.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| databpy-0.10.0.tar.gz | 35.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| databpy-0.10.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 77.2 kB
Release files / databpy-0.10.0.tar.gz
| Download URL | databpy-0.10.0.tar.gz |
|---|---|
| Size | 35.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
21935f6e6a47ee3c8e2d5b9aba9738256e069a28940e7d01982c6f74274271fb
|
|
BLAKE2b-256 checksum How to use checksums |
7be5c0119b5fa3e066363589b0021ef64ab632512cb3998f103248ad44bc4be3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 27, 2026.
Transparency logRelease files / databpy-0.10.0-py3-none-any.whl
| Download URL | databpy-0.10.0-py3-none-any.whl |
|---|---|
| Size | 42.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
f89d82ba437ffcd2e08cf3b69facfd2ab568f6f7d67a759079d94011ee38a796
|
|
BLAKE2b-256 checksum How to use checksums |
11a775405d8632f7d0c3cb4e7e9342adf267637991af72ed3306b1ae6e6e3b89
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 27, 2026.
Transparency log