Найти в Дзене

Как математика помогла мне сэкономить 500 часов трудозатрат на BIM проекте?

Всем привет. Давно ничего не писал и вон снова словил вдохновение:) Ещё год назад на моей второй работе мне прилетел проект по моделированию промышленного объекта в Revit. Из информации у нас были только чертежи детального инжиниринга и модель Navisworks. Саму модель когда-то давно разрабатывали европейцы в Aveva. Получить исходники никакой возможности не было. Сам завод российский. Срок был 5 месяцев, а завод был просто громаднейший. Это был горно-обоготительный комплекс по добыче горячебрикетированного железа. Суммарная длина всех технологических трубопроводов составила порядка 20 км. Конец описательной части:)
Описываю порядок своих ленивых мыслей. Я был абсолютно уверен, что смогу каки-то образом экспортировать часть модели из нэвиса в ревит. Что я только ни делал...
В самом нэвисе доступен экспорт только в формат FBX. Окей, принято. Смотрим во что можно экспортировать fbx - тут выбор большой, но главный вопрос в качестве. Тут и DWG, и SAT, и STL.
Короче всё это твердотельная геом

Всем привет. Давно ничего не писал и вон снова словил вдохновение:) Ещё год назад на моей второй работе мне прилетел проект по моделированию промышленного объекта в Revit. Из информации у нас были только чертежи детального инжиниринга и модель Navisworks. Саму модель когда-то давно разрабатывали европейцы в Aveva. Получить исходники никакой возможности не было. Сам завод российский. Срок был 5 месяцев, а завод был просто громаднейший. Это был горно-обоготительный комплекс по добыче горячебрикетированного железа. Суммарная длина всех технологических трубопроводов составила порядка 20 км. Конец описательной части:)

Описываю порядок своих ленивых мыслей. Я был абсолютно уверен, что смогу каки-то образом экспортировать часть модели из нэвиса в ревит. Что я только ни делал...
В самом нэвисе доступен экспорт только в формат FBX. Окей, принято. Смотрим во что можно экспортировать fbx - тут выбор большой, но главный вопрос в качестве. Тут и DWG, и SAT, и STL.
Короче всё это твердотельная геометрия.

Решением было найти такой формат который больше всего даст данных для написания плагина по автоматической генерации части объекта.

В итоге был выбран формат DWG потому, что он предоставлял данные о точках модели которые я придумал как обработать машинно.

Из всех опытов я понял, что способен буду сгенерировать только трубопроводы. BIM-спецов я отправил создавать семейства оборудования, а конструкторов отправил поднимать модели КМ/КЖ с подрезками балок, площадками и т.д.

Выбрав все трубопроводы на точке обзора в Navisworks я перевёл всё это к DWG, подключил файл как связь и прочитал все линии в коде. Чтобы вы понимали файл экспорта в DWG выглядел как 3D модель с кучей полигонов.

Я решил все эти точки перенести в Excel, думал смогу как-нибудь там их отфильтровать. Но не так всё просто, точек оказалось больше чем максимальное количество строк в Excel. т.е. более 10 млн. Пришлось обходиться без наглядных табличек.

Спустя какое-то время я заметил, что каждая окружность трубопровода состоит ровно из 64 точек. И не имеет значения какого диаметра труба. Это было хорошим знаков. Далее я заметил, что все точки одной окружности идут по порядку в огромном списке всех точек. Т.е. весь список из 10 млн строк выглядел как список из окружностей состоящих из 64 точек. Я сразу размечтался и решил, что трубы состоят из двух окружностей и линий между ними, но не так всё просто в этой жизни. Если трубопровод оказывался длиннее какой-то длины, то она в DWG разбивалась на части. Т.е. одна труба могла состоять из сегментов меньшей длины, даже если в модели Navisworks эта труба единое целое.

Следующим шагом было определить центр трубопроводов и их диаметр. Это вообще оказалась школьная задача. Берём 64 точки и ищем максимум/минимум по X и максимум/минимум по Y. Это и есть крайние точки окружности. Если поделим их пополам, то получим центр. Если отнимем, то получим диаметр.
Теперь моя задача немного упрощается. Вместо 10+ млн точек у нас 200 тысяч кружков:) Нужно же их было как-то сгруппировать между собой. Тут я вспомнил как в универе профессор рассказывал на лекции по аналитической геометрии про уравнение прямой (нет). Я просто открыл Habr и нашёл гениальный алгоритм определения лежат ли 3 точки на одной прямой. Если сумму длин двух катетов треугольника равна длине гипотенузе, то это не треугольник, а линии лежащие на одной прямой:) Короче с этой задачей я тоже справился. По завершению я получил бессвязный и очень большой набор трубопроводов определённого диаметра. Трубопроводов получилось около 100 тысяч. А в модели их было в 10 раз меньше. Далее была не очень сложная, но неприятная задача группировки труб в более длинные трубы и т.д.

Далее мы просто, через методы API, генерируем трубопроводы нужного диаметра по нужным координатам.

Вот так выглядит сам завод.

Горно-обогатительный комплекс.
Горно-обогатительный комплекс.

Ну так что у нас в результате? Я писал код в районе недели. Не спал ночами, задурил голову своей девушке и всем вокруг, но смог на основе модели Navisworks сгенерировать 20 км технологических трубопроводов менее чем за 5 минут.
По оценке трудозатрат данный плагин сэкономил нам примерно 500 часов работы. После моей презентации руководство наградило премией всю команду. Учите математику и ставьте лайки:)

P.S. Мы теперь очень быстро умеем переводить промышленные объекты из Navisworks в Revit :)