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
英文地址,請注明出處:http://en.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;無論你是初學者還是有一定基礎…