【開発者向】ランダム生成した座標値で点を一括作成するマクロ|CATIAマクロの作成方法
CATIAマクロの開発をしているとき確認用のデータが無くて困ることがちょくちょくあります。
たとえば形状セット内のすべての点の座標をExcelに書き出すマクロを開発するとき、実際に作成したコードを試す用のデータとしていくつかの点を事前に作る必要があります。
というわけで、今回はそんなマクロ開発者向けのデータ作成用のマクロです。
機能としては指定した範囲内でのランダムな座標値で、複数の点を一括作成することができます。
点の座標を取得したり変更したり、Excelに転記するようなマクロを開発する際のデータを準備するのが面倒なときなどに利用してみてください。コピペ実行ですぐに利用可能できます。
マクロの機能
マクロの機能としては、
指定した範囲内でのランダムな座標値で、複数の点を一括作成することができます。
・「Random Points」セット内にランダムな座標値で、複数の点を一括作成する
・コード内の定数値を書き換えることで任意の範囲で点を一括作成できる
Const qty = 10 ‘作成する点の個数
Const max = 100 ‘最大座標値
Const min = -100 ‘最小座標値
※上記の場合、点が10個ランダムの座標値(-100 < x,y,z座標値 < 100)で生成される
・生成されるランダムの座標値は小数点以下第3位で丸める
実務作業では全く使いどころのないマクロですが、マクロ開発において「座標値がバラバラな点をたくさん作って実行確認をしたい」というときに便利なマクロです。
サンプルコード
マクロのサンプルコードです。コピペですぐ利用できます。
座標値の範囲指定や作成する点の個数の指定方法は、以降のコード解説の項を参照下さい。
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 |
Option Explicit Sub CATMain() Dim doc As PartDocument Set doc = CATIA.ActiveDocument Dim pt As Part Set pt = doc.Part Dim hsf As HybridShapeFactory Set hsf = pt.HybridShapeFactory Dim hb As HybridBody Set hb = pt.HybridBodies.Add hb.Name = "Random Points" Const qty = 10 '作成する点の個数 Const max = 100 '最大座標値 Const min = -100 '最小座標値 Dim i As Long Dim xc As Double Dim yc As Double Dim zc As Double For i = 1 To qty Randomize xc = (max - min + 1) * Rnd + min 'x座標生成(min < xc < max) yc = (max - min + 1) * Rnd + min 'y座標生成(min < yc < max) zc = (max - min + 1) * Rnd + min 'z座標生成(min < zc < max) xc = Format(xc, "0.000") ' yc = Format(yc, "0.000") '小数点第3位にまるめる zc = Format(zc, "0.000") ' Dim p As Point Set p = hsf.AddNewPointCoord(xc, yc, zc) hb.AppendHybridShape p pt.UpdateObject p Next i End Sub |
コード解説
Document / Part / HybridShapeFactoryオブジェクト定義
1 2 3 4 5 6 7 8 |
Dim doc As PartDocument Set doc = CATIA.ActiveDocument Dim pt As Part Set pt = doc.Part Dim hsf As HybridShapeFactory Set hsf = pt.HybridShapeFactory |
Document / Part / HybridShapeFactoryオブジェクトを定義します。
各オブジェクトは下記の用途で使用します。
PartDocument :Partオブジェクト定義用
Part :HybridShapeFactoryオブジェクト定義用 / 形状セット作成用
HybridShapeFactory:点(Pointオブジェクト)作成用
新規形状セット作成
1 2 3 |
Dim hb As HybridBody Set hb = pt.HybridBodies.Add hb.Name = "Random Points" |
次に作成する点を格納するための形状セットを作成します。
本マクロでは新規形状セットを仕様ツリー第1階層に作成するため、Partオブジェクトの「HybridBodiesプロパティ」を取得し、「Addメソッド」を使用します。
形状セットの名前は「Nameプロパティ」で変更可能です。
現コードでは「Random Points」という名称に変更させています。
定数定義
1 2 3 |
Const qty = 10 '作成する点の個数 Const max = 100 '最大座標値 Const min = -100 '最小座標値 |
次に本マクロで作成する「点の個数」と「座標値の範囲」を指定するための定数を用意します。
各定数で指定している内容はコメント文の通りです。
実行前にこの定数値を書き換えることで作成する点数や座標値の範囲を変更することができます。
たとえば上記の場合、点が10個ランダムの座標値(-100 < x,y,z座標値 < 100)で作成されます。
※x,y,z座標それぞれ別々として範囲指定することはできません。
点作成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
Dim i As Long Dim xc As Double Dim yc As Double Dim zc As Double For i = 1 To qty Randomize xc = (max - min + 1) * Rnd + min 'x座標生成(min < xc < max) yc = (max - min + 1) * Rnd + min 'y座標生成(min < yc < max) zc = (max - min + 1) * Rnd + min 'z座標生成(min < zc < max) xc = Format(xc, "0.000") ' yc = Format(yc, "0.000") '小数点第3位にまるめる zc = Format(zc, "0.000") ' Dim p As Point Set p = hsf.AddNewPointCoord(xc, yc, zc) hb.AppendHybridShape p pt.UpdateObject p Next i |
最後に先ほど設定した定数の情報を使って点の作成を行っていきます。
座標を指定した点の作成自体は「HybridShapeFactoryオブジェクト」の「AddNewPointCoordメソッド」を使って下記のように書きます。
hsf.AddNewPointCoord (X座標, Y座標, Z座標)
※hsf はHybridShapeFactoryオブジェクト
コードの処理内容としては、上記の点作成の構文をループ文を使ってqty回実行するだけです。
今回は座標として指定した範囲での乱数(ランダムな値)を使用するため、乱数生成用の「Rnd関数」を使いループ毎に座標値をランダムで生成するようにします。
指定した範囲内で乱数を生成するには「Rnd関数」を使い下記のように書きます。
Excel VBAでもよく使用する定型文です。
乱数 = (max – min + 1) * Rnd + min
※maxは最大値 / minは最小値を入力
ここで範囲指定するための「max」と「min」は事前に設定した定数を使用します。
また、上記コードによって生成される乱数はかなり細かい値となるため、ここでは小数点第3位までにまるめる処理を追加しています。
VBAでの四捨五入や切り捨て、切り上げの方法は様々ありますが、ここでは「Format関数」を使用します。「Format関数」の使い方は下記の通りです。
値 = Format( 値, “0.000”)
上記コードの青色の文字列を「”0.00″」にすれば小数点以下第2位まで、「”0.0000″」にすれば小数点以下第4位までにまるめることができます。
サンプルコードでは「xc = Format(xc, “0.000”)」のようにして、「Rand関数」で生成した細かい値の乱数を「Format関数」を使って扱いやすい値に直接変換させています。
まとめ
今回は「ランダム生成した座標値で点を一括作成するマクロ」の紹介でした。
処理の内容をまとめると下記のような流れです。
② 「作成する点の数」回以下の処理を順にループ
②-1. 指定した範囲内での乱数生成
②-2. 乱数を小数点以下第3位までにまるめる
②-3. まるめた値を座標として点を作成
やっていることはかなり単純なので1行1行見ていけばすぐに理解できると思います。
一般のCATIAユーザーの実用性は皆無ですが、マクロを作成する開発者としてはたまに使いたくなるようなマクロだと思います(かなり限られた状況ではありますが…)。
正直なお話本ページは、点の座標に関するマクロ案を頂いた時に毎回手作業で点を作成するのが面倒だったので、試したい時にコピペですぐ使えるように備忘録として残しておきたかっただけのものです。