「Drawの二つの点の距離を求めたい」と御相談頂きました。
過去に必要になった場合は、座標値から計算して求めていたのですが、
確かに他の方法を調べた事が有りませんでした。
まず、元にするデータですがアクティブなビューに点を
二つだけ作っておきます。
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
個人的には、座標値から計算するかなぁ。