今天讓我們繼續,看看如何批量創建常用的基礎元素:梁。
跳過軸線為直線段形的,先從圓弧形的開始:
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