top of page

$GUI vs. EXECUTING()

This page is an ongoing comparison of 2 useful snippet of codes that helps you

manage heavy scripts. 

The common thing is that both of the functions asks a question that is either 

False or True aka 0 or 1.

$gui

This expression is asking a question when you use it -

Is the Graphic User Interface ( = GUI ) is in use or not?

When it is the value is True aka 1, and when it isn't the value is False aka 0.

This is a very useful snippet when you have some heavy nodes of your script and only want to render them on the farm ( which is a situation

when the script is active but no user interface is in use ).

So let's see how to use it in a common situation when you have a heavy node and would like to render only on the farm so

would add this to the 'disable' knob:

gui_001.jpg

1. Right click on the 'disable' knob and select 'Add expression..'

gui_002.jpg

2. In the Expression window can type now $gui and hit OK.

gui_003.jpg

3. If everything is fine you'll see that the knob turned blue and your node has an E in the corner.

gui_004.jpg

4. If you want to remove the expression, right click on the knob and select 'No animation'.

gui_005.jpg

If you want you can also assign different values than 0 and 1.

In this case using a '?' you can ask if the user interface is True THEN use the value 5 ELSE use 50.

gui_006.jpg

If for some reasons you want to reverse the value, you can put

an exclamation mark ( ! ) before the $gui.

To dive deeper into how powerful this function is let's use some python!

Using python we can assign expression values to knobs where we can't do manually otherwise.

In the following example we use it on the ScanlineRender's 'antialiasing' knob in order to see with 'none' while we are working and 'high' on the render. 

( If you are new to Python in Nuke I recommend this tutorial you might find useful. )

And here is another very useful snippet that I found a while ago here.

It prints the name of the nodes and knobs that has $gui as a value:

nuke.executing()

This function is relatively new as it was introduced quietly with Nuke v11 on the API.

In theory it works very similarly as $gui except that it also works on local renders

which is a huge benefit. Unfortunately, the downside is that it doesn't work always as expected.

The reason is something that I am still trying to figure out but with this post I would like to 

inspire some more experiments as this function seems a worthy rival of the $gui.

But first let's see how can you use it!

exec_001.jpg

So if you open the Expression window as mentioned earlier and just type in

the code you will receive an Error message.

exec_002.jpg

To fix this on the right side of the window you can turn Off the 'R' button and On the 'Py' 

so it will read the input as a python code.

exec_003.jpg

If you want to reverse the values just put 'not' before the code.

exec_005.jpg

If you need different values than 0 and 1 can use an If statement.

exec_004.jpg

If you need to use the code as an expression can use this formula.

exec_006.jpg

Another useful and safe application for both codes is to apply it in a Switch node.

If you need a ready made gizmo for this purpose you can get a Render Switch

that I built earlier using executing().

01_rendersw_thumb.jpg

So as a downside so far I found that this function doesn't work with a

ScanlineRender's 'antialiasing' knob for some reasons.

Altough it does work with other dropdown menus I tested on so far.

In order to get to the bottom of this feel free to join the converstaion on the Foundry Forum here!

Common courtesy

A story about the importance ​of the following point first:

A few years ago I inherited a script from someone who left the studio.

The script was large and vaguely organized and I was only asked to do some

minor changes so there was no point rebuilding anything.

The problem was that the latest render didn't match

with the part the latest Write node was connected to.

First, I started to look around in the script for parts that might match with the missing part.

( At a time it didn't occur to me that what I was looking for might have been disabled. )

Then I questioned if the pipeline worked well or accidentally dropped the latest script somewhere else?

Didn't find anything that would help so asked my Lead.

After the first half on hour he had a hunch of what's might going on.

He started to search through the nodes that had a little E in the corner.

Eventually, found the culprit as one of the nodes had a $gui in a `disable` knob.

This was a first time I heard about the $gui. 

I wasn't happy about it as it just cost me half a day of work that I spent with aimless search.

I am sure many compositors found out about the existence of this code the similar

way which is rather frustrating. Therefore many has mixed feelings about this function

although these can be great allies for us to be more effective.

Luckily, there is a simple solution to avoid these situations:
!  JUST USE THE LABEL !

Here are two equally good ways but you can be more creative than that.

The point is only that if you are using any of these functions don't fail to 

indicate in a very very obvious way!

gui_009.jpg
gui_010.jpg

Hope you will find it useful! 

bottom of page