我尝试使用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呢?它是墙类别的Id吗?在这种情况下,它应该可以在这里)?或者是在将过滤器覆盖应用于视图时?
任何帮助都将不胜感激!阿诺德。
发布于 2019-03-14 09:32:22
我可以看到您正在将透明度过滤器应用于墙。我不能百分之百确定这是不是最有效的方法,因为我们可以通过Category override覆盖透明度。请记住,过滤器是有限的,因为我们只能将其中的一小部分应用于视图。有一个最大数量。我不记得从我的头顶,但有。此外,过滤器的顺序也很重要,因为它们可能会基于顺序覆盖彼此的规则。无论哪种方式,都可以通过在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语句中,这样我就可以捕获循环中的任何问题,并仍然继续处理其他项目。如果我不这样做,并且一个视图失败,我们就会使整个操作失败。
结果应该是这样:
https://stackoverflow.com/questions/55125366
复制相似问题