この記事はMaya Advent Calender 2019の9日目の記事です。
はじめに
NodeEditorでノードを任意の順番に並べる私が発見したやり方を書きと思います。
NodeEditorで複数のノードを表示すると、よくわからない順番で表示されてしまい。複数のノードを順番にコネクトしたい時などに間違いを起こしやすいと思い、任意の順番に並べる方法を調べてみました。
標準で名前順とか選択順とか、階層順に並べる方法があったらゴメンナサイ。やり方教えてください。
標準でのやり方が分からなかったので、みつけた裏技になります。
(今回のMayaのバージョンは2017を使用しています。ほかのバージョン、環境ではではうまくいかないかもしれません。裏技なのでご了承ください。)
手順
ノードを選択した順番に並べる手動でやる手順は以下のようになります。
- NodeEditorを開きます。
- nodeEdSyncedSelectionを有効にします。(左から2番目のアイコンです。)
- Add to Graph on Createを有効にします。(南京錠風アイコンを開いた状態にします。)
- 並べたい順番に選択します。
- 選択したままセットを作成します。(Create>Sets>set)
- セットを削除します。
すると選択した順に並んでくれます。うまくいかない場合もありますが、
(5.の選択したままセットを作成)を数回を繰り返すと大抵並んでくれるようです。
一つづつドラッグしてで並べなおすよりは楽ですかね?
Pythonスクリプトにする
以上の手順に少し手を加え、パイソンスクリプトにしてみました。
- Description: NodeEditor で 選択ノードを階層順に並べなおします。
- コマンド: 〇〇.sort_OnNodeEditor(mod=cmds.getModifiers(),n=5)
- 引数説明:
mod=0 階層順 (dagノードはシェイプとトランフォームを分けて並べ、dagノード以外は名前順に並べます)
mod=1 名前順
mod=4 選択順
n=5 (セット作成の)繰り返し回数
import maya.cmds as cmds
import maya.mel as mel
def sort_OnNodeEditor(mod=0,n=5):
ned=mel.eval('getCurrentNodeEditor')
if ned:
if mod==0:
Selected =cmds.ls(sl=1,l=1)
dag=[I for I in cmds.ls(dag=1,l=1) if I in Selected]
tr=cmds.ls(dag,tr=1,l=1)
dep=[I for I in Selected if I not in dag]
dag=[I for I in dag if I not in tr]
cmds.select(tr,dag,sorted(dep),ne=1)
elif mod==1:
cmds.select(sorted(cmds.ls(sl=1,l=1)),ne=1)
for i in range(n):
set=cmds.sets(n='NodeEditorIsBug_Set')
cmds.nodeEditor(ned,e=1,addNode=set)
cmds.nodeEditor(ned,e=1,layout=1)
cmds.refresh(f=1)
for I in cmds.ls('NodeEditorIsBug_Set*'):
Con=cmds.listConnections(I,d=0,p=1,c=1)
for j in range(0,len(Con),2):cmds.disconnectAttr(Con[j+1],Con[j])
if cmds.objExists('NodeEditorIsBug_Set*'):cmds.delete('NodeEditorIsBug_Set*')
それでは時間が来たので。失礼いたします。