マテリアルの名称をオブジェクト名に追記するマクロ|CATIAマクロの作成方法
今回の記事は「マクロ案」より頂いた内容です。
送って頂いた内容は以下のようなマクロです。
ワークベンチ: パートデザイン
マクロ案:
ボディやサーフェスの名称の後ろに、割り当てられたマテリアル名を一括で追記したい。
”ボディ1″→”ボディ1_metal”
”ボディ2″→”ボディ2_wood”
”サーフェス1″→”サーフェス1_stone”
今回のマクロで重要なのは「マテリアルが適用されているオブジェクト」をどうやって取得するかです。マテリアルに関しては「Parent」で適用されているオブジェクトが取得できるわけではないので、少しだけ厄介ですが方法がないわけではないでそちらを紹介していきます。
マクロの機能
今回作成したのはマテリアルの名称をオブジェクト名に追記するマクロです。
具体的な機能は以下のとおりです。
(パラメータ「マテリアル」の値をオブジェクト名に追記する)
・マテリアルが適用されている全オブジェクトが対象
サンプルコード
マクロのコードは以下のとおりです。
英語環境の場合はコードを少し書き換えないとエラーが発生するので注意してください。
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 |
Option Explicit Sub CATMain() 'アクティブドキュメント等定義 If TypeName(CATIA.ActiveDocument) <> "PartDocument" Then MsgBox "CATPartに切り替えてからマクロを実行してください。" Exit Sub End If Dim doc As PartDocument: Set doc = CATIA.ActiveDocument Dim pt As Part: Set pt = doc.Part Dim sel As Selection: Set sel = doc.Selection Dim i As Long Dim j As Long 'マテリアルパラメータをすべて取得 sel.Search ("(名前=マテリアル & ナレッジウェア.パラメータ),all") Dim parms As Collection Set parms = New Collection For i = 1 To sel.Count parms.Add sel.Item(i).Value Next i sel.Clear 'オブジェとマテリアル名の組み合わせをすべて取得 Dim objs As Collection: Set objs = New Collection Dim material_names As Collection: Set material_names = New Collection For i = 1 To parms.Count 'マテリアル取得 Dim material_name As String material_name = parms.Item(i).Value 'マテリアルが適用されているオブジェを取得 Dim obj_path As String obj_path = parms.Item(i).Name obj_path = Replace(obj_path, "\マテリアル", "") Dim path path = Split(obj_path, "\") Dim obj Dim key As String Set obj = pt For j = 0 To UBound(path) sel.Clear sel.Add obj key = "名前=" & path(j) & ",sel" sel.Search (key) Set obj = sel.Item(1).Value Next j 'オブジェクトとマテリアル名をコレクションに格納 objs.Add obj material_names.Add material_name Next i 'オブジェ名にマテリアルを追加 For i = 1 To objs.Count Set obj = objs.Item(i) material_name = material_names.Item(i) obj.Name = obj.Name & "_" & material_name Next i End Sub |
コード解説
アクティブドキュメント等定義
1 2 3 4 5 6 7 8 9 10 11 |
'アクティブドキュメント等定義 If TypeName(CATIA.ActiveDocument) <> "PartDocument" Then MsgBox "CATPartに切り替えてからマクロを実行してください。" Exit Sub End If Dim doc As PartDocument: Set doc = CATIA.ActiveDocument Dim pt As Part: Set pt = doc.Part Dim sel As Selection: Set sel = doc.Selection Dim i As Long Dim j As Long |
まずはじめにアクティブドキュメントを定義をします。
今回のマクロはCATPartのみ有効なものなので、アクティブドキュメントがCATPart以外の場合はTypeName関数を使った条件分岐でマクロを終了するようにしています。つまり、アクティブドキュメントがCATPartの場合のみ変数「doc」にアクティブドキュメントを代入し、マクロの処理を続けます。
アクティブドキュメントが定義できたら、「Partオブジェクト」と「Selectionオブジェクト」を定義します。また、あわせて以降のループ処理で使うカウント変数として「i」「j」も用意しておきます。
マテリアルパラメータをすべて取得
1 2 3 4 5 6 7 8 9 10 |
'マテリアルパラメータをすべて取得 sel.Search ("(名前=マテリアル & ナレッジウェア.パラメータ),all") Dim parms As Collection Set parms = New Collection For i = 1 To sel.Count parms.Add sel.Item(i).Value Next i sel.Clear |
つぎにマテリアルパラメータを取得し、「parms」というコレクションに全て格納します。
(参照:選択しているオブジェクトを一時保管する方法)
ここではドキュメント内にある「マテリアル」という名称のパラメータを全て取得しにいきます。
そのためマテリアルのパラメータ以外に「マテリアル」という名称のパラメータが存在しているとうまく実行できない可能性があるので注意しましょう。
オブジェとマテリアル名の組み合わせをすべて取得
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 |
'オブジェとマテリアル名の組み合わせをすべて取得 Dim objs As Collection: Set objs = New Collection Dim material_names As Collection: Set material_names = New Collection For i = 1 To parms.Count 'マテリアル取得 Dim material_name As String material_name = parms.Item(i).Value 'マテリアルが適用されているオブジェを取得 Dim obj_path As String obj_path = parms.Item(i).Name obj_path = Replace(obj_path, "\マテリアル", "") Dim path path = Split(obj_path, "\") Dim obj Dim key As String Set obj = pt For j = 0 To UBound(path) sel.Clear sel.Add obj key = "名前=" & path(j) & ",sel" sel.Search (key) Set obj = sel.Item(1).Value Next j 'オブジェクトとマテリアル名をコレクションに格納 objs.Add obj material_names.Add material_name Next i |
つぎに前項で取得した「parms」をもとに、それぞれのパラメータに対する「マテリアルが適用されているオブジェクト」と「マテリアルの名称」を取得しにいきます。「マテリアルが適用されているオブジェクト」は「objs」、「マテリアルの名称」は「material_names」に格納していきます。
マテリアルが適用されているオブジェクトは、パラメータの名前から取得していきます。
パラメータの名前はVBAで取得すると「Part1¥パーツボディー¥マテリアル」のように取得されます。
本コードでは、このパラメータの名前を「¥」で分割(Split)して、仕様ツリーの上から順に名称検索をかけてオブジェクトを取得しています。(※この部分は処理に時間がかかるため、もう少しいい方法があるかもしれません。)
例えば「Part1¥パーツボディー¥マテリアル」の場合は「パーツボディー」にマテリアルが適用されているということがわかるので、「Part1」の中の「パーツボディー」というように上から順にマテリアルが適用されているオブジェクトを取得しにいっています。
オブジェ名にマテリアルを追加
1 2 3 4 5 6 7 8 9 |
'オブジェ名にマテリアルを追加 For i = 1 To objs.Count Set obj = objs.Item(i) material_name = material_names.Item(i) obj.Name = obj.Name & "_" & material_name Next i |
最後にオブジェクト名にマテリアル名称を追加していきます。
これまでの処理から、名称を変更するオブジェクトは「objs」、追加するマテリアルの名称は「material_names」に格納されています。
これらのコレクション内でループをすれば、対象オブジェクトの名称を変更することができます。
まとめ
今回はマテリアルの名称をオブジェクト名に追記するマクロについての内容でした。
今回のマクロで重要なポイントは「マテリアルが適用されているオブジェクトの取得方法」と「マテリアル名称の取得方法」の2点です。
「マテリアルが適用されているオブジェクトの取得方法」はパラメータの名称(ex. Part1¥パーツボディー¥マテリアル)から取得することができ、「マテリアル名称の取得方法」は単純に「マテリアルパラメータ.Value」で取得することができます。この2点が取得できればあとは名称を変更するだけです。