CATIA VBAでオブジェクトのドメイン数を取得する関数|CATIAマクロの作成方法
CATIAナレッジの式やルールにはナレッジ関数というものを独自の関数を使用することができます。オブジェクトのドメイン数を取得したいときはこのナレッジ関数の「nbDomains」を使うことで簡単に取得することができます。
ただ、この関数はあくまでもナレッジで使うことのできる関数であり、VBAで使うことはできません。
そこで本ページではVBAで使用可能な「nbDomains」の代わりとなる関数を作成したので紹介していきます。サンプルコードをコピペして呼び出せばすぐにでも使用できるので是非使ってみてください。
ナレッジ関数「nbDomains」とは
CATIAのナレッジウェアには「nbDomains」という関数が用意されています。
この関数は下記のように書くことで式やルール内で使用することができ、オブジェクトのドメイン数を任意のパラメータに渡すことができます。
パラメータ = nbDomains(オブジェクト)
たとえば下画像でいうと、式を使って「形状セット.1\境界.1」のドメイン数を「整数」パラメータの値に入れるような仕組みになっています。
VBAでは利用できないナレッジ関数
CATIAのナレッジには「nbDomains」を初めいくつもの関数が用意されています。
しかし、これらナレッジ関数ですが、VBAでは使用することが出来ないものも存在します。
「nbDomains」もこのVBAで使用することのできない関数の1つです。
そこで、「nbDomains」に相当するVBAの関数を2種類作成したので以下で紹介します。
2種類とも求めるまでの考えは違いますが結果は同じです。(ドメイン数が返ってくるだけ)
以下で紹介する関数はメインのプロシージャで下記のように書くことで利用できます。
できる限りナレッジ関数の「nbDomains」と同じような感覚で使えるようにしています。
Dim res As Integer
res = nbDomains(iObj)
‘※iObjにはドメイン数を数えたいオブジェクト(HybridShape)を入力
resにはInteger型でiObjのドメイン数が返ってくる
手法① 式を作成し「nbDomains関数」を使う
サンプルコード
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 |
Function nbDomains(iObj As HybridShape) As Integer Dim pt As Part 'パート Dim hsf As HybridShapeFactory 'パラメータ/式 削除用 Dim prm As IntParam '新規パラメータ Dim strObjName As String '引数オブジェクト名 Dim strFormula As String '式 Dim fx As formula '新規式 Dim RefParm As Reference 'パラメータのReference Dim RefFx As Reference '式のReference 'パート/ファクトリー取得 Set pt = CATIA.ActiveDocument.Part Set hsf = pt.HybridShapeFactory 'Integer型のパラメータ作成 Set prm = pt.Parameters.CreateInteger("tmp", 0) '式作成 (xxx=nbDomains(xxx)) strObjName = pt.Parameters.GetNameToUseInRelation(iObj) strFormula = "nbDomains(`" & strObjName & "`)" Set fx = pt.Relations.CreateFormula("tmp", "", prm, strFormula) 'nbDomainsの結果を取得して返す nbDomains = Int(prm.ValueAsString) '作成したパラメータと式を削除 Set RefParm = pt.CreateReferenceFromObject(prm) Set RefFx = pt.CreateReferenceFromObject(fx) Call hsf.DeleteObjectForDatum(RefParm) Call hsf.DeleteObjectForDatum(RefFx) End Function |
コード内容
1つ目の方法は式を作成し、CATIAが本来持っている「nbDomains関数」を使う手法です。
CATIA VBAではナレッジウェアの関数は使えませんが、式そのものを作成することはできます。
つまり、下画像のようなパラメータと式を実際にVBAで作成してパラメータの値を取得し、取得後は作成したパラメータと式を削除すればいいだけのお話です。
VBAでパラメータと式を作成をするにはそれぞれ下記のように書きます。
Dim prm As Parameter ‘「prm」という名前の変数を宣言
Set prm = [Part].Parameters.CreateInteger(iName, iValue)
iName → 作成するパラメータの名前を入力
iValue → 作成するパラメータの初期値を入力
Dim fx As Formula ‘「fx」という名前の変数を宣言
Set fx = _
[Part].Relations.CreateFormula(iName, iComment, iOutputParameter, iFormulaBody)
iName → 作成する式の名前を入力
iComment → 作成する式のコメントを入力(プロパティ内のコメント)
iOutputParameter → 作成する式の結果をアウトプットするパラメータの入力
iFormulaBody → 作成する式(文字列)を入力
あとは式作成の引数である「iFormulaBody」部分に「”nbDomains(xxx)”」のような「nbDomains関数」を使った式(文字列)を入れるだけです。これにより「パラメータの値=ドメイン数」となるので「prm.ValueAsString」として値を抜き出せばそれがドメイン数となります。
「(xxx)」にあたる、オブジェクト名の取得方法はサンプルコードを参照下さい。
(GetNameToUseInRelationというメソッドを使えば簡単に取得できます)
パラメータ/式の削除は「HybridShapeFactoryオブジェクト」の「DeleteObjectForDatumメソッド」を使います。名前的にデータムオブジェクトしか削除できなさそうなメソッドですが、Part内のオブジェクトなら大体のものは削除できます。(処理の結果としてはSelectionオブジェクトのDeleteメソッドとほぼ同じ)
Call [HybridShapeFactory].DeleteObjectForDatum(RefObj)
‘※RefObjには削除したいオブジェクトのReferenceを入力
手法② 分解後にデータム数を数える
サンプルコード
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 |
Function nbDomains(iObj As HybridShape) As Integer Dim pt As Part 'パート Dim hsf As HybridShapeFactory 'データム 作成/削除用 Dim RefObj As Reference '引数オブジェクトのReference Dim Dtms() As Variant '分解後のデータム格納用 Dim refDtm As Reference 'データムのReference Dim i As Integer 'カウント変数 'パート取得 Set pt = CATIA.ActiveDocument.Part 'HybridShapeFactory取得 Set hsf = pt.HybridShapeFactory '分解(データム作成) Set RefObj = pt.CreateReferenceFromObject(iObj) Dtms = hsf.AddNewDatums(RefObj) 'ドメイン数を返す nbDomains = UBound(Dtms) + 1 ' '※形状セットにデータムを出力(画面に表示したい場合はコメントを解除)※逆に下項目のデータム削除はコメントアウトのこと ' Dim hb As HybridBody ' Set hb = pt.HybridBodies.Add ' For i = LBound(Dtms) To UBound(Dtms) ' Call hb.AppendHybridShape(Dtms(i)) ' Next i '作成したデータムを削除 For i = LBound(Dtms) To UBound(Dtms) Set refDtm = pt.CreateReferenceFromObject(Dtms(i)) Call hsf.DeleteObjectForDatum(refDtm) Next i End Function |
コード内容
2つ目の取得方法は「分解」を使った手法です。
GSDの分解コマンドを使うと下画像のように選択したオブジェクトをドメインごとにデータムとして分解することができます。つまり、このコマンドによって作成されたデータム数を数えればドメイン数を数えたことと同じであるといえます。
VBAで分解コマンドと同様の操作を行うには「HybridShapeFactoryオブジェクト」の「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もそれぞれでしかできないことがありますが、うまいこと組み合せればどちらの良さも活かしたツールが作成できるので、是非片方だけでなくどちらも深く勉強してみてください。
目次へ戻る