VBAでスケッチ(Sketch)の直線(Line)と円弧(Arc)を作成する|CATIAマクロの作成方法
今回の記事は「マクロ案」でいただいた内容です。
送って頂いた内容は以下のようなマクロです。
ワークベンチ: スケッチャーワークベンチ
マクロ案:
スケッチでスプラインをマクロで記録をしようとしても記録されませんでした。
もしスケッチでプロファイル(主に線分と円弧)を描くマクロが作れたら知りたいです。
ご連絡頂いた通り、スケッチャー関連のコマンドはマクロの記録が対応していません。
そこでここではスケッチの「直線(Line)」と「円弧(Arc)」をVBAで作成する方法を紹介していきます。
サンプルコードは非常に単純なものですが、内容さえ理解できれば [プロファイル]と同じように形状を作成することができるようになります。(拘束については触れていません)
マクロの機能
今回作成したマクロはスケッチで上画像のような形状(プロファイル)を作成するマクロです。
具体的な機能は以下のとおりです。
・スケッチはツリー第1階層に新規作成される形状セット内に作成される
※ボディー用のコードも有り
コード自体は上画像のようなものしか作れませんが、 [プロファイル]は直線と円弧の組み合わせなので、作成方法さえ理解できれば同等ものをVBAでも作成することが可能になります。
サンプルコード
マクロのコードは以下のとおりです。
スケッチを形状セット内に作成する場合とボディー内に作成する場合でコード内容が少し変わるので注意しましょう。※現状は形状セット内に作成するコードになっています。
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 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
Sub CATMain() Dim doc As PartDocument Set doc = CATIA.ActiveDocument Dim pt As Part Set pt = doc.Part 'Sketch平面定義(XY平面の場合) Dim XYPlane As Plane Set XYPlane = pt.OriginElements.PlaneXY() 'HybridShape(形状セット内Sketch)の場合 Dim hb As HybridBody Set hb = pt.HybridBodies.Add Dim sk As Sketch Set sk = hb.HybridSketches.Add(XYPlane) ''Shape(ボディー内Sketch)の場合 ' Dim bd As Body ' Set bd = pt.Bodies.Add ' ' Dim sk As Sketch ' Set sk = bd.Sketches.Add(XYPlane) 'Sketch編集開始 Dim fac2d As Factory2D Set fac2d = sk.OpenEdition Dim tmp 'Line作成 Dim line1 As Line2D Set line1 = fac2d.CreateLine(0, 20, 50, 20) tmp = line1.StartPoint.Name 'Lineの始点を作成 tmp = line1.EndPoint.Name 'Lineの終点を作成 'Arc(Circle)作成 Dim arc1 'As Circle2D Set arc1 = fac2d.CreateCircle(0, 40, 20, deg2rad(90), deg2rad(-90)) tmp = arc1.StartPoint.Name 'Arcの始点を作成 tmp = arc1.EndPoint.Name 'Arcの終点を作成 Dim ctr(0 To 1) Call arc1.GetCenter(ctr) '中心点の座標取得 Dim point1 As Point2D Set point1 = fac2d.CreatePoint(ctr(0), ctr(1)) arc1.CenterPoint = point1 'point1をarc1の中心点に設定 'Sketch編集終了 sk.CloseEdition pt.Update End Sub '************************************************************************************ ' 関数名 :deg2rad ' 機能 :入力された角度(deg)をラジアンに変換して返す ' 引数 :x 角度(deg) '************************************************************************************ Function deg2rad(ByVal x As Double) Dim pi As Double pi = 4 * Atn(1) deg2rad = x * (pi / 180) End Function |
コード解説
ドキュメント/パーツの定義
1 2 3 4 5 |
Dim doc As PartDocument Set doc = CATIA.ActiveDocument Dim pt As Part Set pt = doc.Part |
まずはアクティブドキュメントとそのパーツを定義をします。
CATPart以外で実行するとエラーが発生します。
エラー処理が必要な場合はTypeName関数を使った条件分岐処理を用意して下さい。
スケッチ平面/スケッチ定義
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
'Sketch平面定義(XY平面の場合) Dim XYPlane As Plane Set XYPlane = pt.OriginElements.PlaneXY() 'HybridShape(形状セット内Sketch)の場合 Dim hb As HybridBody Set hb = pt.HybridBodies.Add Dim sk As Sketch Set sk = hb.HybridSketches.Add(XYPlane) ''Shape(ボディー内Sketch)の場合 ' Dim bd As Body ' Set bd = pt.Bodies.Add ' ' Dim sk As Sketch ' Set sk = bd.Sketches.Add(XYPlane) |
つぎにスケッチを定義します。
スケッチを定義するにはスケッチ平面を定義しておく必要があります。
上記コードでは「XY平面」をスケッチ平面として定義しています。
スケッチを定義するには下記のようなコードになります。
ボディー内のスケッチは「Sketches」、形状セット内のスケッチは「HybridSketches」内にAddメソッドを使って追加します。
‘形状セット内の場合
Dim sk As Sketch
Set sk = hb.HybridSketches.Add(スケッチ平面)
‘ボディー内の場合
Dim sk As Sketch
Set sk = bd.Sketches.Add(スケッチ平面)
サンプルコードでは両コードを用意しているので適宜コメント化を切り替えて使用してみて下さい。
Sketch編集開始(Factory2D定義)
1 2 3 |
'Sketch編集開始 Dim fac2d As Factory2D Set fac2d = sk.OpenEdition |
3D形状を作成する場合、「Factoryオブジェクト」「HybridFactoryオブジェクト」などを使用しますが、スケッチで形状を作成する場合は「Factory2Dオブジェクト」を利用します。
Factory2Dオブジェクトを定義するにはSketchオブジェクトの「OpenEditionメソッド」を使います。
直線(Line)作成
1 2 3 4 5 6 7 8 |
Dim tmp 'Line作成 Dim line1 As Line2D Set line1 = fac2d.CreateLine(0, 20, 50, 20) tmp = line1.StartPoint.Name 'Lineの始点を作成 tmp = line1.EndPoint.Name 'Lineの終点を作成 |
直線を作成するには先に定義した「Factory2Dオブジェクト」を使って下記のように書きます。
下記の座標部分を書き換えることで、任意の位置に直線を作成することができます。
Dim line1 As Line2D
Set line1 = fac2d.CreateLine(始点X座標, 始点Y座標, 終点X座標, 終点Y座標)
通常スケッチ上で直線を作成すると、直線と同時に始点と終点も同時に作成されます。
しかし上記コードを使ってVBAで直線を作成した場合は、直線のみしか作成されません。
そうすると直線の端点が無いことになり選択することもできなくなってしまいます。
指定した座標に点(Point2Dオブジェクト)を作成してもいいですが、毎回作るのは面倒です。
そこで適当に「空の変数(上記コードでいうtmp)」を使い、直線の始点と終点の名前を格納します。
こうすることで、直線の端点を作成することができます。
ここで重要なのは端点の名前を取得することではありません。
端点自体にアクセスすることです。
「StartPoint」「EndPoint」を使うことでLine2Dの端点ヘアクセスすることができます。そこで端点に対し”何らかの操作”を行うことでその端点が自動で作成されます。(つまり名前の取得でなく、座標の取得や名前の変更などでも可)
これにより手動で直線を作った時と同じ結果が得られます。
円弧(Arc)作成
1 2 3 4 5 6 7 8 9 10 11 12 13 |
'Arc(Circle)作成 Dim arc1 'As Circle2D Set arc1 = fac2d.CreateCircle(0, 40, 20, deg2rad(90), deg2rad(-90)) tmp = arc1.StartPoint.Name 'Arcの始点を作成 tmp = arc1.EndPoint.Name 'Arcの終点を作成 Dim ctr(0 To 1) Call arc1.GetCenter(ctr) '中心点の座標取得 Dim point1 As Point2D Set point1 = fac2d.CreatePoint(ctr(0), ctr(1)) arc1.CenterPoint = point1 'point1をarc1の中心点に設定 |
円弧を作成するには先に定義した「Factory2Dオブジェクト」を使って下記のように書きます。
下記の座標、角度部分を書き換えることで、任意の位置に直線を作成することができます。
Dim arc1 As Circle2D
Set arc1 = fac2d.CreateCircle(中心X座標, 中心Y座標, 半径, 始点角度, 終点角度)
上記コードで注意しないといけないのは入力する角度が「ラジアン」であるということです。
通常の度[°]ではないので注意しましょう。
サンプルコードでは「deg2rad」という度をラジアンに変換する関数を作成しています。
(「deg2rad(45)」と書けば45度をラジアンに変更した値が取得できます)
また、直線と同様にVBAで作成した円弧には、始点、終点、中心点が作成されません。
始点、終点は直線と同じようにすれば自動作成されますが、中心点は点を作成する必要があります。
点を作成するには先に定義した「Factory2Dオブジェクト」を使って下記のように書きます。
Dim point1 As Point2D
Set point1 = fac2d.CreatePoint(X座標, Y座標)
サンプルコードでは「GetCenterメソッド」を使って円弧の中心座標を取得して、その位置移転を作成していますが、円弧自体を作成する時に中心座標を入力しているので、それと同じ値を入れればいいので「GetCenterメソッド」を必ずしも使わないといけないということはないです。
円弧(Arc)作成
1 2 3 4 |
'Sketch編集終了 sk.CloseEdition pt.Update |
スケッチの形状作成が終了したら、「スケッチを終了する」という処理を行う必要があります。
上記コードのように終了するスケッチの「CloseEditionメソッド」を使うだけでOKです。
最後に「pt.Update」でパーツの更新をしています。
まとめ
今回はVBAでスケッチの形状を作成する方法についての内容でした。
今回やったようにスケッチでは座標を指定して形状を作成していきます。
そのため、決められた形状であればVBAでも問題なく作成することができますが、入力された値によって変形する形状の場合は少し難易度があがると思います。
「直線」と「円弧」ができれば簡単な形状は対応できると思いますが、その他形状も必要になると思います。その場合は今回のようにスケッチを定義して「Factory2Dオブジェクト」のメソッドを使えば作成することができるのでいろいろ試してみて下さい。
CATIAマクロを本気で勉強するなら