Expression vs. Python Editor

It is common to prototype code in the Python Editor, and you may think to do this when you need write some code for an Expression. Beware, though they look deceptively similar, the full Gaffer API is not available in expressions, and references to plugs behave quite differently.

This sometimes leads to an attempt to call something like parent["Sphere"]["radius"].getValue() in an expression, and an exception like the following :

ERROR   [Execution error] Expression1.__execute :"python/Gaffer/PythonExpressionEngine.py", line 88, in execute
line 1, in <module> AttributeError: 'float' object has no attribute 'getValue'
Continue reading “Expression vs. Python Editor”

Labelled menu dividers

From 0.55.0.0 onwards, you can now label menu dividers. You can see an examples of this in the Editor Focus menu, which has both a title (in black) and two labelled dividers (dark grey).

To create these, simply add a label to your item when setting "divider" : True:

menu.append( "/Follow Divider",
  { "divider" : True, "label" : "Follow" }
)

G4P – part 6 – Node defaults

For this instalment in our ground-up series about integrating Gaffer into a pipeline, we cover how to change node defaults.

All Gaffer nodes have plugs, whether they are visible in the Graph Editor for easy connection, or in the Node Editor as settings. These plugs have default values defined by the node’s programming. It may be the case however, that these defaults aren’t the most useful values for your use. To help with this, Gaffer allows you to provide your own, “user” defaults.

Continue reading “G4P – part 6 – Node defaults”

Gaffer for pipeline – part 4 – which version?

When writing pipeline tools, it’s often useful to know which Gaffer version you are running in. In python, the Gaffer.About module is your friend:

import Gaffer
print( Gaffer.About.versionString() )
print( Gaffer.About.majorVersion(), Gaffer.About.minorVersion() )

We also define a (script + ABI) ‘compatibility’ version, that, as we use SemVer – is effectively tied to the milestone + major version:

print( Gaffer.About.compatibilityVersion() )

Gaffer for pipeline – part 3 – Compute cache size

Like many other applications that calculate data on-demand, Gaffer has a memory cache that can increase performance in UI sessions if you have RAM to spare.

The default size (1GB) is somewhat conservative as to ensure we don’t use up all the resources of more modest machines when Gaffer is used out-the-box. It is easy to increase the limit though, which can bring performance gains in real-world production scenarios.

Continue reading “Gaffer for pipeline – part 3 – Compute cache size”

Gaffer for pipeline – part 1 – App structure and startup

It can be hard to know where to start when you first start integrating a new application into a pipeline. This post is the first part in a series that takes a bottom-up approach and brings together a few helpful links for getting started with Gaffer configuration, scripting and development.

In this part, we take a look at how the gaffer application is structured, and what happens at startup.

Continue reading “Gaffer for pipeline – part 1 – App structure and startup”