Dynamo一键清理Revit中未放置的房间和多余的房间

本文详细介绍了如何在Revit中利用Dynamo脚本通过FilteredElementCollector和API判断房间面积,自动化删除未放置和多余的房间,涉及代码示例和TransactionManager的使用。
摘要由CSDN通过智能技术生成

今天我们来解决一个Revit中比较常见的小问题,就是清理未放置的房间和多余的房间。
 

首先,我们可以先做个测试样例,看看问题在哪里,如下图,我简单画了个模型,生成一个房间明细表,如下图:

我的目的是,利用Dynamo一次清除所有的未放置房间和多余房间。

这个很容易实现,我这里就不摆各种节点了,直接用代码搞定这次。

首先我们要获取所有的房间,首先想到的方法,就是FilteredElementCollector,通过Category来过滤收集元素。我们打开API手册,来查一下这个的用法:

如图,一下就能找到很多我们需要的信息。所以可以根据自己的需求,来收集所需的元素,那我我们这里收集房间的代码如下:

collector = FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Rooms).GetElementIdIterator()

这里是分几个层级来获取房间元素的,首先是构造一个元素收集器,收集所有的元素FilteredElementCollector(doc),然后通过OfCategory方法来获取内置类别的元素,这里需要简单了解下BuiltInCategory Enumeration,API手册中列出了所有BuiltInCategory的枚举,根据需要选择就行。然后我们继续获取元素的ID可以,通过GetElementIdIterator方法。

到这里,我们可以运行一下,看可以得到什么,如下图:

这里我们得到的是Autodesk.Revit.DB.FilteredElementIdIterator子类,还不是我们要的房间元素。

接下来,我们只需要用一个for循环,来获得所有的房间图元,代码如下:


rooms = []
for a in collector:
  rooms.append(doc.GetElement(a))

我们遍历了一下上一步过滤到的元素,得到了对应的Element。
 

接下来我们可以翻到顶部,看下之前的房间明细表,我们可以看出,面积栏未放置和多余的房间位置,是没有面积值得。
 

回到代码上,我们理论上,可以通过判断房间的面积是否等于“0”,来过滤出未放置的房间和多余的房间,于是就有了下面的代码:


for room in rooms:
  if room.Area == 0:
    doc.Delete(room.Id)

到这里,我们的核心代码就完成了,如果单纯的把这几行代码复制过去,发现还是运行不了,所以我们需要对代码进行完善,这里需要对前面添加各种引用,可以百度Dynamo万能模板,把前面代码补全。
 

同时,最后这个删除房间的循环,需要放在以下代码之间,对元素进行解封:


TransactionManager.Instance.EnsureInTransaction(doc)

TransactionManager.Instance.TransactionTaskDone()

这样基本就能实现删除未放置房间和多余房间的功能了。

  • 19
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

九哥BIMer

予人玫瑰,手有余香

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值