C#ATIA

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

ストックモデルを利用している全てのツールパスの設定を未選択にする

邪魔なストックモデルを削除しようと思うのですが、相変わらず
依存が厳しく削除コマンドを行っても削除されません。
f:id:kandennti:20190307141324p:plain
削除しようとしているストックモデルを利用しているツールパスが
計算済みの為、削除出来ないような仕様になっています。

この様にストックモデルを利用している全てのツールパスの
設定を空欄にします。(赤印側)
f:id:kandennti:20190307141335p:plain
緑印の「ストックモデル」は後の作業の為、維持したままにします。

//pm2019macro
//Reset_RestRefarence.mac Ver0.0.1
//ストックモデルを利用しているツールパス取得

function Main () {

	//ストックモデルを利用しているツールパス取得
	entity list tps = {}
	call Get_HasRefStock_List($tps)
	
	//無効化
	call ExecInvalidateTP(reverse($tps))
	
	//削り残しストックモデルで未選択にする
	call ExecResetStockTP($tps)
	
	//終わり
	message info 'Done'
}

function ExecResetStockTP (entity list ents) {
	foreach tp in $ents {
		$tp.AreaClearance.Rest.ReferenceType = 'stockmodel'
		ACTIVATE TOOLPATH $tp.name FORM TOOLPATH
		EDIT PAR 'StockModelState.StockModel' ''
		EDIT TOOLPATH $tp.name REAPPLYFROMGUI
		YES
	}
}

function Get_HasRefStock_List (output entity list ents) {
	string filter = 'size(StockModelState.StockModel) > 0'
	$ents = filter(folder('toolpath') , $filter)
}

function GetComputedCount (entity list ents, output int out) {
	string filter = 'Computed == 1'
	$out = size(extract(filter($ents , $filter), 'name'))
}

function ExecInvalidateTP (entity list ents) {
	int st_cnt = 0
	call GetComputedCount($ents, $st_cnt)	
	int tmp1 = 0
	$tmp1 = $st_cnt
	int tmp2 = 0
	string tpname = ''
	do {
		foreach ent in $ents {
			invalidate toolpath $ent.name
		}
		call GetComputedCount($ents, $tmp2)
		if $tmp1 == $tmp2 {
			break
		}
		$tmp1 = $tmp2
	} while not $tmp1 == 0
}

もうちょっと作業が楽になって欲しい。


逆に全てのストックモデルを作成する際に使用しているツールパスを
全て取得する場合は、こんな感じです。

	entity list stocks = folder('stockmodel')
	object list states = flatten(extract($stocks, 'states'))
	entity list tps = flatten(extract($states, 'references'))

但し、何だか処理が重いです。