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

Python+DRVT 从外部调用 Revit:批量创建轴网

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

在我们打开项目创建项目之后,在外面可以轻松拿到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 GridCreation(ctx: MyContext) -> None:
    """
    This sample shows how to create grids and modify grids' properties through Revit API.
    本示例移植自 Revit 2025.3 SDK 中的示例 GridCreation 的核心部分
    """
    
    session = ctx.session
    doc = ctx.doc
    xNumber = 10
    yNumber = 15
    xSpacing = 4.0
    ySpacing = 5.0
    xOrigin = -xSpacing * yNumber / 2
    yOrigin = -ySpacing * xNumber / 2

    xFirstLabel = "1";
    yFirstLabel = "A";
    try:
        # 涉及到修改操作的,需要锁定并用事务包装
        ctx.lockAndStartTransaction("创建轴网")
        # 创建横向轴网
        for i in range(0, xNumber):
            startPoint = DB.XYZ.ctor(session, m2feet(xOrigin - ySpacing / 2), m2feet(yOrigin + i * xSpacing), m2feet(0))
            endPoint = DB.XYZ.ctor(session, m2feet(xOrigin + (yNumber - 1) * ySpacing + ySpacing / 2), m2feet(yOrigin + i * xSpacing), m2feet(0));
            # 注意:startPoint,endPoint先后关系影响Bubble location
            line = DB.Line.CreateBound(session, endPoint, startPoint)
            if (i == 0):
                grid = DB.Grid.Create(session, doc, line)
                # Set the label of first horizontal grid
                grid.setName(xFirstLabel)
            else:
                grid = DB.Grid.Create(session, doc, line)
        # 创建竖向轴网
        for j in range(0, yNumber):
            startPoint = DB.XYZ.ctor(session, m2feet(xOrigin + j * ySpacing), m2feet(yOrigin - xSpacing / 2), m2feet(0))
            endPoint = DB.XYZ.ctor(session, m2feet(xOrigin + j * ySpacing), m2feet(yOrigin + (xNumber - 1) * xSpacing + xSpacing / 2), m2feet(0));
            # 注意:startPoint,endPoint先后关系影响Bubble location
            line = DB.Line.CreateBound(session, endPoint, startPoint)
            if (j == 0) :
                grid = DB.Grid.Create(session, doc, line)
                # Set the label of first horizontal grid
                grid.setName(yFirstLabel)
            else :
                grid = DB.Grid.Create(session, doc, line)
        # 提交事务并解锁,若没有错误则修改操作将会生效
        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)

# 就多了这一句:调用批量创建轴网函数
GridCreation(ctx)

# 保存文档并关闭
ctx.closeDoc(True)

# 结束会话(Revit 进程实例将退出)
ctx.dispose()

一如既往,简洁、高效、Python端可调试、Revit进程可交互。

Revit SDK中的示例“GridCreation”代码过多,不能像上面这样清晰的展示,就不贴这里了。有兴趣的可以在自己的Revit SDK安装目录下“Revit 版本号 SDK\Samples\GridCreation\CS”找找,在线可以去Autodesk自家的专业人士JeremyTammik的Github:jeremytammik/RevitSdkSamples/GridCreation

从自动化流水线批量创建轴网这种简单的需求的角度,让我们粗浅地从开发语言、学习曲线、开发效率、整合效率几方面对两种不同开发模式做个对比:

外部驱动

传统插件

开发语言

Python 简单易学,生态优秀

.NET 专业性要求显著高于Python

学习曲线

相当平缓 丝滑过渡,仅需了解会话管理机制与接口绑定规范,直接上手

相对陡峭的多 addin配置、模块引用、严格的插件入口机制、不同的插件类型……搞明白这些后才能开始着手实现业务逻辑。这是在尚未面对跨进程调用的一堆挑战的情况下,……

开发效率

一贯的Python优势 效率高、调试的同时可交互、脚本语言迭代超快、代码简洁

相对低一些 代码量也更大

整合效率

上手即可进行系统级整合,聚集业务逻辑,无需费心费力地去铺路

相对低的多 需要自行铺路:进程调度管理、跨进程信息交换、多端实现调用响应机制、调用响应触发机制、工业级规模的Revit API……然后才能开始实现业务逻辑

稍作思考:对于大规模或系统级整合呢?

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

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