要素の名前を連番にするマクロ|CATIAマクロの作成方法

今回の記事はマクロ案募集でいただいた内容です。
恐らくこの案を下さった方の操作環境は「英語」のように感じたので、ここでは英語環境向けに書いていきます。(日本語環境はコードのほんの一部だけ変える必要があるので注意して下さい。)

※マクロ案は目次で随時募集中なのでぜひご利用下さい。
   (お問い合わせもしくはTwitterのDMでも可)

かなり濃く長めの内容になっていますが
マクロ初心者の方にはかなり役立つ内容になっていると思います!

 

作成するマクロの内容

今回作成するマクロは「要素別に名前が連番になるようなマクロ」です。

マクロ実行後に形状セットを選択したら、その形状セット内にある要素の名称を連番にするという機能にしていきます。(マクロ実行後に形状セットを選択という部分が今回のミソ)

はじめから全ての要素(点やワイヤー、ボリューム等)に対応させようとすると、ややこしくなり理解しづらくなるので、まずはサーフェスのみに対応したマクロでイメージをつかんでいきましょう

 

マクロコード例

主にマクロの流れとしては以下の操作を行います。

①「Selectionオブジェクト」の「Search」メソッドを使って、サーフェスを選択する

② 選択したサーフェスに対して上から順に「.1」「.2」「.3」と連番の名前をつけていく

※今回の構文はSelectionオブジェクトをメインに使っていくので、Selectionオブジェクトをあまり理解していないという方は「Selectionオブジェクト」ページを見ながら進めることをオススメします。

作成の流れのイメージが付きやすいように、先に完成コードを貼っておきます。

※1の部分は「SelectElement2」という
少し難しいメソッドを使っていますがこれが非常に重要ですよ!

 

マクロコードの解説

それでは上から順に何をしているのかを詳しく見ていきましょう。

3~4行 

icon-code Partドキュメントの定義

Dim DOC As PartDocument
Set DOC = CATIA.ActiveDocument  

まずは基本となるドキュメントの宣言/定義を行います。
ココがわからない方は「VBAでオブジェクトを取得1」のページを参照ください。
 

6~9行

icon-code Selectionオブジェクトの定義

Dim SEL      
Set SEL = DOC.Selection 
 
SEL.Clear

ドキュメントを定義したら「Selectionオブジェクト」を使うための変数「SEL」を宣言します。
ここで重要なのは「As Selection」と書かないで、Variant型の変数として宣言するという点です。
これはこの後に使用する「SelectElement2メソッド」がVariant型にしか対応していないためです。

変数の宣言/定義が終わったらSEL.Clear」と書いて、選択状態を一旦すべて解除します。
これはマクロ実行前に何かを選択していた場合に何か悪さをおこす可能性があるためです。 
 

11~27行(※1)

icon-code SelectElement2メソッドで任意の形状セットを取得

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行

icon-code Searchメソッドで検索&選択

SEL.Search (“type=Surface,sel”)

ここでは「Selectionオブジェクト」の「Searchメソッド」を使ってユーザーが選択した形状セット内にあるSurfaceをすべて選択しています。
「type=Surface」は英語環境の場合の書き方です。
日本語環境の場合は「type=サーフェス」と半角カタカナで入力します。

※「,sel」を「,all」に変えるとドキュメント内のすべてのSurfaceが選択されます。
 しかしその場合「xy plane」たちも選択されてしまうため「,sel」として検索場所を絞っています。
 そしてこの「,sel」を使うためにSelectElement2メソッドを利用しています。
 

31~38行

icon-code For~Nextループですべてのサーフェスに名称付け

Dim i As Integer
For i = 1 To SEL.Count            
 SEL.Item(i).Value.Name = “Surface.” & i 
Next i
 
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」とすれば直線の名称を連番にすることができます。

これを理解したうえで先ほどのコードに以下のかたまりを追加してみます。

①Point追加と②Line追加の内容はほとんどサーフェスのものをコピーしてきてSEL.Search(“type=Surface,sel”)」SEL.Item(i).Value.Name = “Surface.” & iの要素名を変更したくらいです。

ここで特に重要なのは39行目と52行目に出てきている以下のコードです。

icon-code 形状セットを再選択

SEL.Add SELHB 

まず、このコードの前でSEL.Clear」と書いて、選択状態を一旦すべて解除しています。
そして上記のように「Selectionオブジェクト」の「Addメソッド」をつかい、「SelectElement2メソッド」のところで取得したSELHBを選択状態にします。

これにより一番初めに選択した形状セット(SELHB)内で再度、違う要素での検索&選択をすることができます。(41行目,54行目)

このコードを実行すると以下のように「サーフェス」「点」「直線」の3つの要素タイプに対応したマクロになっていることがわかります。

「点」と「直線」と同じように要素名の部分を変更すれば
他の要素にも対応できそうですね!

 

まとめ

今回は主に「Selectionオブジェクト」をメインに使ったマクロでした。
今回のマクロや『空の形状セットを一括で削除するマクロ』のように仕様ツリー内の”ある要素”に対して操作を行うようなマクロでは、今回やったように「Selectionオブジェクト」とFor~Next文を組み合わせてつかうことが多いです。

このようにSelectionオブジェクトはかなり使えるオブジェクトなので「Selectionオブジェクト」ページにあるプロパティとメソッドの使い方は全て知っておいて損はありません。

また「SelectElement2メソッド」ははじめは難しく感じますが、使用できるようになると作成できるマクロの幅が格段に広がるのでぜひ使えるようにしておきましょう

目次へ戻る
 

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

 

2022年7月28日CATIA, CATIAマクロ

Posted by Lic