欢迎来到MicroStation Python世界!本文将指导您使用Python在MicroStation中创建线串元素(LineString Element)。
让我们深入探讨如何创建一个线串元素。请参阅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()函数只是调用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的当前模型中了。
通过探索提供的示例,扩展上述代码为将线串元素拉伸/投影成曲面或实体元素。
编码愉快!