CATDrawingとリンクしているドキュメントを一括で開くマクロ|CATIAマクロの作成方法
今回の記事はマクロ案募集よりいただいた内容です。
送って頂いた内容は以下のようなマクロです。
ワークベンチ:
CATDrawingマクロ案:
CATDrawingからリンクしているCATPartやCATProductを開く際にデスクを開いてリンクを開いてます。
CATdrawingから直接開けるマクロが欲しいです。
CATIA VBAで既存のドキュメントファイルを開くには「CATIA.Documents.Open(“パス”)」と書くだけです。そこで今回重要になるのは“どうやってリンクされているドキュメントを取得するか”です。
VBAでのドキュメントの開き方についてはDocumentsオブジェクトページにもまとめてあるのであわせて参照下さい。
マクロの機能
今回作成したのはCATDrawingとリンクしているドキュメントを一括で開くマクロです。
アクティブなCATDrawingのすべてのシート内にあるすべてのビューに紐づいているドキュメントファイルを一括で開くことができます。
具体的な機能は以下のとおりです。
・リンクされているドキュメントはCATPart、CATProductのどちらも対応
(CATProductはリンク元である親Productのみを開く)
サンプルコード
マクロのコードは以下のとおりです。
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 |
Option Explicit 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 'シート内ループ用 Dim vw As DrawingView 'ビュー内ループ用 Dim linkdoc As Document 'リンクドキュメント Dim res As Variant '配列内チェック用 Dim path() As String 'リンクドキュメントのパス格納用 ReDim path(0) 'ビューリンクのパスをすべて取得 For Each sht In doc.Sheets 'シート内ループ For Each vw In sht.Views 'ビュー内ループ If Not (vw.Name = "Main View" Or vw.Name = "Background View") Then 'リンクドキュメント取得 On Error Resume Next Set linkdoc = vw.GenerativeBehavior.Document.Parent '配列内に存在してなければ配列を増やして格納 res = filter(path, linkdoc.FullName) If UBound(res) = -1 Then ReDim Preserve path(UBound(path) + 1) path(UBound(path)) = linkdoc.FullName End If On Error GoTo 0 End If Next vw Next sht If UBound(path) = 0 Then MsgBox "リンクされているドキュメントはありません。" Exit Sub End If 'path()内のパスをすべて開く Dim i As Integer For i = 1 To UBound(path) Call CATIA.Documents.Open(path(i)) Next i End Sub |
コード解説
アクティブドキュメント/変数定義
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
'アクティブドキュメント定義 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 'シート内ループ用 Dim vw As DrawingView 'ビュー内ループ用 Dim linkdoc As Document 'リンクドキュメント Dim res As Variant '配列内チェック用 Dim path() As String 'リンクドキュメントのパス格納用 ReDim path(0) |
まずはじめにアクティブドキュメントを定義をします。
今回のマクロはCATDrawingのみ有効なものなので、アクティブドキュメントがCATDrawing以外の場合はTypeName関数を使った条件分岐でマクロを終了するようにしています。つまり、アクティブドキュメントがCATDrawingの場合のみ変数「doc」にアクティブドキュメントを代入し、マクロの処理を続けます。
アクティブドキュメントが定義できたら、以降で必要になる変数をまとめて定義します。
それぞれの変数が何に使われるかはコメント文を参照下さい。
ビューリンクのパスをすべて取得
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
'ビューリンクのパスをすべて取得 For Each sht In doc.Sheets 'シート内ループ For Each vw In sht.Views 'ビュー内ループ If Not (vw.Name = "Main View" Or vw.Name = "Background View") Then 'リンクドキュメント取得 On Error Resume Next Set linkdoc = vw.GenerativeBehavior.Document.Parent '配列内に存在してなければ配列を増やして格納 res = filter(path, linkdoc.FullName) If UBound(res) = -1 Then ReDim Preserve path(UBound(path) + 1) path(UBound(path)) = linkdoc.FullName End If On Error GoTo 0 End If Next vw Next sht |
つぎにループ文を使ってアクティブドキュメント(CATDrawing)内にあるすべてのビューに対して”リンク元のドキュメントのパス”を取得するという処理を行います。
ビューは目には見えませんが「Main View」と「Background View」というものが設定されています。これらもビューとして認識されますが、リンクが紐づくことはないのでIf文で「Main View」と「Background View」の場合は無視するようにしています。
任意のビューにリンクされているドキュメントを取得するには下記のように書きます。
DrwaingViewオブジェクト.GenerativeBehavior.Document.Parent
この方法で取得されたドキュメントはCATPartの場合は「PartDocument」、CATProductの場合は「ProductDocument」として取得されます。今回はどちらの可能性もあるので取得したドキュメントを入れておく変数「linkdoc」はすべてのドキュメントタイプを包含する「Documentオブジェクト」として定義しています。
あとは取得したドキュメントに対して「FullNameプロパティ」を使えば、そのドキュメントのフルパスを取得することができます。
ここではまだ取得したドキュメントは開かずにフルパスのみを「path()」に保存していきます。このとき、同じドキュメントとリンクしているビューも複数ある可能性があるので、path()に格納する前にすでにそのパスが配列内に入っているのかを確認させます。
また、上記のサンプルコードではループ内処理の一部を「On Error Resume Next」で一時的にエラーを無視させています。これはシート内にリンクを持たないビューがいた時にエラーが発生するのをスルーするためのものです。
path()内のパスをすべて開く
1 2 3 4 5 6 7 8 9 10 |
If UBound(path) = 0 Then MsgBox "リンクされているドキュメントはありません。" Exit Sub End If 'path()内のパスをすべて開く Dim i As Integer For i = 1 To UBound(path) Call CATIA.Documents.Open(path(i)) Next i |
開きたいドキュメントのフルパスはすべて取得できたので、あとはそれらをすべて開くだけです。
既存のドキュメントを開くには冒頭でも説明した通り「Documentsオブジェクト」の「Openメソッド」を使って下記のように書きます。
Call CATIA.Documents.Open(“パス”)
同オブジェクトの「NewFormメソッド」を使うことで読み取り専用として開くことも可能です。
今回開くべき「“パス”」は全て「path()」内に格納されているので、配列内ループで全てのパスに対して「Openメソッド」を使えば完了です。
まとめ
今回はCATDrawingとリンクしているドキュメントを一括で開くマクロについての内容でした。
やっていることは非常に単純で、リンクされているドキュメントファイルをすべて取得し、それらをすべて開いているだけです。
恐らく今回のコードで一番重要なのはリンクされているドキュメントのフルパスを取得する部分だと思います。サンプルコードでは2回に分けて取得していましたが、下記のように書くことで1行でビューとリンクしているドキュメントのフルパスを取得することができます。
DrwaingViewオブジェクト.GenerativeBehavior.Document.Parent.FullName
パスさえ取得できてしまえば「Documentsオブジェクト」の「Openメソッド」を使うだけなのですぐに理解できると思います。