CATProduct内の構成要素の活動状況を操作する方法|CATIAマクロの作成方法
以前、CATProductの構成要素が活動状態か非活動状態かを調べるための「CATProduct内の非活動状態の構成要素を取得する」というページを公開しましたが、このページの方法はかなり無理やり活動状態を調べにいっている内容となっていました。
そんな中、とある方から「構成要素の活動状態を取得するためのパラメータが存在する」という情報をいただきました。どうやら活動状態を制御しているのはProductオブジェクトのプロパティ/メソッドではなく別の場所にある”パラメータ”であるようです。
そして厄介なことにそのパラメータはツリー上に表示もされていませんし、「Infrastructure Automation Objects」にも詳しく記載されていませんでした。
そこで今回はその頂いた情報をもとに前回とは違い、“正規ルート”でCATProduct内の構成要素の活動状態を取得する方法を紹介していきます。任意の構成要素(Product,Part)の活動状態を取得するだけでなく、切り替えることも可能です。
構成要素の活動状況を制御するパラメータの取得
冒頭でもいった通り、構成要素(Product,Part)の活動状態を制御しているのは「Productオブジェクト」のプロパティ/メソッドではありません。構成要素の活動状態を制御するのは各構成要素がもつ「構成要素の活動化状況」という名前のパラメータです。
例えば下画像の場合、「Product1.1」「Part1.1」「Product2.1」「Part2.1」の4つの構成要素があります。この時、4つの構成要素であるProduct(Part)はそれぞれ別の「構成要素の活動化状況」というパラメータを持っています。
このパラメータさえ取得できれば値(True/False)を見ることで活動状況が確認できますし、値の変更で活動状態を切り替えることも可能になります。
VBAで「構成要素の活動化状況」パラメータの取得する
このパラメータは「Parametersコレクション」の「SubListメソッド」からアクセスすることができます。VBAコードでいうと下記のようなコードでアクセスすることができます。
下記コードの「Parm」が先に説明した「構成要素の活動化状況」パラメータです。
Dim Parms As Parameters
Set Parms = RootPro.Parameters.SubList(Pro, False)
Dim Parm As Parameters
Set Parm = Parms.Item(パラメータ名)
RootProには1番親のProduct(上画像でいう「Product」)
Proには活動状態を取得/変更したいProduct(上画像でいう「Product1.1」など)を指定します。
これにより下画像のような「Parametersコレクション」が取得できます。(コードでいう「Parms」)
このコレクションの「Item 1」の中を見ると「〜¥構成要素の活動状況」という名前が確認できます。
このパラメータこそ名前の通り活動状況を制御することのできるパラメータです。
コレクション内に「構成要素の活動化状況」パラメータがあることがわかったので、
あとはそのパラメータを取り出すだけです。(コードでいう「Parm」)
パラメータ名には上画像の「Item 1」内にある「Nameプロパティ」の文字列を入力します。
先ほどの画像の構成を例にすると「Product1.1」にアクセスしたい場合は
「“Product¥Product1.1¥構成要素の活動化状況”」という文字列を入力します。
(※英語環境では「構成要素の活動化状況」部分が「Compornent Activation State」となります)
しかし、どのProductでも「Item(1)」で取得できるという確証がありません。
そのためここではParametersコレクション内のItemが変化しても対応できるように”名前による取得”を行っています。
上記コードにより活動状況を制御する「Parm」というパラメータを取得することができました。
あとは「Parm.Value」の値である「True(活動化)」「False(非活動化)」を使うことで活動状態を取得したり、切り替えたりすることが可能になります。
サンプルコード
具体例としてCATProduct内の1レベルのProductを全て非活動化するコードを紹介します。
下記コードをコピペしそのまま実行可能です。
(※使用言語が英語の場合はコメントの指示に従い、一部書き換えが必要です)
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 |
Option Explicit Sub CATMain() 'アクティブドキュメント取得 Dim doc As ProductDocument Set doc = CATIA.ActiveDocument 'RootProduct(1番親のProduct)を取得 Dim RootPro As Product Set RootPro = doc.Product 'RootProduct内(1レベル)内ループ Dim Pro As Product For Each Pro In RootPro.Products 'パラメータ名作成 Dim ActName As String ActName = "構成要素の活動化状況" '英語環境の場合は「Compornent Activation State」 Dim tmp_Pro As Variant Set tmp_Pro = Pro Do Until TypeName(tmp_Pro) = TypeName(doc) If TypeName(tmp_Pro) = "Product" Then ActName = tmp_Pro.Name + "\" + ActName '"' End If Set tmp_Pro = tmp_Pro.Parent Loop '活動化状況のパラメータを取得 Dim Parms As Parameters Set Parms = RootPro.Parameters.SubList(Pro, False) Dim Parm As Parameter Set Parm = Parms.Item(ActName) '活動化(True)/非活動化(False)確認 Debug.Print Pro.Name & " : " & Parm.Value '活動化(True)/非活動化(False)切り替え Parm.Value = False Next End Sub |
コード解説
アクティブドキュメント/RootProductの取得
1 2 3 4 5 6 7 |
'アクティブドキュメント取得 Dim doc As ProductDocument Set doc = CATIA.ActiveDocument 'RootProduct(1番親のProduct)を取得 Dim RootPro As Product Set RootPro = doc.Product |
まずはアクティブドキュメントとそのRootProduct(1番親のProduct)を定義をします。
CATProduct以外で実行するとエラーが発生します。
エラー処理が必要な場合はTypeName関数を使った条件分岐処理を用意して下さい。
RootProduct内(1レベル)内ループ開始
1 2 3 |
'RootProduct内(1レベル)内ループ Dim Pro As Product For Each Pro In RootPro.Products |
「For Each文」を使ってRootProductのProductsコレクション内にあるProduct(つまりは1レベルにあるProduct)すべてに対して以降の処理を行なっていきます。
「Pro」という変数にはForループ毎に1レベルのProductが順々に入っていきます。
パラメータ名作成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
'パラメータ名作成 Dim ActName As String ActName = "構成要素の活動化状況" '英語環境の場合は「Compornent Activation State」 Dim tmp_Pro As Variant Set tmp_Pro = Pro Do Until TypeName(tmp_Pro) = TypeName(doc) If TypeName(tmp_Pro) = "Product" Then ActName = tmp_Pro.Name + "\" + ActName '"' End If Set tmp_Pro = tmp_Pro.Parent Loop |
次にパラメータ名を作成していきます。
パラメータ名とは「構成要素の活動状況を制御するパラメータの取得」の項で出てきた「“Product¥Product1.1¥構成要素の活動化状況”」のようなやつです。
パラメータ名は非常に単純で、「RootProductから活動状態を調べたいProdcutまでのパス」に「¥構成要素の活動化状況」を付けただけです。
ここでは「Do〜Loop文」を使ってパラメータ名を作成しています。
ループ内の処理を文字で表すと下記のとおりです。
ループ前の事前準備
⓪ ActName に”構成要素の活動化状況”という文字列を入れる
⓪ tmp_ProにProを入れる
ループ開始 ①〜③を繰り返す
① tmp_Proのタイプ名が「Product」かを調べる
① – 1 Yes → ActNameの前側に「tmp_Proの名前¥」と付ける
① – 2 No → 無視(特に何もしない)
② tmp_Proの中身をtmp_Proの親オブジェクトに巻き替える
③ tmp_Proのタイプ名が「ProductDocument」かを調べる
③ – 1 Yes → ループ終了
③ – 2 No → ①に戻る
このループにより「”構成要素の活動化状況”」という文字列の前にどんどんProdcutの名前が付いていき、最終的には「“Product¥Product1.1¥構成要素の活動化状況”」のような文字列が完成するというわけです。
活動化状況のパラメータを取得
1 2 3 4 5 6 |
'活動化状況のパラメータを取得 Dim Parms As Parameters Set Parms = RootPro.Parameters.SubList(Pro, False) Dim Parm As Parameter Set Parm = Parms.Item(ActName) |
前項「構成要素の活動状況を制御するパラメータの取得」で解説済みのため割愛
活動化(True)/非活動化(False)切り替え
1 2 3 4 5 |
'活動化(True)/非活動化(False)確認 Debug.Print Pro.Name & " : " & Parm.Value '活動化(True)/非活動化(False)切り替え Parm.Value = False |
最後に、取得した構成要素の活動状況パラメータ「Parm」を使ってProductの活動状況を切り替えていきます。これまでにも何度も出てきたのでわかっているかと思いますが、活動化する場合には「True」に、非活動化する場合には「False」に変更します。
また、本コードには関係がありませんが「Debug.Print Pro.Name & ” : ” & Parm.Value」という、現状のProductの活動状況をイミディエイトウィンドウに出力するというそりも行なっています。
これはProductの活動状況を切り替えるだけでなく、取得するともできるということを確認するための処理です。マクロの機能としては全く不要なものです。
まとめ
今回はCATProduct内の構成要素の活動状況を取得/切り替える方法についての内容でした。
構成要素の活動状況を操作できることで、CATProduct内のマクロはかなり自由度が広がると思います。ぜひコード内容を理解し、自身のマクロにも取り込んでみてください。(しっかりとした方法があるので前回紹介した方法のような無理矢理のものはやめましょう)
構成要素の活動状況パラメータの存在はとある方に教えて頂いたので辿り着けましたが、当方は存在すら知りませんでした。(教えて頂いた後に個人でもいろいろ調べていると、それらしいものを発見できました→「Activating and Deactivating a Component」)
CATIA VBAは海外サイトを含めても情報がかなり薄いものです。
もし本サイトを利用していて、「ん?」というものや「ここはこうした方が効率いいよ!」というものがあれば今回のようにご連絡いただけると非常に助かります。いただいた情報はぜひぜひ共有していきたいと思っています。