C#ATIA

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

水平面高さリストを表示2

こちらの続きです。
水平面高さリストを表示 - C#ATIA

言語切り替えで行うことでも可能なのですが、こちらの方法を流用してみました。
Solved: Macro for iterating selected surfaces - Autodesk Community
どうやら、選択した面の名前をトレースしてファイルに書き出すことが出来るようです。

面の名前さえわかれば、1枚ずつ選択しブロックを作成。ブロックであれば
高さを取得する事が出来る為、プロパティを利用する必要がなくなります。

//pm2018 macro
//GetFlatSurfaceZLevel.mac ver0.0.2
//水平面高さリストの表示
//---------------------------------------------------------------------------------------------------
//ver0.0.1-完成
//ver0.0.2-トレースとブロックの利用
//---------------------------------------------------------------------------------------------------

function main() {
	//一時ファイル書き出し
	//パスを設定してください
	string tracepath = 'c:\tmp\sel_surfs.txt'
	
	//全ての面選択
	EDIT MODEL ALL DESELECT ALL
	EDIT MODEL ALL SELECT FLAT
	
	//選択面名前取得
	string list surfs = {}
	call GetFlatFacesName($tracepath, $surfs)
	if size($surfs) < 1 {
		message warn '水平面が見つかりません!'
		return
	}

	//高さ取得
	string list zlevel = {}
	call GetZLevelList($surfs, $zlevel)
	
	//msg
	string $msg = 'Flat surfaces Z value :' + crlf + join(zlevel, crlf)
	message info $msg
}

//高さリスト取得
function GetZLevelList(string list surfs, output string list out) {
	$out = {}
	
	UNDRAW BLOCK
	EDIT BLOCKTYPE BOX
	EDIT BLOCK COORDINATE WORKPLANE
	EDIT PAR powermill.Options.Block.UseReferenceModel 0
	
	EDIT BLOCK ALL UNLOCK
	EDIT BLOCK TOLERANCE '0.01'
	EDIT BLOCK RESETLIMIT '0'
	EDIT BLOCK LIMITTYPE MODEL
	
	int dmy = 0
	string face = ''
	GRAPHICS LOCK
	foreach s in $surfs {
		EDIT MODEL ALL DESELECT ALL
		$face = RTRIM($s)
		EDIT MODEL ALL SELECT $face
		
		EDIT BLOCK RESET
		$dmy = add_last($out, string(round($Block.Limits.ZMin,3)))
	}
	GRAPHICS UNLOCK
	EDIT MODEL ALL DESELECT ALL
	
	$dmy = remove_duplicates($out )
	$out = reverse(sort($out ))
}

//水平面名取得
function GetFlatFacesName(string tracepath, output string list out) {
	$out = {}
	
	ECHO OFF DCPDEBUG UNTRACE COMMAND ACCEPT
	tracefile open $tracepath
	print SELSURFACE
	tracefile close
	ECHO ON DCPDEBUG TRACE COMMAND ACCEPT
	
	file open $tracepath for read as 's'
	file read $out  from 's'
	file close 's'
	delete file $tracepath

	int dmy = remove_first($out )
}

ついでに重複値を削除し、ソートしました。
こちらの方が処理が桁違いに速いです。
f:id:kandennti:20180430195705p:plain