ウインドウを作って部品(ボタンなど)を配置(レイアウト)してゆく場合にはレイアウト関数が必要です。
これまでは columnLayout() によって縦 1 列に部品を並べていきましたが、
それ以外の配置をする場合には、そのためのレイアウト関数を使用します。
レイアウト関数には以下のような種類があります。
サンプルプログラムと図は Layoutの一覧 を参照してください。
いままでは columnLayout() のような単純なレイアウトだけでしたが、
ひとつのレイアウトだけではできないような複雑なレイアウトを実現するためには
どうしたら良いでしょうか。
実はレイアウトは入れ子にすることができるので、
いくらでも複雑なレイアウトを作ることができるようになっています。
ただその場合には、どこまでがレイアウトの範囲なのかを決めなければなりません。
ウインドウ上の部品は必ずある 1 つのレイアウトの範囲内にある必要があるからです。
そのための関数として maya.cmds.setParent('..') を使用して、
どこまでが特定のレイアウトの範囲なのかを決めてゆきます。
レイアウトによってボタンを縦・横に並べる GUI を作ってみましょう。
ここではウインドウの部品を横に並べるために rowLayout() を使用してみます。
なお、このスクリプトはレイアウトの練習なので各ボタンを押しても何も実行しません。
window -title "layout1";
columnLayout;
button -label "A";
rowLayout -numberOfColumns 2 -columnWidth2 20 20;
button -label "B";
button -label "C";
setParent ..;
button -label "D";
rowLayout -numberOfColumns 3 -columnWidth3 20 20 20;
button -label "E";
button -label "F";
button -label "G";
setParent ..;
showWindow;
import maya.cmds
maya.cmds.window(title='layout1')
maya.cmds.columnLayout()
maya.cmds.button(label='A')
maya.cmds.rowLayout(numberOfColumns=2, columnWidth2=(20, 20))
maya.cmds.button(label='B')
maya.cmds.button(label='C')
maya.cmds.setParent('..')
maya.cmds.button(label='D')
maya.cmds.rowLayout(numberOfColumns=3, columnWidth3=(20, 20, 20))
maya.cmds.button(label='E')
maya.cmds.button(label='F')
maya.cmds.button(label='G')
maya.cmds.setParent('..')
maya.cmds.showWindow()
import maya.cmds
maya.cmds.window(title="layout1")
maya.cmds.columnLayout()
maya.cmds.button(label="A")
maya.cmds.rowLayout(numberOfColumns=2, columnWidth2=(20, 20))
この関数により、これ以後作られる部品は横 1 列に並んでゆきます。
maya.cmds.button(label="B")
maya.cmds.button(label="C")
maya.cmds.setParent('..')
maya.cmds.button(label="D")
maya.cmds.rowLayout(numberOfColumns=3, columnWidth3=(20, 20, 20))
maya.cmds.button(label="E")
maya.cmds.button(label="F")
maya.cmds.button(label="G")
maya.cmds.setParent('..')
maya.cmds.showWindow()
上の setParent 関数の説明で、
この関数はレイアウトの範囲を区切るために使うと説明してきましたが、
今までのウインドウを作成するスクリプトでは setParent() 関数は使っていませんでした。
実は、今までの各スクリプトの最初に実行されている columnLayout() 関数に対応する setParent() 関数は省略しているだけなので、
実行しても問題ありません。
省略しないとどうなるかは、以下のスクリプトを実行してみるとわかります。
import maya.cmds
maya.cmds.window()
maya.cmds.columnLayout()
maya.cmds.setParent('..')
maya.cmds.showWindow()
実行すると何もないウインドウが表示されます。
表示された後で、
maya.cmds.button()
関数を実行してみてください。
するとウインドウにボタンが現れます。
同様に、部品を作る関数(スライダーなど)を実行すると、
ウインドウに部品が追加されてゆくのがわかると思います。