上次探讨了利用Dynamo批量创建过滤器。由于过滤器只作用于当前视图,所以在工作中关于过滤器经常有的一个需求就是:将某个视图已经添加好的过滤器引用到另一个视图来避免重复性的工作。
在Revit中可以通过设置视图样板来满足这样的需求,但与之同时却带来了新的麻烦:详细程度,显示模式,模型类别可见性,链接文件可见性,导入文件可见性等一系列参数都随着样板而固化,要修改其中某一项,只能返回视图样板中去修改,可谓得不偿失。
实现这一需求比把大象放进冰箱还要简单,只用两步就能完成:
读取数据,写入数据。
读取源视图数据:
通过View类下的GetFilters()方法获取视图过滤器、GetFilterOverrides()方法获取过滤器图形替换。
数据写入目标视图:
使用SetFilterOverrides()方法,将读取到的数据写入。
完整代码:
# 视图间引用过滤器
# By I am the one
import clr
clr.AddReference('RevitAPI')
from Autodesk.Revit.DB import *
clr.AddReference("RevitNodes")
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
view1 = UnwrapElement(IN[0])
if isinstance(IN[1],list):
view2 = UnwrapElement(IN[1])
else:
view2 = [UnwrapElement(IN[1])]
TransactionManager.Instance.EnsureInTransaction(doc)
filters_ids = view1.GetFilters()
filters = []
for f in filters_ids:
override = view1.GetFilterOverrides(f)
for v in view2:
v.SetFilterOverrides(f,override)
filters.append(doc.GetElement(f))
TransactionManager.Instance.TransactionTaskDone()
OUT = filters
搭配按回路统计电缆工程量文章中,读取被选择图元的功能使用更加丝滑。
演示视频:
欢迎阅读,分享,交流,批评指正。
如转载请注明出处,否则追究法律责任(说说而已,全靠自觉)。
评论0