在我们打开项目或创建项目之后,在外面可以轻松拿到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 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 删除。