Python для Revit - собирать представления в активном представлении

Я пытаюсь использовать FilteredElementCollector внутри моего скрипта pyRevit, чтобы собрать все виды (разрезы, фасады, выноски планов и т. Д.) В активном виде.

from pyrevit.framework import clr
from pyrevit import revit, DB

clr.AddReference('RevitAPI')
clr.AddReference('RevitAPIUI')

from Autodesk.Revit.DB import *
from pyrevit import forms

doc = __revit__.ActiveUIDocument.Document

view = doc.ActiveView
AllStuff = FilteredElementCollector(doc,doc.ActiveView.Id).WhereElementIsNotElementType().ToElements()

AllViews = []

try:
    for x in AllStuff:
        if "View" in x.Category.Name:
            AllViews.append(x)

Это вернет некоторые, но не все мнения. Например, некоторые разделы включены, а другие нет, и я не могу сказать, почему.

Если я добавлю ".OfCategory(BuiltInCategory.OST_Views)", я вообще ничего не получу. Нужно ли разбивать его на несколько более конкретных категорий? Спасибо за любую помощь.

1 ответ

Решение

В FilteredElementCollector нет представления (doc, doc.ActiveView.Id), его можно увидеть, выполнив:

for el in FilteredElementCollector(doc, doc.ActiveView.Id):
    print(el)

Существует элемент, который не относится к категории OST_Views и не является представлением, даже если он имеет то же имя, что и ваше представление. Чтобы увидеть это вы можете использовать RevitLookUp.

Я нашел способ получить фактическое представление (в настоящий момент я не знаю другого способа), посмотрев на VIEW_FIXED_SKETCH_PLANE BuiltInParameter, который ссылается на SketchPlane, который ссылается на фактическое представление как Element.OwnerViewId. Затем вы можете убедиться, что элемент имеет класс View:

for el in FilteredElementCollector(doc,doc.ActiveView.Id):
    sketch_parameter = el.get_Parameter(BuiltInParameter.VIEW_FIXED_SKETCH_PLANE)
    # If parameter do not exist skip the element
    if not sketch_parameter:
        continue
    view_id = doc.GetElement(sketch_parameter.AsElementId()).OwnerViewId
    view = doc.GetElement(view_id)
    if isinstance(view, View):
        print(view)
Другие вопросы по тегам