Hyperbook Dokumenation

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);
```
 
:::
Vorschau
Parameter
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");
}
```
 
:::
Vorschau
Parameter
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);
```
 
:::
Vorschau
Parameter
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.

OpenSCAD

Teilbare URL erstellen

Abschnitte auswählen

✎ GitHub© Copyright 2026 by OpenPatch