C#ATIA

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

Drawの2点間距離を求める

「Drawの二つの点の距離を求めたい」と御相談頂きました。

過去に必要になった場合は、座標値から計算して求めていたのですが、
確かに他の方法を調べた事が有りませんでした。


まず、元にするデータですがアクティブなビューに点を
二つだけ作っておきます。
f:id:kandennti:20190801182224p:plain
3Dとリンクしていない、純粋にDrawの点です。

〇パラメータと式
まず思い付いたのが、こちらのパラメータと式を使った方法です。
ボディ - ボディ の最短距離の測定1 - C#ATIA
これ、手動でも出来ませんでした・・・。

〇SPAWorkbench
続いて思い付くのが、SPAWorkbenchを利用した方法です。
ボディ - ボディ の最短距離の測定3 - C#ATIA
疑問が2つ。
・DrawingDocumentからSPAWorkbenchが取得出来るのか?
・Drawの要素でReferenceが取得出来るのか?

'vba Referenceから2点間距離
Sub CATMain()
    Dim doc As DrawingDocument
    Set doc = CATIA.ActiveDocument
    
    Dim vi As DrawingView
    Set vi = doc.Sheets.ActiveSheet.views.ActiveView
    
    Dim p1 As Point2D
    Set p1 = vi.GeometricElements.Item(2)
    
    Dim ref1 As Reference
    Set ref1 = GetReference(p1)
    
    Dim p2 As Point2D
    Set p2 = vi.GeometricElements.Item(3)
    
    Dim ref2 As Reference
    Set ref2 = GetReference(p2)
    
    leng = GetLength_Ref(ref1, ref2)
    
    MsgBox leng
End Sub

'リファレンスの取得
Private Function GetReference( _
    ByVal p As Point2D) _
    As Reference
    
    Dim sel As selection
    Set sel = CATIA.ActiveDocument.selection
        
    sel.Clear
    sel.Add p
    Set GetReference = sel.Item2(1).Reference
    sel.Clear
    
End Function

'2点間最短距離-SPAWorkbench
Private Function GetLength_Ref( _
    ByVal ref1 As Reference, _
    ByVal ref2 As Reference) _
    As Double
    
    GetLength_Ref = CATIA.ActiveDocument _
        .GetWorkbench("SPAWorkbench") _
        .GetMeasurable(ref1) _
        .GetMinimumDistance(ref2)
        
End Function

試した所OKです。
・DrawingDocumentからSPAWorkbenchが取得出来ます。
・Drawの要素はSelection経由でReferenceが取得出来ます。
Selection経由以外でReferenceを取得する方法あるのかな?


〇座標値から計算
最後に何時もやっている、点の座標値を取得して計算させる方法です。

'vba 座標値から計算で2点間距離
Sub CATMain()
    Dim doc As DrawingDocument
    Set doc = CATIA.ActiveDocument
    
    Dim vi As DrawingView
    Set vi = doc.Sheets.ActiveSheet.views.ActiveView
    
    Dim p1 As Point2D
    Set p1 = vi.GeometricElements.Item(2)
    
    Dim pos1 As Variant
    pos1 = GetPos(p1)
    
    Dim p2 As Point2D
    Set p2 = vi.GeometricElements.Item(3)
    
    Dim pos2 As Variant
    pos2 = GetPos(p2)
    
    leng = GetLength_Pos(pos1, pos2)
    
    MsgBox leng
End Sub

'座標値取得
Private Function GetPos( _
    ByVal p As Point2D) _
    As Variant
    
    Dim pv As Variant
    Set pv = p
    
    Dim pos(1) As Variant
    pv.GetCoordinates pos
    
    GetPos = pos
    
End Function

'2点間最短距離-座標値
Private Function GetLength_Pos( _
    ByVal pos1 As Variant, _
    ByVal pos2 As Variant) _
    As Double
    
    GetLength_Pos = Sqr( _
        (pos2(0) - pos1(0)) ^ 2 + _
        (pos2(1) - pos1(1)) ^ 2)
        
End Function

個人的には、座標値から計算するかなぁ。