Оптимизация процессов Dynamo

Главная Форумы Задать вопрос Оптимизация процессов Dynamo

В этой теме 6 ответов, 2 участника, последнее обновление  ИваСерж 4 мес., 3 нед. назад.

Просмотр 7 сообщений - с 1 по 7 (из 7 всего)
  • Автор
    Сообщения
  • #7545 Score: 0

    Nickolay
    Участник

    Здравствуйте. Написал говнокод, который должен на основе загруженных в DXF формате полигонов строить пространственную ферму. За способ загрузки с DXF спасибо Хасану Мамаеву.
    Проблема в том, что скрипт нормально справляется с 16-ю полигонами. Время построения 5-10 секунд. Но когда я пытаюсь скормить уже 36 полигонов, но Dynamo уже не справляется. Через Диспетчер задачь я вижу, что ЦП, и память нагружается лишь на пару секунд,а потом просто сбрасывает процесс в холостой. И сколько бы я не ждал – бесполезно.
    Я оптимизировал скрипт, убрав просчёт нижней сетки (которая сильно нагружает ЦП). И увеличил кол-во полигонов до 5000. Считал минут 15 – но посчитал без проблем!

    https://yadi.sk/d/N7rks9Fz3ScjYs – Вот скрипт.
    Вкраце что он делает:

    • Грузит полигоны из DXF
    • Вырисовывает грани каждого полигона
    • Находит и удаляет дублирующиеся грани (там где полигоны соприкасаются, образуется 2 линии (Начало маразма))
    • Находит центр полигона, ставит точку, и смещает её перпендикулярно вниз на заданное расстояние
    • От каждого угла полигона рисует линию в точку, принадлежащую полигону
    • (Маразм крепчает) Выдавливаем верхнюю сетку вниз
    • (Маразм в апогее) Соединяем соседние точки линией, для этого необходимо найти точку соседнего полигона. Проверка состоит в том, что если линия проходит сквозь только одну (!) плоскость (которые мы выдавили), то значит это соседняя. Если больше или меньше – линия не отрисовывается. А просчитывается условия соседства каждой точки с каждой точкой (короче это ппц)

    Вот полигоны, которые обрабатываются скриптом нормально:
    https://yadi.sk/d/-Xh9qcna3ScjYu

    А вот, которые уже не обрабатываются у меня:

    https://yadi.sk/d/sJhFSiXs3ScjZ4

    Суть даже не в говнокоде, а в том, что разница между количеством полигонов – незначительная. В то время, как первый обрабатывается быстро, а второй не обрабатывается вообще.
    Если выпилить из скрипта проверку на дублирующиеся полигоны, а так же отрисовку и всю быдлопроверку нижней сетки, то скрипт спокойно обрабатывает 5000 полигонов.
    Я знаю, оптимизировать тут много чего нужно, но вопрос именно, почему такая разница в обработке?

    #7546 Score: 0

    Nickolay
    Участник

    говнокод #1 Нод Import Polygons

    говнокод #2 Нод FirstGrid (Отрисовка верхней сетки, точнее та самая проверка на дублирующиеся линии)

     

    #7547 Score: 0

    Nickolay
    Участник

    И нод LinesCreate (отрисовка нижней сетки)

    #7549 Score: 0

    Nickolay
    Участник

    Убрал проверку на дублирующиеся линии – всё заработало. Но дело в том, что мне нужно удалить дублирующиеся линии. Кто подскажет способ? Думаю, Вы поняли, но покажу схематично проблему:

    Мой способ с переворотом значений списка и заносом повторяющихся координат в “Чёрный список” – не эффективный.

    Вот работоспособная версия. Если вывести геометрию в AutoCAD через .sat То увидим “слипшееся” линии
    https://yadi.sk/d/GIvykv7z3ScrRR

    #7551 Score: 2

    ИваСерж
    Модератор
    88 pts

    Забахал фильтр по сравнению координат точек начала-конца линии.
    Впринципе, должно работать. Потестил на 2х линиях.

    https://pastebin.com/fcNNW6Ba

    #7567 Score: 0

    Nickolay
    Участник

    Идея нравится. Решение явно лучше чем у меня.
    Только скажите, что за список lin, для чего он и что в нём храниться?
    Простите за тупые вопросы, просто в питоне (и в программировании в общем) я человек отдалённый.
    Я не понимаю это выражение

    global lines
    for lin in lines:

    Список lines – это список, в который мы записываем прошедшие проверку линии? Просто у Вас я не вижу самой записи туда чего-либо.

    А следующую строку я вообще, честно говоря, не понимаю. Мы в локальный список lin переписываем информацию из глобального списка lines, или что? Ещё раз простите, но эта конструкция для меня непостижима ещё, если Вы не объясните.

     

    Как я понял, lin[1] и lin [2] – это начальная и конечная координата записанной раннее линии (которая уже прошла проверку), и с которой мы теперь сравниваем следующую.

    #7571 Score: 1

    ИваСерж
    Модератор
    88 pts

    Гугл в помощь.
    Например, по циклу for: https://younglinux.info/python/for.php

    lines – список из линий в виде точка начала-точка конца.
    [
    [начало1,конец1],
    [начало2,конец2],
    [начало3,конец3]
    ]

    цикл читается так:
    для каждой lin (линии) из списка lines (линий):
    сделать какое-то действие.
    lin[0] – координата начала = начало1,начало2,начало3 в зависимости от шага цикла
    lin[1] – координата конца = конец1,конец2,конец3 в зависимости от шага цикла

Просмотр 7 сообщений - с 1 по 7 (из 7 всего)

Для ответа в этой теме необходимо авторизоваться.