CATDrawingのアクティブビューサイズの取得|CATIAマクロの作成方法
今回はVBAでCATDrawing上のアクティブビューのサイズを取得する方法を紹介していきます。
ビューサイズは「DrawingViewオブジェクト」の「sizeメソッド」を使うことで取得できます。
ただ少し厄介なのが単純に「sizeメソッド」を使うだけでは”都合のいい”の座標が取得できないです。
“都合のいい”座標にするにはsizeメソッドで取得した値を微修正する必要があります。
今回はそういった”都合のいい”座標について内容も含めて、アクティブビューのサイズを取得し上画像のように投影した形状を囲う四角形を作成する方法を詳しく解説していきます。
コピペですぐに使えるコードなのでぜひ参考にしてみて下さい。
アクティブビューのサイズ取得コード
CATDrawing上で下記コードを実行すると、
「アクティブビューの4隅の頂点座標」を取得することができます。
取得結果を目に見えるかたちで表示するため、ビューの4辺に直線を作成するようになっています。
これをうまく利用すればアクティブビュー内の指定した座標にテキストボックスを作成したり、番線を作成したりといろいろ活用方法が見えてくると思います。
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 |
Sub CATMain() 'アクティブドキュメント定義 If TypeName(CATIA.ActiveDocument) <> "DrawingDocument" Then MsgBox "このマクロはDrawingDocument専用です。" & vbLf & _ "CATDrawingに切り替えて実行してください。" Exit Sub End If Dim doc As DrawingDocument Set doc = CATIA.ActiveDocument 'アクティブシート定義 Dim sht As DrawingSheet Set sht = doc.Sheets.ActiveSheet 'アクティブビュー定義 Dim vw 'As DrawingView Set vw = sht.Views.ActiveView 'Factory2D定義 Dim f2d As Factory2D Set f2d = vw.Factory2D 'ビューのサイズ取得 Dim sizeXY(3) 'As Double vw.size sizeXY 'アクティブビューの座標を取得 Dim vwX As Double Dim vwY As Double vwX = vw.xAxisData 'アクティブビューのX座標 vwY = vw.yAxisData 'アクティブビューのY座標 'アクティブビューの外枠を直線作成 Dim lines(3) As Line2D Set lines(0) = f2d.CreateLine(sizeXY(0) - vwX, sizeXY(2) - vwY, sizeXY(1) - vwX, sizeXY(2) - vwY) '外枠左側 Set lines(1) = f2d.CreateLine(sizeXY(0) - vwX, sizeXY(2) - vwY, sizeXY(0) - vwX, sizeXY(3) - vwY) '外枠下側 Set lines(2) = f2d.CreateLine(sizeXY(1) - vwX, sizeXY(2) - vwY, sizeXY(1) - vwX, sizeXY(3) - vwY) '外枠右側 Set lines(3) = f2d.CreateLine(sizeXY(0) - vwX, sizeXY(3) - vwY, sizeXY(1) - vwX, sizeXY(3) - vwY) '外枠上側 End Sub |
コード解説
コード自体は長いですが、やっていることはあまり難しいものではありません。
ただ、少し頭をひねらないと思いつかない方法です。
アクティブドキュメント等定義
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
'アクティブドキュメント定義 If TypeName(CATIA.ActiveDocument) <> "DrawingDocument" Then MsgBox "このマクロはDrawingDocument専用です。" & vbLf & _ "CATDrawingに切り替えて実行してください。" Exit Sub End If Dim doc As DrawingDocument Set doc = CATIA.ActiveDocument 'アクティブシート定義 Dim sht As DrawingSheet Set sht = doc.Sheets.ActiveSheet 'アクティブビュー定義 Dim vw 'As DrawingView ←Variant型にする Set vw = sht.Views.ActiveView 'Factory2D定義 Dim f2d As Factory2D Set f2d = vw.Factory2D |
まずはじめにアクティブドキュメントを定義をします。
今回のマクロはCATDrawingのみ有効なものなので、アクティブドキュメントがCATDrawing以外の場合はTypeName関数を使った条件分岐でマクロを終了するようにしています。つまり、アクティブドキュメントがCATDrawingの場合のみ変数「doc」にアクティブドキュメントを代入し、マクロの処理を続けます。
アクティブドキュメントが定義できたら、以降で使うためのオブジェクトをまとめて定義しておきます。ここでは下記の用途で各オブジェクトを定義しています。
DrawingSheetオブジェクト :下記内容取得用
DrawingViewオブジェクト :直線(四角形)作成用+ビュー座標取得用
Factory2Dオブジェクト : 直線(四角形)作成用
ここで注意しないといけないのは「DrawingViewオブジェクト」は宣言する際にオブジェクトタイプを指定しないというところです。(つまりはVariant型で宣言)
これは宣言をVariant型にしないと「sizeメソッド」が使用できないためです。
CATIA VBAではオブジェクトなどをしっかり宣言していると下記のようなエラーが発生する不具合?をよく目にします。当サイトでよく使用している「SelectElement2メソッド」をSelection型で宣言しないのもこれが原因です。
CATIA VBAで上記のエラーが発生したら、まずは一旦そのエラーが発生しているプロパティ/メソッドのオブジェクトをVariant型で宣言してみて下さい。コードの書き方が間違っていなければほぼ確実に突破できるはずです。
ビューサイズの取得
1 2 3 4 5 6 7 8 9 |
'ビューのサイズ取得 Dim sizeXY(3) 'As Double vw.size sizeXY 'アクティブビューの座標を取得 Dim vwX As Double Dim vwY As Double vwX = vw.xAxisData 'アクティブビューのX座標 vwY = vw.yAxisData 'アクティブビューのY座標 |
次にアクティブビュー(vw)のサイズを取得していきます。
サイズの取得はこれまでにもいってきたとおり「sizeメソッド」を使います。
「sizeメソッド」は取得した値を格納するための配列が引数として必要です。
取得できる値は「最小X座標」「最大X座標」「最小Y座標」「最大Y座標」の4つなので、0スタートの配列としては「sizXY(3)」と宣言しておきます。
これにより取得できた値は下記の通り配列に格納されます。
sizeXY(0) : 最小X座標
sizeXY(1) : 最大X座標
sizeXY(2) : 最小Y座標
sizeXY(3) : 最大Y座標
注意しないといけないのはこのメソッドで取得した座標は、基準がシート座標(絶対座標)となっているところです。つまり、このままではアクティブビュー内の座標としては扱えないということです。
というわけでアクティブビュー内での座標に変換してあげる必要があります。
やり方は簡単で、アクティブビューの原点がシートのどの座標にあるかを調べるだけです。
DrawingViewオブジェクトのプロパティ「xAxisData」「yAxisData」を使えば、アクティブビューの原点座標をシートの座標基準で取得することができます。
あとはここで取得した座標を組み合わせて簡単な計算をすれば、シートの四隅の頂点座標をアクティブビュー基準で取得することができます。
アクティブビューの外枠を直線作成
1 2 3 4 5 6 |
'アクティブビューの外枠を直線作成 Dim lines(3) As Line2D Set lines(0) = f2d.CreateLine(sizeXY(0) - vwX, sizeXY(2) - vwY, sizeXY(1) - vwX, sizeXY(2) - vwY) '外枠左側 Set lines(1) = f2d.CreateLine(sizeXY(0) - vwX, sizeXY(2) - vwY, sizeXY(0) - vwX, sizeXY(3) - vwY) '外枠下側 Set lines(2) = f2d.CreateLine(sizeXY(1) - vwX, sizeXY(2) - vwY, sizeXY(1) - vwX, sizeXY(3) - vwY) '外枠右側 Set lines(3) = f2d.CreateLine(sizeXY(0) - vwX, sizeXY(3) - vwY, sizeXY(1) - vwX, sizeXY(3) - vwY) '外枠上側 |
最後に「Factory2Dオブジェクト」を使ってアクティブビューを囲む四角形を作成します。
基準がすべてシート座標となっているためビューサイズの座標をアクティブビューの座標で引けば、アクティブビュー基準での座標に変換することができます。
文字で見るとわかりづらいですが下図を見ればすぐに理解できると思います。
上記までで下図の通り座標を取得したので、あとは計算で4隅の座標は求められます。
直線は「Factory2Dオブジェクト」を使って下記のように書きます。
f2d.CreateLine(始点のX座標, 始点のY座標, 終点のX座標, 終点のY座標)
サンプルコードでは4隅の頂点座標を配列等には格納していませんが上記コードと照らし合わせてみれば、どこでどの座標を表しているかすぐにわかると思います。
まとめ
今回はCATDrawingでのアクティブビューサイズの取得する方法を紹介しました。
ビューの大きさ自体はDrawingViewオブジェクトの「sizeメソッド」で取得できます。
ただこれにより取得できる座標はシート基準となっています。
アクティブビュー上で使いたい場合はアクティブビューの原点座標を取得して、計算で導き出す必要があるので適宜使い分けて使用しましょう。