CATDrawingでクリックした場所の座標を取得する[IndicateOrSelectElement2Dメソッド]|CATIAマクロの作成方法
今回は「Selectionオブジェクト」の『IndicateOrSelectElement2Dメソッド』の使い方を解説していきます。
『IndicateOrSelectElement2Dメソッド』は「SelectElement2メソッド」と同じくマクロ実行中にユーザー選択のフェーズが発生し、ユーザーのクリックした地点の座標を取得することができるメソッドです。
このメソッドによりユーザーの選択した位置にテキストボックスを作成したり、テーブルを作成したりすることが可能になります。
基本的に『IndicateOrSelectElement2Dメソッド』は定型文なのでコピペだけでも使用可能です。
ある程度の使い方を理解したら、本ページのコピペ用コードをそのままご利用ください。
IndicateOrSelectElement2Dメソッドとは
冒頭でも触れましたが『IndicateOrSelectElement2Dメソッド』はマクロ実行中にユーザーがクリックした地点の2次元座標を取得することができるメソッドです。
CATPart内でも実行することは可能ですが、基本的にはCATDrawing内で使うメソッドです。
取得される座標はアクティブビュー内での座標となるので、同じ地点をクリックしたとしてもビューの位置やスケールによって取得される値は変化するので注意しましょう。
またクリックされた”場所”以外にクリックされた”点”の座標を取得することも可能になっています。
(SelectElement2メソッドで点を取得し「GetCoordinatesメソッド」を使うことでも取得可)
IndicateOrSelectElement2Dメソッドの使い方
IndicateOrSelectElement2Dメソッドを使うには以下のような構文を書きます。
※このメソッドはSelectionとして宣言するとエラーが発生するためVariant型で宣言します。
Set SEL = CATIA.ActiveDocument.Selection
Dim Status As String
Status = SEL.IndicateOrSelectElement2D(iMsg, iArray, iBoolean1, iBoolean2 _
iBoolean3, oObjSelFlg, oCoord)
このメソッドによってある地点がクリックされた場合 、文字列型の変数「Status」には“Normal”という文字列が返ってきます。また、選択前に[Esc]キーが押された場合は“Cancel”、[Ctrl]+[Z]キーが押された場合は”Undo”、[Ctrl]+[Y]キーが押された場合は“Redo”という文字列が返ってきます。(それ以外にも”MouseMove”が返される場合があります)
この返り値を使って「If Status <> “Normal” Then」という条件(正常に選択されなかった場合)の処理もあわせて書いておくのが一般的です。(SelectElement2と同じ考えです)
上記の構文が基本の書き方で青文字部分を自身のマクロに合わせて書き換えていきます。
それぞれの青文字部分に入れる内容は下記のとおりです。
選択時のメッセージの指定(iMsg)
iMsgにはユーザー選択時に表示するメッセージを入力します。
メッセージはメッセージボックスで立ち上がるわけではなくステータスバーに表示されます。
上記のように書くとユーザー選択時に以下のようにメッセージが表示されます。
選択フィルターの設定(iArray)
iArrayにはユーザー選択時にフィルターをかけたいオブジェクトのタイプ名が入った配列を入れます。
基本的にこのメソッドでは以下のように「”Point2D”」のみを入れておきます
事前選択の設定(iBoolean1)
iBoolean1には「False」もしくは「True」を入力します。
ここではユーザーが選択するとき、選択状態のものがすでにあった場合にその選択されているオブジェクトをどうするのかを指定することができます。
Falseの場合 → その選択を無視して次に選択されるオブジェクトを有効とします。
Trueの場合 → その選択を有効とします。(事前選択)
ツールチップの設定(iBoolean2)
iBoolean2には「False」もしくは「True」を入力します。
ここではツールチップの表示/非表示を指定することができます。
※ツールチップ:マウスをオブジェクトに重ねた時に表示される小さなメッセ―ジ
Falseの場合 → ツールチップを非表示
Trueの場合 → ツールチップを表示
CATIAの設定でツールチップが[表示]となっている場合はどちらを入力しても表示になります。
マウス移動の設定(iBoolean3)
iBoolean3には「False」もしくは「True」を入力します。
ここではマウス移動の取得の可否を設定することができます。
Falseの場合 → マウスの移動を取得しない
Trueの場合 → マウスの移動を取得する
Trueにした場合、マウスが図面内を移動した瞬間に「Status」に”MouseMove”が返されます。そのため、ここをTrueにした場合は「If Status = “MouseMove” Then」のような分岐を入れる必要があります。
オブジェクト選択確認の設定(oObjSelFlg)
oObjSelFlgには事前に宣言しておいたBoolean型の変数を入力します。
ここに入力した変数にオブジェクトが選択されたか、選択されなかったかが返されます。
例えば「Dim ObjSelFlg As Boolean」という変数を宣言したとき
このメソッドで点(オブジェクト)が選択された場合は「ObjSelFlg = True」、
点が選択されず図面内のある地点がクリックされた場合は「ObjSelFlg = False」となります。
座標取得の設定(oCoord)
oCoordには事前に宣言しておいたVariant型の空の配列を入力します。
ここに入力した配列にクリックした地点の座標が返されます。
例えば「Dim ClickCoord(1)」という配列を宣言したとき
「ClickCoord(0)=X座標」,「ClickCoord(1)=Y座標」というように返されます。
コピペ用コード
下記のコードは上記までの内容をまとめたサンプルコードです。
コードが難しく理解できない方は以下をコピペしてiMsg,iBoolean1, iBoolean2, iBoolean3, の中身だけ自分のマクロに合ったものに変更すればOKです。(iArray, oObjSelFlg, oCoordは変更する必要がない変数/配列なので宣言する名前以外は特にいじる必要はありません)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
Dim Sel 'As Selection このメソッドを使う場合「As Selection」と宣言しない Set Sel = Doc.Selection Dim msg As String msg = "点もしくは図面内の任意の地点をクリックしてください。" '選択時にステータスバーに表示されるメッセージの指定(iMsg) Dim Filter Filter = Array("Point2D") '点を選択可能にするフィルター(iArray) Dim ObjSelFlg As Boolean '受け取り用変数(oObjSelFlg) Dim ClickCoord(1) '受け取り用変数(oCoord) Dim Status As String Status = Sel.IndicateOrSelectElement2D(msg, Filter, False, False, False, ObjSelFlg, ClickCoord) If Status = "Normal" Then If ObjSelFlg = True Then '点が選択された場合は点の座標を取得する Dim SelPoint 'As Point2D Set SelPoint = Sel.Item(1).Value SelPoint.GetCoordinates ClickCoord '選択された点の座標ClickCoordに格納 End If Else MsgBox "キャンセルします。" Exit Sub End If |
上記コードの場合、ユーザーがクリックした地点の座標は「ClickCoord」という配列に格納されます。(ClickCoord(0) = X座標 , ClickCoord(1) = Y座標)
あとはこの「ClickCoord」を使ったコードを上記コード以降に書いておけば、ユーザーがクリックした地点の座標を使って何らかの処理を行うことができます。
サンプルマクロ
最後にIndicateOrSelectElement2Dメソッドを使った簡単なサンプルマクロを紹介します。
ここで紹介するマクロは「クリックした位置にテキストを作成するマクロ」です。
既存の[テキスト]コマンドとほとんど同じような機能ですが、ここで重要なのはクリックした地点の座標を取得し、オブジェクト作成に利用することができるという点です。
これによりテキストだけでなく様々なオブジェクトに対して、ユーザーのクリックした地点の座標を利用することが可能になります。サンプルマクロの内容というよりは、どのようにして取得した座標を使っているのかを押さえておきましょう。
サンプルコード
以下のコードを実行後、CATDrawing内の任意の地点、もしくは点をクリックするとその位置に「temp」という文字列の入ったテキストボックスが作成されます。
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 |
Option Explicit Sub CATMain() If TypeName(CATIA.ActiveDocument) <> "DrawingDocument" Then MsgBox "CATDrawingのみ対応のマクロです。" Exit Sub End If Dim Doc As DrawingDocument Set Doc = CATIA.ActiveDocument Dim RootDraw As DrawingRoot Set RootDraw = Doc.DrawingRoot 'アクティブシートを定義 Dim ActSheet As DrawingSheet Set ActSheet = RootDraw.ActiveSheet 'アクティブビューを定義 Dim Actview As DrawingView Set Actview = ActSheet.Views.ActiveView Dim Sel 'As Selection Set Sel = Doc.Selection Sel.Clear Dim msg As String msg = "点もしくは図面内の任意の地点をクリックしてください。" Dim Filter Filter = Array("Point2D") Dim ObjSelFlg As Boolean Dim ClickCoord(1) Dim Status As String Status = Sel.IndicateOrSelectElement2D(msg, Filter, False, False, False, ObjSelFlg, ClickCoord) If Status = "Normal" Then If ObjSelFlg = True Then Dim SelPoint 'As Point2D Set SelPoint = Sel.Item(1).Value SelPoint.GetCoordinates ClickCoord End If Else MsgBox "キャンセルします。" Exit Sub End If Sel.Clear 'アクティブビューにテキストを作成 Dim Txt As DrawingText Set Txt = Actview.Texts.Add("temp", ClickCoord(0), ClickCoord(1)) '「temp」という文字列の入ったテキストボックスを作成 End Sub |
まとめ
今回は「IndicateOrSelectElement2Dメソッド」についての内容でした。
IndicateOrSelectElement2Dメソッドはユーザーのクリックした地点の座標を取得することができます。
CATDrawingではアクティブビューの違いにより同じ地点でも座標は別物となってしまいます。
しかし、このメソッドではアクティブビュー内での座標が取得されるため、取得した座標をそのまま利用すればアクティブビュー内の任意の位置にテキストやテーブルなどのオブジェクトを作成することができます。
IndicateOrSelectElement2Dメソッドは2次元座標を扱いますが、3次元座標を扱うことのできる『IndicateOrSelectElement3Dメソッド』というものも存在します。(こちらのメソッドは機会があれば詳細ページを作成します)
どちらもユーザーと対話することのできる(ユーザーが選択するフェーズが存在する)メソッドなので、よりフレキシブルなマクロを作成したい方はSelectElement系メソッドと同じようにどちらも押さえておきましょう。