Еще раз о списке элементов инженерной системы
Я уже писал о том, как можно получить список элементов инженерной системы, а также об улучшении алгоритма.
Однако, как оказалось, на реальном проекте с множеством систем и сотней тысяч элементов, данный поиск занимает ну очень много времени, так как фильтрация по значению параметра, относится к классу, так называемых медленных фильтров или низко производительных.
После этого стал искать другой способ как это можно сделать быстрее.
В процессе поиска я открыл DotPeek чтобы изнутри взглянуть на методы класса MEPSystem. Из интересного я обнаружил защищенный метод getElementsInNetwork(), который по названию звучит как «то что нужно»
Первой мыслью было с помощью рефлексии вызвать этот метод. Однако, воспользовавшись функцией поиска использования метода в том же DotPeek, мы видим, что этот метод используется в методе MechanicalSystem.DuctNetwork() и PipingSystem.PipingNetwok(), который являются публичными.
Таким образом, все оказалось довольно просто. Нужно было искать не в базовом классе, в наследуемых. Правда непонятно, для чего нельзя было создать один метод типа MEPSystem.SystemNetwork(). Видимо это связано с электрикой, так как там структура данных совсем другая.
Ну а пока же нам просто нужно вызывать нужный метод для трубопроводов или механизмов в отдельности.
Еще раз проверим на тестовом примере из первой статьи:
Выполним такой код:
- filteredElementCollector = new FilteredElementCollector(doc);
- systems =
- filteredElementCollector
- .OfClass(typeof (MechanicalSystem))
- .ToElements();
- sb = new StringBuilder();
- foreach (MechanicalSystem system in systems)
- {
- sb.AppendLine(string.Format("{0}: {1} Type: {2}; Количество элементов: {3}",
- system.Id,
- system.Name,
- system.GetType().Name,
- system.DuctNetwork.OfType<Element>().Count()));
- foreach (Element element in system.DuctNetwork)
- {
- sb.AppendLine(string.Format(" {0}: {1} Тип: {2}",
- element.Id,
- element.Name,
- element.GetType().Name));
- }
- }
- TaskDialog.Show("Systems", sb.ToString());
В итоге, получим тот же самый результат, что и с моим первоначальным алгоритмом, только работающий гораздо быстрее.
Обсуждение: http://adn-cis.org/forum/index.php?topic=2704
Опубликовано 14.05.2015