こちらの続きです。
ツールパスのコンポーネント残り代情報 - C#ATIA
テスト的なコードとは言え、あまりの処理の遅さのため改善します。
根本的な目的は、全ての情報の取得ではなく任意の設定となっていない
ツールパスさえわかれば良いのです。(修正は手動でチマチマ)
//pm2018 macro //Get_ThicknessSetValues_Unmatch_ToolPath_Name.mac ver0.0.1 //デフォルト [コンポーネント/残り代] と異なる設定のツールパス名取得 function main() { call Sw_Start() graphics lock //defalt ThicknessSetValues string list def_tvInfo = {} call Get_defalt_ThicknessSetValuesInfo($def_tvInfo) //filter string filter = '' call Initfilter($def_tvInfo, $filter) //match toolpath entity list tps = folder('toolpath') $tps = filter($tps , $filter) //un_match toolpath string list all_tps = extract(folder('toolpath'), 'name') string list match_tps = extract($tps, 'name') string list unmatch_tps = subtract($all_tps, $match_tps) INFOBOX NEW "***** toolpath ThicknessSetValues info *****" INFOBOX CLEAR FORMAT call ShowInfobox('デフォルト [コンポーネント/残り代] と異なる設定のツールパスは以下のものです' + crlf) call ShowInfobox(join($unmatch_tps, crlf)) //終了 call Sw_GetTime() } //filter function Initfilter(string list tvs, output string out) { string list prms = {'Mode', 'UseAxialThickness', 'Thickness', 'AxialThickness'} int list prm_rng = {} call GetRangeLst(0, size($prms), $prm_rng) int list tv_rng = {} call GetRangeLst(0, size($tvs), $tv_rng) $out = '' string list tmp = {} int dmy = 0 string value = '' foreach tv_idx in $tv_rng { string list info = tokens($tvs[$tv_idx], ',') foreach prm_idx in $prm_rng { if $prm_idx == 0 { $value = '"' + $info[$prm_idx] + '"' } else { $value = $info[$prm_idx] } $dmy = add_last($tmp, 'ThicknessSetValues[' + string($tv_idx) + '].' + $prms[$prm_idx] + ' == ' + $value) } } $out = join($tmp, ' and ') print = $out } //defalt ThicknessSetValues info function Get_defalt_ThicknessSetValuesInfo(output string list out) { string dmy_tp = '' call InitDmyTP($dmy_tp) FORM THICKNESS EDIT THICKNESS TAB DEFAULT EDIT THICKNESS TAB COMPONENTS TOOLPATH EDIT TOOLPATH ; THICKNESS CLONE_DEFAULT THICKNESS ACCEPT object list def_tvs = entity('toolpath', $dmy_tp).ThicknessSetValues call GetThickSetValInfo($def_tvs, $out) DELETE TOOLPATH $dmy_tp } //ThicknessSetValues info function GetThickSetValInfo(object list tvs, output string list out) { int list rng = {} call GetRangeLst(0, size($tvs), $rng) string info ='' string list lst = {} int dmy = 0 foreach idx in $rng { object tv = $tvs[$idx] $info = $tv.Mode + ',' + $tv.UseAxialThickness + ',' + $tv.Thickness + ',' + $tv.AxialThickness $dmy = add_last($lst, $info) } $out = $lst } //ダミーツールパス function InitDmyTP(output string out) { $out = new_entity_name('toolpath') IMPORT TEMPLATE ENTITY TOOLPATH TMPLTSELECTORGUI 'Finishing/Constant-Z-Finishing.002.ptf' FORM CANCEL STRATEGYSELECTOR\nFORM TOOLPATHIMPORT EDIT TOOLPATH $out REAPPLYFROMGUI YES FORM ACCEPT SFConstZFinishing } //範囲 function GetRangeLst(int start, int count, output int list lst) { int num = 0 $lst = {} do { int dmy = add_last($lst, $start + $num) $num = $num + 1 } while $num < $count } //情報 function ShowInfobox(string msg) { INFOBOX STYLE "NORMAL" INFOBOX APPEND $msg } //測定スタート function Sw_Start() { CLOCK RESET QUIT CLOCK ON QUIT } //時間表示 function Sw_GetTime() { 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 message info $txts[0] }
全ツールパスに対してフィルター関数で抜き出すのですが、フィルターの条件もForEachで作り出します。
PMillマクロのString型に文字数制限は無い?(ひょっとしたらあるのかな?)様で、
かなり巨大な文字列を渡しています。
比較対象はデフォルト [コンポーネント/残り代] の設定です。
実際にテストした結果はこちら
20本程のツールパスに対して、6秒弱! 正直、驚きました。
前回のものでは同様のデータで3分以上かかっていたので。
但し、前回紹介したコンポーネント数のチェックはしてません・・・。
フィルター関数使おう、ループは遅い。
(コンポーネント数をパラメータで取得したい)