C#ATIA

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

モデル再インポート機能

客先からデータが支給された、後に変更後のデータと差し替える
事になった場合、変更箇所を見付け出すためにこちらのマクロを
作りました。
二つのボディ/形状セットを比較して、差分を抽出する2 - C#ATIA

機能はしているのですが、やはり遅いです。(でも使ってます)

PowerMillには、取り込んだCADデータはファイル単位でツリーに
入りますが、コンテキストメニューの中に「モデル再インポート...」と言う
コマンドが有ります。
f:id:kandennti:20180510153343p:plain
元はレベル[General]だけの状態ですが、
f:id:kandennti:20180510153353p:plain
このコマンドで再インポートした際に変更箇所があった場合、
f:id:kandennti:20180510153400p:plain
PowerMillが "変更されているよ" と認識した部分だけが
[New components from ~] と言うセットに入った状態になります。
比較的処理も速いので、これを利用したら変更箇所を素早く
確認出来るのでは? と言う素人の安易な考えを実験してみました。

〇ファイル名の変更
形は単純に、四角のスケッチを作り押し出しました。
f:id:kandennti:20180510153418p:plain
これを [A_Part.CATPart] として保存します。

このファイルを修正しないで、そのまま
[B_Part.CATPart] として保存します。

続いてPowerMillに読み込みます。
まず [A_Part] を読み込み、続いて [B_Part] を再インポートします。
その結果は、
f:id:kandennti:20180510153435p:plain
正直に書くと、画像は使い回しです・・・。
ファイル名の違いは変更扱いにはならないです。

〇フューチャーを変える
[A_Part] のパッドを削除し、再度パッドします。
f:id:kandennti:20180510153448p:plain
ハイライトしていて見辛いのですが、名称が "パッド.1" から "パッド.2"
に変更されていますが、ジオメトリ的には変更はありません。
これを [C_Part.CATPart] として保存します。

続いてPowerMillに、[A_Part] → [C_Part] で再インポートします。
結果はこちら
f:id:kandennti:20180510153504p:plain
残念。"変更なし" として扱って欲しかったのですが、6面全てが
変更されたものとして判断されています。

〇形状を変える
[A_Part] のパッドの値を 20 → 30 に変更します。
f:id:kandennti:20180510153513p:plain
これを [D_Part.CATPart] として保存します。

続いてPowerMillに、[A_Part] → [D_Part] で再インポートします。
結果はこちら
f:id:kandennti:20180510153524p:plain
こちらは無事に変更されたと認識されましたが、6面全てです。
底面はジオメトリ的には変更無いのですが・・・。

〇形状を変更し、戻す
[A_Part] のパッドの値を 20 → 30 → 20 に変更し戻します。
これを [E_Part.CATPart] として保存します。

[A_Part] → [E_Part] で再インポートします。
どうせ画像は使いまわすので、もう言葉だけで。
結果は、6面全て変更となりました。


では、何を根拠に変更されたものと判断しているのでしょうか?
[A_Part] → [C_Part] ではジオメトリな変更は無いのですが、
変更されていると判断されているのは確かです。

ヒントはモデルのプロパティに有りました。
[A_Part] と [B_Part] のプロパティを見比べると、
f:id:kandennti:20180510153547p:plain
コンポーネント部分は面の名前だと思うのですが、順番こそ違いますが
一致しています。
このネーミングルールなのですが、CATIAのこんなマクロを作り
イミディエイトウィンドウに面の名前を書き出します。

'VBA using-'KCL0.0.12'
'指定Bodyから面を検索し名前をプリント  by Kantoku

Sub CATMain()
    Dim Doc As Document
    Set Doc = CATIA.ActiveDocument
    
    Dim msg As String
    msg = "Bodyを選択 : ESCキー 終了"
    
    Dim Bd As Body
    Set Bd = SelectItem(msg, Array("Body"))
    If IsNothing(Bd) Then Exit Sub
    
    Dim Sel As Selection
    Set Sel = Doc.Selection
    Sel.Add Bd
    Sel.Search "Topology.CGMFace,sel"
    
    Dim i As Long
    For i = 1 To Sel.Count2
        Debug.Print Sel.Item(i).value.Name
    Next
End Sub

[A_Part] で実行すると

Selection_RSur:(Face:(Brp:(Pad.1;2);None:();Cf11:());Pad.1_ResultOUT;Z0;G6258)
Selection_RSur:(Face:(Brp:(Pad.1;1);None:();Cf11:());Pad.1_ResultOUT;Z0;G6258)
Selection_RSur:(Face:(Brp:(Pad.1;0:(Brp:(Sketch.1;4)));None:();Cf11:());Pad.1_ResultOUT;Z0;G6258)
Selection_RSur:(Face:(Brp:(Pad.1;0:(Brp:(Sketch.1;3)));None:();Cf11:());Pad.1_ResultOUT;Z0;G6258)
Selection_RSur:(Face:(Brp:(Pad.1;0:(Brp:(Sketch.1;2)));None:();Cf11:());Pad.1_ResultOUT;Z0;G6258)
Selection_RSur:(Face:(Brp:(Pad.1;0:(Brp:(Sketch.1;1)));None:();Cf11:());Pad.1_ResultOUT;Z0;G6258)

" Pad.1 " は直感的に InternalName だろうとは感じますが、その後ろの
" _c453 " 等は、このマクロではわかりませんね。 何となく数値は
Factoryオブジェクトが作り出したフューチャー内全ての要素に割り当てられた、
通し番号のようなものの気はするのですが、確認する方法がわかりません。
(その番号が、ハッシュコードのような役割とか・・・)

[A_Part] と [C_Part] が変更されたと判断されるのは、InternalName が変わり
PowerMill内の面の名前が変わってしまうためだろうと思います。
(その他のテストも、そんな感じだろうと)
つまり、モデル再インポートでの変更判断は
形状で判断されずに、取り込まれた際の面の名前だけで判断されている
と思っていて良さそうです。最初の安易な考えは、無駄でした。

結論が出ているのですが、CATIA限定ではあまりにニッチな内容過ぎるので。

[A_Part] → [A_Igs]
[C_Part] → [C_Igs] (ジオメトリは同じ。CATPartでは変更と判断)
[D_Part] → [D_Igs] (ジオメトリが異なる。CATPartでは変更と判断)
とIgesでエクスポートし、同様に再インポートしてみます。

〇[A_Igs] → [C_Igs]
これはCATPartの時と異なり、変更無しと判断されます。

〇[A_Igs] → [D_Igs]
これもCATPartの時と異なり、変更無しと判断されます。
変更されていて欲しかったのですが・・・。

こちらも面の名前原因です。
f:id:kandennti:20180510153615p:plain
" ig " は恐らくIgesから来るのだろうと思います。
後ろの数値は、Igesのフォーマットの関係でしょう。
こちらのサイトがわかりやすいのですが
AFsoft WebSite (AFsoft.JP)
パラメータデータセクション部の説明にチラッと記載されている
ディレクトリエントリへの索引番号なのだろうと思います。
[A_Igs] → [D_Igs] で変更無しと判断されたのは
エンティティ数が変更無かった為、索引番号が変わらなかった
事が原因でしょう。きっと。

Igesの場合は面の名前を記載する部分が、ディレクトリエントリセクションに
あるのですが、書き出すCADと書き出さないCADがあるので
索引番号を利用したのだろうと思います。
(CATIAは書き出さない、Fusion360は書き出します)

CADデータのフォーマットが異なれば、面の名前が変わりますし
同じフォーマットでもCADによって書き出す順番が変わり、
インポート時の名前が変わってしまうため、形状的な変更の有無は
この機能では判断出来ないとわかりました。
(手元にある他フォーマットでは Step-st~ , Parasolid-@~ , Creo-rf_~)


今年一番長く書いたけど、当初の目論見は甘かった・・・。