
AVS Technical Report -Volume6,Number2 Dec,1999-
AVS/Expressでは可視化に関連した外部プログラムの起動や自作プログラムの組み込みが可能です。
加えて、GUI構築用の部品が提供されていることから、可視化とは一歩離れたユーザ独自のアプリケーションを作成することが可能です。
今回は、そのようなアプリケーションの作成方法について説明しながら、今までとは違うAVS/Expressの使い方を紹介したいと思います。
アプリケーションを作成する上で、AVS/Expressに標準で用意されていない処理機能については、なんらかの形で作り込む必要があります。
その場合には、次に挙げる2つの方法で行います。
(1)組み込みモジュールとして作成する方法
プログラムをAVS/Expressのモジュールとして作成します。プログラムを動作させるにはネットワークエディター上に配置(インスタンス)して使用します。
(2)単体のアプリケーションとして作成する方法
AVS/Express本体とは別に独立したプログラムとして作成します。
AVS/Expressがなくても動作させることができます。
それぞれに利点と欠点があります(表1参照)。
| 利点 | 欠点 | |
|---|---|---|
| 組み込みモジュール |
|
|
| 単体アプリケーション |
|
|
(注)プロジェクト環境とは、モジュールの定義ファイルやバイナリファイルが格納されているディレクトリ(開発環境)のことを言います。
バイナリ提供されている市販アプリケーションを起動する場合には、プログラムをAVS/Expressに組み込むことができないため、単体アプリケーションをAVS/Expressから起動します。
今回の特集では、このような単体アプリケーションをAVS/Expressから起動する方法について紹介します。
AVS/Expressには標準で外部プログラムを起動するための shell commandモジュールが用意されています。shell commandモジュールは、Libraries の Accessories.Utility_Modules.General にあります。

図1 shell commandモジュール
| command : | 実行するコマンドを記述します。文字列の内容が更新されると、そのタイミングでコマンドが実行されます。 |
|---|---|
| active : | 0 が与えられている場合、commandの文字列が変更されても外部プログラムの実行は行われません。 |
| on_inst : | 0 が与えられている場合、インスタンス時にモジュール実行が行われません。 |
| output_string : | 0が与えられている場合、コマンド実行結果の出力が行われません。 |
| stdout[] : | コマンド実行後の標準出力の内容が char型配列として格納されます。 |
| stdout string : | コマンド実行後の標準出力の内容が string型として格納されます。 |
| shell_comm_update: | モジュールのメソッド(変更不可)です。 |
図2のネットワークはshell commandモジュールを使ったサンプルネットワークです。


図2 shell commandモジュールを利用したサンプルネットワーク
shell_command.command には以下の"=>"で始まる一行を記述しています。
=> ("ls " + <-.UIlist.selectedText)
Select Directory からディレクトリを選択すると、UIlist.selectedTextに選択されたディレクトリ名が格納されます。UIlist.selectedTextの内容が変わると shell_command.command が実行されるので、ファイルリストが表示されます。
Windows環境の場合も shell_command.command にDOSコマンドを記述することで、同様の仕組みを作成することが可能になります。
=> ("dir "+ <-.UIlist.selectedText)
以下にサンプルのVファイル(sample.v)を添付します。
sample.v [1KB]
viやメモ帳などのテキストエディタで入力後、ファイル名の拡張子に v を付けて保存してください。
APPS.DefaultApplication shell_command_Sample<NEdisplayMode="maximized"> {
UIshell UIshell {
x = 28;
y = 143;
width = 253;
height = 114;
};
UIpanel UIpanel {
parent => <-.UIshell;
y = 0;
width = 250;
};
GMOD.shell_command shell_command {
command => ("ls " + <-.UIlist.selectedText);
};
UIlist UIlist {
parent => <-.UIpanel;
height => 76;
y = 20;
strings = {
"/Work/dir1","/Work/dir2",
"/Work/dir3"};
selectedText = "/Work/dir2";
selectedItem = 1;
x = 5;
width = 100;
};
UIlabel UIlabel {
parent => <-.UIpanel;
label => " Select Directory";
y = 0;
};
UIlabel UIlabel#1 {
parent => <-.UIpanel;
label => "File List";
y = 0;
x = 110;
};
UItext UItext {
parent => <-.UIpanel;
text<NEportLevels={2,2}> => <-.shell_command.stdout_string;
y = 18;
x = 135;
height = 80;
};
};
使いやすいアプリケーションにするためには、GUI部分の作成が必要になります。GUI部分は外部プログラムの実行と深く関わってきますので、具体的なネットワーク例を挙げて shell_commandモジュールとGUIモジュールを含めたネットワークの作成方法について説明します。
ウインドウに表示されているボタンを押した時に指定コマンドを実行するネットワークの作り方を紹介します。
ボタンの作成にはUIbuttonモジュールを使用します。
UIbuttonモジュールは User_Interface.Widgets に登録されています。
UIbuttonモジュールは、ボタンが押されるとUIbutton.do に 1 のフラグが立つので、これをトリガーにして他のモジュールを動作させます。
しかし、shell_commandには UIbutton.do を受け取るためのintポートが用意されていないため、トリガーのデータを受け取ることができません。
これについては、shell_commandに int型のオブジェクトを追加することによって解決できます。追加されたオブジェクトはshell_commandのメソッドに対してnotify(パラメーターが変更されたらメソッドが実行される)属性が自動的に付加されるため、オブジェクトの値が変化すればshell_commandモジュールのコマンドが実行されます。
以下の手順でshell_commandにintオブジェクトを追加します。

図3 intオブジェクトの追加
さらに、ボタンを表示させるために UIshell, UIpanel, UIbutton を接続します。
新たに追加された int型オブジェクトとUIbuttonの出力ポートを接続します(図4)。

図4 UIbuttonを利用したネットワーク例
buttonを押すとUIbutton.doオブジェクトの値が0から1に代わります。これをトリガーとして、shell_commandモジュールはコマンドを実行します。
ウインドウに表示されている入力パラメーターの値が変更された時にコマンドが実行されるネットワークの作成方法について紹介します。入力された特定パラメーターの値はコマンドの中で利用します。
値として数値入力を行う場合には UIfield を利用し、テキスト入力を行う場合には UItext を利用します。
ここでは数値を扱うUIfieldモジュールを例にあげて説明します。
数値入力領域を表示させるために UIshell,UIpanel,UIfield を接続します。shell_command に int型オブジェクトを追加し、名前を value に変更します。valueオブジェクトの入力ポートを表示し、この value オブジェクトと UIfield の出力ポートを接続します(図5)。

図5 UIfieldを利用したネットワーク例
shell_command.command オブジェクト内で別の変数オブジェクトの値を参照する場合は、オブジェクト名の前にアットマーク(@)を付けて記述します。
@オブジェクト
図5の commandオブジェクト内では、
"rsh hostname goto @value"
と記述し、valueの値を参照しています。
数値入力領域に数値が入力されると UIfield.value に数値が入り、shell_command.value に反映されます。shell_command.valueの値が変更されると shell_commandモジュールはコマンドを実行します。
アプリケーションの機能が多彩になるとネットワークが複雑になってきます。
はじめのうちは見易かったネットワークエディター上のモジュール配置も一見しただけでは分かりにくいものになるばかりでなく、アプリケーションのデバッグ作業をおこなっても原因を掴みにくく、解決に時間がかかります。
そこで、ネットワークを構築する時には機能ごとにマクロ化し、見易いネットワークを作成するように心掛けます。
マクロを作成する場合には、マクロの入出力部分にlinkオブジェクトを使用するようにします。
(注)linkオブジェクトは、データの処理には直接関係しないオブジェクトです。マクロ内のオブジェクトとマクロ外のオブジェクトを接続させる時に目印として使います。
例えば、マクロの外にあるオブジェクト A の値をマクロの中にある3つのモジュールで利用する場合、linkがある時とない時では使い勝手が全く違います。linkを使用するとマクロの作成がすっきりします(図6,7)。

図6 linkを利用しないmacro

図7 linkを利用したmacro
また、linkを利用すると入出力ポートに名前をつける事ができます。
この名前はモジュールの「情報(Info)」からいつでも確認する事ができるため、分かりやすい名前をつけることによってネットワーク作成時の手助けになります。
以上の機能を実装して作成したアプリケーションを紹介します。
これまで、研究成果や解析結果などの連続する画像データを正確にVTR録画する場合には、静止画像の一枚一枚をVTRへ録画する毎にテープの送りと巻戻しが発生するため、作業時間が大変かかっていました。
AVS/Expressで作成した可視化結果をVTR録画する場合も同様の方法によって行う必要があったため、当社AVSサポートセンターでは、録画時間を短縮するために WSD/2Xtreme(以下WSD)とVTR装置をコントロールするプラグインモジュールを作成しました。
WSDとは画像ストレージ用ディスクアレイです。非圧縮画像ファイルを内部に保存し、保存した画像はリアルタイムに映像信号として出力させることができます。そのためVTRへの録画も簡単に行えます(図8)。

図8 システム構成例
プラグインモジュールはWSDへのAVS/Expressイメージの転送、WSDのコントロール、WSDに接続されているVTRのコントロールが可能です。
通常これらの操作は、ワークステーション端末上でコマンドを入力することによって行いますが、プラグインモジュールを利用することでGUIパネルを利用し、可視化イメージの生成からVTR録画までをAVS/Express内で一貫した操作性でコントロールすることができます。
このプラグインモジュールを利用すると、可視化イメージ一枚毎のコマ撮り録画ではなく、AVS/Expressにて作成したイメージを映像データとして一括して録画するため、作業時間を大幅に短縮することができます。
AVS/Express を起動し、図9のような可視化アプリケーションを作成します。

図9 OutputWSD接続例
OutputWSDプラグインモジュールをネットワークエディタ上に配置すると、OutputWSDコントロールパネルが表示されます(図10)。
このパネルの操作により映像データを編集します。
コントロールパネルは左から "AVSコントロール"、"WSDコントロール"、"VTR出力"、"VTRコントロール" の4つの機能に分類されています。
例えば、等値面を張る値を自動的に変化させるアニメーションを行うと、値が変わる度に Uviewer3D の表示結果が更新され、OutputWSD に渡ります。そして、"AVSコントロール"パネルを設定することによって自動的に WSDへ可視化イメージが転送されます。その後、"WSDコントロール"パネルによって WSD上のイメージを再生させることで、毎秒30フレームの実時間にて VTR に録画することができます。
なお、WSD/2Xtremeを使った可視化結果のVTR保存について興味ある方は、当社AVSサポートセンターまでご連絡下さい。
今回の紹介したAVS/Expressの使い方は、AVS/Expressをプラットフォームにして別アプリケーションを効率よく使うものです。
AVS/Expressではあまり紹介されない機能のため、知らない方もいらっしゃったのではないかと思います。
シェルコマンドの実行は今回紹介したshell_commandモジュールを利用することで手軽にできますし、V言語の実行には以前、Technical Report Vol5, No.1 で紹介した parse_vモジュールが利用できますので、ちょっとしたプログラム相当のことであれば、V言語と提供されているモジュールを利用することで実現可能です。
これらを組み合わせてネットワークを作成すれば、今まで条件に応じてコマンド実行していた操作がAVS/Expressに組み込まれてGUIから実行できるようになります。コマンド操作などでうっとうしさを感じていることがありましたら、アプリケーション作成にチャレンジされてみてはいかがでしょうか。
AVS Support Center, fns-avssup@cs.jp.fujitsu.com