オブジェクトの種類を調べる[TypeName関数]|CATIAマクロの作成方法
CATIAでマクロを作成していると「CATIAのこのオブジェクトってVBAではどうやって書くんだろ」と思うことがよくあります。(たとえば「形状セット」であれば「HybridBody」、「パーツボディー」であれば「Body」というように)
「HybridBody」や「Body」はオブジェクト型と呼ばれ「CAA V5 Visual Basic help」の「Infrastructure Automation Objects」ページから調べることができます。
しかしヘルプの使い方(見方)を知らないと見つけるまでに時間がかかってしましますし、マクロ初心者の方は「ほんとにこのオブジェクト型であってるのかな?」と不安に思うこともあると思います。
というわけで今回は、そんなオブジェクト型を簡単に調べることのできる「TypeName関数」について解説していきます。本ページで学べる内容は以下のとおりです。
TypeName関数の使い方
TypeName関数の具体的な使い方(サンプルコードあり)
TypeName関数の使い方
CATIAには非常に多くのオブジェクトが存在するため「このCATIAのオブジェクトはVBAでは何と書くんだろ?」とオブジェクト型(オブジェクトの種類)がわからない場面によく出くわします。
こういった場面に便利なのが「TypeName関数」です。TypeName関数は任意のオジェクト/変数のオブジェクト型を文字列(String型)で返すことのできる関数です。
TypeName関数を使うには以下のように書きます。
TypeName(オブジェクト、もしくは変数)
たとえばオブジェクト、もしくは変数の部分に「形状セット」の入った変数を入れれば「HybridBody」という文字列が返されます。
サンプルコード① 選択したオブジェクトのオブジェクト型を調べる
具体例としてTypeName関数を使ったサンプルコードを紹介します。
CATIA上でオブジェクトを1つ選択している状態で以下のコードを実行してみましょう。
現在、選択しているオブジェクトのオブジェクト型がメッセージボックスで表示されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Sub CATMain() Dim SEL As Selection Set SEL = CATIA.ActiveDocument.Selection If SEL.Count <> 1 Then MsgBox "1つのオブジェクトを選択して実行して下さい。" Exit Sub End If Dim SELItem As AnyObject Set SELItem = SEL.Item(1).Value MsgBox TypeName(SELItem) End Sub |
参考:「Selectionオブジェクト」
このコードはどのドキュメントにも対応(ENOVIA VPMは除く)しています。
そのためCATDrawingのテキストボックスやテーブル、CATProductのプロダクトなど様々なドキュメントのオブジェクト型を調べることができます。
また、エッジやフェースといったサブエレメント(内部要素)にも対応しています。たとえば同じエレメントでもエッジを選択した状態(画像左)とオブジェクト全体を選択した状態(画像右)では実行結果が以下のように変わります。
選択しているオブジェクトによっては意図しないオブジェクト型が返される場合もありますが、基本的にはここで調べたオブジェクト型を使用することで任意のオブジェクトをマクロで扱うことができるようになります。
要はマクロ開発の支援するための簡易的なマクロだと思ってもらえれば大丈夫です。
サンプルコード② アクティブドキュメントのチェック
もう1つ多くのマクロでよく使用されているサンプルコードを紹介します。
各ワークベンチでマクロを使う場合、「PartDocument」「ProductDocument」「DrawaingDocument」といったように各ドキュメントを定義する必要があります。多くの場合は以下のように「CATIA.ActiveDocument」を使って定義します。
1 2 3 4 5 6 |
Sub CATMain() Dim DOC As PartDocument Set DOC = CATIA.ActiveDocument 'アクティブドキュメントをCATPartとして定義 End Sub |
上記を実行した場合、アクティブドキュメントがCATPartであれば問題ありません。
しかし、アクティブドキュメントがドラフティング(CATDrawing)やアセンブリー(CATPuroduct)などのCATPartではない場合にはエラーが発生してしまいます。
これは変数宣言時に「PartDocument」と宣言しているのに、アクティブドキュメントがPartDocumentでないために発生してしまうタイプ不一致のエラーです。
このようなエラーを出したくない場合は以下のように条件分岐文を追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Sub CATMain() Dim DOC As PartDocument 'PartDocument(CATPart)として宣言 If TypeName(CATIA.ActiveDocument) <> "PartDocument" Then 'アクティブドキュメントがPartDocumentか確認 MsgBox "このマクロはPartDocument専用です。" _ & vbLf & _ "パートデザインもしくはGSDワークベンチで実行してください。" Exit Sub 'PartDocumentでない場合はマクロを終了 End If Set DOC = CATIA.ActiveDocument 'マクロ処理コード End Sub |
条件分岐の内容は「TypeName(CATIA.ActiveDocument) <> “PartDocument” Then」です。
これは言い換えれば「CATIA.ActiveDocumentのオブジェクト型がPartDocumentではない場合」
つまりは「アクティブドキュメントがCATPartでない場合」という条件を表しています。
後はこの条件分岐先に「Exit Sub」と書いておきマクロを終わらせることで、エラーを起こすことなく指定したドキュメント(上記の場合はCATPart)だけに有効なマクロにすることができます。
まとめ
今回は「TypeName関数」についての内容でした。
この関数はTypeName()と書いて、()の中にオブジェクト型を調べたいオブジェクト/変数を入れるだけで使うことのできる非常にシンプルな関数です。簡単な割には使用する機会がしばしばあるので、マクロを作成するのであればぜひ覚えてきましょう。
今回紹介した2つのサンプルコードはどちらもマクロ作成に非常に役立つコードです。
主にサンプル①はマクロを作成しながらオブジェクト型を調べる開発者用のコード、
サンプル②はマクロの完成度をより上げるために必要なコードのようなイメージです。
どちらのコードも本サイトで解説している内容を組み合わせれば理解できる内容になっているので、コード内容が理解できない方はいろいろなページをめぐり勉強してみて下さい。
参考:VBA開発元のMicrosoft社のTypeName関数の説明ページ
→TypeName 関数 (Visual Basic for Applications) | Microsoft Docs