参考老外的api网站,简单的弄了个,也当是自己再了解了解.
日期:2020年6月11日
C# SolidWorks 二次开发 API —注释引用点的坑
最近有个小需求,就是要把注释箭头指向的点的坐标提取出来。
刚开始发现Note.GetAttachPos功能,Annotation.GetPosition有这个功能。
但是经过测试发现,当注释的引线是多折线的时候,上两个函数就是读取的位置有时候对,有时候不对。
本来可以想着把所有的第二种换成第一种,那么获取的时候就应该正确了,但是发现API里面还不能直接转换。
经过大量的调试发现,如果使用的是多折线,但是只有一条折线信息的时候,可能是对的,如果是多折的,基本上不对。
当鼠标移动到引线上时,默认的一段直线直接显示的是注释的图标,当移动到是多段折线上时,显示的是另一个图标,说明它们不是一个对象。而更像是一个组合体。
经过api的检查,发现了这个多折线有一个专门的对象。里面是由多个线的信息组成。
然后又发现Annotation中两个方法 GetMultiJogLeaderCount 和 GetMultiJogLeaders,所以就更显明了。
在获取注释对象 Note的引用点位置时,需要做一个判断。
当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获取对象就可以了。