こちらの続きです。
VBAでマクロを作成する際の我流な手順1 - C#ATIA
マメな性格な方であれば、一つ一つHelpを見て理解して頂くと
良いのですが、当方めんどくさがりな性格なので次の手段に移ります。
Dim ~ は変数の宣言なのでとりあえず無視し、それ以外の部分を
最後の方からコメント化し、再度マクロを実行し再現されるか?
を確認してみます。(CATIA側はUndoした方がわかりやすいかもです)
'vba ... 'part1.UpdateObject hybridBody1 ...
これで再実行したところ、コメント化前と変わらず形状セットが作成されました。
つまりこの行は、形状セットの作成には直接関係無い事がわかります。
さらに続けてみます。
'vba ... Dim hybridBodies1 As HybridBodies Set hybridBodies1 = part1.HybridBodies Dim hybridBody1 As HybridBody 'Set hybridBody1 = hybridBodies1.Add() ...
これで再実行すると形状セットが作成されませんでした。つまり
この行こそが、形状セット作成の為のコードだろうと予想できます。
又、この代入されている変数の型(HybridBody)が、形状セット
ではないか?と感じることも出来ます。
ここでHybridBodyをHelpで見てみます。
細かな事は無視しておきます。
「Property Index」(プロパティ)と「Method Index」(メソッド)が存在
している事がわかります。個人的にはプロパティで提供されているものは
非常にありがたいです。
さらに "hybridBodies1.Add()" を代入している事から、
「HybridBodies」の「Add」メソッドが何をしているのかを
知りたいところです。そこで「HybridBodies」をHelpで
見てみます。
「Add」メソッドありました。英訳すればわかるのでしょうが、要は
"新しい形状セットを作成する為のメソッド" だと書かれています。(多分)
また「HybridBodies」はコレクションです。しかもHybridBody(形状セット)専用の
コレクションとなっています。(型名が複数形になっているので察しは付きますね)
ここで、先程コメント化した行を元に戻し、ブレークポイントにします。
さらにローカルウィンドウを表示させた状態にします。
この状態で再度マクロを実行すると、このような感じになります。
(Text3Dとかモジュール6とかは、今やりかかっているものなので無視して下さい)
"hybridBodies1"は代入される直前で止められている為、"Nothing"
の状態です。
さらにF8キーを押し、1行だけ実行を進めます。
"hybridBodies1"は代入され左側の "+" をクリックすると色々なものが
展開され、こんな感じになります。
これが "hybridBodies1" で利用できるプロパティとなります。
(プロパティはローカルウィンドウで確認できる為、非常にありがたいわけです)
よく見ると "Name" プロパティのValueにCATIAのTree上で表示されている
名前と同じものが存在しています。 このプロパティを変更すれば
形状セット名のリネームが出来そうな感じがします。
こんな感じにしました。
'vba Sub CATMain() Dim partDocument1 As PartDocument Set partDocument1 = CATIA.ActiveDocument Dim part1 As Part Set part1 = partDocument1.Part Dim hybridBodies1 As HybridBodies Set hybridBodies1 = part1.HybridBodies Dim hybridBody1 As HybridBody Set hybridBody1 = hybridBodies1.Add() hybridBody1.Name = "hoge" '文字の代入なのでSet無し 'part1.UpdateObject hybridBody1 End Sub
実行してみると、先程は "形状セット.2" と言う名前で作成されましたが、
リネームされた形状セットが作成された事が確認できます。
無事リネーム出来たのですが、ここで疑問に思う事が無いでしょうか?
最初にHybridBodyをHelpで見た際、"Name" プロパティは存在して
いませんでした。
VBAには、クラスの継承と言う観念が無い為わかりにくいのですが、
Helpのオブジェクト(コレクション)名の下にインデントされて表示されている部分が、
クラスやインターフェースの継承を表しており、これらで定義されている
プロパティやメソッドが利用可能となっています。
(NameプロパティはAnyObjectで実装されています)