ScenegraphAttr Porting Guide

Introduction

In Katana 1, two classes were used for representing scene graph attributes: FnAttribute was used exclusively by C++ plug-ins, while ScenegraphAttr was used in both C++ and Python contexts.

In Katana 2, FnAttribute replaced ScenegraphAttr as the preferred class for handling attribute data. ScenegraphAttr became a legacy emulation layer on top of FnAttribute.

In Katana 4.5, ScenegraphAttr is no longer available. Porting to FnAttribute is mostly straightforward, however there are one or two methods and functions that have moved, changed signature, or been removed entirely. This guide details the differences between the two and offers solutions for functionality that has been removed.

Classes

Class names have changed slightly between the two modules, as detailed in the following table. Note that the abstract base classes are not included, as they cannot be instantiated directly.

ScenegraphAttr

FnAttribute

GroupAttr

GroupAttribute

IntAttr

IntAttribute

FloatAttr

FloatAttribute

StringAttr

StringAttribute

NullAttr

NullAttribute

Construction

The “constructor” of ScenegraphAttr.Attr acted as a factory, allowing instantiation of subclasses by passing an attribute type name string token as the first argument. Uses of this pattern should be updated to construct objects directly instead.

For example:

attr = ScenegraphAttr.Attr('StringAttr', 'hello')

becomes:

attr = FnAttribute.StringAttribute('hello')

Direct construction of GroupAttributes remains possible without using a GroupBuilder, just as it was for GroupAttr. However, the signature of the constructor has changed. Specifically, the groupInherit argument has reversed position and is optional in the GroupAttribute constructor, defaulting to True.

For example:

number = ScenegraphAttr.DoubleAttr(2)
group = ScenegraphAttr.GroupAttr(True, {"anumber": number})

becomes:

number = FnAttribute.DoubleAttribute(2)
group = FnAttribute.GroupAttribute({"anumber": number}, True)

or:

number = FnAttribute.DoubleAttribute(2)
group = FnAttribute.GroupAttribute({"anumber": number})

Differences in Method Names

The following table lists the methods that have different names but are otherwise functionally identical.

ScenegraphAttr

FnAttribute

childByIndex

getChildByIndex

childByName

getChildByName

getNumTimeSamples

getNumberOfTimeSamples

inheritChildren

getGroupInherit

Replaced Methods

Several methods and functions that were available in ScenegraphAttr should be updated to replacements in FnAttribute or other modules, as listed in the following table.

ScenegraphAttr

Replacement

ParseXML

FnAttribute.Attribute.parseXML

getInterpSample

FnAttribute.Util.ResampleAttrWithInterp

getSamples(start, end)

[NB: getSamples() with no arguments remains identical]

FnAttribute.Util.RemoveTimeSamplesUnneededForShutter

Removed Methods

childDict() and childNames()

No direct equivalents of ScenegraphAttr.GroupAttr’s childDict() and childNames() methods are available in FnAttribute.GroupAttribute, but their results can be trivially obtained via FnAttribute.GroupAttribute’s childList() method, specifically dict(groupAttribute.childList()) and dict(groupAttribute.childList()).keys() (or similar), respectively.

childByNameAndDimension()

No equivalent to ScenegraphAttr.GroupAttr’s childByNameAndDimension() method is available in FnAttribute.GroupAttribute. It was functionally equivalent to:

def childByNameAndDimension(groupAttribute, attrName, tupleSize,
                            numElements):
   child = groupAttribute.getChildByName(attrName)

   if isinstance(child, FnAttribute.DataAttribute):
       if (child.getTupleSize() == tupleSize
               and child.getNumberOfTuples() == numElements):
           return child

   elif isinstance(child, FnAttribute.GroupAttribute):
       if tupleSize <= 0 or numElements <= 0:
           return child

   return None

CalcTransformMatrix()

ScenegraphAttr contained a convenience function CalcTransformMatrix() for calculating the transform encoded in a given GroupAttribute. This function returned the transform matrix as a 16-tuple of double s. No direct equivalent is available, but its result can be trivially obtained via PyFnGeolibServices.XFormUtil.CalcTransformMatrixAtTime() as:

def CalcTransformMatrix(attr):
    xform, isAbs = \
        PyFnGeolibServices.XFormUtil.CalcTransformMatrixAtTime(attr, 0.0)
    return (xform.getData(), isAbs)

Push<Transform>Attr()

ScenegraphAttr contained top-level utility functions for appending various transform attributes to a GroupAttr object. These included PushMatrixAttr(), PushOriginAttr(), PushRotateAttr(), PushScaleAttr(), and PushTranslateAttr(). Equivalent functions are available in PyFnGeolibServices.XFormUtil.