I'm quite new to python and drivers. I'm writing a rather complicated scripted expression inside the driver-area and I need to repeatedly use a long number sequence. Would it be possible to first store this number inside a new variable and then refer to that variable instead of the number?
1 Answer
The driver namespace
Can add functions and constants to the driver namespace
import bpy
def func(a, b, c):
return a * b * c
m = 9.4443299912
bpy.app.driver_namespace["f"] = func
bpy.app.driver_namespace["m"] = m
Run the script above, (copy & paste into text editor hit Run Script button,) to make the new members available to the driver namespace. To make it autorun when file is loaded, give the text block a py extension and check the Register checkbox on RHS of text editor header
Can now consider m
in a driver expression to be a named constant like pi
and e
.
Use in a driver expression like f(m, m, m)
Can be typed directly into a field by preceding with a hash #
character. Once the expression is a driver (purple) on editing expression there is no longer a need for #
.
There are a number of functions and properties etc already defined to the namespace, a sample of python console output.
>>> for k, v in bpy.app.driver_namespace.items():
... k, v
...
('asin', <built-in function asin>)
('asinh', <built-in function asinh>)
('atan', <built-in function atan>)
...
('pi', 3.141592653589793)
('e', 2.718281828459045)
...
('f', <function func at 0x7f8f18d34c80>)
('m', 9.4443299912)
('frame', 1.0)
Where frame
is the context.scene.frame_current
.
EDIT: would like to see a "sub expression" driver variable type where you could do this for scalars, or using other defined variables. Fitting everything into the scripted expression can be a PITA.
-
$\begingroup$ Thanks, this seems like a good answer. I would like to have just one clarification due to my lack of experience: would you add the first part of your answer directly to the expression-field of the scripted expression, or do I need to establish it in a separate python file? $\endgroup$– AnttiCommented Mar 21, 2018 at 15:42
-
$\begingroup$ @Antti edited answer, possibly the easiest solution is to make the file autorun on load. $\endgroup$ Commented Mar 21, 2018 at 15:57
-
1$\begingroup$ If you prefer not to use a separate file, consider
(lambda m: m * m * m)(9.4443299912)
. $\endgroup$– wcharginCommented Mar 21, 2018 at 20:21