編集したExcelファイルを読み込み仕様ツリーに反映するマクロ|CATIAマクロの作成方法

今回の記事は「マクロ案」よりいただいた内容です。
送って頂いた内容は以下のようなマクロです。

ワークベンチ: Part Design

マクロ案: 仕様ツリー上の各要素の名称をExcelに読み込み、
              Excel上で名称を変更したものを仕様ツリーに反映するマクロ
            (CATIAのマクロというよりExcelのマクロかも)

今回のマクロは下記の2つのマクロで構成していきます。
①「仕様ツリーのオブジェクト名をExcelファイルとして出力するマクロ」
②「編集したExcelファイルを読み込み仕様ツリーに反映するマクロ」
本ページでは②のマクロについて紹介していこうと思います。

仕様ツリーの構成をExcelファイルに出力するマクロの使用が大前提です。
 まずは上記リンクページの内容を行ってから本ページを進めて下さい。

CATIA VBAのオブジェクト構造を理解している方ならある程度予想ができると思いますが、仕様ツリーの階層を考慮して上から順にオブジェクトを取得することは実はかなり難しいです。そこで今回は「パートデザイン」「ジェネレーティブ・シェイプ・デザイン」の基本的なコマンドであれば実行可能なマクロを”簡単なコード”で作成しました。

簡単なコードの分、エラー処理や一部オブジェクトには対応していないという状態ですが、どのようにしてツリー構成を取得しているのかは理解しやすい内容になっていると思います。

もし本格的に取得したい場合は下記サイトのマクロを参考にしてみて下さい。
BodyのTreeを各種フォーマットでエクスポートする – C#ATIA
ハードルは少し上がりますがクラスモジュールなども使いしっかりとしたコードで作成されています。

 

マクロの機能

今回作成したのは編集したExcelファイルを読み込み仕様ツリーに反映するマクロです。

本マクロは仕様ツリーの構成をExcelファイルに出力するマクロで出力したExcelファイルの使用が前提となっています。出力されたExcelファイルのオブジェクト名部分を任意の名称に変更し、本マクロを使って再度Excelファイルを読み込ませることでツリー上のオブジェクト名を一括で変更することができます。

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

  マクロの機能まとめ ・使い方は下記の手順通り
     仕様ツリーの構成をExcelファイルに出力するマクロでExcelファイルとして出力
    出力されたExcelファイルのオブジェクト名部分を任意の名称に書き換える
  名称変更後のExcelファイルをデスクトップ等に保存
  本マクロを実行し③のExcelファイルを選択し読み込ませる
  ツリーの名称が変更される(イミディエイトウィンドウに変更内容の詳細を表示)
・[パートデザイン]だけでなく [GSD]ワークベンチでも実行可能
・名称変更後、[元に戻す]コマンド([Ctrl]+[Z])で変更前に一括で戻すことが可能
今回のマクロでは仕様ツリーの階層を考慮してExcelファイルとして出力していますが、その部分を考慮せず上から順にオブジェクト名を羅列するだけあればもっと単純なコードで済みます。
 

サンプルコード

マクロのコードは以下のとおりです。
仕様ツリーの構成をExcelファイルに出力するマクロでExcelファイルとして出力し、その出力したファイル内のオブジェクト名を変更したい名称に書き換え再度読み込ませます。

変更されたオブジェクトの個数がメッセージボックスで、何が何に変更されたのかがVBEのイミディエイトウィンドウに表示されるため、変更した箇所以外のオブジェクト名が変わっていないかを確認することができます。

処理の流れとしては下記のような流れになっています。ツリーの階層は考慮せずに1行でExcelに出力する場合は、”階層の取得”が不要になるため②の処理がもっとシンプルになります。

① ドキュメント内の全オブジェクトから名称変更するオブジェクトを選別しすべて取得 
② Excelの行ループ処理 (オブジェクトはツリーの上から順にループ)
 ②-1 オブジェクト名とセルの値が違った場合にオブジェクト名をセルの値に変更する
 ②-2 変更した場合、「変更前=>変更前」と変更内容をイミディエイトウィンドウに出力
③ オブジェクト名の変更数をメッセージボックスで出力
 

 

コード解説

アクティブドキュメント等の定義

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

アクティブドキュメントが定義できたら、以降で使うためのオブジェクト/変数をまとめて定義しておきます。ここでは下記の用途で各オブジェクト/変数を定義しています。

Partオブジェクト   :ツリー第1階層指定用
Selectionオブジェクト ドキュメント内のオブジェクトを”上から順”に取得する用
objs (As Collection)   :Excelに出力するオブジェクトを全て格納する用
obj  (As AnyObject)   :
objs内ループ(For Each ~ In ~)用変数
i      (As Long)            :
Forループ用カウント変数

 
オブジェクトの選定

つぎにExcelに出力するオブジェクトをすべて取得します。
このマクロは「仕様ツリーの構成をExcelファイルに出力するマクロ」実行後に使用する前提のマクロなので、選別するオブジェクトも「仕様ツリーの構成をExcelファイルに出力するマクロ」で選別した内容と全く同じものにします。

コード内容も「仕様ツリーの構成をExcelファイルに出力するマクロ」と全く同じです。
Excel出力したオブジェクトとここで取得するオブジェクトを一致させれば、Excelでは行を1行ずつループさせるのに対し、オブジェクトではobjsコレクションの中身を1つずつループしていけば同じオブジェクトを表すことができます。

つまりExcelのセルの値とobjsコレクション内のオブジェクト名が異なった場合にオブジェクト名をセルの値にすれば、ユーザーがExcel上で変更したオブジェクト名に変更することができるという訳です。
 

Excel定義 

つぎにCATIAに読み込ませるExcelシートの定義をしていきます。

まずはCATIA内でExcel VBAが使えるように設定する必要があります。
Excelの定義方法については「CATIAマクロでExcelを操作する方法」を参照下さい。
上記ページにも書かれている通り、参照設定をしていないと実行できないので注意して下さい。

Excel VBAの使用を可能にしたら「GetOpenFilename」を使って、「仕様ツリーの構成をExcelファイルに出力するマクロ」で出力し編集したExcelファイルを読み込ませます。

この時、読み込ませたExcelブックを「wb」、シートを「ws」として定義します。

 
Excelファイルが現行の仕様ツリーのものか確認

つぎに読み込まれたExcelが現在のアクティブドキュメントのツリーと同じものかを確認します。
ここでの確認は非常に単純で、出力したExcelファイルのA1セル(つまりはパーツ番号の部分)がアクティブドキュメントのパーツ番号と一致しているかを確認しているだけです。

これだとあまりにも確認がザルなので、本格的に使おうという場合は個々の確認をもっとしっかりしたものにしましょう。

 
オブジェクト名称の変更

つぎに本マクロの核部分であるオブジェクト名の変更処理を行います。

処理自体はExcel出力時のマクロよりも簡単です。
Excelの[r]行目の値とobjsコレクション内の[r]番目のオブジェクト名を比較し、違った場合にのみオブジェクト名をセルの値に変換するだけです。

一応マクロの実行確認としてオブジェクト名を変更した際には「変更前=>変更前」とイミディエイトウィンドウに表示するようにしています。これにより意図しないオブジェクト名の変更を抑止することができます。

あとは読み込ませたブックを閉じたり、オブジェクト名の変更数を表示させたりすれば完了です。

 

まとめ

今回は編集したExcelファイルを読み込み仕様ツリーに反映するマクロについての内容でした。

仕様ツリーの構成をExcelファイルに出力するマクロ」でも行っていた通りマクロの処理自体は単純ですが、単純がゆえに対応しきれない部分も出てきてしまっています。

“ツリーの上から順”というのはVBAで表そうとするとかなり面倒で、全てのオブジェクトに対応させるにはそれだけの知識とコード量が必要になってくるためどこかで妥協する部分が必要になってきます。

ある程度使用するオブジェクトは限られてくるはずなので、自身の環境に合わせてコード内容を書き直せばある程度は使えるマクロにはなっています。

もっとしかっりとしたコードにしたいという場合は冒頭でも紹介した下記サイトを参考にしてみて下さい。
BodyのTreeを各種フォーマットでエクスポートする – C#ATIA
 

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

 

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

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

Posted by Lic