ビューを回転してキャプチャするマクロ|CATIAマクロの作成方法
今回の記事はマクロ案募集でいただいた内容です。
送って頂いた内容は以下のようなマクロです。
ワークベンチ: パートファイル
マクロ案:
現在のViewPointからX軸方向、Y軸方向、Z軸方向
それぞれに任意の角度(例えば90度)ずつ回転させてスクリーンショットを取得するマクロ
今回作成するマクロは指定した角度だけビューを回転しキャプチャするマクロです。
サンプルマクロでは簡単な単純なビューの回転しか行っていませんが、コードの内容を理解することで自分の好きなビューを指定することも可能になります。
マクロの機能
今回作成したマクロはビューを回転しキャプチャするマクロです。
指定した角度だけX,Y,Zそれぞれの軸を基準に回転させたビューでキャプチャを撮ります。
具体的な機能は以下のとおりです。
・ファイル名は「X軸回転.bmp」「Y軸回転.bmp」「Z軸回転.bmp」
・マクロ実行後にデスクトップに新規作成される「Capture 日時」フォルダに出力
・出力後はフォルダを開く
※注意点
・「Capture 日時」と同名のフォルダがデスクトップにある場合はマクロ中断
(日時には現在の「年/月/日/時/分/秒」が入力されるため、同名フォルダは存在しないはず )
サンプルコード
マクロのコードは以下のとおりです。
※保存場所のパスだけは自身の環境に合わせて書き直す必要あるので注意して下さい。
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 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
Sub CATMain() 'Window定義 Dim win As Window Set win = CATIA.ActiveWindow 'Viewer3D定義 Dim vwr 'As Viewer3D Set vwr = win.Viewers.Item(1) '方向の成分定義 Dim Xdir, Ydir, Zdir Xdir = Array(1, 0, 0) 'X成分配列 Ydir = Array(0, 1, 0) 'Y成分配列 Zdir = Array(0, 0, 1) 'Z成分配列 'ビュー回転の角度を取得 Dim res As String res = InputBox("角度を入力して下さい。", "角度入力", 90) If res = "" Then Exit Sub 'キャプチャを保存するためのフォルダを作成 Dim FileSys 'As FileSystem Set FileSys = CATIA.FileSystem Dim SavePath As String SavePath = "C:\Users\ユーザー名\Desktop" '保存場所のパスを入力 ※必ず自分の環境のものに書き換えて下さい Dim FoldName As String FoldName = "Capture " & Year(Date) & Month(Date) & Day(Date) & _ Hour(Time) & Minute(Time) & Second(Time) '作成するフォルダ名を指定 Dim FoldPath As String FoldPath = SavePath & "\" & FoldName '"'新規フォルダのパス Dim FoldExi As Boolean FoldExi = FileSys.FolderExists(FoldPath) If FoldExi = True Then MsgBox "予期せぬエラーが発生しました。" & vbLf & _ "再度マクロを実行し直してください。" Exit Sub End If Dim CreateFold As Folder Set CreateFold = FileSys.CreateFolder(FoldPath) 'ビュー操作+キャプチャ保存 Call vwr.Rotate(Xdir, res) vwr.Update Call vwr.CaptureToFile(catCaptureFormatBMP, FoldPath + "\X軸回転.bmp") Call vwr.Rotate(Xdir, -res) vwr.Update Call vwr.Rotate(Ydir, res) vwr.Update Call vwr.CaptureToFile(catCaptureFormatBMP, FoldPath + "\Y軸回転.bmp") Call vwr.Rotate(Ydir, -res) vwr.Update Call vwr.Rotate(Zdir, res) vwr.Update Call vwr.CaptureToFile(catCaptureFormatBMP, FoldPath + "\Z軸回転.bmp") Call vwr.Rotate(Zdir, -res) vwr.Update 'フォルダの表示 Shell "C:\Windows\Explorer.exe " & FoldPath, vbNormalFocus End Sub |
コード解説
WindowとViewer3Dを定義
1 2 3 4 5 6 7 |
'Window定義 Dim win As Window Set win = CATIA.ActiveWindow 'Viewer3D定義 Dim vwr 'As Viewer3D Set vwr = win.Viewers.Item(1) |
まずはじめにWindowとViewer3Dを定義をします。
VBAでビュー関連の操作をする場合は、Viewerオブジェクトを定義します。
(「Viewerオブジェクト」はビューが2Dの場合に使う「Viewer2Dオブジェクト」と3Dの場合に使う「Viewer3Dオブジェクト」の2つを包含しています)
多くのマクロではDocumentオブジェクトを定義しますが、今回のようなビューの操作を行う場合は必ずしもDocumentオブジェクトを定義する必要はありません。
方向の成分定義
1 2 3 4 5 |
'方向の成分定義 Dim Xdir, Ydir, Zdir Xdir = Array(1, 0, 0) 'X成分配列 Ydir = Array(0, 1, 0) 'Y成分配列 Zdir = Array(0, 0, 1) 'Z成分配列 |
次にX軸、Y軸、Z軸の成分を配列として定義しておきます。
これはビューの回転を行う際に、回転軸の成分配列が必要になるためです。
今回のサンプルマクロではX軸、Y軸、Z軸の3軸のみにしか対応していませんが、この成分配列の中身を変えることで任意の方向を軸にすることが可能です。
任意の直線の成分配列を取得する方法は下記ページを参照下さい。
方向の成分定義
1 2 3 4 |
'ビュー回転の角度を取得 Dim res As String res = InputBox("角度を入力して下さい。", "角度入力", 90) If res = "" Then Exit Sub |
InputBox関数を使ってビューの回転角度を取得します。
書き出し用のフォルダを作成
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 FileSys 'As FileSystem Set FileSys = CATIA.FileSystem Dim SavePath As String SavePath = "C:\Users\ユーザー名\Desktop" '保存場所のパスを入力 ※必ず自分の環境のものに書き換えて下さい Dim FoldName As String FoldName = "Capture " & Year(Date) & Month(Date) & Day(Date) & _ Hour(Time) & Minute(Time) & Second(Time) '作成するフォルダ名を指定 Dim FoldPath As String FoldPath = SavePath & "\" & FoldName '"'新規フォルダのパス Dim FoldExi As Boolean FoldExi = FileSys.FolderExists(FoldPath) If FoldExi = True Then MsgBox "予期せぬエラーが発生しました。" & vbLf & _ "再度マクロを実行し直してください。" Exit Sub End If Dim CreateFold As Folder Set CreateFold = FileSys.CreateFolder(FoldPath) |
キャプチャを保存するためのフォルダを作成します。
まずは保存場所のパスを取得します。
上記のコードでは保存場所を「SavePath = “C:\Users\ユーザー名\Desktop”」
つまりはデスクトップとしています。
※再三の注意となりますがここのパスはご自身のPCのパスに書き換えて下さい。
多くの場合、「ユーザー名」の部分を自分のものにすれば問題ないと思います。
次に、作成するフォルダの名称を指定します。
上記コードでは「Capture 日時」というフォルダ名で作成しています。
(日時には現状の日時の年から秒までを取得し、その数字の羅列を入力しています。
たとえば2020年1月2日3時4分56秒の場合、「20200102030456」と入力されます。)
このようにフォルダ名を時間によって変更させることで
デスクトップ上に同じフォルダが存在しないようにしています。
ただ必ずしも存在しないとは言えないので
万が一同じフォルダが存在した場合にはマクロを終了するようにしています。
フォルダの存在を確認するには「FileSystemオブジェクト」の「FolderExistsメソッド」を使います。
最後に、これまでに決めた「保存場所」と「フォルダ名」を組み合わせてフォルダを新規作成します。
フォルダの作成は「FileSystemオブジェクト」の「CreateFolderメソッド」を使って行います。
「FolderExistsメソッド」「CreateFolderメソッド」の使い方は下記ページを参照ください。
ビュー操作+キャプチャ保存
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
'ビュー操作+キャプチャ保存 Call vwr.Rotate(Xdir, res) vwr.Update Call vwr.CaptureToFile(catCaptureFormatBMP, FoldPath + "\X軸回転.bmp") Call vwr.Rotate(Xdir, -res) vwr.Update Call vwr.Rotate(Ydir, res) vwr.Update Call vwr.CaptureToFile(catCaptureFormatBMP, FoldPath + "\Y軸回転.bmp") Call vwr.Rotate(Ydir, -res) vwr.Update Call vwr.Rotate(Zdir, res) vwr.Update Call vwr.CaptureToFile(catCaptureFormatBMP, FoldPath + "\Z軸回転.bmp") Call vwr.Rotate(Zdir, -res) vwr.Update |
今回のマクロのメインの部分の処理「ビューの回転」と「キャプチャ」を行います。
ビューの回転は先に定義している
「Viewer3Dオブジェクト」の「Rotateメソッド」を使い以下のように書きます。
Viewer3Dオブジェクト.Rotate 軸成分配列, 角度
軸成分配列には回転の軸となる方向の成分が入った配列を入力します。
角度にはビューの回転角度を入力します。
ビュー回転後には「Viewerオブジェクト.Update」と書いて、ビューを更新する必要があります。
これをしないとビューの回転はされないので注意しましょう。
ビューのキャプチャは
「Viewerオブジェクト」の「CaptureToFileメソッド」を使い以下のように書きます。
Viewerオブジェクト.CaptureToFile フォーマット, ファイルパス
フォーマットには保存する画像ファイルのフォーマットを下記から選びいずれかを入力します。
.jpeg → catCaptureFormatJPEG
.cgm → catCaptureFormatCGM
.emf → catCaptureFormatEMF
.tiff → catCaptureFormatTIFF
.tiff → catCaptureFormatTIFFGreyScale ※グレースケール(白黒)
.bmp → catCaptureFormatBMP
ファイルパスには保存する画像ファイルのフルパスを入力します。
たとえば「”C:\Users\ユーザー名\Desktop\1.jpeg”」と入力すれば、Desktopに「1.jpeg」というファイル名でキャプチャした画像が保存されます。
ファイルパスに入れる拡張子はフォーマットと合わせる必要があるので注意しましょう。
あとは上記の2つのコードを使って
「ビューの回転」⇔「キャプチャ」と繰り返すだけです。
フォルダの表示
1 2 |
'フォルダの表示 Shell "C:\Windows\Explorer.exe " & FoldPath, vbNormalFocus |
最後にデスクトップに作成したフォルダを「Shell関数」を使って開きます。
Shell関数についてはExcelマクロでもよく使われ、多くの解説ページがあるためここでは割愛します。
まとめ
今回は任意のビューを回転させキャプチャをするマクロについての内容でした。
サンプルマクロでは「Rotateメソッド」を使って回転しか行いませんでしたが、同オブジェクトの「Translateメソッド」を使うことでビューの平行移動も可能になります。
また、ループ文と組み合わせることでビューの1回転を複数に分割し、それぞれ任意の角度ずつのキャプチャを撮ることも可能になります。
今回の内容はかなり基本的な内容なので、ぜひいろいろ書き足して各々が使いやすいマクロに改良してみて下さい。