読者です 読者をやめる 読者になる 読者になる

C#ATIA

↑タイトル詐欺 主にCATIA V5 の VBA

PowerMillマクロのダイアログ類

PowerMill

前回は、結局マニュアルに記載されていた関数のみでした。
今回こそは・・・、と思ったのですが、調べると今回も殆どがマニュアル
記載のものです。

PowerMillのマクロで処理した際、マクロユーザーに何らかのメッセージや選択を促す
ダイアログ類の覚書です。


〇エコーコマンド
どちらかと言うと、開発者用です。
VBAのイミディエイトウィンドウと同等なエコーコマンドへの出力です。
アクティブな工具名の出力です。

function main() {
	print = tool.name
}


〇message ~
OKボタンのみのダイアログです。

function main() {
	message info tool.name
	message warn tool.name
	message error tool.name
}


〇INFOBOX
これはマニュアルに記載されていないです。
ポスト処理やCADデータをインポートした際に現れるダイアログのようです。
messageダイアログより表現豊かで、これは表示されてもマクロの実行が
止まりませんでした。又、これはマクロから閉じる事も可能でした。

function main() {
	INFOBOX NEW "info box test"

	string txt = "HEADING STYLE : " + tool.name + crlf + crlf
	INFOBOX STYLE "HEADING"
	INFOBOX APPEND $txt

	$txt = "NORMAL STYLE : " + tool.name + crlf + crlf
	INFOBOX STYLE "NORMAL"
	INFOBOX APPEND  $txt

	$txt = "WARNING STYLE : " + to_xml(entity('Tool', tool.name))
	INFOBOX STYLE "WARNING"
	INFOBOX APPEND  $txt

	WAIT 3.0
	INFOBOX CLOSE
}

"WARNING STYLE : "の横のto_xml関数もマニュアルの記載が無く、パラメータをXMLフォーマットで
出力するようです。
WAIT関数もマニュアルの記載がありません。単位は秒のようです。
こちらのサンプルの方がイロイロと表現されています。
Delcam User Forum • View topic - Can you do images in a message box popup?


〇QUERY
'はい' 'いいえ' ボタンを持つダイアログです。

function main() {
	bool yn = 0
	string msg = ''
	$yn = QUERY 'このブログの記述は、信用出来ない?'
	if $yn {
		$msg = 'その通り!'
	} else {
		$msg = 'よく考えよう!'
	}
	message warn $msg
}


〇input
単純な入力用ダイアログです。
事前に受け取る変数に値を入力しておくと、デフォルトで設定されるようです。
(古いバージョンでは出来なかったような・・・)

function main() {
	int num = 23
	$num = input "何歳(数字で入力)"
	bool err = 0
	$err = error num
	string msg = ''
	if $err {
		$msg = '数字入力だって!!'
	} else {
		$msg = '多分、' + $num + '歳'
	}
	message warn $msg
}

上記のコードで文字を入力すると、通常は都合が悪く(int型に文字を代入)
エラーになるべきなのですが、PowerMillのマクロでは '0' が代入されてしまいます。
PowerMillのマクロでは例外処理が出来ないのですが、inputに関しては
上記のコードの方法でエラーを拾えるようです。


〇input entity ~
指定した組み込みフォルダ内のエンティティを選択肢としたセレクトボックスです。
inputでは、マクロユーザーの入力ミスに対してのチェックコードを用意する必要が
あると思いますが、こちらはその手間が省けるため、マクロの開発者・ユーザーの
負担が軽減できます。
事前に受け取る変数内に値を入れておけば、デフォルト値として表示されました。

function main() {
	string msg = "アクティブにする工具を選んでください" + crlf + "現在は " + tool.name
	string toolname = tool.name
	$toolname = input entity tool $msg
	activate tool $toolname
	message warn $toolname + " をアクティブツールにしました"
}

上記コードでは '工具フォルダ' から工具を選択させるようにしています。
f:id:kandennti:20170221191908p:plain


〇input entity multiple ~
input entity ~ は、プルダウンされたリストから1個しか選択出来ませんが、
こちらは複数選択が可能です。
事前に受け取る変数内に値を入れておいても、デフォルトでチェックが入った
状態にはなりませんでした。

function main() {
	string msg = "バックグランドで計算させるツールパスを選択してください" 
	entity list paths = input entity multiple toolpath $msg
	foreach path in $paths {
		INVALIDATE TOOLPATH $path.name
		EDIT TOOLPATH $path.name QUEUE
	}
	message info size($paths) + "個をバックグランドで計算登録しました"
}

上記のコードは、既に存在しているツールパスをプルダウンリストし、選択されたツールパスを
バックグランド計算に投げるコードです。(計算済みのものも強制的に計算させます)
f:id:kandennti:20170221191917p:plain


〇input choice
input entity multiple ~は組み込みフォルダ内の全てのエンティティが表示されて
しまいます。上記のコードの場合であれば、未計算のツールパスだけを選択肢
したいところです。 こちらは事前に処理しておいたリストを選択肢として
おくことが可能です。 リストの一番最初のものがデフォルト値となるようです。
戻り値はリストのインデックスです。

function main() {
	string list paths = extract(filter(folder('toolpath'), 'Computed == 0'), 'Name') 
	string msg = "バックグランドで計算させるツールパスを選択してください" 
	int idx = input choice $paths $msg
	string cmd = "EDIT TOOLPATH " + $paths[$idx] +" QUEUE"
	docommand $cmd
	message info $paths[$idx]  + "をバックグランドで計算登録しました"
}

上記のコードは、先日のfilter・extract関数で事前に未計算のツールパスのみを
探し出し、プルダウンリストとして表示させます。
f:id:kandennti:20170221191925p:plain
残念なのは、複数選択が出来ない事です。


フォーラムを見ても

//これはNGです
・・・
string list paths = extract(filter(folder('toolpath'), 'Computed == 0'), 'Name') 
string msg = "バックグランドで計算させるツールパスを選択してください" 
int idx = input choice multiple $paths $msg
・・・

の様に、リストの複数選択したいけど出来ないの? のような記載はありますが
どうも出来ないようです。
代案としては、どれか一つ組み込みフォルダを犠牲にして・・・と言う感じの
コードに僕はしてみましたけど。