選択したビューに対して任意のCATPartリンクを付けるマクロ|CATIAマクロの作成方法

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

ワークベンチ: drafting

マクロ案: 
任意の一つの分離されている断面と任意の*.catpartをリンクさせるマクロを教えて頂きたいです。
出来れば、複数の断面及びビューに一気にリンク付けられるではなく、
断面一つずつ選んでリンクつけるマクロがあればありがたいです。(こんな使い方のケースもある為)

今回のマクロの機能は「選択したビューに対して任意のCATPartとリンクさせる」です。
本ページでやるマクロはビューが分離されていようが、何かとリンクされていようが一切関係なく、そのマクロで選択したCATPartがリンクの対象として新たに紐づけられるようになっています。

サンプルコードの内容がビューとドキュメントとを紐づける方法が理解できるので、複数のビューに一括でリンクを紐づけたい場合も同じような方法でできるのでぜひ理解してみて下さい。

 

マクロの機能

今回作成したのは選択したビューに対して任意のCATPartリンクを付けるマクロです。
具体的な機能は以下のとおりです。

  マクロの機能まとめ ・選択したビューに任意のドキュメントリンクを付与する
・ビューはリンクがついている状態でも、分離(Isolate)されている状態でも対応可

※分離されたビュー上にある形状(元々投影形状だったもの)を削除する処理が含まれています
 その処理によりビュー内にある円や直線などの2D形状はすべて削除されるので注意して下さい

  

VBAコード

コード全体は下記の通りです。
マクロ実行後に「①ビューを選択 → ②ドキュメントを切り替えPartを選択」と操作してください。
①で選択したビューのリンクが、②で選択したドキュメントになります。

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 sel:                        Set sel = doc.Selection
    sel.Clear
    
 'リンクを切り替えるビューをユーザー選択で取得
    Dim filter:     filter = Array("DrawingView")
    Dim status As String
    status = sel.SelectElement2(filter, "リンクを付けるビューを選択してください", False)
    If status <> "Normal" Then
        MsgBox "キャンセルしました"
        Exit Sub
    End If
    
    Dim vw As DrawingView
    Set vw = sel.Item(1).Value
    
 'リンクドキュメントをユーザー選択で取得
    Dim link_doc As PartDocument
    filter = Array("Part")
    status = sel.SelectElement4(filter, "リンク対象のドキュメントに切り替えて下さい", "パーツ(Part)を選択してください", False, link_doc)
    If status <> "Normal" Then
        MsgBox "キャンセルしました"
        Exit Sub
    End If
    
 'ビュー内の2D形状をすべて削除(分離用)
    sel.Clear
    sel.Add vw
    sel.Search ("ドラフティング.曲線,sel")
    If sel.Count <> 0 Then
        sel.Delete
    Else
        sel.Clear
    End If
    
 'ビューのリンクを削除
    Dim lnk As DrawingViewGenerativeLinks
    Set lnk = vw.GenerativeLinks
    
    Call lnk.RemoveAllLinks
    
 'ビューのリンクを新たに設定
    Dim bhv As DrawingViewGenerativeBehavior
    Set bhv = vw.GenerativeBehavior
    
    bhv.Document = link_doc
    bhv.Update

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 sel:                        Set sel = doc.Selection
    sel.Clear

まずはじめにアクティブドキュメントを定義をします。
今回のマクロはCATDrawingのみ有効なものなので、アクティブドキュメントがCATDrawing以外の場合はTypeName関数を使った条件分岐でマクロを終了するようにしています。つまり、アクティブドキュメントがCATDrawingの場合のみ変数「doc」にアクティブドキュメントを代入し、マクロの処理を続けます。

アクティブドキュメントが定義できたらSelectionオブジェクトも合わせて定義します。以降で「SelectElement2メソッド」「SelectElement4メソッド」を使うためVariant型で定義しておく必要があるので注意しましょう。

 
リンクを切り替えるビューをユーザー選択で取得

 'リンクを切り替えるビューをユーザー選択で取得
    Dim filter:     filter = Array("DrawingView")
    Dim status As String
    status = sel.SelectElement2(filter, "リンクを付けるビューを選択してください", False)
    If status <> "Normal" Then
        MsgBox "キャンセルしました"
        Exit Sub
    End If
    
    Dim vw As DrawingView
    Set vw = sel.Item(1).Value

次にリンクを変更する(新たに追加する)ビューをユーザー選択により取得します。
ここではSelectionオブジェクトSelectElement2メソッドを使ってビューを取得します。

 
リンクドキュメントをユーザー選択で取得

 'リンクドキュメントをユーザー選択で取得
    Dim link_doc As PartDocument
    filter = Array("Part")
    status = sel.SelectElement4(filter, "リンク対象のドキュメントに切り替えて下さい", "パーツ(Part)を選択してください", False, link_doc)
    If status <> "Normal" Then
        MsgBox "キャンセルしました"
        Exit Sub
    End If

次に前項で取得したビューとリンクさせるCATPartをユーザー選択により取得します。
ここではSelectionオブジェクトSelectElement4メソッドを使ってリンクさせるドキュメントを取得します。本メソッドを使うことにより、ドキュメントを切り替えてのユーザー選択が可能になります。

よって手動でのビュー作成時と同じようにドキュメントを切り替えてリンクさせたいドキュメント内の何かしらをクリックします。(このときPartオブジェクトフィルターをかけているので、どこを選択しても返ってくる結果は同じです)

選択した結果は引数として入れている「link_doc」内に格納されます。
(詳しくはSelectElement4メソッドページを参照下さい)

 
ビュー内の2D形状をすべて削除(分離用)

 'ビュー内の2D形状をすべて削除(分離用)
    sel.Clear
    sel.Add vw
    sel.Search ("ドラフティング.曲線,sel")
    If sel.Count <> 0 Then
        sel.Delete
    Else
        sel.Clear
    End If

つぎにビュー内にある2D形状をすべて削除します。
ビューは分離した際に、もともと投影形状(生成項目)だった曲線などが、リンクを持たない2D形状変換されます。つまりこの状態で新たなドキュメントとリンクを紐づけてビューを更新しても、その2D形状はビュー内に残ってしまいます。

この処理は、そういった邪魔になった2D形状を排除するために行っている処理です。
ただ、自身で作成した直線や円などの2D形状もまとめて消されてしまうので、使用用途に合わせこの部分の処理は削除するか書き換えるかをしてください。

 
ビューのリンクを削除

 'ビューのリンクを削除
    Dim lnk As DrawingViewGenerativeLinks
    Set lnk = vw.GenerativeLinks
    
    Call lnk.RemoveAllLinks

次に先に取得したビューについているリンクを削除します。
分離されているビューの場合はこの処理は必要ありません。

ビューリンクの削除は「DrawingViewGenerativeLinksオブジェクト」の「RemoveAllLinksメソッド」を使います。

 
ビューのリンクを新たに設定

 'ビューのリンクを新たに設定
    Dim bhv As DrawingViewGenerativeBehavior
    Set bhv = vw.GenerativeBehavior
    
    bhv.Document = link_doc
    bhv.Update

最後にリンクを消したビューに新たなドキュメントのリンクを付与します。

すでにあるビューに対してドキュメントリンクを付与するには「DrawingViewGenerativeBehaviorオブジェクト」の「Documentプロパティ」を使います。このとき同オブジェクトの「Updateメソッド」を使うことでビューを更新することができます。

 

まとめ

今回は選択したビューに対して任意のCATPartリンクを付けるマクロについての内容でした。

今回のマクロで重要なのはビューのリンクを扱うための
DrawingViewGenerativeLinksオブジェクト」と
DrawingViewGenerativeBehaviorオブジェクト」の2つのオブジェクトの存在です。

また、複数のドキュメント間を渡ってのユーザー選択を可能にするSelectElement4メソッドも重要な内容なので併せて理解しておきましょう。
 

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

 

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

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