Last week I created a class that will let you add labels to models. This week I created a rule to show/hide labels from named faces. To make this work we need to know which attributes are used for named faces.
For this I will use the attributes I proposed in an earlier post “Add function GetProxyIntent() to Ilogic”. (Autodesk has not implemented this feature therefore I proposed my own attributes.) Finding the named faces with the attributes is not that difficult. But adding a label to the faces is a bit of a challenge. I want the labels to point at the middle of the named face. Also, I need the arrow to be perpendicular to the face. (Perpendicular at the point of the arrow. That is imported for curved faces).
Brian Ekins wrote a paper “How Deep is the Rabbit Hole? Examing the Matrix and other Inventor math and geometry objects” for the Autodesk university 2008 . It’s a very interesting paper and I would recommend it to anyone. The one thing that is interesting for now is the chapter about “Surfaces”. It describes how to get the center and the normal of a face. The normal happens to be a vector that is perpendicular to the face at a point.
With all this information I created the following rule that will show labels for each named face in a assembly. For this rules to work you need to class/rule from my previous post “Label.iLogicVb”
AddVbFile "Label.iLogicVb" Sub Main() Dim doc As AssemblyDocument = ThisDoc.Document Dim objs As ObjectCollection = doc.AttributeManager.FindObjects("iLogicEntityNameSet", "iLogicProxyEntityName") Dim labels As List(Of Label) = New List(Of Label)() For Each obj As Object In objs If TypeOf obj Is Inventor.FaceProxy Then Dim face As Face = obj Dim attSet As AttributeSet = face.AttributeSets.Item("iLogicEntityNameSet") Dim att As Attribute = attSet.Item("iLogicProxyEntityName") Try Dim l As Label = addLabelToFace(face, att.Value) labels.Add(l) Catch End Try End If Next End Sub Private Function addLabelToFace(face As FaceProxy, name As String) As Label Dim occ As ComponentOccurrence = face.Parent.Parent Dim Params(0 To 3) As Double Dim points(0 To 3) As Double Dim normals(0 To 3) As Double Dim eval As SurfaceEvaluator = face.Evaluator Dim box As Box2d = eval.ParamRangeRect Params(0) = (box.MaxPoint.X - box.MinPoint.X) / 2 + box.MinPoint.X Params(1) = (box.MaxPoint.Y - box.MinPoint.Y) / 2 + box.MinPoint.Y face.Evaluator.GetPointAtParam(Params, points) face.Evaluator.GetNormalAtPoint(points, normals) Dim oPoint As Point = ThisApplication.TransientGeometry.CreatePoint(points(0), points(1), points(2)) oPoint.TransformBy(occ.Transformation) Dim normal As UnitVector = ThisApplication.TransientGeometry.CreateUnitVector(normals(0), normals(1), normals(2)) Return New Label(ThisDoc.Document, name, oPoint, normal) End Function
I guess that the function “addLabelToFace()” could also be use full in other function.
But now we have the labels added the faces. Now we only need a way to remove them. Closing the document to remove them is not very user-friendly. The following rule will remove all labels.
AddVbFile "Label.iLogicVb" Dim doc As AssemblyDocument = ThisDoc.Document Dim objs As ObjectCollection = doc.AttributeManager.FindObjects("iLogicEntityNameSet", "iLogicProxyEntityName") Dim labels As List(Of Label) = New List(Of Label)() For Each obj As Object In objs If TypeOf obj Is Inventor.FaceProxy Then Dim face As Face = obj Dim attSet As AttributeSet = face.AttributeSets.Item("iLogicEntityNameSet") Dim att As Attribute = attSet.Item("iLogicProxyEntityName") Dim label As Label = New Label(doc, att.Value) labels.Add(label) End If Next For Each label As Label In labels label.delete() Next