LoginSignup
12
5

More than 3 years have passed since last update.

Mayaのリファレンス周りのコマンドのご紹介

Last updated at Posted at 2019-12-04

はじめに

リファレンス周りのコマンドのご紹介です。
解説というよりよく使うものだけまとめたものになります。

既に似たような内容でアドベンドカレンダーに投稿されていますが気にしない!

referenceノードの名前を取得

リファレンスされたオブジェクトからreferenceノードを取得してみます。
image.png

まず間違ったやり方をご紹介。

node      = "ref:pSphere1"
namespace = node.split(":")[0]
RNnode    = namespace + 'RN'
# Result: u'refRN' # 

問題なく動くように見えますが、オブジェクトのネームスペースが変わった場合動きません。

正しいやり方がこちら

node   = "ref:pSphere1"
RNnode = cmds.referenceQuery(node, referenceNode=True)
# Result: u'refRN' # 

元のオブジェクトのネームスペースが変わっても問題なくRNノードの名前を取得できます。

リファレンスノードから情報を取得

よく使うもの

withoutCopyNumberは知らないとハマるので気を付けましょう。

node   = "ref:pSphere1"
RNnode = cmds.referenceQuery(node, referenceNode=True)

# リファレンスのネームスペースを取得
cmds.referenceQuery(RNnode, namespace=True)
# Result: u':ref' # 

# リファレンスのファイルパスを取得
cmds.referenceQuery(RNnode, filename=True)
# Result: u'C:/Users/ponty/Desktop/ref.ma' # 

# filenameのResultが'C:/Users/ponty/Desktop/ref.ma(1)'となる場合はこちらを使います。 
# リファレンスのファイルパスを取得
cmds.referenceQuery(RNnode, filename=True, withoutCopyNumber=True)
# Result: u'C:/Users/ponty/Desktop/ref.ma' # 

# リファレンスのロード状態を取得
cmds.referenceQuery(RNnode, isLoaded=True)
# Result: True # 

# リファレンスされたオブジェクト一覧を取得
cmds.referenceQuery(RNnode, nodes=True)
"""
Result: [
 u'ref:pSphere1',
 u'ref:pSphereShape1',
 u'ref:shapeEditorManager',
 u'ref:poseInterpolatorManager',
 u'ref:layerManager',
 u'ref:defaultLayer',
 u'ref:renderLayerManager',
 u'ref:defaultRenderLayer',
 u'ref:polySphere1',
 u'ref:uiConfigurationScriptNode',
 u'ref:sceneConfigurationScriptNode'
 ]
"""

関数化

シーン内のアセット情報一覧をまとめて辞書にまとめてみます。

def getRefarenceInfo():
    ret = []

    refNodes = cmds.ls(references=True)
    for RNnode in refNodes:
        ref = {}
        ref.update({
            'namespace' : cmds.referenceQuery(RNnode, namespace=True),
            'filenam'   : cmds.referenceQuery(RNnode, filename=True),
            'w_filenam' : cmds.referenceQuery(RNnode, filename=True, withoutCopyNumber=True),
            'isLoaded'  : cmds.referenceQuery(RNnode, isLoaded=True),
            'nodes'     : cmds.referenceQuery(RNnode, nodes=True),
            'node'      : cmds.referenceQuery(RNnode, nodes=True)[0],
            })
        ret.append(ref)

    return ret
"""
# Result: [{'filenam': u'C:/Users/ponty/Desktop/cube.ma{1}',
  'isLoaded': True,
  'namespace': u':ref',
  'node': u'ref:pCube1',
  'nodes': [u'ref:pCube1',
            u'ref:pCubeShape1',
            u'ref:shapeEditorManager',
            u'ref:poseInterpolatorManager',
            u'ref:layerManager',
            u'ref:defaultLayer',
            u'ref:renderLayerManager',
            u'ref:defaultRenderLayer',
            u'ref:polyCube1',
            u'ref:uiConfigurationScriptNode',
            u'ref:sceneConfigurationScriptNode'],
  'w_filenam': u'C:/Users/ponty/Desktop/cube.ma'},
 {'filenam': u'C:/Users/ponty/Desktop/ref.ma{2}',
  'isLoaded': True,
  'namespace': u':ref1',
  'node': u'ref1:pSphere1',
  'nodes': [u'ref1:pSphere1',
            u'ref1:pSphereShape1',
            u'ref1:shapeEditorManager',
            u'ref1:poseInterpolatorManager',
            u'ref1:layerManager',
            u'ref1:defaultLayer',
            u'ref1:renderLayerManager',
            u'ref1:defaultRenderLayer',
            u'ref1:polySphere1',
            u'ref1:uiConfigurationScriptNode',
            u'ref1:sceneConfigurationScriptNode'],
  'w_filenam': u'C:/Users/ponty/Desktop/ref.ma'}] # 
"""

実際のお仕事でよく使います。

Reference周りの操作

# リファレンスの作成
cmds.file('C:/Users/ponty/Desktop/ref.ma', reference=True, ns='ref')
# Result: u'C:/Users/ponty/Desktop/ref.ma' # 

# リファレンスのリムーブ
node   = "ref:pSphere1"
RNnode = cmds.referenceQuery(node, referenceNode=True)
RNpath = cmds.referenceQuery(RNnode, filename=True)
cmds.file(RNpath, removeReference=True)

# リファレンスの置き換え
node   = "ref:pSphere1"
RNnode = cmds.referenceQuery(node, referenceNode=True)
cmds.file('C:/Users/ponty/Desktop/cube.ma', lr=RNnode)

同じキャラクターを何体もリファレンスで読むこむ必要がある場合は、コマンドから読み込むと楽になります。

cmds.file('C:/Users/ponty/Desktop/characterA.ma', reference=True, ns='CH_A_1')
cmds.file('C:/Users/ponty/Desktop/characterA.ma', reference=True, ns='CH_A_2')
cmds.file('C:/Users/ponty/Desktop/characterA.ma', reference=True, ns='CH_A_3')
cmds.file('C:/Users/ponty/Desktop/characterB.ma', reference=True, ns='CH_B_1')
cmds.file('C:/Users/ponty/Desktop/characterB.ma', reference=True, ns='CH_B_2')
cmds.file('C:/Users/ponty/Desktop/characterB.ma', reference=True, ns='CH_B_3')

ファイル操作を手作業でやると後々苦しむ羽目になるので出来る範囲で自動化しましょう!

以上!

12
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
5