今天在论坛上看到一个帖子,问起如何让草图符号(Sketched Symbol)附着到气球(Balloon)。用户界面是能做的,但API失败。经过一些研究,发现这里有些技巧。
先来看看用户界面怎么做:
首选选择草图符号, 右键菜单里有一项
Inventor会让你选择位置作为引线的端点,在气球附近移动鼠标,你会发现在气球圆圈周上,鼠标会变成一个小十字,而在其它位置还是箭头。这说明有效的位置只是气球的圆周。而用户的API代码使用的是气球圆心位置,于是失败了。另外发现,用户界面操作,先选择气球上的点,接着是草图符号点位置。而API的引线点集合首先需要添加草图符号点位置, 接着是气球上的点。否则也会失败。
以下是个简单代码,假定你有一张图纸,已经创建了一个气球和草图符号。拾取它们,然后运行。它取用气球圆半径,从圆心(气球的位置Position)沿着X方向计算出圆周上的一个点。
Public Sub AttachSymbolToBalloon()
' 假定打开一张工程图
Dim oDrawDoc As DrawingDocument
oDrawDoc = ThisApplication.ActiveDocument
' 获取当前图纸
Dim oActiveSheet As Sheet
oActiveSheet = oDrawDoc.ActiveSheet
' 假定拾取了气球和草图符号
Dim oBalloon As Balloon
oBalloon = oDrawDoc.SelectSet.Item(1)
Dim oSS As SketchedSymbol
oSS = oDrawDoc.SelectSet.Item(2)
'需要的引线点集合
Dim oObjColl As ObjectCollection
oObjColl = ThisApplication.TransientObjects.CreateObjectCollection()
' 第一个是草图符号位置点
Dim oFirstPt1 As Point2d
oFirstPt1 = ThisApplication.TransientGeometry.CreatePoint2d(oSS.Position.X, oSS.Position.Y)
'第二个是气球圆周上某点
Dim oPtItent As Point2d
oPtItent = ThisApplication.TransientGeometry.CreatePoint2d( _
oBalloon.Position.X + oBalloon.Style.BalloonDiameter / 2, _
oBalloon.Position.Y)
Dim oBalloonIntent As GeometryIntent
oBalloonIntent = oActiveSheet.CreateGeometryIntent(oBalloon, oPtItent)
' 注意添加顺序
Call oObjColl.Add(oFirstPt1)
Call oObjColl.Add(oBalloonIntent)
' 加入引线。
Call oSS.Leader.AddLeader(oObjColl)
End Sub