C#ATIA

↑タイトル詐欺 主にCATIA V5 の VBA(最近はPMillマクロとFusion360APIが多い)

PMillマクロ速度比べ2

こちらの続き? です。
PMillマクロ速度比べ - C#ATIA

週末に思い付いたので、テストしてみました。

〇配列とリスト
PMillには配列とリストがあるのですが、あまり配列は使った事が無いです。
単純にINT型を1~100までの値を持つ両方を作成する時間を
比べてみました。
・配列

//pm2018 macro arrya
function main() {
	call Sw_Start()
	int array lst[] = fill(100,0)
	int i = 0
	foreach idx in lst {
		$lst[i] = $i + 1
		$i = $i + 1
	}
	string time = ''
	call Sw_GetTime($time)
	message info  $time
}

//clock on
function Sw_Start() {
	CLOCK RESET QUIT
	CLOCK ON QUIT	
}

//clock off
function Sw_GetTime(output string out) {
	string $TraceFilePath = macro_path(false) + "\clock.txt"
	string list txts = {}
	ECHO OFF DCPDEBUG UNTRACE COMMAND ACCEPT
	TRACEFILE OPEN $TraceFilePath
	CLOCK OFF QUIT
	CLOCK PRINT QUIT
	TRACEFILE CLOSE
	ECHO ON DCPDEBUG TRACE COMMAND ACCEPT
	
	FILE OPEN $TraceFilePath FOR READ AS Input
	FILE READ $txts FROM Input
	FILE CLOSE Input
	DELETE FILE $TraceFilePath

	$out = $txts[0]
}

結果は4.5秒弱でした。

・リスト
同様の結果を得るだけなのですが、リストを拡張する為のadd_lastメソッドが
遅いのではないかな? と感じていた為です。

//pm2018 macro list
function main() {
	call Sw_Start()
	int list lst = {}
	int i = 0
	foreach s in fill(100,"") {
		$i = add_last($lst, $i+1)
	}
	string time = ''
	call Sw_GetTime($time)
	message info  $time
}
・・・

時間測定の為の関数は同様です。
結果は、2.5秒弱でした。add_lastは遅く無かったです。


〇ThicknessSetValuesのMode取得
ThicknessSetValuesのModeの取得する際、1つのツールパスの16個をまとめて
リストとして取得したいのですが、こんな感じに書くとエラーになります。

	object list tvs = $tp.ThicknessSetValues
	
	string list mode = extract($tvs, 'Mode')

ThicknessSetValuesのModeは、デバッガ上では文字列に見えるのですが、
実際はEnum型の為、"string list" ではNGなんです。
(しかし、マクロではEnum型が使えない)

・ForEach
一個だけの取得では文字列として受け取れるので、直接パラメータの
値を取得してみました。

//pm2018 macro ThicknessSetValues Mode Foreach
function main() {
	call Sw_Start()
	string list mode = {}
	int dmy = 0
	foreach tp in folder('toolpath') {
		object list tvs = $tp.ThicknessSetValues
		$mode = {}
		foreach $tv in $tvs {
			$dmy = add_last($mode, string($tv.Mode))
		}
	}
	string time = ''
	call Sw_GetTime($time)
	message info  $time
}

あるプロジェクトファイルで試した所、結果は8秒前後です。


・join_tokens
Enum型のリストを直接 "string list" としては受け取れない為、
変数に代入する前にJoinし再度tokensし、強引に string list化
しました。(思い付きで試した所、動きました)

//pm2018 macro ThicknessSetValues Mode joint_tokens
function main() {
	call Sw_Start()
	string list mode = {}
	int dmy = 0
	foreach tp in folder('toolpath') {
		object list tvs = $tp.ThicknessSetValues	
		$mode = tokens(join(extract($tvs, 'Mode'),','),',')	
	}
	string time = ''
	call Sw_GetTime($time)
	message info  $time
}
・・・

結果は1秒弱でした。 結構無理やりでも取得できるっぽいです。