Quick Start
Installation
pip install dazpy
dazpy requires Python 3.10+ and a running instance of DAZ Studio with the
DazScriptServer plugin loaded (default port 18811).
Connecting
from dazpy import DazClient
# Auto-loads token from ~/.daz3d/dazscriptserver_token.txt
client = DazClient()
# Or supply the token explicitly
client = DazClient(token="my-secret-token")
# Custom host / port
client = DazClient(host="192.168.1.10", port=18811, timeout=60.0)
Verify connectivity:
print(client.health())
# {'status': 'ok', 'version': '...'}
Working with the Scene
from dazpy import DazScene
scene = DazScene()
# List all nodes
for node in scene.nodes():
print(node.name, node.label)
# Find a specific figure by its Scene-panel label
figure = scene.find_skeleton_by_label("Genesis 9")
print(figure.num_bones(), "bones")
Posing a Figure
arm = figure.find_bone("r_forearm") # Genesis 9 snake_case naming
arm.set_local_rotation(0, 0, 45) # 45° on the Z axis
# Wrap in an undo group
with scene.undo("Bend arm"):
arm.set_local_rotation(0, 0, 90)
Working with Morphs
for morph in figure.morphs():
print(morph.modifier_label, morph.value)
smile = figure.find_modifier("Smile")
if smile:
smile.value = 0.75
Materials
for mat in figure.materials():
print(mat.material_name, mat.diffuse_color)
skin = figure.find_material("1_SkinFace")
if skin:
skin.diffuse_color = {"r": 255, "g": 220, "b": 190}
Cameras and Lights
cam = scene.cameras()[0]
cam.focal_length = 85.0
cam.aim_at(0, 100, 0)
light = scene.lights()[0]
light.intensity = 2.0
light.set_color(255, 240, 200)
Asynchronous / Long-Running Scripts
For scripts that may take several seconds, use the async helpers:
from dazpy import DazClient, execute_long
client = DazClient()
result = execute_long(client, "return Scene.getNumNodes();", timeout=30.0)
print(result.value)
Or manage async requests manually:
request_id = client.execute_async_submit("return Scene.getNumNodes();")
data = client.get_request_result(request_id, wait=True, wait_timeout=30)
print(data["result"])
Geometry Access
from dazpy import DazGeometry, NodeIdentifier
geo = DazGeometry(client, NodeIdentifier("Genesis9"))
print(geo.vertex_count, "vertices")
# Paginated full vertex list (avoids large single requests)
all_verts = geo.vertex_positions_all(chunk_size=2000)
Batch Execution
Collect multiple reads into one HTTP round-trip:
from dazpy import Batch
with Batch(client) as b:
n_nodes = b.add(["var n_nodes = Scene.getNumNodes();"])
n_cameras = b.add(["var n_cameras = Scene.getNumCameras();"])
print(n_nodes.value, n_cameras.value)
Error Handling
from dazpy import exceptions
try:
result = client.execute("return undefinedVariable;")
except exceptions.ScriptRuntimeError as e:
print("Script error:", e)
print(e.diagnostic) # line-numbered source + error
except exceptions.ConnectionError:
print("DAZ Studio is not running")
except exceptions.AuthenticationError:
print("Bad token")