VBAでオブジェクトを取得1|CATIAマクロの作成方法
マクロの中には新規でオブジェクトを作成する以外にも、既存のオブジェクトに対して何らかの操作をするものがあります。(むしろそっちの場合の方が多いかもしれません)
このとき、その既存のオブジェクトをVBAのコードで表す必要があります。
既存のオブジェクトをコードで表すには、仕様ツリーと『Infrastructure Automation Objects』に表記されているオブジェクトツリーの構成の関係を理解する必要があります。
少し複雑で難しい内容ですが、CATIAでマクロを作成する上で非常に重要なポイントなのでしっかりと押さえておきましょう。
今回学べる内容は以下のとおりです。
VBAでオブジェクトを取得する方法
※『Infrastructure Automation Objects』が何を意味しているのか分からない人は、まず『オブジェクトとコレクション/プロパティとメソッドとは 』を先に読むことをオススメします。
既存のオブジェクトを取得する
ここでは以下の画像のような場合の「形状セット.1」を取得する(VBAコードで表す)方法を見ていきます。
オブジェクトの親を調べる
まずはじめに、『Infrastructure Automation Objects』の中からコードで表したいオブジェクトを探し出します。
今回、コードで表したいオブジェクトは「形状セット」なので上記のツリー構成の中から「HybridBody」を探します。
形状セットはVBAでは『HybridBody』と表されます。
またHybridBodyにはHybridBodiesコレクションが用意されています。
非常によく使うので両方とも覚えておきましょう。
その他のオブジェクトは基本的に英語なのでなんとなく理解できると思います。
ちなみに形状セットは英語では『Geometrical Set』といいます。
形状セットの場合、使用するドキュメントは パーツドキュメントだけなのでツリー上の「PartDocument」をクリックし、「Part Document Automation Objects」ページに移動すると「HybridBody」というものを見つけることができます。
オブジェクトをみつけたら、その親を順々に確認していきます。
「HybridBody」の場合は以下のような親を持っているということがわかります。
親 [Application]
[Documents]
[Document]([PartDocument])
[Part]
[HybridBodies]
子 [HybridBody]
親を上から順に定義
既存のオブジェクトをコードで表すにはこれらの親をすべて上から順に定義していく必要があります。
イメージとしては住所のようなものです。
あなたが郵便屋さんだとして、住所がいきなり町名から始まっていたら、どこにのことをいっているのかわかりません。しかし県、市、区、町のように形式に沿って上から順に書かれていればどこのことをいっているのか理解することができると思います。
VBAもこれと同じでオブジェクトを上から順に定義していかないとマクロがうまく読み取ってくれなくなるため、しっかりと順を追って定義してあげる必要があります。
Applicationオブジェクト
オブジェクトの中での1番の親である[Application]は「CATIA」と決まっているのでこのオブジェクトに関しては定義する必要はありません。
Applicationオブジェクトのプロパティ、メソッドは使用する時にApplicationとは書かずにCATIAと書くので注意しておきましょう。
× Application.ActiveDocument
○ CATIA.ActiveDocument
Documentsコレクション
次に「Documentsコレクション」を定義していきます。
DocumentsコレクションはDocumentオブジェクトをまとめたものを表します。
今回の場合「Part1」と「Part2」の2つのドキュメントが開いているため、複数のドキュメントを取り扱うことのできる「Documentsコレクション」の定義が必要になります。
まずはDocumentsコレクションを入れるための変数を宣言します。
Dim DOCs As Documents
宣言ができたら、このDOCsがどこにあるものなのかを定義していきます。
DocumentsはApplicationの直属の子であるため、Applicationの「Documensプロパティ」を使って以下のように書きます。
Set DOCs = CATIA.Documents
これでDocumentsコレクションの定義は完了です。
Documentオブジェクト
次に「Documentオブジェクト」を定義していきます。
先ほどと同じようにDocumentを入れるための変数を宣言します。
データ型は パーツドキュメントを表す「PartDocument」を入力します。
Dim DOC As PartDocument
次にこのDOCとはどのドキュメントを表しているのかを定義する必要があります。
この定義には先ほどつくったDocumentsコレクションを使って定義していきます。
どのコレクションにも「Itemメソッド」が用意されいるため、これを使って以下のように書きます。
Set DOC = DOCs.Item(1)
Set DOC = DOCs.Item(“Part1.CATPart”) ‘こちらの書き方でも可
Itemメソッドは以下のように書くことで、コレクションの中から任意のオブジェクトを取り出すことができます。
① コレクション名.Item(インデックス)
② コレクション名.Item(“オブジェクト名”)
コレクションの中のオブジェクトにはそれぞれインデックス(番号)が自動で割り振られ、このインデックスを指定することで任意のオブジェクトを表すことができます。
Documentsコレクションの場合は開いたドキュメント順に1,2,3…と割り振られていきます。
現在開いているドキュメントは「Part1」と「Part2」の2つです。
そのため先に開いた「Part1」はDOCs.Item(1)、次に開いた「Part2」はDOCs.Item(2)と表すことができます。
これでDocumentオブジェクトの定義は完了です。
Partオブジェクト
次に「Partオブジェクト」を定義していきます。
これまでと同じようにPartを入れるための変数を宣言します。
Dim PT As Part
次にこれまでと同じようにPTがどこにあるものなのかを定義します。
先ほど作ったDOC(PartDocumentオブジェクト)の「Partプロパティ」を使い、以下のように書きます。
Set PT = DOC.Part
これでPartオブジェクトの定義は完了です。
という人もいると思うのでここで一息つきましょう
これまでに取得したオブジェクトを画像として見ると以下のようなイメージとなっています。
親から子になるにつれて徐々に「形状セット.1」に近づいていっていることがわかります。
あとは「HybridBodies」と「HybridBody」つまりは形状セットに関するオブジェクトを定義すれば、「形状セット.1」を取得することができます。
何をやってきたのか何となく理解できますね
HybridBodiesコレクション
次に「HybridBodiesコレクション」を定義していきます。
これまでと同じようにHybridBodiesを入れるための変数を宣言します。
Dim HBs As HybridBodies
次に「Documentsコレクション」と同じ要領でHybridBodiesを定義していきます。
PT(Partオブジェクト)の「HybridBodiesプロパティ」を使い以下のように書きます。
Set HBs = PT.HybridBodies
これでHybridBodiesコレクションの定義は完了です。
HybridBodyオブジェクト
最後に「HybridBodyオブジェクト」を定義していきます。
これまでと同じようにHybridBodyを入れるための変数を宣言します。
Dim HB As HybridBody
次に「Documentオブジェクト」を定義した時と同じようにHBs(HybridBodiesコレクション)の「Itemメソッド」を使ってHybridBodyを定義します。
Set HB =HBs.Item(1)
Set HB=HBs.Item(”形状セット.1”) ‘こちらの書き方でも可
これでHybridBodyオブジェクトの定義は完了、つまりは「形状セット.1」の取得は完了です。
取得した「形状セット.1」は変数HBに入っているため、現在VBA上で「形状セット.1」に対して何かしらの操作を行いたい場合は変数HBを使います。
これまでのコードをまとめると以下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Dim DOCs As Documents Set DOCs = CATIA.Documents Dim DOC As PartDocument Set DOC = DOCs.Item(1) Dim PT As Part Set PT = DOC.Part Dim HBs As HybridBodies Set HBs = PT.HybridBodies Dim HB As HybridBody Set HB = HBs.Item(1) |
メッセージボックスで確認
最後にしっかりオブジェクトを取得できたかをメッセージボックスを使って確認してみます。
最後の行に以下のコードを記入して実行してみて下さい。
MsgBox HB.Name
これで「形状セット.1」とメッセージボックスが表示されれば、しっかりオブジェクトの取得できています。
また、HBの部分をDOCやPTに変更すると「Part1.CATPart」「Part」と表示されることからDOCやPTも取得できていることがわかります。
このようにメッセージボックスを使うことでオブジェクトを取得できているかを簡単に確認することができます。
(実際はVBE上でDebugを使っての確認の方法が一般的ですが)
まとめ
今回の内容をまとめると以下のとおりです。
オブジェクトの取得は親から順にしていく
コレクションが出てきたらItemメソッドを使う
メッセージボックスで取得ができているかのの確認ができる
はじめのうちは理解するのに少し時間がかかるかもしれませんが、だんだんと理解することができるようになっていきます。
今のうちは「このオブジェクトを取得するぞ」と何か目標を決め、試行錯誤しながらいろいろ書いてみるのがいいと思います。
次回はPT以下のオブジェクトの取得方法をより深掘りしてみていきます。
たとえば「形状セットの中にある形状セットをどのように取得するのか」や「サーフェスや点のような形状はどのように取得するのか」を解説していきます。
CATIAマクロを本気で勉強するなら