C#ATIA

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

Tコード順の工具リストを作成する

まだまだ、PowerMillが使いこなせず悩んでます。
その1つが段取りする為の工具のリスト。

ISOコード(Gコード)出力する際、PowerMillではこんな感じになり
それぞれをポスト処理します。
f:id:kandennti:20180302190324p:plain
その際セットアップシート(段取指示書、作業指示書・・とか)を作る事が
どのCAMソフトでも出来る物ですが、こんな感じの物を作って使用しています。
f:id:kandennti:20180302190334p:plain
フォーマット自体は自由に変更できるのですが、どのCAMソフトでも不満なのは
工程順に出力される部分です。(当然、それも欲しいのですが)

実際に現場で段取りを行う際は、工程順ではなくTコード順に工具の用意や
確認をしたいんです、僕は。

過去にSpace-eでもサポートさんにこの件を何度か伝えたのですが、
未だ実現されてません。(プラグインの作り方も教えてもらえない・・・)


先日、PowerMillのフォーラムでこちらを見つけました。
Tool Tree Set-Up Sheet - Autodesk Community
よくこんなものを作れるなぁ と言うのが本音です。

幾つかのタイプがあるのですが、個人的に使いやすいように(劇的に)直しました。
・フランス語 → 日本語
・Tコード順にソート ← これが一番の目的
・マルチセレクト時、個別ではなく集計しエクスポート
・項目・表示の見直し
・コードがイロイロと汚い・・・
 (ファイル開きっぱなしで、ループし処理しつつ書き出しは許せない)

//pm2018 macro
//UseToolList.mac Ver0.0.1
//選択済みNCプログラムから工具リストを作成
//---------------------------------------------------------------------------------------------------
//本マクロはコンテキストメニューからの起動の為、ncprogram.XMLに追記してください
//<?xml version="1.0" ?>
//<menupage>
//   <button label="使用工具リスト" command='MACRO ncprogram\UseToolList.mac ' 
 multiple_selection="allowed"/>
//</menupage>
//---------------------------------------------------------------------------------------------------

function Main() {
	//シングル-処理 マルチ-最初のみ処理
	IF $PowerMILL.Status.MultipleSelection.Total  {
		IF $PowerMILL.Status.MultipleSelection.First == 0 {
			return
		}
	}
	
	//実行前チェック
	call HasProjectName()
	
	//選択要素(NCプログラム)内でツールパスを持つもののみのリスト
	entity list ncs =  {}
	call GetHasToolpathNcpro(explorer_selected_entities() ,$ncs) 
	
	//エクスポートパス取得・フォルダ作成
	string expdir = project_pathname(0) + '/NCProgramUseTools'
	MKDIR $expdir
	string exppath = $expdir+ "/UseTools.html"
	
	//Tコードによるソート済み工具リスト
	entity list tools =  {}
	call GetSortedToolLst($ncs ,$tools) 
	
	//工具イメージ
	string list imgs = {}
	call InitToolImg($tools, $expdir ,$imgs) 	
	
	//工具データ
	string list tables = {}
	call GetToolInfoTable($tools ,$imgs ,$tables)
	
	//書き出し
	string list expheader = {'<html>','<head>','<title>使用工具</title>','</head>','<body lang=FR>','<H1> 使用工具 </H1>'}
	string list expfooter ={'</body>','</html>'}
	string list exptxt = $expheader + $tables + $expfooter 
	call WriteFile($exppath , $exptxt)
	
	//ブラウザに表示
	message info  'Done'
	OLE fileaction 'open' $exppath
}

//工具画像
function InitToolImg(entity list lst, string exppath ,output string list outlst) {
	string list imgs = {}
	int dmy = 0
	string cmd = ''
	string imgname = ''
	foreach tl in lst {
        $imgname = replace($tl.name ,' ' ,'_') + '.png'
		$cmd='FORM RAISE TOOLASSPREVIEWFORM "' + $tl.name  + '"'
		docommand $cmd
		wait form //必要
		
	    $cmd='EXPORT TOOLASSEMBLYPREVIEW FILE "' + $exppath + '/' + $imgname +'"'
        docommand $cmd
		yes
		FORM CANCEL TOOLASSPREVIEWFORM
		
		$dmy = add_last($imgs , $imgname)
	}
	$outlst = $imgs
}

//工具情報
function GetToolInfoTable(entity list tools ,string list imgs ,output string list outlst) {
	string list tb_head = {'<table border=1 cellspacing=1 cellpadding=1>'}
	string list tb_foot = {'</table>'}
	
	//テーブルタイトル
	string list tb_title = {'イメージ','Tコード','径/ノーズR','タイプ','シャンク径/首下','ホルダ径/突出','ホルダ名'}
	string tmp = ''
	call Join2SrtLst($tb_title ,'<TD align="center" ><H3>', '</H3></TD>' ,$tmp)
	$tmp = '<TR>' + $tmp + '</TR>'
	$tb_title = {$tmp}
	
	//イメージタグ用
	string browser = '15%' //Chrome
	//string browser = '80p' //IE 上手く行かない

	//テーブル中身 タイトルと合わせてね
	string list tb_infos = {}
	string list vals = {}
	int dmy = 0
	int cnt = -1
	foreach tl in tools {
		$vals = {}
		$cnt = $cnt + 1
		
		$dmy = add_last($vals , '<img src="./' + $imgs[$cnt] + '" alt="' + $tl.name + '"  height="' + $browser +'"/>')
		$dmy = add_last($vals , string($tl.Number.Value))
		$dmy = add_last($vals , 'D' + string(round($tl.Diameter,3)) + '/R' + string(round($tl.TipRadius,3)))
		$dmy = add_last($vals , string($tl.Type))
		$dmy = add_last($vals , 'D' + string(round($tl.ShankSetValues[0].UpperDiameter,3))+ '/' + string(round($tl.Length,3)))
		$dmy = add_last($vals , 'D' + string(round($tl.HolderSetValues[0].LowerDiameter,3))+ '/' + string(round($tl.Overhang,3)))
		$dmy = add_last($vals , $tl.HolderName)
		
		call Join2SrtLst($vals ,'<TD align="center" >', '</TD>' ,$tmp)
		$tmp = '<TR>' + $tmp +'</TR>'
		$dmy = add_last($tb_infos  ,$tmp)
	}
	
	$outlst = $tb_head + $tb_title + $tb_infos  + $tb_foot
}

//Tコードによるソート済み工具リスト
function GetSortedToolLst(entity list ncs ,output entity list outlst) {
	string list tools = {}
	foreach nc in ncs {
		$tools = $tools + list_nctools($nc)
	}
	int dmy = 0
	$dmy = remove_duplicates($tools)
	
	entity list nctools = {}
	foreach toolname in tools {
		$dmy = add_last($nctools , entity('Tool',$toolname))
	}	
	$nctools = sort($nctools ,'tool.number')
	$outlst = $nctools
}

//StrLstの連結
function Join2SrtLst(string list lst ,string SepFront ,string SepRear ,output string out) {
	string s = ''
	foreach t in lst {
		$s = $s + $SepFront + $t + $SepRear
	}
	$out = $s
}

//ファイル書き出し
function WriteFile(string path ,string list lst) {
	string s = ''
	call Join2SrtLst(lst ,'' ,crlf ,$s)
	FILE OPEN $path FOR WRITE AS file
	FILE WRITE $s TO file
	FILE CLOSE file
}

//ツールパスを持っているNcデータリスト
function GetHasToolpathNcpro(entity list ncs ,output entity list outlst) {
	foreach nc in $ncs {
		IF number_nctoolpaths($nc) > 0 {
			int dmy = add_last($outlst , $nc)
		}
	}
	IF is_empty($outlst) {
		string msg = '選択されたNCプログラムにはツールパスがありません!'
		MESSAGE ERROR $msg
		MACRO ABORT 
	}	
}

//保存されているプロジェクト?
function HasProjectName() {
	string $proname = project_pathname(1)
	if length($proname) > 0 {
		return
	}
	
	string msg = '一度プロジェクトを保存してください!'
	MESSAGE ERROR $msg
	MACRO ABORT 
}

NCプログラムのコンテキストメニューから実行すると、こんな感じで
ブラウザ(PowerMillでは無い通常の)で表示されます。
f:id:kandennti:20180302190353p:plain
工具のイメージがエクスポート出来る機能があるなんて知りませんでした・・・。

使う人がいるとは思えないのですが、オリジナルと項目を変更しているので
f:id:kandennti:20180302190405p:plain
「シャンク径/首下」のシャンク径は、上の画像の赤矢印部分です。
 シャンクの1段目の上の径を出力してます。

「ホルダ径/突出」のホルダ径は、画像の青矢印部分です。
 ホルダの1段目の下の径を出力しています。


・・・CATIAはネタが無いなぁ。