Оптимизация процессов Dynamo
Главная › Форумы › Задать вопрос › Оптимизация процессов Dynamo
- В этой теме 6 ответов, 2 участника, последнее обновление 6 лет, 9 месяцев назад сделано ИваСерж.
-
АвторСообщения
-
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 полигонов.
Я знаю, оптимизировать тут много чего нужно, но вопрос именно, почему такая разница в обработке?NickolayУчастникговнокод #1 Нод Import Polygons
говнокод #2 Нод FirstGrid (Отрисовка верхней сетки, точнее та самая проверка на дублирующиеся линии)
NickolayУчастникИ нод LinesCreate (отрисовка нижней сетки)
NickolayУчастникУбрал проверку на дублирующиеся линии – всё заработало. Но дело в том, что мне нужно удалить дублирующиеся линии. Кто подскажет способ? Думаю, Вы поняли, но покажу схематично проблему:
Мой способ с переворотом значений списка и заносом повторяющихся координат в “Чёрный список” – не эффективный.Вот работоспособная версия. Если вывести геометрию в AutoCAD через .sat То увидим “слипшееся” линии
https://yadi.sk/d/GIvykv7z3ScrRRЗабахал фильтр по сравнению координат точек начала-конца линии.
Впринципе, должно работать. Потестил на 2х линиях.NickolayУчастникИдея нравится. Решение явно лучше чем у меня.
Только скажите, что за список lin, для чего он и что в нём храниться?
Простите за тупые вопросы, просто в питоне (и в программировании в общем) я человек отдалённый.
Я не понимаю это выражениеglobal lines
for lin in lines:Список lines – это список, в который мы записываем прошедшие проверку линии? Просто у Вас я не вижу самой записи туда чего-либо.
А следующую строку я вообще, честно говоря, не понимаю. Мы в локальный список lin переписываем информацию из глобального списка lines, или что? Ещё раз простите, но эта конструкция для меня непостижима ещё, если Вы не объясните.
Как я понял, lin[1] и lin [2] – это начальная и конечная координата записанной раннее линии (которая уже прошла проверку), и с которой мы теперь сравниваем следующую.
Гугл в помощь.
Например, по циклу for: https://younglinux.info/python/for.phplines – список из линий в виде точка начала-точка конца.
[
[начало1,конец1],
[начало2,конец2],
[начало3,конец3]
]цикл читается так:
для каждой lin (линии) из списка lines (линий):
сделать какое-то действие.
lin[0] – координата начала = начало1,начало2,начало3 в зависимости от шага цикла
lin[1] – координата конца = конец1,конец2,конец3 в зависимости от шага цикла -
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.