C#ATIA

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

Drawのスプラインを描く3

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

前回の記録を録ったマクロを、Drawで流用する事を考慮し修正します。

一番欲しいのはスプラインの作成部分ですが、コントロールポイントも必要と
なる事が前回わかりましたので、それも含めて関数化してしまいたいです。

つまり座標値配列をスプライン作成関数に突っ込むと、スプラインが出来上がる

と言う感じです。

'vba
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")
    
    Dim factory2D1 As Factory2D
    Set factory2D1 = sketch1.OpenEdition()
    
    Dim posLst As Variant
    posLst = Array( _
                Array(209.93692, -28.521069), _
                Array(98.861, 35.288517), _
                Array(11.024345, -32.459942) _
                )
    
    Dim spline2D1 As Spline2D
    Set spline2D1 = InitSpline2D(posLst, factory2D1)
    
    sketch1.CloseEdition
    
    part1.Update

    MsgBox "Done"
    
End Sub

'スプラインの作成
'param:posLst
''' @param:posLst-array(array(Double,Double),,,)
''' @param:fact-Factory2D
''' @return:Spline2D
Private Function InitSpline2D( _
    ByVal posLst As Variant, _
    ByVal fact As Factory2D) _
    As Spline2D
    
    'コントロールポイント用配列
    Dim ctls() As Variant
    ReDim ctls(UBound(posLst))
    
    'コントロールポイントを作りつつ配列に代入
    Dim i As Long
    Dim ctl As ControlPoint2D
    For i = 0 To UBound(posLst)
        pos = posLst(i)
        Set ctls(i) = fact.CreateControlPoint(pos(0), pos(1))
    Next
    
    'バリアントFactory2D
    Dim factVri As Variant
    Set factVri = fact
    
    'スプライン生成
    Set InitSpline2D = factVri.CreateSpline(ctls)
    
End Function

目的の為に、InitSpline2D関数を作りました。パラメータは
座標値配列とFactory2Dです。 Factory2Dさえ受け取ってしまえば
スケッチだろうがDrawだろうが関係無く使用出来る関数 と言うわけです。

実際に実行すると、記録を録ったマクロと同様のスケッチのスプラインが
出来上がることが確認出来ました。
f:id:kandennti:20190731141533p:plain


いよいよ本題です。
先程作った「InitSpline2D関数」はDrawでも流用出来るようにしています。
必要なのは座標値配列とFactory2Dです。Drawの場合、Factory2Dは
DrawingViewオブジェクトのプロパティとして持っています。
Drawのスプラインを描く1 - C#ATIA

その為、アクティブなビューにスプラインを描くようなマクロに修正してみました。

'vba
Sub CATMain()
    
    Dim doc As DrawingDocument
    Set doc = CATIA.ActiveDocument
    
    Dim vi As DrawingView
    Set vi = doc.Sheets.ActiveSheet.views.ActiveView
    
    Dim fact As Factory2D
    Set fact = vi.Factory2D
    
    Dim posLst As Variant
    posLst = Array( _
                Array(209.93692, -28.521069), _
                Array(98.861, 35.288517), _
                Array(11.024345, -32.459942) _
                )
    
    Dim sp As Spline2D
    Set sp = InitSpline2D(posLst, fact)

    MsgBox "Done"
    
End Sub

極端な話ですが、スケッチ時のFactory2Dが

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

Drawでは

    Dim fact As Factory2D
    Set fact = vi.Factory2D

に変わったようなものです。

実際に実行してみると、こんな感じです。
f:id:kandennti:20190731142832p:plain
もう怖くないでしょ?