C#ATIA

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

ビューのサイズで四角を描く

ここの所、連日CATIA V5です。
さすがに、VBAエディタにも慣れてきましたが・・・やっぱり辛い。

では本題。DrawのViewのサイズを取得し絶対座標で四角を描きます。
もちろん四角を描くのが目的ではなく、最終的にはビューの中心を
取得したいです。

'vba
Option Explicit

Sub CATMain()

    Dim dDoc As DrawingDocument
    Set dDoc = CATIA.ActiveDocument

    Dim sheet As DrawingSheet
    Set sheet = dDoc.sheets.ActiveSheet

    Dim view As DrawingView
    For Each view In sheet.views
        dump_bbox ( _
            get_boundary_box_by_view( _
                view _
            ) _
        )
    Next

End Sub


'ビューのバウンダリボックス取得
Private Function get_boundary_box_by_view( _
    ByVal view As DrawingView) _
    As Variant

    Dim variView As Variant
    Set variView = view
    
    Dim size(3) As Variant
    variView.size size

    Dim viewScale As Double
    viewScale = view.Scale

    Dim i As Long
    For i = 0 To UBound(size)
        size(i) = size(i)
    Next

    get_boundary_box_by_view = Array( _
        size(0), _
        size(2), _
        size(1), _
        size(2), _
        size(0), _
        size(3), _
        size(1), _
        size(3) _
    )

End Function

Private Sub dump_bbox( _
    ByVal bBox As Variant)

    Dim dDoc As DrawingDocument
    Set dDoc = CATIA.ActiveDocument

    Dim sheet As DrawingSheet
    Set sheet = dDoc.sheets.ActiveSheet
    
    Dim view As DrawingView
    Set view = get_view_by_name("dump")
    
    Dim fact As Factory2D
    Set fact = view.Factory2D

    view.Activate

    Dim ary As Variant
    ary = Array( _
        bBox(0), _
        bBox(1), _
        bBox(2), _
        bBox(3), _
        bBox(6), _
        bBox(7), _
        bBox(4), _
        bBox(5), _
        bBox(0), _
        bBox(1) _
    )

    Dim i As Long
    Dim line As Line2D
    For i = 0 To UBound(bBox) Step 2
        Set line = fact.CreateLine( _
            ary(i), _
            ary(i + 1), _
            ary(i + 2), _
            ary(i + 3) _
        )
    Next

End Sub

Private Function get_view_by_name( _
    ByVal name As String, _
    Optional isCreate = True) _
    As DrawingView
    
    Dim dDoc As DrawingDocument
    Set dDoc = CATIA.ActiveDocument

    Dim views As DrawingViews
    Set views = dDoc.sheets.ActiveSheet.views

    Dim view As DrawingView
    For Each view In views
        If Not view.name = name Then
            GoTo continue
        End If
        
        Set get_view_by_name = view
        Exit Function
        
continue:
    Next

    If isCreate Then
        Set get_view_by_name = views.Add(name)
    Else
        Set get_view_by_name = Nothing
    End If
    
End Function

get_boundary_box_by_view関数内でビューのサイズを取得しています。
r1 DrawingView (Object)

ここで戻り値で4隅の座標に変更してから、返しているのですが、
理由はDrawingDimensionのGetBoundaryBoxメソッドの戻り値と
値を揃える為です。
r1 DrawingDimension (Object)

そもそも何でGetBoundaryBoxメソッドの戻り値は4隅の座標値にして
いるのかな?と最初に感じたのですが、寸法値の場合は斜めに傾いたものが
あるからだと解釈しました。


取りあえず、この様なデータで試します。

実行結果はこちらです。

あぁ忘れていました。メインとバックのビューは要らなかったのに・・・。
オレンジ色のハイライトさせているのが、描いた四角です。

実は知らなかったんですよ。

緑の矢印のビューの枠のサイズを取得すると思っていたのですが、
3Dから生成した形状のサイズしか取得してくれてません。
つまり、寸法等はまるで無視なんです・・・。
まぁこれはこれでありがたいのですが。

不幸中に幸い。うっかりメインとバックのビューも処理させたのですが、
ビューの原点の矢印は拾ってしまいます。

これ、迷惑なんですよね。(知っていたのですが忘れていました)
例えば、原点から離れている小さな断面とかが、想定外のサイズを
結果で返してきます。

どうしようかな?