Найти в Дзене
Андрей Викторович

OpenSCAD на уроках информатики

Оглавление

Здравствуйте!

Краткий обзор OpenSCAD

OpenSCAD - это программное обеспечение САПР (Система Автоматического Проектирования) для создания твердых трехмерных объектов (OpenSCAD is software for creating solid 3D CAD objects) - такое определение системы даёт официальный сайт https://www.openscad.org.

Так же как Blender и Freecad, OpenSCAD среда трехмерного моделирования, но отличается она возможностью использования параметрического подхода при проектировании 3D-моделей с помощью встроенного языка программирования. На выходе получаются модели с параметрами, изменение которых приводит к изменению конфигурации модели, что упрощает повторное использование кода.

OpenSCAD также позволяет создавать модули для многократного использования.

Эти особенности делают OpenSCAD полезным инструментом для обучения 3D-моделированию, так как позволяют оптимизировать процесс моделирования, минимизировать ошибки и облегчают повторное использование кода

OpenSCAD открытая и бесплатная среда, которая поддерживает различные платформы включая Windows, macOS, Linux и веб.

В целом, OpenSCAD является удобным и эффективным инструментом для создания и изменения параметрических 3D-моделей, и его использование может быть рекомендовано для пользователей, ищущих альтернативу FreeCAD или другим системам моделирования.

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

Интерфейс OpenSCAD, можно считать очень аскетичным, особенно если сравнивать его с программами по трехмерному моделированию. Так же стоит отметить, его легковесность и скорость, опять же по отношению к другим похожим системам.

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

На сайте OpenSCAD, сказано: В отличие от большинства бесплатных программ для создания 3D-моделей (таких как Blender), оно фокусируется не на художественных аспектах 3D-моделирования, а на аспектах САПР. Таким образом, это может быть приложение, которое поможет вам, когда вы планируете создавать 3D-модели деталей машин, но совершенно точно не поможет, когда вас больше интересует создание компьютерных анимационных фильмов.

Иными словами, эта система подходит тем, чья задача заключается в создании технического устройства и конечно, тому кому «удобно» использовать код, при описании модели. Эти два условия, придется соблюдать, для успешного освоения этого инструмента.

Что бы познакомиться и начать разбираться с OpenSCAD, первое что мы сделаем это откроем пример. Выбираем в меню: Файл→Примеры→Примитивы→logo.scad.

-2

В редакторе появился код, в окне просмотрщика появилась модель, построенная по этому коду, а консоль вывела информацию о текущем проекте. Теперь можно разобрать некоторые возможности просмотрщика. Удержание левой кнопки — позволяет вращать модель, колесо приближает и отдаляет камеру а правая кнопка мыши передвигает фокус  камеры. Если камера «потерялась» используйте кнопку сброс камеры:

-3

Следующие, две важные функции просмотрщика это предпросмотр и рендеринг (на клавиатуре F5 и F6 соответственно).

Кнопки "Предпросмотр" и "Рендеринг"
Кнопки "Предпросмотр" и "Рендеринг"
-5

При открытии проекта logo.scad был автоматически запущен предпросмотр, поэтому следующим действием мы запустим рендеринг, и посмотрим что же произойдёт.

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

Как можно заметить, язык сценариев OpenSCAD визуально похож на такие языки как C. Начало и конец блока кода выделяется открытой и закрытой фигурной скобкой, после имени функции или модуля в скобках определяются параметры, каждая инструкция отделяется знаком ";".

Введение в систему трехмерного моделирования OpenSCAD

Переменная, модуль и функция

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

Синтаксис работы с переменными предельно прост: [имя переменной] = [значение]. Тип данных переменной определяется динамически. Типы данных, которыми оперирует OpenSCAD это число, строка, логическое значение, диапазон, вектор и неопределённое значение (undef). Переменная может передаваться как аргумент функции или модуля и возвращаться как результат функции.

// однострочный комментарий
a = 10;
b = 11.5;
c = a + b;
text = "hello";
echo(a,b,c,text,a>b); // команда echo() служит для вывода информации в консоль.

После компиляции консоль выдаст: ECHO: 10, 11.5, 21.5, "hello", false. Разве может быть что-то проще? Но давайте проведём простой эксперимент.

a = 10;
echo(a);
a = 20;
echo(a);

Вывод консоли может немного удивить.

WARNING: a was assigned on line 1 but was overwritten on line 3 Compiling design (CSG Tree generation)... ECHO: 20 ECHO: 20

Следует обратить внимание на предупреждение в консоли OpenSCAD, которое нам однозначно сообщает что «a» была назначена в строке 1, но была перезаписана в строке 3, и как следует из вывода, по всей видимости программы значение «a», будет значение присвоенное последний раз (так происходит сборка и компиляция модели). Как же объяснить такое поведение переменной? Скорее всего, это связано с тем, что скомпилированная и отрисованная модель, не находится в ожидании какого либо события, по которому, будут изменяться параметры модели, и в рамках трехмерного моделирования такое поведение вполне оправданно. Вообщем, переменная в OpenSCAD, является чем-то средним между переменной и параметром. Вот тут и начинаются «грабли», ученик с которым мы будем работать, уже должен обладать некоторыми знаниями, и ему нужно четко разделять понятие переменной в «полноценных» языках программирования, и переменной-параметром в OpenSCAD! В противном случае, ученик может запутаться, что может привести к непредсказуемым последствиям.

Так же, из этого, следует, что инструкция: a = a + 1, работать не будет, хотя OpenSCAD, оперирует такими алгоритмическими структурами как — цикл.

Модули в OpenSCAD, состоят из определения модуля и вызова модуля. Модуль выполняется при вызове, и в отличие от функции не возвращает значение. Модуль служит для группировки повторного кода, и создания пользовательских библиотек.

// вызов модуля mod()
mod();
// определения модуля mod()
module mod(){
echo("module mod");
}

Модуль может принимать значение.

// при вызове модуля mod(10) передаем значение 10
mod(10);
// вызываем mod() без параметра
mod();
// определения модуля
// модуль принимает значение и записывает в переменную "a",
// если значение не передается, используется значение 5
module mod(a=5){
echo(a);
}

Функции в OpenSCAD, получают значения, выполняют вычисления и возвращают новые значения. Так же как и модуль функция должна быть объявлена и вызвана. Синтаксис объявления функции: function [имя]([параметры]) = [значение];. Для примера, напишем функцию которая принимает два числа, и возвращает большее.

function foo(a, b) = (a > b) ? a : b; z = foo(10, 15); echo(z);

Довольно просто. На всякий случай рассмотрим запись в определении функции после знака равенства, где записано условие (a > b) ? a : b, которое можно прочитать как если a > b вернуть значение a, в противном случае вернуть b.

Пример

Теперь пофантазируем и сформируем игровую задачу, а затем решим ее (также прошу посетить страницу OpenSCAD - сборник задач).

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

Вот пример того, что должно получиться:

-6

При построении модели, конечно лучше всего использовать чертёж!

Информатика является междисциплинарным предметом в школе, и останавливаться, только на математике, я думаю не стоит. А умение читать чертёж, может стать не плохим навыком. Так же нужно вспомнить, что в школе ведутся занятия по технологии и попытаться скомбинировать занятия.

-7

Вначале, построим модель строго по размерам заданным на чертеже. В OpenSCAD единица измерения по умолчанию, является миллиметр.

cube(size = [100, 10, 10], center = true); // основание translate([0, 0, -5]) cylinder(d1 = 10, d2 = 10, h = 50, $fn=50);
translate([45, 0, -5]) cylinder(d1 = 10, d2 = 10, h = 50, $fn=50);
translate([-45, 0, -5]) cylinder(d1 = 10, d2 = 10, h = 50, $fn=50);

При выполнении функции cube(параметры), OpenSCAD создает куб по параметрам: size = [x, y, z] - указывает длину по осям x, y и z, center = true - устанавливает центр куба в центр осей координат, если этой инструкции нет, или она установлена в false, то куб будет установлен в положительном квадранте и одной вершиной в точке начала координат.

Здесь нужно учитывать, что высота основания (по оси z) равна 10мм, но от 0 по z, до вершин куба 5мм и -5мм.

Теперь разберёмся с синтаксисом отрисовки цилиндра: cylinder(d1 = диаметр вершины, d2 = диаметр вершины, h = высота цилиндра, $fn = разрешение). Специальная переменная $fn, принимает значение, которое указывает OpenSCAD, какое количество элементов требуется для отрисовки полного круга.

Функция translate([параметры]) позиционирует элемент, указанный в теле функции, относительно точки начала координат, в качестве параметров указывается положение по осям x, y, z. Тело функции обычно указывается в фигурных скобках, но если в теле функции всего одна инструкция, то фигурные скобки могут быть опущены.

Таким образом эта запись:

translate([0, 0, -5]){
cylinder(d1 = 10, d2 = 10, h = 50, $fn=50);
};

Равнозначна этой:

translate([0, 0, -5]) cylinder(d1 = 10, d2 = 10, h = 50, $fn=50);

Конкретно в данном примере, все цилиндры, по оси z позиционируются на -5мм, для того что бы выровнять нижнюю вершину куба и цилиндров. По оси x располагаем три цилиндра, один по центру и два равноудалённых от центра, на 45мм и -45мм. Крайние точки основания модели находятся в координате по оси x 50мм и -50мм, а так как диаметр цилиндра 10мм, то нам следует передвинуть, центр цилиндра на -5мм.

Хорошо, с этим справились, но наша задача, не решена. Длина основания вешалки, должна изменяться, поэтому объявим переменную length и модуль hanger (можно решить и без модуля), который получит значение переменной и займется отрисовкой модели.

length = 150;
// объявление модуля
module hanger(length=100){ // тело модуля ... }
hanger(length); // вызов модуля

В теле модуля, отрисуем основание.

cube([length, 10, 10], center = true);

Рассчитаем позицию цилиндров по оси x. Определим переменную posx, которая будет равна length / 2 - 5. А так как два цилиндра равноудалены от центра, то один цилиндр по оси x будет иметь значение posx, а второй отрицательное значение posx.

translate([0, 0, -5]) cylinder(d1=10, d2=10, h=50, $fn=50);
translate([posx, 0, -5]) cylinder(d1=10, d2=10, h=50, $fn=50);
translate([-posx, 0, -5]) cylinder(d1=10, d2=10, h=50, $fn=50);

Теперь при изменении значения переменной length, модель будет перерисовываться без нарушения общей целостности.

length = 150;
// объявление модуля
module hanger(length=100){
cube([length, 10, 10], center = true); posx = length / 2 - 5;
translate([0, 0, -5]) cylinder(d1=10, d2=10, h=50, $fn=50);
translate([posx, 0, -5]) cylinder(d1=10, d2=10, h=50, $fn=50);
translate([-posx, 0, -5]) cylinder(d1=10, d2=10, h=50, $fn=50);
}
hanger(length); // вызов модуля

Выводы

При решении данной задачи ученику необходимо выполнить несколько этапов.

Сначала следует проанализировать модель, как словесное описание, так и графическое представление в виде чертежа.

Затем важно понять, что основная задача заключается не в создании статичной модели, а в возможности гибко менять параметры модели.

На третьем этапе необходимо разобраться с тем, как вычислять зависимые от вводных данных параметры модели.

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

Эти этапы помогут ученику систематизировать процесс решения задачи и эффективно продвигаться от анализа к практической реализации.

В общем, такие задачи, могут оттачивать и закреплять многие умения и знания из разных дисциплин. Но подходит ли OpenSCAD, каждому ученику?

OpenSCAD - это мощный инструмент для создания трехмерных моделей с помощью программирования. Он может быть полезен для учеников, заинтересованных в изучении технологий и программирования. Однако, из-за своей специфичности, он может быть не подходящим для всех. Для учеников, которые проявляют интерес к изучению технологий и имеют определенный багаж знаний о переменных и алгоритмах, OpenSCAD может быть полезным инструментом, позволяющим увидеть применение программирования в техническом дизайне и других областях. Для начала знакомства с программированием, возможно, более подходящим будет использование более общеизвестных языков программирования.

А если есть доступ к 3д-принтеру, то заинтересованность учеников может заметно усилиться.

Для полного погружения в систему моделирования OpenSCAD обратитесь к викиучебнику на русском или OpenSCAD User Manual.