チュートリアル > ActiveX コントロールの使用 > TreeView ActiveX コントロールを使用したシーン ブラウザの開発 - 第 2 部 |
このチュートリアルの第 2 部では、第 1 部で定義したTreeView ActiveX コントロールをカスタマイズし、オブジェクト クラスによってアイコンを含め、ワイヤフレーム カラーを表示し、シーン ノードの非表示状態をコントロールする方法を示します。
ActiveX コントロールは、DotNet フレームワークとそのコントロールを考慮して、最新バージョンの Microsoft Windows オペレーティング システムで非推奨となりました。
MAXScript では引き続き ActiveX コントロールがサポートされますが、これらは MAXScript にアクセス可能なシステムにインストールおよび登録する必要があります。
ActiveX コントロールの代わりに、MAXScript では、3ds Max 9以降において DotNet コントロールがサポートされます。
「ActiveX TreeView コントロールの DotNet TreeView コントロールへの変換」を参照してください
MAXScript ロールアウト内の ActiveX コントロール
macroScript SceneTreeView category:"HowTo" ( rollout treeview_rollout "TreeView Scene Browser" ( fn getIconFromBitmap thePath number = (
この新しい関数では、3ds Max に付属のアイコンを取り込んで再利用できます。この関数に渡す引数は、取得するアイコン ビットマップ ファイルのパスおよびアイコン番号です。ここでは、16 x 15 の小さいアイコンだけを使用することを想定しています。関数に変更を加え、24 x 24 のアイコンに対応するようにもできますが、このサイズのアイコンでは TreeView の見た目がよくありません。
まずアイコン ファイルへのパスの入ったビットマップを開きます。アイコン ファイルには任意の数のアイコンを含めることができます。小さいサイズの 16 x 15 ピクセルのアイコン ファイルは、高さ 15 ピクセルで、幅はアイコンの数に 16 をかけた値です。
次に、16 x 15 ピクセルという単一アイコンのサイズの空のビットマップを作成します。
ループは、0 から 14 までです(ビットマップでのピクセル アクセスは基数 0 なので、0 から 15 マイナス 1 になります)。
アイコンの各行について、getPixels を使用し、アイコンの先頭から 16 ピクセルを取り込みます。(Number-1)*16 は最初のアイコンについては 0 を返し、以後 2 番目のアイコンについては 16、3 番目のアイコンは 32、というように続きます。次に、16 ピクセルの行全体をあらかじめ定義した iconBmp ビットマップに割り当てます。左端のピクセル (0) から開始し、同じ行数(v)を処理します。その結果、指定した番号のアイコンが新しい空のビットマップにコピーされます。
ここで、新しいアイコンのビットマップの名前を 3ds Max の ¥Images サブディレクトリ内の一時ビットマップ ファイルに設定します。この設定が必要となるのは、ビットマップを OLE 対応のアイコンに変換する loadPicture メソッドで、保存された .BMP ファイルまたは .ICO ファイルが必要になり、ディスクに保存できるのが .filename プロパティを設定したビットマップだけであるためです。
ファイル名を定義したので、この単一アイコンをディスクに保存できます。
次に、オリジナルの複数アイコンのファイルと、1 つのアイコンだけが入った一時ファイルの両方を閉じます。
この関数の結果、新しい単一アイコンのファイル名が返されます。
これは TreeView を初期化する既存の関数ですが、ここでは 2 つ目の引数を渡します。 アイコン管理のための ImageListCtrl ActiveX コントロールです。
今回は、すべてのノードの前にチェックボックスを表示します。チェックボックスは、シーン ノードの非表示状態を表示しコントロールするために使用されます。
アイコン イメージのサイズを、アイコン ファイルから取り込むアイコンと同じサイズに定義します。
アイコンの管理に使用する ImageListCtrl の .listImages プロパティの .add() メソッドを呼び出します。追加する最初のイメージは、ルート ノードだけに使用します。先に定義した getIconFromBitmap 関数を呼び出し、Standard ジオメトリ プリミティブと番号 2 のアイコン (球) を含むアイコン ファイルを渡します。前に定義した getIconFromBitmap 関数を呼び出し、標準ジオメトリ プリミティブを含むアイコン ファイルとアイコン番号 2 (球)を渡します。結果のパスは loadPicture メソッドに渡されます。このメソッドは一時アイコン ファイルである .bmp ファイルを開き、結果の OLE 対応アイコン イメージを ImageListCtrl に割り当てます。
ilTv.listImages.add 2 #geomnode (loadPicture (getIconFromBitmap (iconDir + "\\Standard_16i.bmp") 1))
全体を繰り返しますが、今回はジオメトリ ノードに使用する 2 つ目のイメージを作成します。番号 1 のアイコン (ボックス) を取り込みます。
ライトに使用する 3 つ目のイメージも同様に行います。ただし、Lights アイコン ファイルの 3 つ目のアイコン (オムニ) を指定します。
カメラは番号 4 のイメージになります。 Cameras アイコン ライブラリの 2 つ目のアイコンを取り込みます。
最後に、Helpers アイコン ファイルの最初のアイコン (ダミー) を取り込む 5 つ目のイメージを定義します。
まだ定義していないクラスがありますが (シェイプ、スペース ワープなど)、上記のコードを同様に拡張することで、独自のアイコンを実装することができます。
最後に、TreeView の .imageList プロパティに ImageListCtrl コントロールを割り当てます。こうすると、上のイメージが TreeView でアイコンとして使用できるようになります。
) fn addChildren tv theNode theChildren = ( for c in theChildren do ( theIcon = case superclassof c of
コントロール内にアイコンが表示できるようになったので、関数によって処理されている 3ds Max のシーン ノードのスーパークラスを確認し、そのタイプに基づいて適切なアイコンを定義することができます。theIcon 変数には、使用するアイコンに対応する整数が入ります。GeometryClass:
ジオメトリ オブジェクトはアイコンにイメージ 2 を使用します。
ほかは、それぞれのアイコンができるまでジオメトリのアイコンを使用します。
アイコンのインデックスを第 1 部で行ったように 0 に設定する代わりに、アイコンを上記で定義した値に設定します。
ノードのチェック状態は .isHidden プロパティの逆(ノードが非表示になっているときに true)になります。ノードが非表示ではない場合にボックスにチェックマークを付けたいので、このように明示します。
TreeView の各ノードのカラーを完全にコントロールできるようになったので、ワイヤーフレーム表示のカラーを取り込んで .forecolor プロパティに割り当てます。こうすると、シーン オブジェクトのカラーをカラフルに参照できます。
オブジェクトに標準マテリアルが割り当てられている場合には、マテリアルの拡散反射光カラーを取り込んだり、カラーで別のプロパティを表したりするように拡張することもできます。また、TreeView ノードの .bold プロパティを true に設定し、3ds Max オブジェクトの他のプロパティを表すようにすることもできます。
addChildren tv newNode c.children ) ) fn fillInTreeView tv = ( theRoot = tv.Nodes.add() theRoot.image = 1
ImageListCtrl の最初のイメージは、球のアイコンを示すように定義済みです。これは、ルート ノードを表すために使用します。
theRoot.text = "WORLD ROOT" rootNodes = for o in objects where o.parent == undefined collect o addChildren tv theRoot rootNodes ) activeXControl tv "MSComctlLib.TreeCtrl" width:290 height:490 align:#center activeXControl ilTv "MSComctlLib.ImageListCtrl "height:0 width:0
これは、TreeView でアイコンの管理に使用する ImageList ActiveX コントロールです。ロールアウトに表示する必要はないので、高さと幅を 0 に設定します。
テキスト ラベルを実際のオブジェクト名に変換することによって、それがどのシーン ノードを表すのかを確認します。
シーン ノードの .isHidden プロパティを TreeView ノードのチェック状態の逆の値に設定します。ユーザがチェックボックスのチェックマークを外した場合、theNode.checked は false を返します。これは not によって true に変換され、非表示プロパティに割り当てられ、効果的にノードを非表示にします。