09. MicroStation Python:创建线串元素


欢迎来到MicroStation Python世界!本文将指导您使用Python在MicroStation中创建线串元素(LineString Element)。

用Python在MicroStation中创建一条线串

让我们深入探讨如何创建一个线串元素。请参阅Python管理器文章以创建和加载Python项目。将项目命名为LineStringElement.py,并将其保存到您的任意一个文件夹下。在编辑器中打开项目以编写Python脚本。

导入模块

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

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

函数

该脚本的主函数是createLineString()。

def createLineString():
    ...

让我们分解一下它的步骤:

1.  Active Model(当前模型)

MicroStation可以访问许多模型。以下脚本从当前启动的MicroStation中获取当前模型的引用。

   ACTIVEMODEL = ISessionMgr.ActiveDgnModelRef
   if ACTIVEMODEL is None:
       return False

2.  获取每个存储的分辨率单位(UOR)

以下脚本获取每个存储单元的UOR系数(双精度值类型)

   dgnModel = ACTIVEMODEL.GetDgnModel()
   modelInfo = dgnModel.GetModelInfo()
   mu = modelInfo.GetUorPerStorage()

3.  处理线串元素

为MSElement设置一个可写的“句柄”。 

   ls_eeh = EditElementHandle() 

4.  定义线串坐标

我们如下定义线串和设置线串元素的坐标。

    pt0 = DPoint3d (0, 0, 0)
    pt1 = DPoint3d (0, 0, 0)
    pt2 = DPoint3d (0, 0, 0)
    pt3 = DPoint3d (0, 0, 0)
    pt4 = DPoint3d (0, 0, 0)
    pt5 = DPoint3d (0, 0, 0)

    pt1.x = pt0.x; pt1.y = pt0.y - mu/2; pt1.z = pt0.z;
    pt2.x = pt1.x + mu/2; pt2.y = pt1.y; pt2.z = pt0.z;
    pt3.x = pt2.x; pt3.y = pt2.y - mu/2; pt3.z = pt0.z;
    pt4.x = pt3.x + mu/2; pt4.y = pt3.y; pt4.z = pt0.z;
    pt5.x = pt4.x; pt5.y = pt0.y; pt5.z = pt0.z;

5. 将坐标添加到一个DPoint3d数组中

我们定义一个DPoint3dArray对象并将坐标添加到它里面去。

    linePts = DPoint3dArray()
    linePts.append(pt0)
    linePts.append(pt1)
    linePts.append(pt2)
    linePts.append(pt3)
    linePts.append(pt4)
    linePts.append(pt5)
    linePts.append(pt0)

6. 创建线串元素

线串元素是使用LineStringHandler.CreateLineStringElement()函数创建的。此函数接受多个参数,包括线串元素句柄、线串坐标以及应添加线串元素的模型。
该脚本包括错误检查,以确保成功创建线串元素。

    status = LineStringHandler.CreateLineStringElement(ls_eeh, None,  linePts, ACTIVEMODEL.Is3d(), ACTIVEMODEL)
    if BentleyStatus.eSUCCESS != status:
        return False

7. 设置线串元素属性(线符)并将其添加到模型中

为新创建的线串元素设置其元素属性(线符)层、颜色、线型、线宽,并将该元素添加到模型中。
该脚本包括错误检查,以确保设置了元素属性,并且成功地将线串元素添加到模型中。

    levelID = createLevel("MyNewLevel")
    color = 2
    lineStyle = 0
    lineWeight = 3

    propertiesSetter = ElementPropertiesSetter()
    propertiesSetter.SetColor(color)
    propertiesSetter.SetLinestyle(lineStyle, None)
    propertiesSetter.SetWeight(lineWeight)
    propertiesSetter.SetLevel(levelID)

    if True == propertiesSetter.Apply(ls_eeh):
        if BentleyStatus.eSUCCESS != ls_eeh.AddToModel():
            return False

8.创建一个新层

在上面的代码中,第一行levelID=createLevel("MyNewLevel")为层名MyNewLevel返回一个层的ID。如果DGN文件中不存在该层名,则会在返回层ID之前创建一个新的层MyNewLevel。
下面是详细的创建新层的createLevel()函数代码。

def createLevel(levelName):
    dgnFile = ISessionMgr.GetActiveDgnFile()
    if dgnFile is None:
        return False

    levelCache = dgnFile.GetLevelCache()
    if levelCache is None:
        return False

    LevelHandle = levelCache.GetLevelByName(levelName)
    if not LevelHandle.IsValid():
        LevelHandle = levelCache.CreateLevel(levelName, LEVEL_NULL_CODE, LEVEL_NULL_ID)
        if not LevelHandle.IsValid():
            return False
        levelCache.Write()

    return LevelHandle.GetLevelId()

将以上代码放在一起:main()函数

main()函数只是调用createLineString()函数并检查其返回值。如果线串元素创建失败,将打印错误消息。
以下是完整的脚本。

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

# 创建层的函数
def createLevel(levelName):
    dgnFile = ISessionMgr.GetActiveDgnFile()
    if dgnFile is None:
        return False

    levelCache = dgnFile.GetLevelCache()
    if levelCache is None:
        return False

    LevelHandle = levelCache.GetLevelByName(levelName)
    if not LevelHandle.IsValid():
        LevelHandle = levelCache.CreateLevel(levelName, LEVEL_NULL_CODE, LEVEL_NULL_ID)
        if not LevelHandle.IsValid():
            return False
        levelCache.Write()

    return LevelHandle.GetLevelId()

# 创建线串元素的函数
def createLineString ():
    # 获取当前模型的引用
    ACTIVEMODEL = ISessionMgr.ActiveDgnModelRef

    # 从DGN模型获取模型信息
    dgnModel = ACTIVEMODEL.GetDgnModel()
    modelInfo = dgnModel.GetModelInfo() 
    mu = modelInfo.GetUorPerStorage()

    # 处理线串元素
    ls_eeh = EditElementHandle() 

    # 定义线串坐标点
    pt0 = DPoint3d (0, 0, 0)
    pt1 = DPoint3d (0, 0, 0)
    pt2 = DPoint3d (0, 0, 0)
    pt3 = DPoint3d (0, 0, 0)
    pt4 = DPoint3d (0, 0, 0)
    pt5 = DPoint3d (0, 0, 0)

    # 赋值线串坐标
    pt1.x = pt0.x; pt1.y = pt0.y - mu/2; pt1.z = pt0.z;
    pt2.x = pt1.x + mu/2; pt2.y = pt1.y; pt2.z = pt0.z;
    pt3.x = pt2.x; pt3.y = pt2.y - mu/2; pt3.z = pt0.z;
    pt4.x = pt3.x + mu/2; pt4.y = pt3.y; pt4.z = pt0.z;
    pt5.x = pt4.x; pt5.y = pt0.y; pt5.z = pt0.z;

    # 将坐标添加到DPoint3d数组
    linePts = DPoint3dArray()
    linePts.append(pt0)
    linePts.append(pt1)
    linePts.append(pt2)
    linePts.append(pt3)
    linePts.append(pt4)
    linePts.append(pt5)
    linePts.append(pt0)

    # 创建线串元素
    status = LineStringHandler.CreateLineStringElement(ls_eeh, None, linePts, ACTIVEMODEL.Is3d(), ACTIVEMODEL)
    if BentleyStatus.eSUCCESS != status:
        return False

   # 设置元素属性并将元素添加到模型中
    levelID = createLevel("MyNewLevel")
    color = 2
    lineStyle = 0
    lineWeight = 3

    propertiesSetter = ElementPropertiesSetter()
    propertiesSetter.SetColor(color)
    propertiesSetter.SetLinestyle(lineStyle, None)
    propertiesSetter.SetWeight(lineWeight)
    propertiesSetter.SetLevel(levelID)
    if True == propertiesSetter.Apply(ls_eeh):
        if BentleyStatus.eSUCCESS != ls_eeh.AddToModel():
            return False
        
    return True

# 主函数
def main():
    if True != createLineString():
        print("Could not create a Line String element")

    PyCadInputQueue.SendKeyin("FIT VIEW EXTENDED")

if __name__ == "__main__":
	main()
运行/执行项目

从Python管理器对话框中选择项目LineStringElement.py并运行/执行Python脚本。
瞧!带有元素属性(线符)的一个线串元素并成功创建并添加到MicroStation的当前模型中了。

image

通过探索提供的示例,扩展上述代码为将线串元素拉伸/投影成曲面或实体元素。
编码愉快!