6
$\begingroup$

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?

$\endgroup$
8
$\begingroup$

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

enter image description here

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 #.

enter image description here

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.

|improve this answer|||||
$\endgroup$
  • $\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$ – Antti Mar 21 '18 at 15:42
  • $\begingroup$ @Antti edited answer, possibly the easiest solution is to make the file autorun on load. $\endgroup$ – batFINGER Mar 21 '18 at 15:57
  • $\begingroup$ If you prefer not to use a separate file, consider (lambda m: m * m * m)(9.4443299912). $\endgroup$ – wchargin Mar 21 '18 at 20:21

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.