-1
$\begingroup$

I'm trying to add and configure a driver through a script. so far I have the following script:

import bpy
bpy.data.materials.new("Property Dump")
bpy.data.materials["Property Dump"].use_nodes=True
prin=bpy.data.materials["Property Dump"].node_tree.nodes['Principled BSDF']
outputnode=bpy.data.materials["Property Dump"].node_tree.nodes['Material Output']
bpy.data.materials["Property Dump"].node_tree.nodes.remove(prin)
bpy.data.materials["Property Dump"].node_tree.nodes.remove(outputnode)
test=bpy.data.materials["Property Dump"].node_tree.nodes.new(type="ShaderNodeMix")
test.location=(100, 100)


bpy.data.materials["Property Dump"].node_tree.nodes["Mix"].inputs[0].driver_add("default_value")

This makes a new material called Property Dump, deletes the default nodes, adds a mix node, and gives a default value driver to the first input of the mix node. What I want to know is how to give the driver an expression, add an input variable, make it single property, etc. How do I do it?

$\endgroup$

1 Answer 1

3
$\begingroup$

You can find information about Drivers in Blender's Official Documentation and the Driver Panel. You can configure a fully functional driver for your chosen field bpy.data.materials["Property Dump"].node_tree.nodes["Mix"].inputs[0] in the following script which is driven in this example by the scale[0] property (which is Scale X) of the bpy.data.objects["Cube"] object, but you can choose any object or property of your interest:

enter image description here

When you create a driver using the method add_driver, it returns an FCurve with a property that contains the driver. You can set the driver Driver Type with values AVERAGE, SUM, MIN, MAX, & SCRIPTED and give it any Python Expression that uses Driver Variables created with the method variables.new() which returns a DriverVariable object that can be setup with a name.

Then you have to configure the driver itself which is in our example the object bpy.data.objects["Cube"] by setting the values in the variable's DriverTargets list. In this case we only have 1 driver target so we retrieve the first element with v.targets[0] and set the id_type to OBJECT and the id to bpy.data.objects["Cube"]. But you can have a driver of any type of ID-block Id Type. Then specify the data_path to use which can be obtained from any property or field in the Blender interface by right clicking any field of interest and selecting Copy Data Path. Then just paste the copied Data Path in your script.

fcurve = bpy.data.materials["Property Dump"].node_tree.nodes["Mix"].inputs[0].driver_add("default_value")

d = fcurve.driver
d.type = "SCRIPTED"
d.expression = "my_var + 0.1"

v = d.variables.new()
v.name = "my_var"

t = v.targets[0]
t.id_type = 'OBJECT'
t.id = bpy.data.objects["Cube"]
t.data_path = "scale[0]"

Try this entire code:

import bpy

bpy.data.materials.new("Property Dump")
bpy.data.materials["Property Dump"].use_nodes=True
prin=bpy.data.materials["Property Dump"].node_tree.nodes['Principled BSDF']
outputnode=bpy.data.materials["Property Dump"].node_tree.nodes['Material Output']
bpy.data.materials["Property Dump"].node_tree.nodes.remove(prin)
bpy.data.materials["Property Dump"].node_tree.nodes.remove(outputnode)
test=bpy.data.materials["Property Dump"].node_tree.nodes.new(type="ShaderNodeMix")
test.location=(100, 100)

fcurve = bpy.data.materials["Property Dump"].node_tree.nodes["Mix"].inputs[0].driver_add("default_value")

d = fcurve.driver
d.type = "SCRIPTED"
d.expression = "my_var + 0.1"

v = d.variables.new()
v.name = "my_var"

t = v.targets[0]
t.id_type = 'OBJECT'
t.id = bpy.data.objects["Cube"]
t.data_path = "scale[0]"
$\endgroup$
0

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .