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.pswp.cn/bicheng/95849.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/95849.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

水上乐园票务管理系统设计与开发(代码+数据库+LW)

摘 要 随着旅游业的蓬勃发展,水上乐园作为夏日娱乐的重要组成部分,其票务管理效率和服务质量直接影响游客体验。然而,传统的票务管理模式往往面临信息更新不及时、服务响应慢等问题。因此,本研究旨在通过设计并实现一个基于Spri…

【前端教程】JavaScript DOM 操作实战案例详解

案例1&#xff1a;操作div子节点并修改样式与内容 功能说明 获取div下的所有子节点&#xff0c;设置它们的背景颜色为红色&#xff1b;如果是p标签&#xff0c;将其内容设置为"我爱中国"。 实现代码 <!DOCTYPE html> <html> <head><meta ch…

qiankun+vite+react配置微前端

微前端框架&#xff1a;qiankun。 主应用&#xff1a;react19vite7&#xff0c;子应用1&#xff1a;react19vite7&#xff0c;子应用2 &#xff1a;react19vite7 一、主应用 1. 安装依赖 pnpm i qiankun 2. 注册子应用 (1) 在src目录下创建个文件夹&#xff0c;用来存储关于微…

git: 取消文件跟踪

场景&#xff1a;第一次初始化仓库的时候没有忽略.env或者node_modules&#xff0c;导致后面将.env加入.gitignore也不生效。 取消文件跟踪&#xff1a;如果是因为 node_modules 已被跟踪导致忽略无效&#xff0c; 可以使用命令git rm -r --cached node_modules来删除缓存&…

开讲啦|MBSE公开课:第五集 MBSE中期设想(下)

第五集 在本集课程中&#xff0c;刘玉生教授以MBSE建模工具选型及二次定制开发为核心切入点&#xff0c;系统阐释了"为何需要定制开发"与"如何实施定制开发"的实践逻辑&#xff0c;并提炼出MBSE中期实施的四大核心要素&#xff1a;高效高质建摸、跨域协同…

CSDN个人博客文章全面优化过程

两天前达到博客专家申请条件&#xff0c;兴高采烈去申请博客专家&#xff1a; 结果今天一看&#xff0c;申请被打回了&#xff1a; 我根据“是Yu欸”大神的博客&#xff1a; 【2024-完整版】python爬虫 批量查询自己所有CSDN文章的质量分&#xff1a;附整个实现流程_抓取csdn的…

Websocket的Key多少个字节

在WebSocket协议中&#xff0c;握手过程中的Sec-WebSocket-Key是一个由客户端生成的随机字符串&#xff0c;用于安全地建立WebSocket连接。这个Sec-WebSocket-Key是基于Base64编码的&#xff0c;并且通常由客户端在WebSocket握手请求的头部字段中发送。根据WebSocket协议规范&a…

SVT-AV1编码器中实现WPP依赖管理核心调度

一 assign_enc_dec_segments 函数。这个函数是 SVT-AV1 编码器中实现波前并行处理&#xff08;WPP&#xff09; 和分段依赖管理的核心调度器之一。//函数功能&#xff1a;分配编码解码段任务//返回值Bool//True 成功分配了一个段给当前线程&#xff0c;调用者应该处理这个段//F…

直接让前端请求代理到自己的本地服务器,告别CV报文到自己的API工具,解放双手

直接使用前端直接调用本地服务器&#xff0c;在自己的浏览器搜索插件proxyVerse&#xff0c;类似的插件应该还有一些&#xff0c;可以选择自己喜欢的这类插件可以将浏览器请求&#xff0c;直接转发到本地服务器&#xff0c;这样在本地调试的时候&#xff0c;不需要前端项目&…

Golang Goroutine 与 Channel:构建高效并发程序的基石

在当今这个多核处理器日益普及的时代&#xff0c;利用并发来提升程序的性能和响应能力已经成为软件开发的必然趋势。而Go语言&#xff0c;作为一门为并发而生的语言&#xff0c;其设计哲学中将“并发”置于核心地位。其中&#xff0c;Goroutines 和 Channels 是Go实现并发编程的…

17 C 语言宏进阶必看:从宏替换避坑到宏函数用法,不定参数模拟实现一次搞定

预处理详解1. 预定义符号//C语⾔设置了⼀些预定义符号&#xff0c;可以直接使⽤&#xff0c;预定义符号也是在预处理期间处理的。 __FILE__ //进⾏编译的源⽂件--预处理阶段被替换成指向文件名字符串的指针--char* 类型的变量 __LINE__ //⽂件当前的⾏号 --预处理阶段替换成使用…

深入剖析 HarmonyOS ArkUI 声明式开发:状态管理艺术与最佳实践

好的&#xff0c;请看这篇关于 HarmonyOS ArkUI 声明式开发范式与状态管理的技术文章。 深入剖析 HarmonyOS ArkUI 声明式开发&#xff1a;状态管理艺术与最佳实践 引言 随着 HarmonyOS 4、5 的广泛应用以及面向未来的 HarmonyOS NEXT&#xff08;API 12&#xff09;的发布&…

Qwen-Code安装教程

一、概述Qwen Code 是一个强大的基于命令行、面向开发者的 AI 工作流工具&#xff0c;改编自 Gemini CLI&#xff0c;专门针对 Qwen3-Coder 模型进行了优化。它专门为代码理解、代码重构、自动化工作流、Git 操作等场景设计&#xff0c;让你的开发工作变得更高效、更智能。它既…

老师傅一分钟精准判断电池好坏!就靠这个神器!

在汽车维修与保养领域&#xff0c;蓄电池状态的准确判断一直是技术人员面临的重要挑战。传统的电压测量方法只能反映表面现象&#xff0c;无法深入评估蓄电池的实际健康状态。Midtronics MDX-P300蓄电池及电气系统测试仪作为专业级诊断设备&#xff0c;通过电导测试技术和多系统…

Axure笔记

Axure介绍 快速原型的软件 应用场景&#xff1a;拉投资、给项目团队、销售演示、项目投标、内部收集反馈、教学 软件安装与汉化 汉化&#xff1a;复制lang文件夹和三个dll 软件的基础功能 基本布局&#xff1a;菜单栏、工具栏、页面和摘要、元件和母版、画布、样式交互和说明设…

Pytorch Yolov11 OBB 旋转框检测+window部署+推理封装 留贴记录

Pytorch Yolov11 OBB 旋转框检测window部署推理封装 留贴记录 上一章写了下【Pytorch Yolov11目标检测window部署推理封装 留贴记录】&#xff0c;这一章开一下YOLOV11 OBB旋转框检测相关的全流程&#xff0c;有些和上一章重复的地方我会简写&#xff0c;要两篇结合着看&#x…

《Keil 开发避坑指南:STM32 头文件加载异常与 RTE 配置问题全解决》

《Keil 开发避坑指南&#xff1a;STM32 头文件加载异常与 RTE 配置问题全解决》文章提纲一、引言• 简述 Keil 在 STM32 开发中的核心地位&#xff0c;指出头文件加载和 RTE&#xff08;运行时环境&#xff09;配置是新手常遇且关键的问题&#xff0c;说明本文旨在为开发者提…

TortoiseGit 2.4.0.0 64位安装教程(附详细步骤和Git配置 附安装包)

本教程详细讲解 ​TortoiseGit 2.4.0.0 64位版本​ 的完整安装步骤&#xff0c;包括如何运行 ​TortoiseGit-2.4.0.0-64bit.msi​ 安装包、设置安装路径、关联 Git 环境&#xff0c;以及安装后的基本配置方法&#xff0c;适合 Windows 用户快速上手 Git 图形化管理工具。 一、…

大数据毕业设计选题推荐-基于大数据的高级大豆农业数据分析与可视化系统-Hadoop-Spark-数据可视化-BigData

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、PHP、.NET、Node.js、GO、微信小程序、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇…

学习机器学习能看哪些书籍

关注B站可以观看更多实战教学视频&#xff1a;hallo128的个人空间 在机器学习与深度学习的知识海洋中&#xff0c;选择合适的书籍往往是入门和进阶的关键。以下四本经典著作各具特色&#xff0c;覆盖了从基础理论到实践应用的多个维度&#xff0c;无论你是初学者还是有一定基础…