I want to set up drivers: from Custom Properties of a Camera to Custom Properties of selected object.
Based on a script from 6 year old post: How to put together a driver with python, I manage to have this code,
import bpy
def add_driver(
source, target, prop, dataPath,
index = -1, negative = False, func = ''
):
''' Add driver to source prop (at index), driven by target dataPath '''
if index != -1:
d = source.driver_add( prop, index ).driver
else:
d = source.driver_add( prop ).driver
v = d.variables.new()
v.name = prop
v.targets[0].id = target
v.targets[0].data_path = dataPath
d.expression = func + "(" + v.name + ")" if func else v.name
d.expression = d.expression if not negative else "-1 * " + d.expression
#--------------------------------------------
ob = bpy.context.active_object
camera = bpy.context.scene.objects['Camera']
prop_name1 = ob.name + "_Opacity"
prop_name2 = ob.name + "_Highlight"
add_driver( ob, camera, prop_name1, prop_name1, -1)
add_driver( ob, camera, prop_name2, prop_name2, -1)
but executing it always give me error:
"Python: TypeError: bpy_struct.driver_add(): property "FirstCube_Opacity" not found
...even if I'm sure that all the objects have proper named Custom Properties. The function of setting up driver works great with other parameters in blender like 'scale'. What Am I doing wrong?
###UPDATE CODE####
Script1 - Creating Custom Properties
import bpy
ob = bpy.context.active_object
prop_name1 = ob.name + "_Opacity"
ob[prop_name1] = 0.0
ob.id_properties_ensure() # Make sure the manager is updated
property_manager = ob.id_properties_ui(prop_name1)
property_manager.update(min=0.0, max=1.0, soft_min=0.0, soft_max=1.0)
camera = bpy.context.scene.objects['Camera']
prop_name2 = ob.name + "_Opacity"
camera[prop_name2] = 0.0
camera.id_properties_ensure() # Make sure the manager is updated
property_manager = camera.id_properties_ui(prop_name2)
property_manager.update(min=0.0, max=1.0, soft_min=0.0, soft_max=1.0)
Script2 - Setting up driver, "Object_Opacity" CAMERA's Custom Property should drive "Object_Opacity" Object's Custom Property
import bpy
def add_driver(
source, target, prop, dataPath,
index = -1, negative = False, func = ''
):
''' Add driver to source prop (at index), driven by target dataPath '''
if index != -1:
d = source.driver_add( prop, index ).driver
else:
d = source.driver_add( prop ).driver
v = d.variables.new()
v.name = prop
v.targets[0].id = target
v.targets[0].data_path = dataPath
d.expression = func + "(" + v.name + ")" if func else v.name
d.expression = d.expression if not negative else "-1 * " + d.expression
ob = bpy.context.active_object
camera = bpy.context.scene.objects['Camera']
prop_name1 = ob.name + "_Opacity"
add_driver( ob, camera, f'["{prop_name1}"]', f'["{prop_name1}"]', -1)
add_driver( ob, camera, "prop", f'["{prop_name1}"]', -1)
$\endgroup$