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

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

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

# referenceノードの名前を取得
リファレンスされたオブジェクトからreferenceノードを取得してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79407/d87547ca-ec9b-317f-cbae-cd80ea20021d.png)

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

```python
node      = "ref:pSphere1"
namespace = node.split(":")[0]
RNnode    = namespace + 'RN'
# Result: u'refRN' # 
```
問題なく動くように見えますが、オブジェクトのネームスペースが変わった場合動きません。

正しいやり方がこちら

```python
node   = "ref:pSphere1"
RNnode = cmds.referenceQuery(node, referenceNode=True)
# Result: u'refRN' # 
```
元のオブジェクトのネームスペースが変わっても問題なくRNノードの名前を取得できます。

# リファレンスノードから情報を取得
よく使うもの

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

https://help.autodesk.com/cloudhelp/2019/JPN/Maya-Tech-Docs/CommandsPython/referenceEdit.html

```python
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'
 ]
"""
```

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

```python
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周りの操作

```python
# リファレンスの作成
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)
```

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

```python
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')
```


---

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

以上！