14. Externe scad Dateien

Bleiben wir beim Schachbrettbeispiel: Es fehlen noch die Figuren pferd(), lauf(), dame() und king(). Diese werden ebenfalls in Modulen definiert und – wie bauer() und turm() – auf dem Brett platziert.

druckansicht

Zunächst sind nur stark vereinfachte Figuren hinterlegt. Alle Figuren – einschließlich des bauer() – werden über x- und y-Feld positioniert.

//----------------------------------------
module bauer(x,y,farbe) {
  translate([(x-1)*feld+feld/2,(y-1)*feld+feld/2,dick]) {
    color(farbe) {
      union(){
        // Boden
        linear_extrude(skale*3)
          circle(skale*5.5);
        // Kegel
        translate([0,0,skale*2.9]) {
          cylinder(skale*12,skale*5.5,skale*3);
        }
        // Kugel
        translate([0,0,skale*18.5]) {
          sphere(r = skale*4.9);
        }
      }
    }
  }
}

Alle fehlenden Figuren:

//----------------------------------------
module pferd(x,y,farbe) {
  translate([(x-1)*feld+feld/2,(y-1)*feld+feld/2,dick+skale*10]) {
    color(farbe) {
      cube([skale*5.5,skale*10,skale*20],true);
    }
  }
}
//----------------------------------------
module lauf(x,y,farbe) {
  translate([(x-1)*feld+feld/2,(y-1)*feld+feld/2,dick]) {
    color(farbe) {
      // Boden
      linear_extrude(skale*3)
        circle(skale*5.5);
      // Kegel
      translate([0,0,skale*2.9]) {
        cylinder(skale*18,skale*5.5,skale*2);
      }
    }
  }
}
//----------------------------------------
module dame(x,y,farbe) {
  translate([(x-1)*feld+feld/2,(y-1)*feld+feld/2,dick]) {
    color(farbe) {
      // Boden
      linear_extrude(skale*3)
        circle(skale*5.5);
      // Kegel
      translate([0,0,skale*2.9]) {
        cylinder(skale*25,skale*5.5,skale*2);
      }
    }
  }
}
//----------------------------------------
module king(x,y,farbe) {
  translate([(x-1)*feld+feld/2,(y-1)*feld+feld/2,dick]) {
    color(farbe) {
      // Kegel
      translate([0,0,skale*2.9]) {
        cylinder(skale*28,skale*5.5,skale*5.5);
      }
    }
  }
}

Unsere Datei enthält nun alle Figuren samt Schachbrett und die Grundaufstellung. Wie wäre es aber mit der Italienischen Eröffnung?

druckansicht

Der angepasste Code:

schachbrett();
// Italienische Eröffnung
bauer(1,2,"white");
bauer(2,2,"white");
bauer(3,2,"white");
bauer(4,2,"white");
bauer(5,4,"white");
bauer(6,2,"white");
bauer(7,2,"white");
bauer(8,2,"white");
turm(1,1,"white");
turm(8,1,"white");
pferd(2,1,"white");
lauf(3,1,"white");
dame(4,1,"white");
king(5,1,"white");
lauf(3,4,"white");
pferd(6,3,"white");

bauer(1,7,"dimgray");
bauer(2,7,"dimgray");
bauer(3,7,"dimgray");
bauer(4,7,"dimgray");
bauer(5,5,"dimgray");
bauer(6,7,"dimgray");
bauer(7,7,"dimgray");
bauer(8,7,"dimgray");
turm(1,8,"dimgray");
turm(8,8,"dimgray");
pferd(3,6,"dimgray");
lauf(3,8,"dimgray");
dame(4,8,"dimgray");
king(5,8,"dimgray");
lauf(6,8,"dimgray");
pferd(7,8,"dimgray");

Wenn wir verschiedene Eröffnungen als OpenSCAD-Dateien erstellen möchten, ist es sinnvoll, in jeder Datei nur die jeweilige Figurenaufstellung zu definieren. Die Module für die einzelnen Figuren sowie das Schachbrett selbst sollten in einer separaten Datei abgelegt werden.

Auf diese Weise können wir später auch aufwendigere Damen oder Könige implementieren — wir müssten dann lediglich die gewünschte Eröffnungsdatei laden und neu rendern. Alle Eröffnungsdateien greifen dann auf dieselbe Figuren-Datei zu.

14.1 Vorbereiten der Dateien

Der gesamte Code soll nun in zwei separate Dateien aufgeteilt werden:

1. Die Hauptdatei nenne ich Italienische_Eroeffnung.scad. Speichere die aktuell geöffnete Datei unter diesem Namen.2. Speichere dieselbe Datei anschliessend nochmals unter dem Namen figuren_library.scad.

⚠️ Achtung: Nach dem Speichern heißt die aktuell geladene Datei nun figuren_library.scad. Lade daher Italienische_Eroeffnung.scad erneut, um beide Dateien parallel im Editor zu haben. Im OpenSCAD-Editor erscheinen nun zwei Reiter — achte darauf, in welcher Datei du gerade arbeitest!

Entferne nun den gesamten Code für die Figuren und das Brett aus Italienische_Eroeffnung.scad. Alternativ kannst du den Code vorerst einfach auskommentieren, z. B. mit /∗ ... ∗/. So bleibt nichts verloren.

Im Beispiel ist das Modul dame() auskommentiert — der Code wird im Editor grün dargestellt, was auf einen Kommentar hinweist.

/*
module dame(x,y,farbe) {
  translate([(x-1)*feld+feld/2,(y-1)*feld+feld/2,dick]) {
    color(farbe) {
      // Boden
      linear_extrude(skale*3)
        circle(skale*5.5);
      // Kegel
      translate([0,0,skale*2.9]) {
        cylinder(skale*25,skale*5.5,skale*2);
      }
    }
  }
}
*/

Die Hauptdatei enthält nun ausschliesslich die Aufstellung der Figuren.

Wechseln wir zur Datei figuren_library.scad: Dort können wir die gesamte Figurenaufstellung löschen (oder auskommentieren). Die Konstanten am Anfang der Datei — wie z. B. Feldgröße oder Brettmaße — benötigen wir jedoch weiterhin. Anschließend kehren wir zur Hauptdatei zurück.

14.2 Externe Dateien laden mit use

OpenSCAD bietet eine einfache Methode, externe Dateien in die Hauptdatei einzubinden. Danach können alle Module aus der externen Datei von der Hauptdatei aus aufgerufen werden.

Im Kopfbereich der Hauptdatei wird dazu der Befehl use <pfad/zur/datei.scad> verwendet — also use gefolgt vom Pfad in spitzen Klammern.

use <G:/3d/OpenSCAD/Verschiedenes/Schach/figuren_library.scad>;

//----------------------------------------
schachbrett();
// Italienische Eröffnung
bauer(1,2,"white");
...
...

Nun sollte alles wie gehabt funktionieren. Sollten Fehlermeldungen erscheinen, überprüfe und passe die entsprechenden Zeilen an.

Wenn alles korrekt läuft, kannst du die Hauptdatei bereinigen — also alle auskommentierten Bereiche löschen. In der Hauptdatei benötigst du auch keine Konstanten mehr am Anfang; diese können ebenfalls entfernt werden.

Die beiden Dateien Italienische_Eroeffnung.scad und figuren_library.scad sind im Anhang aufgelistet.

Es können auch mehrere use-Aufrufe in einer OpenSCAD-Datei verwendet werden. Auf diese Weise lassen sich wiederverwendbare Bibliotheken erstellen, die in verschiedenen Projekten einfach eingebunden und genutzt werden können.