📖

MayaのaliasとArnold AOVs

2024/04/06に公開

aliasとArnoldでハマったのでメモ

aliasとは

mayaでattributeに付けられる別名のこと。
ノード毎に設定される。

aliasの設定方法

http://me.autodesk.jp/wam/maya/docs/Maya2010/Commands/aliasAttr.html

import maya.cmds as cmds

cmds.aliasAttr('myAlias', 'myNode.myAttr')

コードを実行するとノードに attributeAliasList というアトリビュートが追加される。

aliasが設定されたattributeは、cmdsコマンドなどでもalias名でアクセスできる。

エイリアスの子要素はaliasを使ってアクセスができないので注意。
例えば、以下のような場合はエラーになる。

#OK
cmds.getAttr('myNode.myAlias')
#NG
cmds.getAttr('myNode.myAlias.child')

arnold AOVs

aovsモジュールを使うと、AOVを追加することができる。
追加時に、shaderにaliasが設定される。(referenceノードでない場合)

import mtoa.aovs as aovs
aovs.AOVInterface().addAOV(aovName="test")

aliasがaiCustomAOVs[N]につく場合とaliasがaiCustomAOVs[N]の子であるAovNameにつく場合がある。何故?
(初回作成時は、aiCustomAOVs[N]が変更される。)

aliasの取得方法

https://help.autodesk.com/view/MAYAUL/2022/ENU/?guid=Maya_SDK_py_ref_class_open_maya_1_1_m_fn_dependency_node_html

aliasの取得はcmdsでは出来なそうなので、python api2.0を利用する。
getAliasList()はタプルで元の名前とエイリアス名で返す。

from typing import Dict, Tuple, Optional
import maya.api.OpenMaya as om2

def get_alias_dict(node_name) -> Dict[str, str]:
    '''
    エイリアスを取得する

    Args:
        node_name(str): ノード名

    Returns:
        Dict: エイリアスの辞書
                {alias_name: real_name}
    '''
    selection_list: om2.MSelectionList = om2.MSelectionList()
    selection_list.add(node_name)
    node_mobject = selection_list.getDependNode(0)
    dep_node: om2.MFnDependencyNode = om2.MFnDependencyNode(node_mobject)
    alias_list: Tuple[Optional[Tuple[str, str]]] = dep_node.getAliasList()

    if not alias_list:
        return {}
    return dict(filter(None, alias_list))

テーブルウィジェットでAliasと実際の名前を表示するUIを作成しました。
https://github.com/njmn/alias_table

その他

referenceノードにはaliasが設定できない+引き継げないので、aliasを取得する際は注意が必要。
(mtoaのAOVモジュールを修正すればいける。)

aliasの取得方法わかんなくて困ってたけど、mtoaのコード見たら書いてあった。
arnoldで困ったらmtoa見れば結構何とかなるかも。

Discussion