先日作成した "ProductTreeをXMLフォーマットでエクスポートする" マクロの
ベースとなった、BodyのTreeをエクスポートするマクロをついでに公開しておきます。
(過去に "Unofficial CATIA User Forum" Upした事のある物です)
そこそこボリュームが大きい為、下記のサイトにモジュール等をUpしておきます。
CATIA V5 GetBodyTree Macro - Other - 3D CAD model - GrabCAD
全てのモジュール類を同一プロジェクトにインポートしてください。
マクロの使用方法は、実行後Bodyを選択しエクスポートするフォーマットを指定
してもらえれば、Partファイルと同一フォルダ内にファイルが作成されます。
ファイル名は "Partファイル名 + 指定したBody名 . 選択されたタイプの拡張子"
となります。
以前公開したものと、内部的に少しだけ変更しています。
選択されたBody以下のTreeをエクスポートするのですが、Bodyから
PartDocumentを取得する際、このようなコードで書いていました。
'VBA '指定先取得 Set oPartDoc = oBody.Parent.Parent.Parent
これでも間違いではないですし、実際に動いていました。
でも、あまり美しくないですし、このようなソースではC#の場合、
エラーとなりビルド出来ません。
(Parentプロパティに入っているオブジェクトにParentプロパティが存在している
保障がない為です、恐らく)
そこで、次の関数を用意しました。
'VBA 'PartDocumentの取得 Private Function GetPartDocument(OJ As AnyObject) As PartDocument Select Case TypeName(OJ) Case "PartDocument" Set GetPartDocument = OJ Case "Application" Set GetPartDocument = Nothing Case Else Set GetPartDocument = GetPartDocument(OJ.Parent) End Select End Function
引数でAnyObject型を受け取り、"PartDocument"になるまでParentプロパティ
を再帰でさかのぼります。 但し、出口が存在していない場合、無限ループ
となってしまうため、"Application"になった場合、処理を抜けるように
しています。
(恐らくApplicationオブジェクトのParentプロパティは、自身のApplicationオブジェクト
になっているのだろうかと思います)
先程のPartDocumentを取得する部分を、こんな感じに変更しました。
'VBA '指定先取得 Set oPartDoc = GetPartDocument(oBody)
このネタは、こちらにも同様の内容が記載されています。
How to get the Part object from virtually any object within it | CATIA V5 Automation
内容的には、任意のオブジェクトからPartオブジェクトの取得ですが、同じような
ものです。
こちらでは"自身のオブジェクトの型名"と"Parentプロパティのオブジェクトの型名"が
一致したら処理を抜けるような、再帰になっています。
恐らく"自身のオブジェクトの型名"と"Parentプロパティのオブジェクトの型名"が一致
するのは、Applicationオブジェクトだけなのだろうと思います。