「武器を身につけよう」へ戻る

VBSで形状の複数選択(DoTclScriptの利用)

たとえば「あるマスターサーフェスを使っている形状を調べたい」などといったときに皆さんはどうしますか?
まず調べたいマスターサーフェスハンドルを取得して、形状をルートから再帰しながら表面材質に同じマスターサーフェスハンドルを使っている形状のハンドルを配列などに確保しながら、最後に溜め込んだ形状ハンドルを使ってブラウザ上で複数選択状態にして終わる。
というような流れを考えるのではないでしょうか?
しかし、ここで問題にぶつかります。
ShadeのVBSには複数選択のメソッドが見当たらない。(私の知る限り無いはずです)
Select関係のメソッドを続けて使っても選択形状が移っていくだけで、最初の選択は維持されません。
既に使っている人もいるのでしょうが、無理やりですが方法があります。
それはここだけDoTclScriptでtclのコマンドを使ってしまえというものです。
実はtclにはなんと複数選択のメソッドが用意してあります。
"select_by_handle_list"というメソッドです。
書式としては
select_by_handle_list $a ($aはリスト)
という形です。
リストに値を代入するには
set a {111 222 333}
などとすれば良いようなのです。
それならこれら2行のコマンドを文字列で作成してDoTclScriptに渡してやればいいという非常に乱暴な発想です。

複数選択状態の例
Topへ

具体的にどうすれば良いでしょう。
まず、tclでリストに値を設定する部分の"set a "以降のデータ部分の文字列を作ります。
VBSで確保したハンドルの配列を仮にHandles、作る文字列をstrHandlesとします。

dim strHandles,i
strHandles=""
for i=0 to Ubound(Handles)
  strHandles=strHandles&" "& Handles(i)
next
Topへ
でどうでしょう。

上記でHandlesという配列に次のように3つのハンドルがあった場合
Handles(0)に123456
Handles(1)に234567
Handles(3)に345678
上述のvbsを実行すればstrHandlesには
"123456 234567 345678"という文字列が出来上がります。

次はこの文字列を使ってtclのコマンド文字列を作ってやります。
文字列を格納する変数をstrTclCommandとして実際に作ってみましょう。
strTclCommand="set a{"&strHandles&"}"&chr(13)&"select_by_handle_list $a"
とすればstrTclCommandの中身は
"set a{123456 234567 345678}(改行)
select_by_handle_list $a"
となっているはずです。

あとはこのコマンド文字列をDoTclScriptで実行してやればいいわけです。
XShade.DoTclScript strTclCommand

どうですか? 強引ですが簡単ですね。
ついでなのでいつでも使えるようにサブルーチンにしてまとめてみましょう。
Topへ
   '-------------ハンドルの配列から複数の形状を選択する。(tclを利用する)
sub SelectUsingTcl(Handles)
 dim strHandles,i
 strHandles=""
 for i=0 to Ubound(Handles)
   strHandles=strHandles&" "& Handles(i)
 next
 strtclCommand="set a {"&strHandles&"}"&chr(13)&"select_by_handle_list $a"
 XShade.DoTclScript strTclCommand
end sub

これでこのサブルーチンにハンドル配列を渡して呼び出してあげればいつでも複数形状選択が可能になります。
ただしUTF-8で正常に動くかどうかは試したことは無いので興味のある方は試してみてください。
あと、私の知らないところに「vbsにも複数選択メソッドがあるよ」という情報がありましたら直ちにご一報ください。
すぐにこの項目は消去します。
「武器を身につけよう」へ戻る Topへ