Python+DRVT 從外部調用 Revit:批量創建樓板

今天繼續批量創建常用的基礎元素:樓板。這次以簡單的輪廓為矩形的樓板為例。讓我們來看一看如何讓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 DB# 批量創建標高(沒錯,就是從“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(0,8):l = 9 + 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# 遍歷FloorType,返回List[DB.FloorType]
def getFloorTypes(ctx : MyContext) -> List[DB.FloorType]:floorTypeList : List[DB.FloorType] = []listWt = DB.FilteredElementCollector.ctor(ctx.session, ctx.doc).OfClass(ctx.session.typeof(DB.FloorType)).ToElements()for i in range(listWt.getCount()):wt = DB.asFloorType(listWt.getItem(i))if isNone(wt):continuefloorTypeList.append(wt)return floorTypeList# 示例創建板
def FloorCreation(ctx: MyContext) -> None:"""本示例展示如何使用Python+DRVT,在外部讓Revit批量創建墻"""if ctx.doc is not None:ctx.closeDoc(True)template = "建筑樣板.rte"fileName = "FloorCreation.rvt"err = ctx.createAndActiveDoc(template, fileName)if err != 0:raise AssertionError(f"創建項目文檔失敗: 錯誤碼 {err}")session = ctx.sessiondoc = ctx.doc# 取所有標高,缺省是兩個levels = getLevels(ctx)try:# 取所有FloorTypefloorTypeList = getFloorTypes(ctx)# 涉及到修改操作的,需要鎖定并用事務包裝ctx.lockAndStartTransaction("批量創建板")for i in range(len(levels)):locLev = levels[i]ele = locLev.getElevation()# 選擇一個FloorTypefloorType = floorTypeList[i % len(floorTypeList)]# 定義板的輪廓線a = m2feet(5)b = m2feet(3) p0 = DB.XYZ.ctor(session, 0, 0, ele)p1 = DB.XYZ.ctor(session, a, 0, ele)p2 = DB.XYZ.ctor(session, a, b, ele)p3 = DB.XYZ.ctor(session, 0, b, ele)profileCurves = DB.ListCurve.ctor(session)profileCurves.Add(DB.Line.CreateBound(session, p0, p1))profileCurves.Add(DB.Line.CreateBound(session, p1, p2))profileCurves.Add(DB.Line.CreateBound(session, p2, p3))profileCurves.Add(DB.Line.CreateBound(session, p3, p0))profileLoop = DB.CurveLoop.Create(session, profileCurves)listCurveLoop = DB.ListCurveLoop.ctor(session)listCurveLoop.Add(profileLoop)# 創建板floor = DB.Floor.Create(session, doc, listCurveLoop, floorType.getId(), locLev.getId())# 取“結構”參數p = floor.getParameter(DB.BuiltInParameter.FLOOR_PARAM_IS_STRUCTURAL)# 更新其值為“1”(等價于:True)p.Set(1)print(f"在 {locLev.getName()} 創建了 {floorType.getName()} 矩形板")# 提交事務并解鎖,若沒有錯誤則修改操作將會生效ctx.commitTransactionAndUnlock()except Exception as e:print(f"【異常】{e}")# 回滾事務并解鎖ctx.rollbackTransactionAndUnlock()# 保存文檔并關閉ctx.closeDoc(True)# 下面這段代碼,看過“創建新項目”示例的會很熟悉,就是照搬過來的
# 創建新的上下文(可以按需創建多個,意味著能直接管理多個 Revit 會話)
ctx = MyContext("在這里指定會話名稱")
# 初始化會話(啟動 Revit 進程實例)
ctx.initSession()# 調用FloorCreation
FloorCreation(ctx)# 結束會話(Revit 進程實例將退出)
ctx.dispose()

又一個完整的自動化腳本,上面的代碼做了什么?

1、創建Revit會話,啟動Revit進程(可見、可交互,與手工啟動的無任何差異)

2、批量創建樓板

3、結束會話,退出Revit進程

其中“2、批量創建樓板”做了以下工作:

????????1)以“建筑樣板.rte”為樣板,創建項目 “FloorCreation.rvt” 并作為當前活動文檔(可見、可交互)

????????2)獲取該文檔中所有標高(缺省僅2個),并批量創建多個,按Elevation排序

????????3)獲取該文檔中所有FloorType

? ? ? ? 4)在每一個標高上

? ? ? ????????? a)按次序選擇一FloorType

? ? ? ? ????????b)在當前標高的高度上創建一個長5米、寬3米的矩形輪廓

? ? ? ? ????????c)基于a)選擇的FloorType + b)中創建的輪廓在當前標高上創建一個樓板

? ? ? ? ? ? ? ? d)更新樓板對象的“結構”參數值為True(選中樓板在其“屬性”中可見“結構”參數打勾)

????????保存項目文件并關閉

運行結果(三維視圖):

三維

控制臺輸出:

依舊是全自動完成,啟動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博客

深度嵌入數字化工作流:DRVT 的思考與實踐-CSDN博客

從插件化走向系統集成——Revit-CSDN博客

Revit變身智能組件,BIM未來可期-CSDN博客

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/98278.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/98278.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/98278.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

猿輔導數據分析面試題及參考答案

給定用戶成績表,編寫SQL查詢排名靠前的用戶(例如前10名),并說明rank()和dense_rank()的區別。 要查詢成績表中排名靠前的用戶(如前10名),需先明確排名依據(通常為成績降序),再通過排序和限制結果行數實現。假設用戶成績表名為user_scores,包含user_id(用戶ID)和s…

在樹莓派集群上部署 Distributed Llama (Qwen 3 14B) 詳細指南

項目地址:https://github.com/b4rtaz/distributed-llama 本文檔將指導您如何使用一個樹莓派5作為Root節點和三個樹莓派4作為Worker節點,共同搭建一個4節點的分布式LLM推理集群,并運行10.9GB的Qwen 3 14B模型。 中間要用到github和huggingface…

C++ 容器——unordered_xxx

自 C11 開始,STL 引入了基于 hash table 的 unordered_set、unordered_map 等容器,正如其名它們是無序容器。一定數量(據說有測試數據是10000000)元素時無序容器的性能要比對應的有序容器優。一、容器數據結構unordered_set、unor…

分布式常見面試題整理

一、分布式理論: CAP理論 分布式系統最多同時滿足一致性(C)、可用性(A)、分區容錯性(P)中的兩個,無法三者兼得。 BASE理論 對CAP中一致性和可用性的權衡,強調基本可用&a…

Python基礎入門常用198英語單詞詳解

最近,我總結了一份Python學習者入門常用單詞表,列出了Python學習中常見的198個高頻單詞,供初學者學習使用。 這些單詞都比較簡單,非常易于理解,在掌握好單詞的基礎上,再去學Python可以達到事半功倍的效果。…

EP-SPY 網路追蹤規避實驗:山脈通聯測試

EP-SPY V3.0 https://github.com/MartinxMax/ep-spy 基於 GI6E 編碼的無線電通信工具,用於保護您的隱私。 https://github.com/MartinxMax/gi6e 編寫了偽協議以防止內容被解密無法通過網絡追蹤,抵抗官方監控無線音頻廣播,用於隱蔽信息傳輸…

蘋果 FoundationModels 秘典俠客行:隱私為先的端側 AI 江湖

引子 話說俠客島之上,有一對年輕俠侶 ——「青鋒劍客」凌云與「素心仙子」蘇凝,二人自幼習武,尤擅拆解各路奇功秘籍。 近日聽聞蘋果谷(Apple)于 WWDC 2025 武林大會之上,亮出一門全新絕學「FoundationMod…

華為基于IPD的產品質量計劃模板

目錄 模板:產品質量計劃模板....................................... 1 1. 介紹...................................................................... 5 1.1. 范圍和目的.................................................... 5 1.2. 參考資料..…

事務管理的選擇:為何 @Transactional 并非萬能,TransactionTemplate 更值得信賴

在 Spring 生態的后端開發中,事務管理是保障數據一致性的核心環節。開發者常常會使用 Transactional 注解快速開啟事務,一行代碼似乎就能解決問題。但隨著業務復雜度提升,這種“簡單”的背后往往隱藏著難以察覺的隱患。本文將深入剖析 Spring…

CodePerfAI體驗:AI代碼性能分析工具如何高效排查性能瓶頸、優化SQL執行耗時?

前陣子幫同事排查用戶下單接口的性能問題時,我算是真切感受到 “找性能瓶頸比寫代碼還磨人”—— 接口偶爾會突然卡到 3 秒以上,查日志只看到 “SQL 執行耗時過長”,但具體是哪個查詢慢、為什么慢,翻了半天監控也沒頭緒&#xff0…

《sklearn機器學習——繪制分數以評估模型》驗證曲線、學習曲線

估計器的偏差、方差和噪聲 每一個估計器都有其優勢和劣勢。它的泛化誤差可以分解為偏差、方差和噪聲。估計器的偏差是不同訓練集的平均誤差。估計器的方差表示對不同訓練集,模型的敏感度。噪聲是數據的特質。 在下圖中,可以看見一個函數 f(x)cos?32πxf…

2025年AI PPT必修課-匯報中AI相關內容的“陷阱”與“亮點”

《2025年AI PPT必修課-匯報中AI相關內容的“陷阱”與“亮點”》 (適用于方案匯報、戰略PPT、標書/投資人演示)一、內容類坑(戰略/趨勢層面)? Pitfall (不要寫)? Correct Expression (推薦寫法)Why (原因)還在強調 Caffe / Theano / TF1.x / LSTM采用 P…

Java數據結構 - 順序表模擬實現與使用

目錄1.順序表的基本介紹2.順序表的模擬實現2.1 常見的功能2.2 基本框架2.3 方法的實現2.3.1 add方法2.3.2 size方法2.3.3 display方法2.3.4 add(int pos,E data)方法2.3.5 remove方法2.3.6 get方法2.3.7 contain方法2.3.8 indexOf方法2.3.9 set方法2.3.1…

rust語言 (1.88) egui (0.32.1) 學習筆記(逐行注釋)(二十六)windows平臺運行時隱藏控制臺

1、主程序第一句添加: 必須放在所有代碼第一句 #![cfg_attr(windows, windows_subsystem "windows")]2、 編譯命令:cargo build --release3、 編譯完成后運行可執行文件: 項目目錄/target/release/項目名.exe

什么是靜態住宅IP 跨境電商為什么要用靜態住宅IP

靜態住宅IP的定義靜態住宅IP是指由互聯網服務提供商(ISP)分配給家庭用戶的固定IP地址。與動態IP不同,靜態IP不會頻繁變動,長期保持穩定。其特點包括:固定性:IP地址長期不變,適合需要穩定網絡環境…

RabbitMQ 初步認識

目錄 1. 基本概念 2. RabbitMq 的工作流程 3. 協議 4. 簡單的生產者, 消費者模型 4.1 我們先引入 rabbitmq 的依賴 4.2 生產者 4.3 消費者 1. 基本概念 Pruducer : 生產者, 產生消息Consumer : 消費者, 消費消息Broker : RabbitMq Server, 用來接收和發送消息Connectio…

Redis(46) 如何搭建Redis哨兵?

搭建 Redis 哨兵(Sentinel)集群,確保 Redis 服務具有高可用性。以下是詳細的步驟,從 Redis 安裝、配置主從復制到配置和啟動 Sentinel 集群,并結合相關的代碼示例。 步驟 1:安裝 Redis 首先,需要…

Grafana 多指標相乘

PromQL中多指標相乘 PromQL表達式: 0.045 * h9_daily_income{coin"nock"} * h9_pool_price_cny{coin"nock"}📈 基礎:單指標運算 常數與指標相乘 在PromQL中,常數與指標的乘法是最簡單的運算: # ?…

【微服務】springboot3 集成 Flink CDC 1.17 實現mysql數據同步

目錄 一、前言 二、常用的數據同步解決方案 2.1 為什么需要數據同步 2.2 常用的數據同步方案 2.2.1 Debezium 2.2.2 DataX 2.2.3 Canal 2.2.4 Sqoop 2.2.5 Kettle 2.2.6 Flink CDC 三、Flink CDC介紹 3.1 Flink CDC 概述 3.1.1 Flink CDC 工作原理 3.2 Flink CDC…

分布式數據架構

分布式數據架構是一種將數據分散存儲在多臺獨立計算機(節點)上,并通過網絡協調工作的系統設計。其核心目標是解決海量數據處理、高并發訪問、高可用性及可擴展性等傳統集中式數據庫難以應對的挑戰。以下是關鍵要點解析:一、核心原…