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

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://www.xdnf.cn/news/20098.html

相关文章:

  • PiscCode轨迹跟踪Mediapipe + OpenCV进阶:速度估算
  • VIVADO的IP核 DDS快速使用——生成正弦波,线性调频波
  • 【FastDDS】Discovery ( 04-STATIC Discovery Settings)
  • yolov8环境配置:从安装到卸载,从入门到放弃。
  • std::complex
  • 深入剖析Spring动态代理:揭秘JDK动态代理如何精确路由接口方法调用
  • 实习结束,秋招开启
  • 通过API接口管理企业微信通讯录案例
  • AI大模型如何重塑日常?从智能办公到生活服务的5个核心改变
  • 算法模板(Java版)_DFS与BFS
  • 贵州移动创维E900V22F-S905L3SB-全分区备份
  • 【Linux网络编程】应用层协议-----HTTPS协议
  • C#中IEnumerable 、IAsyncEnumerable、yield
  • 13问详解VoLTE视频客服:菊风带你从基础到应用,厘清所有疑惑
  • 储能调峰新实践:智慧能源平台如何保障风电消纳与电网稳定?
  • 从 0 到 1 攻克订单表分表分库:亿级流量下的数据库架构实战指南
  • 嵌入式第四十六天(51单片机(通信))
  • 2025年你需要了解的大型语言模型部署工具
  • 配置WSL2的Ubuntu接受外部设备访问
  • 课前准备--基因组(WGS/WES)联合单细胞获取突变信息
  • 分析KLA-Tencor公司膜厚THK产品
  • Python 算数运算练习题
  • 应对技术选型与技术债务以及架构设计与业务需求的关系
  • 概率与数理统计公式及结论汇总
  • 从策略到实效|Adobe Target 实战应用与成功案例
  • uni-app iOS 文件调试常见问题与解决方案:结合 itools、克魔、iMazing 的实战经验
  • 用spring框架实现简单的MVC业务
  • 远程协作下的项目失控:不是信任危机,而是感知缺失
  • 7种流行Prompt设计模式详解:适用场景与最佳实践
  • 快速、归并、堆、希尔、ArrayList排序