首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python+DRVT 从外部调用 Revit:批量创建标高

Python+DRVT 从外部调用 Revit:批量创建标高

原创
作者头像
ZhLe
发布2025-09-05 09:22:30
发布2025-09-05 09:22:30
7400
代码可运行
举报
文章被收录于专栏:Python+DRVTPython+DRVT
运行总次数:0
代码可运行

批量创建轴网后,再来示例如何在外部用Python让Revit批量创建标高。

在我们打开项目创建项目之后,在外面可以轻松拿到DB.Document对象,然后就可以对Revit的数据库进行读写了。之前已展示了基础的项目信息的读写,今天展示些实际生产中常用到的基础批量操作——创建标高。直接上代码:

代码语言:javascript
代码运行次数:0
运行
复制
# 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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 思考
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档