Знакомьтесь, NoteCAD

в 4:01, , рубрики: 3d-моделирование, 3D-печать, C#, CAD/CAM, diy или сделай сам, unity3d, WebGL, управление разработкой

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

Знакомьтесь, NoteCAD - 1

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

Знакомьтесь, NoteCAD - 2

Итак, к текущему моменту разработаны следующие компоненты:

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

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

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

Автор: FadeToBlack

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js