Расширенная фильтрация элементов в Revit API - PullRequest
0 голосов
/ 04 марта 2019

Я использовал следующий пример, показанный в этом видео на YouTube (https://www.youtube.com/watch?v=WU_D2qNnuGg&index=7&list=PLc_1PNcpnV5742XyF8z7xyL9OF8XJNYnv), который иллюстрирует превосходство методов фильтрации в Revit API над обычной итерацией. Но мой код значительно медленнее, чем метод итерации:
метод фильтрации-0,16 с
метод итерации-0,06 с

Мой код с использованием метода фильтра:

import Autodesk.Revit.DB as DB
doc=__revit__.ActiveUIDocument.Document
uidoc=__revit__.ActiveUIDocument

height_param_id=DB.ElementId(DB.BuiltInParameter.WALL_USER_HEIGHT_PARAM)
height_param_prov=DB.ParameterValueProvider(height_param_id)
param_equality=DB.FilterNumericEquals() # equality class
height_value_rule=DB.FilterDoubleRule(height_param_prov,param_equality,10,1e-02)
param_filter=DB.ElementParameterFilter(height_value_rule)

# This program significantly slows down for the next line
walls=DB.FilteredElementCollector(doc)\
                        .WherePasses(param_filter)\
                        .ToElementIds()

uidoc.Selection.SetElementIds(walls) 

Для итерации использовался следующий код.

from System.Collections.Generic import List 
import Autodesk.Revit.DB as DB

doc=__revit__.ActiveUIDocument.Document
uidoc=__revit__.ActiveUIDocument

sheet_collector=DB.FilteredElementCollector(doc)\
             .OfCategory(DB.BuiltInCategory\
             .OST_Sheets)\
             .WhereElementIsNotElementType()\
             .ToElements()

walls=DB.FilteredElementCollector(doc)\
                        .OfCategory(DB.BuiltInCategory.OST_Walls)\
                        .WhereElementIsNotElementType()\
                        .ToElements()
tallwallsids=[]

for wall in walls:
    heightp=wall.LookupParameter('Unconnected Height')
    if heightp and heightp.AsDouble()==10: 
        tallwallsids.append(wall.Id)

uidoc.Selection.SetElementIds(List[DB.ElementId](tallwallsids)) 

Ответы [ 2 ]

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

Это имеет смысл, если учесть количество элементов, которые должны учитывать оба метода.Первый метод:

walls=DB.FilteredElementCollector(doc)\
                        .WherePasses(param_filter)\
                        .ToElementIds()

В этом методе вы просите фильтр рассмотреть ВСЕ элементы в модели.Это потенциально много элементов для прохождения через фильтр.Это противоположно:

walls=DB.FilteredElementCollector(doc)\
                        .OfCategory(DB.BuiltInCategory.OST_Walls)\
                        .WhereElementIsNotElementType()\
                        .ToElements()

В этом методе вы используете БЫСТРЫЙ фильтр OfCategory() и еще один WhereElementIsNotElementType(), чтобы сузить выбор только до Wall экземпляров.Даже если вы выполните это с помощью простого цикла for, который здесь является медленным компонентом, он все равно БЫСТРЕЕ, чем пропуск ВСЕХ элементов в модели через первый фильтр.

Вы можете оптимизировать его, создав фильтр, подобный следующему:

walls=DB.FilteredElementCollector(doc)\
                        .OfCategory(DB.BuiltInCategory.OST_Walls)\
                        .WhereElementIsNotElementType()\
                        .WherePasses(param_filter)
                        .ToElements()

Это на самом деле объединит быстрый фильтр категорий, фильтр типов элементов и медленный фильтр параметров, что потенциально может быть быстрее и в целом.легче читать решение.

Попробуй, и дай мне знать, если это имеет смысл.

Ура!

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

Какой метод итерации?

В настоящее время сборщики отфильтрованных элементов обычно являются единственным способом извлечения и итерации элементов базы данных Revit.

Сборщик отфильтрованных элементов сам по себе, вероятно, быстрый.

Если у вас огромное количество стен и ваша память ограничена, вызов ToElementIds может потребовать значительных ресурсов.

SetElementIds также может стоить времени.

ПроверкаПодробное обсуждение на форуме Revit API по сборщику фильтруемых элементов по типам трубопроводной системы .

Я предлагаю вам предоставить полный минимальный воспроизводимый образец образца , оснащенныйкод тестирования для каждого из этих вызовов методов, чтобы доказать снижение производительности.

...