C#ATIA

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

加工モレを発生させない領域を作り出す

長年悩まされていた事がちょっと解決しそうだな と言うお話です。

こんな形状を加工しようと思った場合なのですが、
f:id:kandennti:20180306165000p:plain
紫色は勾配の付いた面で、ピンク色が水平な面です。

傾斜している部分があるので、ボールエンドミルで加工するのですが
大きな水平面がある為、水平面は出来るだけスクエアエンドミルで加工したい。
こんな場合、世間の皆様はどの様な加工領域を作っているのでしょうか?
(知りたい・・・)

生憎、企業秘密的な理由?でWeb上では見つけ出すことが出来ないのが
現状です。まぁ、この程度の形状であれば細かい事を気にしないで
大まかな加工領域をスケッチ等で作ってしまえば良いのですが・・・。


単純な方法でΦ10のエンドミルで水平面を、R2のボールエンドミルで水平面以外を
加工するとして考えてみます。

大きな水平面2つの境界線を作ります。
f:id:kandennti:20180306165008p:plain

3個の境界線が出来上がるのですが、2つのエンドミルで多少ラップした
状態(1mm)で仕上げるとして考え、
赤:不要なので削除
黄:内側に1mmオフセット
緑:外側に3mm(R2+1mm)オフセット
してみます。
f:id:kandennti:20180306165023p:plain

こんな感じの黄色で囲まれた部分をボールエンドミルで仕上げて、残りを
スクエアエンドミルで仕上げるツールパスを作るわけです。(座標系が邪魔・・・)
f:id:kandennti:20180306165033p:plain

細かい事を考えずにこんな感じで作りました。まだまだゴールじゃないんです。
f:id:kandennti:20180306165040p:plain

確認の為、ストックモデルを利用して加工モレが無いか? 確認してみます。
(PowerMillの場合、加工モレのチェックはViewMill(シミュレーション)の機能で出来ない気がします)
見落としてしまいそうな程小さいのですが、赤印部分に加工モレが・・・
f:id:kandennti:20180306165052p:plain

ズームし上から見てみると、こんな感じです。
f:id:kandennti:20180306165059p:plain
黄色はΦ10エンドミル工具で、白い線はR2ボールエンドミルのツールパスです。
面の境界から単純なオフセットで加工する領域を作成すると鋭角な凹形状部に
加工モレが出来てしまうんです。(意図的にそんな形状にしたんです)



以前は、これを防ぐ為にCATIA上でチマチマGSDの機能で加工領域となる線を
作っていたのですが、やはり時間がかかりすぎなんです。
(ここが最初に記載した悩み部分)

サポートに相談したところ回答を頂いたものの、少し手順が複雑で間違えそうな
気配たっぷりで断念したのですが、PowerMillの機能的な面でヒントは頂きました。


まず、Φ10エンドミルでのツールパスを作成します。
f:id:kandennti:20180306165112p:plain
赤印部分の小さな凹部分ですが、わかる方にはわかるのですが、
仕上がらない為に削除します。(意図的にそんな形状にしたんです)

続いてこのツールパスに対して、以下のマクロ実行します。

//pm2018 macro
//Path2Rest_Boundary.mac Ver0.0.1
//ツールパスから削り残しバウンダリを作成
//---------------------------------------------------------------------------------------------------
//<?xml version="1.0" ?>
//<menupage>
//   <button label="パスからバウンダリ作成" command='MACRO toolpath\Path2Rest_Boundary.mac "%s"' />
//</menupage>
//---------------------------------------------------------------------------------------------------
//Path2Rest_Boundary
Function Main(string tp) {
	//ユーザー選択
	string tool = ''
	call SelectTool($tp , $tool) 
	
	//パスアクティブ - blockの為
	call Msgoff()
	activate toolpath $tp
	
	//ストックモデル
	string stk = ''
	call InitStockModel($tp , $stk)

	//バウンダリ
	call InitBoundary($stk , $tool) 
	
	//終わり
	deactivate toolpath
	call Msgon()
	message info 'Done'
}

//工具選択
Function SelectTool(string tp , output string out) {
	string msg = "工具を選んでください" 
	string tool = tool.name
	$tool = input entity tool $msg
	
	bool yn = 0
	$msg = 'ツールパス [ ' + $tp + ' ] に対して 工具 [ ' + $tool + ' ] の' + crlf
	$msg = $msg + '削り残しバウンダリを作成しますか?'
	$yn = QUERY $msg
	if $yn != 1 {
		macro abort
	}
	$out = $tool 
}

//ストックモデル
Function InitStockModel(string tp , output string out) {
	string tmp = new_entity_name('stockmodel')
	string stk = ''
	call GetNewName('stockmodel'  , 'from_' + $tp , $stk)
	CREATE STOCKMODEL ; FORM STOCKMODEL
	RENAME StockModel $tmp $stk
	entity stkmdl = entity('stockmodel' , $stk)
	$stkmdl.TOLERANCE = 0.01
	$stkmdl.STEPOVER = 0.5
	$stkmdl.ThresholdThickness = 0.2
	FORM ACCEPT STOCKMODEL
	EDIT STOCKMODEL $stk DRAW REST
	UNDRAW StockModel $stk
	EDIT STOCKMODEL ; INSERT_INPUT TOOLPATH $tp LAST
	
	$out = $stk
}

//バウンダリ
Function InitBoundary(string stk  ,string tool) {
	string tmp = new_entity_name('boundary')
	//StockRest
	string stkrest = ''
	call GetNewName('boundary' , $stk + '_Rest', $stkrest)
	CREATE BOUNDARY ; STOCKMODEL_REST FORM BOUNDARY
	RENAME Boundary $tmp $stkrest
	EDIT BOUNDARY $stkrest STOCKMODEL $stk
	EDIT BOUNDARY $stkrest STOCKMODEL_THICKER "0.2"
	EDIT BOUNDARY $stkrest EXTEND "0.5"
	EDIT BOUNDARY $stkrest TOLERANCE ".02"
	EDIT BOUNDARY $stkrest LIMIT OFF
	call SetBoundary($stkrest  ,$tool) 
	
	//Silhouette
	string slete = ''
	call GetNewName('boundary' , $stk + '_Fin' , $slete)
	CREATE BOUNDARY ; SILHOUETTE FORM BOUNDARY
	RENAME Boundary $tmp $slete 
	EDIT BOUNDARY $slete SILVERTICAL UP
	EDIT BOUNDARY $slete TOLERANCE "0.01"
	EDIT BOUNDARY $slete VERTTOLERANCE "0.01"
	EDIT BOUNDARY $slete LIMIT ON
	EDIT BOUNDARY $slete LIMIT INSIDE
	EDIT BOUNDARY $slete LIMIT_BOUNDARY $stkrest
	call SetBoundary($slete  ,$tool) 
	EDIT BOUNDARY $slete CALCULATE
}

//バウンダリ共通パラメータ設定
Function SetBoundary(string bou  ,string tool) {
	EDIT BOUNDARY $bou THICKNESS AXIAL_RADIAL OFF
	EDIT BOUNDARY $bou THICKNESS "0.0"
	EDIT BOUNDARY $bou TOOL NAME $tool
	EDIT BOUNDARY $bou PRIVATE NO
	EDIT BOUNDARY $bou AUTOREPLAY NO
	EDIT BOUNDARY $bou IGNORE_HOLDER
	EDIT BOUNDARY $bou BLOCK_LIMIT PERIPHERY
	EDIT BOUNDARY $bou ACCEPT BOUNDARY ACCEPT
	return
}

//新たな名前の取得
Function GetNewName(string folder , string name , output string out) {
	if entity_exists(entity($folder ,$name)) < 1 {
		$out = $name
	} else {
		$out = new_entity_name($folder ,$name)
	}
	return
}

function Msgoff() {
	graphics lock
	dialogs message off
	dialogs error off
}

function Msgon() {
	graphics unlock
	dialogs message on
	dialogs error on
}

実行時はこんな感じです。

実際の業務では、ゴチャゴチャした形状なのでこんなに短時間では処理が
終わらないのですが、それでも放置しておけば処理が終わるので
今までのチマチマ手法より遥かに楽で、今のところ加工モレも出ていません。

Space-eだと、チマチマ手法しか無いんですよね。