Найти в Дзене
Хроники Георга

Занимательное Dynamo. Получение геометрии трассы для экспорта в форме текстового файла. Особенности обработки дробных чисел.

Оглавление

Небольшая статья-заметка на тему "как имея трассу, получить упорядоченный набор точек по ней с заданным шагом включая точки перелома геометрии трассы". Задача связана с полевыми изысканиями - вынос в натуру проектных контуров трассы (в формате текстового файла с координатами).

Примерно такого вида
Примерно такого вида
Наша картинка для статей :d Оригинал: https://avatars.mds.yandex.net/get-zen_doc/198359/pub_5b031feb83090562e4b1650f_5b0e832057906a66d8e239bb/scale_1200
Наша картинка для статей :d Оригинал: https://avatars.mds.yandex.net/get-zen_doc/198359/pub_5b031feb83090562e4b1650f_5b0e832057906a66d8e239bb/scale_1200

1. Построение трасс

Казалось бы, тривиальная задача - но при условии, что исходные данные корректные (иногда это множество примитивов AutoCAD, не соединенные в единое целое). Здесь поможет предварительная обработка слоев файла (ответственных за оси) для их соединения в полилинии (превращение отрезкой и дуговых сегментов в полилинию) и доведение недововдов при помощи инструментария _MAPCLEAN.

2. Общая методология получения данных по трассе

Обозначим общую логику работы - получаем геометрию всех трасс и по каждой из них получаем 2 списка точек - один с регулярным шагом, другой - только с точками перелома геометрии трассы, затем их соединяем и сортируем (алгоритм сортировки вставками). Финал - экспорт точек в текстовой файл.

3. Разбираем скрипт

https://drive.google.com/file/d/1SdzLbuCJ1SutbGKSGNhpzKKHst5UPVNs/view?usp=sharing - ссылка на скрипт (окончательная версия), ниже описана его предварительная версия (как наверняка делали бы вы).

Общий вид скрипта
Общий вид скрипта

Здесь у нас 4 функциональных блока:

  • блок 1 (синий) - выборка трасс для работы;
  • блок 2 (зеленый) - получение характерных точек трасс с использованием нода из пакета Civil3DToolkit AlignmentExtensions.GetGeometry (опирающегося по-видимому на этот метод Civil 3D API);
  • блок 3 (оранжевый) - получение точек с регулярным шагом по трассе, здесь у нас также используется метод из пакета Civil3DToolkit -- AlignmentExtensions.GetBearingByStationOffset - использующий этот метод из Civil 3D API);
  • блок 4 - фиолетовый - здесь у нас точки объединяются в 1 список (в рамках трассы), сортируемый по пикетажу (который мы "Отбрасываем" после завершения сортировки. В этом же блоке происходит операция записи координат точек во внешний текстовой файл с разными параметрами.

На что стоит обратить внимание?

Всякий скрипт может работать не совсем так, как мыслит автор - поэтому всякий результат необходимо проверять на корректность - в нашем случае, мы создаем последовательность точек по трассе (по сути, ломаную полилинию), и эта полилиния должна повторять все изломы трассы (с поправкой на величину шага точек) без каки-либо явных коллизий.

Введем дополнительный проверочный нод - построение полилинии по точкам (Polyline.ByPoints):

Дополнительный временный блок кода
Дополнительный временный блок кода
Результат построения
Результат построения

Обратим внимание на то, что узлы полилинии включают в себя вершины трассы (PI), так как я при обработке точек геометрии трассы на кривых (Arc) включал их в состав геометрии.

Избежать подобного исхода можно двумя способами:

-- при "чтении" геометрии трассы, если последующий элемент (предыдущий) есть Arc, то не включать последнюю - EndPoint (начальную - StartPoint) точку трассы в список геометрии.

-- дополнительно подавать на вход скрипта по формированию геометрии трассы точки перелома геометрии (PI) для исключения точек.

Второй вариант выглядит более корректным с позиции работы с API программы.

Подаем дополнительный нод
Подаем дополнительный нод
Обыгрываем доп. условие отдельной функцией
Обыгрываем доп. условие отдельной функцией

Здесь я использую сравнение двух точек как сравнение их координат с округлением до см. Округление связано во-первых с самой постановкой вопроса - числа double (с плавающей точкой) в принципе некорректно сравнивать напрямую; во-вторых числа получаются разными способами - через разные методы API, которые могут подавать уже округленное число. Потому несмотря на визуальное единство координат чисел (до третьего знака) при прямой обработке double1 != double2 у нас всегда будет получаться такой вариант событий.

После перезапуска видно, что теперь скрипт отработал корректно.
После перезапуска видно, что теперь скрипт отработал корректно.
Финальный вид скрипта
Финальный вид скрипта

#autodesk #civil 3d #dynamo #трассы #скрипты #геометрия

Не пропускайте публикации, подписывайтесь на Telegram-канал с тизерами статей.