C#ATIA

↑タイトル詐欺 主にFusion360API 偶にCATIA V5 VBA(絶賛ネタ切れ中)

未計算ツールパスをまとめてバッチ処理する

何となく方向性が定まらないのですが、これは使って行きそうなので
公開しておきます。

こちらの自作プルダウンリストのライブラリを利用し、選択された未計算ツールパスを
バッチ処理させるマクロです。 その為こちらが必要です。
"group" フォルダは犠牲にした、プルダウンリストライブラリ - C#ATIA

//pm2017 macro
//ツールパスバッチ ver0.0.2
//using downmenu.inc

function main() {
	//未計算ツールパス取得
	string filter = 'Computed == 0 and Batch == 1'
	string list paths =  extract(filter(folder('toolpath'), filter), 'name') 
	if is_empty(paths)  {
		message wran  '未計算ツールパスが見つかりませんでした'
		macro abort
	}		
	//ユーザー選択
	string msg = '計算するツールパスを選択してください'
	call Exec_DownMenu($paths, $msg, 1, $paths) 
	
	//バッチタイプ選択
	bool cal_type = 0
	$cal_type = QUERY 'バックグランド処理で行いますか?'

	//バッチ処理
	call Msgoff()
	call Sw_Start()
	foreach path in $paths {
		if $cal_type {
			TOOLPATH $path QUEUE
		} else {
			ACTIVATE TOOLPATH  $path
			TOOLPATH $path CALCULATE
		}
	}
	call Msgon()
	call Sw_GetTime()
	//終了
	message info  'Done'	
}

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

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

function Sw_Start() {
	CLOCK RESET QUIT
	CLOCK ON QUIT	
}

function Sw_GetTime() {
	CLOCK OFF QUIT
	CLOCK PRINT QUIT
}

include downmenu.inc

開発時に利用したかった為、実行時間をコマンドエコーに表示させていますが
特に悪さをするわけでない為、そのままにしておきます。

実際に実行した感じはこちらです。

動画時間の都合上、1個づつしか試していませんが、
実際は複数選択可能です。

バックグランド処理が遅いので、選択してしては無かったのですが
利用したいときも有ったので選択可能にしてみました。



あぁそうだ、このマクロとは無関係なお話です。
何時も、AutodeskさんのScreencastを利用して動画を作っている
のですが、Screencastはアクティブなソフトのみをキャプチャしてくれます。
操作性が落ちるのですが、出来るだけウィンドウを小さくして
記録した方が、何の操作を行っているのか? が、わかりやすいため
そのようにしています。(他の方もそうして欲しい・・・)

実は、以前YoutubeでCATIAのTips動画を100本ぐらいUpしていた方が
そのようにしており、非常に見やすかったのでそのように
心掛けています。(それらの動画はもう無いです)

選択した円弧の長さを表示2

こちらの続きです。
選択した円弧の長さを表示1 - C#ATIA

もう一つ方法があり、パラメータと式を利用した方法です。

'vba  test_Circle_Length_Formula
'using-'KCL0.0.10'
'円弧の長さを表示-式利用

Option Explicit

Sub CATMain()
    'ドキュメントのチェック
    If Not CanExecute("PartDocument") Then Exit Sub
    
    '選択
    Dim msg$: msg = "円弧を選択して下さい : ESCキー 終了"
    Dim Elem As SelectedElement
    Dim Pt As Part
    Dim Ref As Reference
    Do
        Set Elem = KCL.SelectElement(msg, "HybridShape")
        If KCL.IsNothing(Elem) Then Exit Do
        Set Pt = Elem.Document.Part
        Set Ref = Elem.Reference
        If IsCircle(Ref, Pt.HybridShapeFactory) Then
            MsgBox "円弧長さは" & GetLength_Formula(Ref, Pt) & "mmです"
        Else
            MsgBox "円弧を選択してください"
        End If
    Loop
End Sub

Private Function GetLength_Formula#(ByVal Ref As Reference, ByVal Pt As Part)
    'パラメータ作成
    Dim length As length
    Set length = Pt.Parameters.CreateDimension("", "LENGTH", 0#)

    '式を作成する為の名前を取得
    Dim CorrectName$: CorrectName = Pt.Parameters.GetNameToUseInRelation(Ref)
    
    '式作成
    Dim formula As formula
    Set formula = Pt.Relations.CreateFormula("AutomaticNaming", "", length, "length(" & CorrectName & " ) ")
    
    '長さ取得
    GetLength_Formula = length.Value
    
    '要らない物削除
    Dim Sel As Selection
    Set Sel = Pt.Parent.Selection
    With Sel
        .Clear
        .Add formula
        .Add length
        .Delete
    End With
End Function

'円弧の判断
Private Function IsCircle(ByVal Ref As Reference, ByVal Fact As HybridShapeFactory) As Boolean
    Dim GeoType&: GeoType = Fact.GetGeometricalFeatureType(Ref)
    'AutomationManualの記述が間違えやすいが、
    '4-Circle になる
    IsCircle = IIf(GeoType = 4, True, False)
End Function

こちらは、一時的に長さのパラメータと式を作成。 値を取得後、パラメータと式を削除しており、
使い勝手としては悪い上、恐らく遅いです。

このサンプルをUpしたのは、これ自体が目的ではないんです。
僕にしてはコメント多めに入れた "GetLength_Formula" 関数をご覧下さい。

手動で式を作る際には、こんな感じになります。
f:id:kandennti:20170412181108p:plain
実は赤印部分が問題なんです。
オブジェクトの名前やリファレンスのディスプレイネームでは "円.1" としか取得出来ませんが、
式として(上記画像の場合)必要なのは、"`形状セット.1\円.1`" なんです。
しかも前後に記載されているシングルクォーテーションの有無は、オプションの設定で
変更が可能な為、非常にややこしいのが本音です。

その為に、式に必要な名称を取得する関数が用意されています。

    '式を作成する為の名前を取得
    Dim CorrectName$: CorrectName = Pt.Parameters.GetNameToUseInRelation(Ref)

実はかなり以前に、こちらで知ったんですが・・・
Developing proper names to use in product relations | CATIA V5 Automation
今回は式に利用していますが、"どこの形状セット等に所属している要素か?"
と言う利用方法もあるかと思います。


又、こちらは式を作成している部分です。

    '式作成
    Dim formula As formula
    Set formula = Pt.Relations.CreateFormula("AutomaticNaming", "", length, "length(" & CorrectName & " ) ")

式を作成する際、第一引数に必ず式の名前を文字列として渡す必要があります。
試したところ、重複した名前でもエラーにはならないようですが、後々の作業で
同じ式が存在したままだと混乱するかも知れません。
この様な場合 "AutomaticNaming" を第一引数にすることで、CATIA自身が自動的な
名前を付けるようになっているようです。
・・・と書いたのですが、長さ0の文字列を渡しても同じでした。

CATIAのマクロで、インスタンスを作成する際に名前を引数で渡さなければならないものが
幾つかあるようなのですが、恐らくそのような場合に利用できるかと思います。

説明していませんが、こちらのサンプルでもDrawのディテールシートを新規に作成する際
"AutomaticNaming" を利用しています。
指定した2D要素を、指定した原点位置でコピペする - C#ATIA

選択した円弧の長さを表示1

ちょっと相談?を頂いたので、久々にCATIAのマクロを書いてみました。

選択した3D円弧の長さを表示するだけのものです。
極端な話、こちらの物を流用しただけです。
線を選択しつつ、合計長さを表示する - C#ATIA

'vba  test_Circle_Length
'using-'KCL0.0.10'
'円弧の長さを表示

Option Explicit

Sub CATMain()
    'ドキュメントのチェック
    If Not CanExecute("PartDocument") Then Exit Sub
    
    '選択
    Dim msg$: msg = "円弧を選択して下さい : ESCキー 終了"
    Dim Elem As SelectedElement
    Dim Pt As Part
    Dim Ref As Reference
    Do
        Set Elem = KCL.SelectElement(msg, "HybridShape")
        If KCL.IsNothing(Elem) Then Exit Do
        Set Pt = Elem.Document.Part
        Set Ref = Elem.Reference
        If IsCircle(Ref, Pt.HybridShapeFactory) Then
            MsgBox "円弧長さは" & GetLength(Ref, Pt) & "mmです"
        Else
            MsgBox "円弧を選択してください"
        End If
    Loop
End Sub

'長さの取得
Private Function GetLength#(ByVal Ref As Reference, ByVal Pt As Part)
    GetLength = Pt.Parent.GetWorkbench("SPAWorkbench").GetMeasurable(Ref).Length
End Function

'円弧の判断
Private Function IsCircle(ByVal Ref As Reference, ByVal Fact As HybridShapeFactory) As Boolean
    Dim GeoType&: GeoType = Fact.GetGeometricalFeatureType(Ref)
    'AutomationManualの記述が間違えやすいが、
    '4-Circle になる
    IsCircle = IIf(GeoType = 4, True, False)
End Function

イロイロな事を忘れかけていました。

SelectElement2を利用する際のフィルターなのですが、今回や流用元では
"HybridShape" を利用しているのですが、選択する為の自由度と言いますか
柔軟性は "Edge" の方が良いのです。

が、その先の処理が思うように出来なかった為(リファレンスのタイプが異なる)
前回も "HybridShape" にしたんじゃないのかな? と薄っすらな記憶・・・。
CreateReferenceFromBRepNameが上手く取得出来れば、Edge" を利用したかった
のですが。

OBJファイルからサーフェス化を挑んでみました

存在は知っていたのですが、やったことが無かった為 Autodesk社の
ReMakeとFusion360を利用し、OBJファイルからサーフェス化を試してみました。

※ちょっと探した際、これらの手順が記載されたサイトが見当たらなかった為
 書きました。 他サイトに手順が書かれていた際は、間違いなくそちらが正しいです。


折角なので、それなりに手ごたえありそうなデータとしてスミソニアン博物館
から、お借りしました。

Smithsonian X 3D
(DLは要登録です)

サイトの3DViewerはAutodeskさんなんですね。手広いですな。

加工までやってみようかなぁと思い、加工しやすそうな鯨の化石を落としたの
ですがデータが大きすぎて断念。蟹さん(19MB)にしていました。


続いてReMakeの入手はこちら

Autodesk ReMake

有償・無償・学生のライセンスと15日間トライアルがあるようなのですが、
全てインストールまでは同一のファイルで行い、起動時にゴニョゴニョするようです。
(現在、英語版しかないようです)

ソフトを起動後、こんな感じのダイアログ?が表示されますが、恐らく右上の
×を押してしまえば、きっと無料版として使えるのだろうと解釈しました。
(間違っていたら教えていただけると、助かります)
f:id:kandennti:20170406190305p:plain
毎回手間なのであれば、右下にチェック入れれば良いのだろうと思います。

取り込み後はこんな感じです。
f:id:kandennti:20170406190316p:plain
スミソニアンなViewerは時間がかかりましたが、こちらはそんなに時間は
かからないです。

個人的にですが、いつもAutodeskさんのソフトはスピンとムーブは良いのですが、
ズームがやりにくい(よくわからない)と思っていたのですが、僕がCATIAの為に
3ボタンマウスを使っている事が原因なんですね。
(スクロールマウスなら直感的な操作だろうと思います)

このままエクスポートしようかとも思ったのですが、面の数を確認すると
f:id:kandennti:20170406190333p:plain
ちょっと多すぎる気がしたので、間引きまくりました。
f:id:kandennti:20170406190341p:plain
結構、形が崩れたのですが、まぁ仕方ないです。

続いて、エクスポートです。
f:id:kandennti:20170406190350p:plain
Fusion360で、ポリゴンからTスプライン化させるためには四角ポリゴンである
必要があるため、"Fusion360-OBJ(Quads)" を選択します。
f:id:kandennti:20170406190401p:plain
これ、エクスポートに非常に時間がかかりました。恐らく四角ポリゴン化させる為に
時間がかかるのだろうと思います。

そもそも、四角ポリゴンの規格を誰が考えたんだよ!って思ってました。
三角ポリゴンであれば、3点が(トレランス以内で)直線上に並ばない限り、一意の
平面が確定するのに、4点だと同一平面状に存在する保証が無い為
ものすごく迷惑だなぁ と思っていましたが、四角ポリゴンの恩恵を
初めて感じました。(でも、迷惑だと思ってます)


続いて、Fusion360です。
四角なOBJファイルをインポートする為、メッシュ作業スペースに入ります。
(基本設定のプレビューの[メッシュ]作業スペースに、チェックを入れる必要が有りそうです)
"メッシュを挿入" でOBJファイルを選択します。

f:id:kandennti:20170406190457p:plain

正直、クラウドを経由しないようなので、CADデータを開くより桁違いに速いです。

f:id:kandennti:20170406190507p:plain

おぉ 本当にメッシュが四角いですよ。
ここで初めて気がついたのですが、ReMakeで一生懸命間引きまくりましたが、
四角ポリゴンの精度(と言いますか、面の数)は(四角なOBJファイルに限り)エクスポート
の際のクオリティの依存が大きいのではないかな?と思いました。
(未確認です・・・面倒)

f:id:kandennti:20170406190532p:plain


作業スペースを "モデル" - "スカルプト" に移動(又は、"モデル" ノンパラモード)して、変換コマンド
f:id:kandennti:20170406190542p:plain
"クワッドメッシュからTスプライン" に切り替え、先程インポートした四角ボリゴンを選択。
f:id:kandennti:20170406190548p:plain

少し時間がかかりますが、無事Tスプラインなボディになりました。
f:id:kandennti:20170406190555p:plain
(実は最初は一度ここで失敗しました。 必ず変換可能なわけでは無いようです)


これではまだサーフェス(ソリッド)化できていない為、再度変換で "TスプラインからBREP"
を行います。
f:id:kandennti:20170406190606p:plain

ここも少し時間がかかります・・・しかも、待った末
f:id:kandennti:20170406190613p:plain

う~ん、これだけ面がうねった状態で出来るのかなぁ? とは思っていましたが。

念の為、よくわからないのですがスカルプト作業スペースの "ボディを修復" コマンドの
自動修復を行ってみましたが
f:id:kandennti:20170406190622p:plain
恐らく星印の部分が問題有りなのでしょう。(見た目にも非常に痛々しい…)

僕には早過ぎる技術

と、言う結論に至りました。(工業的なデータならいけるかも)
四角いポリゴンがもっと細かければ、何とか成るかも とも感じるので
ReMakeのクオリティをもっと高くすれば良いのかもしれません。(未確認です)

又、全体を一度に処理しないで、こちらのObaraさんの手法を使っていくと
ひょっとしたらたどり着けるのかも知れません。
Fusion360 スカルプ機能を使ったスキャン等stlデータに対しての面作成 : Home3Ddo

そういえば、もう何年も蟹を食べてないなぁ。

ユーザーサイドのCATIA 関連サイト4

ネタ切れ以上に、何もかもにヤル気が湧かない・・・。

こちらの続きのつもりです。
ユーザーサイドのCATIA 関連サイト3 - C#ATIA



○scripts4all
Catia, Excel (& other) Tools
要登録のようですが、3つ程ツールが有りました。
試してはいませんが "TxtOnCurve" は過去に僕がC#で作ろうかな?
と思っていたものとほぼ同等なもののようです。


〇CATIA V5
CATIA V5
CATIA関連のブログでは、死んでいるものは多々あるのですが、
更新が続いているブログです。
ちょっとしたTipsが記載されておりますが、それ程知らなかった
操作は有りませんでした。
英語なんですが、URLが ".jp" です。 何故?

円筒的矢視図を作りたい

久々にCATIAネタです。
少し前に業務で行った、円筒形部品の図面を描く際の悩みです。
タイトルでは "円筒的矢視図" と書きましたが、正しい名称すらよくわかって
おりません。(展開図と表記すると望んでいない答えが返ってくるもので)


本来円筒形部品のお話ですが、簡略化する為、真っ二つにした状態で
進めます。

こんな感じの部品の図面化をしたいのですが、
f:id:kandennti:20170328191210p:plain

手抜きですが、こんな図面ならそれ程苦にはならないです。
f:id:kandennti:20170328191215p:plain

実際に欲しいのは、外側の形状だけで構わないので、こんな感じの
図面なんです。(テキトーに描いてます)
f:id:kandennti:20170328191224p:plain
Y軸は単位が長さで、X軸の単位は角度で欲しいんです。
(逆でも構いませんが・・・)


高価なライセンスが無いのですが、こちらの手法を利用すれば
ゴールまでたどり着けそうなものが、ひょっとしたらあるのかな?
とは、薄々感じています。
ライセンスの無いコマンドを使用する - C#ATIA

とりあえず面倒なのですが、展開コマンドを主要な面に対して2回
行った結果がこちら。
f:id:kandennti:20170328191245p:plain
プレスの展開図を作成するには良いのですが、ちょっと望んでいる
結果にはなりません。

続いて、シェイプモーフィングコマンド。 正直、このコマンドの使い方が
イマイチわかっていないのですが、ターゲットとなる緑のラインを2本作成し
赤のエッジを基準にさせてみました。
f:id:kandennti:20170328191250p:plain

結果がこちら。
f:id:kandennti:20170328191255p:plain
一見良さそうに見えたのですが、やっぱり望んでいるものとは
ちょっと違うんです。

緑のラインの長さが違うからかな? と思い水色のターゲットを作成
しましたが、やっぱり望んだものとは異なります。
f:id:kandennti:20170328191301p:plain


イメージとしては、形状より外側にガイドになる円弧を描き、
ガイド上から中心軸に向かってカメラ(黄色矢印)を設置し、グルッと
ガイド上を走査する(緑色矢印)ような状態で欲しいんです。
f:id:kandennti:20170328191308p:plain

そこで、ガイドになる円弧を押し出し、この押し出し面に対し
エッジをチマチマ投影(まとめて行うとおかしくなる)。
この投影されたラインを平面に展開できれば良いのですが、
その為のコマンドが存在するものかどうかが、わからないんです。
f:id:kandennti:20170328191314p:plain
これの逆、平面にデザインしたラインを曲面に配置するディベロップコマンドの
存在は知っているのですが、このコマンドでは逆は出来ないんです。

ワイヤーで処理するのを諦め、さっきの投影したラインからスイープで
ガイド面(薄いピンク)に直角な面(紫)を作成し、ラップサーフェスコマンドで
作ったものが水色の面。
f:id:kandennti:20170328191320p:plain

これを平面的に見ると、かなり望んでいるものになります。
f:id:kandennti:20170328191328p:plain
惜しいのは、Φ10の閉じた円弧が楕円になってしまうのですが、
まぁこれぐらいなら2D側で修正しても良いかな?とは感じてます。
(恐らく投影時の処理が望んでいない状態を生み出している)


この方法でも結構手間な上、曲線は正しくないものが出来そうな
予感はしています。(手間な部分はマクロ化してしまっても良いのですが)

この話は、サポートにも相談したのですが上手く伝わらなかったのか、
やっぱりシートメタル的な展開図の機能を紹介されてしまいます。

CATIAに限らず、この様な機能を持っているソフト等をご存知の方が
いらっしゃいましたら、教えて頂けると助かります。

・最終的に欲しいのは2Dなので、サーフェス等では無くても構いません
・CATIAに拘りません
・全てを一発で処理する必要は無く、部分的なマクロでも十分です

平面的な座標軸の片側が長さで、もう片方が角度で表現出来ていれば
良いので、円筒座標系があれば良いのですが、CATIAには直交座標系
しか無さそうです。

そんなに難しい事でも無さそうなのですが、CATIAのマクロでは
3Dラインから得られる情報がほぼ無い為、お手上げです。
Fusion360のスプリクトでは3Dラインから情報はかなり得られるのですが、
そこまで作り上げる能力が僕には無い為、こちらもお手上げです。

結構需要があるんじゃないかな?

工具コンテキストメニューから工具変更

計算済みツールパスの工具を変更したい時があります。 かなり、頻繁に・・・。
手動で行うと結構手間で、正直モチベーションが落ちまくります。
手順はこんな感じです。
・任意のツールパスをアクティブ
・変更したい工具をアクティブ
・ツールパスのコンテキストメニューで '工具変更' (しかもメニュー位置が深い・・・)

実際の操作はこんな感じです。


これを楽しようと思いマクロを作成したのですが、PowerMillのマクロの
呼び出し方が複数有り、今回は操作的に直感的なので工具のコンテキストメニューを
利用しての呼び出しにしました。
この呼び出し方法、実は知りませんでした。(Helpには記載されています)
こちらが非常に参考になりました。
Solved: Create macro to pick folder and activate it - Autodesk Community


前回のプルダウンリストを利用して、複数のツールパスに対して工具変更が出来るように
しています。(但し、スクエア・ボール・ラジアス・テーパーボールエンドミルのみです。)

マクロ本体です。

//PMill_Macro
//ReplaceTool.mac
//Treeの指定した工具のコンテキストメニューから工具交換

function main(string toolname) {
	//選択工具
	entity act = entity('tool', $toolname)
	
	//交換可能リスト
	string list paths = {}
	call Get_PathList($act, $paths) 
	if is_empty($paths) {
		message error  '交換可能なツールパスがありません!!'
		return
	}
	
	//ユーザー確認
	string msg = '[' + $act.name + ']' + 'に工具交換するツールパスを選択してください'
	call Exec_DownMenu($paths, $msg, 1, $paths)
	
	//工具交換
	call Set_ActTool($act, $paths)
	
	//終了
	message info  'Done'
}

//工具交換
function Set_ActTool(entity ActTool, string list Lst) {
	call Exec_Cmd('ACTIVATE TOOL "' + $ActTool.name + '"')
	foreach path in $Lst {
		call Exec_Cmd('EDIT TOOLPATH "' + $path + '" REPLACE_TOOL ;')
	}	
}

//交換可能リスト取得
function Get_PathList(entity ActTool, output string list OutLst) {
	string list lst = {}
	bool geoeql = 0
	foreach path in folder('toolpath') {
		call ToolNose_Equal($path.tool, $ActTool, $geoeql)
		if $geoeql {
			int dmy = add_last($lst, $path.name)
		}
	}
	$OutLst = $lst
}

//工具先端一致判断
function ToolNose_Equal(entity T1, entity T2, output bool OutBool) {
	$OutBool = 0
	string T1_type = $T1.type
	string T2_type = $T2.type
	
	if $T1_type != $T2_type {
		return
	}
	
	if $T1.Diameter != $T2.Diameter {
		return
	}
	
	Switch T1_type {
		case 'end_mill'
			$OutBool = 1
			return
			break
		case 'ball_nosed'
			$OutBool = 1
			return
			break
		case 'tip_radiused'
			if $T1.TipRadius == $T2.TipRadius {
				$OutBool = 1
			}
			return
			break				
		case 'taper_spherical'
			if $T1.TipRadius == $T2.TipRadius and $T1.TaperAngle == $T2.TaperAngle {
				$OutBool = 1
			}
			return
			break				
	}
}

//コマンド
function Exec_Cmd(string cmd) {
	docommand $cmd
}

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

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

include downmenu.inc

最後のインクルードは、前回のプルダウンリストのライブラリです。

続いて、工具のコンテキストメニューに追加する為の "tool.XML" です。
既に他で利用されている場合は、buttonタグ部分を追記すればOKです。
又、今まで利用していない場合は、環境変数の追加や指定されたフォルダを
作成する必要があるため、Helpを参考にすると良いかと思います。
(上記のマクロは同一フォルダ内に配置しておく必要が有ります)

<?xml version="1.0"  encoding="utf-8" ?>

<menupage>

<button label="工具変更"
command='MACRO ReplaceTool.mac "%s"'
/>

</menupage>


実際に利用した感じはこちら。

桁違いに楽。