Productのパーツ番号をインスタンス名と同じにするマクロ|CATIAマクロの作成方法
今回の記事は「お問い合わせ」でいただいた内容です。
送って頂いた内容は以下のようなマクロです。
(ワークベンチ)アセンブリデザイン ワークベンチ
(実施したいマクロ)
プロダクトを右クリックしてプロパティを見ますと
構成要素のインスタンス名が見る事が出来ます。
(プロダクトのパーツ番号も見る事もできます)
このインスタンス名をマクロで取得し
パーツ番号の名前にすることは可能でしょうか。モデル上にある
全てのプロダクトをカウントして(親プロダクトにある子のプロダクトも含む)、
各プロダクトのインスタンス名を取得し各プロダクトのパーツ番号の名前にするマクロ作成は可能でしょうか。(理屈的にも可能なも のなのでしょうか)
マクロの機能
今回作成したのはProductのパーツ番号をインスタンス名と同じにするマクロです。
具体的な機能は以下のとおりです。
・アクティブドキュメント(CATProduct)内の全プロダクトに適用
サンプルコード
マクロのコードは以下のとおりです。
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 |
Option Explicit Sub CATMain() 'アクティブドキュメント定義 If TypeName(CATIA.ActiveDocument) <> "ProductDocument" Then MsgBox "このマクロはProductDocument専用です。" & vbLf & _ "CATProductに切り替えて実行してください。" Exit Sub End If Dim doc As ProductDocument Set doc = CATIA.ActiveDocument 'Selection定義 Dim sel As Selection Set sel = doc.Selection sel.Clear 'Productをすべて取得 sel.Search ("アセンブリー・デザイン.Product,all") 'Productを全選択 sel.Remove (1) '1番親のProductの選択を解除 Dim pros As Collection Set pros = New Collection Dim i As Integer For i = 1 To sel.Count pros.Add sel.Item(i).Value Next i sel.Clear 'パーツ番号をインスタンス名に変更 Dim pro As Product For Each pro In pros pro.ApplyWorkMode (DEFAULT_MODE) pro.PartNumber = pro.Name Next End Sub |
コード解説
アクティブドキュメント定義
1 2 3 4 5 6 7 8 9 |
'アクティブドキュメント定義 If TypeName(CATIA.ActiveDocument) <> "ProductDocument" Then MsgBox "このマクロはProductDocument専用です。" & vbLf & _ "CATProductに切り替えて実行してください。" Exit Sub End If Dim doc As ProductDocument Set doc = CATIA.ActiveDocument |
まずはじめにアクティブドキュメントの定義をします。
今回のマクロはCATProductでのみ有効なものなので、アクティブドキュメントがCATProduct以外の場合はTypeName関数を使った条件分岐でマクロを終了するようにしています。
つまり、アクティブドキュメントがCATProductの場合のみ変数「doc」にアクティブドキュメントを代入し、マクロの処理を続けます。
Selection定義
1 2 3 4 |
'Selection定義 Dim sel As Selection Set sel = doc.Selection sel.Clear |
アクティブドキュメントが定義できたら、そのドキュメント内のSelectionを定義します。
この時、念の為「Clearメソッド」で現在の選択を全て解除しておきます。
Productをすべて取得
1 2 3 4 5 6 7 8 9 10 11 12 |
'Productをすべて取得 sel.Search ("アセンブリー・デザイン.Product,all") 'Productを全選択 sel.Remove (1) '1番親のProductの選択を解除 Dim pros As Collection Set pros = New Collection Dim i As Integer For i = 1 To sel.Count pros.Add sel.Item(i).Value Next i sel.Clear |
次にアクティブドキュメント内にあるProductを全て取得します。
「pros」というコレクションを用意して、その中に格納していきます。
Selectionオブジェクトの「Searchメソッド」を使って、ドキュメント内のProductを全て選択、選択状態のオブジェクトを全て「pros」に追加という処理を行うことで「pros」に全てのProductが格納されます。
このとき、ドキュメント内のProductを全て選択という処理を行うと、ドキュメント内の一番親のProduct(RootProductともいう)も選択状態になります。RootProductは無視したいので処理から除外するため、「Removeメソッド」を使ってあらかじめ選択を解除しておきます。
パーツ番号をインスタンス名に変更
1 2 3 4 5 6 |
'パーツ番号をインスタンス名に変更 Dim pro As Product For Each pro In pros pro.ApplyWorkMode (DEFAULT_MODE) pro.PartNumber = pro.Name Next |
最後に「pros」内ループを行い、パーツ番号をインスタンス名に変更していきます。
この時、Productの構成要素であるCATPartが表示モードだとエラーが発生します。
ただ、設計モードに切り替えると、データによっては処理に時間がかかってしまいます。
そこで、ここでは「デフォルトモード」に切り替えます。
デフォルトモードにはヘルプに下記のように書かれています。
-
-
The representation is in Default Work mode.Default mode is a mode where the Product Container is loaded. It’s an intermediate mode between Visualization Mode and Design Mode.
Default Work mode.Default modeで、Product Containerが読み込まれるモードです。
表示モードと設計モードの中間のモードです。
-
上記の通り、表示モードと設計モードの中間のモードです。
モードの切り替えは下記のようなコードで行うことができます。
Productオブジェクト.ApplyWorkMode (モード)
※設計=DESIGN_MODE 表示=VISUALIZATION_MODE デフォルト=DEFAULT_MODE
モードを切り替えたら後はパーツ番号=インスタンス名とするだけです。
まとめ
今回はProductのパーツ番号をインスタンス名と同じにするマクロについての内容でした。
マクロではよくある”特定のオブジェクトを全て取得→ループ文で1つずつ処理する”というものです。
CATIAで特定のオブジェクトを一括で取得するには、今回のように「Selectionオブジェクト」の「Searchメソッド」を使うことが多いと思います。「Searchメソッド」はツリーの階層など関係無く取得できますし、「画面に表示されている」や「選択オブジェクトの子供」のような条件を追加することもできるため非常に扱いやすいのであわせて押さえておくことをお勧めします。
CATIAマクロを本気で勉強するなら