SelectElement3メソッドの使い方|CATIAマクロの作成方法
「Selectionオブジェクト」にはマクロ実行中にユーザーの選択を可能にするための『SelectElement2メソッド』『SelectElement3メソッド』『SelectElement4メソッド』という3種類のメソッドがあります。
今回はその中でも複数選択が可能な『SelectElement3メソッド』の使い方を解説していきます。
その他のSelectElement系メソッドの使い方は下記リンクを参照下さい。
・SelectElement2メソッドの使い方
・SelectElement4メソッドの使い方
SelectElemen3メソッドとは
SelectElement3はマクロ実行中にユーザーがオブジェクトを選択することができるメソッドです。
イメージとしては「InputBox関数」と同じで、マクロの処理の途中に「ユーザーのインプット」というフェーズが入り込みます。
InputBox関数の場合は文字列をインプットすることができますが、SelectElement3メソッドの場合は選択したオブジェクトをインプットすることができます。(はじめのうちはInputBoxのオブジェクト入力verと思っておけば大丈夫です)
ユーザー選択時には下のgif画像のように、専用のツールバーが表示されます。
ユーザーはこのツールバーを使うことで“複数”のオブジェクトを選択することができます。
(ページ後半の「サンプルマクロ」の項ではこのgif画像のマクロコードを紹介しています)
SelectElement2,SelectElement4メソッドではそれぞれ単体のオブジェクトしかインプットすることができないのに対し、SelectElement3メソッドでは複数のオブジェクトをインプットすることができるのが1番の特徴です。
SelectElement3の構文
SelectElement3メソッドを使うには以下のような構文を書きます。
※このメソッドはSelectionとして宣言するとエラーが発生するためVariant型で宣言します。
Set SEL = CATIA.ActiveDocument.Selection
Dim Status As String
Status = SEL.SelectElement3(iArray, iMsg, iBoolean1, iSelectionMode, iBoolean2)
このメソッドによってオブジェクトが選択された場合 、文字列型の変数「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にはユーザー選択時に表示するメッセージを入力します。
メッセージはメッセージボックスで立ち上がるわけではなくステータスバーに表示されます。
上記のように書くとユーザー選択時に以下のようにメッセージが表示されます。
事前選択の設定(iBoolean1)
iBoolean1には「False」もしくは「True」を入力します。
ここではユーザーが選択するとき、選択状態のものがすでにあった場合にその選択されているオブジェクトをどうするのかを指定することができます。
Falseの場合 → その選択を無視して次に選択されるオブジェクトを有効とします。
Trueの場合 → その選択を有効とします。(事前選択)
選択モードの設定(iSelectionMode)
iSelectionModeには選択モードとして以下のいずれかを入力します。
・CATMonoSel
・CATMultiSelTriggWhenSelPerf
・CATMultiSelTriggWhenUserValidatesSelection
ここで入力した選択モードがユーザー選択時に採用されます。
それぞれの選択モードの違いは以下のとおりです。
単体オブジェクトのみ選択可能なモードです。(要はSelectElement2メソッドと同じ)
1つのオブジェクトを選択するとユーザー選択のフェーズは終わりマクロの処理に戻ります。
[Ctrl][Shift]キーの使用が不可で、マウスのドラッグによる複数選択のみが可能です。
このモードを使用すると以下のようなツールバーが表示されます。
ユーザーはこのツールバーを使ってオブジェクトを複数選択します。
ツールーバーの各トラップツールの使い方については
「オブジェクトの選択」ページの「トラップツールで範囲選択」の項を参照下さい。
オブジェクトの選択後、ユーザー選択のフェーズは終わりマクロの処理に戻ります。
複数のオブジェクトが選択可能なモードです。(単体オブジェクトの選択も可)
マウスのドラッグによる複数選択、[Ctrl][Shift]キーを使った複数選択が可能です。
ユーザーはこのツールバーを使ってオブジェクトを複数選択します。
ツールーバーの各トラップツールの使い方については
「オブジェクトの選択」ページの「トラップツールで範囲選択」の項を参照下さい。
オブジェクトを選択すると選択した順に[エレメントリスト]に格納されていきます。
オブジェクトを選択し終わったら、右側の[完了ボタン]をクリックします。
[完了ボタン]が押されたらユーザー選択のフェーズは終わりマクロの処理に戻ります。
ツールチップの設定(iBoolean2)
iBoolean2には「False」もしくは「True」を入力します。
ここではツールチップの表示/非表示を指定することができます。
※ツールチップ:マウスをオブジェクトに重ねた時に表示される小さなメッセ―ジ
Falseの場合 → ツールチップを非表示
Trueの場合 → ツールチップを表示
CATIAの設定でツールチップが[表示]となっている場合はどちらを入力しても表示になります。
コピペ用コード
下記のコードは上記までの内容をまとめたサンプルコードです。
コードが難しく理解できない方は以下をコピペしてiArray,iMsg,iBoolean1,iSelectionMode,iBoolean2の中身だけ書き換えればOKです。
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 |
Dim SEL 'このメソッドを使う場合「As Selection」と宣言しない Set SEL = CATIA.ActiveDocument.Selection Dim Filter As Variant Filter = Array("AnyObject") 'フィルターを設定(iArray) Dim msg As String msg = "オブジェクトを選択してください。" '選択時にステータスバーに表示されるメッセージの指定(iMsg) Dim Status As String Status = SEL.SelectElement3(Filter, msg, False, CATMultiSelTriggWhenUserValidatesSelection, False) If Status <> "Normal" Then MsgBox "キャンセルしました。" 'Statusが"Normal"でない場合(つまりは正常に選択されなかった場合)にマクロ中断 Exit Sub End If Dim i As Integer Dim SELCollection As Collection Set SELCollection = New Collection For i = 1 To SEL.Count SELCollection.Add SEL.Item(i).Value 'ループを使ってSELCollectionにユーザーが選択したオブジェクトを入れる Next i Dim j As Integer For j = 1 To SELCollection.Count Debug.Print SELCollection.Item(j).Name '取得の確認用の処理 Next j |
上記コードの場合、ユーザーが選択したオブジェクトは「SELCollection」というコレクションに格納されます。(オブジェクトが複数のため変数ではなくコレクションに格納する必要があります)
コレクションに入っているオブジェクトはItemメソッドを使うことで取得することができます。
たとえば1つ目に選択したオブジェクトは「SELCollectionv.Item(1)」、
2つ目に選択したオブジェクトは「SELCollection.Item(2)」といった具合で表すことができます。
詳しくは「選択しているオブジェクトを一時保管する方法」ページを参照下さい。
あとはこの「SELCollection」を使ったコードを上記コード以降に書いておけば、ユーザーが選択したオブジェクトに対して処理を行うことができます。
サンプルマクロ
最後にSelectElement3メソッドを使った簡単なサンプルマクロを紹介します。
実際の作業にはあまり需要の無いであろうマクロですが、使い方のイメージはつかめると思います。
ここで紹介するマクロは冒頭でも出てきた以下のようなマクロです。
マクロの機能は上のgif画像を見れば大体わかると思いますが、機能をまとめると以下のとおりです。
・選択した順に連番となるよう数字を付ける
このマクロの肝はSelectElement3メソッド特有の複数オブジェクトをインプットするという点です。
“複数のオブジェクトを扱う方法”を意識してサンプルコードを見て下さい。
サンプルマクロコード
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 |
Sub CATMain() Dim SEL Set SEL = CATIA.ActiveDocument.Selection Dim Filter As Variant Filter = Array("HybridBody") '形状セットしか選択できないようフィルターを設定 Dim msg As String msg = "名前を変える形状セットを選択してください。" Dim Status As String Status = SEL.SelectElement3(Filter, msg, False, CATMultiSelTriggWhenUserValidatesSelection, False) If Status <> "Normal" Then MsgBox "キャンセルしました。" Exit Sub End If Dim i As Integer Dim SELCollection As Collection Set SELCollection = New Collection For i = 1 To SEL.Count SELCollection.Add SEL.Item(i).Value Next i Dim j As Integer Dim SELHB As HybridBody For j = 1 To SELCollection.Count Set SELHB = SELCollection.Item(j) SELHB.Name = "Geometrical Set." & j 'SELCollectionに入っている形状セットの名前を「Geometrical Set.j」にする Next j End Sub |
まとめ
今回は「SelectElement3メソッド」についての内容でした。
SelectElement3メソッドは他のSelectElement系のメソッドとは違い、ユーザーに複数のオブジェクトを選択させることができます。
ただ、これはユーザーが「ツールバー」の使い方を知っていること前提です。
このメソッドで表示されるツールバーはあまり分かりやすいものではなので、このメソッドを使う際はあらかじめユーザーに使い方を教えておいた方がいいと思います。
ユーザーが複数のオブジェクトを選択することのできる非常に利便性の高いメソッドなので、使うかどうかは置いておいてメソッドの存在は頭に入れておいた方がいいです。
CATIAマクロを本気で勉強するなら