你好,这里是 BIM 的乐趣
快过年了,看群里的小伙伴们还在努力学习,我也要加油了,多写一些好的教程分享给大家。
之前有很多小伙伴开始学 Dynamo,慢慢觉得不够用,又开始学 Python,然后就问,是不是还要学 C# 等等,这个还是看个人需求了。不过还是有个工具——pyRevit,是可以帮我们解决不少问题的,至少会 Python 的你,也可以轻松的来解决日常需求了。
那么今天,我们来简单试试,在 pyRevit 里,如何实现自己的小工具。
首先 pyRevit 是开源程序,它可以帮助你在 Revit 环境中及其 API 内快速勾勒出自动化和附加模块的想法,无论您熟悉使用哪种语言【支持多种编程语言,如 python(ironPython 和 CPython),C#,VB.net】。
如下图,可以非常简单的将自己的工具或者别人的工具,整理到自己的工作面板上。
如果程序是通过 Python 编写的,你还可以非常简单的优化和更改程序代码,如下图,我将 pyRevit 自带的创建填充图案工具,拿了过来,并且将其汉化了一下:
接下来,我们就通过最简单的方式,将自己的 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 指定的目录格式放置,就能加载工具,同时可以还可以添加各种的注释,咱们下次有时间接着聊~
好了,今天的分享就到这里,小伙伴们快去自己尝试吧~