C#ATIA

↑タイトル詐欺 主にCATIA V5 の VBA

BodyのTreeを各種フォーマットでエクスポートする

先日作成した "ProductTreeをXMLフォーマットでエクスポートする" マクロの
ベースとなった、BodyのTreeをエクスポートするマクロをついでに公開しておきます。
(過去に "Unofficial CATIA User Forum" Upした事のある物です)
f:id:kandennti:20150831162724p:plain
そこそこボリュームが大きい為、下記のサイトにモジュール等をUpしておきます。
CATIA V5 GetBodyTree Macro - Other - 3D CAD model - GrabCAD
全てのモジュール類を同一プロジェクトにインポートしてください。
f:id:kandennti:20150831162733p:plain
マクロの使用方法は、実行後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オブジェクトだけなのだろうと思います。