今天我们来解决一个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的乐趣“群成员已经过百了,有希望入群的小伙伴,可以加我好友,备注来源,我来拉你入群哦~
网友评论