客先からデータが支給された、後に変更後のデータと差し替える
事になった場合、変更箇所を見付け出すためにこちらのマクロを
作りました。
二つのボディ/形状セットを比較して、差分を抽出する2 - C#ATIA
機能はしているのですが、やはり遅いです。(でも使ってます)
PowerMillには、取り込んだCADデータはファイル単位でツリーに
入りますが、コンテキストメニューの中に「モデル再インポート...」と言う
コマンドが有ります。
元はレベル[General]だけの状態ですが、
このコマンドで再インポートした際に変更箇所があった場合、
PowerMillが "変更されているよ" と認識した部分だけが
[New components from ~] と言うセットに入った状態になります。
比較的処理も速いので、これを利用したら変更箇所を素早く
確認出来るのでは? と言う素人の安易な考えを実験してみました。
〇ファイル名の変更
形は単純に、四角のスケッチを作り押し出しました。
これを [A_Part.CATPart] として保存します。
このファイルを修正しないで、そのまま
[B_Part.CATPart] として保存します。
続いてPowerMillに読み込みます。
まず [A_Part] を読み込み、続いて [B_Part] を再インポートします。
その結果は、
正直に書くと、画像は使い回しです・・・。
ファイル名の違いは変更扱いにはならないです。
〇フューチャーを変える
[A_Part] のパッドを削除し、再度パッドします。
ハイライトしていて見辛いのですが、名称が "パッド.1" から "パッド.2"
に変更されていますが、ジオメトリ的には変更はありません。
これを [C_Part.CATPart] として保存します。
続いてPowerMillに、[A_Part] → [C_Part] で再インポートします。
結果はこちら
残念。"変更なし" として扱って欲しかったのですが、6面全てが
変更されたものとして判断されています。
〇形状を変える
[A_Part] のパッドの値を 20 → 30 に変更します。
これを [D_Part.CATPart] として保存します。
続いてPowerMillに、[A_Part] → [D_Part] で再インポートします。
結果はこちら
こちらは無事に変更されたと認識されましたが、6面全てです。
底面はジオメトリ的には変更無いのですが・・・。
〇形状を変更し、戻す
[A_Part] のパッドの値を 20 → 30 → 20 に変更し戻します。
これを [E_Part.CATPart] として保存します。
[A_Part] → [E_Part] で再インポートします。
どうせ画像は使いまわすので、もう言葉だけで。
結果は、6面全て変更となりました。
では、何を根拠に変更されたものと判断しているのでしょうか?
[A_Part] → [C_Part] ではジオメトリな変更は無いのですが、
変更されていると判断されているのは確かです。
ヒントはモデルのプロパティに有りました。
[A_Part] と [B_Part] のプロパティを見比べると、
コンポーネント部分は面の名前だと思うのですが、順番こそ違いますが
一致しています。
このネーミングルールなのですが、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の時と異なり、変更無しと判断されます。
変更されていて欲しかったのですが・・・。
こちらも面の名前原因です。
" ig " は恐らくIgesから来るのだろうと思います。
後ろの数値は、Igesのフォーマットの関係でしょう。
こちらのサイトがわかりやすいのですが
AFsoft WebSite (AFsoft.JP)
パラメータデータセクション部の説明にチラッと記載されている
ディレクトリエントリへの索引番号なのだろうと思います。
[A_Igs] → [D_Igs] で変更無しと判断されたのは
エンティティ数が変更無かった為、索引番号が変わらなかった
事が原因でしょう。きっと。
Igesの場合は面の名前を記載する部分が、ディレクトリエントリセクションに
あるのですが、書き出すCADと書き出さないCADがあるので
索引番号を利用したのだろうと思います。
(CATIAは書き出さない、Fusion360は書き出します)
CADデータのフォーマットが異なれば、面の名前が変わりますし
同じフォーマットでもCADによって書き出す順番が変わり、
インポート時の名前が変わってしまうため、形状的な変更の有無は
この機能では判断出来ないとわかりました。
(手元にある他フォーマットでは Step-st~ , Parasolid-@~ , Creo-rf_~)
今年一番長く書いたけど、当初の目論見は甘かった・・・。