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

昨天实现了一个完整的示例 Python+DRVT 从外部调用 Revit:批量创建墙,今天我们将在此基础上稍作扩展:每创建一堵墙之后,在其中间位置创建一扇门。

python 复制代码
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
from 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):
            continue
        tmp.append(l)
    ret = sorted(tmp, key=lambda x:x.getElevation())
    return ret

# 遍历WallType,返回List[DB.WallType]
def getWallTypes(ctx : MyContext) -> List[DB.WallType]:
    wallTypeList : List[DB.WallType] = []
    listWt = DB.FilteredElementCollector.ctor(ctx.session, ctx.doc).OfClass(ctx.session.typeof(DB.WallType)).ToElements()
    for i in range(listWt.getCount()):
        wt = DB.asWallType(listWt.getItem(i))
        if isNone(wt):
            continue
        wallTypeList.append(wt)
    return wallTypeList

# 遍历门FamilySymbol,返回List[DB.FamilySymbol]
def getDoorFamilySymobls(ctx : MyContext) -> List[DB.FamilySymbol]:
    doorFamilySymobls : List[DB.FamilySymbol] = []
    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):
            continue
        cat = fs.getCategory()
        if isNone(cat) or cat.getBuiltInCategory() != DB.BuiltInCategory.OST_Doors:
            continue;
        doorFamilySymobls.append(fs)
    return doorFamilySymobls


# 示例创建墙并在墙上创建门
def DoorCreation(ctx: MyContext) -> None:
    """
    本示例展示如何使用Python+DRVT,在外部让Revit批量创建墙并在墙上创建门
    """
    if ctx.doc is not None:
        ctx.closeDoc(True)

    template = "建筑样板.rte"
    fileName = "DoorCreation.rvt"
    err = ctx.createAndActiveDoc(template, fileName)
    if err != 0:
        raise AssertionError(f"创建项目文档失败: 错误码 {err}")

    session = ctx.session
    doc = ctx.doc
    
    # 取所有标高,缺省是两个
    levelList = getLevels(ctx)
    if len(levelList) < 2:
        raise AssertionError(f"标高过少,本示例用到2个标高")
    level0 = levelList[0].getId()
    level1 = levelList[1].getId()
    ele0 = levelList[0].getElevation()
    
    try:
        # 取所有墙类型
        wallTypeList = getWallTypes(ctx)
        # 取所有门类型
        doorFamilySymoblList = getDoorFamilySymobls(ctx)

        # 涉及到修改操作的,需要锁定并用事务包装
        ctx.lockAndStartTransaction("批量创建示例")

        docCreate = doc.getCreate()
        for i in range(0,10):
            # 取一个WallType
            wallType = wallTypeList[i % len(wallTypeList)]
            # 设置WallType
            ctx.doc.SetDefaultElementTypeId(DB.ElementTypeGroup.WallType, wallType.getId())
            # 这里使用轴线法
            # 创建墙的轴线
            x = m2feet(i*3)
            y1 = m2feet(3)
            y0 = -y1
            p0 = DB.XYZ.ctor(session, x, y0, ele0)
            p1 = DB.XYZ.ctor(session, x, y1, ele0)
            line = DB.Line.CreateBound(session, p0, p1)
            # 创建墙
            wall = DB.Wall.Create(session, doc, line, level0, False)
            # 取"顶部约束"参数
            p = wall.getParameter(DB.BuiltInParameter.WALL_HEIGHT_TYPE)
            # 更新其值为"标高2"的ID
            p.Set(level1)

            # 选择门FamilySymbol
            doorFamilySymbol = doorFamilySymoblList[i % len(doorFamilySymoblList)]
            if not doorFamilySymbol.getIsActive():
                doorFamilySymbol.Activate()

            # 确定门的位置
            doorPos = DB.XYZ.ctor(session, x, 0, ele0)
            # 创建门实例
            docCreate.NewFamilyInstance(doorPos, doorFamilySymbol, wall, levelList[0], Structure.StructuralType.NonStructural)

        # 提交事务并解锁,若没有错误则修改操作将会生效
        ctx.commitTransactionAndUnlock()
    except Exception as e:
        print(f"【异常】{e}")
        # 回滚事务并解锁
        ctx.rollbackTransactionAndUnlock()



# 下面这段代码,看过"创建新项目"示例的会很熟悉,就是照搬过来的
# 创建新的上下文(可以按需创建多个,意味着能直接管理多个 Revit 会话)
ctx = MyContext("在这里指定会话名称")
# 初始化会话(启动 Revit 进程实例)
ctx.initSession()

# 调用DoorCreation
DoorCreation(ctx)

# 保存文档并关闭
ctx.closeDoc(True)

# 结束会话(Revit 进程实例将退出)
ctx.dispose()

又是一个完整的自动化脚本,与前一示例相比,只增加了:

a、门FamilySymbol的获取

b、创建墙之后,在其中部创建门实例

这么点代码做了什么:

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

2、批量创建墙并在墙上创建一扇门

3、保存项目文件并关闭

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

其中"2、批量创建墙并在墙上创建一扇门"做了以下工作:

1)创建项目 "DoorCreation.rvt" 并作为当前活动文档(可见、可交互)

2)获取该文档中所有标高(按Elevation排序)

3)获取该文档中所有WallType元素

4)获取所有门FamilySymbol

5)创建轴线

6)按轴线创建墙

7)更新墙的参数"顶部约束"

8)选择一个门FamilySymbol并激活

9)在6)创建的墙体中间位置创建门实例

运行结果(3D视图):

全自动完成,全程不必手工操作。有了DRVT的加持,Revit插件的核心能力可以在外面用Python脚本轻松驾驭了。自动化生产流水线的雏形渐渐呈现,将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博客

深度嵌入数字化工作流:DRVT 的思考与实践-CSDN博客

从插件化走向系统集成------Revit-CSDN博客

Revit变身智能组件,BIM未来可期-CSDN博客

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

相关推荐
yanxing.D2 小时前
OpenCV轻松入门_面向python(第六章 阈值处理)
人工智能·python·opencv·计算机视觉
JJJJ_iii3 小时前
【机器学习01】监督学习、无监督学习、线性回归、代价函数
人工智能·笔记·python·学习·机器学习·jupyter·线性回归
Python图像识别6 小时前
71_基于深度学习的布料瑕疵检测识别系统(yolo11、yolov8、yolov5+UI界面+Python项目源码+模型+标注好的数据集)
python·深度学习·yolo
千码君20167 小时前
React Native:从react的解构看编程众多语言中的解构
java·javascript·python·react native·react.js·解包·解构
淮北4947 小时前
windows安装minicoda
windows·python·conda
爱喝白开水a9 小时前
LangChain 基础系列之 Prompt 工程详解:从设计原理到实战模板_langchain prompt
开发语言·数据库·人工智能·python·langchain·prompt·知识图谱
默默coding的程序猿10 小时前
3.git的分支携带问题是什么?怎么解决?
java·git·python·svn·gitee·github·intellij-idea
新子y12 小时前
【小白笔记】PyTorch 和 Python 基础的这些问题
pytorch·笔记·python
我是李武涯12 小时前
PyTorch DataLoader 高级用法
人工智能·pytorch·python
Lynnxiaowen12 小时前
今天我们开始学习python语句和模块
linux·运维·开发语言·python·学习