Как я могу установить прозрачные стены в данном представлении с Revit API? - PullRequest
0 голосов
/ 12 марта 2019

Я пытаюсь установить прозрачные стены, используя 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 он ожидает? Это идентификатор категории стены? В таком случае, здесь все должно быть в порядке)?Или это при применении переопределения фильтра к представлению?

Любая помощь будет принята с благодарностью!Arnaud.

1 Ответ

0 голосов
/ 14 марта 2019

Я вижу, что вы применяете фильтр прозрачности к стенам. Я не уверен на 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 / Кроме того, чтобы я мог отследить любые проблемы в моем цикле и продолжить с другими элементами. если я не сделаю этого, и один просмотр не удастся, мы потерпели бы неудачу во всей операции.

Вот какой должен быть результат:

enter image description here

...