我尝试使用pyRevit设置透明墙。我执行以下操作:
categories = List[ElementId]()
wallCatId = ElementId(BuiltInCategory.OST_Walls)
categories.Add(wallCatId)
ogs = OverrideGraphicSettings()
ogs.SetSurfaceTransparency(70)
t = Transaction(doc, "New parameter filter")
t.Start()
filter = ParameterFilterElement.Create(doc, "Walls filter", categories)
t.Commit()
all_views = FilteredElementCollector(doc).OfClass(View).ToElements()
for i in all_views:
if (i.ViewType == ViewType.ThreeD) or (i.ViewType == ViewType.FloorPlan):
views_to_treat.append(i)
t = Transaction(doc, "New visibility filter")
t.Start()
for i in views_to_treat:
i.AddFilter(filter.Id)
i.SetFilterOverrides(filter.Id, ogs)
t.Commit()
什么也没发生,我不知道为什么。是我的“类别”定义不正确(我怎么知道它期望什么样的ElementId?是Wall类别的ID?在这种情况下,在这里应该可以)?还是将滤镜替代应用于视图时?
任何帮助将不胜感激! 阿诺。
答案 0 :(得分:0)
我可以看到您正在将透明度滤镜应用于“墙”。我不能100%地确定这是实现此目标的最有效方法,因为我们可以通过类别覆盖来覆盖透明度。请记住,过滤器是有限的,因为我们只能将少数几个过滤器应用于视图。有最大数量。我不记得我的脑袋,但是有。同样,过滤器的顺序很重要,因为它们可能会基于顺序覆盖彼此的规则。可以通过在Category上进行如下更改来实现覆盖透明度的任何一种方法:
catId = ElementId(BuiltInCategory.OST_Walls)
all_views = FilteredElementCollector(doc).OfClass(View).ToElements()
overrides = OverrideGraphicSettings()
overrides.SetSurfaceTransparency(70)
t = Transaction(doc, "Override Categories")
t.Start()
for i in all_views:
if ((i.ViewType == ViewType.ThreeD) or (i.ViewType == ViewType.FloorPlan)) and (i.IsCategoryOverridable(catId)):
try:
i.SetCategoryOverrides(catId, overrides)
except:
# print out error?
pass
t.Commit()
此外,仅提供一些一般性评论。尝试最小化遍历列表的时间,尤其是当它们是相同的项目时。如果您可以在第一个循环中完成所需的工作,那将是最好的。上面的列表理解可以进一步简化,但出于教育目的,我想使其保持“明显”。
我还在尝试尝试检查Category是否可重写。为什么?因为如果视图类别替代由视图模板控制,则它将不允许我们设置替代。另外,某些类别没有表面透明度替代ex。行,如果我没记错的话。
最后,我希望将其全部放入try / except语句中,这样我就可以捕获循环中的任何问题,并继续处理其他项目。如果我不这样做,而一个视图失败,那么我们将使整个操作失败。
这应该是结果: