C#SolidWorks二次開発API ---アノテーション参照ポイントのピット

最近、注釈矢印が指す点の座標を抽出するという小さな要求があります。
最初に、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を押してオブジェクトを取得します。

おすすめ

転載: blog.csdn.net/zengqh0314/article/details/105892110