I have a screen in Vision with a multi state indicator. I want to do a map transform like I would do on Perspective, using a numeric range of values from a property to output a specific color. Can I get a tip on how to do this simply in Vision? Thanks!
You’ll need to use a case statement
case({variable...}
,0, 'Val 0'
,1, 'Val 1'
, 'default'
)
One of the few times I am ok with a runScript if your return values require some calculations/are more complicated than harcoded values.
You can do
def my_map(map_key):
mapping = {
"some_input":"some_return_value",
"other_input":"other_return_value"
}
try:
return mapping[map_key]
except KeyError:
return "Default value here"
And then call it in the expression
runScript("someModule.myMap",0,{Root Container.someProperty})
where Root Container.someProperty
becomes map_key
in the function.
The real power starts when you assign functions to your mappings, but BEWARE these functions should be things that evaluate quickly. I’m am pretty @pturmel has written before about this, but never use a sendMessage inside a runScript. Having said that, you could do something like this -
Going back to the first example you can do
def square_it(num):
return num ** 2
def cube_it(num):
return num ** 3
def my_map(func_path, number):
mapping = {
"first_input": square_it
"other_input": cube_it
}
try:
return mapping[func_path](number)
except KeyError:
return "Default value here"
Note that both case
and the Python dict based method don’t really meet all the functionality of the map transform - you can’t (easily) define a range of possible values.
If you need a range, I would use nested ifs:
if(cond1, 'val1',
if(cond2, 'val2',
'default'
))
True