EnSightの処理の自動化のためのテクニックのご紹介
CEIソフトウェア株式会社
松野 康幸
本日の予定
EnSightの処理の自動化に向けて
EnSightのコマンドでできること
EnSightで利用できるコマンドの種類
コマンド・ファイルの作り方
Python形式のコマンドの作り方
作成したコマンド・ファイルの実行方法
ユーザー定義ツールの作り方
ユーザー定義ツールの使い方
バッチ処理用のコマンド・ファイルの作り方
EnSightのバッチ・モードでの実行
バッチ処理用のコマンド・ファイルの作り方
2EnSightのコマンドでできること
EnSight上でマウスおよびキーボードを使って操作された、ほぼすべての
動作がコマンドで実行。
3 part: select_begin 1 part: select_end clip: begin clip: mesh_plane X clip: value MID-RANGE clip: tool xyzclip: end clip: create part: select_begin 1 part: select_end isos: begin
isos: variable pressure isos: end isos: create
普段、頻繁に行う定型の処理が1クリックで実行可能に。
⇒コマンドのマクロ化。
EnSightのGUI上で行うパートの作成やパートのパラメーターの変更以外に、
様々な制御が可能に。
⇒一般的なプログラミング・レベルのコントロール。
コマンドを利用すると
…
EnSightで利用できるコマンドの種類
EnSightで利用できるコマンドの記述方法は、以下の2種類。
EnSightの独自形式
「コマンド」ダイアログの「履歴」にリストされる形式のコマンド。 「ファイル」→「保存」→「このセッションのコマンド」メニュー等から保存可能。 変数や制御コマンド(while文等)を使って、ある程度のコントロールは可能。 一般的なプログラミング・レベルのコントロールは困難。Python形式
Pythonの形式で作成されたコマンド 一般的なPythonの制御文や既存モジュールを利用して、 複雑なプログラミングや高度な処理が可能。 EnSight独自形式のコマンドから変換する必要がある。 4自動化処理で条件分岐等を行って、コマンドの実行を細かく
コントロールしたい場合は、Python形式のコマンドの利用を推奨。
Python形式のコマンドの作り方 【 1 】
① 必要な可視化処理用のコマンドの作成
可視化処理のコマンドは、実際にEnSightの操作画面上で操作して作成。
コマンドは、以下の3通りの方法で保存。
5Python形式のコマンドの作成は、以下の3つの操作のみ。
① 必要な可視化処理用のコマンドの作成。
② 作成したコマンドのコマンド編集用ウィンドウへの読み込み(貼付け)。
③ EnSightの独自形式のコマンドのPython形式への変換。
※ 「このセッションのコマンド」メニューから保存した場合は、起動後に実行された全てのコマンドが保存される。 「ファイル」→「保存」→「このセッションのコマンド」メニューでファイル(.enc)に保存。Python形式のコマンドの作り方 【 2 】
① 必要な可視化処理用のコマンドの作成(つづき)
6 「コマンド」ダイアログからコマンドをコピー。 ※ 操作画面で操作を行う前に、「入力コマンド」で「#」を入力しておくと、必要なコマンドの切り出しがしやすい。 「コマンド」ダイアログでコマンド・ファイル(.enc)を保存。 ※ 「記録」をチェックしている状態で実行された処理のコマンドが指定したファイルに記録される。Python形式のコマンドの作り方 【 3 】
②作成したコマンドのコマンド編集用ウィンドウへの読み込み(貼り付け)
「コマンド」ダイアログの「Python」タブから、コマンド編集用ウィンドウを開く。
7 コマンド・ファイル(.enc)を保存した場合: 「Pythonファイルを編集」ボタンを押して、保存した コマンド・ファイルを読み込む。 ※ファイルを開く時に、ファイル形式を「Any files (*)」にすると EnSight独自のコマンドのファイル(.enc)も表示される。 「コマンド」ダイアログからコマンドをコピーした場合: 「新規Python ファイル」ボタンを押し、開いたコマンド 編集用ウィンドウに、コマンドを貼り付ける。Python形式のコマンドの作り方 【 4 】
③EnSightの独自形式のコマンドのPython形式への変換
変換するコマンドを選択。
「選択範囲をネイティブなPython形式に変換」メニューで
Python形式のコマンドへ一括変換。
8 選択状態のコマンド Python形式に変換後のコマンド作成したコマンド・ファイルの実行方法
9コマンド・ファイルの実行方法は、以下の3つ。
① コマンド・ダイアログから実行。
② EnSight起動時にコマンド・ファイルを指定して実行。
③ ユーザー定義ツールにして実行。
操作画面上で何度も実行したい場合は、
「③ユーザー定義ツールにして実行」が便利。
①コマンド・ダイアログから実行。 実行する度にファイルの読み込み操作が必要。 ②EnSight起動時に、-pオプションでコマンド・ ファイルを指定して実行。 EnSight起動時にしか指定できない。 (バッチ処理を行う場合の実行方法)ユーザー定義ツールの作り方 【1】
ユーザー定義ツールは、独自に作成したコマンドを1つの機能として
EnSightに登録しておき、EnSight上でマウス操作で利用できるツール。
10ユーザー定義ツールの作成で行う操作は、以下の2つのみ。
① 作成したコマンド・ファイルへのヘッダーの追加。
② ヘッダーを追加したコマンド・ファイルを所定のフォルダーに置く。
ツール・タイプのユーザー定義ツール として登録した場合の表示例 ポップアップ・メニュー・タイプのユーザー 定義ツールとして登録した場合の表示例ユーザー定義ツールの作り方 【2】
①作成したコマンド・ファイルへのヘッダーの追加
ヘッダーの記述方法は、「
Legacy extensions
」と「
Direct load extensions
」の2つ。
Legacy extensionsは、EnSightの独自形式のコマンドと、Python形式のコマンドの両方で利用可能な 記述方法。
Direct load extensionsは、Python形式のコマンドのみで利用可能な記述方法。
PythonとPython形式のコマンドの両方に個々の名前空間ができるので、PythonとEnSightで 名前空間の衝突を回避できる。ただし、ヘッダーの追加だけでなく、コマンド・ファイルの エントリー・ポイントとなる関数等も作成する必要がある。
《Legacy extensionsを利用した記述》
以下のようなヘッダーをコマンド・ファイルの先頭に追加。
11 #ENSIGHT_USER_DEFINED_BEGIN #TEXT=GUIに表示される名前 #TOOLTIP=ツールチップに表示される名前 #ICON=アイコンとして使用される画像ファイル(PNG形式)のファイル名 #NAME=ユーザー定義ツールの名前 #DESC=ユーザー定義ツールの説明 #TYPE=ユーザー定義ツールのタイプ(※) #MODE=ユーザー定義ツールを表示/非表示を切り替えるためのフィルター #PTYPE=ユーザー定義ツールを表示/非表示を切り替えるためのフィルター #ENSIGHT_USER_DEFINED_END ※ツール・タイプのユーザー定義ツールは「TYPE=TOOL」、ポップアップ・メニュー・タイプは「TYPE=MENU」を指定。ユーザー定義ツールの作り方 【3】
《Direct load extensionsを利用した記述》
以下のようなヘッダーをコマンド・ファイルの先頭に追加。
実行するコマンドを関数として定義。
(下記の例では、「create_arrows」と定義)
12 #ENSIGHT_USER_DEFINED_BEGIN #FACTORY=コマンド・ファイルのエントリー・ポイントとなる関数名 #ENSIGHT_USER_DEFINED_END 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() ※機能ごとにコマンドを関数化しておくと、再利用しやすくなるので便利です。 例えば、外形面パートに対してベクトル矢印を作成する場合と、断面に対してベクトル矢印を 作成する場合があった時に、ベクトル矢印を作成する処理は、同じ関数が利用できるように なります。ユーザー定義ツールの作り方 【4】
コンストラクタとなる「__init__」関数と、作成した関数を実行するための
「run」関数を定義したクラスを作成。
(下記の例では、クラス名を「Create_arrows_part」と定義。)
《ツール・タイプのユーザー定義ツールの場合》
クラスの引数で「tool_extension」を定義。 「__init__」関数では、ユーザー定義ツールの名前等を定義。 「run」関数では、作成した関数「create_arrows」を定義。 13class 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):
ユーザー定義ツールの作り方 【5】
《ポップアップ・メニュー・タイプのユーザー定義ツールの場合》
クラスの引数で「menu_extension」を定義。 「__init__」関数では、ユーザー定義ツールの名前等を定義。 「run」関数では、作成した関数「create_arrows」の実行を定義。 14class 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()
ユーザー定義ツールの作り方 【6】
エントリー・ポイントとなる関数を定義。(下記の例では、「ctor」と定義。)
《ツール・タイプのユーザー定義ツールの場合》
作成したクラスのオブジェクト「Create_arrows_part」を定義。《ポップアップ・メニュー・タイプのユーザー定義ツールの場合》
作成したクラスのオブジェクト「create_arrows_part」と、ユーザー定義ツールの名前等の引数を定義。 15 def ctor(parent): list = [] obj = Create_arrows_part() if (parent): parent.addChild(obj) list.append(obj) return list 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
ユーザー定義ツールの作り方 【7】
②ヘッダーを追加したコマンド・ファイルを所定のフォルダーに置く
ユーザーのホーム・フォルダーの中にある
.ensight101¥extensions¥user_defined
フォルダーにフォルダーを作成。(下記の例では、sample_scriptsを作成。)
ヘッダーを追加したコマンド・ファイルを作成したフォルダーにコピー。
(ヘッダーで画像を指定した場合は、画像ファイルもコピー。)
16 作成したフォルダー ※「.ensight101」フォルダーは、EnSightの最初の起動時に、自動的にユーザーのホーム・ フォルダーに作成されます。 ※このフォルダーで行ったコマンド・ファイルの変更は、そのユーザーのみに反映されます。ユーザー定義ツールの使い方(ツール・タイプ)
登録後、初めは「ユーザー定義ツール」ダイアログにのみ表示。
ツール・バーへの表示方法
ツール・バーのポップアップ・メニューから「機能ツールバーのカスタマイズ」を
開き、作成したユーザー定義ツールを「表示される機能アイコン」に移動。
17ユーザー定義ツールの使い方(メニュー・タイプ)
登録後、コマンド・ファイルのヘッダーで指定されたポップアップ・
メニューに表示。
ユーザー定義ツールの使い方(階層化)
ユーザー定義ツールは、階層化されたメニューとして表示可能。
tools.defineやmenu.defineという特別なファイルを使用。
19 《ポップアップ・メニュー・タイプ》 .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 《ツール・タイプ》 .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
GUIを表示するユーザー定義ツール
CeiQtGenericDialogオブジェクトを使用して、簡単にGUIの表示が可能。
PyQtを使って、より高度なGUIの作成も可能。
20
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
EnSightのバッチ・モードでの実行
バッチ・モードでは、EnSightを操作画面(GUI)表示なしで実行。
EnSightを起動する時に「-batch」オプションを指定。
実行する処理は、「-p」オプションを使ってコマンド・ファイルを指定。
21対話的な操作を行う必要がなく、複数の計算結果に対して、同じ処理を行い、
その結果の画像や動画ファイルを出力したい場合に有効。
バッチ処理用のコマンド・ファイルの作り方【1】
バッチ処理で一般的に行われる主な処理
データの読み込み
可視化処理
結果のファイルへの出力
22EnSightの操作画面で行ったデータ読み込みや、結果ファイルの出力のコマンドは、
データ・ファイルがフルパスで直接記述されるため、そのままでは複数の計算結果に
対してコマンド・ファイルを適用するのが難しい。
ファイル・パスとファイル名を動的に変更できるようにした方が良い。
バッチ処理用のコマンド・ファイルの作り方【2】
環境変数を使用した入出力データ・ファイルの動的切り替え
①環境変数の定義と、入出力ファイルのファイル名の設定
以下のようなEnSight実行用のバッチ・ファイルを用意。
23必要な設定は、以下の2つ。
① 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
call "%CEI_HOME%¥bin¥ensight101.bat" -batch -p %cur_dir%¥batch_command1.py
バッチ処理用のコマンド・ファイルの作り方【3】
②コマンド・ファイルの編集
編集する箇所は3つ。
環境変数の値を読み込むコマンドの追加。 データを読み込むコマンドのファイル名に、環境変数から取得した値を設定。 ファイルを出力するコマンドのファイル名に、環境変数から取得した値を設定。作成したバッチ・ファイルの実行例:
24 import osinput_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) …