C#ATIA

↑タイトル詐欺 主にFusion360API 偶にCATIA V5 VBA(絶賛ネタ切れ中)

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

こちらの続きです。
ツールパスのコンポーネント残り代情報 - 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型に文字数制限は無い?(ひょっとしたらあるのかな?)様で、
かなり巨大な文字列を渡しています。

比較対象はデフォルト [コンポーネント/残り代] の設定です。
f:id:kandennti:20180525194927p:plain

実際にテストした結果はこちら
f:id:kandennti:20180525194936p:plain

20本程のツールパスに対して、6秒弱! 正直、驚きました。
前回のものでは同様のデータで3分以上かかっていたので。
但し、前回紹介したコンポーネント数のチェックはしてません・・・。

フィルター関数使おう、ループは遅い。
(コンポーネント数をパラメータで取得したい)