如何使用Revit API在给定视图中设置透明墙?

时间:2019-03-12 15:35:46

标签: revit-api pyrevit

我尝试使用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?在这种情况下,在这里应该可以)?还是将滤镜替代应用于视图时?

任何帮助将不胜感激! 阿诺。

1 个答案:

答案 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语句中,这样我就可以捕获循环中的任何问题,并继续处理其他项目。如果我不这样做,而一个视图失败,那么我们将使整个操作失败。

这应该是结果:

enter image description here