マクロで選択した円の中心座標を取得する|CATIAマクロの作成方法
今回の記事は「お問い合わせ」でいただいた内容です。
送って頂いた内容は以下のようなマクロです。
ソリッドのエッジから中心点を求めるマクロ
今回のマクロは「Selectionオブジェクト」「Measurableオブジェクト」を使用しています。
どちらも上記リンク先のページで詳しく解説しているので、あわせてご確認ください。
※本マクロはCATPartの座標にのみ対応しています。
CATProduct上での座標を取得したい場合は以下のページを参照ください。
「選択した円の中心座標を取得する(Product.ver)」
完成コード
選択したエッジ(正円)の中心点の座標を取得するコードは以下のとおりです。
以下のコードの場合「getvalues」という配列の0番目から順にX,Y,Z座標が格納されていきます。
Sub CATMain()
On Error Resume Next
Dim DOC As Document
Set DOC = CATIA.ActiveDocument
Dim SEL 'As Selectionで宣言するとエラーが出るのでVariant型(データ型未入力)で宣言
Set SEL = DOC.Selection
Dim InputType(0)
InputType(0) = "Edge" 'エッジのみ選択
Dim Msg As String
Msg = "穴(エッジ)を選択してください。" 'ステータスバーのメッセージ
Dim Status As String
Status = SEL.SelectElement2(InputType, Msg, False)
If ((Status = "Cancel") Or (Status = "Undo")) Then
Exit Sub
End If
Dim SelEdge As Reference
Set SelEdge = SEL.Item(1).Reference
Dim SPA As Workbench
Set SPA = DOC.GetWorkbench("SPAWorkbench") 'SPAワークベンチの定義
Dim MyMeasure 'As Measurableで宣言するとエラーが出るのでVariant型(データ型未入力)で宣言
Set MyMeasure = SPA.GetMeasurable(SelEdge)
Dim getvalues(2) As Variant 'X,Y,Z座標を取得する用の配列を用意
MyMeasure.GetCenter getvalues 'MeasureableオブジェクトのGetCenterメソッドを使用
MsgBox "X = " & getvalues(0) & vbLf & _
"Y = " & getvalues(1) & vbLf & _
"Z = " & getvalues(2) '取得した座標を表示
End Sub
コード解説
ここでは上記マクロコードの核となる部分のコードを解説していきます。
詳しくはそれぞれのオブジェクトの詳細ページを確認ください。
エッジの選択と取得
事前に選択しているオブジェクトを取得するのではなく、マクロの実行中にオブジェクトを選択&取得するには「Selectionオブジェクト」の「SelectElement2メソッド」を使用します。SelectElement2メソッドは以下のように書きます。
Dim DOC As Document
Set DOC = CATIA.ActiveDocument
Dim SEL
'As Selection
Set SEL = DOC.Selection
Dim InputType(0)
InputType(0) = “Edge"
Dim Msg As String
Msg = “穴(エッジ)を選択してください。"
Dim Status As String
Status = SEL.SelectElement2(InputType, Msg, False)
If ((Status = “Cancel") Or (Status = “Undo")) Then
Exit Sub
End If
Dim SelEdge As Reference
Set SelEdge = SEL.Item(1).Reference
InputTypeで選択できるオブジェクトのタイプを指定、
Msgで選択時のメッセージ(ステータスバーに表示)を指定しています。
最終的に選択したオブジェクト(今回の場合はエッジ)は変数SelEdgeに格納されます。
次にこの変数SelEdgeを使って変数の中にあるエッジの座標を取得していきます。
取得したエッジの中心座標を取得
座標の取得をはじめ、長さや角度などの
[要素を測定]コマンドや
[2要素間の測定]コマンドを使って取得できるようなものはVBAでは「Measurableオブジェクト」を使って取得します。
座標は「GetCenterメソッド」を使い、以下のように書くことで取得することができます。
Dim SPA As Workbench
Set SPA = DOC.GetWorkbench(“SPAWorkbench")
Dim MyMeasure 'As Measurable
Set MyMeasure = SPA.GetMeasurable(SelEdge)
Dim getvalues(2) As Variant
MyMeasure.GetCenter
getvalues
ここで注意しないといけないのはMeasurableオブジェクトを宣言する時に「Dim MyMeasure As Measurable」と書かない点です。Measurableオブジェクトとして宣言してしまうと「GetCenterメソッド」でエラーが発生してしまうためVariant型として宣言する必要があります。
座標の取得自体は一番最後の「MyMeasure.GetCenter
getvalues」で行っています。
取得した座標は配列getvaluesの中に格納されます。
※X座標はgetvalues(0)、Y座標はgetvalues(1)、Z座標はgetvalues(2)に格納されます。
ヘルプの『Infrastructure Automation Objects』ページでは「GetCenterメソッド」の例には以下のように書かれているものもありますが、これは間違いです。
正しくは「GetCOGPosition」ではなく「GetCenter」と書きます。
Dim Coordinates (2)
NewMeasurable.GetCOGPosition Coordinates
バージョンによっては修正されているものもあるかもしれませんが、ヘルプにはこういった間違った記載がいくつかあります。エラーが起きてしまう場合はメソッド名と例文に使われているコードが同じ文字列になっているかを確認しましょう。
※ちなみにCOGとは「Center of Gravity」の略で『重心』を意味します。
応用:エッジ選択時にメッセージボックスを表示する
マクロで「SelectElement2メソッド」を使って何かを取得させるとき、ステータスバーにメッセージを表示することはできますが正直わかりづらいですし気づかない場合が多いと思います。
できることであればCATIAのダイアログボックスのように、常にメッセージが別ウィンドウで表示されている状態でオブジェクトを選択できるようにするのが理想です。
しかしMsgBox関数を使ってメッセージを表示しても、メッセージボックスが開いている間はCATIAを操作することができません。
こういった場合は少し無理やりになってしまいますがユーザーフォームを使うことで解決することができます。
応用コード
「Userform1」という名前のユーザーフォームを1つと、その上に「Label1」という名前のラベルを1つどこでもいいので配置してください。(詳しくは直線のベクトルを取得してリストに表示するマクロの[マクロ実行のための事前準備]を参照)
上記のようなユーザーフォームを作成したら以下のコードを実行します。
Sub CATMain()
On Error Resume Next
Dim DOC As Document
Set DOC = CATIA.ActiveDocument
Dim SEL
Set SEL = DOC.Selection
Dim InputType(0)
InputType(0) = "Edge"
Dim Msg As String
Msg = "穴(エッジ)を選択してください。"
UserForm1.Show vbModeless 'ユーザーフォームをモードレスで開く
'ユーザーフォームの位置設定**************************************
With UserForm1
.Height = 70
.Width = 120
.Caption = "エッジ選択"
End With
With UserForm1.Label1
.Caption = "穴(エッジ)を選択してください" & vbLf & vbLf & "(ESCで終了)"
.Left = 10
.Top = 10
.Height = 50
.Width = 200
End With
'*****************************************************************
Dim Status As String
Status = SEL.SelectElement2(InputType, Msg, False)
If ((Status = "Cancel") Or (Status = "Undo")) Then
Unload UserForm1 'ユーザーフォームを閉じる
Exit Sub
End If
Unload UserForm1 'ユーザーフォームを閉じる
Dim SelEdge As Reference
Set SelEdge = SEL.Item(1).Reference
Dim SPA As Workbench
Set SPA = DOC.GetWorkbench("SPAWorkbench")
Dim MyMeasure
Set MyMeasure = SPA.GetMeasurable(SelEdge)
Dim getvalues(2) As Variant
MyMeasure.GetCenter getvalues
MsgBox "X = " & getvalues(0) & vbLf & _
"Y = " & getvalues(1) & vbLf & _
"Z = " & getvalues(2)
End Sub
※実行自体はできると思いますが、正円以外のエッジを触ったっときの対応のような細かいエラー処理は行っていないため、操作内容によってはエラーが出ます。
上記のコードを実行すると以下のようにメッセージを表示しながらも、エッジを触ることのできる状態にすることができます。
上記のコードではユーザーフォームの大きさやメッセージ内容しか変更していませんが、表示位置を変更したり、OKボタンやキャンセルボタンを付けたりすることもできるのでいろいろ応用が利きます。
メッセージを表示しながらCATIAも同時に操作したい場合はこのようにユーザーフォームを使い「UserForm1.Show vbModeless」とモードレスで開くことで再現することができます。
まとめ
今回は選択したエッジ(正円)の中心座標値を取得するコード紹介でした。
このコードでは主に「Selectionオブジェクト」と「Measurableオブジェクト」の2つをメインに処理を行っているため、これを機にどちらのオブジェクトでどのようなことができるのかも学んでみて下さい。
最後に紹介したユーザーフォームでメッセージボックスの代わりをするのも多くの場面で使えるので覚えておくといつか役に立つかもしれません。
CATIAマクロを本気で勉強するなら









