チュートリアル - TreeView ActiveX コントロールを使用したシーン ブラウザの開発 - 第 1 部

チュートリアル > ActiveX コントロールの使用 > シーン ブラウザの開発 - 第 1 部

このチュートリアルでは、TreeView ActiveX コントロール内にオブジェクト階層を表示するシーン ブラウザを作成する方法を示します。

注:

ActiveX コントロールは、DotNet フレームワークとそのコントロールを考慮して、最新バージョンの Microsoft Windows オペレーティング システムで非推奨となりました。

MAXScript では引き続き ActiveX コントロールがサポートされますが、これらは MAXScript にアクセス可能なシステムにインストールおよび登録する必要があります。

ActiveX コントロールの代わりに、MAXScript では、3ds Max 9以降において DotNet コントロールがサポートされます。

ActiveX TreeView コントロールの DotNet TreeView コントロールへの変換」を参照してください

関連トピック:

MAXScript ロールアウト内の ActiveX コントロール

TreeView ActiveX コントロール

全体の流れ:

簡単な macroScript を作成します。

フローティング ダイアログ ボックスの作成に使用するロールアウトを定義します。

ロールアウト内の UI コントロールは、TreeView ActiveX コントロールと、インデントをコントロールするための編集ボックスだけです。

すべての子を再帰的に走査し、子ノードを TreeView に追加する関数を作成します。

TreeView のレイアウトと外観を定義する関数を作成します。

再帰関数を呼び出すことによって、TreeView にノードを入れていく関数を作成します。

この 2 つの関数は、ダイアログ ボックスが作成されるとき (ロールアウトが開くとき) のイベント ハンドラによって呼び出されます。

スクリプト:

macroScript SceneTreeView category:"HowTo"
(
rollout treeview_rollout "TreeView Scene Browser"
(
fn initTreeView tv =
(
tv.Indentation = 28*15
tv.LineStyle = #tvwRootLines
)
fn addChildren tv theNode theChildren =
(
for c in theChildren do
(
newNode = tv.Nodes.add theNode.index 4 "" c.name 0
addChildren tv newNode c.children
)
)
fn fillInTreeView tv =
(
theRoot = tv.Nodes.add()
theRoot.text ="WORLD ROOT"
rootNodes =for o in objects where o.parent == undefined collect o
addChildren tv theRoot rootNodes
)
activeXControl tv "MSComctlLib.TreeCtrl" width:190 height:290 align:#center
spinner spn_indent "Indentation" range:[0,100,28] type:#integer fieldwidth:40
 
on tv nodeClick theNode do try(select (getNodeByName theNode.text))catch()
on spn_indent changed val do tv.indentation = val*15
on treeview_rollout open do
(
initTreeView tv
fillInTreeView tv
)
)
try(destroyDialog treeview_rollout)catch()
createDialog treeview_rollout 200 320
)

結果:

ステップごとの解説

macroScript SceneTreeView category:"HowTo" (

まず SceneTreeView という名前のシンプルな MacroScript を定義することから始めます。 これは、[HowTo]カテゴリに表示されます。シンプルな(旧式の) macroScripts には、 on execute do または on isEnabled のイベント ハンドラはありません。MacroScript 定義内のコードは、MacroScript を表す ActionItem (ボタン、メニュー項目、またはキーボード ショートカット) がアクティブになると、すぐに実行されます。

rollout treeview_rollout "TreeView Scene Browser" (

MacroScript が実行されると作成されるロールアウトです。[TreeView Scene Browser]を表示します。treeview_rollout という変数は macroScript に対してローカルであり、後でロールアウト定義からダイアログ ボックスを作成するときに使用されます。

fn initTreeView tv = (

作成する TreeView ActiveX コントロールの初期化を行う関数です。コントロールそのものは、引数として関数に渡されます。

tv.Indentation = 28*15

.indentation プロパティでは値が twip で表される必要があり、子が親に対してインデントされる量を twip 単位で定義します。1 ピクセルは約 15 twip なので、この行は階層で 28 ピクセルのインデントを使用することを指示していることになります。

tv.LineStyle = #tvwRootLines

LineStyle プロパティは、階層内でノードをつなぐ線の外観をコントロールします。ルートにはプラス/マイナスのボックスを用意し、シーン ノード に接続します。

) fn addChildren tv theNode theChildren = (

この関数は再帰的に呼び出され、3ds Max のシーン ノードの配列を含む theChildren 引数を使用して、引数として渡されるノードの子を作成します。tv 引数には、追加先の TreeView が含まれます。

for c in theChildren do (

配列 theChildren 内の 3ds Max シーン ノードのそれぞれについて、

newNode = tv.Nodes.add theNode.index 4 "" c.name 0

指定されたノードに新しい子を追加します。 add() メソッドにパラメータを渡します。渡すのは、親のインデックス、関係フラグ(4)、キー(空の文字列)、新しい子のテキスト(シーン ノードの名前)、およびアイコンとして表示するイメージのインデックス(イメージがない場合は 0)です。

addChildren tv newNode c.children

子が作成されると、関数は再帰的な呼び出しを行い、新しく作成されたノードと現在のシーン オブジェクトの子の配列をパラメータとして渡します。こうすると、TreeView で完全なシーン階層が再生成されます。

)

c ループはここで終了します。

)

再帰関数はここで終了します。

fn fillInTreeView tv = (

この関数は TreeView の内容を定義します。

theRoot = tv.Nodes.add()

ルートを表すノードを 1 つ追加します。

theRoot.text = "WORLD ROOT"

ラベルは "WORLD ROOT" に設定します。

rootNodes = for o in objects where o.parent == undefined collect o

次に、シーン内のオブジェクトで親のないものをすべて収集します。これらは、「ワールドの子」になる最上位のノードです。

addChildren tv theRoot rootNodes

最後に再帰関数を呼び出し、TreeView とルート ノード、および最上位のシーン オブジェクトの配列を引数として渡します。

) 

activeXControl tv "MSComctlLib.TreeCtrl" width:190 height:290 align:#center

ロールアウト内に TreeView ActiveX コントロールを作成します。

spinner spn_indent "Indentation" range:[0,100,28] type:#integer fieldwidth:40

このスピナーを使用すると、TreeView の .indentation プロパティを相互作用的にテストできます。編集ボックスの値を変更しただけで、階層全体のインデントがダイナミックに更新されます。

on tv nodeClick theNode do try(select (getNodeByName theNode.text))catch()

ユーザがノードをクリックした場合、その名前を 3ds Max のシーン ノードに戻し、シーン内で選択します。これは、TreeView のイベント ハンドラの使用方法を示しています。

on spn_indent changed val do tv.indentation = val*15

ユーザがスピナーの値を変更した場合、.indentation がそれに相当する twip に設定されるようにします。

on treeview_rollout open do (

ロールアウトが開いている場合(CreateDialog 関数が呼び出される場合)、

initTreeView tv fillInTreeView tv

初期化関数とデータ収集関数が呼び出され、スタイルを定義し、TreeView コントロールを 3ds Max のシーン オブジェクトの名前で読み込みます。

)

ロールアウトを開くイベントはここで終了します。

) try(destroyDialog treeview_rollout)catch()

新しいダイアログ ボックスを作成する前に、前に開かれたダイアログ ボックスで同じ名前のものがあれば先に閉じるようにします。

createDialog treeview_rollout 200 320

最後に、ロールアウト定義を使用して新しいダイアログ ボックスを作成します。

)

次のトピック

このスクリプトはとても基本的なものです。さらに改善し、カスタマイズする方法については、このチュートリアルの第 2 部、「チュートリアル - TreeView ActiveX コントロールを使用したシーン ブラウザの開発 - 第 2 部」を参照してください。

関連事項