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

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

在昨天的示例 Python+DRVT 从外部调用 Revit:批量创建带孔洞楼板 中,我们批量创建了稍复杂的外轮廓且带孔洞的楼板。今天继续示例如何批量创建常用基础元素:柱。

from typing import List
import math
# drvt_pybind 支持多会话、多文档,先从简单的单会话、单文档开始
# MyContext是在Python中用户自定义的单会话、单文档的上下文管理类
from packs.core import MyContext, m2feet, feet2m, isNone# 导入驱动 Revit 的核心模块
from drvt_pybind.Autodesk import Revit
from drvt_pybind.Autodesk.Revit import DBfrom drvt_pybind.Autodesk.Revit.DB import Structure# 遍历标高,返回按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())return ret# 遍历柱FamilySymbol,返回List[Tuple[DB.FamilySymbol, bool]]
def getFamilySymobls(ctx : MyContext) -> List[Tuple[DB.FamilySymbol, bool]]:familySymobls : List[Tuple[DB.FamilySymbol, bool]] = []listSy = DB.FilteredElementCollector.ctor(ctx.session, ctx.doc).OfClass(ctx.session.typeof(DB.FamilySymbol)).ToElements()for i in range(listSy.getCount()):fs = DB.asFamilySymbol(listSy.getItem(i))if isNone(fs):continuecat = fs.getCategory()if isNone(cat):continuebic = cat.getBuiltInCategory()if bic == DB.BuiltInCategory.OST_Columns:familySymobls.append((fs, False))elif bic == DB.BuiltInCategory.OST_StructuralColumns:familySymobls.append((fs,True))return familySymobls# 批量创建柱
def ColumnCreation(ctx: MyContext) -> None:"""本示例展示如何使用Python+DRVT,在外部让Revit批量创建柱与结构柱"""if ctx.doc is not None:ctx.closeDoc(True)template = "建筑样板.rte"fileName = "ColumnCreation.rvt"err = ctx.createAndActiveDoc(template, fileName)if err != 0:raise AssertionError(f"创建项目文档失败: 错误码 {err}")session = ctx.sessiondoc = ctx.doc# 取所有标高,缺省是两个levelList = getLevels(ctx)if len(levelList) < 2:raise AssertionError(f"标高过少,本示例用到2个标高")level0 = levelList[0]level1 = levelList[1]ele0 = levelList[0].getElevation()ele1 = levelList[1].getElevation()try:# 取所有柱FamilySymbolfsList = getFamilySymobls(ctx)# 涉及到修改操作的,需要锁定并用事务包装ctx.lockAndStartTransaction("批量创建示例")docCreate = doc.getCreate()xoffset = m2feet(-4)*2yoffset = m2feet(-4)*2instList:List[DB.FamilyInstance] = []# 创建三行四列for i in range(3):# 选择柱FamilySymbolfs, structural = fsList[i % len(fsList)]if not fs.getIsActive():fs.Activate()for j in range(4):# 位置x = xoffset+j*m2feet(4)y = yoffset+i*m2feet(4)p0 = DB.XYZ.ctor(session, x, y, ele0)p1 = DB.XYZ.ctor(session, x, y, ele1)curve = DB.Line.CreateBound(session, p0, p1)# 创建实例column = docCreate.NewFamilyInstance(curve, fs, level0, Structure.StructuralType.Column)# 记录结构柱实例if structural:instList.append(column)# 提交事务并解锁,若没有错误则修改操作将会生效ctx.commitTransactionAndUnlock()# 更新结构柱更新“柱样式”参数,缺省是“倾斜 - 端点控制”ctx.lockAndStartTransaction("更新柱样式")for column in instList:p = column.getParameter(DB.BuiltInParameter.SLANTED_COLUMN_TYPE_PARAM)# 更新其值为“0”即“垂直”p.Set(DB.SlantedOrVerticalColumnType.CT_Vertical.value)ctx.commitTransactionAndUnlock()except Exception as e:print(f"【异常】{e}")# 回滚事务并解锁ctx.rollbackTransactionAndUnlock()# 下面这段代码,看过“创建新项目”示例的会很熟悉,就是照搬过来的
# 创建新的上下文(可以按需创建多个,意味着能直接管理多个 Revit 会话)
ctx = MyContext("在这里指定会话名称")
# 初始化会话(启动 Revit 进程实例)
ctx.initSession()# 调用ColumnCreation
ColumnCreation(ctx)# 结束会话(Revit 进程实例将退出)
ctx.dispose()

又是一个简洁、完整的自动化Python脚本,上面的代码做了什么?

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

2、批量创建柱

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

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

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

        2)获取该文档中所有标高(缺省仅2个)

        3)获取该文档中所有柱FamilySymbol

        4)按三行四列,间隔4米排布

                a)按行选择一柱FamilySymbol

                b)确定柱的轴线

                c)基于a)选择的FamilySymbol+ b)中创建的轴线在第一个标高上创建一个柱实例

                d)记录结构柱实例

        5)批量更新结构柱实例的“柱样式”参数,将其由缺省的“倾斜 - 端点控制”修改为:“垂直”
             注:不可在4)中更新此参数值为“垂直”,必须先正常创建完毕后再更新

        保存项目文件并关闭

运行结果(修改“柱样式”参数前,三维视图):

(修改“柱样式”参数后,三维视图):

全自动完成全程无需手工操作:启动Revit => 创建项目 => 批量创建 => 保存项目文档 => 退出Revit 。

Python+DRVT,轻松跨越了应用边界与技术壁垒,实现对Revit插件核心能力的高效驾驭。

随着展示出来的能力越来越多,并且始终保持一贯简洁的同时又能专注于业务逻辑+双向访问。那么,对于充分挖掘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博客

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

Python+DRVT 从外部调用 Revit:批量创建梁(2)-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://aEPCmgPm.wnbpm.cn
http://GCfOLonE.wnbpm.cn
http://14qJeTwZ.wnbpm.cn
http://e9ScoRnv.wnbpm.cn
http://PqVNx3Qx.wnbpm.cn
http://bg3cbcpk.wnbpm.cn
http://tClvWYpk.wnbpm.cn
http://hqH98sww.wnbpm.cn
http://N4hVL27D.wnbpm.cn
http://gFvmG4PB.wnbpm.cn
http://AKUNzBbp.wnbpm.cn
http://TCXFL25S.wnbpm.cn
http://376EwNEe.wnbpm.cn
http://Q2SZZTkH.wnbpm.cn
http://cDvB3dFF.wnbpm.cn
http://doGODMpj.wnbpm.cn
http://hflsxAhx.wnbpm.cn
http://fczS7TTP.wnbpm.cn
http://U4gdRxRc.wnbpm.cn
http://qbOM5PkO.wnbpm.cn
http://wML69nGs.wnbpm.cn
http://dxXMGNSF.wnbpm.cn
http://J9Ej7w1D.wnbpm.cn
http://2GIjF7Wi.wnbpm.cn
http://Qjf2Y4Rr.wnbpm.cn
http://5jDVhghL.wnbpm.cn
http://QgRdaeU7.wnbpm.cn
http://EPvwH47u.wnbpm.cn
http://npTqdi7b.wnbpm.cn
http://Kgv3Z4DV.wnbpm.cn
http://www.dtcms.com/a/375548.html

相关文章:

  • Matlab机器人工具箱6.2 导入stl模型——用urdf文件描述
  • 网页设计模板 HTML源码网站模板下载
  • 南京大学计算机学院 智能软件工程导论 + Luciano Baresi 教授讲座
  • Rust/C/C++ 混合构建 - Buck2构建工具一探究竟
  • Drawnix:开源一体化白板工具,让你的创意无限流动!
  • stm32 链接脚本没有 .gcc_except_table 段也能支持 C++ 异常
  • K8S集群管理(4)
  • flutter TabBar 设置isScrollable 第一个有间距
  • 学习 Android (二十一) 学习 OpenCV (六)
  • Maven项目中修改公共依赖项目并发布到nexus供三方引用全流程示例
  • GD32VW553-IOT开发板移植适配openharmony
  • nuxt3在使用vue-echarts报错 document is not defined
  • 嵌入式第四十九天(ARM汇编指令)
  • RS485通信 , 和modus RTU
  • 7. LangChain4j + 记忆缓存详细说明
  • 【超简单】Anaconda 安装教程(Windows 图文版)
  • Docker 搭建 Harbor 镜像仓库
  • 数据采集平台的起源与演进:从ETL到数据复制
  • Blender 制作中世纪风格的水磨坊(2):场景元素、纹理与渲染后期
  • 【Python】pytorch安装(使用conda)
  • 阿里云centos7-mysql的使用
  • Android实战进阶 - 启动页
  • 【从零开始编写数据库系统】基于Python语言实现存储引擎
  • 【Pywinauto库】8.3 pywinauto.findwindows 模块
  • 351章:Python Web爬虫入门:使用Requests和BeautifulSoup
  • 禅道,用域名访问之后不能登录的问题
  • Lodash-es 完整开发指南:ES模块化JavaScript工具库实战教程
  • 实践《数字图像处理》之图像方向性自适应阈值处理
  • 【Linux】系统部分——信号的概念和产生
  • android定制系统完全解除应用安装限制