【问题标题】:How can I set transparent walls in a given view with Revit API?如何使用 Revit API 在给定视图中设置透明墙?
【发布时间】:2019-08-03 03:42:54
【问题描述】:

我尝试使用 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 吗?在这种情况下,这里应该没问题)?还是在将过滤器覆盖应用于视图时?

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

【问题讨论】:

    标签: revit-api pyrevit


    【解决方案1】:

    我可以看到您正在将透明度过滤器应用于墙。我不能 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()
    

    另外,只有几个通用的 cmets。尽量减少迭代列表的次数,尤其是当它们是相同的项目时。如果你能在第一个循环中做你需要做的事情,那是最好的。上面的内容可以通过列表理解进一步简化,但出于教育目的,我想保持“显而易见”。

    在尝试这样做之前,我还在检查 Category 是否可覆盖。为什么?因为如果视图类别覆盖由视图模板控制,它将不允许我们设置覆盖。此外,某些类别没有表面透明度覆盖 ex。如果我没记错的话。

    最后,我喜欢把它全部放在一个 try/except 语句中,这样我就可以在我的循环中发现任何问题,并且仍然可以继续处理其他项目。如果我不这样做,并且一个视图失败了,我们就会失败整个操作。

    结果应该是这样的:

    【讨论】:

    • 非常感谢您的建议,非常感谢!事实上,它似乎有一些过滤器顺序和相互覆盖的东西。你的方法更干净!再次感谢!
    猜你喜欢
    • 2021-06-28
    • 2020-08-21
    • 2017-04-30
    • 2011-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    相关资源
    最近更新 更多