最近、注釈矢印が指す点の座標を抽出するという小さな要求があります。
最初に、Note.GetAttachPos関数を発見しました。Annotation.GetPositionにはこの関数があります。
ただし、テストの結果、アノテーションリードがポリラインの場合、前の2つの関数の読み取り位置が正しい場合と正しくない場合があります。
2番目のタイプをすべて最初のタイプに置き換えることを考えることができたので、取得は正しいはずですが、APIを直接変換できないことがわかりました。
多くのデバッグを行った結果、ポリラインを使用しているが、ポリライン情報が1つしかない場合は正しい可能性があり、ポリラインの場合は基本的に間違っています。
マウスを引出線に移動すると、デフォルトの線に注釈のアイコンが直接表示されます。ポリラインに移動すると、オブジェクトではないことを示す別のアイコンが表示されます。それは組み合わせのようなものです。
API検査の結果、このポリラインには特別なオブジェクトがあることがわかりました。内部は複数行の情報で構成されています。
次に、アノテーションでGetMultiJogLeaderCountとGetMultiJogLeadersの2つのメソッドを見つけたので、より明白です。
ノートオブジェクトノートの基準点位置を取得する際には、判断が必要です。
GetMultiJogLeaderCount> 0の場合、それは複数行の注釈であることを意味し、情報を取得するにはMultiJogLeaderを使用する必要があります。他のキーポイント座標をトラバースします。
この座標は、ビューの位置と縮尺に関連しており、デフォルトでは図面全体の座標です。ビューに切り替える必要がある場合は、計算を行う必要があります。
以下は、マクロコードのセクションです。
Option Explicit
Sub main()
Dim swApp As SldWorks.SldWorks
Dim swModel As ModelDoc2
Dim swDraw As DrawingDoc
Dim swSelMgr As SelectionMgr
Dim swNote As Note
Dim swView As View
Dim viewPos As Variant
Dim notePos As Variant
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
Dim ann As Annotation
If Not swModel Is Nothing Then
If swModel.GetType <> swDocumentTypes_e.swDocDRAWING Then Exit Sub
Set swDraw = swModel
Set swSelMgr = swModel.SelectionManager
Dim selLeaders As SldWorks.MultiJogLeader
Dim lineData As Variant
If swSelMgr.GetSelectedObjectType3(1, -1) <> swSelectType_e.swSelNOTES Then Exit Sub
Set swNote = swSelMgr.GetSelectedObject6(1, 0)
Set swView = swDraw.ActiveDrawingView
viewPos = swView.Position
notePos = swNote.GetAttachPos
Set ann = swNote.GetAnnotation
If ann.GetMultiJogLeaderCount > 0 Then
Set selLeaders = ann.GetMultiJogLeaders(0)
If selLeaders Is Nothing = False Then
lineData = selLeaders.GetLineAtIndex(0)
For i = 0 To selLeaders.GetLineCount - 1
lineData = selLeaders.GetLineAtIndex(i)
If Not IsEmpty(lineData) Then
Debug.Print ("x:" & Math.Round((lineData(1) - viewPos(0)) * 1000# / swView.ScaleDecimal, 4))
Debug.Print ("y:" & Math.Round((lineData(2) - viewPos(1)) * 1000# / swView.ScaleDecimal, 4))
End If
Next i
End If
Else
End If
' 'ann.UseDocDispLeader = True
'Debug.Print (swView.Angle * 57.295779513)
' Debug.Print (Math.Round((notePos(0) - viewPos(0)) * 1000# / swView.ScaleDecimal, 4))
' Debug.Print (Math.Round((notePos(1) - viewPos(1)) * 1000# / swView.ScaleDecimal, 4))
' Debug.Print
End If
End Sub
それ以外の場合は、通常のGetAttachPosを押してオブジェクトを取得します。