C#ATIA

↑タイトル詐欺 主にFusion360API 偶にCATIA V5 VBA(絶賛ネタ切れ中)

Drawのスプラインを描く2

こちらの続きです。
Drawのスプラインを描く1 - C#ATIA

スプラインのマクロの記録を行うのですが、イロイロと問題が有ります。
・ファイル自体に問題が残る可能性がある為、新規のPartファイルで行う。
・スケッチに入る → スプライン作成 → スケッチを抜ける まで記録する。
・確認する為の再実行する際、最後まで実行する。↓こちらの問題が有り!
スケッチをクローズする - C#ATIA

それらを踏まえた上で進めていきます。


まず、スケッチを予め作成しておきますが、空のスケッチは残しておけない為
適当に点なり線なりを書いてスケッチから抜けておきます。
f:id:kandennti:20190731130239p:plain

続いてスプラインのマクロを記録しました。

Sub CATMain()

Dim partDocument1 As PartDocument
Set partDocument1 = CATIA.ActiveDocument

Dim part1 As part
Set part1 = partDocument1.part

Dim bodies1 As Bodies
Set bodies1 = part1.Bodies

Dim body1 As Body
Set body1 = bodies1.Item("パーツ ボディー")

Dim sketches1 As Sketches
Set sketches1 = body1.Sketches

Dim sketch1 As Sketch
Set sketch1 = sketches1.Item("スケッチ.1")

part1.InWorkObject = sketch1

Dim factory2D1 As Factory2D
Set factory2D1 = sketch1.OpenEdition()

Dim controlPoint2D1 As ControlPoint2D
Set controlPoint2D1 = factory2D1.CreateControlPoint(209.93692, -28.521069)

controlPoint2D1.ReportName = 2

Dim controlPoint2D2 As ControlPoint2D
Set controlPoint2D2 = factory2D1.CreateControlPoint(98.861, 35.288517)

controlPoint2D2.ReportName = 3

Dim controlPoint2D3 As ControlPoint2D
Set controlPoint2D3 = factory2D1.CreateControlPoint(11.024345, -32.459942)

controlPoint2D3.ReportName = 4

Dim arrayOfObject1(2)
Set arrayOfObject1(0) = controlPoint2D3
Set arrayOfObject1(1) = controlPoint2D2
Set arrayOfObject1(2) = controlPoint2D1
Dim spline2D1 As Spline2D
Set factory2D1Variant = factory2D1
Set spline2D1 = factory2D1Variant.CreateSpline(arrayOfObject1)

spline2D1.ReportName = 5

sketch1.CloseEdition

part1.InWorkObject = body1

part1.UpdateObject sketch1

End Sub

念のためUndoし実行した所、再現出来たので記録は録れています。

Drawで使用する場合無関係な部分もあるのですが、一通り見てみましょう。

Sub CATMain()

Dim partDocument1 As PartDocument
Set partDocument1 = CATIA.ActiveDocument

・・・

part1.InWorkObject = sketch1

この辺りまではマクロとしての準備ですね。

Dim factory2D1 As Factory2D
Set factory2D1 = sketch1.OpenEdition()

ここは画面上では変化は無いのですが、スケッチに入るようなイメージです。
(実際はFactry2Dの取得ですけど・・・)

Dim controlPoint2D1 As ControlPoint2D
Set controlPoint2D1 = factory2D1.CreateControlPoint(209.93692, -28.521069)

controlPoint2D1.ReportName = 2

・・・

Dim arrayOfObject1(2)
Set arrayOfObject1(0) = controlPoint2D3
Set arrayOfObject1(1) = controlPoint2D2
Set arrayOfObject1(2) = controlPoint2D1

ここでは、スプラインのコントロールポイントを作り、バリアント型配列に
入れています。
ReportNameって何だろう? と思い調べましたが良くわかりませんでした。
r1 Geometry2D (Object)
その後のコードを見ても使ってないので、要らないような気もします。

Dim spline2D1 As Spline2D
Set factory2D1Variant = factory2D1
Set spline2D1 = factory2D1Variant.CreateSpline(arrayOfObject1)

spline2D1.ReportName = 5

ようやくスプラインが出てきました。
CreateSplineメソッドにコントロールポイントの配列をパラメータとして
渡せばOKなようです。
但し、Factory2Dは素のまま使用しておらず、一度バリアント型変数に
渡した上で使用する必要がありそうです。

sketch1.CloseEdition

スケッチから抜けるイメージです。

part1.InWorkObject = body1

part1.UpdateObject sketch1

あとは、それなりの処理ですね。


コントロールポイントのバリアント型配列をバリアント型のFactory2Dの
CreateSplineメソッドに渡せば出来そう って事になります。