Python

Line-String and Shape Elements

MicroStation line-string and shape elements contain an array of 3D points. Each point is a vertex of the line or shape.

The same structure represents Shape Elements (type 6), Curve Elements (type 11), and Conic Elements (type 13). Shapes differ from line strings in that shape elements always start and end at the same point. Curve and conic elements use the first and last vertices to establish the slope at the beginning and end.

DGN line elements, in contrast to line-string elements, have only two vertices: the start and end points.

LineStringHandler and ShapeHandler

The MicroStation Python LineStringHandler provides many useful functions. Unfortunately, it does not provide those most basic properties: vertex count and vertex indexing (i.e. the [] operator).

Access DGN Element Internals

Many DGN elements contain useful geometric information, and line-string and shape elements are no exception. The element structure includes an array of 3D points (Python DPoint3d) and the vertex count. In response to a question on the Be Communities Programming Forum, Robert Hook and Leonard Jones suggested this solution …

def GetLineStringVertices(element_id: int, dgn_model):
    ''' Get the DPoint3d vertex array directly from line-string or shape element. '''
    eeh = EditElementHandle(element_id, dgn_model)
	# Get DGN raw element
    element = eeh.GetElement ()
    element_type = eeh.GetElementType ()

    if element_type not in [ICurvePrimitive.eCURVE_PRIMITIVE_TYPE_LineString, ICurvePrimitive.eCURVE_PRIMITIVE_TYPE_Shape,]:
        MessageCenter.StatusMessage = "Element not a linear string"
        return
	#  Get vertex count from DGN element data
    vertex_count = element.line_string_3d.numverts
    print (f"Element Type: {element_type} - Total Vertices: {vertex_count}")
	#  Get vertices from DGN element data
    for i in range (0, vertex_count):
        print (f"[{i+1}] - X:{element.line_string_3d.vertice[i].x/uor},
                           Y:{element.line_string_3d.vertice[i].y/uor},
                           Z:{element.line_string_3d.vertice[i].z/uor}")

Questions

Post questions about MicroStation Python programming to the MicroStation Programming Forum.