In the previous sections, we looked at retrieving data from elements such as lines, circles, and text. For more complex structures, we need more functions to get detailed information.
We will start again with text nodes. Text nodes are interesting elements because you can access targeted text without knowing the exact position by using the text node number. Text nodes, although usually comprised of text, can also be empty, or have one or more lines of text.
An essential function in accessing text of a node is the .GetSubElements method.This will give us a range of elements, similar to those we have already gotten when using the ElementEnumerator. In the evaluation of elements, we will encounter complex elements that we can break down into simpler individual elements. This will help us extract data from groups or cells much more easily. In text nodes, however, there is no further nesting, because a text node only contains text with a size of 0 to n.
Using the previous examples as a basis for the evaluation of text nodes, we can create a simple routine for evaluating text nodes that might look something like this:
Sub elementinfo() Dim ele As Element Dim ee As ElementEnumerator Dim eeSub As ElementEnumerator Dim startpoint, endpoint As Point3d Dim header, Line As String Dim file As String If ActiveWorkspace.IsConfigurationVariableDefined("MeineAusgabeFile") Then file = ActiveWorkspace.ConfigurationVariableValue("MeineAusgabeFile") Else MsgBox "The variable MyOutputFile is not defined. Stopped processing", vbCritical Exit Sub End If Open file For Append As #1 Set ee = ActiveModelReference.GraphicalElementCache.Scan() Do While ee.MoveNext If ee.Current.IsTextNodeElement Then Set eeSub = ee.Current.AsTextNodeElement.GetSubElements Do While eeSub.MoveNext Set ele = eeSub.Current Lin e = "TextNode#: " & ee.Current.AsTextNodeElement.NodeNumber & ";" If ele.Type = msdElementTypeText Then Line = Line & ele.Type & ";Origin (xy) = " & ele.AsTextElement.Origin.X & "," & ele.AsTextElement.Origin.Y & ";" Line = Line & "Height: " & ele.AsTextElement.TextStyle.Height & ";" Line = Line & "Text: " & ele.AsTextElement.Text Print #1, Line End If Loop End If Loop Close #1 End Sub
The text output will be the same as before, with the exception of the node number of the text node at the beginning.
I have put a two line text node 3 different times using the place text command. The issue here is that the text nodes are automatically numbered, so that when a new text node is placed, it gets the next available node number.
The evaluation of many drawings have always presented problems from the fact that both texts and text nodes can be present. Text nodes may occur when hitting the return key while creating a text element so that there are 2 lines of text, but the second one is blank. Visually, they will look the same, but the element types will have changed.
The method that we have learned (.GetSubElements) is important to know when extracting data from nested structures if you know that text nodes are in any nested structures such as groups, cells, or pseudo-cells.
Before we continue to go deeper into this, let's first take a look at other complex data structures that have direct access possibilities.In addition, I have drawn the following shapes: a red line, a blue line string, and a green shape:
Whatever differentes or similarities these elements have, I read out the geometric data using the key points of the elements with the previously stated method.
The line is only a special case of a line string except with only 2 vertices.
To read vertices, I define an array of points:
Dim l() As Point3d
With the query:
If ee.Current.IsLineElement Then ...
I can identify both the line and the line string. Because I can identify the shape, I add another option:
If ee.Current.IsLineElement Or ee.Current.IsShapeElement Then ...
The following analysis should be able to write the vertices of the elements in a file. However, because the number of vertices per element is previously unclear, I will output one line per vertex.
The module could look something like this:
Sub elementinfo() Dim ele As Element Dim ee As ElementEnumerator Dim startpoint, endpoint As Point3d Dim header, Line As String Dim l() As Point3d Dim file As String If ActiveWorkspace.IsConfigurationVariableDefined("MyOutputFile") Then file = ActiveWorkspace.ConfigurationVariableValue("MyOutputFile") Else MsgBox "The variable MyOutputFile is not defined. Stopped processing", vbCritical Exit Sub End If Open file For Append As #1 Set ee = ActiveModelReference.GraphicalElementCache.Scan() Do While ee.MoveNext If ee.Current.IsLineElement Or ee.Current.IsShapeElement Then l = ee.Current.AsVertexList.GetVertices Line = "Typ: " & ee.Current.Type & " with " & UBound(l) - LBound(l) + 1 & " Vertices" Print #1, Line For i = LBound(l) To UBound(l) Line = "Vertex # " & i + 1 & "(xyz);" Line = Line & l(i).X & ";" & l(i).Y & ";" & l(i).Z Print #1, Line Next End If Loop Close #1
The example with 3 different elements has the following output:
With the coordinates, you can see that the last item is a closed element.
In the next section, we will look at complex structures such as cells.
<< RETURN TO PART 5 << >> CONTINUE ON TO PART 7 >>