Part内のマテリアルとボディーの表示状態をチェックするマクロ|CATIAマクロの作成方法

今回はLineオープンチャットで頂いた内容です。
送って頂いた内容は以下のようなマクロです。

質問内容:
数百点の”CATPart”が組まれた”CATProduct”の重心位置を求めたいのですが、
その”CATProduct”に組まれている”CATPart”に

・マテリアルが未定義のCATPart(ボディーにもマテリアルが適応されていない。)

・CATPart内で非表示のボディーがあるなど
(非表示のボディーも含め重心が計算されてしまうため)、

正確な重心位置を求める上で不都合なデータがいくつかあります。

これらの問題となるCATPartをマクロで見つけて、
TXTファイル等に出力するようなマクロは作成可能でしょうか。

 

マクロの機能

今回作成したマクロは
『Part内のマテリアルとボディーの表示状態をチェックするマクロ』です。

具体的な機能は以下のとおりです。

  マクロの機能まとめ ・アクティブなCATProduct内のCATPartの中身を調べる
 → ① マテリアルが設定されていなければエラーリストに追加 ※1
 → ② ボディーが1つでも非表示になっていればエラーリストに追加
・エラーリストに追加された該当CATPartの名称をテキストファイルとして出力
・テキストファイル作成後(マクロ実行後)、テキストを開く

※1 マテリアルはCATPart内に1つでもあればエラー対象外とします。
      各ボディーそれぞれに設定されていないといけない訳ではないので注意して下さい。

 

サンプルコード

マクロのサンプルコードは以下のとおりです。
コード内の「fold_path」には出力するテキストの保存場所を指定する必要があります。
現状のままだとエラーが発生するので、自身の環境に合わせて書き換えて下さい。

また、マクロ実行後すべてのCATPartをデザインモードにするため、場合によってはかなり時間がかかる可能性があるので予め注意しておきましょう。

 

 

コード解説

アクティブドキュメント/RootProduct定義

まずはじめにアクティブドキュメントの定義をします。

今回のマクロはCATProductでのみ有効なものなので、アクティブドキュメントがCATProduct以外の場合はTypeName関数を使った条件分岐でマクロを終了するようにしています。条件分岐の先、つまりはアクティブドキュメントがCATProductの場合は変数「doc」にアクティブドキュメントを代入します。

アクティブドキュメントを定義したら合わせてRootProduct(一番親のProduct)も定義します。
RootProductを定義したら、それを使いすべてのProduct(Part)をデザインモードに変換します。

  Productのモード切り替え

Productオブジェクト.ApplyWorkMode(モード)
  
※設計モード = DESIGN_MODE 
 表示モード = VISUALIZATION_MODE 
 デフォルトモード = DEFAULT_MODE

 
全Partを取得

つぎにProduct内にあるすべての「Part」を取得します。
さきほどすべてのProduct(Part)をデザインモードに変更したため、SelectionオブジェクトのSerachメソッドで「パーツ」検索をかければすべての「Part」を選択状態にできます。

あとは「選択しているオブジェクトを一時保管する方法」でも説明しているとおりの方法ですべての「Part」を「pts」というコレクションに格納します。
 

マテリアル適用と表示/非表示の確認

つぎに「pts」コレクション内の「Part」の中身をチェックして、「①マテリアルが設定されているか」「②ボディーが非表示になっていないか」を確認し、設定されていないPartはその名称を「txt」という変数に追加していきます。

「①マテリアルが設定されているか」「②ボディーが非表示になっていないか」のチェックはそれぞれ専用の関数「①Check_Material」「②Check_Hide」を使用しています。両関数の返り値が「True」でない場合はマテリアルが設定されていないか、ボディーが非表示になっているため、「txt」へ追加する対象のPartということになります。
  

テキスト出力

つぎに「txt」の中身をテキストファイルに出力していきます。

FileSystemオブジェクト」のCreateFileメソッドを使って新規テキストファイルを作成します。
テキストファイルの保存場所となる「fold_path」は自身の環境に合わせて書き換えて下さい

テキストファイルの作成が完了したら、そのファイルに「txt」の中身を書き出します。
「Open file_path For Output As #1」でテキストを開き、
「Print #1, txt」で「txt」を書き出し、
「Close #1」でテキストファイルを閉じるというVBAでは基本的な書き出しの処理をしています。
 

出力したテキストを開く

最後に「Shell関数」を使ってテキストファイルを表示させます。
詳しい使い方は「VBA Shell関数」などで検索して見て下さい。
 

icon-gear Check_Material関数

Check_Material関数は引数として入力されたCATPart内にマテリアルが設定されているかを調べる関数です。マテリアルがCATPart内に1つでもあれば「True」、1つも存在しなければ「False」を返すようになっています。

処理としてはCATPart内で、SelectionオブジェクトのSerachメソッドで「マテリアル」検索をしているだけです。この結果、「選択状態が0であるということはマテリアルが存在していない」という判定を出しています。
 

icon-gear Check_Material関数

Check_Hide関数は引数として入力されたCATPart内のボディーが非表示になっていないかを調べる関数です。ボディーが全て表示状態であれば「True」、1つでも非表示のものがあれば「False」を返すようになっています。

処理としてはCheck_Material関数とほぼ同じでCATPart内で、SelectionオブジェクトのSerachメソッドで「ボディー」検索をしているだけです。

Check_Material関数と違うのはその後にVisPropertySetオブジェクトでボディーの表示状態を確認しているところです。「GetShowメソッド」で取得した結果が「catVisPropertyNoShowAttr」となっているものは非表示状態になっていることを表しています。つまり1つでも「catVisPropertyNoShowAttr」のものがあれば即「False」を返す関数となっています。

 

まとめ

今回は「Part内のマテリアルとボディーの表示状態をチェックするマクロ」についてでした。
マクロの基本の流れとしては下記の通りです。

① 全Partを全て取得
② Part内でマテリアル確認 →Check_Material関数
③ Part内でボディーの表示状態確認 →Check_Hide関数  
④ 対象のPartをテキストに出力

 
上記の通りチェックする内容ごとに関数を作成しているので、条件を追加したり、変更しやすくなっています。たとえば「形状セット確認」のような要素も加えたければ「Check_hb」のような関数を作成すればすぐに盛り込むことができます。
 

サンプルマクロ集に戻る
目次へ戻る
 

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

CATIA, CATIAマクロ, VBA

Posted by Lic