こちらの続きです。
デフォルト [コンポーネント/残り代] と異なる設定のツールパス名を取得2 - C#ATIA
イロイロと探していた末、目的のコンポーネント数を取得する関数を発見しました。
しかもやりたかった事がそのまま例題に・・・。
念の為お伝えしておくと
object obj = model_components_thicknessset(entity('toolpath', '1'), 'surfaces', 0)
の様にしているとPMill落ちます。(恐らくマクロでは扱えない型で返って来るのでしょう)
sizeで利用するしか方法は無さそうです。
又、前回のマクロですがコンポーネント数をチェックしていたにも関わらず、正しく処理
されていませんでした。
//pm2018 macro //Find_un_match_ToolPath.mac ver0.0.3 //デフォルト [コンポーネント/残り代] と異なる設定のツールパス名取得 //--------------------------------------------------------------------------------------------------- //ver0.0.1-完成 //ver0.0.2-コンポーネントチェック追加 //ver0.0.3-model_components_thicknessset関数使用 // -GetCompMatchList関数 不具合修正 //--------------------------------------------------------------------------------------------------- function main() { //debug mode bool debug = 1 //check call CanExec() //start call Sw_Start() graphics lock INFOBOX NEW "***** Toolpath ThicknessSetValues info *****" INFOBOX CLEAR FORMAT //defalt ThicknessSetValues call PushInfobox('Getting Surface Defaults Info.' + crlf) string list def_tvInfo = {} int list def_cmp = {} call Get_defalt_ThicknessSetValuesInfo($def_tvInfo, $def_cmp) //filter call PushInfobox('Getting Toolpath Surface Parameter.' + crlf) string filter = '' call Initfilter($def_tvInfo, $filter) if $debug == 1 { call WriteFile(macro_path(false) + '\filter.txt' , $filter) } //pram match toolpath call PushInfobox('Getting Parameter match toolpath.' + crlf) entity list tps = folder('toolpath') $tps = filter($tps , $filter) if $debug == 1 { call WriteFile(macro_path(false) + '\Parammatch.txt' , join(extract($tps, 'name'), crlf)) } //components match toolpath call PushInfobox('Getting Components match toolpath.' + crlf) call GetCompMatchList($tps, $def_cmp, $tps) //un match call PushInfobox('Getting un match Toolpath.' + crlf + crlf) string list all_tps = extract(folder('toolpath'), 'name') string list match_tps = extract($tps, 'name') string list unmatch_tps = subtract($all_tps, $match_tps) call PushInfobox('デフォルト [コンポーネント/残り代] と異なる設定のツールパスは以下のものです' + crlf) //call PushInfobox("It's toolpath that un match the 'Surface Defaults' values." + crlf) call PushInfobox(join($unmatch_tps, crlf)) //finish if $debug == 1 { string tm = '' call Sw_GetTime($tm) call PushInfobox(crlf + $tm) } message info 'Done' } //start check function CanExec() { string list msg = {} int dmy = 0 //toolpath if size(folder('toolpath')) <1 { $dmy = add_last($msg, 'There is no toolpath to check.') } //model if size(folder('model')) <1 { $dmy = add_last($msg, 'The model has not been imported.') } if not is_empty($msg) { message warn join($msg, crlf) macro abort } } //Match components function GetCompMatchList(entity list tps, int list def_cmp, output entity list out) { int list rng = {} call GetRangeLst(0, size($tps), $rng) $rng = reverse($rng) int dmy = 0 string def = join($def_cmp,',') string list removeLst = {} foreach idx in $rng { int list cmp = {} call GetToolpathCompsCount($tps[$idx], $cmp) if join($cmp,',') != $def { $dmy = add_last($removeLst,$tps[$idx].name) } } if is_empty($removeLst) { $out = $tps return } string list txts = {} foreach tp_name in $removeLst { $dmy = add_last($txts, 'name != "' + $tp_name +'"') } $out = filter($tps, join($txts, ' and ')) } //Toolpath components function GetToolpathCompsCount(entity tp, output int list comps) { int list rng = {} call GetRangeLst(0, size($tp.ThicknessSetValues), $rng) $comps = {} int dmy = 0 foreach idx in $rng { $dmy = add_last($comps, size(model_components_thicknessset($tp, 'surfaces', $idx))) } } //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 prms, output int list comps) { string dmy_tp = '' call InitDmyTP($dmy_tp) $prms = {} $comps = {} call GetThickSetValInfo(entity('toolpath', $dmy_tp), $prms, $comps) DELETE TOOLPATH $dmy_tp } //ThicknessSetValues info function GetThickSetValInfo(entity tp, output string list prms, output int list comps) { object list tvs = $tp.ThicknessSetValues int list rng = {} call GetRangeLst(0, size($tvs), $rng) //string list mode = extract($tvs, 'Mode') //NG bool list useax = extract($tvs, 'UseAxialThickness') real list thic = extract($tvs, 'Thickness') real list axthic = extract($tvs, 'AxialThickness') $prms = {} int dmy = 0 foreach idx in $rng { object tv = $tvs[$idx] $dmy = add_last($prms, $tv.Mode + ',' + $useax[$idx] + ',' + $thic[$idx] + ',' + $axthic[$idx]) } $comps = {} call GetToolpathCompsCount($tp, $comps) } //dammy toolpath 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 } //** Support Function ** //range 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 } //infobox function PushInfobox(string msg) { INFOBOX STYLE "NORMAL" INFOBOX APPEND $msg } //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] } //WriteFile function WriteFile(string path ,string s) { FILE OPEN $path FOR WRITE AS file FILE WRITE $s TO file FILE CLOSE file }
前回のコードでの結果
今回のコードでの結果
体感的には、十分使ってみようかな?と思えるぐらいになりました。
もうちょっと速くなって欲しいのと、デフォルト値の取得のために
ダミーのツールパスを作っているのを止めたい。方法あるかな?