こちらの続き? です。
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秒弱でした。 結構無理やりでも取得できるっぽいです。