当前位置: 首页 > news >正文

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

今天让我们继续,看看如何批量创建常用的基础元素:梁。

跳过轴线为直线段形的,先从圆弧形的开始:

from typing import List, Tuple
import math
# drvt_pybind 支持多会话、多文档,先从简单的单会话、单文档开始
# MyContext是在Python中用户自定义的单会话、单文档的上下文管理类
from packs.core import MyContext, m2feet, feet2m, isNone, deg2rad# 导入驱动 Revit 的核心模块
from drvt_pybind.Autodesk import Revit
from drvt_pybind.Autodesk.Revit import DB
from drvt_pybind.Autodesk.Revit.DB import Structure# 批量创建多个标高(此函数就是从"Python+DRVT 从外部调用 Revit:批量创建标高"中照搬过来,做了一点修改)
def createLevels(ctx: MyContext, levels: List[DB.Level]) -> None:"""本示例移值自 Revit 2025.3 SDK 中的相关示例"""session = ctx.sessiondoc = ctx.doctry:# 涉及到修改操作的,需要锁定并用事务包装ctx.lockAndStartTransaction("创建标高")floorPlanTypeId = DB.FilteredElementCollector.ctor(ctx.session, ctx.doc).OfClass(ctx.session.typeof(DB.ViewFamilyType)).FirstElementId()if isNone(floorPlanTypeId):raise AssertionError("尝试获取ViewFamilyType失败")for i in range(1,18):l = 10 + i * 3level = DB.Level.Create(session, doc, m2feet(l))name = f"测试标高 {l}"# 更新标高的名称level.setName(name)levels.append(level)# 创建与标高对应的 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()# 遍历已有标高然后再批量创建多个标高,返回按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):continuetmp.append(l)ret = sorted(tmp, key=lambda x:x.getElevation())# 批量创建多个标高createLevels(ctx, ret)return ret# 获取创建梁用的(Family,FamilySymbol),返回List[Tuple[DB.Family, DB.FamilySymbol]]
def getFamilySymobls(ctx : MyContext) -> List[Tuple[DB.Family, DB.FamilySymbol]]:symbols : List[Tuple[DB.Family, DB.FamilySymbol]] = []listFa = DB.FilteredElementCollector.ctor(ctx.session, ctx.doc).OfClass(ctx.session.typeof(DB.Family)).ToElements()for i in range(listFa.getCount()):fa = DB.asFamily(listFa.getItem(i))if isNone(fa):continue# 按族类别过滤,减少无用的遍历fc = fa.getFamilyCategory()if isNone(fc) or fc.getBuiltInCategory() != DB.BuiltInCategory.OST_StructuralFraming:continueenumerator = fa.GetFamilySymbolIds().GetEnumerator()while enumerator.MoveNext():elementId = enumerator.getCurrent()element = ctx.doc.GetElement(elementId)fs = DB.asFamilySymbol(element)if fs is None:continuesymbols.append((fa, fs))return symbolsdef CreateArc(ctx : MyContext, z: float) -> DB.Arc:"""create an horizontal arc instance with specified z coordinate value"""session = ctx.sessioncenter = DB.XYZ.ctor(session, 0, 0, z)radius = m2feet(10.0)startAngle = 0.0endAngle = deg2rad(120)xAxis = DB.XYZ.ctor(session, 1, 0, 0);yAxis = DB.XYZ.ctor(session, 0, 1, 0);return DB.Arc.Create(session, center, radius, startAngle, endAngle, xAxis, yAxis)def CreateCurvedBeam(ctx : MyContext, fsBeam: DB.FamilySymbol, curve: DB.Curve, level: DB.Level) -> bool:"""create a curved beamfsBeam: beam typecurve: Curve of this beam.level: beam's reference level"""doc = ctx.doccreate = doc.getCreate()try:if not fsBeam.getIsActive():fsBeam.Activate()beam = create.NewFamilyInstance(curve, fsBeam, level, Structure.StructuralType.Beam);if beam is None:return False# get beam location curvebeamCurve = beam.getLocation()if beamCurve is None:return Falseexcept Exception as e:print(f"异常:{e}\n")return Falsereturn True            # 示例创建圆弧梁、椭圆梁、NURBS曲线梁
def BeamCreation(ctx: MyContext) -> None:"""This sample demonstrates how to create curved beam, this sample can create three types of curved beam: arc, ellipse and nurbspline.本示例移植自 Revit 2025.3 SDK 中的示例 CurvedBeam"""try:if ctx.doc is not None:ctx.closeDoc(True)template = r"E:\rvt\template\结构样板.rte"fileName = r"E:\rvt\BeamCreation.rvt"err = ctx.createAndActiveDoc(template, fileName)if err != 0:raise AssertionError(f"创建项目文档失败: 错误码 {err}")levels = getLevels(ctx)symbols = getFamilySymobls(ctx)if len(symbols) == 0:print("当前文档中没有OST_StructuralFraming类别的族类型")return# 涉及到修改操作的,需要锁定并用事务包装ctx.lockAndStartTransaction("创建curved beam")nSymbols = len(symbols)for i in range(len(levels)):locLev = levels[i]family, familySymbol = symbols[ i % nSymbols ]levelZ = locLev.getElevation()curve = CreateArc(ctx, levelZ)if CreateCurvedBeam(ctx, familySymbol, curve, locLev):print(f"Succeeded to create beam({family.getName()}:{familySymbol.getName()}) at: {locLev.getName()}")# 提交事务ctx.commitTransactionAndUnlock()except Exception as e:print(f"【异常】{e}")# 回滚事务并解锁ctx.rollbackTransactionAndUnlock()# 保存文档并关闭ctx.closeDoc(True)# 下面这段代码,看过“创建新项目”示例的会很熟悉,就是照搬过来的
# 创建新的上下文(可以按需创建多个,意味着能直接管理多个 Revit 会话)
ctx = MyContext("在这里指定会话名称")
# 初始化会话(启动 Revit 进程实例)
ctx.initSession()# 调用BeamCreation
BeamCreation(ctx)# 结束会话(Revit 进程实例将退出)
ctx.dispose()

再一个完整的自动化脚本,上面的代码做了什么?

1、创建Revit会话,启动Revit进程(可见、可交互,与手工启动的无任何差异)

2、批量创建梁

3、结束会话,退出Revit进程

其中“2、批量创建梁”做了以下工作:

        1)以“结构样板.rte”为样板,创建项目 “BeamCreation.rvt” 并作为当前活动文档(可见、可交互)

        2)获取该文档中所有标高(缺省仅2个),并批量创建多个,按Elevation排序

        3)获取该文档中所有可用于创建梁的(Family,FamilySymbol)对

        4)在每一个标高上

                a)按次序选择一对Family,FamilySymbol

                b)在当前标高的高度上创建一个圆弧

                c)基于b)中创建的圆弧与选择的FamilySymbol在当前标高上创建一个梁实例

        保存项目文件并关闭

运行结果(3D视图):

Python控制台输出:

依旧是全自动完成,启动Revit => 创建项目 => 批量创建 => 保存项目文档 => 结束Revit 全程无需手工操作。有了DRVT的加持,Revit插件的核心能力可以在外面用Python脚本轻松驾驭了。

这里又展示了一项基础能力。基于越来越多的能力展示,对自动化生产流水线、充分挖掘Revit的价值、将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博客

Python+DRVT 从外部调用 Revit:批量创建墙-CSDN博客

Python+DRVT 从外部调用 Revit:批量创建门-CSDN博客

Python+DRVT 从外部调用 Revit:批量创建门和窗-CSDN博客

深度嵌入数字化工作流:DRVT 的思考与实践-CSDN博客

从插件化走向系统集成——Revit-CSDN博客

Revit变身智能组件,BIM未来可期-CSDN博客

#SystemIntegration #Revit #RevitAPI #Python #Automation #DesignAutomation #BIM #Interop #AEC #DigitalTwin #Workflow


文章转载自:

http://M6rWvdyy.yzxhk.cn
http://hvPEEqR8.yzxhk.cn
http://WX5yr1lr.yzxhk.cn
http://EjZ2S2If.yzxhk.cn
http://yDF7QR6q.yzxhk.cn
http://wBAOmWqe.yzxhk.cn
http://S4xfy82w.yzxhk.cn
http://UjPQswhb.yzxhk.cn
http://JNcr22ny.yzxhk.cn
http://gLnPSIzg.yzxhk.cn
http://1Hk35LFc.yzxhk.cn
http://M1U5UmRB.yzxhk.cn
http://i7BgWf5U.yzxhk.cn
http://jsBXqtUP.yzxhk.cn
http://385NmQEq.yzxhk.cn
http://kl7BYKcz.yzxhk.cn
http://dw8CZHGT.yzxhk.cn
http://idYPlqIs.yzxhk.cn
http://hRogc7nd.yzxhk.cn
http://zSOggN6w.yzxhk.cn
http://nZImhZ6k.yzxhk.cn
http://KJAQCLeT.yzxhk.cn
http://4BaTnT3Z.yzxhk.cn
http://QxIXPcTb.yzxhk.cn
http://9eCQopG1.yzxhk.cn
http://XS6oMi9b.yzxhk.cn
http://eKm87N5k.yzxhk.cn
http://93SPxfTa.yzxhk.cn
http://sT4UQ0ZJ.yzxhk.cn
http://BWyJ5my8.yzxhk.cn
http://www.dtcms.com/a/368450.html

相关文章:

  • 【软考架构】V模型、W模型、增量模型和螺旋模型
  • 华为云昇腾云服务
  • Redis-事务与管道
  • threejs入门学习日记
  • Bug 排查日记:从问题浮现到解决的技术之旅
  • Java观察者模式
  • 深度学习从入门到精通 - BERT与预训练模型:NLP领域的核弹级技术详解
  • DeepSeek:开启智能体驱动对话式数据分析新时代
  • 分布式3PC理论
  • 在本地使用Node.js和Express框架来连接和操作远程数据库
  • Linux应用(2)——标准IO
  • 面试官问:你选择这份工作的动机是什么?
  • 大型语言模型SEO(LLM SEO)完全手册:驾驭搜索新范式
  • Onlyoffice集成与AI交互操作指引(Iframe版)
  • 前端视觉交互设计全解析:从悬停高亮到多维交互体系(含代码 + 图表)
  • 【基础组件】手撕 MYSQL 连接池(C++ 版本)
  • 【FastDDS】Layer Transport ( 01-overview )
  • 算法备案全流程-纯干货
  • Linux 进程信号的产生
  • 【华为Mate XTs 非凡大师】麒麟芯片回归:Mate XTs搭载麒麟9020,鸿蒙5.1体验新境界
  • Swift 解题:LeetCode 372 超级次方(Super Pow)
  • 深入理解 JVM 字节码文件:从组成结构到 Arthas 工具实践
  • C# 阿里云 OSS 图片上传步骤及浏览器查看方法
  • JVM新生代和老生代比例如何设置?
  • 基于OpenGL封装摄像机类:视图矩阵与透视矩阵的实现
  • MySQL 8.0.36 主从复制完整实验
  • 无需bootloader,BootROM -> Linux Kernel 启动模式
  • 【Vue3+TypeScript】H5项目实现企业微信OAuth2.0授权登录完整指南
  • 为什么MySQL可重复读级别不能完全避免幻读
  • Gradle Task 进阶:Task 依赖关系、输入输出、增量构建原理