Я вижу, что вы применяете фильтр прозрачности к стенам. Я не уверен на 100%, что это наиболее эффективный способ достижения этого, поскольку мы можем переопределить прозрачность с помощью переопределения категории. Пожалуйста, имейте в виду, что фильтры ограничены, так как мы можем применить только несколько из них к представлению. Существует максимальное количество. Я не помню из головы, но есть. Также важен порядок фильтров, поскольку они могут переопределять правила друг друга в зависимости от порядка. Любой способ переопределить прозрачность может быть достигнут, изменив ее на категории, например, так:
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()
Кроме того, всего несколько общих комментариев. Постарайтесь свести к минимуму количество повторений списков, особенно если это одни и те же элементы. Если вы можете делать то, что вам нужно сделать в первом цикле, то это лучшее. Вышесказанное можно еще больше упростить с помощью понимания списка, но я хотел, чтобы оно было «очевидным» для образовательных целей.
Я также проверяю, является ли Категория переопределенной, прежде чем пытаться это сделать. Зачем? Потому что, если переопределения категорий представлений контролируются шаблоном представления, это не позволит нам установить переопределения. Также некоторые категории не имеют прозрачности поверхности, например. линии, если я правильно помню.
Наконец, мне нравится помещать все это в оператор try / Кроме того, чтобы я мог отследить любые проблемы в моем цикле и продолжить с другими элементами. если я не сделаю этого, и один просмотр не удастся, мы потерпели бы неудачу во всей операции.
Вот какой должен быть результат: