BIM的乐趣

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

2020-04-25  本文已影响0人  九哥BIMer

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

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

image

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

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

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

image

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

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

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

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

image

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

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

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

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

这里也可以直接读取Element,从族类型降级到族实例,代码如下:

rooms = FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Rooms).WhereElementIsNotElementType().ToElements()

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

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

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

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

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

TransactionManager.Instance.EnsureInTransaction(doc)

TransactionManager.Instance.TransactionTaskDone()

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

好了,今天的分享就到这里了,主要是分享思路,小伙伴要多自己尝试才行哦~~

BIM的乐趣“群成员已经过百了,有希望入群的小伙伴,可以加我好友,备注来源,我来拉你入群哦~

上一篇 下一篇

猜你喜欢

热点阅读