OpenSCAD
Die OpenSCAD-WebAssembly-Laufzeitumgebung, optionale Bibliotheken (BOSL2, BOSL, MCAD, NopSCADlib, Fonts) und die Roboto-Schriftart sind lokal im exportierten Hyperbook enthalten. Die CLI lädt sie beim ersten Build mit diesem Element herunter und speichert sie im Cache. Editor, Bibliotheken und Schriftart funktionieren ohne CDN-Verbindung.
Die openscad-Direktive bietet einen interaktiven OpenSCAD-Editor mit:
- einer Code-Ansicht,
- einer Parameter-Ansicht (JSON-Objekt, das auf
-D-Variablen gemappt wird), - und einer 3D-Vorschau.
Sie können das Modell rendern, den Code kopieren und als STL oder 3MF herunterladen.
Verwendung
Packen Sie OpenSCAD-Code in einen :::openscad-Block und verwenden Sie einen scad- (oder openscad-) Codeblock.
:::openscad
```scad
cube([20,20,20], center=true);
```
:::
Attribute
| Attribut | Beschreibung | Standard |
|---|---|---|
id |
Eindeutige ID für Persistenz | automatisch generiert |
main |
Die Datei, die gerendert wird | main.scad |
height |
Höhe des Editor-/Vorschau-Containers | calc(100dvh - 80px) |
library |
Kommaseparierte Liste von Bibliotheken, die in die OpenSCAD-Umgebung geladen werden sollen | keine |
files |
Was Leserinnen und Leser mit Dateien tun dürfen: create, upload, rename, delete, durch Kommas getrennt, oder open für alles |
upload |
accept |
Dateiendungen für Dateien, die Leserinnen und Leser anlegen oder umbenennen, durch Kommas getrennt | .scad |
Mögliche Bibliotheken sind: BOSL2, BOSL, MCAD, NopSCADlib, fonts
Code aus Datei laden
:::openscad
::file{path="main.scad" src="openscad/example.scad"}
:::
Mehrere Dateien
Weitere Dateien bekommen mit file="…" einen Namen und erscheinen als Tabs. Die Hauptdatei kann sie mit include oder use einbinden:
:::openscad
```scad
include <parts.scad>
part(10);
```
```scad file="parts.scad"
module part(s) { cube([s, s, s]); }
```
:::
Binärdateien in das OpenSCAD-Dateisystem laden
Verwenden Sie ::file-Zeilen innerhalb des :::openscad-Blocks, um Meshes, Bilder oder Schriftarten aus Ihrem Buch einzubinden. Sie liegen neben der Hauptdatei unter ihrem path:
:::openscad
::file{path="input/model.stl" src="models/model.stl"}
```scad
import("input/model.stl");
```
:::
Leserinnen und Leser können über den Tab ⤒ eigene Dateien hochladen; sie werden mit dem Modell im Browser gespeichert.
Relative Pfade in import() werden ebenfalls unterstützt und wie Typst-Assets aufgelöst (relativ zur aktuellen Seite). Beispiel:
:::openscad
```scad
import("./koala.svg", center=true);
```
:::
Beispiel mit Variablen
:::openscad
```scad
segments = 5;
size = 5;
height = 10;
rounded = 1;
label = "K";
$fn = segments;
module body(size, height, rounded) {
if (rounded) {
minkowski() {
cube([size, size, height], center=true);
sphere(r=1);
}
} else {
cube([size, size, height], center=true);
}
}
difference() {
body(size, height, rounded);
translate([0, 0, height / 2 + 0.1])
linear_extrude(height=1)
text(label, size=8, halign="center", valign="center");
}
```
:::
Beispiel mit Bibliothek
:::openscad{library="BOSL2"}
```scad
include <BOSL2/std.scad>
include <BOSL2/walls.scad>
$fn = 100;
rod_diameter = 12;
module bridge(width = 230, height = 80, rod_diameter = 12) {
pilar_width = height / 2;
pilar_height = height + 5;
middle_width = width - pilar_width * 2;
middle_thickness = max(rod_diameter, 19);
rod_diameter_plus_threshold = rod_diameter + 0.5;
module pilar() {
difference() {
cube([pilar_width, middle_thickness + 10, pilar_height], center=true);
rotate([90, 0, 0])
translate([0, 0, -middle_thickness/2])
cylinder(h=middle_thickness, d=rod_diameter_plus_threshold, center=true);
rotate([90, 0, 0])
translate([0, 0, middle_thickness/2])
cylinder(h=middle_thickness, d=rod_diameter_plus_threshold / 4, center=true);
translate([0, 0, pilar_height/2])
cylinder(h=rod_diameter_plus_threshold*2, d=rod_diameter_plus_threshold, center=true);
translate([0, 0, -pilar_height/2])
cylinder(h=rod_diameter_plus_threshold*2, d=rod_diameter_plus_threshold, center=true);
}
}
module middle() {
s = [[0, 0], [middle_width, 0], [middle_width, -height / 2 - 20], [middle_width - 20, -height / 2 - 10], [20, -height / 2 - 10], [0, -height / 2 - 20]];
rotate([90, 0, 0])
translate([0,2.5,0])
hex_panel(s, 2, 10, h=12, frame=5);
}
middle();
translate([-pilar_width / 2, 0, -height/2])
pilar();
translate([middle_width + pilar_width / 2, 0, -height/2])
pilar();
}
bridge(rod_diameter=rod_diameter);
```
:::
Dateien, die Leserinnen und Leser ändern dürfen
Mit files bekommen Leserinnen und Leser Knöpfe für eigene Dateien: + legt eine Datei an, ⤒ lädt eine hoch, und jeder Tab bekommt ✎ zum Umbenennen und × zum Löschen. rename und delete erlauben das auch für die Dateien der Seite; die Hauptdatei sowie readonly-, hidden- und Testdateien bleiben immer, wie sie geschrieben sind. Selbst angelegte oder hochgeladene Dateien dürfen Leserinnen und Leser immer umbenennen und löschen. Ein Klick auf den Tab einer Binärdatei zeigt eine Vorschau: Bilder, Audio und Video, PDFs, Schriftarten (TTF, OTF, WOFF) und 3D-Modelle (STL, OBJ), die sich drehen und zoomen lassen.
:::openscad{files="create,upload,rename,delete"}
...
:::
Umstieg von der alten Schreibweise
Ältere Bücher laden Dateien mit src="…" direkt am Element und mit @file dest="…" src="…"-Zeilen. Führen Sie in Ihrem Buch npx hyperbook migrate aus, um diese Seiten umzustellen; gespeicherte Modelle der Leserinnen und Leser bleiben dabei erhalten.