Продолжение разработки КонтрCAD. Теперь это полноценный САПР прямо в браузере!
Приветствую сообщество! Я продолжаю развивать свой online-3D САПР.
С предыдущей статьи прошло много времени, все это время у меня просто не было вдохновения на новую статью, зато было очень много вдохновения на разработку!
Редактор технически и функционально перешел на совершенно новый уровень. Появилась параметрическая история, серьезно доработаны инструменты создания и генерации объектов, а главное - в чертеж внедрен полноценный вариационный геометрический решатель и система ограничений! Теперь чертежи умеют перестраиваться под изменяемые параметры.
За это время произошло много интересного. О начале работы с моим редактором мне написали несколько школ, целая сеть кружков "Умная механика" и множество довольных пользователей.
Кстати, немного сократилось название, теперь оно звучит и произносится лучше чем КонтрБагCAD.
Ну, начнём по порядку
Для начала я решил сделать надежное выдавливание. Стандартное выдавливание в Three.js не гарантирует манифолдный (водонепроницаемый) результат, соответственно, объединение и вычитание с ним работало не всегда.
С появлением выдавливания граней эта проблема стала ещё сильнее напрягать. Вращение вообще по сути было бесполезно, т.к. при угле менее 360 торцы нормально не закрывались. Поэтому я всё-таки решился переписать выдавливание и вращение через библиотеку manifold3d. И, собственно, не понимаю, почему я сразу так не сделал :)
Мало того, что выдавливание теперь гарантировано правильное, так ещё и дополнительные функции появились. Теперь вытягивание поддерживает поворот и расширение верха относительно низа.
А во вращении закрытие торцов происходит автоматически (и, естественно, тоже гарантированно манифодно), и мне не надо изобретать велосипед с крышками.
Мультиинструмент теперь поддерживает и скругление!
Скругления, так же как и фаска, поддерживают разные расстояния.
И даже отрицательные расстояния (добавление на острых углах).
В целом, сам алгоритм был доработан, стал намного стабильнее и дает меньше артефактов (но ещё есть, над чем поработать).
Генераторы
После прошлой статьи вы вполне уместно жаловались на генератор шестернёй. Он был существенно доработан. Теперь прецизионные шестерни генерируются согласно ГОСТ.
Появилась поддержка косозубых шестернёй. А главное, предпросмотр! Можно менять параметры и видеть результат в реальном времени. Очень наглядно!
При помощи дополнительного выдавливания можно создать шевронный тип шестерни (и для этого даже не нужно делать чертеж).
Также существенно доработан и генератор резьбы! Во-первых, он теперь работает :) Тоже появился полноценный предпросмотр. Добавлены четыре профиля с параметрами по ГОСТу и произвольный профиль. Настройка зазора (по умолчанию подобрана под 3d-печать) и остальные параметры.
А также появилась функция нарезания резьбы в отверстиях.
Серьёзно прокачался 3D-текст.
Теперь поддерживается проекция букв на 3D-объекты (с поворотом букв и без), а также добавлена фиксация перед добавлением.
Полноценная история
Я решил, наконец, включить вставку операций в историю. Теперь при изменении в прошлом, объект изменяется в будущем!
На самом деле, вставка работала с самого начала, но из-за некоторых технических проблем я откладывал включение этой функции. Дабы последующие операции правильно перестраивались, я также внедрил обновление зависимостей (ведь после вставленной операции uid у объектов может измениться).
Главная фишка, конечно, в формате хранения проекта. Хранятся не сделанные объекты, а полный список действий (как в большинстве САПР). При открытии сохранения или перемещении по истории объекты просто заново пересобираются. Для этого и было переписано ядро в версии 0.9.0 (писал в прошлой статье). Сохранения хранятся в обычном json-формате. И, если нужно, их без проблем можно редактировать в любом блокноте.
Но главные обновления произошли в чертеже!
Изначально чертеж подразумевался как простая чертилка без продвинутых возможностей. Но мне в итоге стало не хватать его возможностей. Сначала я попробовал модифицировать то, что есть. Добавил пару новых фигур и поддержку редактирования размеров. После этого пришел к выводу что текущая архитектура не перспективна. Проблема в том, что фигуры были массивами точек, а не примитивов (прямоугольник был отдельной фигурой). Внедрить полноценный решатель было невозможно.
Поэтому я решил полностью переписать чертеж и написать для него полноценный решатель геометрических ограничений.
Система была переписана на несколько базовых сущностей: точка, линия, дуга, окружность, овал и пару кривых. А все имеющиеся фигуры теперь состоят из этих примитивов.
Следом (в этом же обновлении) я занялся системой ограничений и решателем.
Сначала попробовал самый тупой вариант решателя с итеративным уменьшением ошибок. Но просто последовательно двигать фигуры в нужную сторону не самый точный и не самый эффективный вариант.
Поэтому я решил попробовать реализовать полноценный вариационный решатель по методу Ньютона-Рафсона. И он получился дико тормозной, настолько, что я почти решил вернуться к первому варианту, однако случайно заметил, что я просто затупил, и при каждой итерации перерисовывал всю геометрию. Пофиксил баг, скорость стала адекватной. Далее и продолжил допиливать этот решатель.
В итоговом варианте:
- Были добавлены аналитические градиенты практически для всех ограничений (ускорение и повышение стабильности). Сейчас примерно 80% производных считаются аналитически, а остальные численно.
- Добавлено масштабирование переменных (зашита от одновременно больших и маленьких значений. Например линии 1000мм и окружность 5мм).
- Настроены веса, теперь расстояния не уплывают (или уплывают меньше, если много лишних ограничений).
- Добавлена обработка численной нестабильности.
- Добавлено разреженное хранение и итеративный метод CGNR для больших систем (более 1000 ограничений). Не уверен, что кто-то будет делать такие объемные чертежи на моем редакторе, поэтому до ума этот метод решения пока не доводил (у него немного точность похуже).
В среднем, решатель стал в два-три раза быстрее и точнее. По математическим возможностям теперь достаточно близок к профессиональным решениям. Кстати, сама система ограничений модульная, и спроектирована с возможностью добавить в будущем 3D-ограничения.
Вот текущий список ограничений:
- Горизонтальность.
- Вертикальность.
- Паралельность.
- Перпендикулярность.
- Угол.
- Совпадение точек.
- Размер элемента.
- Расстояние между двумя точками.
- Расстояние между линией и точкой.
- Расстояние между линиями.
- Совпадение размеров.
- Точка на окружности.
- Точка на линии.
- Точка на середине линии.
- Касательная к окружности.
- Касание двух окружностей.
Основные ограничения ставятся автоматически (горизонтальность, вертикальность, перпендикулярность и совпадения). Это сделано специально, чтобы, если вы ребёнок или не шарите, "зачем эти ваши ограничения", они работали, а чертеж не разваливался и мог перестраиваться.
Размерные ограничения (аналогично Fusion 360) ставятся, только если вы ввели значение во всплывающее поле.
Теперь можно просто изменить нужный размер, и чертеж сам перестроится. Вот, к примеру, тот же чертеж, что и выше, но с парой измененных размеров.
Инструмент "размеры" (как ни странно) теперь позволяет ставить размеры:
- Для примитивов (достаточно просто кликнуть по ним).
- Между двумя точками.
- Между точкой и линией.
- Между двумя линиями.
Также в этом инструменте можно менять вынос размерной линии или поворот для диаметров и радиусов.
Двойным кликом любой размер можно отредактировать.
Угловой размер между двумя линиями можно поставить, выделив и нажав кнопку в меню (его тоже можно редактировать двойным кликом). Все остальные ограничения (если нужны) ставятся аналогично (но в ui ещё не все ограничения добавлены).
Также добавлен анализ избыточных и противоречивых ограничений (через анализ сходимости и анализ ранга). Вот попытка добавить параллельность к двум перпендикулярным линиям:
Помимо этого (на самом деле ещё до переработки чертежа) был допилен алгоритм обнаружения регионов (эта та система, которая позволяет выдавить отдельные фигуры, образованные пересечением нескольких фигур).
Первый вариант алгоритма использовал clipper.js для определения пересечений замкнутых цепочек контуров. В текущей реализации я отказался от этого. Теперь алгоритм очень простой и надёжный.
- Все фигуры разбиваются на линии.
- Находятся все пересечения и касания.
- Строится граф и находятся все циклы.
Вообще изначально я хотел реализовать такой алгоритм, но у меня он работал медленно и нестабильно. Поэтому решил переключится на вариант через Clipper. Новый алгоритм проще, надежнее и работает гораздо быстрее. Он определяет цепочки, составленные из любых фигур, включая пересечения и смежные фигуры. И мне за него наконец не стыдно)
Из новых инструментов чертежа:
Появилось отражение
Линейный (хотя скорее квадратный) и круговой массивы
Несколько новых фигур и сглаженная кривая
Ассоциативность выдавливания и вращения с чертежом
Помимо продвинутого чертежа, не хватало зависимости выдавленных тел от чертежа. Ранее, из-за проблем с определением регионов, в выдавливании я использовал просто переданные контуры. Теперь же я сделал полноценную зависимость! Выдавливаемая фигура определяется напрямую из чертежа по контурам выделения + по центру масс. А это значит, что можно откатиться по истории до выдавливания, изменить чертеж, и результат выдавливания тоже поменяется (с операцией "вращение" аналогично).
Важно! Возможности такой ассоциативности не безграничны, если чертеж сильно изменится, то может и не сработать.
Обновления UI
В ui много мелких и не очень изменений. Название и описание проекта теперь тоже можно отредактировать. Появились новые (собственные) формы подтверждения.
Названия объектов теперь можно редактировать.
Меши чертежа и рабочей плоскости переработаны. В правом верхнем углу теперь отображается название, которое тоже можно поменять.
Вкладку по умолчанию можно закрепить. Если не хочется видеть библиотеку, можно просто закрепить список объектов
Появилось выделение рамкой в 3D-режиме и чертеже. Кстати, в чертеже рамкой выделяются только сами объекты (без ограничений). А также множество других мелких изменений, которые я опустил.
Напомню, на данный момент это все работает online, без регистрации и совершенно бесплатно: https://www.контрбагтех.рф/контркад
Новости об обновлениях в основном выходят в Telegram и ВК. Поддержать разработку можно на boosty и ВК.
Буду благодарен за рекламу, обратную связь, сообщения об ошибках и предложения по развитию :)
Еще больше интересных статей
Постройка маяка
Подпишитесь на автора
Подпишитесь на автора, если вам нравятся его публикации. Тогда вы будете получать уведомления о его новых статьях.
Отписаться от уведомлений вы всегда сможете в профиле автора.
Собственно вот "https://3dto...
Crealiry Ender-5 MAX и новая голова под хотенд К2
Подпишитесь на автора
Подпишитесь на автора, если вам нравятся его публикации. Тогда вы будете получать уведомления о его новых статьях.
Отписаться от уведомлений вы всегда сможете в профиле автора.
Самодельный станок для намотки пластика
Подпишитесь на автора
Подпишитесь на автора, если вам нравятся его публикации. Тогда вы будете получать уведомления о его новых статьях.
Отписаться от уведомлений вы всегда сможете в профиле автора.
Думаю каждый из нас сталкивался с такой проблемой ка...


























Комментарии и вопросы
Тупо.
Согласен. Если тестер не завёл...
Ты главное не бросай. Уже крут...
Из-за чего вот такие полосы? О...
Суть проблемы в следующем. Дис...
Ситуация: нужно для отдельно в...
Короче получил я недавно свой...