こちらの続きです。
水平面高さリストを表示 - 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 ) }
ついでに重複値を削除し、ソートしました。
こちらの方が処理が桁違いに速いです。