C#ATIA

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

デフォルト [コンポーネント/残り代] と異なる設定のツールパス名を取得3

こちらの続きです。
デフォルト [コンポーネント/残り代] と異なる設定のツールパス名を取得2 - C#ATIA

イロイロと探していた末、目的のコンポーネント数を取得する関数を発見しました。
f:id:kandennti:20180601155707p:plain
しかもやりたかった事がそのまま例題に・・・。

念の為お伝えしておくと

 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
}

前回のコードでの結果
f:id:kandennti:20180601155740p:plain
今回のコードでの結果
f:id:kandennti:20180601155750p:plain
体感的には、十分使ってみようかな?と思えるぐらいになりました。
もうちょっと速くなって欲しいのと、デフォルト値の取得のために
ダミーのツールパスを作っているのを止めたい。方法あるかな?