要素の名前を連番にするマクロ|CATIAマクロの作成方法
今回の記事はマクロ案募集でいただいた内容です。
恐らくこの案を下さった方の操作環境は「英語」のように感じたので、ここでは英語環境向けに書いていきます。(日本語環境はコードのほんの一部だけ変える必要があるので注意して下さい。)
※マクロ案は「目次」で随時募集中なのでぜひご利用下さい。
(「お問い合わせ」もしくはTwitterのDMでも可)
マクロ初心者の方にはかなり役立つ内容になっていると思います!
作成するマクロの内容
今回作成するマクロは「要素別に名前が連番になるようなマクロ」です。
マクロ実行後に形状セットを選択したら、その形状セット内にある要素の名称を連番にするという機能にしていきます。(マクロ実行後に形状セットを選択という部分が今回のミソ)
はじめから全ての要素(点やワイヤー、ボリューム等)に対応させようとすると、ややこしくなり理解しづらくなるので、まずはサーフェスのみに対応したマクロでイメージをつかんでいきましょう。
マクロコード例
主にマクロの流れとしては以下の操作を行います。
①「Selectionオブジェクト」の「Search」メソッドを使って、サーフェスを選択する
② 選択したサーフェスに対して上から順に「.1」「.2」「.3」と連番の名前をつけていく
※今回の構文はSelectionオブジェクトをメインに使っていくので、Selectionオブジェクトをあまり理解していないという方は「Selectionオブジェクト」ページを見ながら進めることをオススメします。
作成の流れのイメージが付きやすいように、先に完成コードを貼っておきます。
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 |
Sub CATMain() Dim DOC As PartDocument Set DOC = CATIA.ActiveDocument Dim SEL 'As Selection 'As Selectionにすると※1でエラーが発生するのでVariant型を使う Set SEL = DOC.Selection SEL.Clear '選択状態を解除 '※1---------------------------------- On Error Resume Next Dim FilterArray(0) FilterArray(0) = "HybridBody" Dim Msg As String Msg = "形状セットを選択してください。" Select Case SEL.SelectElement2(FilterArray, Msg, False) Case "cancel", "undo", "redo" Exit Sub End Select Dim SELHB As AnyObject Set SELHB = SEL.Item(1).Value '------------------------------------ SEL.Search ("type=Surface,sel") 'サーフェスで検索&選択(日本語版は「Surface」の部分を「サーフェス」(半角)に変更) Dim i As Integer For i = 1 To SEL.Count '選択しているサーフェスの個数回のループ SEL.Item(i).Value.Name = "Surface." & i 'i番目のサーフェスに「Surface.i」という名前を付ける Next i SEL.Clear '選択状態を解除 End Sub |
少し難しいメソッドを使っていますがこれが非常に重要ですよ!
マクロコードの解説
それでは上から順に何をしているのかを詳しく見ていきましょう。
3~4行
Dim DOC As PartDocument
Set DOC = CATIA.ActiveDocument
まずは基本となるドキュメントの宣言/定義を行います。
ココがわからない方は「VBAでオブジェクトを取得1」のページを参照ください。
6~9行
Dim SEL
Set SEL = DOC.Selection
SEL.Clear
ドキュメントを定義したら「Selectionオブジェクト」を使うための変数「SEL」を宣言します。
ここで重要なのは「As Selection」と書かないで、Variant型の変数として宣言するという点です。
これはこの後に使用する「SelectElement2メソッド」がVariant型にしか対応していないためです。
変数の宣言/定義が終わったら「SEL.Clear」と書いて、選択状態を一旦すべて解除します。
これはマクロ実行前に何かを選択していた場合に何か悪さをおこす可能性があるためです。
11~27行(※1)
Dim FilterArray(0)
FilterArray(0) = “HybridBody”
Dim Msg As String
Msg = “形状セットを選択してください。”
Select Case SEL.SelectElement2(FilterArray, Msg, False)
Case “cancel”, “undo”, “redo”
Exit Sub
End Select
Dim SELHB As AnyObject
Set SELHB = SEL.Item(1).Value
ここでは「Selectionオブジェクト」の「SelectElement2メソッド」を使ってユーザーの選択した形状セットを取得しています。上記のコードについては「Selectionオブジェクト」の「SelectElement2メソッド」の項で詳しく説明しているのでそちらを参照ください。
このコードによりこれ以降、SELHBを使うことでユーザーの選択した形状セットに対して操作を行うことができるようになりました。
29行
SEL.Search (“type=Surface,sel”)
ここでは「Selectionオブジェクト」の「Searchメソッド」を使ってユーザーが選択した形状セット内にあるSurfaceをすべて選択しています。
「type=Surface」は英語環境の場合の書き方です。
日本語環境の場合は「type=サーフェス」と半角カタカナで入力します。
※「,sel」を「,all」に変えるとドキュメント内のすべてのSurfaceが選択されます。
しかしその場合「xy plane」たちも選択されてしまうため「,sel」として検索場所を絞っています。
そしてこの「,sel」を使うためにSelectElement2メソッドを利用しています。
31~38行
SEL.Clear
ここではFor~Next文を使ってループをしています。
ループの回数はSEL.Count(つまりは選択したサーフェスの個数)回です。
選択した形状セット内に5個のSurfaceがあれば5回、10個あれば10回のループが行われます。
ループの中にはサーフェスに名称を付ける処理を書いておきます。
「Selectionオブジェクト」の「Itemメソッド」とFor~Next文を組み合わせることで、上にあるSurfaceから順に処理をしていくことができます。
処理内容は「SEL.Item(i).Value.Name = “Surface.” & i 」、つまりはループが i 回目のとき、上から i 番目のSurfaceの名称を「Surface.i」にするという処理です。
最後に「SEL.Clear」と書いて選択状態をすべて解除させてマクロは終了です。
Surface以外の要素にも対応させる
コードの内容が理解できると「SEL.Search(“type=Surface,sel”)」の部分で名称を変更する要素のタイプを決めていることがわかります。
つまり上記のコードの「type=Surface」部分を「type=Point」にすれば点、「type=Line」とすれば直線の名称を連番にすることができます。
これを理解したうえで先ほどのコードに以下のかたまりを追加してみます。
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 |
Sub CATMain() Dim DOC As PartDocument Set DOC = CATIA.ActiveDocument Dim SEL 'As Selection Set SEL = DOC.Selection SEL.Clear On Error Resume Next Dim FilterArray(0) FilterArray(0) = "HybridBody" Dim Msg As String Msg = "形状セットを選択してください。" Select Case SEL.SelectElement2(FilterArray, Msg, False) Case "cancel", "undo", "redo" Exit Sub End Select Dim SELHB As AnyObject Set SELHB = SEL.Item(1).Value SEL.Search ("type=Surface,sel") Dim i As Integer For i = 1 To SEL.Count SEL.Item(i).Value.Name = "Surface." & i Next i SEL.Clear '選択状態を解除 '①Point追加------------------------------ SEL.Add SELHB 'SelectElement2メソッドで選択した形状セットを再選択 SEL.Search ("type=Point,sel") '点で検索&選択(日本語版は「Point」の部分を「点」に変更) For i = 1 To SEL.Count SEL.Item(i).Value.Name = "Point." & i 'i番目の点に「Point.i」という名前を付ける Next i SEL.Clear '選択状態を解除 '②Line追加------------------------------ SEL.Add SELHB 'SelectElement2メソッドで選択した形状セットを再選択 SEL.Search ("type=Line,sel") '直線で検索&選択(日本語版は「Line」の部分を「直線」に変更) For i = 1 To SEL.Count SEL.Item(i).Value.Name = "Line." & i 'i番目の直線に「Line.i」という名前を付ける Next i SEL.Clear '選択状態を解除 End Sub |
①Point追加と②Line追加の内容はほとんどサーフェスのものをコピーしてきて「SEL.Search(“type=Surface,sel”)」と「SEL.Item(i).Value.Name = “Surface.” & i」の要素名を変更したくらいです。
ここで特に重要なのは39行目と52行目に出てきている以下のコードです。
SEL.Add SELHB
まず、このコードの前で「SEL.Clear」と書いて、選択状態を一旦すべて解除しています。
そして上記のように「Selectionオブジェクト」の「Addメソッド」をつかい、「SelectElement2メソッド」のところで取得したSELHBを選択状態にします。
これにより一番初めに選択した形状セット(SELHB)内で再度、違う要素での検索&選択をすることができます。(41行目,54行目)
このコードを実行すると以下のように「サーフェス」「点」「直線」の3つの要素タイプに対応したマクロになっていることがわかります。
他の要素にも対応できそうですね!
まとめ
今回は主に「Selectionオブジェクト」をメインに使ったマクロでした。
今回のマクロや『空の形状セットを一括で削除するマクロ』のように仕様ツリー内の”ある要素”に対して操作を行うようなマクロでは、今回やったように「Selectionオブジェクト」とFor~Next文を組み合わせてつかうことが多いです。
このようにSelectionオブジェクトはかなり使えるオブジェクトなので「Selectionオブジェクト」ページにあるプロパティとメソッドの使い方は全て知っておいて損はありません。
また「SelectElement2メソッド」ははじめは難しく感じますが、使用できるようになると作成できるマクロの幅が格段に広がるのでぜひ使えるようにしておきましょう。
CATIAマクロを本気で勉強するなら