FilteredElementCollector

Главная Форумы Задать вопрос FilteredElementCollector

Просмотр 15 сообщений - с 1 по 15 (из 19 всего)
  • Автор
    Сообщения
  • #6127 Score: 0
    txt
    Модератор
    86 pts

    Друзья , подскажите правильно ли я понимаю , что FilteredElementCollector применяется в динамо, когда нужно отфильтровать ВСЕ элементы в проекте с помощью OST_…. ?

    #6128 Score: 0
    Khasan Mamaev
    Модератор
    186 pts

    Это метод Revit API, которым можно пользоваться в Динамо в Питон-скрипте

    #6129 Score: 0
    txt
    Модератор
    86 pts

    Все трубы в проекте :

    ***

    doc = DocumentManager.Instance.CurrentDBDocument
    uiapp = DocumentManager.Instance.CurrentUIApplication
    app = uiapp.Application

    uidoc=DocumentManager.Instance.CurrentUIApplication.ActiveUIDocument

    collector = FilteredElementCollector(doc) # создали коллектор
    filter = ElementCategoryFilter(BuiltInCategory.OST_PipeCurves) # создали фильтр по категории OST_PipeCurves
    All_pipes=collector.WherePasses(filter).WhereElementIsNotElementType().ToElements() # Отфильтровываем все что не соответствует фильтру

    OUT=All_pipes

    Вопрос : как аналогично выбрать все трубы только на активном виде в питоне (что в код нужно добавить)?

     

    #6130 Score: 3
    Legantmar
    Хранитель
    474 pts

    txt, почти правильно
    т.к. существуют:
    FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Walls).WhereElementIsNotElementType().ToElements()
    FilteredElementCollector(doc).OfClass(Wall).ToElements()
    такие записи идентичны, например, на выходе ты получишь элементы стен расположенных в проекте

    Но верхнюю строчку можно переписать и так:
    FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Walls).WhereElementIsElementType().ToElements()
    тогда получишь только типы элементов в файле без элементов размещенных в проекте.

    Подробнее здесь
    Путем нехитрых манипуляций можно получать BuiltIn по имени категории

    #6131 Score: 0
    txt
    Модератор
    86 pts

    Спасибо за разъяснения… BuiltIn по имени – очень нужная и удобная штука!

    а как насчет вопроса “Получить все трубы на активном виде” ?

    #6132 Score: 1
    Legantmar
    Хранитель
    474 pts

    Для получения элементов только на активном виде нужно добавить строчки:
    view = doc.ActiveView
    filter = ElementLevelFilter(view.GenLevel.Id)
    OUT = FilteredElementCollector(doc).OfCategory(ost).WherePasses(filter).WhereElementIsNotElementType().ToElements()

    #6133 Score: 0
    txt
    Модератор
    86 pts

    Спасибо!

    И еще вопрос:

    если мы получили таким образом элементы на активном виде, то они включают в себя и скрытые элементы ?

    #6134 Score: 1
    Legantmar
    Хранитель
    474 pts

    да
    чтобы избавиться от скрытых нужно проверять условие типа if not element.IsHidden: OUT = element

    #6135 Score: 0
    txt
    Модератор
    86 pts

    Подскажите где ошибка (получить элемента только на активном виде):

    Ошибка:

     

    #6136 Score: 0
    Legantmar
    Хранитель
    474 pts

    а я и не обещал, что на 3D виде будет работать ))
    ты можешь получить все элементы, а далее прояви смекалку как бы ты их мог сам отфильтрофать по какому нить параметру в цикле for с условием if (если уровень, диаметр или цвет такой то, то сложить в список), надеюсь мысль понятна..)

    #6138 Score: 1
    Oleg
    Участник
    28 pts

    Если обратиться к ReviAPI, то у FilteredElementCollector есть несколько перегрузок:

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

    FilteredElementCollector(doc, uidoc.ActiveView.Id)

     

    #7035 Score: 0
    txt
    Модератор
    86 pts

    вопрос 1: как в питоне получить ВСЕ элементы на активном виде? (т.е. запитонить нод “All elements in active view”)

    Примечание : нод “All elements in active view” не видит TextElement, так что тут не совсем All elements
    вопрос 2: можно ли питоном заменить ноды:

    в итоге в питоне хотелось бы получить все элементы на активном виде (то что получаем стандартным нодом + TextElement  Марки, Аннотации, Размеры и т.д.)

    #7037 Score: 0
    txt
    Модератор
    86 pts

    западный форум подсказал решение:

    import clr
    clr.AddReference('RevitAPI')
    clr.AddReference('RevitServices')
    import Autodesk,RevitServices
    from Autodesk.Revit.DB import *
    from RevitServices.Persistence import DocumentManager
    doc = DocumentManager.Instance.CurrentDBDocument
    collector=FilteredElementCollector(doc,doc.ActiveView.Id).ToElements()
    OUT=collector

    #7038 Score: 0
    txt
    Модератор
    86 pts

    Далее вопрос:
    как получить ВСЕ элементы в ПРОЕКТЕ?

    #7040 Score: 1
    ИваСерж
    Хранитель
    134 pts

    ВСЕ элементы в ПРОЕКТЕ – это “bad idea” и что имеется ввиду под “все”?

    Нужны материалы, например, типы линий, семейства, типы семейств, экземпляры… короче, если выбрать прям все-все, то “Боливар не выдержит”

Просмотр 15 сообщений - с 1 по 15 (из 19 всего)
  • Для ответа в этой теме необходимо авторизоваться.