
Полная версия
PythonScad в задачах и примерах
Задача 13:Оболочка
Какая команда позволяет создать оболочку объекта?
1) offset()
2) expand()
3) outline()
4) thicken()
5) hollow()
Задача 14:Сглаживание
Какая операция позволяет сгладить края объекта?
1) minkowski()
2) smooth()
3) round()
4) bevel()
5) soften()
Задача 15:Сглаживание
Как можно сделать скруглённые края у куба?
1) minkowski() { cube([10,10,10]) sphere(2) }
2) round_cube()
3) smooth_cube(10, 2)
4) soften_cube(10, 2)
5) bevel_cube([10,10,10], 2)
Задача 16:Многократное повторение
Какая команда выполняет многократное повторение объекта?
1) clone()
2) repeat()
3) for()
4) array()
5) loop()
Задача 1:Команды
Какая команда выполняет перемещение объекта в заданную точку?
1) rotated = .rotate()
2) c = coil
3) diff = .difference()
4) inter = .intersection()
Задача 2:Передвижение кодом
Какой код сдвинет объект на 15 по X, -10 по Y и 5 по Z?
1) tr = .translate([15, -10, 5])
2) translate([15, -10, 5])
3) c = coil([15, -10, 5])
4) rotated = .rotate([15, -10, 5])
Задача 3:Масштабирование
Какая команда выполняет масштабирование объекта?
1) Scale = * ()
2) tr = .translate()
3) c = coil()
4) translate([15, -10, 5])
Задача 4:Масштабирование
Как уменьшить объект в 2 раза по всем осям?
1) scale = * -2
2) Sc = scale * -2
3) scale = * 2
4) Sc = scale * 2
Задача 5:Смещение
Как задать поворот объекта на 90 градусов вокруг оси Y?
1) rotated = .rotate([0,90,0])
2) rotated =([0,90,0])
3) x = ([0,90,0])
4) ([0,90,0]) = x
Задача 6:Отзеркаливание
Как выполнить зеркальное отражение объекта относительно плоскости XY?
1) mr = .mirror([0,0,1])
2) mirror([0,0,1])
3) mr = ([0,0,1])
4) mr = mirror
Задача 7:Задать размер объекта
Какая команда позволяет задать конкретные размеры объекта, а не масштабировать его?
1) re = .resize([])
2) c = coil([])
3) re = ([])
4) resize([])
Задача 8:Смешенный код
Какой код смешивает вычитание и задание размеров объектов?
1) diff = re.difference(cy)
2) c = re.coil(cy)
3) fusion = union([re, cu])
4) inter = re.intercection(cu)
Задача 9:Смешенный код
Какой код смешивает пересечение и задание размеров объектов?
1) inter = re.intersection(cy)
2) c = cu.coil(re)
3) diff = re.difference(cy)
4) fusion = union([re, cu])
Задача 10:Линейное Выдавливание
Какая команда создаёт линейное выдавливание 2D-фигуры?
1) l=linear_extrude(square(),[[],[], [],[]]);
2) path_extrude()
3) linear_extrude
4) l = linear_extrude()
Задача 11:Линейное Выдавливание
Как выдавить 2D-объект на 20 единиц вверх?
1) p=path_extrude(square(1),[[0,0,0],[0,0,20]]);
2) rotate_ extrude(square(1),[[0,0,0],[0,0,20]]);
3) l=linear_extrude(square(1),[[0,0,0],[0,0,20]]);
4) e=extrude(square(1),[[0,0,0],[0,0,20]]);
Задача 12:Вращательное Выдавливание
Как сделать вращательное выдавливание 2D-объекта?
1) circle(3).right(10).rotate_extrude(v=[0,0,20],angle=600).show()
2) linear_extrude()
3) path_extrude()
4) extrude()
Задача 13:Оболочка
Какая команда позволяет создать оболочку объекта?
1) .offset()
2) .clone()
3) .array()
4) .loop()
Задача 14:Сглаживание
Какая операция позволяет сгладить края объекта?
1) .fillet
2) .edge
3) .core
4) .ore
Задача 15:Сглаживание
Как можно сделать скруглённые края у куба?
1) .fillet
2) .edge
3) .core
4) .ore
Задача 16:Многократное повторение
Какая команда выполняет многократное повторение объекта?
1) con = .clone()
2) f = for()
3) loo = loop()
4) ar = array()
Модуль 5: Основы параметризации
Переменные
Переменные в PythonSCAD(OpenSCAD) задаются с помощью оператора = и хранят значения различных типов: числа, строки, списки и другие. Важно помнить, что PythonSCAD(OpenSCAD) является декларативным языком, поэтому переменные неизменяемы после первого присваивания.
Пример объявления переменных:
width = 10;
height = 20;
depth = 30;
cube([width, height, depth]);
Здесь переменные используются для задания размеров куба.
Особенности переменных
Листинг 1:Одноразовое присвоение
x = 5;
x = 10; // Это не изменяет x, значение остается 5
echo(x); // Выведет 5

Рис. 1. Одноразовое присвоение
Листинг 2:Порядок выполнения
y = x + 5; // Используется текущее значение x (например, 5)
echo(y); // Выведет 10

Рис. 2. Порядок выполнения
Константы
Хотя в PythonSCAD(OpenSCAD) отсутствует специальный механизм для объявления констант, часто используют соглашение: писать имена констант заглавными буквами (PI, GOLDEN_RATIO), чтобы отличать их от обычных переменных.
Пример констант:
PI = 3.141592;
GOLDEN_RATIO = 1.618;
RADIUS = 50;
circle(RADIUS);
Вычисляемые переменные
Переменные могут зависеть от других переменных, что делает возможным создание сложных моделей.
Листинг 1:Вычисляемые переменные
base_diameter = 40;
height = base_diameter / 2; // Высота зависит от диаметра
cylinder(d=base_diameter, h=height);

Рис. 3. Вычисляемые переменные
Локальные переменные (let)
Для ограничения области видимости переменной используется конструкция let().
openscad
let(r = 10) {
circle(r);
}
Здесь переменная r доступна только внутри блока let().
Отладка с помощью echo
Функция echo() полезна для вывода значений переменных в процессе отладки.
a = 5;
b = a * 2;
echo("Значение b:", b); // Выведет: ECHO: "Значение b:", 10
Выводы:
1) Переменные в PythonSCAD(OpenSCAD)неизменяемы после присвоения.
2) Константы обозначаются прописными буквами.
3) Локальные переменные создаются с помощью let().
4) Функция echo() удобна для отладки.
Переменные в PythonSCAD(Python) задаются с помощью оператора и хранят значения различных типов: числа, строки, списки и другие. Важно помнить, что PythonSCAD(Python) является декларативным языком, поэтому переменные неизменяемы после первого присваивания.
Пример объявления переменных:
width = 10;
height = 20;
depth = 30;
c = cube([width, height, depth]);
show(c)
Здесь переменные используются для задания размеров куба.
Особенности переменных
Листинг 1:Одноразовое присвоение
x = 5
x = 10 // Это не изменяет x, значение остается 5
cu = cube(x)
show(cu) // Выведет куб размером 5

Рис. 4. Одноразовое присвоение
Листинг 2:Порядок выполнения
x = 5
x = 10
y = x + 5 // Используется текущее значение x (например, 5)
cu = cube(y)
show(cu) // Выведет куб рамзером 10

Рис. 5. Порядок выполнения
Константы
Хотя в PythonSCAD(Python) отсутствует специальный механизм для объявления констант, часто используют соглашение: писать имена констант заглавными буквами (PI, GOLDEN_RATIO), чтобы отличать их от обычных переменных.
PI = 3.141592;
GOLDEN_RATIO = 1.618;
RADIUS = 50;
circle(RADIUS);
Вычисляемые переменные
Переменные могут зависеть от других переменных, что делает возможным создание сложных моделей.
Листинг 3: Вычисляемые переменные
base_diameter = 40;
height = base_diameter / 2; // Высота зависит от диаметра
cy = cylinder(d=base_diameter, h=height);
show(cy)

Рис. 6. Вычисляемые переменные
Локальные переменные (let)
Для ограничения области видимости переменной используется конструкция example().
Листинг 4: Локальные переменные (let)
def example():
x = 10
y = 20
return x + y
result = cube(example())
show(result)

Рис. 7. Локальные переменные (let)
Здесь переменная r доступна только внутри блока example().
Функция show() обязательна для вывода значений переменных в процессе отладки.
from openscad import *
a = 5
b = a * 2
cu = cube(b)
show(cu) // Выведет куб который имеет параметры b
Выводы:
Переменные в PythonSCAD(Python)неизменяемы после присвоения. Константы обозначаются прописными буквами. Локальные переменные создаются с помощью let().
Функции и аргументы в PythonSCAD(OpenSCAD)
PythonSCAD(OpenSCAD) позволяет использовать функции для вычисления значений и работы с геометрией. Эти функции действуют подобно математическим функциям и не способны изменять сцену напрямую, поскольку OpenSCAD является декларативным языком.
Листинг 1:Определение функций
Функции определяются с использованием ключевого слова function, принимают аргументы и возвращают результат. Они полезны для упрощения и повторной реализации вычислений.
function square(x) = x * x;
echo(square(5)); // ECHO: 25

Рис. 8. Определение функций
Эта функция square(x) возводит переданное ей число в квадрат.
Листинг 2:Функции с несколькими аргументами
function sum(a, b) = a + b;
echo(sum(10, 20)); // ECHO: 30

Рис. 9. Функции с несколькими аргументами
Листинг 3:Условные функции (тернарный оператор)
function abs_value(x) = x >= 0 ? x : -x;
echo(abs_value(-7)); // ECHO: 7

Рис. 10. Условные функции (тернарный оператор)
Функция abs_value(x) возвращает абсолютное значение переданного числа.
Листинг 4:Рекурсивные функции
OpenSCAD поддерживает рекурсию, хотя циклы отсутствуют.
Факториал
function factorial(n) = (n <= 1) ? 1 : n * factorial(n – 1);
echo(factorial(5)); // ECHO: 120

Рис. 11. Рекурсивные функции
Листинг 5: Работа с массивами
function sum_list(lst) = (len(lst) == 0) ? 0 : lst[0] + sum_list([for (i = 1; i < len(lst); i = i + 1) lst[i]]);
echo(sum_list([1, 2, 3, 4, 5])); // ECHO: 15

Рис. 12. Работа с массивами
Листинг 6:Передача функций как аргумента
function operation(type, x) = (type == "square") ? x * x : (type == "double") ? x * 2 : x;
echo(operation("square", 4)); // ECHO: 16
echo(operation("double", 4)); // ECHO: 8

Рис. 13. Передача функций как аргумента
Листинг 7:Использование функций в модулях
function diameter(radius) = radius * 2;
module custom_cylinder(r) {
cylinder(d = diameter(r), h = 10);
}
custom_cylinder(15);

Рис. 14. Использование функций в модулях
Функция diameter(r) вычисляет диаметр цилиндра, который затем передается в модуль custom_cylinder.
Заключение
Функции возвращают значения, но не влияют непосредственно на геометрию. Поддерживаются множественные аргументы, условные выражения, работа с массивами и рекурсия. Функции идеально подходят для параметрической настройки моделей.
Теперь давайте рассмотрим практический пример создания шестеренки с использованием функций.
Параметрическая шестеренка
Функция рассчитывает радиус зубца, а модуль создает трехмерную модель шестеренки.
Листинг 1:Рассчёт функции шестерни
// Функция для расчета радиуса зубцов шестеренки
function gear_radius(base_r, teeth, tooth_height) =
base_r + tooth_height * (teeth > 0 ? 1 : 0);
// Модуль для создания шестеренки
module gear(base_r, teeth, tooth_height) {
difference() {
// Основной диск шестеренки
circle(r = gear_radius(base_r, teeth, tooth_height), $fn = 100);
// Создание выемок для зубцов
for(i = [0:teeth-1]) {
angle = i * (360 / teeth);
translate([base_r * cos(angle), base_r * sin(angle)])
rotate(angle)
square([tooth_height * 2, base_r * 0.2], center = true);
}
}
}
// Вызов модуля шестеренки с заданными параметрами
gear(base_r = 20, teeth = 12, tooth_height = 3);

Рис. 15. Рассчёт функции шестерни
Описание работы шестеренки
Функция gear_radius вычисляет максимальный радиус шестеренки, включая выступающие зубья.
Модуль gear:
– Создается основной диск шестеренки.
– С помощью цикла for создаются выемки для зубцов.
Шестеренку можно вызвать с параметрами: gear(20, 12, 3), где задаются радиус основания, количество зубцов и высота зуба.
Улучшение шестеренки
Добавим возможность задавать диаметр центрального отверстия.
Листинг 2:Возможность задавать диаметр центрального отверстия
module gear(base_r, teeth, tooth_height, hole_r = 5) {
difference() {
// Основной диск шестеренки
circle(r = gear_radius(base_r, teeth, tooth_height), $fn = 100);
// Вырезание зубцов
for(i = [0:teeth-1]) {
angle = i * (360 / teeth);
translate([base_r * cos(angle), base_r * sin(angle)])
rotate(angle)
square([tooth_height * 2, base_r * 0.2], center = true);
}
// Центральное отверстие
circle(r = hole_r, $fn = 50);
}
}
// Пример вызова шестеренки с отверстием
gear(base_r = 20, teeth = 16, tooth_height = 3, hole_r = 6);

Рис. 16. Возможность задавать диаметр центрального отверстия
Теперь можно регулировать такие параметры, как количество зубцов, высоту зубьев и размер центрального отверстия.
Приведенный пример демонстрирует, как функции позволяют вычислить необходимые параметры для создания сложных геометрических объектов. Модули же создают сами объекты на основе этих параметров.
Функции и аргументы в PythonSCAD(Python)
PythonSCAD(Python) позволяет использовать функции для вычисления значений и работы с геометрией. Эти функции действуют подобно математическим функциям и не способны изменять сцену напрямую, поскольку OpenSCAD является декларативным языком.
Листинг 1:Простая функция
Простая функция
def square(x):
return x * x
result = square(5)
print(result)

Рис. 17. Простая функция
Эта функция square(x) возводит переданное ей число в квадрат.
Листинг 2:Функции с несколькими аргументами
def sum(a, b):
return a + b
result = sum(10, 20)
print(result)

Рис. 18. Функции с несколькими аргументами
Листинг 3:Условные функции (тернарный оператор)
def absolute_value(x):
if x < 0:
return -x
return x
result = absolute_value(-7)
print(result)

Рис. 19. Условные функции (тернарный оператор)
Функция abs_value(x) возвращает абсолютное значение переданного числа.
Листинг 4:Рекурсивные функции
Факториал
def factorial(n):
if n < 0:
return "Факториал не определён для отрицательных чисел"
elif n == 0 or n == 1:
return 1
else:
result = 1
for i in range(2, n + 1):
result *= i
return result
result = factorial(5)
print(result)

Рис. 20. Рекурсивные функции
Листинг 5:Работа с массивами
def sum_list(lst):
total = 0
for element in lst:
total += element
return total
result = sum_list([1, 2, 3, 4, 5])
print(result)

Рис. 21. Работа с массивами
Эта функция суммирует элементы массива.
Листинг 6:Передача функций как аргумента
def operation(type, lst):
return [type(x) for x in lst]
def square(x):
return x * x
def double(x):
return x * 2
number = [4]
squared = operation(square, number)
doubled = operation(double, number)
print(squared)
print(doubled)

Рис. 22. Передача функций как аргумента
Листинг 7:Использование функций в модулях
def cylinder_module(radius, height):
output = f"""
module cylinder_module(r, h) {{
// Создаем цилиндр
translate([0, 0, 0])
cylinder(r = r, h = h, center = true);
}}
cylinder_module({radius}, {height});
"""
return output
radius = 5
height = 10
cylinder_code = cylinder_module(radius, height)
print(cylinder_code)

Рис. 23. Использование функций в модулях
Заключение
Функции возвращают значения, но не влияют непосредственно на геометрию. Поддерживаются множественные аргументы, условные выражения, работа с массивами и рекурсия. Функции идеально подходят для параметрической настройки моделей.
Теперь давайте рассмотрим практический пример создания шестеренки с использованием функций.
Параметрическая шестеренка
Функция рассчитывает радиус зубца, а модуль создает трехмерную модель шестеренки.
Листинг 1:Функция рассчитывает радиус зубца
import math
def gear_radius(base_r, teeth, tooth_height):
"""Функция для расчета радиуса зубцов шестеренки."""
return base_r + tooth_height * (1 if teeth > 0 else 0)
def gear(base_r, teeth, tooth_height):
"""Создает шестеренку с заданными параметрами."""
output = "difference() {\n"
# Основной диск шестеренки
output += f" circle(r = {gear_radius(base_r, teeth, tooth_height)}, $fn = 100);\n"
# Создание выемок для зубцов
for i in range(teeth):
angle = i * (360 / teeth)
x = base_r * math.cos(math.radians(angle))
y = base_r * math.sin(math.radians(angle))
output += f" translate([{x}, {y}])\n"
output += f" rotate({angle})\n"
output += f" square([{tooth_height * 2}, {base_r * 0.2}], center = true);\n"
output += "}\n"
return output
# Вызов функции с заданными параметрами
gear_code = gear(base_r=20, teeth=12, tooth_height=3)
print(gear_code)

Рис. 24. Функция рассчитывает радиус зубца
Объяснение кода
1. gear_radius
– Эта функция считает радиус зубцов шестеренки.
2. gear
– Главный модуль, который создает шестеренку.
– Использует `difference()` для вычитания зубцов из основного круга.
3. Цикл for
– Генерирует зубцы шестеренки, вычисляя их расположение на основе угла.
4. translate и rotate
– Перемещают и поворачивают зубцы в нужные позиции.
5. Вывод
– Функция возвращает сгенерированный код, который можно использовать в PythonSCAD.
Улучшение шестеренки
Добавим возможность задавать диаметр центрального отверстия.
Листинг 1:Возможность задавать диаметр центрального отверстия
def cos(angle):
import math
return math.cos(math.radians(angle))
def sin(angle):
import math
return math.sin(math.radians(angle))
def radians(degrees):
import math
return degrees * (math.pi / 180)
def circle(r, fn=100):
return f'circle(r={r}, $fn={fn})'
def square(size, center=False):
return f'square(size={size}, center={center})'
def translate(vector):
return f'translate({vector})'
def rotate(angle):
return f'rotate(angle={angle})'
def difference(*shapes):
return 'difference() {' + ''.join(shapes) + '}'
def gear_radius(base_r, teeth, tooth_height):
return base_r + tooth_height
def create_gear(base_r, teeth, tooth_height, hole_r=5):
gear_shape = difference(
circle(gear_radius(base_r, teeth, tooth_height), fn=100)
)
for i in range(teeth):
angle = i * (360 / teeth)
x = base_r * cos(angle)
y = base_r * sin(angle)
tooth = translate([x, y, 0])(
rotate(angle)(
square([tooth_height * 2, base_r * 0.2], center=True)
)
)
gear_shape += tooth
# Центральное отверстие
central_hole = circle(hole_r, fn=50)
gear_shape += central_hole
return gear_shape
# Пример вызова шестеренки с отверстием
gear_model = create_gear(base_r=20, teeth=16, tooth_height=3, hole_r=6)
Конец ознакомительного фрагмента.

