Оптимизация алгоритма с циклами

Автор Тема: Оптимизация алгоритма с циклами  (Прочитано 1498 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн Alex25Автор темы

  • ADN OPEN
  • Сообщений: 45
  • Карма: 0
Доброго времени суток. Вопрос по рефакторингу кода с циклами. Ищу пересечения 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?



Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 470
  • Карма: 63

Оффлайн Владимир Шу

  • ADN Club
  • *****
  • Сообщений: 611
  • Карма: 155
    • ПГСу Бложик
Re: Оптимизация алгоритма с циклами
« Ответ #2 : 09-09-2020, 11:02:09 »
Решал похожую задачу (Хотя я подозреваю, что любой начинающий писать под рРевит, решает эту задачу) и предложенное решение с RTree очень хорошее, позволяет произвести предварительную выборку объектов с которыми возможно пересечение и уже их проверить внимательно средствами самого Ревит, это позволяет сократить время поиска на порядки.

Отмечено как Решение Alex25 09-09-2020, 23:46:55

Оффлайн ivmax

  • ADN OPEN
  • **
  • Сообщений: 70
  • Карма: 3
Re: Оптимизация алгоритма с циклами
« Ответ #3 : 09-09-2020, 11:14:22 »
можно попробовать получить "подозреваемые стены" с помощью подходящего к вашей задаче ElementQuickFilter, например BoundingBoxIntersectsFilter, отпадает необходимость проецировать все стены и проверить их всех по пересечениям curve.

Оффлайн Alex25Автор темы

  • ADN OPEN
  • Сообщений: 45
  • Карма: 0
Re: Оптимизация алгоритма с циклами
« Ответ #4 : 09-09-2020, 23:49:30 »
Да , так и сделал через BoundingBoxIntersectsFilter. Всем спасибо. С проецированием на X Y , также быстро , но есть такие моменты... Поэтому и выбрал BoundingBoxIntersectsFilter.