Eigene Module machen OpenSCAD-Geometrien wiederverwendbar. Du definierst Bausteine für Bohrungen, Grundplatten und Abstandshalter, übergibst ihnen Parameter und setzt daraus übersichtliche Modelle mit mehreren Varianten zusammen.
Voraussetzungen
Du brauchst OpenSCAD und die Grundlagen aus Teil 11 des Kurses.
Kapitel 3 – OpenSCAD automatisieren
In den bisherigen Lektionen haben wir bereits gelernt, wie sich OpenSCAD-Modelle parametrisch aufbauen, mit Schleifen automatisieren und mit Bedingungen verändern lassen.
Mit eigenen Modulen gehen wir jetzt einen weiteren wichtigen Schritt.
Ein Modul fasst eine Geometrie oder einen wiederkehrenden Codeblock unter einem eigenen Namen zusammen.
Die allgemeine Schreibweise lautet:
module name() {
// Geometrie
}
Das Modul kann anschließend wie ein eigener OpenSCAD-Befehl aufgerufen werden.
Lernziel:
Nach dieser Lektion kannst du eigene Module definieren, Parameter und Standardwerte verwenden und wiederkehrende Geometrien in übersichtliche Bausteine zerlegen.
Warum eigene Module?
Nehmen wir einen einfachen Abstandshalter:
difference() {
cylinder(
h=20,
d=15,
$fn=64
);
translate([0, 0, -1])
cylinder(
h=22,
d=5,
$fn=64
);
}
Wird dieser Abstandshalter mehrfach benötigt, müssten wir den gleichen Code immer wieder kopieren.
Das funktioniert zwar, führt aber schnell zu:
-
langem Quelltext
-
doppeltem Code
-
unnötiger Fehlergefahr
-
schlechter Wartbarkeit
Ein Modul löst genau dieses Problem.
Das erste eigene OpenSCAD-Modul definieren
module abstandshalter() {
cylinder(
h=20,
d=15,
$fn=64
);
}
Aufgerufen wird das Modul mit:
abstandshalter();
Damit verhält sich abstandshalter() für unser Modell wie ein eigener Befehl.
Module mehrfach verwenden
module abstandshalter() {
cylinder(
h=20,
d=15,
$fn=64
);
}
translate([0, 0, 0])
abstandshalter();
translate([30, 0, 0])
abstandshalter();
translate([60, 0, 0])
abstandshalter();
Die Geometrie selbst wurde nur einmal definiert.
Parameter an ein Modul übergeben
Ein Modul kann Parameter erhalten:
module abstandshalter(
aussen_d,
hoehe
) {
cylinder(
h=hoehe,
d=aussen_d,
$fn=64
);
}
Aufruf:
abstandshalter(15, 20);
Damit werden die Werte beim Aufruf an das Modul übergeben.
Benannte Parameter
Lesbarer ist häufig:
abstandshalter(
aussen_d=15,
hoehe=20
);
Gerade bei mehreren Parametern ist die Bedeutung der Werte dadurch sofort erkennbar.
Standardwerte
Parameter können bereits in der Moduldefinition Standardwerte erhalten:
module abstandshalter(
aussen_d=15,
hoehe=20
) {
cylinder(
h=hoehe,
d=aussen_d,
$fn=64
);
}
Dann ist auch folgender Aufruf möglich:
abstandshalter();
In diesem Fall werden automatisch:
-
Außendurchmesser = 15 mm
-
Höhe = 20 mm
verwendet.
Parametrischer Abstandshalter mit Bohrung
Jetzt erweitern wir das Modul:
module abstandshalter(
aussen_d=15,
bohrung_d=5,
hoehe=20
) {
difference() {
cylinder(
h=hoehe,
d=aussen_d,
$fn=64
);
translate([
0,
0,
-1
])
cylinder(
h=hoehe + 2,
d=bohrung_d,
$fn=64
);
}
}
Mehrere Varianten mit demselben Modul
translate([0, 0, 0])
abstandshalter(
aussen_d=15,
bohrung_d=5,
hoehe=20
);
translate([30, 0, 0])
abstandshalter(
aussen_d=20,
bohrung_d=6,
hoehe=30
);
translate([70, 0, 0])
abstandshalter(
aussen_d=25,
bohrung_d=8,
hoehe=15
);
Damit zeigt sich einer der wichtigsten Vorteile von Modulen:
Die Konstruktionslogik wird nur einmal definiert, während beliebig viele Varianten daraus entstehen können.
Module als Hilfsgeometrie
Ein Modul muss kein fertiges Bauteil sein.
Es kann beispielsweise auch einen wiederverwendbaren Schneidkörper erzeugen.
Beispiel:
module bohrung(
d=5,
h=10,
ueberstand=1
) {
translate([
0,
0,
-ueberstand
])
cylinder(
h=h + 2 * ueberstand,
d=d,
$fn=64
);
}
Dadurch müssen wir die für difference() benötigte Überlänge nicht jedes Mal neu berechnen.
Bohrungsmodul verwenden
difference() {
cube([
80,
50,
5
]);
translate([
10,
10,
0
])
bohrung(
d=5,
h=5
);
translate([
70,
10,
0
])
bohrung(
d=5,
h=5
);
}
Der Hauptcode beschreibt jetzt wesentlich deutlicher, was eigentlich passieren soll.
Module und Schleifen kombinieren
Module lassen sich direkt innerhalb einer for()-Schleife verwenden:
for (x = [10, 70])
for (y = [10, 40])
translate([
x,
y,
0
])
bohrung(
d=5,
h=5
);
Damit erzeugen wir vier Bohrungen mit nur einem einzigen Modulaufruf im Schleifenkörper.
Module und if() kombinieren
Auch optionale Geometrien sind problemlos möglich:
mit_mittelbohrung = true;
if (mit_mittelbohrung)
translate([
40,
25,
0
])
bohrung(
d=20,
h=5
);
Damit greifen jetzt mehrere Inhalte des Kurses ineinander:
Module
+ Schleifen
+ Bedingungen
+ boolesche Operationen
= flexibel aufgebaute Modelle
Praxisprojekt: Montageplatte modularisieren
Die Montageplatte aus den letzten Lektionen bestand bisher aus:
-
Grundplatte
-
vier Befestigungsbohrungen
-
optionaler Mittelbohrung
Jetzt lagern wir wiederkehrende Geometrien in eigene Module aus.
Modul für die Grundplatte
module grundplatte(
breite,
tiefe,
dicke
) {
cube([
breite,
tiefe,
dicke
]);
}
Modul für Bohrungen
module bohrung(
d,
h,
ueberstand=1
) {
translate([
0,
0,
-ueberstand
])
cylinder(
h=h + 2 * ueberstand,
d=d,
$fn=64
);
}
Parameter des Modells
breite = 120;
tiefe = 70;
dicke = 5;
bohrung_d = 6;
rand_x = 12;
rand_y = 12;
mit_mittelbohrung = true;
mittelbohrung_d = 20;
Berechnungen
x_pos = [
rand_x,
breite - rand_x
];
y_pos = [
rand_y,
tiefe - rand_y
];
Hauptmodell
difference() {
grundplatte(
breite=breite,
tiefe=tiefe,
dicke=dicke
);
for (x = x_pos)
for (y = y_pos)
translate([
x,
y,
0
])
bohrung(
d=bohrung_d,
h=dicke
);
if (mit_mittelbohrung)
translate([
breite / 2,
tiefe / 2,
0
])
bohrung(
d=mittelbohrung_d,
h=dicke
);
}
Der Hauptteil des Modells liest sich jetzt fast wie eine Beschreibung:
-
Grundplatte erzeugen
-
Befestigungsbohrungen abziehen
-
optional Mittelbohrung abziehen
Sinnvolle Modulnamen
Ein Modul sollte möglichst eindeutig benannt werden.
Gut:
bohrung()
grundplatte()
abstandshalter()
winkelhalter()
Weniger hilfreich:
teil1()
objekt()
modul2()
x()
Je größer ein Projekt wird, desto wichtiger werden verständliche Namen.
Module als eigene Bauteilbibliothek
Ein großer Vorteil von Modulen ist ihre Wiederverwendbarkeit.
Mit der Zeit können beispielsweise Module entstehen für:
Bohrungen
Senkungen
Langlöcher
Abstandshalter
Schraubaufnahmen
Halterungen
Gehäuseelemente
Rippen
Steckerausschnitte
Solche Bausteine können später sogar in eigene Dateien ausgelagert und in verschiedenen OpenSCAD-Projekten wiederverwendet werden.
Mit Bibliotheken beschäftigen wir uns später im Kurs noch genauer.
Mitmach-Aufgabe
Erstelle ein eigenes Modul:
halter()
Das Modul soll einen einfachen parametrischen Winkelhalter erzeugen.
Parameter
| Parameter | Standardwert |
|---|---|
| Breite | 60 mm |
| Tiefe | 30 mm |
| Höhe | 40 mm |
| Wandstärke | 5 mm |
Verwende innerhalb des Moduls:
union()
cube()
translate()
Erzeuge anschließend zwei verschiedene Varianten des Halters.
Musterlösung
module halter(
breite=60,
tiefe=30,
hoehe=40,
wand=5
) {
union() {
// Grundplatte
cube([
breite,
tiefe,
wand
]);
// Rückwand
translate([
0,
0,
wand
])
cube([
breite,
wand,
hoehe - wand
]);
}
}
// Variante 1
translate([
0,
0,
0
])
halter(
breite=60,
tiefe=30,
hoehe=40,
wand=5
);
// Variante 2
translate([
80,
0,
0
])
halter(
breite=80,
tiefe=40,
hoehe=50,
wand=6
);
Was haben wir gelernt?
Mit:
module
können wir eigene wiederverwendbare Bausteine definieren.
Module können:
-
Geometrie zusammenfassen
-
Parameter erhalten
-
Standardwerte verwenden
-
beliebig oft aufgerufen werden
-
unterschiedliche Varianten erzeugen
-
mit
for()kombiniert werden -
mit
if()kombiniert werden -
als Hilfsgeometrien dienen
-
komplexe Modelle deutlich übersichtlicher machen
Damit verfügen wir über ein sehr wichtiges Werkzeug für größere OpenSCAD-Projekte.
Im nächsten Teil
Im nächsten Teil geht es um:
function
Module erzeugen normalerweise Geometrie.
Funktionen dagegen berechnen Werte und geben diese zurück.
Damit können wir beispielsweise:
-
Maße berechnen
-
Durchmesser ableiten
-
Positionen bestimmen
-
wiederkehrende Formeln zentral definieren
So wird unsere parametrische Konstruktion noch flexibler.
Häufige Fragen
Wie definiere und verwende ich ein OpenSCAD-Modul?
Definiere den Baustein mit module name(parameter) { ... } und rufe ihn mit name(wert); auf. Die Geometrie im Modul wird an der Stelle des Aufrufs erzeugt.
Wann sind Standardwerte für Modulparameter sinnvoll?
Standardwerte eignen sich für häufig verwendete Abmessungen. Ein Modul wie module halter(breite=60) kann ohne Argument aufgerufen werden; mit halter(breite=80); erzeugst du gezielt eine andere Variante.
Passendes Cheatsheet
Im Cheatsheet „Schleifen, Bedingungen und Module“ findest du ergänzende Grundlagen zum Nachschlagen. Du kannst das Cheatsheet auch direkt als PDF herunterladen.
