Сообщество программистов Autodesk в СНГ

ADN Club => Revit API => Тема начата: Alex25 от 08-09-2020, 23:02:15

Название: Оптимизация алгоритма с циклами
Отправлено: Alex25 от 08-09-2020, 23:02:15
Доброго времени суток. Вопрос по рефакторингу кода с циклами. Ищу пересечения mep элементов со стенами.

-Собираю коллектор Труб
-Отправляю в метод Creation все трубы
-В начале метода Creation проецирую все стены на оси XY (зануляю Z) , таким образом, получаю "подозреваемые стены" из линии текущей трубы и всех стен (всех стен, например 1000, а после проекции 10) методом curve_projection_wall.Intersect(curve_projection_communication, out results);
-Прохожусь циклом по всем "подозреваемым стенам" и проверяю пересечение solid стены и текущей трубы методом  SolidCurveIntersection intersection = geomSolid.IntersectWithCurve(commCurve, optS);
Алгоритм работает долго.
Был другой способ:
-Беру цикл по ВСЕМ стенам в проекте. У каждой стены беру solid
-В этом цикле, проверяю Solid стены и все трубы через фильтр ElementIntersectsSolidFilter.
-В методе Creation все аналогично, но без проверки на проекцию.
Вопрос: Как можно сократить время алгоритма поиска пересечений стен и Mep Curve?
(https://i.postimg.cc/gLZpNSxk/1.png) (https://postimg.cc/gLZpNSxk)

Название: Re: Оптимизация алгоритма с циклами
Отправлено: trir от 09-09-2020, 06:09:43
https://habr.com/ru/post/278765/
Название: Re: Оптимизация алгоритма с циклами
Отправлено: Владимир Шу от 09-09-2020, 11:02:09
Решал похожую задачу (Хотя я подозреваю, что любой начинающий писать под рРевит, решает эту задачу) и предложенное решение с RTree очень хорошее, позволяет произвести предварительную выборку объектов с которыми возможно пересечение и уже их проверить внимательно средствами самого Ревит, это позволяет сократить время поиска на порядки.
Название: Re: Оптимизация алгоритма с циклами
Отправлено: ivmax от 09-09-2020, 11:14:22
можно попробовать получить "подозреваемые стены" с помощью подходящего к вашей задаче ElementQuickFilter, например BoundingBoxIntersectsFilter, отпадает необходимость проецировать все стены и проверить их всех по пересечениям curve.
Название: Re: Оптимизация алгоритма с циклами
Отправлено: Alex25 от 09-09-2020, 23:49:30
Да , так и сделал через BoundingBoxIntersectsFilter. Всем спасибо. С проецированием на X Y , также быстро , но есть такие моменты... Поэтому и выбрал BoundingBoxIntersectsFilter.
(https://i.postimg.cc/JsfvFVK5/2.png) (https://postimg.cc/JsfvFVK5)