继批量创建轴网后,再来示例如何在外部用Python让Revit批量创建标高。
在我们打开项目或创建项目之后,在外面可以轻松拿到DB.Document对象,然后就可以对Revit的数据库进行读写了。之前已展示了基础的项目信息的读写,今天展示些实际生产中常用到的基础批量操作——创建标高。直接上代码:
# drvt_pybind 支持多会话、多文档,先从简单的单会话、单文档开始
# MyContext是在Python中用户自定义的单会话、单文档的上下文管理类
from packs.core import MyContext
# 导入驱动 Revit 的核心模块
from drvt_pybind.Autodesk import Revit
from drvt_pybind.Autodesk.Revit import DB
# 取视图类别
def getViewFamilyTypeId(ctx: MyContext) -> DB.ElementId:
collector = DB.FilteredElementCollector.ctor(ctx.session, ctx.doc).OfClass(ctx.session.typeof(DB.ViewFamilyType))
# 如果需要取 结构平面,则遍历一下取 ViewFamilyType对象o
# o.getViewFamily() 是 DB.ViewFamily.StructuralPlan的
# 或o.getName()中名称是“结构平面” 或其它方法
# 简单起见,这里直接取第一个元素的ID
e = collector.FirstElementId()
return e
# 示例批量创建标高
def LevelCreation(ctx: MyContext) -> None:
"""
本示例移值自 Revit 2025.3 SDK 中的相关示例
"""
session = ctx.session
doc = ctx.doc
try:
# 涉及到修改操作的,需要锁定并用事务包装
ctx.lockAndStartTransaction("创建标高")
floorPlanTypeId = getViewFamilyTypeId(ctx)
if isNone(floorPlanTypeId):
raise AssertionError("尝试获取ViewFamilyType失败")
for i in range(1,60):
l = 10 + i * 3
level = DB.Level.Create(session, doc, m2feet(l))
name = f"测试标高 {l}"
# 更新标高的名称
level.setName(name)
# 创建与标高对应的 ViewPlan,这样 楼层平面 视图会出现在项目管理器中
levelId = level.getId()
vp = DB.ViewPlan.Create(session, doc, floorPlanTypeId, levelId)
if vp is not None:
vp.setName(name)
# 提交事务并解锁,若没有错误则修改操作将会生效
ctx.commitTransactionAndUnlock()
except Exception as e:
print(f"【异常】{e}")
# 回滚事务并解锁
ctx.rollbackTransactionAndUnlock()
# 下面这段代码,看过“创建新项目”示例的会很熟悉,就是照搬过来的
# 创建新的上下文(可以按需创建多个,意味着能直接管理多个 Revit 会话)
ctx = MyContext("在这里指定会话名称")
# 初始化会话(启动 Revit 进程实例)
ctx.initSession()
# 指定需要使用的模板文件
template = "建筑样板.rte"
fileName = "新项目文件.rvt"
# 按指定的模板创建新的项目文件
ctx.createAndActiveDoc(template, fileName)
# 就多了这一句:调用批量创建标高函数
LevelCreation(ctx)
# 保存文档并关闭
ctx.closeDoc(True)
# 结束会话(Revit 进程实例将退出)
ctx.dispose()
这么点代码做了什么:
1、创建Revit会话,启动Revit进程并可见、可交互(和手工启动的无任何差异)
2、以 建筑样板.rte 为模板,新创建了项目文件:新项目文件.rvt
3、取了一个 ViewFamilyType 对象的ID
4、批量创建了 标高 对象,更新其名称 为每个标高对象创建了对应的ViewPlan,让其在项目管理器中可见、可操作
5、保存项目文件并关闭
6、退出Revit进程
以上这些是全自动完成的,不需要动一下鼠标,也不用按一次键盘。
已经可以在外面就让Revit自动批量创建这些了,稍做扩展将自己的数据用起来,能不能让Revit为我们自动干活?
能不能将Revit整合到自己的生产流水线?
能不能将Revit深度集成到自己的系统、平台?
有没有可能让AI去叫Revit干活?
……
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。