11. MicroStation Python:创建基本元素


欢迎来到MicroStation Python的世界!我们之前的文章探索了如何创建线(Line)和线串(Line String)元素。本文将深入研究使用Python在MicroStation中创建其它基本几何元素。

使用Python在MicroStation中创建基本元素

让我们深入探讨使用Python创建基本几何元素,如圆弧、圆、椭圆和形状。请参阅Python管理器文章以创建和加载Python项目。将项目命名为CreateBasicElements.py,并将其保存到任一目录中。在编辑器中打开项目以编写Python脚本。

导入模块

该脚本首先导入几个模块,这些模块提供了与MicroStation交互和创建几何元素的函数和类。

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

创建弧(Arc)元素

createArcElement()函数为圆弧元素获取多个参数,包括基点、半径、旋转、起始角和扫掠角。它使用ArcHandler.CreateArcElement()方法创建具有这些参数的弧元素。该脚本包括错误检查,以确保弧元素成功创建并添加到模型中。

def createArcElement(basePoint, radius=100, rotation=math.pi/4,
                       startAngle=0, sweepAngle=math.pi/2):
    global ACTIVEMODEL

    arc_eeh = EditElementHandle()

    axis1 = axis2 = radius

    # Create Arc element
    status = ArcHandler.CreateArcElement(arc_eeh, None, basePoint, axis1, axis2,
                                            rotation, startAngle, sweepAngle, 
                                            ACTIVEMODEL.Is3d(), ACTIVEMODEL)
    if BentleyStatus.eSUCCESS != status:
        return False

    # Add the Arc element to model
    if BentleyStatus.eSUCCESS != arc_eeh.AddToModel():
        return False
        
    return True

创建圆(Circle)和椭圆(Ellipse)元素

createCircleElement()函数将基点和半径作为圆元素的参数。createEllipseElement()函数将基点、半径和旋转作为椭圆元素的参数。它们两个都使用EllipseHandler.CreateEllipseElement()方法来创建。脚本包括错误检查,以确保圆元素成功创建并添加到模型中。详细代码请见靠后的总代码部分。

 

创建形(Shape)元素

createShapeElement()函数在给定的基点生成一个形元素。它定义并设置必要的坐标,然后使用ShapeHandler.CreateShapeElement()方法来创建形元素。该脚本包括错误检查,以确保成功创建形元素并将其添加到模型中。详细代码请见靠后的总代码部分。

 

将以上代码集成在一起 :main函数

main函数初始化当前模型并调用函数来创建几何元素。
下面是完整的脚本。

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


# Create Shape Element function
def createShapeElement(basePoint):
    global ACTIVEMODEL

    shape_eeh = EditElementHandle()

    # Set Shape coordinates
    offset = 150
    points = DPoint3dArray()
    points.append (DPoint3d (basePoint.x, basePoint.y, 0.0))
    points.append (DPoint3d (basePoint.x + offset, basePoint.y, 0.0))
    points.append (DPoint3d (basePoint.x + offset, basePoint.y + offset, 0.0))
    points.append (DPoint3d (basePoint.x, basePoint.y + offset, 0.0))
    points.append (DPoint3d (basePoint.x, basePoint.y, 0.0))

    # Create Shape element
    status = ShapeHandler.CreateShapeElement (shape_eeh, None, points, 
                                               ACTIVEMODEL.Is3d(), ACTIVEMODEL)

    if BentleyStatus.eSUCCESS != status:
        return False

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

    return True


# Create Ellipse Element function
def createEllipseElement(basePoint, radius=100, rotation=0):
    global ACTIVEMODEL

    ellipse_eeh = EditElementHandle()

    axis2 = radius
    axis1 = axis2 / 2

    # Create Ellipse element
    status = EllipseHandler.CreateEllipseElement(ellipse_eeh, None, 
                                                    basePoint, 
                                                    axis1, axis2,
                                                    rotation, 
                                                    ACTIVEMODEL.Is3d(), 
                                                    ACTIVEMODEL)
    if BentleyStatus.eSUCCESS != status:
        return False

    # Add the Ellipse element to model
    if BentleyStatus.eSUCCESS != ellipse_eeh.AddToModel():
        return False
        
    return True


# Create Circle Element function
def createCircleElement(basePoint, radius=50):
    global ACTIVEMODEL

    circle_eeh = EditElementHandle()

    ell = DEllipse3d.FromCenterRadiusXY(basePoint, radius)

    # Create Ellipse element
    status = EllipseHandler.CreateEllipseElement(circle_eeh, None, ell, 
                                                    ACTIVEMODEL.Is3d(), 
                                                    ACTIVEMODEL)
    if BentleyStatus.eSUCCESS != status:
        return False

    # Add the Ellipse element to model
    if BentleyStatus.eSUCCESS != circle_eeh.AddToModel():
        return False
        
    return True


# Create Arc Element function
def createArcElement(basePoint, radius=100, rotation=math.pi/4,
                       startAngle=0, sweepAngle=math.pi/2):
    global ACTIVEMODEL

    arc_eeh = EditElementHandle()

    axis1 = axis2 = radius

    # Create Arc element
    status = ArcHandler.CreateArcElement(arc_eeh, None, basePoint, axis1, axis2,
                                            rotation, startAngle, sweepAngle, 
                                            ACTIVEMODEL.Is3d(), ACTIVEMODEL)
    if BentleyStatus.eSUCCESS != status:
        return False

    # Add the Arc element to model
    if BentleyStatus.eSUCCESS != arc_eeh.AddToModel():
        return False
        
    return True


# Main function
def main():
    # Global variable declaration
    global ACTIVEMODEL

    # Get the active DGN model reference
    ACTIVEMODEL = ISessionMgr.ActiveDgnModelRef
    if ACTIVEMODEL is None:
        return
        
    if True != createArcElement(DPoint3d(0, 0, 0)):
        print("Create Arc element failed...")

    if True != createCircleElement(DPoint3d(200, 0, 0)):
        print("Create Circle element failed...")

    if True != createEllipseElement(DPoint3d(400, 0, 0)):
        print("Create Ellipse element failed...")

    if True != createShapeElement(DPoint3d(600, -75, 0)):
        print("Create Shape element failed...")

    PyCadInputQueue.SendKeyin("FIT VIEW EXTENDED")


if __name__ == "__main__":
    main()

运行/执行项目

从Python管理器对话框中选择项目CreateBasicElements.py,并运行/执行Python脚本。
瞧!圆弧、圆、椭圆和形元素已成功创建并添加到MicroStation当前模型中了。

image

通过参考提供的示例和文档增强上述代码,为封闭元素添加填充属性。
祝您编码愉快!