CATIA VBAでオブジェクトのドメイン数を取得する関数|CATIAマクロの作成方法

CATIAナレッジの式やルールにはナレッジ関数というものを独自の関数を使用することができます。オブジェクトのドメイン数を取得したいときはこのナレッジ関数の「nbDomains」を使うことで簡単に取得することができます。

ただ、この関数はあくまでもナレッジで使うことのできる関数であり、VBAで使うことはできません。
そこで本ページではVBAで使用可能な「nbDomains」の代わりとなる関数を作成したので紹介していきます。サンプルコードをコピペして呼び出せばすぐにでも使用できるので是非使ってみてください。

 

ナレッジ関数「nbDomains」とは

CATIAのナレッジウェアには「nbDomains」という関数が用意されています。
この関数は下記のように書くことで式やルール内で使用することができ、オブジェクトのドメイン数を任意のパラメータに渡すことができます

icon-code nbDomains関数の使い方 

パラメータ = nbDomains(オブジェクト)

たとえば下画像でいうと、式を使って「形状セット.1\境界.1」のドメイン数を「整数」パラメータの値に入れるような仕組みになっています。

 
VBAでは利用できないナレッジ関数

CATIAのナレッジには「nbDomains」を初めいくつもの関数が用意されています。
しかし、これらナレッジ関数ですが、VBAでは使用することが出来ないものも存在します
「nbDomains」もこのVBAで使用することのできない関数の1つです。

そこで、「nbDomains」に相当するVBAの関数を2種類作成したので以下で紹介します。
2種類とも求めるまでの考えは違いますが結果は同じです。(ドメイン数が返ってくるだけ)

以下で紹介する関数はメインのプロシージャで下記のように書くことで利用できます。
できる限りナレッジ関数の「nbDomains」と同じような感覚で使えるようにしています。

icon-code VBA版 nbDomains関数の使い方 

Dim res As Integer
res = nbDomains(iObj)
‘※iObjにはドメイン数を数えたいオブジェクト(HybridShape)を入力
  resにはInteger型でiObjのドメイン数が返ってくる

 

手法① 式を作成し「nbDomains関数」を使う

サンプルコード

 
コード内容

1つ目の方法は式を作成し、CATIAが本来持っている「nbDomains関数」を使う手法です。
CATIA VBAではナレッジウェアの関数は使えませんが、式そのものを作成することはできます

つまり、下画像のようなパラメータと式を実際にVBAで作成してパラメータの値を取得し、取得後は作成したパラメータと式を削除すればいいだけのお話です。

VBAでパラメータと式を作成をするにはそれぞれ下記のように書きます。


icon-code パラメータの作成構文

Dim prm As Parameter  ‘「prm」という名前の変数を宣言
Set prm = [Part].Parameters.CreateInteger(iName, iValue)

 iName   → 作成するパラメータの名前を入力
 iValue   
→ 作成するパラメータの初期値を入力

icon-code 式の作成構文

Dim fx As Formula  ‘「fx」という名前の変数を宣言
Set fx = _
[Part].Relations.CreateFormula(iNameiComment, iOutputParameter, iFormulaBody)

 iName                     → 作成する式の名前を入力
 iComment               → 作成する式のコメントを入力(プロパティ内のコメント)
 iOutputParameter   → 作成する式の結果をアウトプットするパラメータの入力
 iFormulaBody          → 作成する式(文字列)を入力


 
あとは式作成の引数である「iFormulaBody」部分に「”nbDomains(xxx)”」のような「nbDomains関数」を使った式(文字列)を入れるだけです。これにより「パラメータの値=ドメイン数」となるので「prm.ValueAsString」として値を抜き出せばそれがドメイン数となります。

「(xxx)」にあたる、オブジェクト名の取得方法はサンプルコードを参照下さい。
(GetNameToUseInRelationというメソッドを使えば簡単に取得できます)

パラメータ/式の削除は「HybridShapeFactoryオブジェクト」の「DeleteObjectForDatumメソッド」を使います。名前的にデータムオブジェクトしか削除できなさそうなメソッドですが、Part内のオブジェクトなら大体のものは削除できます。(処理の結果としてはSelectionオブジェクトのDeleteメソッドとほぼ同じ)

icon-code DeleteObjectForDatumメソッド使い方 

Call  [HybridShapeFactory].DeleteObjectForDatum(RefObj)
‘※RefObjには削除したいオブジェクトのReferenceを入力

 

手法② 分解後にデータム数を数える

サンプルコード

 

コード内容

2つ目の取得方法は「分解」を使った手法です。
GSDの分解コマンドを使うと下画像のように選択したオブジェクトをドメインごとにデータムとして分解することができます。つまり、このコマンドによって作成されたデータム数を数えればドメイン数を数えたことと同じであるといえます。

VBAで分解コマンドと同様の操作を行うには「HybridShapeFactoryオブジェクト」の「AddNewDatumsメソッド」を使います。このメソッドは下記のように書くことで、作成したデータムを配列に格納して返してくれます。

icon-code AddNewDatumsメソッド使い方 

Dim Dtms() As Variant
Dtms = [HybridShapeFactory].AddNewDatums(RefObj)
‘※RefObjには分解したいオブジェクトのReferenceを入力

作成されたデータムはすべて配列に格納されているので、
「配列の要素数=ドメイン数」、つまりは「Ubound(Dtms)」がドメイン数を表します

このメソッドによって作成されたデータムを1つずつ扱いたい場合は、通常の配列操作と同じく「Dtms(0)」「Dtms(1)」のように書けばそれぞれを個々に操作することができます。

このメソッドで作成したデータムはツリー状には表示されず、内部で作成されたものとして扱われます。そのため、画面に見えないとしてもデータとしては不要なものが残ってしまっている状態のため”作成したデータムを削除する”という処理は必要になります。

データムの削除はサンプルコード①と同じく「DeleteObjectForDatumメソッド」を使います。

 

まとめ

今回はドメイン数を取得するための「nbDomains」の代わりとなるVBAの関数を紹介しました。
方法としては下記の2通りの考え方でドメイン数を取得しました。

① ナレッジ関数を使うための式と値を受け取るためのパラメータをVBAで作成する
② オブジェクトを分解して作成されたデータム数をカウントする

①の考えが理解できると「nbDomains」以外のナレッジ関数をVBAで利用することができます。
ナレッジもVBAもそれぞれでしかできないことがありますが、うまいこと組み合せればどちらの良さも活かしたツールが作成できるので、是非片方だけでなくどちらも深く勉強してみてください。
 
目次へ戻る
 

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

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

Posted by Lic