EnSight の処理の自動化のためのテクニックのご紹介 CEI ソフトウェア株式会社 松野康幸 2016 年 11 月 4 日
本日の予定 EnSight の処理の自動化に向けて EnSight のコマンドでできること EnSight で利用できるコマンドの種類 コマンド ファイルの作り方 Python 形式のコマンドの作り方作成したコマンド ファイルの実行方法ユーザー定義ツールの作り方ユーザー定義ツールの使い方 バッチ処理用のコマンド ファイルの作り方 EnSight のバッチ モードでの実行 バッチ処理用のコマンド ファイルの作り方 2
EnSight のコマンドでできること EnSight 上でマウスおよびキーボードを使って操作された ほぼすべての動作がコマンドで実行 part: select_begin 1 part: select_end clip: begin clip: mesh_plane X clip: value MID-RANGE clip: tool xyz clip: end clip: create part: select_begin 1 part: select_end isos: begin isos: variable pressure isos: end isos: create コマンドを利用すると 3 普段 頻繁に行う定型の処理が 1 クリックで実行可能に コマンドのマクロ化 EnSight の GUI 上で行うパートの作成やパートのパラメーターの変更以外に 様々な制御が可能に 一般的なプログラミング レベルのコントロール
EnSight で利用できるコマンドの種類 EnSight で利用できるコマンドの記述方法は 以下の 2 種類 EnSight の独自形式 コマンド ダイアログの 履歴 にリストされる形式のコマンド ファイル 保存 このセッションのコマンド メニュー等から保存可能 変数や制御コマンド (while 文等 ) を使って ある程度のコントロールは可能 一般的なプログラミング レベルのコントロールは困難 Python 形式 Python の形式で作成されたコマンド 一般的な Python の制御文や既存モジュールを利用して 複雑なプログラミングや高度な処理が可能 EnSight 独自形式のコマンドから変換する必要がある 自動化処理で条件分岐等を行って コマンドの実行を細かくコントロールしたい場合は Python 形式のコマンドの利用を推奨 4
Python 形式のコマンドの作り方 1 Python 形式のコマンドの作成は 以下の 3 つの操作のみ 1 必要な可視化処理用のコマンドの作成 2 作成したコマンドのコマンド編集用ウィンドウへの読み込み ( 貼付け ) 3 EnSight の独自形式のコマンドの Python 形式への変換 1 必要な可視化処理用のコマンドの作成 可視化処理のコマンドは 実際に EnSight の操作画面上で操作して作成 コマンドは 以下の 3 通りの方法で保存 ファイル 保存 このセッションのコマンド メニューでファイル (.enc) に保存 このセッションのコマンド メニューから保存した場合は 起動後に実行された全てのコマンドが保存される 5
Python 形式のコマンドの作り方 2 1 必要な可視化処理用のコマンドの作成 ( つづき ) コマンド ダイアログでコマンド ファイル (.enc) を保存 記録 をチェックしている状態で実行された処理のコマンドが指定したファイルに記録される コマンド ダイアログからコマンドをコピー 6 操作画面で操作を行う前に 入力コマンド で # を入力しておくと 必要なコマンドの切り出しがしやすい
Python 形式のコマンドの作り方 3 2 作成したコマンドのコマンド編集用ウィンドウへの読み込み ( 貼り付け ) コマンド ダイアログの Python タブから コマンド編集用ウィンドウを開く コマンド ファイル (.enc) を保存した場合 : Python ファイルを編集 ボタンを押して 保存したコマンド ファイルを読み込む コマンド ダイアログからコマンドをコピーした場合 : 新規 Python ファイル ボタンを押し 開いたコマンド編集用ウィンドウに コマンドを貼り付ける ファイルを開く時に ファイル形式を Any files (*) にすると 7 EnSight 独自のコマンドのファイル (.enc) も表示される
Python 形式のコマンドの作り方 4 3EnSight の独自形式のコマンドの Python 形式への変換 変換するコマンドを選択 選択範囲をネイティブな Python 形式に変換 メニューで Python 形式のコマンドへ一括変換 選択状態のコマンド Python 形式に変換後のコマンド 8
作成したコマンド ファイルの実行方法 コマンド ファイルの実行方法は 以下の 3 つ 1 コマンド ダイアログから実行 2 EnSight 起動時にコマンド ファイルを指定して実行 3 ユーザー定義ツールにして実行 1 コマンド ダイアログから実行 2EnSight 起動時に -p オプションでコマンド ファイルを指定して実行 実行する度にファイルの読み込み操作が必要 EnSight 起動時にしか指定できない ( バッチ処理を行う場合の実行方法 ) 9 操作画面上で何度も実行したい場合は 3 ユーザー定義ツールにして実行 が便利
ユーザー定義ツールの作り方 1 ユーザー定義ツールは 独自に作成したコマンドを 1 つの機能として EnSight に登録しておき EnSight 上でマウス操作で利用できるツール ツール タイプのユーザー定義ツールとして登録した場合の表示例 ポップアップ メニュー タイプのユーザー定義ツールとして登録した場合の表示例 ユーザー定義ツールの作成で行う操作は 以下の 2 つのみ 1 作成したコマンド ファイルへのヘッダーの追加 2 ヘッダーを追加したコマンド ファイルを所定のフォルダーに置く 10
ユーザー定義ツールの作り方 2 1 作成したコマンド ファイルへのヘッダーの追加 ヘッダーの記述方法は Legacy extensions と Direct load extensions の 2 つ Legacy extensions は EnSight の独自形式のコマンドと Python 形式のコマンドの両方で利用可能な記述方法 Direct load extensions は Python 形式のコマンドのみで利用可能な記述方法 Python と Python 形式のコマンドの両方に個々の名前空間ができるので Python と EnSight で名前空間の衝突を回避できる ただし ヘッダーの追加だけでなく コマンド ファイルのエントリー ポイントとなる関数等も作成する必要がある Legacy extensions を利用した記述 以下のようなヘッダーをコマンド ファイルの先頭に追加 #ENSIGHT_USER_DEFINED_BEGIN #TEXT=GUI に表示される名前 #TOOLTIP= ツールチップに表示される名前 #ICON= アイコンとして使用される画像ファイル (PNG 形式 ) のファイル名 #NAME= ユーザー定義ツールの名前 #DESC= ユーザー定義ツールの説明 #TYPE= ユーザー定義ツールのタイプ ( ) #MODE= ユーザー定義ツールを表示 / 非表示を切り替えるためのフィルター #PTYPE= ユーザー定義ツールを表示 / 非表示を切り替えるためのフィルター #ENSIGHT_USER_DEFINED_END 11 ツール タイプのユーザー定義ツールは TYPE=TOOL ポップアップ メニュー タイプは TYPE=MENU を指定
ユーザー定義ツールの作り方 3 Direct load extensions を利用した記述 以下のようなヘッダーをコマンド ファイルの先頭に追加 #ENSIGHT_USER_DEFINED_BEGIN #FACTORY= コマンド ファイルのエントリー ポイントとなる関数名 #ENSIGHT_USER_DEFINED_END 実行するコマンドを関数として定義 ( 下記の例では create_arrows と定義 ) def create_arrows(): ensight.viewport.select_default() ensight.view_transf.function("global") ensight.clip.select_default() ensight.vctarrow.variable("velocity") ensight.vctarrow.end() ensight.vctarrow.create() 機能ごとにコマンドを関数化しておくと 再利用しやすくなるので便利です 例えば 外形面パートに対してベクトル矢印を作成する場合と 断面に対してベクトル矢印を作成する場合があった時に ベクトル矢印を作成する処理は 同じ関数が利用できるようになります 12
ユーザー定義ツールの作り方 4 コンストラクタとなる init 関数と 作成した関数を実行するための run 関数を定義したクラスを作成 ( 下記の例では クラス名を Create_arrows_part と定義 ) ツール タイプのユーザー定義ツールの場合 クラスの引数で tool_extension を定義 init 関数では ユーザー定義ツールの名前等を定義 run 関数では 作成した関数 create_arrows を定義 class Create_arrows_part(tool_extension): def init (self): tool_extension. init (self,"create_arrows", file,1.0) self.settext("create vector arrows") self.setdesc("create vector arrows. (Direct load extensions)") self.settooltip("create vector arrows on Clip plane part. (Direct load extensions)") dir = os.path.dirname( file ) self.seticon(os.path.join(dir,"arrow.png")) def run(self): create_arrows() 13
ユーザー定義ツールの作り方 5 ポップアップ メニュー タイプのユーザー定義ツールの場合 クラスの引数で menu_extension を定義 init 関数では ユーザー定義ツールの名前等を定義 run 関数では 作成した関数 create_arrows の実行を定義 class Create_arrows_part(menu_extension): def init (self,name,parent,text="",tooltip="",desc="",icon=none): menu_extension. init (self,name, file,1.0) if (parent): parent.addchild(self) if (icon): self.seticon(icon) self.settext(text) self.setdesc(desc) self.settooltip(tooltip) self.setmode('all') self.setparttype('all') def run(self): create_arrows() 14
ユーザー定義ツールの作り方 6 エントリー ポイントとなる関数を定義 ( 下記の例では ctor と定義 ) ツール タイプのユーザー定義ツールの場合 作成したクラスのオブジェクト Create_arrows_part を定義 def ctor(parent): list = [] obj = Create_arrows_part() if (parent): parent.addchild(obj) list.append(obj) return list ポップアップ メニュー タイプのユーザー定義ツールの場合 作成したクラスのオブジェクト create_arrows_part と ユーザー定義ツールの名前等の引数を定義 def ctor(parent): list = [] text = "Create vector arrows Direct" desc = "Create vector arrows (Direct load extensions)" tooltip = "Create vector arrows on Clip plane part. (Direct load extensions)" obj = Create_arrows_part(tooltip, parent, text, desc) list.append(obj) return list 15 関数名として定義した ctor は ヘッダーの #FACTORY= で指定した名前になります
ユーザー定義ツールの作り方 7 2 ヘッダーを追加したコマンド ファイルを所定のフォルダーに置く ユーザーのホーム フォルダーの中にある.ensight101 extensions user_defined フォルダーにフォルダーを作成 ( 下記の例では sample_scripts を作成 ) ヘッダーを追加したコマンド ファイルを作成したフォルダーにコピー ( ヘッダーで画像を指定した場合は 画像ファイルもコピー ) 作成したフォルダー 16.ensight101 フォルダーは EnSight の最初の起動時に 自動的にユーザーのホーム フォルダーに作成されます このフォルダーで行ったコマンド ファイルの変更は そのユーザーのみに反映されます
ユーザー定義ツールの使い方 ( ツール タイプ ) 登録後 初めは ユーザー定義ツール ダイアログにのみ表示 ツール バーへの表示方法 ツール バーのポップアップ メニューから 機能ツールバーのカスタマイズ を開き 作成したユーザー定義ツールを 表示される機能アイコン に移動 17
ユーザー定義ツールの使い方 ( メニュー タイプ ) 登録後 コマンド ファイルのヘッダーで指定されたポップアップ メニューに表示 18
ユーザー定義ツールの使い方 ( 階層化 ) ユーザー定義ツールは 階層化されたメニューとして表示可能 tools.define や menu.define という特別なファイルを使用 ツール タイプ.ensight101 extensions user_defined フォルダーに作成したサブフォルダーの中に tools.define ファイルを置く tools.define ファイルで TYPE=TOOLDIR を定義 #ENSIGHT_USER_DEFINED_BEGIN #NAME=Sample menu #TEXT=Sample menu #TOOLTIP=Sample menu #ICON=sample.png #TYPE=TOOLDIR #ENSIGHT_USER_DEFINED_END ポップアップ メニュー タイプ.ensight101 extensions user_defined フォルダーに作成したサブフォルダーの中に menu.define ファイルを置く tool.define ファイルで TYPE=MENUDIR を定義 #ENSIGHT_USER_DEFINED_BEGIN #NAME=Sample menu #TEXT=Sample menu #TOOLTIP=Sample menu #ICON=sample.png #TYPE=MENUDIR #ENSIGHT_USER_DEFINED_END 19
GUI を表示するユーザー定義ツール CeiQtGenericDialog オブジェクトを使用して 簡単に GUI の表示が可能 from cei.qtgenericdlg import * def gui(): items=[] items.append(['var_name',item_var,"variable name:","please choose a variable.","",0]) dlg = CeiQtGenericDialog(items,None,"Create arrows part","ok","cancel") ret = dlg.doit() for i in dlg.getvalues(): if (i== 'var_name'): variable_name = dlg.getvalue(i) return ret, variable_name PyQt を使って より高度な GUI の作成も可能 20
EnSight のバッチ モードでの実行 バッチ モードでは EnSight を操作画面 (GUI) 表示なしで実行 EnSight を起動する時に -batch オプションを指定 実行する処理は -p オプションを使ってコマンド ファイルを指定 対話的な操作を行う必要がなく 複数の計算結果に対して 同じ処理を行い その結果の画像や動画ファイルを出力したい場合に有効 21
バッチ処理用のコマンド ファイルの作り方 1 バッチ処理で一般的に行われる主な処理 データの読み込み可視化処理結果のファイルへの出力 EnSight の操作画面で行ったデータ読み込みや 結果ファイルの出力のコマンドは データ ファイルがフルパスで直接記述されるため そのままでは複数の計算結果に対してコマンド ファイルを適用するのが難しい ファイル パスとファイル名を動的に変更できるようにした方が良い 22
バッチ処理用のコマンド ファイルの作り方 2 環境変数を使用した入出力データ ファイルの動的切り替え 必要な設定は 以下の 2 つ 1 EnSight 実行時に 独自の環境変数を定義し 入出力ファイルのファイル パスとファイル名をその環境変数の値に設定 2 指定の環境変数から入出力ファイルのファイル パスとファイル名を取得するようにコマンド ファイルを編集 1 環境変数の定義と 入出力ファイルのファイル名の設定 以下のような EnSight 実行用のバッチ ファイルを用意 @echo off set ENS_INPUT_FILENAME=%1 読み込むデータ ファイルのファイル パスを設定 set ENS_OUTPUT_FILENAME=%2 出力する動画ファイルのファイル名 ( 接頭子のみ ) set cur_dir=%~dp0 set cur_dir=%cur_dir:~0,-1% for /F "delims=" %%a in () do echo %%~na カレント ディレクトリを取得 23 call "%CEI_HOME% bin ensight101.bat" -batch -p %cur_dir% batch_command1.py
バッチ処理用のコマンド ファイルの作り方 3 2 コマンド ファイルの編集 編集する箇所は 3 つ 環境変数の値を読み込むコマンドの追加 データを読み込むコマンドのファイル名に 環境変数から取得した値を設定 ファイルを出力するコマンドのファイル名に 環境変数から取得した値を設定 import os input_filename = os.environ.get("ens_input_filename") output_filename = os.environ.get("ens_output_filename") ensight.data.replace(input_filename) ensight.file.animation_file(output_filename) 作成したバッチ ファイルの実行例 : run_ensight.bat C: results data1 data.case C: output data1 PRESSION_animation 24
コマンドの使い方に関するドキュメント コマンドの使い方については 以下のマニュアルをご覧ください Interface Manual( 英語 ) EnSight のインストール フォルダーの ensight101 doc Manuals の中にある InterfaceManual.pdf ファイル EnSight 10.1 Python 形式のコマンドの使い方 弊社ホームページの下記のページからダウンロードできます http://www.ceisoftware.co.jp/usersupport/download.html 25