pyRevit之清理未使用的房间和面积

你好,这里是 BIM 的乐趣


快过年了,看群里的小伙伴们还在努力学习,我也要加油了,多写一些好的教程分享给大家。

之前有很多小伙伴开始学 Dynamo,慢慢觉得不够用,又开始学 Python,然后就问,是不是还要学 C# 等等,这个还是看个人需求了。不过还是有个工具——pyRevit,是可以帮我们解决不少问题的,至少会 Python 的你,也可以轻松的来解决日常需求了。

那么今天,我们来简单试试,在 pyRevit 里,如何实现自己的小工具。

首先 pyRevit 是开源程序,它可以帮助你在 Revit 环境中及其 API 内快速勾勒出自动化和附加模块的想法,无论您熟悉使用哪种语言【支持多种编程语言,如 python(ironPython 和 CPython),C#,VB.net】。

如下图,可以非常简单的将自己的工具或者别人的工具,整理到自己的工作面板上。

如果程序是通过 Python 编写的,你还可以非常简单的优化和更改程序代码,如下图,我将 pyRevit 自带的创建填充图案工具,拿了过来,并且将其汉化了一下:

pyRevit之清理未使用的房间和面积_第1张图片


接下来,我们就通过最简单的方式,将自己的 Dy 工具移植到 pyRevit 上来:

本次我们要写的小程序是《快速清理未使用的房间和面积》:

Dynamo 的教程参考之前的文章(Dynamo 一键清理 Revit 中未放置的房间和多余的房间),这里就不在赘述了。

理论上来讲,我们可以直接将 Dynamo 的代码复制过来,按指定的格式和路径添加到 pyRevit 里就可以,但是 pyRevit 实际上做了很多简化工作,让我们可以更简单的实现我们的功能:

先附上之前清理未放置房间完整代码:


import clr
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *

clr.AddReference("RevitAPI")
from Autodesk.Revit.DB.Events import *
from Autodesk.Revit.DB import *

import Revit
clr.ImportExtensions(Revit.Elements)
clr.ImportExtensions(Revit.GeometryConversion)

clr.AddReference("RevitServices")
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager

doc = DocumentManager.Instance.CurrentDBDocument
uidoc = DocumentManager.Instance.CurrentUIApplication.ActiveUIDocument

def _GetAllCategory (category):
  doc = DocumentManager.Instance.CurrentDBDocument
  collector = FilteredElementCollector(doc)
  collector.OfCategory(category)
  abc = collector.GetElementIdIterator()
  abc.Reset()
  rtn=[]
  for a in abc:
    rtn.append(doc.GetElement(a))
  return rtn

def _CleanRoom():
  rooms = _GetAllCategory(BuiltInCategory.OST_Areas)
  rtn=[]
  for rm in rooms:
    if rm.Area==0:
      doc.Delete(rm.Id)
    else:
      rtn.append(rm)
  return rtn

TransactionManager.Instance.EnsureInTransaction(doc)
if UnwrapElement(IN[0])==True:
  OUT= _CleanRoom()
else:
  OUT=None
TransactionManager.Instance.TransactionTaskDone()

再看看在 pyRevit 中需要的代码:



import Autodesk
from Autodesk.Revit.DB import FilteredElementCollector,BuiltInCategory,Transaction

doc = __revit__.ActiveUIDocument.Document
uidoc = __revit__.ActiveUIDocument

def _Clean(eles):
  rtn=[]
  for e in eles:
    if e.Area==0:
      doc.Delete(e.Id)
    else:
      rtn.append(e)
  return rtn

rooms = FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Rooms).ToElements()
areas = FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Areas).ToElements()

t = Transaction(doc, '清理未使用的房间和面积')

t.Start()

_Clean(rooms)
_Clean(areas)

t.Commit()

如上,实际上我们需要改的代码并不多,只需要精简即可:

这里我们引用大幅减少,只引入 FilteredElementCollector,BuiltInCategory,Transaction 这三项即可,其他的 pyRevit 都帮我们解决了。

然后就按照 API 手册写即可了。

pyRevit之清理未使用的房间和面积_第2张图片

最后我们可以按照 pyRevit 指定的目录格式放置,就能加载工具,同时可以还可以添加各种的注释,咱们下次有时间接着聊~

pyRevit之清理未使用的房间和面积_第3张图片

好了,今天的分享就到这里,小伙伴们快去自己尝试吧~

你可能感兴趣的:(Dynamo案例百解,Dynamo,python)