レイアウト1 ( rowLayout )

レイアウトとは

ウインドウを作って部品(ボタンなど)を配置(レイアウト)してゆく場合にはレイアウト関数が必要です。
これまでは columnLayout() によって縦 1 列に部品を並べていきましたが、 それ以外の配置をする場合には、そのためのレイアウト関数を使用します。

レイアウトの種類

レイアウト関数には以下のような種類があります。

maya.cmds.columnLayout()
部品を縦 1 列に並べるレイアウト
maya.cmds.rowLayout()
部品を横 1 列に並べるレイアウト
maya.cmds.rowColumnLayout()
部品を縦・横に並べるレイアウト
maya.cmds.formLayout()
部品を絶対的・相対的な位置指定で並べるレイアウト
maya.cmds.frameLayout()
部品に枠(フレーム)をつけて表示するレイアウト
maya.cmds.gridLayout()
部品を同じ大きさのセルに入れて表示するレイアウト
maya.cmds.menuBarLayout()
部品にメニューバーをつけて表示するレイアウト
maya.cmds.paneLayout()
子どもの部品を様々な方向で分割して表示するレイアウト
maya.cmds.scrollLayout()
スクロール付で部品を表示するレイアウト
maya.cmds.shelfLayout()
シェルフレイアウト
maya.cmds.shelfTabLayout()
シェルフタブレイアウト
maya.cmds.tabLayout()
タブレイアウト

サンプルプログラムと図は Layoutの一覧 を参照してください。

複数のレイアウト

いままでは columnLayout() のような単純なレイアウトだけでしたが、 ひとつのレイアウトだけではできないような複雑なレイアウトを実現するためには どうしたら良いでしょうか。
実はレイアウトは入れ子にすることができるので、 いくらでも複雑なレイアウトを作ることができるようになっています。
ただその場合には、どこまでがレイアウトの範囲なのかを決めなければなりません。 ウインドウ上の部品は必ずある 1 つのレイアウトの範囲内にある必要があるからです。 そのための関数として maya.cmds.setParent('..') を使用して、 どこまでが特定のレイアウトの範囲なのかを決めてゆきます。

複数のレイアウトの例

レイアウトによってボタンを縦・横に並べる GUI を作ってみましょう。
ここではウインドウの部品を横に並べるために rowLayout() を使用してみます。
なお、このスクリプトはレイアウトの練習なので各ボタンを押しても何も実行しません。

  1. 以下の MEL スクリプトを Python スクリプトに書き直して、 layout1.py という名前で保存します。
    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;
    
  2. 以下の Python スクリプトを layout1.py という名前で作ります。
    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()
    
  3. スクリプト エディタ の ファイル → スクリプトのロード によって layout1.py を読み込んで、テンキーの Enter キーなどで実行します。
  4. 以下のようなウインドウが表示されます。
    [layout1.melの実行結果]

スクリプトの解説

import maya.cmds
maya.cmds モジュールをインポートします。
maya.cmds.window(title="layout1")
layout1 というタイトルのついたウインドウを作ります。
maya.cmds.columnLayout()
この関数によって、これ以降に作られる部品は縦に並んでゆきます。
maya.cmds.button(label="A")
A というラベルのついたボタンを作ります。
maya.cmds.rowLayout(numberOfColumns=2, columnWidth2=(20, 20)) この関数により、これ以後作られる部品は横 1 列に並んでゆきます。
各フラグの意味は以下の通りです。
numberOfColumn=2
横に何個の部品を並べるかを指定します。
columnWidth2=(20, 20)
各部品を並べる間隔の指定です。(2 個の場合)
この場合、B・C ボタンがそれぞれ 20 ピクセル幅の範囲にレイアウトされます。
3 個の部品を並べる場合には代わりに columnWidth3=(c1, c2, c3) を使用します。
maya.cmds.button(label="B")
B というラベルのついたボタンを作ります。
maya.cmds.button(label="C")
C というラベルのついたボタンを作ります。
rowLayout() 関数の有効範囲なので B ボタンの横に並びます。
maya.cmds.setParent('..')
rowLayout() の有効範囲の終りです。
これ以後は columnLayout() が有効になるので、これ以降は部品が縦に並びます。
maya.cmds.button(label="D")
D というラベルのついたボタン作ります。
ここは columnLayout() の有効範囲なのでボタンは縦に並びます。
maya.cmds.rowLayout(numberOfColumns=3, columnWidth3=(20, 20, 20))
この関数により、これ以後作られた部品は横 1 列に並んでゆきます。
numberOfColumn=3
横に何個の部品を並べるかを指定します。
columnWidth3=(20, 20, 20)
各部品を並べる間隔の指定です。(3 個の場合)
この場合、E・F・G ボタンがそれぞれ 20 ピクセル幅の範囲にレイアウトされます。
maya.cmds.button(label="E")
E というラベルのついたボタンを作ります。
maya.cmds.button(label="F")
F というラベルのついたボタンを作ります。
rowLayout() 関数の有効範囲なので E ボタンの横に並びます。
maya.cmds.button(label="G")
G というラベルのついたボタン作ります。
rowLayout() 関数の有効範囲なので F ボタンの横に並びます。
maya.cmds.setParent('..')
rowLayout() の有効範囲の終りです。
これ以後は columnLayout() が有効なので、部品は縦に並びます。
maya.cmds.showWindow()
ウインドウを表示します。
[layout1.mel のレイアウト構成図]

Tips

上の setParent 関数の説明で、 この関数はレイアウトの範囲を区切るために使うと説明してきましたが、 今までのウインドウを作成するスクリプトでは setParent() 関数は使っていませんでした。
実は、今までの各スクリプトの最初に実行されている columnLayout() 関数に対応する setParent() 関数は省略しているだけなので、 実行しても問題ありません。
省略しないとどうなるかは、以下のスクリプトを実行してみるとわかります。


import maya.cmds

maya.cmds.window()
maya.cmds.columnLayout()
maya.cmds.setParent('..')
maya.cmds.showWindow()

実行すると何もないウインドウが表示されます。
表示された後で、 maya.cmds.button() 関数を実行してみてください。
するとウインドウにボタンが現れます。
同様に、部品を作る関数(スライダーなど)を実行すると、 ウインドウに部品が追加されてゆくのがわかると思います。

練習

まとめ

参考


Prev | Next
Home | Contents
Mail