Source code for fbrelation.declarations.box.macro

'''
Defines classes for box declarations that represent macros (i.e., other
relation constraints used as boxes).
'''

from fbrelation.exceptions import ExecutionError

from fbrelation.declarations.box.base import BoxDeclaration
from fbrelation.declarations.node import MacroNodeDeclaration

[docs]class MacroBoxDeclaration(BoxDeclaration): ''' Defines the declaration of a macro box, which contains a reference to the relation declaration to be used. '''
[docs] def __init__(self, name, relationDeclaration): ''' Initializes a new macro box which will create an instance of the specified relation constraint as a macro. ''' super(MacroBoxDeclaration, self).__init__(name) self.relation = relationDeclaration
[docs] def execute(self, constraint, relationComponents): ''' Executes the declaration, finding the associated relation constraint and adding it to the provided constraint as a macro. :param relationComponents: Used to look up the exact name of the FBConstraintRelation that was created from the relation declaration, as the name may have been changed on creation. ''' # Get the constraint from the collection of already-created relations assert self.relation.name in relationComponents macroConstraint = relationComponents[self.relation.name] # Create a macro box using that constraint box = constraint.CreateFunctionBox('My Macros', macroConstraint.LongName) assert box # Return the newly created box return box
[docs] def createNodeDeclaration(self, nodeName, isSrc): ''' Overridden to create instances of :class:`.MacroNodeDeclaration` for nodes that reference macro boxes. :note: When a macro box's node is referenced in a connection, the node name given corresponds to the name of input or output box in the original relation constraint. At runtime, these nodes are located by index rather than by the name of the FBAnimationNode. ''' # A source node in a connection indicates a macro output; a destination # node indicates a macro input isInput = not isSrc # Get the index associated with the named macro tool in the associated # relation constraint, then use it to create a macro node declaration. nodeIndex = self.relation.getMacroNodeIndex(nodeName, isInput) assert nodeIndex >= 0, ( 'Macro nodes referenced in connection declarations must be valid.') return MacroNodeDeclaration(self, nodeIndex, isSrc)
[docs] def supportsNode(self, nodeName): ''' Overridden to require that the name given is a valid input or output box name in the associated relation constraint. ''' return self.relation.hasMacroTool(nodeName)