OpenSCAD в школе

Обзор системы трехмерного моделирования OpenSCAD.

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

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

Лицензия GNU GPL v2
Операционная система Windows, Linux, macOS, Web
Читаемые форматы файлов: DXF, STL
Создаваемые форматы файлов DXF, SVG. PNG, STL
Официальный сайт https://www.openscad.org
Версия на момент публикации статьи 2019.05

Википедия даёт определение: OpenSCAD - Открытая САПР для параметрического проектирования твердотельных трехмерных объектов (wikipedia.org).

Основные особенности OpenSCAD включают:

Параметрические объекты: OpenSCAD позволяет создавать объекты, параметры которых могут быть изменены пользователем для создания различных вариантов модели.

Специальный язык: OpenSCAD использует специальный язык для описания моделей, что позволяет создавать сложные параметрические модели с относительной простотой.

Прямая работа с параметрами: В отличие от FreeCAD, OpenSCAD предлагает работу с параметрами объектов, что позволяет пользователям быстрее и эффективнее создавать и изменять модели.

Простота использования: OpenSCAD прост и удобен в использовании, что делает его привлекательным для пользователей, даже тех, кто не имеет опыта работы с CAD-программами.

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

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

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

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

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

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

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

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

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

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

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

// logo.scad - Basic example of module, top-level variable and $fn usage

    Logo(50);

    // The $fn parameter will influence all objects inside this module
    // It can, optionally, be overridden when instantiating the module
    module Logo(size=50, $fn=100) {
        // Temporary variables
        hole = size/2;
        cylinderHeight = size * 1.25;

        // One positive object (sphere) and three negative objects (cylinders)
        difference() {
            sphere(d=size);

            cylinder(d=hole, h=cylinderHeight, center=true);
            // The '#' operator highlights the object
            #rotate([90, 0, 0]) cylinder(d=hole, h=cylinderHeight, center=true);
            rotate([0, 90, 0]) cylinder(d=hole, h=cylinderHeight, center=true);
        }
    }

    echo(version=version());

Как можно заметить, язык сценариев OpenSCAD визуально похож на такие языки как C/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(); 

// определения модуля 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 - сборник задач). Предположим, что существует магазин, в котором в последнее время, особой популярностью пользуется определенная модель вешалки, но большое количество покупателей, её не покупают со словами: «Если бы вешалка была на пять сантиметров длинее» или «Мне нужно то же, но в длину сантиметров 40» и т.д. При этом покупатели называют разные параметры. Тогда продавец решается на покупку 3д-принтера, и делает заказ на 3д-модель. Его главным условием, является возможность ввести только длину, а OpenSCAD должен сам перерисовать модель.

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

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

Вначале, построим модель строго по размерам заданным на чертеже. В 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.


2391