昨天的示例 Python+DRVT 从外部调用 Revit:创建桁架族-CSDN博客 展示了在外部让 Revit 自动完成一个完整族的创建。今天回到项目中常用的基本元素“墙”,看看如何指挥 Revit 自动批量创建:
from typing import List
import math
# drvt_pybind 支持多会话、多文档,先从简单的单会话、单文档开始
# MyContext是在Python中用户自定义的单会话、单文档的上下文管理类
from packs.core import MyContext, m2feet, feet2m, isNone
# 导入驱动 Revit 的核心模块
from drvt_pybind.Autodesk import Revit
from drvt_pybind.Autodesk.Revit import DB
# 遍历标高,返回按Elevation从低到高的List[DB.Level]
def getLevels(ctx : MyContext) -> List[DB.Level]:
tmp : List[DB.Level] = []
levelList = DB.FilteredElementCollector.ctor(ctx.session, ctx.doc).OfClass(ctx.session.typeof(DB.Level)).ToElements()
for i in range(levelList.getCount()):
l = DB.asLevel(levelList.getItem(i))
if isNone(l):
continue
tmp.append(l)
ret = sorted(tmp, key=lambda x:x.getElevation())
return ret
# 遍历WallType,返回List[DB.WallType]
def getWallTypes(ctx : MyContext) -> List[DB.WallType]:
wallTypeList : List[DB.WallType] = []
listWt = DB.FilteredElementCollector.ctor(ctx.session, ctx.doc).OfClass(ctx.session.typeof(DB.WallType)).ToElements()
for i in range(listWt.getCount()):
wt = DB.asWallType(listWt.getItem(i))
if isNone(wt):
continue
wallTypeList.append(wt)
return wallTypeList
# 示例批量创建墙
def WallCreation(ctx: MyContext) -> None:
"""
本示例展示如何使用Python+DRVT,在外面自动让Revit批量创建墙
"""
if ctx.doc is not None:
ctx.closeDoc(True)
template = "建筑样板.rte"
fileName = "批量创建墙示例.rvt"
err = ctx.createAndActiveDoc(template, fileName)
if err != 0:
raise AssertionError(f"创建项目文档失败: 错误码 {err}")
session = ctx.session
doc = ctx.doc
# 取所有标高,缺省是两个
levelList = getLevels(ctx)
if len(levelList) < 2:
raise AssertionError(f"标高过少,本示例用到2个标高")
level0 = levelList[0].getId()
level1 = levelList[1].getId()
ele0 = levelList[0].getElevation()
try:
# 取所有墙类型
wallTypeList = getWallTypes(ctx)
# 涉及到修改操作的,需要锁定并用事务包装
ctx.lockAndStartTransaction("批量创建墙")
for i in range(0,10):
# 取一个WallType
wallType = wallTypeList[i % len(wallTypeList)]
# 设置WallType
ctx.doc.SetDefaultElementTypeId(DB.ElementTypeGroup.WallType, wallType.getId())
# 这里使用轴线法
# 创建墙的轴线
p0 = DB.XYZ.ctor(session, m2feet(i*3), m2feet(-3), ele0)
p1 = DB.XYZ.ctor(session, m2feet(i*3), m2feet(3), ele0)
line = DB.Line.CreateBound(session, p0, p1)
# 创建墙
wall = DB.Wall.Create(session, doc, line, level0, False)
# 取“顶部约束”参数
p = wall.getParameter(DB.BuiltInParameter.WALL_HEIGHT_TYPE)
# 更新其值为“标高2”的ID
p.Set(level1)
# 提交事务并解锁,若没有错误则修改操作将会生效
ctx.commitTransactionAndUnlock()
except Exception as e:
print(f"【异常】{e}")
# 回滚事务并解锁
ctx.rollbackTransactionAndUnlock()
# 下面这段代码,看过“创建新项目”示例的会很熟悉,就是照搬过来的
# 创建新的上下文(可以按需创建多个,意味着能直接管理多个 Revit 会话)
ctx = MyContext("在这里指定会话名称")
# 初始化会话(启动 Revit 进程实例)
ctx.initSession()
# 调用WallCreation
WallCreation(ctx)
# 保存文档并关闭
ctx.closeDoc(True)
# 结束会话(Revit 进程实例将退出)
ctx.dispose()
这又是一个完整的自动化脚本,这么点代码做了什么:
1、创建Revit会话,启动Revit进程(可见、可交互,与手工启动的无任何差异)
2、批量创建墙
3、保存项目文件并关闭
4、结束会话,退出Revit进程
其中“2、批量创建墙”做了以下工作:
1)创建项目 “批量创建墙示例.rvt” 并作为当前活动文档(可见、可交互)
2)获取该文档中所有标高(按Elevation排序)
3)获取该文档中所有WallType元素
4)创建轴线
5)按轴线创建墙
6)更新墙的参数“顶部约束”
依旧是全自动完成。稍做修改,用上自己的数据就实现了自动批量创建。
之前从未上过图或视频,时间仓促,今天的示例两种视图下的结果:
DRVT 整套技术栈,已经提供了自动化与集成Revit的全新方式,为充分挖掘大型软件的价值提供强有力的支撑。
相关文章
Python+DRVT 从外部调用 Revit:从外部启动 Revit-CSDN博客
Python+DRVT 从外部调用 Revit:打开项目文件-CSDN博客
Python+DRVT 从外部调用 Revit:获取项目信息-CSDN博客
Python+DRVT 从外部调用 Revit:更新项目信息-CSDN博客
Python+DRVT 从外部调用 Revit:第一个完整示例-CSDN博客
Python+DRVT 从外部调用 Revit:创建新项目-CSDN博客
Python+DRVT 从外部调用 Revit:创建族文档-CSDN博客
Python+DRVT 从外部调用 Revit:批量创建轴网-CSDN博客
Python+DRVT 从外部调用 Revit:批量创建标高-CSDN博客
Python+DRVT 从外部调用 Revit:创建风管系统加劲肋-CSDN博客
Python+DRVT 从外部调用 Revit:创建剖面-CSDN博客
Python+DRVT 从外部调用 Revit:创建桁架族-CSDN博客
#SystemIntegration #Revit #RevitAPI #Python #Automation #DesignAutomation #BIM #Interop #AEC #DigitalTwin #Workflow