CATIA VBAでPowerCopyのインスタンスを作成する方法|CATIAマクロの作成方法
CATIAにはパワーコピー(PowerCopy)という非常に便利な機能が存在しています。
そんなパワーコピーですが、実はCATIA VBAを使って[ドキュメントからインスタンスを作成]コマンドと同じ処理を行うことができます。つまりはCATIA VBAのループ文を使うことで大量のパワーコピーのインスタンスを一括で作成することが可能になるということです。
ある程度パワーコピーの知識は必要ですが基本的にはパワーコピーのインスタンス作成のコードは定型文なので、コピペしていくつかの要素を書き換えればすぐに使用可能になります。初見ではコード内容が複雑に見えますが、フェーズごとに見ていけば案外単純な構造をしているのでぜひ理解してみて下さい。
※本ページはパワーコピーについて理解している前提の内容になっています。
パワーコピーについて知らない方は先にパワーコピーについて理解してから始めましょう。
またVBAでパワーコピーを使用するには「KT1」ライセンスが必要です。
インスタンス元ドキュメントについて(パワーコピー)
まずは本ページで使用するパワーコピーの元(リファレンス)となるドキュメントの構成を説明します。
パワーコピーの内容としては「丸座面を作成する」という機能になっています。
下画像の「Input」セット内にある2つのオブジェクトがパワーコピーの入力となります。
この2つのオブジェクトの入力を元に、「Output」セットが作成されます。
また、パラメータとしては「パラメータ.1」セット内の5つのパラメータが設定可能となっています。
手動でのインスタンス作成時は下画像のようになります。
座面中心点(◎)と基準サーフェス(水色)の入力をもとに丸座面(黄色)が作成されます。
このときパラメータを変更することで丸座面の形状を調節できるようになっています。
ここで重要なのは下記の部分です。この部分はコードに記載する内容です。
実際は下記の文字列ではなく自身のパワーコピーに記載している文字列を使うことになるので、上画像と比較してしっかりとどこの内容なのかを理解しておきましょう。
・パワーコピー名称 “PowerCopy_丸座面”
・入力オブジェクト名称 “座面中心点” , “基準サーフェス”
・パラメータ名称 “座面高さ” , “座面直径” , “座面角度” , “凸R” , “凹R”
VBAコード
では上記ドキュメントのインスタンス作成のためのコードを解説していきます。
コード全体は下記の通りです。
※事前にパワーコピードキュメントとインスタンスを作成するドキュメントが必要です。
下記コードはインスタンスを作成するドキュメント上で実行します。
パワーコピードキュメントは手動時と同様に閉じておいて下さい。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
Option Explicit Sub CATMain() 'アクティブドキュメント等定義 If TypeName(CATIA.ActiveDocument) <> "PartDocument" Then MsgBox "このマクロはPartDocument専用です。" & vbLf & _ "CATPartに切り替えて実行してください。" Exit Sub End If Dim doc As PartDocument: Set doc = CATIA.ActiveDocument Dim pt As Part: Set pt = doc.Part 'InstanceFactory定義 Dim insf As InstanceFactory: Set insf = pt.GetCustomerFactory("InstanceFactory") 'SelectElement2で入力オブジェクト1(座面中心点)をユーザー選択で取得 Dim sel: Set sel = doc.Selection Dim filter: filter = Array("Point") Dim status As String status = sel.SelectElement2(filter, "座面中心点を選択して下さい", False) If status <> "Normal" Then Exit Sub Dim input1 As Point Set input1 = sel.Item(1).Value sel.Clear 'SelectElement2で入力オブジェクト2(基準サーフェス)をユーザー選択で取得 filter = Array("HybridShape") status = sel.SelectElement2(filter, "基準サーフェスを選択して下さい", False) If status <> "Normal" Then Exit Sub Dim input2 As HybridShape Set input2 = sel.Item(1).Value sel.Clear 'パワーコピードキュメントパス Dim pc_path As String pc_path = "C:\Users\…\PowerCopy_OriginalDocument.CATPart" 'パワーコピー名称 Dim pc_name As String pc_name = "PowerCopy_丸座面" '①インスタンス化プロセスを初期化 insf.EndInstanceFactory insf.BeginInstanceFactory pc_name, pc_path '②リファレンス初期化 insf.BeginInstantiate '③リファレンスの入力オブジェクトを指定 insf.PutInputData "座面中心点", input1 insf.PutInputData "基準サーフェス", input2 '④リファレンスのパラメータ値の設定(オプションのため省略可) Dim parm As Parameter Set parm = insf.GetParameter("座面高さ") parm.ValuateFromString ("3mm") '⑤リファレンスのインスタンンスを作成 Dim inst Set inst = insf.Instantiate '⑥リファレンスのインスタンス作成を終了 insf.EndInstantiate '⑦インスタンス化プロセスの終了 insf.EndInstanceFactory pt.Update End Sub |
コード解説
アクティブドキュメント等の定義
1 2 3 4 5 6 7 8 9 |
'アクティブドキュメント等定義 If TypeName(CATIA.ActiveDocument) <> "PartDocument" Then MsgBox "このマクロはPartDocument専用です。" & vbLf & _ "CATPartに切り替えて実行してください。" Exit Sub End If Dim doc As PartDocument: Set doc = CATIA.ActiveDocument Dim pt As Part: Set pt = doc.Part |
まずはじめにアクティブドキュメントを定義をします。
今回のマクロはCATPartのみ有効なものなので、アクティブドキュメントがCATPart以外の場合はTypeName関数を使った条件分岐でマクロを終了するようにしています。つまり、アクティブドキュメントがCATPartの場合のみ変数「doc」にアクティブドキュメントを代入し、マクロの処理を続けます。
アクティブドキュメントが定義できたら「Partオブジェクト」も合わせて定義します。
InstanceFactory定義
1 2 |
'InstanceFactory定義 Dim insf As InstanceFactory: Set insf = pt.GetCustomerFactory("InstanceFactory") |
つぎにインスタンスを作成するためのオブジェクトである「InstanceFactory」を定義します。
GSDで形状を作成するための「HybridShapeFactory」オブジェクトや、パーツデザインで形状を作成するための「ShapeFactory」オブジェクトと同じFactory系オブジェクトです。
定義方法は特殊で「pt.HybridShapeFactory」や「pt.ShapeFactory」のようにPartオブジェクトのプロパティとしては定義できません。InstanceFactoryオブジェクトはPartオブジェクトの「GetCustomerFactoryメソッド」を使って下記のように書くことで定義ができます。
Dim insf As InstanceFactory
Set insf = Partオブジェクト.GetCustomerFactory(“InstanceFactory”)
あとはInstanceFactoryオブジェクト内のメソッドを順に実行していくことでパワーコピーのインスタンスを作成することができます。
SelectElement2で入力オブジェクトをユーザー選択で取得
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
'SelectElement2で入力オブジェクト1(座面中心点)をユーザー選択で取得 Dim sel: Set sel = doc.Selection Dim filter: filter = Array("Point") Dim status As String status = sel.SelectElement2(filter, "座面中心点を選択して下さい", False) If status <> "Normal" Then Exit Sub Dim input1 As Point Set input1 = sel.Item(1).Value sel.Clear 'SelectElement2で入力オブジェクト2(基準サーフェス)をユーザー選択で取得 filter = Array("HybridShape") status = sel.SelectElement2(filter, "基準サーフェスを選択して下さい", False) If status <> "Normal" Then Exit Sub Dim input2 As HybridShape Set input2 = sel.Item(1).Value sel.Clear |
InstanceFactoryオブジェクト内のメソッドを順に実行する前に、パワーコピーの入力オブジェクトとなるオブジェクトを取得しておきます。
ここではSelectionオブジェクトのSelectElement2メソッドを使ってユーザー選択により入力オブジェクトを取得していますが、入力したいオブジェクトさえ取得できれば別の方法でも問題ありません。
要は上記コードでいう「input1」「input2」の中にそれぞれ「座面中心点」「基準サーフェス」となるオブジェクトが入っていれば問題ないということです。オブジェクトの取得方法は作成するマクロに合わせて任意に書き換えて下さい。
パワーコピードキュメントパス / パワーコピー名称の定義
1 2 3 4 5 6 7 |
'パワーコピードキュメントパス Dim pc_path As String pc_path = "C:\Users\…\PowerCopy_OriginalDocument.CATPart" '<- インスタンス元となるドキュメントのフルパスを入力 'パワーコピー名称 Dim pc_name As String pc_name = "PowerCopy_丸座面" '<- 作成したパワーコピーの名称を入力 |
つぎにパワーコピーを作成したインスタンス元となるドキュメントをコード上で定義していきます。
ここでは「pc_path=ドキュメントのパス」と「pc_name=パワーコピーの名称」を定義します。
使用するドキュメントを参照しながら上記コードを自身の内容に書き換えて下さい。
リファレンスの定義とインスタンスの作成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
'①インスタンス化プロセスを初期化 insf.EndInstanceFactory insf.BeginInstanceFactory pc_name, pc_path '②リファレンス初期化 insf.BeginInstantiate '③リファレンスの入力オブジェクトを指定 insf.PutInputData "座面中心点", input1 insf.PutInputData "基準サーフェス", input2 '④リファレンスのパラメータ値の設定(オプションのため省略可) Dim parm As Parameter Set parm = insf.GetParameter("座面高さ") parm.ValuateFromString ("3mm") '⑤リファレンスのインスタンンスを作成 Dim inst Set inst = insf.Instantiate '⑥リファレンスのインスタンス作成を終了 insf.EndInstantiate '⑦インスタンス化プロセスの終了 insf.EndInstanceFactory pt.Update |
最後に本マクロの核部分となるインスタンスの作成を行っていきます。
またインスタンスの作成には先にリファレンス(インスタンス元)の定義が必要なので併せて行います。
順序をまとめるとInstanceFactoryオブジェクトのメソッドを下記の順で実行していくだけです。
② BeginInstantiate
③ PutInputData
④ GetParameter (パラメータがある場合のみ)
⑤ Instantiate
⑥ EndInstantiate
⑦ EndInstanceFactory
続いて上記の各項目について詳しく解説していきます。
① BeginInstanceFactory (インスタンス化プロセスを初期化)
まずは、これからインスタンスを作成するプロセスを開始する宣言をします。
この宣言はBeginInstanceFactoryメソッドを使って行います。
引数としては(ドキュメントのパス , パワーコピーの名称)となっています。
引数の内容が間違っているとエラーが発生するので注意しましょう。
また、バグか仕様かはわかりませんがBeginInstanceFactoryメソッドを使用する前にEndInstanceFactoryメソッドを実行しないとエラーが発生するようになっています。
つまりは定型文として下記コードを書いておけば大丈夫です。
insf.EndInstanceFactory ‘エラー対策のために必要
insf.BeginInstanceFactory “ドキュメントのパス”,“パワーコピーの名称”
② BeginInstantiate (リファレンス初期化 )
次にBeginInstantiate メソッドを使って①で指定したドキュメントパスとパワーコピー名称からインスタンス元として使用するパワーコピーの情報をすべて初期化します。
以降の③④では入力オブジェクトの設定やパラメータ値の設定/変更を行いますが、2回目以降の処理でそれらの変更が反映された状態にならないようにするための処理です。
VBAではその処理のなかでどれだけ変数の値を変更しても、2回目の処理ではそれらの変更はすべてリセットされた状態で再び処理が1から始まりますがそれと同じイメージです。
引数もないので定型文としては下記の1行のみです。
insf.BeginInstantiate
③ PutInputData (リファレンスの入力オブジェクトを指定 )
次にPutInputDataメソッドでパワーコピーの入力となるオブジェクトを指定します。
本ページのマクロでは「SelectElement2メソッド」を使ってユーザー選択の取得により定義した「input1」と「input2」です。
ここではその「input1」と「input2」を使って入力を指定します。
「insf.PutInputData “座面中心点”, input1」のようにパワーコピー内で指定していたオブジェクト名とあわせて入力します。この場合パワーコピーの入力オブジェクトである“座面中心点”にはinput1に入っているオブジェクトが使用されるということを表しています。
入力オブジェクトが複数ある場合は再度PutInputDataメソッド を使って1行ずつ指定していきます。
定型文としては下記のようなコードになります。
入力オブジェクトすべてに対して記載する必要があるので注意しましょう。
insf.PutInputData “入力オブジェクト名称1”, input1
insf.PutInputData “入力オブジェクト名称2”, input2
‘ : ※パワーコピーで設定している入力オブジェクトの数だけ記載
④ GetParameter (リファレンスのパラメータ値の設定)
次にGetParameterメソッドを使いパワーコピーのパラメータの値を指定します。
パワーコピー内にパラメータが無い場合はGetParameterメソッドの使用は不要です。
また、パラメータの値をデフォルトで使う場合も使用は不要です。
つまりはパラメータの値をデフォルト値から変更する場合にのみ本メソッドを使用します。
パラメータ値の変更は「パラメータの取得」→「パラメータ値の変更」という順番で行います。
まず「Set parm =insf.GetParameter(“座面高さ”)」のように名指しでパラメータを取得します。
次に取得したパラメータである「parm」の「ValuateFromStringメソッド」を使って値を変更します。このとき「parm.ValuateFromString (“3mm”)」のようにして値を変更しますが、引数は文字列であるため「”3mm”」や「”20deg”」のように単位を付けた文字列を入力する必要があるので注意しましょう。
変更したいパラメータが複数の場合はそれぞれを取得して「ValuateFromStringメソッド」で値を変更しましょう。ここで変更しなかったパラメータはデフォルト値が使われます。
定型文としては下記のようなコードになります。
Dim parm As Parameter
Set parm = insf.GetParameter(“パラメータ名称”)
parm.ValuateFromString (“変更後の値”)
⑤ Instantiate (リファレンスのインスタンンスを作成)
次にInstantiateメソッドでこれまでに設定してきたリファレンスのインスタンスを作成します。
特に引数もないので定型文としては下記を書いておけばOKです。
Dim inst
Set inst = insf.Instantiate
⑥ EndInstantiate (リファレンスのインスタンス作成を終了)
次にインスタンス作成の終了の宣言をします。
この宣言にはEndInstantiateメソッドを使います。
「If」と「End If」,「For」と「Next」と同じ関係性で、②BeginInstantiateの対となる存在だと思っておけば大丈夫です。
特に引数もないので定型文としては下記を書いておけばOKです。
insf.EndInstantiate
⑦ EndInstanceFactory (インスタンス化プロセスの終了)
最後にインスタンス作成プロセスの終了の宣言をします。
この宣言にはEndInstanceFactoryメソッドを使います。
⑥と同じで、①BeginInstanceFactoryの対の存在だと思ってもらえれば大丈夫です。
特に引数もないので定型文としては下記を書いておけばOKです。
insf.EndInstanceFactory
以上でインスタンスの作成は完了です。
内容を見てもらえば分かった通り、①③④の一部さえ書き換えればあとはすべて同じ内容なのでコピペだけで十分にやっていけることが理解できたと思います。
まとめ
今回はCATIA VBAでPowerCopyのインスタンスを作成する方法を解説しました。
まとめると下記の通り順にInstanceFactoryオブジェクトのメソッドを使うだけです。
このときの引数がパワーコピーの名称や入力オブジェクトになっています。
① BeginInstanceFactoryメソッド
② BeginInstantiateメソッド
③ PutInputDataメソッド
④ GetParameterメソッド (パラメータがある場合のみ)
⑤ Instantiateメソッド
⑥ EndInstantiateメソッド
⑦ EndInstanceFactoryメソッド
今回の内容はかなり手動に近い方法のためイメージは付きやすいと思いますが、効率アップの要素はあまり感じられません。
しかし、パワーコピーのインスタンスの作成方法さえわかれば、一括でインスタンスを作成したり、複数のパワーコピーのインスタンスを順に字自動作成したりすることも可能になります。
色々試して「パワーコピー×VBA」の知識も付けてみて下さい。
CATIAマクロを本気で勉強するなら