C#ATIA

↑タイトル詐欺 主にCATIA V5 の VBA

バッチ処理前にマクロでモデルをチェックする

久々にPowerMillのマクロです。 かなり忘れています。

PowerMillで苦労している部分は多々あるのですが、
一番精神的にダメージを受けるのが、モデルのインポート。

お互いイロイロとライセンスが無い為、Igesで受け渡しを行っています。
どうやら苦労されているのは、僕だけではなく・・・
http://www.coe.org/p/fo/et/thread=29121
Stepでも面が抜け落ちたりしているようです。
(解決されたみたいですが)

時間のかかる処理を行った後に、
「あっここの小さな面が抜けてる・・・」
となると、途端にモチベーションが下がりまくります。
(でも、どのCAMソフトでも経験があるはず)


事前にデータをチェックし修復さえしていれば、かなりストレス軽減に
なるはずなので、マクロで処理してしまいます。

//pm2018 macro
//Find_Surface_Clearance.mac Ver0.0.2
//モデルの隙間とバッドサーフェスの検索

function Main() {
	real MeshTolDef = 0.005 //メッシュトレランス-デフォルト
	real ClearTolDef= 0.1 //隙間トレランス-デフォルト
	
	//**ユーザー選択**
	//モデル
	string msg = '隙間と不良面をチェックするモデルを選択してください'
	string list models = input entity multiple model $msg
	if is_empty(models) {
		return
	}
	
	//サーフェス方向
	$msg = 'サーフェス方向処理を行いますか?'
	bool NormalFg= 0
	$NormalFg= QUERY $msg
	
	//メッシュトレランス
	$msg = '不良面チェックトレランスを入力して下さい'	
	real MeshTol = $MeshTolDef 
	call InputReal($Msg, $MeshTolDef , $MeshTol )
	if $MeshTol  < 0 {
		return
	}	
	
	//隙間トレランス
	$msg = '隙間チェックトレランスを入力して下さい'	
	real ClearTol  = $ClearTolDef
	call InputReal($Msg, $ClearTolDef , $ClearTol )
	if $ClearTol   < 0 {
		return
	}

	//**処理**
	call DialogOff()
	
	//サーフェス方向
	if $NormalFg {
		call Exec_OrientNormals($models)
	} 
	
	//BadSurfaces
	call Exec_BadSurfaces($models, $MeshTol) 
	
	//バウンダリ作成
	call Create_Boundary($models , $ClearTol ) 
	
	call DialogOn()
	message info 'Done'
}

//不良面
function Exec_BadSurfaces(string list Models, real Tol) {
	EDIT MODEL ALL DESELECT ALL
	foreach name in $Models {
		EDIT MODEL $name SELECT ALL
	}	
	
	string nxtset = new_entity_name('Level')
	CREATE LEVEL ; MODELCOMPSET
	EDIT LEVEL $nxtset ACQUIRE SELECTED
	string cmd = 'EDIT LEVEL $nxtset MESH "' + string($Tol) +'"'
	DoCommand $cmd
	DELETE LEVEL $nxtset
	
	EDIT MODEL ALL DESELECT ALL	
	VIEW MODEL ; SHADE NORMAL
}

//サーフェス方向
function Exec_OrientNormals(string list Models) {
	EDIT MODEL ALL DESELECT ALL
	foreach name in $Models {
		EDIT MODEL $name SELECT ALL
		EDIT MODEL $name ORIENT_NORMALS SELECTED
	}	
}

//バウンダリ
function Create_Boundary(string list Models, real Tol ) {
	EDIT MODEL ALL DESELECT ALL
	string newname = ''
	foreach name in $Models {
		EDIT MODEL $name SELECT ALL
		$newname = $newname + $name + '_' 
	}	
	$newname = $newname + '_Checked-Tol_' + string($Tol)
	
	string Bouname = new_entity_name('Boundary')
	CREATE BOUNDARY ; SKETCH FORM BOUNDARY
	EDIT BOUNDARY $Bouname TOLERANCE $Tol
	EDIT BOUNDARY $Bouname INSERT MODEL
	
	RENAME BOUNDARY $Bouname $newname
	
	EDIT BOUNDARY $newname ACCEPT BOUNDARY ACCEPT
	EDIT MODEL ALL DESELECT ALL
}

//数値入力 不正時は-1を返す
function InputReal(string Msg, real Defreal, output real  Outreal) {
	$Outreal = -1
	real res = $Defreal
	$res = input $Msg
	bool err = 0
	$err = error $res
	if $err {
		message error '数値を入力して下さい!'
		return
	} 
	if $res <=0 {
		message error '0以上の数値を入力して下さい!'
		return
	} 	
	$Outreal = $res
}

//ダイアログ類オン
function DialogOn() {
	GRAPHICS UNLOCK
	DIALOGS MESSAGE ON
	DIALOGS ERROR ON
	ECHO ON DCPDEBUG TRACE COMMAND ACCEPT
}

//ダイアログ類オフ
function DialogOff() {
	GRAPHICS LOCK
	DIALOGS MESSAGE OFF
	DIALOGS ERROR OFF
	ECHO OFF DCPDEBUG UNTRACE COMMAND ACCEPT
}

マクロ実行後
・対象モデルの選択
・サーフェスの方向付け(任意)
・メッシュトレランス入力
・隙間トレランス入力
で自動的に、BadSurfcesの検出と隙間となるバウンダリを作成します。
(BadSurfcesは処理上で弊害となる不正面で、存在しているとツールパスを
 計算してくれません)

実際に試した感じです。

最初はモデルの色がグレーと茶色が整っていないのですが、
マクロ内で処理させています・・・が、最後にズームさせた位置に
反転した面があるんですよね。(完全じゃないです)