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.