MicroStation Python: Create Complex Elements


 

Welcome to the world of MicroStation Python! In our previous wikis, we explored how to create simple elements in MicroStation using Python. This time, we will dive into creating Complex elements. Additionally, we will set Element Properties (Symbology), including the Fill property, for the Complex Shape element.

 

Create Complex Elements in MicroStation using Python

Let us dive into creating Complex elements such as Complex Chain and Complex Shape using Python. Refer to the Python Manager wiki to create and load a python project. Name your project as "CreateComplexElement.py" and save it to your preferred directory. Open the project in the editor for writing your Python script.

 

Import Modules

The script begins by importing several modules offering functions and classes to interact with MicroStation and to create geometric elements.

from MSPyBentley import *
from MSPyBentleyGeom import *
from MSPyECObjects import *
from MSPyDgnPlatform import *
from MSPyDgnView import *
from MSPyMstnPlatform import *

 

Create a Complex Chain Element

The CreateComplexChainElement() function creates a complex chain element and includes error checking to ensure the element is successfully created and added to the model.

It begins by creating a Chain Header using the ChainHeaderHandler.CreateChainHeaderElement() method.

Note the 3rd parameter isClosed: is set to False for a CMPLXSTRINGELM.

Next multiple line elements are created using the LineHandler.CreateLineElement() method and is added to a chain header using the ChainHeaderHandler.AddComponentElement() method.

Update the chain elements range once all components have been added using the ChainHeaderHandler.AddComponentComplete() method.

def CreateComplexChainElement():
    global ACTIVEMODEL

    cc_eeh = EditElementHandle()

    NUM_LINES = 3

    lines0 = EditElementHandle()
    lines1 = EditElementHandle()
    lines2 = EditElementHandle()

    Lines = [lines0, lines1, lines2]
    m_points = [[DPoint3d() for i in range(2)] for j in range(NUM_LINES)]

    # Create Lines and add to Chain Header
    ChainHeaderHandler.CreateChainHeaderElement(cc_eeh, None, False, 
                                                 ACTIVEMODEL.Is3d(), ACTIVEMODEL)

    for j in range(0, NUM_LINES):
        if (j == 0):
            m_points[j][0].x = 0; m_points[j][0].y = 0
            m_points[j][1].x = 0; m_points[j][1].y = 5000

        if (j == 1):
            m_points[j][0].x = 0; m_points[j][0].y = 5000
            m_points[j][1].x = 5000; m_points[j][1].y = 5000

        if (j == 2):
            m_points[j][0].x = 5000; m_points[j][0].y = 5000
            m_points[j][1].x = 5000; m_points[j][1].y = 0

        pt1 = DPoint3d(m_points[j][0].x, m_points[j][0].y, m_points[j][0].z)
        pt2 = DPoint3d(m_points[j][1].x, m_points[j][1].y, m_points[j][1].z)

        seg = DSegment3d(pt1, pt2)
        LineHandler.CreateLineElement(Lines[j], None, seg, 
                                       ACTIVEMODEL.Is3d(), ACTIVEMODEL)

        ChainHeaderHandler.AddComponentElement (cc_eeh, Lines[j])

    # Update Complex Chain element range
    ChainHeaderHandler.AddComponentComplete(cc_eeh)

    # Add the Complex Chain element to model
    if BentleyStatus.eSUCCESS != cc_eeh.AddToModel():
        return False

    return True

 

Following script sets the Properties (Symbology) of the Complex Chain element, including color and weight.

    # Set Element Properties (Symbology) to Element
    color = 100
    weight = 2
    propertiesSetter = ElementPropertiesSetter()
    propertiesSetter.SetColor(color)
    propertiesSetter.SetWeight(weight)
    propertiesSetter.Apply(cc_eeh)

 

Create a Complex Shape Element

The CreateComplexShapeElement() function takes base point as a parameter and creates a complex shape element. Function includes error checking to ensure the element is successfully created and added to the model.

It begins by creating a Chain Header using the ChainHeaderHandler.CreateChainHeaderElement() method.

Note the 3rd parameter isClosed: is set to True for a CMPLXSHAPEELM.

Next an Arc, Line String element is created using the  ArcHandler.CreateArcElement(), LineStringHandler.CreateLineStringElement() methods and added to the chain header using the ChainHeaderHandler.AddComponentElement() method.

Update the chain elements range once all components have been added using the ChainHeaderHandler.AddComponentComplete() method.

def CreateComplexShapeElement (basePt):
    global g_1mu
    global ACTIVEMODEL

    a_eeh = EditElementHandle()
    l_eeh = EditElementHandle()
    cs_eeh = EditElementHandle()

    # Create Complex Shape Header Element
    ChainHeaderHandler.CreateChainHeaderElement(cs_eeh, None, True, 
                                                 ACTIVEMODEL.Is3d(), ACTIVEMODEL)  


    # Create Arc Element
    pt1 = DPoint3d()
    pt2 = DPoint3d()
    pt3 = DPoint3d()

    pt1.x = basePt.x
    pt1.y = basePt.y
    pt1.z = 0.0
    pt2.x = g_1mu*1.3
    pt2.y = + g_1mu*0.7
    pt2.z = 0.0
    pt3.x = basePt.x + g_1mu
    pt3.y = basePt.y + g_1mu
    pt3.z = basePt.z

    el3d = DEllipse3d.FromPointsOnArc(pt3, pt2, pt1)
    status = ArcHandler.CreateArcElement(a_eeh, None, el3d, 
                                          ACTIVEMODEL.Is3d(), ACTIVEMODEL)

    if BentleyStatus.eSUCCESS != status:
        return False

    # Add Arc/Ellipse to Chain Header
    ChainHeaderHandler.AddComponentElement (cs_eeh, a_eeh)
    ChainHeaderHandler.AddComponentComplete(cs_eeh)  


    # Create LineString Element
    pt2.x = pt1.x + g_1mu
    pt2.y = pt1.y
    points = DPoint3dArray()
    points.append(pt1)
    points.append(pt2)
    points.append(pt3)

    status = LineStringHandler.CreateLineStringElement(l_eeh, None, points, 
                                                        ACTIVEMODEL.Is3d(), 
                                                        ACTIVEMODEL)

    if BentleyStatus.eSUCCESS != status:
        return False
    
    # Add LineString to Chain Header
    ChainHeaderHandler.AddComponentElement (cs_eeh, l_eeh)
    ChainHeaderHandler.AddComponentComplete(cs_eeh)  

    # Set color, weight to the created element
    color = 100
    weight = 2
    propertiesSetter = ElementPropertiesSetter()
    propertiesSetter.SetColor(color)
    propertiesSetter.SetWeight(weight)
    propertiesSetter.Apply(cs_eeh)

    # Add and Set fill color
    fill_color = 31
    IAreaFillPropertiesEdit = cs_eeh.GetHandler()
    IAreaFillPropertiesEdit.AddSolidFill(cs_eeh, fill_color, True)

    # Add the Complex Shape element to model
    if BentleyStatus.eSUCCESS != cs_eeh.AddToModel():
        return False
    
    return True

 

Following script sets Properties (Symbology) of the Complex Shape element, including color and weight.

    # Set color, weight to the created element
    color = 100
    weight = 2
    propertiesSetter = ElementPropertiesSetter()
    propertiesSetter.SetColor(color)
    propertiesSetter.SetWeight(weight)
    propertiesSetter.Apply(cs_eeh)

 

Following script sets a Fill property to the closed Complex Shape element.

    # Add and Set fill color
    fill_color = 31
    IAreaFillPropertiesEdit = cs_eeh.GetHandler()
    IAreaFillPropertiesEdit.AddSolidFill(cs_eeh, fill_color, True)

 

Putting it all Together: The main Function

The main function initializes the global variables and calls the functions to create the complex elements.

Here is the complete script.

from MSPyBentley import *
from MSPyBentleyGeom import *
from MSPyECObjects import *
from MSPyDgnPlatform import *
from MSPyDgnView import *
from MSPyMstnPlatform import *


# Create Complex Shape element
def CreateComplexShapeElement (basePt):
    global g_1mu
    global ACTIVEMODEL

    a_eeh = EditElementHandle()
    l_eeh = EditElementHandle()
    cs_eeh = EditElementHandle()

    # Create Complex Shape Header Element
    ChainHeaderHandler.CreateChainHeaderElement(cs_eeh, None, True, 
                                                 ACTIVEMODEL.Is3d(), ACTIVEMODEL)  

    # Create Arc Element
    pt1 = DPoint3d()
    pt2 = DPoint3d()
    pt3 = DPoint3d()

    pt1.x = basePt.x
    pt1.y = basePt.y
    pt1.z = 0.0
    pt2.x = g_1mu*1.3
    pt2.y = + g_1mu*0.7
    pt2.z = 0.0
    pt3.x = basePt.x + g_1mu
    pt3.y = basePt.y + g_1mu
    pt3.z = basePt.z

    el3d = DEllipse3d.FromPointsOnArc(pt3, pt2, pt1)
    status = ArcHandler.CreateArcElement(a_eeh, None, el3d, 
                                          ACTIVEMODEL.Is3d(), ACTIVEMODEL)

    if BentleyStatus.eSUCCESS != status:
        return False

    # Add Arc/Ellipse to Chain Header
    ChainHeaderHandler.AddComponentElement (cs_eeh, a_eeh)
    ChainHeaderHandler.AddComponentComplete(cs_eeh)  


    # Create LineString Element
    pt2.x = pt1.x + g_1mu
    pt2.y = pt1.y
    points = DPoint3dArray()
    points.append(pt1)
    points.append(pt2)
    points.append(pt3)

    status = LineStringHandler.CreateLineStringElement(l_eeh, None, points, 
                                                        ACTIVEMODEL.Is3d(), 
                                                        ACTIVEMODEL)

    if BentleyStatus.eSUCCESS != status:
        return False
    
    # Add LineString to Chain Header
    ChainHeaderHandler.AddComponentElement (cs_eeh, l_eeh)
    ChainHeaderHandler.AddComponentComplete(cs_eeh)  

    # Set color, weight to the created element
    color = 100
    weight = 2
    propertiesSetter = ElementPropertiesSetter()
    propertiesSetter.SetColor(color)
    propertiesSetter.SetWeight(weight)
    propertiesSetter.Apply(cs_eeh)

    # Add and Set fill color
    fill_color = 31
    IAreaFillPropertiesEdit = cs_eeh.GetHandler()
    IAreaFillPropertiesEdit.AddSolidFill(cs_eeh, fill_color, True)

    # Add the Complex Shape element to model
    if BentleyStatus.eSUCCESS != cs_eeh.AddToModel():
        return False
    
    return True


# Create Complex Chain element
def CreateComplexChainElement():
    global ACTIVEMODEL

    cc_eeh = EditElementHandle()

    NUM_LINES = 3

    lines0 = EditElementHandle()
    lines1 = EditElementHandle()
    lines2 = EditElementHandle()

    Lines = [lines0, lines1, lines2]
    m_points = [[DPoint3d() for i in range(2)] for j in range(NUM_LINES)]

    # Create Lines and add to Chain Header
    ChainHeaderHandler.CreateChainHeaderElement(cc_eeh, None, False, 
                                                 ACTIVEMODEL.Is3d(), ACTIVEMODEL)

    for j in range(0, NUM_LINES):
        if (j == 0):
            m_points[j][0].x = 0; m_points[j][0].y = 0
            m_points[j][1].x = 0; m_points[j][1].y = 5000

        if (j == 1):
            m_points[j][0].x = 0; m_points[j][0].y = 5000
            m_points[j][1].x = 5000; m_points[j][1].y = 5000

        if (j == 2):
            m_points[j][0].x = 5000; m_points[j][0].y = 5000
            m_points[j][1].x = 5000; m_points[j][1].y = 0

        pt1 = DPoint3d(m_points[j][0].x, m_points[j][0].y, m_points[j][0].z)
        pt2 = DPoint3d(m_points[j][1].x, m_points[j][1].y, m_points[j][1].z)

        seg = DSegment3d(pt1, pt2)
        LineHandler.CreateLineElement(Lines[j], None, seg, 
                                       ACTIVEMODEL.Is3d(), ACTIVEMODEL)

        ChainHeaderHandler.AddComponentElement (cc_eeh, Lines[j])

    # Update Complex Chain element range
    ChainHeaderHandler.AddComponentComplete(cc_eeh)

    # Set Element Properties (Symbology) to Element
    color = 100
    weight = 2
    propertiesSetter = ElementPropertiesSetter()
    propertiesSetter.SetColor(color)
    propertiesSetter.SetWeight(weight)
    propertiesSetter.Apply(cc_eeh)

    # Add the Complex Chain element to model
    if BentleyStatus.eSUCCESS != cc_eeh.AddToModel():
        return False

    return True


def main():
    # Global Variables
    global g_1mu
    global ACTIVEMODEL

    # Get the active DGN model reference
    ACTIVEMODEL = ISessionMgr.ActiveDgnModelRef
    dgnModel = ACTIVEMODEL.GetDgnModel()
    modelInfo = dgnModel.GetModelInfo() 
    g_1mu = modelInfo.GetUorPerStorage()

    # Create Complex Chain element
    if True != CreateComplexChainElement():
        print("Complex Chain creation failed...")

    # Create Complex Shape element
    if True != CreateComplexShapeElement(DPoint3d(g_1mu, 0, 0)):
        print("Complex Shape creation failed...")

    PyCadInputQueue.SendKeyin("FIT VIEW EXTENDED")


#main
if __name__ == "__main__":
    print ("Create Complex Elements...")
    main()

 

Run/Execute project

Select project "CreateComplexElement.py" from the Python Manager dialog and Run/Execute the python script.

Voila! A complex string and a complex shape element are successfully created and added to your active MicroStation model.

image

Enhance the above code to add, register key-ins within MicroStation for the above Create complex chain and complex shape functions. Refer to the delivered examples and documentation.

Happy coding!