From Inventor 2009, API has provided the direct way to create balloon. Following is a code to mimic the creation of balloon, adding the balloon elements to a drawing sketch.
Private Sub DrawBalloon()
' assume we have got Inventor application
'set a reference to the drawing document
'this assumes a drawing document is active
Dim oDrawDoc As DrawingDocument
oDrawDoc =
_InvApplication.ActiveDocument
'get the sketch on the sheet
'or create a new sketch on the active sheet
Dim oSketch As DrawingSketch
If oDrawDoc.ActiveSheet.Sketches.Count = 0 Then
oSketch = oDrawDoc.ActiveSheet.Sketches.Add
Else
oSketch = oDrawDoc.ActiveSheet.Sketches(1)
End If
' Create text using various overrides.
Dim strBalloonText As String
strBalloonText =
InputBox("Enter text for the balloon:")
Dim oTG As TransientGeometry
oTG = _InvApplication.TransientGeometry
' Open the sketch for edit so the text boxes can be created.
oSketch.Edit()
Dim oPnt2d As Point2d
oPnt2d = oTG.CreatePoint2d(10, 15)
Dim sText As String
sText =
"<StyleOverride Bold='True' " + _
"Italic='True' FontSize='0.5'>" + _
strBalloonText + "</StyleOverride>"
Dim oTextBox As TextBox
oTextBox =
oSketch.TextBoxes.AddFitted(
oTG.CreatePoint2d(oPnt2d.X + 2.0#,
oPnt2d.Y + 2.0#), sText)
Dim oTextBoxOrigin As Point2d
oTextBoxOrigin = oTextBox.Origin
'draw the balloon
If (Len(strBalloonText) > 0 And
Len(strBalloonText) < 3) Then
Dim oBalloonCtPt As Point2d
oBalloonCtPt = oTG.CreatePoint2d
oBalloonCtPt.X =
oTextBoxOrigin.X + oTextBox.Width / 2
oBalloonCtPt.Y =
oTextBoxOrigin.Y - oTextBox.Height / 2
Dim dBalloonRad As Double
dBalloonRad =
oTextBox.Width / 2.0# + 0.5
Dim oBalloon As SketchCircle
oBalloon =
oSketch.SketchCircles.AddByCenterRadius(
oBalloonCtPt, dBalloonRad)
'draw the line connecting balloon and workpoint
Dim dDist As Double
dDist =
Math.Sqrt((oBalloonCtPt.X - oPnt2d.X) *
(oBalloonCtPt.X - oPnt2d.X) +
(oBalloonCtPt.Y - oPnt2d.Y) *
(oBalloonCtPt.Y - oPnt2d.Y))
Dim oLineEndPt As Point2d
oLineEndPt = oTG.CreatePoint2d
oLineEndPt.X =
((oPnt2d.X - oBalloonCtPt.X) *
(dBalloonRad / dDist)) + oBalloonCtPt.X
oLineEndPt.Y =
((oPnt2d.Y - oBalloonCtPt.Y) *
(dBalloonRad / dDist)) +
oBalloonCtPt.Y
Dim oConnectLine As SketchLine
oConnectLine =
oSketch.SketchLines.AddByTwoPoints(
oLineEndPt, oPnt2d)
End If
If (Len(strBalloonText) >= 3) Then
Dim oBalloonLine1StartPt As Point2d
oBalloonLine1StartPt =
oTG.CreatePoint2d
oBalloonLine1StartPt.X =
oTextBoxOrigin.X
oBalloonLine1StartPt.Y =
oTextBoxOrigin.Y + 0.25
Dim oBalloonLine1EndPt As Point2d
oBalloonLine1EndPt =
oTG.CreatePoint2d
oBalloonLine1EndPt.X =
oTextBoxOrigin.X + oTextBox.Width
oBalloonLine1EndPt.Y =
oTextBoxOrigin.Y + 0.25
Dim oBalloonLine2StartPt As Point2d
oBalloonLine2StartPt =
oTG.CreatePoint2d
oBalloonLine2StartPt.X =
oTextBoxOrigin.X
oBalloonLine2StartPt.Y =
oTextBoxOrigin.Y - oTextBox.Height - 0.25
Dim oBalloonLine2EndPt As Point2d
oBalloonLine2EndPt =
oTG.CreatePoint2d
oBalloonLine2EndPt.X =
oTextBoxOrigin.X + oTextBox.Width
oBalloonLine2EndPt.Y =
oTextBoxOrigin.Y - oTextBox.Height - 0.25
Call oSketch.SketchLines.AddByTwoPoints(
oBalloonLine1StartPt,
oBalloonLine1EndPt)
Call oSketch.SketchLines.AddByTwoPoints(
oBalloonLine2StartPt,
oBalloonLine2EndPt)
Dim oBalloonArc1CtPt As Point2d
oBalloonArc1CtPt =
oTG.CreatePoint2d(
(oBalloonLine1StartPt.X +
oBalloonLine2StartPt.X) / 2,
(oBalloonLine1StartPt.Y +
oBalloonLine2StartPt.Y) / 2)
Dim oBalloonArc2CtPt As Point2d
oBalloonArc2CtPt =
oTG.CreatePoint2d((oBalloonLine1EndPt.X +
oBalloonLine2EndPt.X) / 2,
(oBalloonLine1EndPt.Y +
oBalloonLine2EndPt.Y) / 2)
oSketch.SketchArcs.AddByCenterStartEndPoint(
oBalloonArc1CtPt, oBalloonLine1StartPt,
oBalloonLine2StartPt)
oSketch.SketchArcs.AddByCenterStartEndPoint(
oBalloonArc2CtPt, oBalloonLine1EndPt,
oBalloonLine2EndPt, False)
Dim dDist, dBalloonRad, oLineEndPt, oConnectLine
'draw the line connecting balloon and workpoint
dDist =
Math.Sqrt((oBalloonArc1CtPt.X - oPnt2d.X) *
(oBalloonArc1CtPt.X - oPnt2d.X) +
(oBalloonArc1CtPt.Y - oPnt2d.Y) *
(oBalloonArc1CtPt.Y - oPnt2d.Y))
dBalloonRad =
Math.Sqrt((oBalloonArc1CtPt.X -
oBalloonLine1StartPt.X) *
(oBalloonArc1CtPt.X - oBalloonLine1StartPt.X)
+ (oBalloonArc1CtPt.Y -
oBalloonLine1StartPt.Y) *
(oBalloonArc1CtPt.Y -
oBalloonLine1StartPt.Y))
oLineEndPt = oTG.CreatePoint2d
oLineEndPt.X =
((oPnt2d.X - oBalloonArc1CtPt.X) *
(dBalloonRad / dDist)) +
oBalloonArc1CtPt.X
oLineEndPt.Y = ((oPnt2d.Y - oBalloonArc1CtPt.Y) *
(dBalloonRad / dDist)) +
oBalloonArc1CtPt.Y
oConnectLine =
oSketch.SketchLines.AddByTwoPoints
(oLineEndPt, oPnt2d)
End If
' Exit the sketch from the edit environment.
oSketch.ExitEdit()
End Sub