美文网首页BIM的乐趣
Dynamo一键清理Revit中未放置的房间和多余的房间

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

作者: 九哥BIMer | 来源:发表于2020-04-25 12:04 被阅读0次

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

    相关文章

      网友评论

        本文标题:Dynamo一键清理Revit中未放置的房间和多余的房间

        本文链接:https://www.haomeiwen.com/subject/sfghwhtx.html