選択したビューに対して任意のCATPartリンクを付けるマクロ|CATIAマクロの作成方法
今回の記事は「マクロ案」よりいただいた内容です。
送って頂いた内容は以下のようなマクロです。
ワークベンチ: drafting
マクロ案:
任意の一つの分離されている断面と任意の*.catpartをリンクさせるマクロを教えて頂きたいです。
出来れば、複数の断面及びビューに一気にリンク付けられるではなく、
断面一つずつ選んでリンクつけるマクロがあればありがたいです。(こんな使い方のケースもある為)
今回のマクロの機能は「選択したビューに対して任意のCATPartとリンクさせる」です。
本ページでやるマクロはビューが分離されていようが、何かとリンクされていようが一切関係なく、そのマクロで選択したCATPartがリンクの対象として新たに紐づけられるようになっています。
サンプルコードの内容がビューとドキュメントとを紐づける方法が理解できるので、複数のビューに一括でリンクを紐づけたい場合も同じような方法でできるのでぜひ理解してみて下さい。
マクロの機能
今回作成したのは選択したビューに対して任意のCATPartリンクを付けるマクロです。
具体的な機能は以下のとおりです。
・ビューはリンクがついている状態でも、分離(Isolate)されている状態でも対応可
※分離されたビュー上にある形状(元々投影形状だったもの)を削除する処理が含まれています
その処理によりビュー内にある円や直線などの2D形状はすべて削除されるので注意して下さい
VBAコード
コード全体は下記の通りです。
マクロ実行後に「①ビューを選択 → ②ドキュメントを切り替えPartを選択」と操作してください。
①で選択したビューのリンクが、②で選択したドキュメントになります。
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 |
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 |
コード解説
アクティブドキュメント等の定義
1 2 3 4 5 6 7 8 9 10 |
'アクティブドキュメント等の定義 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型で定義しておく必要があるので注意しましょう。
リンクを切り替えるビューをユーザー選択で取得
1 2 3 4 5 6 7 8 9 10 11 |
'リンクを切り替えるビューをユーザー選択で取得 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メソッドを使ってビューを取得します。
リンクドキュメントをユーザー選択で取得
1 2 3 4 5 6 7 8 |
'リンクドキュメントをユーザー選択で取得 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形状をすべて削除(分離用)
1 2 3 4 5 6 7 8 9 |
'ビュー内の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形状もまとめて消されてしまうので、使用用途に合わせこの部分の処理は削除するか書き換えるかをしてください。
ビューのリンクを削除
1 2 3 4 5 |
'ビューのリンクを削除 Dim lnk As DrawingViewGenerativeLinks Set lnk = vw.GenerativeLinks Call lnk.RemoveAllLinks |
次に先に取得したビューについているリンクを削除します。
分離されているビューの場合はこの処理は必要ありません。
ビューリンクの削除は「DrawingViewGenerativeLinksオブジェクト」の「RemoveAllLinksメソッド」を使います。
ビューのリンクを新たに設定
1 2 3 4 5 6 |
'ビューのリンクを新たに設定 Dim bhv As DrawingViewGenerativeBehavior Set bhv = vw.GenerativeBehavior bhv.Document = link_doc bhv.Update |
最後にリンクを消したビューに新たなドキュメントのリンクを付与します。
すでにあるビューに対してドキュメントリンクを付与するには「DrawingViewGenerativeBehaviorオブジェクト」の「Documentプロパティ」を使います。このとき同オブジェクトの「Updateメソッド」を使うことでビューを更新することができます。
まとめ
今回は選択したビューに対して任意のCATPartリンクを付けるマクロについての内容でした。
今回のマクロで重要なのはビューのリンクを扱うための
「DrawingViewGenerativeLinksオブジェクト」と
「DrawingViewGenerativeBehaviorオブジェクト」の2つのオブジェクトの存在です。
また、複数のドキュメント間を渡ってのユーザー選択を可能にするSelectElement4メソッドも重要な内容なので併せて理解しておきましょう。