CATDrawingとリンクしているドキュメントを一括で開くマクロ|CATIAマクロの作成方法

今回の記事はマクロ案募集よりいただいた内容です。
送って頂いた内容は以下のようなマクロです。

ワークベンチ: 
 CATDrawing

マクロ案: 
 CATDrawingからリンクしているCATPartやCATProductを開く際にデスクを開いてリンクを開いてます。
 CATdrawingから直接開けるマクロが欲しいです。

CATIA VBAで既存のドキュメントファイルを開くには「CATIA.Documents.Open(“パス")」と書くだけです。そこで今回重要になるのは“どうやってリンクされているドキュメントを取得するか"です。

VBAでのドキュメントの開き方についてはDocumentsオブジェクトページにもまとめてあるのであわせて参照下さい。

 

マクロの機能

今回作成したのはCATDrawingとリンクしているドキュメントを一括で開くマクロです。
アクティブなCATDrawingのすべてのシート内にあるすべてのビューに紐づいているドキュメントファイルを一括で開くことができます。

具体的な機能は以下のとおりです。

  マクロの機能まとめ ・アクティブなCATDrawingとリンクしているすべてのドキュメントを一括で開く
・リンクされているドキュメントはCATPart、CATProductのどちらも対応
 (CATProductはリンク元である親Productのみを開く)

 

サンプルコード

マクロのコードは以下のとおりです。

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

 

コード解説

アクティブドキュメント/変数定義

 'アクティブドキュメント定義
    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」にアクティブドキュメントを代入し、マクロの処理を続けます。

アクティブドキュメントが定義できたら、以降で必要になる変数をまとめて定義します。
それぞれの変数が何に使われるかはコメント文を参照下さい。
 

ビューリンクのパスをすべて取得

 'ビューリンクのパスをすべて取得
    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」の場合は無視するようにしています。

任意のビューにリンクされているドキュメントを取得するには下記のように書きます。

 icon-code ビューとリンクされているドキュメントを取得 

DrwaingViewオブジェクト.GenerativeBehavior.Document.Parent

この方法で取得されたドキュメントはCATPartの場合は「PartDocument」、CATProductの場合は「ProductDocument」として取得されます。今回はどちらの可能性もあるので取得したドキュメントを入れておく変数「linkdoc」はすべてのドキュメントタイプを包含する「Documentオブジェクト」として定義しています。

あとは取得したドキュメントに対して「FullNameプロパティ」を使えば、そのドキュメントのフルパスを取得することができます。

ここではまだ取得したドキュメントは開かずにフルパスのみを「path()」に保存していきます。このとき、同じドキュメントとリンクしているビューも複数ある可能性があるので、path()に格納する前にすでにそのパスが配列内に入っているのかを確認させます。

また、上記のサンプルコードではループ内処理の一部を「On Error Resume Next」で一時的にエラーを無視させています。これはシート内にリンクを持たないビューがいた時にエラーが発生するのをスルーするためのものです。
    

path()内のパスをすべて開く

    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メソッド」を使って下記のように書きます。

 icon-code 既存のドキュメントを開く 

Call CATIA.Documents.Open(“パス")

同オブジェクトの「NewFormメソッド」を使うことで読み取り専用として開くことも可能です。

今回開くべき「“パス"」は全て「path()」内に格納されているので、配列内ループで全てのパスに対して「Openメソッド」を使えば完了です。

 

まとめ

今回はCATDrawingとリンクしているドキュメントを一括で開くマクロについての内容でした。
やっていることは非常に単純で、リンクされているドキュメントファイルをすべて取得し、それらをすべて開いているだけです。

恐らく今回のコードで一番重要なのはリンクされているドキュメントのフルパスを取得する部分だと思います。サンプルコードでは2回に分けて取得していましたが、下記のように書くことで1行でビューとリンクしているドキュメントのフルパスを取得することができます。

 icon-code ビューとリンクされているドキュメントのフルパス 

DrwaingViewオブジェクト.GenerativeBehavior.Document.Parent.FullName

パスさえ取得できてしまえば「Documentsオブジェクト」の「Openメソッド」を使うだけなのですぐに理解できると思います。
 

サンプルマクロ集に戻る
目次へ戻る

 

 CATIAマクロを本気で勉強するなら

2024年8月26日CATIA,CATIAマクロ