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