SelectElement2メソッドの使い方|CATIAマクロの作成方法
「Selectionオブジェクト」にはマクロ実行中にユーザーの選択を可能にするための『SelectElement2メソッド』『SelectElement3メソッド』『SelectElement4メソッド』という3種類のメソッドがあります。
今回はその中でも複数選択が可能な『SelectElement2メソッド』の使い方を解説していきます。
その他のSelectElement系メソッドの使い方は下記リンクを参照下さい。
・SelectElement3メソッドの使い方
・SelectElement4メソッドの使い方
SelectElement2メソッドとは
SelectElement2はマクロ実行中にユーザーがオブジェクトを選択することができるメソッドです。
イメージとしては「InputBox関数」と同じで、マクロの処理の途中に「ユーザーのインプット」というフェーズが入り込みます。
InputBox関数の場合は文字列をインプットすることができますが、SelectElement2メソッドの場合は選択したオブジェクトをインプットすることができます。(はじめのうちはInputBoxのオブジェクト入力verと思っておけば大丈夫です)
ユーザーが選択したオブジェクトを取得できるということは、
そのオブジェクトをVBAで操作することが可能になるということです。
(gif画像でいうと選択した形状セットに対して”中に形状セットを作成”という操作を行っています)
このように、このメソッドを使うことで完全に決められた動作を行うだけではなく、ユーザーが選択したものに応じて柔軟な処理を行うマクロにすることができます。
(詳しくはSelectionオブジェクトのItemメソッドの項を参照)
このItemメソッドで取得したオブジェクトは「SelectedElementオブジェクト」として取得されます。あまり聞き覚えのないオブジェクトかもしれませんが、以下のように省略されて使われていることが多いです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
'よく使う構文 Dim SEL As Selection Set SEL = CATIA.ActiveDocument.Selection Dim SELItem As AnyObject Set SELItem = SEL.Item(1).Value '----------------------------------------- '上の構文を略さずに書いた場合 Dim SEL As Selection Set SEL = CATIA.ActiveDocument.Selection Dim SELElm As SelectedElement '<- コレ Set SELElm = SEL.Item(1) Dim SELItem As AnyObject Set SELItem = SELElm.Value |
名前が似ているので書き間違えなどには注意しましょう。
(「SelectElement1」メソッドが無いのもこのオブジェクトの存在が原因かも?)
SelectElemen2メソッドの使い方
SelectElement2メソッドを使うには以下のような構文を書きます。
※このメソッドはSelectionとして宣言するとエラーが発生するためVariant型で宣言します。
Set SEL = CATIA.ActiveDocument.Selection
Dim Status As String
Status = SEL.SelectElement2(iArray, iMsg, iBoolean)
このメソッドによってオブジェクトが選択された場合 、文字列型の変数「Status」には“Normal”という文字列が返ってきます。また、選択前に[Esc]キーが押された場合は“Cancel”、[Ctrl]+[Z]キーが押された場合は”Undo”、[Ctrl]+[Y]キーが押された場合は“Redo”という文字列が返ってきます。
この返り値を使って「If Status <> “Normal” Then」という条件(正常に選択されなかった場合)の処理もあわせて書いておくのが一般的です。
上記の構文が基本の書き方で青文字部分を自身のマクロに合わせて書き換えていきます。
それぞれの青文字部分に入れる内容は下記のとおりです。
選択フィルターの設定(iArray)
iArrayにはユーザー選択時にフィルターをかけたいオブジェクトのタイプ名が入った配列を入れます。
ユーザー選択時にここで指定したオブジェクトしか選択できない状態になります。
ユーザーに選択させたいオブジェクトが決まっている場合はここで指定しましょう。
オブジェクトを複数設定したい場合は「Array(“HybridBody”,”Body”)」のように配列の後ろにオブジェクト名を追加してくだけでOKです。
また、フィルターをかける必要がない場合は、配列に”AnyObject”を入れておけばOKです。
「このオブジェクトに対してフィルターをかけたいけど、オブジェクト名がわからない!」という方は、「TypeName関数」ページでオブジェクト名を調べるサンプルマクロを用意しているのでそちらをご利用ください。
選択時のメッセージの指定(iMsg)
iMsgにはユーザー選択時に表示するメッセージを入力します。
メッセージはメッセージボックスで立ち上がるわけではなくステータスバーに表示されます。
上記のように書くとユーザー選択時に以下のようにメッセージが表示されます。
事前選択の設定(iBoolean)
iBooleanには「False」もしくは「True」を入力します。
ここではユーザーが選択するとき、選択状態のものがすでにあった場合にその選択されているオブジェクトをどうするのかを指定することができます。
Falseの場合 → その選択を無視して次に選択されるオブジェクトを有効とします。
Trueの場合 → その選択を有効とします。(事前選択)
コピペ用コード
下記のコードは上記までの内容をまとめたサンプルコードです。
コードが難しく理解できない方は以下をコピペしてiArray, iMsg, iBooleanの中身だけ自分のマクロに合ったものに変更すればOKです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
Dim SEL 'このメソッドを使う場合「As Selection」と宣言しない Set SEL= CATIA.ActiveDocument.Selection Dim Filter Filter = Array("AnyObject") 'フィルターを設定(iArray) Dim Msg As String Msg = "オブジェクトを選択してください。" '選択時にステータスバーに表示されるメッセージの指定(iMsg) Dim Status As String Status = SEL.SelectElement2(Filter, Msg, False) If Status <> "Normal" Then MsgBox "キャンセルしました。" 'Statusが"Normal"でない場合(つまりは正常に選択されなかった場合)にマクロ中断 Exit Sub End If Dim SELItem As HybridBody Set SELItem = SEL.Item(1).Value 'SELItemにユーザーが選択したオブジェクトを入れる Debug.Print SELItem.Name '取得の確認用の処理 |
上記コードの場合、ユーザーが選択したオブジェクトは「SELItem」という変数に格納されます。
あとはこの「SELItem」を使ったコードを上記コード以降に書いておけば、ユーザーが選択したオブジェクトに対して処理を行うことができます。
サンプルマクロ
最後にSelectElement2メソッドを使った簡単なサンプルマクロを紹介します。
ここで紹介するマクロは冒頭でも出てきた以下のようなマクロです。
マクロの機能をまとめると以下のとおりです。
・その時の形状セットの名前は「New Geometrical Set」とする
ほとんど [形状セット…]コマンドと同じ機能ですが、ここで重要なのはVBAを使ってユーザーが選択したものに対して処理を行えているという点です。
SelectElement2はユーザーと”対話”ができるCATIA VBAの中でも数少ないメソッドの1つです。
以下のサンプルコードでは”どのようにして選択したオブジェクトに対して操作を行っているか”に注目してコードを読んでみて下さい。
サンプルマクロコード
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 |
Sub CATMain() Dim SEL 'このメソッドを使う場合「As Selection」と宣言しない Set SEL = CATIA.ActiveDocument.Selection Dim Filter As Variant Filter = Array("HybridBody") 'フィルターを設定(iArray) Dim Msg As String Msg = "形状セットを選択してください。" '選択時にステータスバーに表示されるメッセージの指定(iMsg) Dim Status As String Status = SEL.SelectElement2(Filter, Msg, False) If Status <> "Normal" Then MsgBox "キャンセルしました。" 'Statusが"Normal"でない場合(つまりは正常に選択されなかった場合)にマクロ中断 Exit Sub End If Dim SELHB As HybridBody Set SELHB = SEL.Item(1).Value 'ユーザーが選択した形状セットをSELHBに代入 Dim NewHB As HybridBody Set NewHB = SELHB.HybridBodies.Add 'SELHB内に形状セットを新規作成 NewHB.Name = "New Geometrical Set" '作成した形状セットの名称変更 CATIA.ActiveDocument.Part.Update 'Part更新 End Sub |
まとめ
今回は「SelectElement2メソッド」についての内容でした。
SelectElement2メソッドはCATIAマクロを作るうえで非常に重要なメソッドです。
SelectElement3,4は知っていたほうが便利なメソッドですが、最悪知らなくても問題はありません。
ただSelectElement2に関しては知らないと困るメソッドです。
ユーザーの選択を受け取る方法としてSelectElement2メソッド以外の選択肢はほぼありません。
(UserformとSelectionオブジェクトを使うことでSelectElement2,3と同じような機能を作ることもできますが、それ以外の方法は今のところ思いつきません)
もし存在を今回初めて知ったという方は、ぜひこのメソッドの存在は忘れないでください。
使い方は忘れてもヘルプや本ページで確認することができるので問題ありません。
CATIAマクロを本気で勉強するなら