Создавать вещи своими руками приятно. Современный уровень развития технологий предоставляет небывалые возможности для домашнего производства — больше не нужно вручную выпиливать, вытачивать и строгать. В вашем распоряжении целый парк станков с числовым программным управлением: 3D принтеры, лазерные граверы, плазморезы, токарные и фрезерные станки. Созданные вами детали будут настолько хороши, что их не отличить от фабричных! Осталось только… Спроектировать! И здесь, вынужден признать, вам нужно быть профессионалом. Современные САПР — это квинтэссенция достижений науки и техники и с помощью них можно создавать сложнейшие детали и механизмы. Обычно подобные программы стоят дорого, а на их освоение нужно потратить много времени, прежде, чем вы сможете ими легко и непринужденно пользоваться. С другой стороны, существует множество различных онлайн-инструментов для проектирования, в том числе и довольно несложных для освоения. С их помощью легко создавать геометрически простые предметы, а если хочется сделать что-то посложнее, вам нужно быть либо программистом, либо иметь достаточно терпения и фантазии, чтобы из ограниченного набора примитивов составить сложную форму вашего изделия.




Мне захотелось решить эту проблему — создать такой инструмент, который будет, с одной стороны, прост в освоении и использовании, однако, позволит создавать сложные детали и механизмы при помощи параметрического подхода к моделированию. Если вы хотите узнать о процессе создания онлайн-инструмента для трехмерного проектирования, который называется "NoteCAD", добро пожаловать ПодКАТ! [любая рифма случайна]

Disclaimer


Данная статья содержит утверждения, являющиеся мнением автора, которое может не совпадать больше ни с чьим мнением. Некоторые замечания могут показаться читателю слишком радикальными и противоречивыми, другие же — чистой философией, не имеющей практической значимости, но все же не стоит принимать все это слишком близко к сердцу ;)


Название


Считаю, что утверждение "как корабль назовешь, так он и поплывет" — верно. Онлайн инструмент для широкой аудитории пользователей обязан быть минималистичным. В качестве хорошего примера подобной минималистичности можно привести "Notepad" — элементарную программу для просмотра и редактирования текста. Эта программа предоставляет только основную функциональность для выполнения задач, ничего лишнего. Поэтому название "NoteCAD" — звучит идеально для нового проекта.


Выбор инструментария для разработки: Язык


Однажды я стал программировать на C++. Этот язык казался мне красивым, элегантным и мощным. Казалось, с помощью него можно победить любую проблему, свернуть горы. В итоге, я использую его уже 15 лет. Но былой азарт и экзальтация от его использования прошли. Я больше не защищаю его в спорах и больше не его сторонник. Я теперь лишь наблюдатель — спокойно жду, когда он будет свергнут с престола, ибо уверен, его время пройдет. C++ излишне сложен, непредсказуем. Вы никогда не можете быть уверены в том, что ваша программа будет работать так, как вы задумали. Вы никогда точно не знаете, как ведут себя внутри чужие типы данных, что делают конструкторы копирования и операторы присваивания. Вы все время перестраховываетесь, проверяете что-то на nullptr, все время на страже. Если вы хотите подключить стороннюю библиотеку — для решения этой проблемы не существует двух одинаковых способов. Изобретатели всегда придумают что-то новое. Огромное число подсистем сборки, IDE, компиляторов, которые иногда требуют явно указывать, что символ является типом с помощью директивы typename… Ну а std? Да я просто в ярости, когда мне приходится сталкиваться с использованием этой чудовищной, уродливой, запутанной и нелогичной библиотеки. Нет константного оператора[] для std::map? Действительно? Ради того, чтобы можно было "красиво" добавлять новые элементы в виде stdMap[key] = value?


О чем это я? Да о том, что есть прекрасные, современные языки программирования! Не буду приводить полный список, скажу только, что при всем неоднозначном отношении общественности к продуктам Microsoft, язык C# я признаю полностью годным. Это современный, простой и логичный язык, который достоин называться Си(до)-диез, или Си-четыре-плюса(если разделить символ "#" на четыре части). К текущему моменту у меня чуть больше года практики программирования на нем, и все типичные задачи, с которыми я сталкивался, действительно решались как по нотам. Я буду рад, если в комментариях вы напишете, какие еще языки вы считаете преемниками C++. Если в Java появилась перегрузка операторов, то можете и его указать, если нет — то лучше не нужно. Я разработчик графических и математических приложений, возможность перегрузить математические операторы для векторов — для меня основа мироздания. На самом деле, я считаю, что Java — прекрасный язык, и я чувствовал ни с чем не сравнимую легкость и простоту, когда разрабатывал несколько приложений на Java2 Micro Edition (если вы понимаете, о чем я).


Выбор инструментария для разработки: Движок


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


На рынке трехмерных движков существует великое множество как коммерческих, так и OpenSource проектов. Но, честно признаться, с точки зрения простоты и удобства разработки, альтернатив практически нет — есть только Unity. Несмотря на то, что этот движок все еще содержит множество фундаментальных проблем и странных ограничений, он все-таки завоевал сердца миллионов разработчиков. Простота определила их выбор, поскольку начинать разработку на этом движке — проще простого. Компонентная система сущностей лучше отражает структуру реальности, нежели классическая иерархия наследования, является удобной и гибкой как для разработчиков, так и для создателей контента. Возможность одной кнопкой собрать проект для любой популярной платформы, включая мобильные ОС и даже браузеры, делает этот движок самым привлекательным из всех. Но решающим аргументов пользу выбора Unity для меня является возможность избежать программирования на JavaScript (но это не полностью). Я не против JavaScript, но… На самом деле я не хочу пока что знать этот язык. Я все время избегал веб-технологий, создания сайтов и JavaScript. Что бы вам ни говорили, возможности мозга ограничены. В определенный момент новые знания, которые вы получаете, могут поместиться в вашей голове только ценой забывания чего-то старого. В любом случае, хорошо, когда задачу можно решить с помощью инструментов, которые вы уже знаете. Разработка идет быстрее и эффективнее, даже если качество результата чуть ниже (наверное, чистый JavaScript работает быстрее, чем компиляция C# в asm.js, но это не точно).


В любом случае, инструмент для разработки простого приложения должен быть простым. Unity удовлетворяет всем этим условиям. Конечно, я немного сомневался, не стоит ли мне все писать на чистом JavaScript, или может быть C++ & Emscripten, но накладные расходы на изучение новых инструментов плюс необходимость разработки движка не позволят выжить этому проекту. Я собираюсь сделать инструмент, который будут реально использовать, и правильный менеджмент разработки поможет это сделать.


Менеджмент разработки


Любая разработка ведется в условиях либо дефицита ресурсов, либо минимизации затрат. Когда в одиночку делаешь проект, кажется, что применять управление разработкой абсурдно. Берешь — и делаешь! Но оказывается, в таких условиях проще всего потеряться и уйти в чащу сложных разработок и алгоритмов, которые проекту в данный момент не нужны. У проекта может не быть "иконочек" на работоспособных кнопках, но красивый и законченных интерфейс странно будет смотреться без реализованной функциональности приложения. Нужно признать, что сколько бы свободного времени у вас ни было, каким бы эффективным программистом вы ни являлись, все это ограниченно. Я имею ввиду сравнение с сотнями человеко-лет, вложенными в крупные проекты САПР, вроде SolidWorks или CATIA.


Важным условием развития проекта является самоконтроль и четкий план, которому нужно обязательно следовать. Важно вовремя "бить себя по рукам", когда обнаруживается, что вы вдруг начали делать не то, что нужно проекту, а то, что хочется в данный момент. Тем не менее, важен баланс — свой проект, на то и свой, чтобы получать от него удовольствие, поэтому иногда можно позволять себе некоторые вольности. Отступить от плана можно только если удалось сделать что-то приоритетное быстрее, чем рассчитывал. К примеру, в данный момент мне хочется программировать проект вместо написания этой статьи, но приходится убеждать себя, что статья — точно такой же важный момент для проекта, как и его функциональность, ведь обратная связь обеспечивает необходимые данные для движения в нужном направлении.


Есть еще один немаловажный момент: cледует избегать разработки функций программы, которые по развитию сильно опережают средний уровень возможностей в проекте. Например, если вы делаете ремонт в новой квартире, перед тем, как в нее заселиться, вы сначала наклеиваете обои и кладете линолеум прежде, чем установить мебель. Есть сделать все наоборот, вам придется двигать мебель множество раз до того, как она, наконец, займет свое место. Это требует массы дополнительных усилий, что глупо и нерационально. Примерно таким же образом происходит и с "несвоевременным" функционалом, который не только отнимает время на разработку, но и все больше "сковывает" вас необходимостью его поддержки. Ввиду того, что на ранних этапах разработки архитектура приложения еще не утряслась, все время происходят архитектурные перестроения, говоря на языке ремонта, некоторые части обоев переклеиваются, а кое-где вместо линолеума кладется паркет, а там уже и плинтус отвалился))) А если вы не сильны в ремонте, переведу на язык эволюции видов: рыбам не будут полезны легкие для дыхания на суше, покуда не будут сформированы конечности для перемещения по ней. Сухопутные рептилии не могут появиться из рыб минуя стадию амфибий. Разработка — та же эволюция, поэтому органы программы должны развиваться синхронно и согласованно. Невозможно закончить часть целого, пока целое не будет закончено.


В таких условиях целесообразно применять подход развития проекта "по спирали". Сначала разрабатывается каждая из функций в минимально возможной реализации, со сбалансированной степенью проработанности деталей, а затем, последующими проходами разработки каждая из возможностей постепенно улучшается. При данном подходе можно применить принцип минимально жизнеспособного продукта, если при выборе возможностей и формы их реализации думать о том, чтобы продукт был полезен для решения реальных задач.


Целевая аудитория


В качестве пользователей NoteCAD я вижу людей, которые создают различные вещи своими руками. Это может быть 3d печать, разработка электронных устройств или даже строительство или ремонт.


Ключевые особенности


  1. Простота. Минимальный набор инструментов для выполнения максимального количества операций. Простые вещи всегда на виду, а сложные не заметны и не мешают, пока их применение не потребуется.
  2. Доступность. Интерфейс программы содержит подсказки, которые позволят пользователю разобраться с программой с нуля. Достижению этой цели будут также способствовать встроенные обучающие материалы.
  3. Параметрическое моделирование. Программа будет поддерживать основной набор ограничений, возможность вводить свои параметры и отношения между ними в виде формул.
  4. Поддержка STL. Файлы форматов для 3d печати можно будет загружать и использовать в процессе создания своих деталей. Их можно будет использовать в сборках и немного модифицировать.
  5. Работа на всех устройствах. В первую очередь, NoteCAD будет доступен в браузере, но будут версии и для всех популярных ОС (Windows, Linux, MacOS, iOS, Android). Это позволит программе работать с максимальной производительностью и не будет ограничивать пользователя в сложности создаваемых деталей.

Доказательство оригинальности разработки


Являясь контрибутором SolveSpace, я вынужден доказывать, что код нового проекта создан мной без использования чужого кода. Я принял решение записать видео с процессом создания спорных компонентов, а именно решателя геометрических ограничений. Мне неизвестно, может ли такой процесс служить аналогом clean room design, но уверен, что большинство вопросов об авторстве кода он снимает. Не следует рассматривать эти видео в качестве обучающих, цель их создания — доказательство, поэтому они содержат скучный процесс разработки, каким он выглядит со стороны. Конечно же, все самое интересное происходит внутри головы и, к сожалению, осталось за кадром.


Первое использование программы


Когда я только еще думал над тем, чтобы начать разработку NoteCAD, мне хотелось, чтобы первое использование программы по назначению состоялось как можно раньше. Данная статья является демонстрацией первого использования программы, которая обладает очень ограниченным функционалом, но уже пригодна для разработки самых простых деталей. В качестве первого применения программы, я начертил брелок для ключей — животное со знаменитой картины Эшера "Метаморфозы". Этот брелок может служить хорошим подарком для компании друзей. В идеале, брелки должны состыковываться друг с другом символизируя дружеский союз, причем количество элементов-друзей может быть произвольным.




Итак, к текущему моменту разработаны следующие компоненты:
  1. Решатель геометрических ограничений
  2. Подсистема для инструментов
  3. Сущность чертежа — отрезок прямой
  4. Ограничения: Совпадение точек, расстояние между точками, угол между отрезками, равенство отрезков
  5. Поиск замкнутых контуров
  6. Триангуляция
  7. Генерация тела выдавливания на 5 мм из замкнутых непересекающихся конутров
  8. Загрузка/Сохранение файлов из браузера
  9. Экспорт 3d модели в формат STL
  10. Хостинг проекта http://notecad.xyz

Дальнейшие планы


В скором времени, планируется выход в полноценное 3d пространство, возможность создавать тела выдавливания и вращения. Самым сложным шагом в рамках этого этапа будет создание геометрического ядра, поддерживающего булевы операции. Спасибо за внимание!

Комментарии (15)


  1. vin2809
    21.11.2017 08:55

    Невозможно закончить часть целого, пока целое не будет закончено.

    Мне кажется, что я Вашу мысль понял, но чисто фразеологически это не верно: целое на то и целое, что часть всегда входит в него. Я думаю, что Вы под целым имели ввиду контейнер, в который будете добавлять части (отдельные функции или даже целые алгоритмы обработки), например, GUI (оболочку, так сказать, рамку-Border вокруг отдельных частей). Тогда да, я полностью Вас поддерживаю, т.к. сам делаю также:
    — сразу создается элементарный GUI (Dialog или Page) с меню, тулбаром, строкой статуса и областью просмотра данных;
    — добавляю самые необходимые команды (Open, Close,...), а остальные в виде заглушек;
    — все, а дальше гуляй душа: пишу все вкусности, которые задуманы в проект.
    Двумя руками «За» — отличный проект. Что получится будем смотреть далее…


    1. FadeToBlack Автор
      21.11.2017 08:58

      Просто другая формулировка всем известной дилеммы «о курице и яйце». Разработка — запутанное дело, задача управления разработкой — распутывание этого клубка зависимотей (чистая философия, ничего личного).


  1. starfair
    21.11.2017 14:08

    Очень интересное начинание!
    А если Ваш движок сможет делать нормальные булевы операции хотя бы в 2D, будет ли возможность лицензировать его у Вас для расширения своей наработки в области дизайна декоративных изделий из макроса в полноценное отдельное приложение? Я давно присматриваюсь к решениям геометрических ядер (и тот же SolveSpace и C3D), но либо очень сыро, либо очень дорого.


  1. jaiprakash
    21.11.2017 23:51

    А что не так с опенкаскадом, что всем приходится делать движки заново?


    1. FadeToBlack Автор
      22.11.2017 06:42

      Я не уверен, что opencascade с его огромной кодебазой взлетит в браузере… нужно будет ставить серверы, слать туда-сюда данные и т. д. Сейчас программа работает полностью на клиенте, поэтому булевы операции будут на мешах.


  1. MrShoor
    22.11.2017 03:23

    «Поиграл» в unity версию. Судя по движению точек сейчас все констреинты живут на солверах через итерации. Вы бежите по списку констреинтов, и пытаетесь «починить» констреинт как-то передвинув точки. И так до тех пор, пока ошибка не будет меньше некоторой погрешности.
    У вас оно работает по нескольким причинам:
    1. Констреинты строятся по уже созданной «фигуре» (а значит изначально находятся в согласованном состоянии)
    2. При редактировании фигура меняется не значительно, что позволяет системе сходится
    3. В 2д значительно меньше степеней свободы.
    Но такой подход в MCAD-ах не используют. Ибо в:
    1. Нужно совмещать тела которые изначально не совмещены
    2. Применение констреинта может значительно развернуть и переместить тело и вообще сильно затронуть тела в сборке.
    3. Степеней свободы в 3д намного больше, и «мертвые точки» в которые итерационный подход будет скатываться, и не находить решение встречаются гораздо чаще.

    Поэтому правильный подход будет построить граф констреинтов. При редактировании объекта обойти граф, и составить систему нелинейных уравнений. Решить систему, и из множества решений выбрать наиболее близкое к текущему состоянию.
    И эта задача будет не слабее параметрического CSG.


    1. FadeToBlack Автор
      22.11.2017 07:07

      Да, все верно, именно так оно и работает. И вы правы насчет того, что в 3д задача усугубляется, но для того, чтобы повысить сходимость в 3д, существуют некоторые тактики для улучшения сходимости. К тому же большинство сборок состоят из огромного количества «закреплений» одной детали на другой, в таком случае, действительно целесообразно производить «декомпозицию», когда мы считаем, что самая первая деталь закреплена в пространстве, а остальные «прирешиваются» к ней не все сразу, а по одной. Если применить подход, как onshape, где созданы специальные констрейны для сборок (снимающе сразу большое количество степеней свободы), можно легко применить «декомпозицию», которая и будет в виде дерева, как вы и говорите. На самом деле, не вижу в этом никаких проблем, UI может решать многие проблемы, в частности, констрейны, снимающие сразу все степени свободы, избавят от необходимости кропотливого анализа степеней свободы и позволят построить древовидный «скелет» жестко закрепленных частей.


  1. ramil174
    22.11.2017 07:16

    Очень хотелось бы увидеть полноценный продукт. Сам работаю в 3д максе (Ну нравится мне там). Для лазерной резки металла 3д модель экспортирую в автокад, оттуда в компас. Иначе никак…


    1. FadeToBlack Автор
      23.11.2017 09:28

      А расскажите подробнее, в каком формате экспортируете модель в автокад и почему нельзя сразу в компас?


      1. ramil174
        23.11.2017 14:41

        Можно экспортировать в .sat. Но мне, почему-то, неудобно потом в компасе работать.
        А так, создаю модель в 3д максе (например, мангалы, ворота и т.д.). Далее экспортирую в .dwg или .dxf. Этот файл открываю в Автокаде. Выбираю то окно, которое мне нужно и сохраняюсь. Сохраненный файл открываю 15 компасом и там уже прописываю названия деталей, кол-во и т.д.
        Можно, конечно, в автокаде все это прописать, но не разобрался еще.


  1. Guderian
    23.11.2017 21:23

    Я может что-то прошляпил ссылку на репозиторий или проект не планируется открытым? Поскольку тема самому интересна, я бы не прочь был внести посильный вклад.


    1. FadeToBlack Автор
      24.11.2017 10:25

      Я пока не знаю, будет ли этот проект открытым. Пока стек технологий, который будет использоваться, все еще не ясен. Unity — это закрытый движок, но его использование позволяет мне делать этот проект в качестве хобби, когда есть время. Если делать OpenSource, то здесь я сомневаюсь в том, что я смогу вести этот проект из-за того, что свободного времени у меня не очень много.


  1. prokoudine
    24.11.2017 16:28

    А солвспейсу теперь капец?


    1. FadeToBlack Автор
      25.11.2017 07:34

      Нет, SolveSpace будет продолжаться. Насколько вы могли убедиться, в разработке SolveSpace есть некоторые правила. Этот проект должен быть проще SolveSpace, в использовании, и не скован этими правилами. Если не секрет, работает ли на Linux?


      1. prokoudine
        25.11.2017 12:40

        Если не секрет, работает ли на Linux?

        Работает ли SolveSpace на Linux? Да, актуальная ветка master собирается и работает на Debian Testing, например. Я, правда, ожидал увидеть влитой ветку single-window :) Или вопрос про что-то другое?