2
番外編!
Presented By Ritaro
HomePage http://www.comtec.daikin.co.jp/DC/UsersNotes/
@DaikinComtec_CG @SI_UsersNotes
Maya;
大人気!カスタム・グラフエディタと
便利ツールをPythonで!!
Agenda
● 最新カスタム・グラフエディタの紹介
使用ソフト; Maya 2016,MotionBuilder2016
● Pythonで実現した便利ツールの紹介
● カスタム・ハイパーグラフの紹介
● これまでの経緯と最新版で達成した機能
● Rig用ICONツール
● SynopticView(Softimage名);選択用GUI
● 表の作成と書き込み/読み込み
scriptTableコマンドとCSVファイル
SynopticView機能考察と組み合わせて出来たものとは。。。
● おまけ
● 最新カスタム・グラフエディタの紹介
● これまでの経緯と最新版で達成した機能
■ カスタム・グラフエディタ
● 既存グラフエディタの一大要望と問題点
● [一大要望] = タイムラインの表示
■ 現在は以下2点を解決している。
● [問題点] = パネルの取り扱い
http://www.comtec.daikin.co.jp/DC/UsersNotes/Ritaro/tutorial/maya_02/
GraphEditorのパネルタイプは scriptedPanel
これまでの経緯と最新版で達成した機能 1
~少しずつヒモ解いていった 初投稿 Version 1 は 2014年8月 からスタート
・メインウィンド下と連動してスクラブで動くキーフレーム変更GUI
・スクリプティングからのパネルの作成と管理
windowコマンド扱いにしたい、trearOffPanelは増殖し続ける
MEL記述部分をなるべくPython記述にしてすっきりさせたい
カレントタイムスクラブ k ;Maya-SIHOTキー Alt+k
これまでの経緯と最新版で達成した機能 2
● [一大要望] = タイムラインの表示
>> なんとかメインウィンドウ下のTimeLineを実現したい。
mel.eval('tearOffCopyItemCmd scriptedPanel graphEditor1;') の下に追記しただけ。
・intSliderGrp コマンド を Slider 表示
・intSliderGrp を GraphEditor 下に表示
★ ふと timePort コマンドを知る!! だが、マニュアルのPython記述だと表示しない > 縦横値が必要
cmds.timePort(enableBackground=True,bgc=[0.2,0.2,0.2],width=500,height=20 )
cmds.intSliderGrp('TimeSlider',field=True,・・・
・最初は QT Designer の Slider の試作から始まった。
■ カスタム・グラフエディタ
これまでの経緯と最新版で達成した機能 3
● [問題点] = パネルの取り扱い
>> なんとかMel記述からの脱却とWindow内表示で管理したい。1
・最初は Melコマンドのティアオフ 表示方法から始まった。
最初から複数表示で使うことを考えている
★ ふと window コマンド 内に scriptedPanel を表示する方法を知る!!
パネル名に連番を追記して、ボタンコマンドのユニーク名とした
grp_panel_no_a = str( len(cmds.getPanel( scriptType='graphEditor' )) + 1 )
panel_name = "GraphEditor" + grp_panel_no_a
mel.eval('string $panel_name = "%s"' % panel_name)
mel.eval('tearOffPanel $panel_name "graphEditor" true;')
この記述の下に記述することで、下に button や timePort を追加した
paneLayout コマンドを利用してフラグに horizontal2 を使う
■ カスタム・グラフエディタ
これまでの経緯と最新版で達成した機能 3.5
● [問題点] = パネルの取り扱い
win1 = cmds.window('custom_graphEditor'+ grp_panel_no_a,
title='New CustomGraphEditor'+ grp_panel_no_a,
resizeToFitChildren=True, widthHeight=(1100, 450))
pane1 = cmds.paneLayout(configuration='horizontal2', paneSize=[2,1,1], parent=win1)
graphmenu = 'graphEditor' + grp_panel_no_a
cmds.scriptedPanel(graphmenu, label=graphmenu ,type='graphEditor', parent=pane1)
この記述で、windowを親とするパネルとしてグラフエディタを入れることが出来た
>> なんとかMel記述からの脱却とWindow内表示で管理したい。2
■ カスタム・グラフエディタ
これまでの経緯と最新版で達成した機能 4
● [問題点] = パネルの取り扱い
>> なんとか増殖し続けるパネルを整理したい。
★ ふと deleteUI コマンドのフラグで パネル を削除することを知る!!
表示していないパネルリストから、グラフエディタがあったら削除する
invis_panel = cmds.getPanel(invisiblePanels=True)
graphpanels = cmds.getPanel(scriptType='graphEditor')
graphpanels.remove('graphEditor1')
for o_graphp in graphpanels:
if o_graphp in invis_panel:
cmds.deleteUI(o_graphp,panel=True)
★ 使用したパネルがドンドン溜まっていくのを防ぐことが出来た !!
ただし graphEditor1 は削除しない
■ カスタム・グラフエディタ
これまでの経緯と最新版で達成した機能 5
● 最新バージョンの発表 ! = Outliner の設置 (未公開)
>> なんとかノード選択機能を補いたい。
★ ふと paneLayout コマンド のフラグを vertical2 にする方法を知る!!
pane1 = cmds.paneLayout(configuration='vertical2', paneSize=[1,20,1], parent=win1)
in_panel = cmds.outlinerPanel()
outliner = cmds.outlinerPanel(in_panel, query=True,outlinerEditor=True)
cmds.outlinerEditor(outliner, edit=True,showDagOnly=True,
transmitFilters=False,setFilter='DefaultPolygonObjectsFilter')
講演後公開予定お楽しみに・・・
CustomSideGraphEditor.py
■ カスタム・グラフエディタ
● カスタム・ハイパーグラフの紹介
■ カスタム・ハイパーグラフの紹介 1
http://www.comtec.daikin.co.jp/DC/UsersNotes/Ritaro/tutorial/maya_06/
●最新バージョン公開中
こちらも同じくWindow化と未使用パネル削除対応になっている。
invis_panel = cmds.getPanel(invisiblePanels=True)
hyphpanels = cmds.getPanel(scriptType='hyperGraphPanel')
hyphpanels.remove('hyperGraphPanel1')
for o_hyphpanel in hyphpanels:
if o_hyphpanel in invis_panel:
cmds.deleteUI(o_hyphpanel,panel=True)
hyper_panel_no_a = str( len(cmds.getPanel( scriptType='hyperGraphPanel' )) + 1 )
win1 = cmds.window('custom_HyperGraph'+ hyper_panel_no_a,
title='New CustomHyperGraph'+ hyper_panel_no_a,resizeToFitChildren=True,
widthHeight=(800, 500))
pane1 = cmds.paneLayout(configuration='horizontal2', paneSize=[2,1,1], parent=win1)
hypergraphmenu = 'hyperGraphPanel' + hyper_panel_no_a
cmds.scriptedPanel(hypergraphmenu, label=hypergraphmenu ,
type='hyperGraphPanel', parent=pane1)
http://www.comtec.daikin.co.jp/DC/UsersNotes/Ritaro/tutorial/maya_06/
●最新バージョン公開中
階層表示方法設定子画面 [Setup],Softimage的SRT一致ツール、ちかんツール(置換ね)
■ カスタム・ハイパーグラフの紹介 2
● Pythonで実現した便利ツールの紹介
● Rig用ICONツール
● SynopticView(Softimage名);選択用GUI
● 表の作成と書き込み/読み込み
scriptTableコマンドとCSVファイル
SynopticView機能と組み合わせて出来たものとは。。。
● Pythonで実現した便利ツールの紹介
● Rig用ICONツール
■ Pythonで実現した便利ツールの紹介 Rig用ICONツール 1
http://www.comtec.daikin.co.jp/DC/UsersNotes/Ritaro/tutorial/maya_07/
・キャラクター制御Rig用のICON集表示 + Tool GUI
★ 実は、最大の便利さは Scale にある
HIKなどのRigはスケールが大きい。
中身は、作成したカーブをデータ化して
cmds.curve(name='curve1',d=3,
p=[(-1.1112534999848538, 2.4959175586702926, 0.14370895922185412),
(-0.9331233132338141, 2.563328364756063, 0.14413296666402145),
・・・・・
(-1.111253499984741, 2.4959175586700435, 0.14370895922183932)],
k=[0.0, 0.0, 0.0, 1.0, 2.0, ・・・ 25.0, 26.0, 26.0, 26.0])
cmds.curve(name='作成されるカーブの名前',d=次数,p=ポイントの x、y、z の位置, k=ノットベクトルにあるノットの値)
リギング>コントロール>コントロールリグの作成>作成
スクリプトから生成している。
http://www.comtec.daikin.co.jp/DC/UsersNotes/Ritaro/tutorial/maya_07/
★ 面白い点; カーブのShapeデータを別のノードの子供にして、
例えば、
cmds.parent(relative=True, shape=True)
ICON表示と同じく、回転軸に制限を設け
⇔の方向だけに回転するようにすれば
解りやすり Rig が作成が可能
■ Pythonで実現した便利ツールの紹介 Rig用ICONツール 2
選択用の表示物として移せる。
選択も出来る
Joint などが作成出来る
カーブ表示物が付いた
● Pythonで実現した便利ツールの紹介
● SynopticView(Softimage名);選択用GUI
■ Pythonで実現した便利ツールの紹介 SynopticView 1 (未公開)
・キャラクター制御Rig用の選択GUI + 選択性(Selectability)
Softimageのコントロールリグ選択画面 (html+Script)
>> なんとか、自由に表示を変えられ、認識しやすく、
Rig選択が楽になるような GUIが作れないか
1) 表示ウィンドウ内にボタンを自由に配置する
2) クリックした時、そのノードに予定しているアニメーションの種類
(移動/回転/スケール) に変化する (選択性 = Selectability)
・既定表示マニュピレータ;
「マニュピレータの表示ツール」
にして選択する必要がある。
・キー>キーの設定;
◎現在のマニュピレータハンドル
■ Pythonで実現した便利ツールの紹介 SynopticView 2 (未公開)
★ 1) 背景用の画像を表示する formLayout コマンド なら
選択ボタンを自由に配置出来る
cmds.window()
window = cmds.window('synoptic_body', title=Synoptic Body HIK',sizeable=False,
topLeftCorner=[200, 200], widthHeight=(356,443))
form = cmds.formLayout()
bg1 = cmds.image( image= ’W:/Maya/Maya_GTMF2015/icons/sy_main00.png’ )
bot1 = cmds.button('b_body',label='Body HIK',bgc=[0.25,0.25,0.25], enable=False)
cmds.formLayout( form, edit=True,
attachForm=[
(bg1, 'left', 0), (bg1, 'top', 40),(bg1, 'right', 0),(bg1, 'bottom', 0),
(bot1 'left', 10),(bot1, 'top', 60),
・・・・・・・
])
cmds.showWindow(window)
■ Pythonで実現した便利ツールの紹介 SynopticView 3 (未公開)
cmds.setToolTo( 'moveSuperContext' )
★ 2) 選択性(Selectability)は setToolTo コマンドを使って
マニュピレーター自身を変化させる
cmds.setToolTo( 'Rotate' )
今選択しているツール・コンテキストの名前(マニュピレータ)を知るには
cmds.currentCtx() を使う。
移動ツールは 'moveSuperContext'
if cmds.currentCtx() != 'moveSuperContext':cmds.setToolTo( 'moveSuperContext' )
回転ツールは 'RotateSuperContext'、 'Rotate'
スケールツールは 'scaleSuperContext'
移動/回転/スケールツールは 'Transform'
既定のオブジェクト マニュピレータは 'ShowManips'
■ Pythonで実現した便利ツールの紹介 SynopticView 4 (未公開)
★ 2.5) 選択性(Selectability)を マウスの中ボタン に持たせたい
head_eff = cmds.iconTextButton('b_head_eff',image1= 'mbutton15r.png',style='iconOnly',
annotation='S_Ctrl_HeadEffector',
command=lambda *args: select_lists('head_eff',sy_names_b),
dragCallback=lambda *args: select_lists('r_head_eff',sy_names_b),
dropCallback=select_lists_dropcallback)
ここでは単純に 回転ツールにしているだけ
dropCallback もダミー処理を用意して、キー受付処理を終わらせる
elif o_select == 'r_head_eff':
if cmds.currentCtx() != 'Rotate':cmds.setToolTo( 'Rotate' )
実は buttonコマンドには 中ボタン用に dragCallback というフラグがある
本来の目的は dropCallback と対で使用して Drag&Drop機能 を実現させる
def select_lists_dropcallback(*args):
pass
■ Pythonで実現した便利ツールの紹介 SynopticView 5 (未公開)
★ 2.5) 選択性(Selectability)を マウスの中ボタン に持たせたい
def callbackName( dragControl, x, y, modifiers ):
実は dragCallback で中ボタンを押した時のキーの組み合わせまで取得出来る
def filter_rz( dragControl, x, y, modifiers ): # in CustomGraphEditor
if modifiers == 0: # MMB
コマンド1
elif modifiers == 1:# MMB + SHIFT
コマンド2
elif modifiers == 2:# MMB + CTRL
コマンド3
modifiers が
0 == 中ボタン + モディファイアなし、
3 == 中ボタン + CTRL + SHIFT、
1 == 中ボタン + SHIFT、
2 == 中ボタン + CTRL、
■ Pythonで実現した便利ツールの紹介 SynopticView 6 (未公開)
実例 ; HIK コントロールリグ 選択GUIを作成
選択内容はコントロールリグと同等
だが、もっと解りやすく細かい。
ri_synoptic_body.py
ri_synoptic_hand.py
● Pythonで実現した便利ツールの紹介
● 表の作成と書き込み/読み込み
scriptTableコマンドとCSVファイル
■ Pythonで実現した便利ツールの紹介 表の作成と書き込み/読み込み1 (未公開)
・表のGUI作成は scriptTableコマンド で行う。
table1 = cmds.scriptTable('table',rows=3,
columns=7,columnWidth=([1,135],[2,145],[3,70],[4,45],[5,40],[6,40],[7,40]),
label=[(1,"SourceNodeName"), (2,"DestinationNodeName"),
(3,"Constrain"), (4,"Offset"), (5,"X"), (6,"Y"), (7,"Z")],
cellChangedCmd=edit_cell)
行末に行を追加したり、削除したり、選択行を削除したり、
選択行に値を入れたり出来る。
addButton = cmds.button(label="Add Row",command=add_row)
deleteButton = cmds.button(label="Delete Row",command=delete_row)
deleteSelRowButton = cmds.button(label="Delete Selected Row",command=delete_sel_row)
def edit_cell(row, column, value):
return 1
def add_row(*args):
last_row_num = cmds.scriptTable('table', query=True, rows=True)
cmds.scriptTable('table', edit=True,insertRow=last_row_num)
■ Pythonで実現した便利ツールの紹介 表の作成と書き込み/読み込み2 (未公開)
・import csv で excel でも扱える ,(カンマ)で区切ったテキストファイルを
import csv
cmds.textFieldButtonGrp('load_csv', edit=True, text=import_filename[0])
o_file = open(import_filename[0], 'r')
reader = csv.reader(o_file)
header = next(reader)
o_file.close()
Maya上のGUI表で記入した値を CSVファイルに書き込んだり、
Pythonで 読み込み/書き込み できる。
外部CSVファイルをMaya上の表に記入したり出来る。
if not (cmds.file(csv_file,query=True, exists=True)):
tmp_csv_file = open(csv_file, 'w' ,os.O_CREAT)
else:
tmp_csv_file = open(csv_file, 'w')
writer = csv.writer(tmp_csv_file, lineterminator='¥n')
writer.writerow(data_list)
tmp_csv_file.close()
■ Pythonで実現した便利ツールの紹介 表の作成と書き込み/読み込み3 (未公開)
実例;Rig作成に良く使用する コンストレイント表 を作成
ソースのノード,影響を受けるノード,コンストレイントの種類,オフセット設定の有無,独自設定値
表に基づき 複数種類のコンストレイント を一気に付ける。
table1 = cmds.scriptTable('table',rows=3,
columns=7,columnWidth=([1,135],[2,145],[3,70],[4,45],[5,40],[6,40],[7,40]),
label=[(1,"SourceNodeName"), (2,"DestinationNodeName"),
(3,"Constrain"), (4,"Offset"), (5,"X"), (6,"Y"), (7,"Z")],
cellChangedCmd=edit_cell)
ri_constraint_table.py
● Pythonで実現した便利ツールの紹介
● 表の作成と書き込み/読み込み
SynopticView機能と組み合わせて出来たものとは。。。
■ Pythonで実現した便利ツールの紹介 SynopticView機能考察1 (未公開)
1)背景絵を選択させて、大きさも目標物も自由なシノプティックを作成出来る
import maya.OpenMaya as OpenMaya
w = OpenMaya.uIntPtr()
h = OpenMaya.uIntPtr()
img = OpenMaya.MImage()
img.readFromFile(tmp_bg_file)
img.getSize(w, h)
window_w = w.value()
window_h = h.value()
★ ActiveSynopticツール > シノプティックGUIを作成ツール
選択した画像からwindowの大きさを設定するには、
Mayaに読み込む時に画像の縦横値を取得する必要があるが、
それはOpenMayaを使う。
● やれる事
■ Pythonで実現した便利ツールの紹介 SynopticView機能考察2 (未公開)
● やれる事
2)ボタンの配置する位置は 中マウスボタンクリック地点 を応用する
bg1 = cmds.image(image=tmp_bg_file,dragCallback=bg_pos )
def bg_pos( dragControl, x, y, modifiers ):
sel_cell_list = cmds.scriptTable('table', query=True, selectedCells=True)
selected_row = cmds.scriptTable('table', query=True, selectedRows=True)[0]
cmds.scriptTable('table', edit=True, selectedCells=[selected_row,2])
cmds.scriptTable('table', cellIndex=(selected_row,2), edit=True, cellValue=str(x))
cmds.scriptTable('table', edit=True, selectedCells=[selected_row,3])
cmds.scriptTable('table', cellIndex=(selected_row,3), edit=True, cellValue=str(y))
cmds.scriptTable('table', edit=True, selectedRows=selected_row)
細かい値は後からでも表値で修正できる。
★ ActiveSynopticツール > シノプティックGUIを作成ツール
■ Pythonで実現した便利ツールの紹介 SynopticView機能考察3 (未公開)
● やれる事
3)最終的にシノプティック用のPythonを書き出す時、
tmp_py_file = open(tmp_py_file, 'wb')
writer = csv.writer(tmp_py_file, lineterminator='¥n')
tmp_py_file.write(
"# -*- coding: utf-8 -*-" + '¥n'
"import maya.cmds as cmds" + '¥n'
"import maya.mel as mel" + '¥n'
"import maya.OpenMaya as OpenMaya" + '¥n'
・・・・・
if o_type == '' or o_type == "0":
if o_sel == "0":
tmp_py_file.write(
" " + o_name + " = cmds.button('" + o_namespace + "_" + py_name + o_name +"',label=' '," +
'¥n'
表の値に基づいて決まったパターンのPythonコマンド群を書き込んで行く。
★ ActiveSynopticツール > シノプティックGUIを作成ツール
■ Pythonで実現した便利ツールの紹介 SynopticView機能考察4 (未公開)
最終出力された選択GUIは、通常のPython GUI なので
細かい設定がもっと必要なら追記が可能。
実例 ; ActiveSynopticツール ri_maya_active_synoptic.py
・ どんな形の Rig にも対応できる
・ 短時間で初期セットが完成する
・ csvファイルで再利用が可能
・ ネームスペース名に対応できる
● おまけ
● MotionBuilderのHIKとのリンク
時間があったら
簡単にモーションをMayaに持ってこれて、出力データに対応できる。
35
番外編!
Presented By Ritaro
HomePage http://www.comtec.daikin.co.jp/DC/UsersNotes/
@DaikinComtec_CG @SI_UsersNotes
ご静聴ありがとうございました。
おしまい!
36
番外編!
Presented By Ritaro
HomePage http://www.comtec.daikin.co.jp/DC/UsersNotes/
SUITE UsersNotes ページへの記事
★ アンケートの記入のおねがいです。
感想、リクエスト・・・、
なども ありましたら・・・・どうぞ!
GTMF 2015: Autodesk Maya;大人気!カスタム・グラフエディタと便利ツールをPythonで!! | ダイキン工業株式会社

GTMF 2015: Autodesk Maya;大人気!カスタム・グラフエディタと便利ツールをPythonで!! | ダイキン工業株式会社

  • 1.
    2 番外編! Presented By Ritaro HomePagehttp://www.comtec.daikin.co.jp/DC/UsersNotes/ @DaikinComtec_CG @SI_UsersNotes Maya; 大人気!カスタム・グラフエディタと 便利ツールをPythonで!!
  • 2.
    Agenda ● 最新カスタム・グラフエディタの紹介 使用ソフト; Maya2016,MotionBuilder2016 ● Pythonで実現した便利ツールの紹介 ● カスタム・ハイパーグラフの紹介 ● これまでの経緯と最新版で達成した機能 ● Rig用ICONツール ● SynopticView(Softimage名);選択用GUI ● 表の作成と書き込み/読み込み scriptTableコマンドとCSVファイル SynopticView機能考察と組み合わせて出来たものとは。。。 ● おまけ
  • 3.
  • 4.
    ■ カスタム・グラフエディタ ● 既存グラフエディタの一大要望と問題点 ●[一大要望] = タイムラインの表示 ■ 現在は以下2点を解決している。 ● [問題点] = パネルの取り扱い http://www.comtec.daikin.co.jp/DC/UsersNotes/Ritaro/tutorial/maya_02/ GraphEditorのパネルタイプは scriptedPanel これまでの経緯と最新版で達成した機能 1 ~少しずつヒモ解いていった 初投稿 Version 1 は 2014年8月 からスタート ・メインウィンド下と連動してスクラブで動くキーフレーム変更GUI ・スクリプティングからのパネルの作成と管理 windowコマンド扱いにしたい、trearOffPanelは増殖し続ける MEL記述部分をなるべくPython記述にしてすっきりさせたい カレントタイムスクラブ k ;Maya-SIHOTキー Alt+k
  • 5.
    これまでの経緯と最新版で達成した機能 2 ● [一大要望]= タイムラインの表示 >> なんとかメインウィンドウ下のTimeLineを実現したい。 mel.eval('tearOffCopyItemCmd scriptedPanel graphEditor1;') の下に追記しただけ。 ・intSliderGrp コマンド を Slider 表示 ・intSliderGrp を GraphEditor 下に表示 ★ ふと timePort コマンドを知る!! だが、マニュアルのPython記述だと表示しない > 縦横値が必要 cmds.timePort(enableBackground=True,bgc=[0.2,0.2,0.2],width=500,height=20 ) cmds.intSliderGrp('TimeSlider',field=True,・・・ ・最初は QT Designer の Slider の試作から始まった。 ■ カスタム・グラフエディタ
  • 6.
    これまでの経緯と最新版で達成した機能 3 ● [問題点]= パネルの取り扱い >> なんとかMel記述からの脱却とWindow内表示で管理したい。1 ・最初は Melコマンドのティアオフ 表示方法から始まった。 最初から複数表示で使うことを考えている ★ ふと window コマンド 内に scriptedPanel を表示する方法を知る!! パネル名に連番を追記して、ボタンコマンドのユニーク名とした grp_panel_no_a = str( len(cmds.getPanel( scriptType='graphEditor' )) + 1 ) panel_name = "GraphEditor" + grp_panel_no_a mel.eval('string $panel_name = "%s"' % panel_name) mel.eval('tearOffPanel $panel_name "graphEditor" true;') この記述の下に記述することで、下に button や timePort を追加した paneLayout コマンドを利用してフラグに horizontal2 を使う ■ カスタム・グラフエディタ
  • 7.
    これまでの経緯と最新版で達成した機能 3.5 ● [問題点]= パネルの取り扱い win1 = cmds.window('custom_graphEditor'+ grp_panel_no_a, title='New CustomGraphEditor'+ grp_panel_no_a, resizeToFitChildren=True, widthHeight=(1100, 450)) pane1 = cmds.paneLayout(configuration='horizontal2', paneSize=[2,1,1], parent=win1) graphmenu = 'graphEditor' + grp_panel_no_a cmds.scriptedPanel(graphmenu, label=graphmenu ,type='graphEditor', parent=pane1) この記述で、windowを親とするパネルとしてグラフエディタを入れることが出来た >> なんとかMel記述からの脱却とWindow内表示で管理したい。2 ■ カスタム・グラフエディタ
  • 8.
    これまでの経緯と最新版で達成した機能 4 ● [問題点]= パネルの取り扱い >> なんとか増殖し続けるパネルを整理したい。 ★ ふと deleteUI コマンドのフラグで パネル を削除することを知る!! 表示していないパネルリストから、グラフエディタがあったら削除する invis_panel = cmds.getPanel(invisiblePanels=True) graphpanels = cmds.getPanel(scriptType='graphEditor') graphpanels.remove('graphEditor1') for o_graphp in graphpanels: if o_graphp in invis_panel: cmds.deleteUI(o_graphp,panel=True) ★ 使用したパネルがドンドン溜まっていくのを防ぐことが出来た !! ただし graphEditor1 は削除しない ■ カスタム・グラフエディタ
  • 9.
    これまでの経緯と最新版で達成した機能 5 ● 最新バージョンの発表! = Outliner の設置 (未公開) >> なんとかノード選択機能を補いたい。 ★ ふと paneLayout コマンド のフラグを vertical2 にする方法を知る!! pane1 = cmds.paneLayout(configuration='vertical2', paneSize=[1,20,1], parent=win1) in_panel = cmds.outlinerPanel() outliner = cmds.outlinerPanel(in_panel, query=True,outlinerEditor=True) cmds.outlinerEditor(outliner, edit=True,showDagOnly=True, transmitFilters=False,setFilter='DefaultPolygonObjectsFilter') 講演後公開予定お楽しみに・・・ CustomSideGraphEditor.py ■ カスタム・グラフエディタ
  • 10.
  • 11.
    ■ カスタム・ハイパーグラフの紹介 1 http://www.comtec.daikin.co.jp/DC/UsersNotes/Ritaro/tutorial/maya_06/ ●最新バージョン公開中 こちらも同じくWindow化と未使用パネル削除対応になっている。 invis_panel= cmds.getPanel(invisiblePanels=True) hyphpanels = cmds.getPanel(scriptType='hyperGraphPanel') hyphpanels.remove('hyperGraphPanel1') for o_hyphpanel in hyphpanels: if o_hyphpanel in invis_panel: cmds.deleteUI(o_hyphpanel,panel=True) hyper_panel_no_a = str( len(cmds.getPanel( scriptType='hyperGraphPanel' )) + 1 ) win1 = cmds.window('custom_HyperGraph'+ hyper_panel_no_a, title='New CustomHyperGraph'+ hyper_panel_no_a,resizeToFitChildren=True, widthHeight=(800, 500)) pane1 = cmds.paneLayout(configuration='horizontal2', paneSize=[2,1,1], parent=win1) hypergraphmenu = 'hyperGraphPanel' + hyper_panel_no_a cmds.scriptedPanel(hypergraphmenu, label=hypergraphmenu , type='hyperGraphPanel', parent=pane1)
  • 12.
  • 13.
    ● Pythonで実現した便利ツールの紹介 ● Rig用ICONツール ●SynopticView(Softimage名);選択用GUI ● 表の作成と書き込み/読み込み scriptTableコマンドとCSVファイル SynopticView機能と組み合わせて出来たものとは。。。
  • 14.
  • 15.
    ■ Pythonで実現した便利ツールの紹介 Rig用ICONツール1 http://www.comtec.daikin.co.jp/DC/UsersNotes/Ritaro/tutorial/maya_07/ ・キャラクター制御Rig用のICON集表示 + Tool GUI ★ 実は、最大の便利さは Scale にある HIKなどのRigはスケールが大きい。 中身は、作成したカーブをデータ化して cmds.curve(name='curve1',d=3, p=[(-1.1112534999848538, 2.4959175586702926, 0.14370895922185412), (-0.9331233132338141, 2.563328364756063, 0.14413296666402145), ・・・・・ (-1.111253499984741, 2.4959175586700435, 0.14370895922183932)], k=[0.0, 0.0, 0.0, 1.0, 2.0, ・・・ 25.0, 26.0, 26.0, 26.0]) cmds.curve(name='作成されるカーブの名前',d=次数,p=ポイントの x、y、z の位置, k=ノットベクトルにあるノットの値) リギング>コントロール>コントロールリグの作成>作成 スクリプトから生成している。
  • 16.
    http://www.comtec.daikin.co.jp/DC/UsersNotes/Ritaro/tutorial/maya_07/ ★ 面白い点; カーブのShapeデータを別のノードの子供にして、 例えば、 cmds.parent(relative=True,shape=True) ICON表示と同じく、回転軸に制限を設け ⇔の方向だけに回転するようにすれば 解りやすり Rig が作成が可能 ■ Pythonで実現した便利ツールの紹介 Rig用ICONツール 2 選択用の表示物として移せる。 選択も出来る Joint などが作成出来る カーブ表示物が付いた
  • 17.
  • 18.
    ■ Pythonで実現した便利ツールの紹介 SynopticView1 (未公開) ・キャラクター制御Rig用の選択GUI + 選択性(Selectability) Softimageのコントロールリグ選択画面 (html+Script) >> なんとか、自由に表示を変えられ、認識しやすく、 Rig選択が楽になるような GUIが作れないか 1) 表示ウィンドウ内にボタンを自由に配置する 2) クリックした時、そのノードに予定しているアニメーションの種類 (移動/回転/スケール) に変化する (選択性 = Selectability) ・既定表示マニュピレータ; 「マニュピレータの表示ツール」 にして選択する必要がある。 ・キー>キーの設定; ◎現在のマニュピレータハンドル
  • 19.
    ■ Pythonで実現した便利ツールの紹介 SynopticView2 (未公開) ★ 1) 背景用の画像を表示する formLayout コマンド なら 選択ボタンを自由に配置出来る cmds.window() window = cmds.window('synoptic_body', title=Synoptic Body HIK',sizeable=False, topLeftCorner=[200, 200], widthHeight=(356,443)) form = cmds.formLayout() bg1 = cmds.image( image= ’W:/Maya/Maya_GTMF2015/icons/sy_main00.png’ ) bot1 = cmds.button('b_body',label='Body HIK',bgc=[0.25,0.25,0.25], enable=False) cmds.formLayout( form, edit=True, attachForm=[ (bg1, 'left', 0), (bg1, 'top', 40),(bg1, 'right', 0),(bg1, 'bottom', 0), (bot1 'left', 10),(bot1, 'top', 60), ・・・・・・・ ]) cmds.showWindow(window)
  • 20.
    ■ Pythonで実現した便利ツールの紹介 SynopticView3 (未公開) cmds.setToolTo( 'moveSuperContext' ) ★ 2) 選択性(Selectability)は setToolTo コマンドを使って マニュピレーター自身を変化させる cmds.setToolTo( 'Rotate' ) 今選択しているツール・コンテキストの名前(マニュピレータ)を知るには cmds.currentCtx() を使う。 移動ツールは 'moveSuperContext' if cmds.currentCtx() != 'moveSuperContext':cmds.setToolTo( 'moveSuperContext' ) 回転ツールは 'RotateSuperContext'、 'Rotate' スケールツールは 'scaleSuperContext' 移動/回転/スケールツールは 'Transform' 既定のオブジェクト マニュピレータは 'ShowManips'
  • 21.
    ■ Pythonで実現した便利ツールの紹介 SynopticView4 (未公開) ★ 2.5) 選択性(Selectability)を マウスの中ボタン に持たせたい head_eff = cmds.iconTextButton('b_head_eff',image1= 'mbutton15r.png',style='iconOnly', annotation='S_Ctrl_HeadEffector', command=lambda *args: select_lists('head_eff',sy_names_b), dragCallback=lambda *args: select_lists('r_head_eff',sy_names_b), dropCallback=select_lists_dropcallback) ここでは単純に 回転ツールにしているだけ dropCallback もダミー処理を用意して、キー受付処理を終わらせる elif o_select == 'r_head_eff': if cmds.currentCtx() != 'Rotate':cmds.setToolTo( 'Rotate' ) 実は buttonコマンドには 中ボタン用に dragCallback というフラグがある 本来の目的は dropCallback と対で使用して Drag&Drop機能 を実現させる def select_lists_dropcallback(*args): pass
  • 22.
    ■ Pythonで実現した便利ツールの紹介 SynopticView5 (未公開) ★ 2.5) 選択性(Selectability)を マウスの中ボタン に持たせたい def callbackName( dragControl, x, y, modifiers ): 実は dragCallback で中ボタンを押した時のキーの組み合わせまで取得出来る def filter_rz( dragControl, x, y, modifiers ): # in CustomGraphEditor if modifiers == 0: # MMB コマンド1 elif modifiers == 1:# MMB + SHIFT コマンド2 elif modifiers == 2:# MMB + CTRL コマンド3 modifiers が 0 == 中ボタン + モディファイアなし、 3 == 中ボタン + CTRL + SHIFT、 1 == 中ボタン + SHIFT、 2 == 中ボタン + CTRL、
  • 23.
    ■ Pythonで実現した便利ツールの紹介 SynopticView6 (未公開) 実例 ; HIK コントロールリグ 選択GUIを作成 選択内容はコントロールリグと同等 だが、もっと解りやすく細かい。 ri_synoptic_body.py ri_synoptic_hand.py
  • 24.
  • 25.
    ■ Pythonで実現した便利ツールの紹介 表の作成と書き込み/読み込み1(未公開) ・表のGUI作成は scriptTableコマンド で行う。 table1 = cmds.scriptTable('table',rows=3, columns=7,columnWidth=([1,135],[2,145],[3,70],[4,45],[5,40],[6,40],[7,40]), label=[(1,"SourceNodeName"), (2,"DestinationNodeName"), (3,"Constrain"), (4,"Offset"), (5,"X"), (6,"Y"), (7,"Z")], cellChangedCmd=edit_cell) 行末に行を追加したり、削除したり、選択行を削除したり、 選択行に値を入れたり出来る。 addButton = cmds.button(label="Add Row",command=add_row) deleteButton = cmds.button(label="Delete Row",command=delete_row) deleteSelRowButton = cmds.button(label="Delete Selected Row",command=delete_sel_row) def edit_cell(row, column, value): return 1 def add_row(*args): last_row_num = cmds.scriptTable('table', query=True, rows=True) cmds.scriptTable('table', edit=True,insertRow=last_row_num)
  • 26.
    ■ Pythonで実現した便利ツールの紹介 表の作成と書き込み/読み込み2(未公開) ・import csv で excel でも扱える ,(カンマ)で区切ったテキストファイルを import csv cmds.textFieldButtonGrp('load_csv', edit=True, text=import_filename[0]) o_file = open(import_filename[0], 'r') reader = csv.reader(o_file) header = next(reader) o_file.close() Maya上のGUI表で記入した値を CSVファイルに書き込んだり、 Pythonで 読み込み/書き込み できる。 外部CSVファイルをMaya上の表に記入したり出来る。 if not (cmds.file(csv_file,query=True, exists=True)): tmp_csv_file = open(csv_file, 'w' ,os.O_CREAT) else: tmp_csv_file = open(csv_file, 'w') writer = csv.writer(tmp_csv_file, lineterminator='¥n') writer.writerow(data_list) tmp_csv_file.close()
  • 27.
    ■ Pythonで実現した便利ツールの紹介 表の作成と書き込み/読み込み3(未公開) 実例;Rig作成に良く使用する コンストレイント表 を作成 ソースのノード,影響を受けるノード,コンストレイントの種類,オフセット設定の有無,独自設定値 表に基づき 複数種類のコンストレイント を一気に付ける。 table1 = cmds.scriptTable('table',rows=3, columns=7,columnWidth=([1,135],[2,145],[3,70],[4,45],[5,40],[6,40],[7,40]), label=[(1,"SourceNodeName"), (2,"DestinationNodeName"), (3,"Constrain"), (4,"Offset"), (5,"X"), (6,"Y"), (7,"Z")], cellChangedCmd=edit_cell) ri_constraint_table.py
  • 28.
  • 29.
    ■ Pythonで実現した便利ツールの紹介 SynopticView機能考察1(未公開) 1)背景絵を選択させて、大きさも目標物も自由なシノプティックを作成出来る import maya.OpenMaya as OpenMaya w = OpenMaya.uIntPtr() h = OpenMaya.uIntPtr() img = OpenMaya.MImage() img.readFromFile(tmp_bg_file) img.getSize(w, h) window_w = w.value() window_h = h.value() ★ ActiveSynopticツール > シノプティックGUIを作成ツール 選択した画像からwindowの大きさを設定するには、 Mayaに読み込む時に画像の縦横値を取得する必要があるが、 それはOpenMayaを使う。 ● やれる事
  • 30.
    ■ Pythonで実現した便利ツールの紹介 SynopticView機能考察2(未公開) ● やれる事 2)ボタンの配置する位置は 中マウスボタンクリック地点 を応用する bg1 = cmds.image(image=tmp_bg_file,dragCallback=bg_pos ) def bg_pos( dragControl, x, y, modifiers ): sel_cell_list = cmds.scriptTable('table', query=True, selectedCells=True) selected_row = cmds.scriptTable('table', query=True, selectedRows=True)[0] cmds.scriptTable('table', edit=True, selectedCells=[selected_row,2]) cmds.scriptTable('table', cellIndex=(selected_row,2), edit=True, cellValue=str(x)) cmds.scriptTable('table', edit=True, selectedCells=[selected_row,3]) cmds.scriptTable('table', cellIndex=(selected_row,3), edit=True, cellValue=str(y)) cmds.scriptTable('table', edit=True, selectedRows=selected_row) 細かい値は後からでも表値で修正できる。 ★ ActiveSynopticツール > シノプティックGUIを作成ツール
  • 31.
    ■ Pythonで実現した便利ツールの紹介 SynopticView機能考察3(未公開) ● やれる事 3)最終的にシノプティック用のPythonを書き出す時、 tmp_py_file = open(tmp_py_file, 'wb') writer = csv.writer(tmp_py_file, lineterminator='¥n') tmp_py_file.write( "# -*- coding: utf-8 -*-" + '¥n' "import maya.cmds as cmds" + '¥n' "import maya.mel as mel" + '¥n' "import maya.OpenMaya as OpenMaya" + '¥n' ・・・・・ if o_type == '' or o_type == "0": if o_sel == "0": tmp_py_file.write( " " + o_name + " = cmds.button('" + o_namespace + "_" + py_name + o_name +"',label=' '," + '¥n' 表の値に基づいて決まったパターンのPythonコマンド群を書き込んで行く。 ★ ActiveSynopticツール > シノプティックGUIを作成ツール
  • 32.
    ■ Pythonで実現した便利ツールの紹介 SynopticView機能考察4(未公開) 最終出力された選択GUIは、通常のPython GUI なので 細かい設定がもっと必要なら追記が可能。 実例 ; ActiveSynopticツール ri_maya_active_synoptic.py ・ どんな形の Rig にも対応できる ・ 短時間で初期セットが完成する ・ csvファイルで再利用が可能 ・ ネームスペース名に対応できる
  • 33.
  • 34.
    35 番外編! Presented By Ritaro HomePagehttp://www.comtec.daikin.co.jp/DC/UsersNotes/ @DaikinComtec_CG @SI_UsersNotes ご静聴ありがとうございました。 おしまい!
  • 35.
    36 番外編! Presented By Ritaro HomePagehttp://www.comtec.daikin.co.jp/DC/UsersNotes/ SUITE UsersNotes ページへの記事 ★ アンケートの記入のおねがいです。 感想、リクエスト・・・、 なども ありましたら・・・・どうぞ!