In my previous post I showed how to create your own iLogic function “GetProxyIntent()”. With that function it’s possible to get curves from geometry in an assembly and create an intent for it. But as I mentioned to have a good workflow, we are still missing some tools.
The standard iLogic environment will show labels on the faces that have been assigned a name. I have written code that will let you create your own labels. It will let you create labels anywhere you like and with any text that you want. (In fact you can customize everything to your wishes.) In an upcoming post I will use this to create labels on face that have been assigned a name.
The label is created with “Client graphics”. Client graphics provide the ability to draw custom graphics in the Inventor modeling window. But are not part of the model. Client graphics will be maintained for the duration of the session only. That means that the they will stop to exist as soon as you close the document and will not get saved.
I saved this as an external rule named “Label.iLogicVb”.
Imports Inventor
Public Class Label
Private oClientGraphics As ClientGraphics
Private oDataSets As GraphicsDataSets
Private ThisApplication As Inventor.Application
Private name As String
Private orign As Point
Public Sub New(doc As Document, name As String)
Me.ThisApplication = doc.Parent
Dim ClientGraphicsName = "hjalte.ClientGraphics-" & name
Dim GraphicsDataSet = "hjalte.GraphicsDataSet-" & name
Dim oCompDef As ComponentDefinition = doc.ComponentDefinition
oClientGraphics = oCompDef.ClientGraphicsCollection.Item(ClientGraphicsName)
oDataSets = doc.GraphicsDataSetsCollection.Item(GraphicsDataSet)
End Sub
Public Sub New(doc As Document, name As String, point1 As Point, vector As UnitVector)
Me.ThisApplication = doc.Parent
Dim oTg As TransientGeometry = ThisApplication.TransientGeometry
Dim arrowLength As Double = 0.2
Dim arrowRadius As Double = 0.05
Dim labelLength As Double = 2
Me.name = name
Me.orign = point1
Dim point2 = oTg.CreatePoint(vector.X * labelLength + point1.X,
vector.Y * labelLength + point1.Y,
vector.Z * labelLength + point1.Z)
Dim point3 = oTg.CreatePoint(vector.X * arrowLength + point1.X,
vector.Y * arrowLength + point1.Y,
vector.Z * arrowLength + point1.Z)
Dim ClientGraphicsName = "hjalte.ClientGraphics-" & name
Dim GraphicsDataSet = "hjalte.GraphicsDataSet-" & name
'Dim doc As AssemblyDocument = ThisDoc.Document
Dim oCompDef As ComponentDefinition = doc.ComponentDefinition
Try
oClientGraphics = oCompDef.ClientGraphicsCollection.Add(ClientGraphicsName)
oDataSets = doc.GraphicsDataSetsCollection.Add(GraphicsDataSet)
Catch ex As Exception
oClientGraphics = oCompDef.ClientGraphicsCollection.Item(ClientGraphicsName)
oDataSets = doc.GraphicsDataSetsCollection.Item(GraphicsDataSet)
Return
'Throw New Exception("Could not create label. Name was already used!")
End Try
Dim oSurfacesNode As GraphicsNode = oClientGraphics.AddNode(1)
Dim oTransientBRep As TransientBRep = ThisApplication.TransientBRep
Dim oBody As SurfaceBody = oTransientBRep.CreateSolidCylinderCone(point3, point1, arrowRadius, arrowRadius, 0)
Dim oSurfaceGraphics As SurfaceGraphics = oSurfacesNode.AddSurfaceGraphics(oBody)
oSurfaceGraphics.Color = ThisApplication.TransientObjects.CreateColor(0, 0, 0)
Dim textGraphics As TextGraphics = oSurfacesNode.AddTextGraphics()
textGraphics.Text = name
textGraphics.Anchor = point2
textGraphics.HorizontalAlignment = HorizontalTextAlignmentEnum.kAlignTextCenter
textGraphics.VerticalAlignment = VerticalTextAlignmentEnum.kAlignTextMiddle
textGraphics.Bold = True
textGraphics.FontSize = 21
textGraphics.PutTextColor(0, 255, 0)
textGraphics.BurnThrough = True
textGraphics.DepthPriority = -10000000
Dim LineGraphic As LineGraphics = oSurfacesNode.AddLineGraphics()
Dim oCoordSet As GraphicsCoordinateSet = oDataSets.CreateCoordinateSet(1)
oCoordSet.Add(1, point1)
oCoordSet.Add(2, point2)
LineGraphic.CoordinateSet = oCoordSet
Dim oGraphicsColorSet As GraphicsColorSet = oDataSets.CreateColorSet(1)
oGraphicsColorSet.Add(1, 0, 0, 0)
oGraphicsColorSet.Add(2, 0, 0, 0)
LineGraphic.ColorSet = oGraphicsColorSet
ThisApplication.ActiveView.Update()
End Sub
Public Sub delete()
oClientGraphics.Delete()
oDataSets.Delete()
ThisApplication.ActiveView.Update()
End Sub
End Class
Here is an example showing how you can use this class.
AddVbFile "Label.iLogicVb"
Dim point As Point = ThisApplication.TransientGeometry.CreatePoint(0, 0, 0)
Dim vector As UnitVector = ThisApplication.TransientGeometry.CreateUnitVector(1, 0, 0)
Dim label As Label = New Label(ThisDoc.Document, "Label 1", point, vector)
' label.delete()
This will produce something like this.
It's possible to remove the label again with the delete() function. Calling that function is not a problem in the same rule as the Label was created. But in other rules you have find the label again and then call the delete() function. here is an example how to do that.
AddVbFile "Label.iLogicVb"
Dim label As Label = New Label(ThisDoc.Document, "Label 1")
label.delete()