AL.omx
AL.omx contains all the public-facing APIs. They will be carefully maintained.
- class AL.omx.JournalContext(state=True)[source]
Bases:
object
A python context where you set the journal state by force.
- Notes:
Turning on by calling
setJournalToggle(True)()
will slowdown omx performance globally. This is the suggested way to have the journal temporarily set to on/off.
- class AL.omx.TrackCreatedNodes[source]
Bases:
object
A Python Context Decorator to temporarily track nodes that have been created with omx
Examples:
# The class can be used as decorator, or python context: @TrackCreatedNodes() def methodToCreateNodes(): # Create nodes nodesCreated = omx.queryTrackedNodes() def methodToCreateNodes(): with TrackCreatedNodes() as tracker: # Create nodes nodesCreated = tracker.trackedNodes()
- class AL.omx.XModifier(immediate=False)[source]
Bases:
object
A wrapper around
MModifier
that supportsXNode
instances directly- Notes:
When created in immediate mode, every time any modifier method is run on this object the doIt method is also run from within a dynamic
AL_OMXCommand
instance to allow undoing. Immediate mode will always be much slower than non-immediate mode, and is only there to allow simple experiments from the Maya script editor.
- __init__(immediate=False)[source]
Creates a new XModifier instance.
- Args:
immediate (bool, optional): Specifies if this XModifier should behave in immediate mode. Defaults to False.
- addAttribute(node, attribute)[source]
Adds an attribute to a node.
Adds an operation to the modifier to add a new dynamic attribute to the given dependency node. If the attribute is a compound its children will be added as well, so only the parent needs to be added using this method.
- addExtensionAttribute(nodeClass, attribute)[source]
Adds an extension attribute to a node class
- Notes:
Adds an operation to the modifier to add a new extension attribute to the given node class. If the attribute is a compound its children will be added as well, so only the parent needs to be added using this method.
- Args:
nodeClass (
om2.MNodeClass
): The node classattribute (
om2.MObject
): The attribute MObject to add- Returns:
XModifier
: A reference to self
- commandToExecute(command)[source]
Adds an operation to the modifier to execute a MEL command.
- Notes:
The command should be fully undoable otherwise unexpected results may occur. If the command contains no undoable portions whatsoever, the call to doIt() may fail, but only after executing the command. It is best to use multiple commandToExecute() calls rather than batching multiple commands into a single call to commandToExecute(). They will still be undone together, as a single undo action by the user, but Maya will better be able to recover if one of the commands fails.
- Args:
command (str): The command string
- Returns:
XModifier
: A reference to self
- connect(*args, **kwargs)[source]
Connects two plugs.
Adds an operation to the modifier that connects two plugs in the dependency graph. It is the user’s responsibility to ensure that the source and destination attributes are of compatible types. For instance, if the source attribute is a nurbs surface then the destination must also be a nurbs surface. Plugs can either be specified with node and attribute MObjects or with MPlugs.
- Note:
Arguments v1: If any plug is an array plug, it will expect another is also an array plug with matched data type, and it will try to connect at array level:
source (
XPlug
|om2.MPlug
): The source plug dest (XPlug
|om2.MPlug
): The destination plugArguments v2: If any plug is an array plug, it will try to connect at the next available element level:
sourceNode (
MObject
): The source MObject sourceAttr (MObject
): The source attribute MObject destNode (MObject
): The destination MObject destAttr (MObject
): The destination attribute MObject- Returns:
XModifier
: A reference to self
- createDGNode(typeName, nodeName='')[source]
Creates a DG node.
- Args:
typeName (str): the type of the object to create, e.g. “transform”.
nodeName (str, optional): the node name, if non empty will be used in a modifier.renameObject call. Defaults to “”.
- Returns:
XNode
: A XNode instance around the created MObject.
- createDagNode(typeName, parent=<_OpenMaya name='mock.MObject.kNullObj' id='139720921141968'>, nodeName='', manageTransformIfNeeded=True, returnAllCreated=False)[source]
Creates a DAG node.
Adds an operation to the modifier to create a DAG node of the specified type. If a parent DAG node is provided the new node will be parented under it. If no parent is provided and the new DAG node is a transform type then it will be parented under the world. In both of these cases the method returns the new DAG node.
If no parent is provided and the new DAG node is not a transform type then a transform node will be created and the child parented under that. The new transform will be parented under the world and it is the transform node which will be returned by the method, not the child.
None of the newly created nodes will be added to the DAG until the modifier’s doIt() method is called.
- Notes:
If you try to use
createDagNode()
to create an empty NurbsCurve or Mesh, calling bestFn() on the returnedXNode
will give you MFnNurbsCurve or MFnMesh but these are invalid to work with. You will end up getting a misleading “Object does not exist.” error as Maya doesn’t like an empty NurbsCurve or Mesh.- Raises:
TypeError
if the node type does not exist or if the parent is not a transform type.- Args:
typeName (str): the type of the object to create, e.g. “transform”.
parent (
om2.MObject
|XNode
, optional): An optional parent for the DAG node to create.nodeName (str, optional): the node name, if non empty will be used in a modifier.renameObject call. Defaults to “”.
manageTransformIfNeeded (bool, optional): when you create a shape without a parent, Maya will create both transform and shape, and return parent om2.MObject instead. if manageTransformIfNeeded is True, than we will also rename the transform, and return shape MObject instead. Most of time we keep it default True value.
returnAllCreated (bool, optional): If True, it will return all newly created nodes, potentially including any new parent transforms and the shape of the type.
- Returns:
XNode
| list: An _xnode.XNode instance around the created MObject, or the list of all created nodes, if returnAllCreated is True.
- createNode(typeName, *args, **kwargs)[source]
Convenience method to be able to use an XModifier when a MDagModifier or MDGModifier is expected.
- Args:
typeName (str): the type of the object to create, e.g. “transform”
- Returns:
om2.MObject
: The created MObject
- deleteNode(node)[source]
Deletes the node
Adds an operation to the modifer which deletes the specified node from the Dependency Graph. If the modifier already contains other operations on the same node (e.g. a disconnect) then they should be committed by calling the modifier’s doIt() before the deleteNode operation is added.
- disconnect(*args, **kwargs)[source]
Disconnects two plugs
Adds an operation to the modifier that breaks a connection between two plugs in the dependency graph. Plugs can either be specified with node and attribute MObjects or with MPlugs.
- Note:
Arguments v1: It works for all the scenarios, including disconnecting two array plugs at array level.
source (
XPlug
|om2.MPlug
): The source plug dest (XPlug
|om2.MPlug
): The destination plugArguments v2: Unlike the connect() version, it does not work on array attributes.
sourceNode (
MObject
): The source MObject sourceAttr (MObject
): The source attribute MObject destNode (MObject
): The destination MObject destAttr (MObject
): The destination attribute MObject- Returns:
XModifier
: A reference to self
- doIt(keepJournal=False)[source]
Executes the operations held by this modifier in Maya.
- Notes:
In immediate mode this will actually execute doIt from within a dynamic Maya command to allow undo to function.
If doIt() is called multiple times in a row, without any intervening calls to undoIt(), then only the operations which were added since the previous doIt() call will be executed. If undoIt() has been called then the next call to doIt() will do all operations.
- Args:
keepJournal (bool, optional): Retains the journal for further inspection. Defaults to False.
- isClean()[source]
Returns True if the modifier has nothing to do.
- Notes:
It will also return True if the modifier has already been used by a Command.
- Returns:
bool: the clean state.
- journal()[source]
Returns the current list of operations to run.
- Returns:
list(str): A list of strings describing the operations to run.
- linkExtensionAttributeToPlugin(plugin, attribute)[source]
Links an extension attribute to a plugin
The plugin can call this method to indicate that the extension attribute defines part of the plugin, regardless of the node type to which it attaches itself. This requirement is used when the plugin is checked to see if it is in use or if is able to be unloaded or if it is required as part of a stored file. For compound attributes only the topmost parent attribute may be passed in and all of its children will be included, recursively. Thus it’s not possible to link a child attribute to a plugin by itself. Note that the link is established immediately and is not affected by the modifier’s doIt() or undoIt() methods.
- Args:
plugin (
om2.MObject
): The plugin attribute (om2.MObject
): The attribute MObject- Returns:
XModifier
: A reference to self
- newPlugValue(plug, value)[source]
Sets a new plug value.
Adds an operation to the modifier to set the value of a plug, where value is an MObject data wrapper, such as created by the various MFn*Data classes.
- newPlugValueBool(plug, value)[source]
Adds an operation to the modifier to set a value onto a bool plug.
- newPlugValueChar(plug, value)[source]
Adds an operation to the modifier to set a value onto a char (single byte signed integer) plug.
- newPlugValueDouble(plug, value)[source]
Adds an operation to the modifier to set a value onto a double-precision float plug.
- newPlugValueFloat(plug, value)[source]
Adds an operation to the modifier to set a value onto a single-precision float plug.
- newPlugValueInt(plug, value)[source]
Adds an operation to the modifier to set a value onto an int plug.
- newPlugValueMAngle(plug, value)[source]
Adds an operation to the modifier to set a value onto an angle plug.
- newPlugValueMDistance(plug, value)[source]
Adds an operation to the modifier to set a value onto a distance plug.
- newPlugValueMTime(plug, value)[source]
Adds an operation to the modifier to set a value onto a time plug.
- newPlugValueShort(plug, value)[source]
Adds an operation to the modifier to set a value onto a short integer plug.
- newPlugValueString(plug, value)[source]
Adds an operation to the modifier to set a value onto a string plug.
- pythonCommandToExecute(callable_)[source]
Adds an operation to execute a python command
Adds an operation to the modifier to execute a Python command, which can be passed as either a Python callable or a string containing the text of the Python code to be executed. The command should be fully undoable otherwise unexpected results may occur. If the command contains no undoable portions whatsoever, the call to doIt() may fail, but only after executing the command. It is best to use multiple calls rather than batching multiple commands into a single call to pythonCommandToExecute(). They will still be undone together, as a single undo action by the user, but Maya will better be able to recover if one of the commands fails.
- Args:
callable (callable | str): The command to execute
- Returns:
XModifier
: A reference to self
- removeAttribute(node, attribute)[source]
Removes a dynamic attribute.
Adds an operation to the modifier to remove a dynamic attribute from the given dependency node. If the attribute is a compound its children will be removed as well, so only the parent needs to be removed using this method. The attribute MObject passed in will be set to kNullObj. There should be no function sets attached to the attribute at the time of the call as their behaviour may become unpredictable.
- removeExtensionAttribute(nodeClass, attribute)[source]
Removes an extension attribute.
Adds an operation to the modifier to remove an extension attribute from the given node class. If the attribute is a compound its children will be removed as well, so only the parent needs to be removed using this method. The attribute MObject passed in will be set to kNullObj. There should be no function sets attached to the attribute at the time of the call as their behaviour may become unpredictable.
- Args:
nodeClass (
om2.MNodeClass
): The node classattribute (
om2.MObject
): The attribute MObject to add- Returns:
XModifier
: A reference to self
- removeExtensionAttributeIfUnset(nodeClass, attribute)[source]
Removes an extension attribute.
Adds an operation to the modifier to remove an extension attribute from the given node class, but only if there are no nodes in the graph with non-default values for this attribute. If the attribute is a compound its children will be removed as well, so only the parent needs to be removed using this method. The attribute MObject passed in will be set to kNullObj. There should be no function sets attached to the attribute at the time of the call as their behaviour may become unpredictable.
- Args:
nodeClass (
om2.MNodeClass
): The node classattribute (
om2.MObject
): The attribute MObject to add- Returns:
XModifier
: A reference to self
- removeMultiInstance(plug, breakConnections)[source]
Adds an operation to the modifier to remove an element of a multi (array) plug.
- renameAttribute(node, attribute, newShortName, newLongName)[source]
Adds an operation to the modifer that renames a dynamic attribute on the given dependency node.
- reparentNode(node, newParent=None, absolute=False)[source]
Adds an operation to the modifier to reparent a DAG node under a specified parent.
Raises TypeError if the node is not a DAG node or the parent is not a transform type.
If no parent is provided then the DAG node will be reparented under the world, so long as it is a transform type. If it is not a transform type then the doIt() will raise a RuntimeError.
- Args:
node (
om2.MObject
|XNode
): The DAG node to reparentnewParent (
om2.MObject
|XNode
, optional): The new parent. Defaults to None.absolute (bool, optional): Whether or not we try to maintain the world transform of the node. If the node has some transform channels locked, it will try to fill the unlocked channels with debug message.
- Returns:
XModifier
: A reference to self
- setNodeLockState(node, newState)[source]
Adds an operation to the modifier to set the lockState of a node.
- undoIt(keepJournal=False)[source]
Undo the modifier operation in Maya. In immediate mode this function does nothing, as you should already be able to undo it in Maya.
- Notes:
It is only used in the scenario that a user creates a modifier manually by calling omx.newModifier()
- Args:
keepJournal (bool, optional): Retains the journal for further inspection. Defaults to False.
- unlinkExtensionAttributeFromPlugin(plugin, attribute)[source]
Unlinks an extension attribute from a plugin.
The plugin can call this method to indicate that it no longer requires an extension attribute for its operation. This requirement is used when the plugin is checked to see if it is in use or if is able to be unloaded or if it is required as part of a stored file. For compound attributes only the topmost parent attribute may be passed in and all of its children will be unlinked, recursively. Thus it’s not possible to unlink a child attribute from a plugin by itself. Note that the link is broken immediately and is not affected by the modifier’s doIt() or undoIt() methods.
- Args:
plugin (
om2.MObject
): The pluginattribute (
om2.MObject
): The attribute MObject to add- Returns:
XModifier
: A reference to self
- class AL.omx.XNode(obj)[source]
Bases:
object
Easy wrapper around om2 objects mainly to access plugs.
- __hash__()[source]
Add support for using XNode for containers that require uniqueness, e.g. dict key.
- __repr__()[source]
Get the more unambiguous str representation. This is mainly for debugging purposes.
- Returns:
str
- __str__()[source]
Returns an easy-readable str representation of this XNode.
Construct a minimum unique path to support duplicate MObjects in scene. For invalid MObject we return the last known name with a suffix (dead) or (invalid) respectively.
- Returns:
str: the string representation.
- apiType()[source]
Returns the function set type for the object.
- Returns:
om2.MFn: Returns a constant indicating the type of the internal Maya object. If the MObject is null MFn.kInvalid will be returned.
- basicFn()[source]
Returns the basic MFnDAGNode or MFnDependencyNode for the associated MObject
- Notes:
Usually you would use xnode.bestFn() to get the most useful function set. But for an empty nurbsCurve or an empty mesh node, only xnode.basicFn() will work as expected.
- Returns:
om2.MFnDagNode | om2.MFnDependencyNode: For a DAG node or a DG node respectively.
- bestFn()[source]
Returns the best MFn function set for the associated MObject
- Raises:
RuntimeError: if no MFn is found for the wrapped MObject
- Returns:
om2.MFn*: the best MFn object for this MObject (usually a
om2.MFnTransform
or aom2.MFnDependencyNode
)
- createDagNode(typeName, nodeName='')[source]
Creates a child DAG node on the current node if possible.
Adds an operation to the modifier to create a DAG node of the specified type. If a parent DAG node is provided the new node will be parented under it. If no parent is provided and the new DAG node is a transform type then it will be parented under the world. In both of these cases the method returns the new DAG node.
If no parent is provided and the new DAG node is not a transform type then a transform node will be created and the child parented under that. The new transform will be parented under the world and it is the transform node which will be returned by the method, not the child.
None of the newly created nodes will be added to the DAG until the modifier’s doIt() method is called.
- Raises:
TypeError
if the node type does not exist or if the parent is not a transform type.- Args:
typeName (string): the type of the object to create, e.g. “transform”
nodeName (str, optional): the node name, if non empty will be used in a modifier.renameObject call. Defaults to “”.
- Returns:
XNode
: An XNode instance around the created MObject.
- hasFn(fn)[source]
Tests whether object is compatible with the specified function set.
- Args:
fn (om2.MFn): MFn type constant
- Returns:
bool: Returns True if the internal Maya object supports the specified function set specified by fn.
- isAlive()[source]
Returns the live state of the current MObject associated with this XNode. An object can still be ‘alive’ but not ‘valid’ (eg. a deleted object that resides in the undo queue).
- Returns:
bool: the live state
- isNull()[source]
Tests whether there is an internal Maya object.
- Returns:
bool: Returns True if the MObject is not referring to any Maya internal internal object (i.e. it is equivalent to kNullObj).
- class AL.omx.XPlug(*args, **kwargs)[source]
Bases:
MPlug
XPlug is not meant to be used directly, get one from
XNode
!You can use omx.XPlug over an om2.MPlug to take advantage of the extra convenience features.
Examples:
xplug = xnode.attr xplug.get() # Get you the value of the plug xplug.set(value) # Set the value of the plug xplug[0] # The element xplug by the logicial index 0 if xplug is an array plug. xplug['childAttr'] # The child xplug named 'childAttr' if xplug is a compound plug. xplug.xnode() # Get you the parent xnode.
Invalid Examples:
xplug['childAttr.attr1'] # This won't work, use xplug['childAttr']['attr1'] instead. xplug['childAttr[0]'] # This won't work, use xplug['childAttr'][0] instead. ...
- __contains__(key)[source]
Add support for the key in xPlug syntax.
Checks if the index is an existing index of an array, or the str name is a valid child of a compound.
- Args:
key (int | str): The array element plug logical index or the child plug name.
- Notes:
We can extend to accept om2.MPlug or omx.XPlug as the input to check, but here we just stay lined up with __getitem__().
- Returns:
bool: True if index or name is valid, False otherwise.
- __getitem__(key)[source]
Adds support for the xplug[key] syntax where you can get one of an array’s elements, or a compound’s child, as XPlug.
- Args:
key (int | str): The array element plug logical index or the child plug name.
- Returns:
- Raises:
AttributeError if compound plug doesn’t have the child with name, TypeError for all the other cases.
- __iter__()[source]
Adds support for the for p in xPlug syntax so you can iter through an array’s elements, or a compound’s children, as XPlugs.
- Yields:
- __repr__()[source]
Get the more unambiguous str representation. This is mainly for debugging purposes.
- Returns:
str
- __str__()[source]
Returns an easy-readable str representation of this XPlug. Constructs a minimum unique path to support duplicate MObjects in scene. “NullPlug” will be returned if this plug isNull.
- Returns:
str
- child(index)[source]
Returns the child at index as an XPlug, if this plug is of type compound.
- Args:
index (int): The child index.
- Returns:
omx.XPlug | NullPlug : A valid XPlug or NullPlug (as an XPlug)
- connectFrom(source, force=False)[source]
Connect this plug to a source plug
This is an alias to connect
- Args:
source (
om2.MPlug
|XPlug
): source plugforce (bool, optional): override existing connection
- connectTo(destination, force=False)[source]
Connect this plug to a destination plug
- Args:
destination (
om2.MPlug
|XPlug
): destination plugforce (bool, optional): override existing connection
- destinations()[source]
Get the destination plugs as a list of XPlugs for valid outgoing connections.
- Returns:
List[omx.XPlug, ] | []
- enumNames()[source]
Get the enum name tuple if it is an enum attribute, otherwise None.
- Returns:
tuple of strs: The tuple of enum names.
- get(asDegrees=False)[source]
Get the value of the plug.
- Args:
asDegrees (bool, optional): For an angle unit attribute we return the value in degrees or in radians.
- nextAvailable()[source]
Get the next available element plug that does not exist yet for this array plug.
- Returns:
omx.XPlug | None
- set(value, asDegrees=False)[source]
Set plug to the value.
- Notes:
For enum attribute, you can set value by both short int or a valid enum name string. To retrieve the valid enum names, use
XPlug.enumNames()
This method does many checks to make sure it works for different types of attributes. If you know the type of attribute, the preference would be to use the set*() methods instead, they are more lightweight and have better performance.
- Args:
value (any): The plug value to set.
asDegrees (bool, optional): When it is an angle unit attribute, if this is True than we take the value as degrees, otherwise as radians.This flag has no effect when it is not an angle unit attribute.
- Returns:
The previous value if it is simple plug and the set was successful. None or empty list otherwise.
- setAngle(value)[source]
Adds an operation to the modifier to set a value onto an angle plug.
- Args:
value (
om2.MAngle
): the value.
- setBool(value)[source]
Adds an operation to the modifier to set a value onto a bool plug.
- Args:
value (bool): the value.
- setChar(value)[source]
Adds an operation to the modifier to set a value onto a char (single byte signed integer) plug.
- Args:
value (int): the value.
- setCompoundDouble(value)[source]
Adds an operation to the modifier to compound attribute’s double plugs children.
- Args:
- value ([double]): the list of double value whose amount should be
no larger to the amount of children.
- setDistance(value)[source]
Adds an operation to the modifier to set a value onto a distance plug.
- Args:
value (
om2.MDistance
): the value.
- setDouble(value)[source]
Adds an operation to the modifier to set a value onto a double-precision float plug.
- Args:
value (float): the value.
- setFloat(value)[source]
Adds an operation to the modifier to set a value onto a single-precision float plug.
- Args:
value (float): the value.
- setInt(value)[source]
Adds an operation to the modifier to set a value onto an int plug.
- Args:
value (int): the value.
- setShort(value)[source]
Adds an operation to the modifier to set a value onto a short integer plug.
- Args:
value (int): the value.
- setString(value)[source]
Adds an operation to the modifier to set a value onto a string plug.
- Args:
value (str): the value.
- setTime(value)[source]
Adds an operation to the modifier to set a value onto a time plug.
- Args:
value (
om2.MTime
): the value.
- AL.omx.commandModifierContext(command)[source]
A Python Context Manager to be used within ALCommand doIt method.
This modifier ensures a non-immediate XModifier is added to the current list of modifiers, and called doIt on exit.
- Notes:
This is a util only for AL internal use.
- Args:
command (
Command
): The command instance
- AL.omx.createDGNode(typeName, nodeName='')[source]
Creates a DG Node within the current active
XModifier
- AL.omx.createDagNode(typeName, parent=<_OpenMaya name='mock.MObject.kNullObj' id='139720921141968'>, nodeName='', returnAllCreated=False)[source]
Creates a DAG Node within the current active
XModifier
- Note:
We automatically work around a limitation of the om2.MDagModifier here, where Maya would return the shape’s parent transform MObject. Instead we return an
XNode
for the newly created Shape node if the type is of Shape.- Args:
typeName (str): The type of the DAG node to create.
parent (
XNode
|om2.MObject
|om2.MFnDagNode
| str, optional): The parent of the DAG node to create. Defaults to om2.MObject.kNullObj.nodeName (str, optional): The name of the node to create (used to call mod.renameNode after creation). Defaults to “”.
returnAllCreated (bool, optional): If True, it will return any newly created nodes, including potential new parent transform and the shape of the type.
- Returns:
XNode
| [XNode
]: The created XNode or a list of XNodes, based on returnAllCreated argument.
- AL.omx.currentModifier()[source]
Returns the last XModifier from the current modifier list. If the current list is empty it creates and returns a new immediate XModifier.
- AL.omx.isJournalOn()[source]
Query if we are actually recording journal for each creation or edit by omx.
- AL.omx.newAnimCurveModifier()[source]
Creates a new om2anim.MAnimCurveChange object, adds it to the current list of modifiers and returns it.
- Returns:
om2anim.MAnimCurveChange
: The newly created MAnimCurveChange
- AL.omx.newModifier()[source]
Creates a new non-immediate XModifier, adds it to the current list of modifiers and returns it.
- Returns:
XModifier
: The newly created XModifier
- AL.omx.newModifierContext()[source]
Create a new
XModifier
for the context, and callXModifier.doIt()
on context exit.- Notes:
Any edits done within the python context, they are using the new
XModifier
.
- AL.omx.queryTrackedNodes(queryAll=False)[source]
The mobject handles to the nodes that have been created since tracking has been started.
- Args:
queryAll (bool, optional): If true, return the entire list of handles, otherwise just the handles since startTrackingNodes has last been called.
- Returns:
list[
om2.MObjectHandle
]: The list of created nodes.
- AL.omx.setJournalToggle(state)[source]
By default we don’t keep journal for all the creation or edit by omx. Use this function to turn it on.
- Notes:
Keep in mind this is a global state, turning on journal will slow down the overall performance!
Another way to toggle the journal on is to set it to None (default value) and set the logging level to
logging.DEBUG
forAL.omx._xmodifier
.Also turning the journal on only makes omx start to record journal, the creation or edits that are already done still won’t be in the journal.
- Args:
- state (bool | None): the state of toggle.
True = force on, off = force off, None = depends on it is DEBUG logging level