298 lines
8.7 KiB
OpenSCAD
298 lines
8.7 KiB
OpenSCAD
clock_text_default =
|
|
"ESHISTRBALDFÜNFASTZEHNVIERTELSVORJNACHWHALBKOSECHSIEBEN-----------ZEHNEUNACHTDREIELFVIERZWÖLFÜNFACWIZWEINSAUHR";
|
|
|
|
echo("SCAD-Script V0.1");
|
|
echo(clock_text_default = clock_text_default);
|
|
echo(clock_text_override = clock_text_override);
|
|
|
|
echo(thickness_override = thickness_override);
|
|
echo(frame_override = frame_override);
|
|
|
|
$fn = 120; // number of fragments. usually 0. >100 not advisable.
|
|
|
|
// Parameter
|
|
panel_length = 178.5;
|
|
panel_width = 178.5;
|
|
frame_thickness = 0.5;
|
|
|
|
echo(panel_length = panel_length);
|
|
echo(panel_width = panel_width);
|
|
|
|
|
|
FontFaktor = 22;
|
|
cols = 11;
|
|
rows = 10;
|
|
|
|
// texts and minute holes
|
|
use <./Fonts/CharGraphFont2.ttf>;
|
|
Font = "WordclockFont2:style=Regular";
|
|
FONT = "WordclockFontBold:style=Regular";
|
|
// fp_size = [panel_length, panel_width, panel_thickness];
|
|
// Font_size = fp_size/FontFaktor; // 8 seems to be a good value
|
|
Font_size_min = 8;
|
|
Font_size_max = 8;
|
|
|
|
// shift everything down by a bit:
|
|
tanslatedown = 4;
|
|
|
|
min_hole_dia = 3;
|
|
|
|
// minute LEDs spacing on the strip
|
|
minute_led_period = 2;
|
|
|
|
// LED Strips
|
|
led_distance = 13.9;
|
|
led_distance_min_holes = minute_led_period*(led_distance);
|
|
|
|
// this is special because the PCB has already been built and the entire set of letters and minute LEDs
|
|
// needs to fit into a centered square which is 11 x 11 pixels
|
|
textarea = [(cols-1)*led_distance, (cols-1)*led_distance];
|
|
|
|
// vertical position of 4 minutes LEDs
|
|
//row below the letters...
|
|
min_row_fp = (panel_width-textarea[1])/2 + textarea[1]/(cols-1) - textarea[1]/(cols-1) ;
|
|
|
|
|
|
// Template
|
|
//clock_text = "
|
|
//ESHISTAFÜNF
|
|
//ZEHNVIERTEL
|
|
//VORBALDNACH
|
|
//HALBIZWEINS
|
|
//DG6MSMARTIN
|
|
//DREINSIEBEN
|
|
//ELFZWÖLFÜNF
|
|
//USECHSVIERQ
|
|
//ZEHNEUNACHT
|
|
//RWDFACWEUHR";
|
|
|
|
module GoticFour()
|
|
{
|
|
difference() {
|
|
scale([9/1078.2, 9/1078.2, 0])
|
|
import("/app/scripts/GoticFour.svg",
|
|
center = true, dpi = 25.4, $fn = 120);
|
|
// Schräge Gerade zum Unterbrechen
|
|
rotate([0, 0, 36]) // 60° Winkel der Geraden
|
|
translate([1.4, 1.2, 0])
|
|
square([2, 0.8]); // Rechteck als "Gerade"
|
|
}
|
|
}
|
|
|
|
module LettersAndMinutes2D()
|
|
{
|
|
// hier wird clock_text zur Renderzeit aus Default/Override gebaut
|
|
clock_text =
|
|
is_undef(clock_text_override)
|
|
? clock_text_default
|
|
: clock_text_override;
|
|
|
|
echo(clock_text = clock_text);
|
|
// the letterblock
|
|
|
|
echo("-------> horizontal pitch = ",textarea[0]/(cols-1));
|
|
echo("-------> vertical pitch = ",textarea[1]/(cols-1));
|
|
|
|
|
|
// alles ein bisschen nach unten schieben
|
|
|
|
translate([0,-tanslatedown])
|
|
{
|
|
translate([(panel_length-textarea[0])/2, (panel_width-textarea[1])/2,0])
|
|
{
|
|
//square(size = [textarea[0],textarea[1]], center = false);
|
|
for (col=[0:cols-1])
|
|
{
|
|
for (row=[0:rows-1])
|
|
{
|
|
letter = clock_text[row*cols+col];
|
|
|
|
variable_font_size = Font_size_min + (row/(rows-1))*(Font_size_max-Font_size_min);
|
|
|
|
translate([col * textarea[0]/(cols-1), (cols-1-row) * textarea[1]/(cols-1), 0])
|
|
if (letter == "&")
|
|
{
|
|
difference() {
|
|
text(letter, font=Font, size=variable_font_size, halign= "center", valign="center");
|
|
// Schräge Gerade zum Unterbrechen
|
|
rotate([0, 0, 60]) // 60° Winkel der Geraden
|
|
{
|
|
translate([-20, 0.4, 0])
|
|
square([18, 1]); // Rechteck als "Gerade"
|
|
translate([2, 0.4, 0])
|
|
square([20, 1]); // Rechteck als "Gerade"
|
|
}
|
|
}
|
|
}
|
|
else if (letter == ".")
|
|
{
|
|
translate([0, -3.3, 0]) // negative Y-Verschiebung nach unten
|
|
circle(min_hole_dia/5);
|
|
}
|
|
else if (letter == "W")
|
|
{
|
|
scale([0.9, 1.0]) text(letter, font=Font, size=variable_font_size, halign= "center", valign="center");
|
|
}
|
|
else if (letter == "Q")
|
|
{
|
|
translate([0,-0.4,0]) text(letter, font=Font, size=variable_font_size, halign= "center", valign="center");
|
|
}
|
|
else if (letter == "Ä" || letter == "Ö" || letter == "Ü")
|
|
{
|
|
translate([0,0.6,0]) text(letter, font=Font, size=variable_font_size, halign= "center", valign="center");
|
|
}
|
|
else if (letter == "0")
|
|
{
|
|
difference() {
|
|
text(letter, font=Font, size=variable_font_size, halign= "center", valign="center");
|
|
// Schräge Gerade zum Unterbrechen
|
|
rotate([0, 0, 60]) // 60° Winkel der Geraden
|
|
translate([-4, -1, 0])
|
|
square([40, 1]); // Rechteck als "Gerade"
|
|
}
|
|
}
|
|
else if (letter == "4")
|
|
{
|
|
difference() {
|
|
text(letter, font=Font, size=variable_font_size, halign= "center", valign="center");
|
|
// Schräge Gerade zum Unterbrechen
|
|
rotate([0, 0, 60]) // 60° Winkel der Geraden
|
|
translate([-0.5, -0.33, 0])
|
|
square([10, 1]); // Rechteck als "Gerade"
|
|
}
|
|
}
|
|
else if (letter == "6")
|
|
{
|
|
difference() {
|
|
text(letter, font=Font, size=variable_font_size, halign= "center", valign="center");
|
|
// Schräge Gerade zum Unterbrechen
|
|
rotate([0, 0, 91]) // 60° Winkel der Geraden
|
|
translate([-0.6, 0.42, 0])
|
|
square([1.7, 1]); // Rechteck als "Gerade"
|
|
}
|
|
}
|
|
else if (letter == "8")
|
|
{
|
|
difference() {
|
|
text(letter, font=Font, size=variable_font_size, halign= "center", valign="center");
|
|
// Schräge Gerade zum Unterbrechen
|
|
rotate([0, 0, 50]) // 60° Winkel der Geraden
|
|
translate([1, 0.1, 0])
|
|
square([5, 1]); // Rechteck als "Gerade"
|
|
rotate([0, 0, 50]) // 60° Winkel der Geraden
|
|
translate([-5, -1, 0])
|
|
square([5, 1]); // Rechteck als "Gerade"
|
|
}
|
|
}
|
|
else if (letter == "9")
|
|
{
|
|
difference() {
|
|
text(letter, font=Font, size=variable_font_size, halign= "center", valign="center");
|
|
// Schräge Gerade zum Unterbrechen
|
|
rotate([0, 0, 90]) // 60° Winkel der Geraden
|
|
translate([-1.0, -1.6, 0])
|
|
square([2, 1]); // Rechteck als "Gerade"
|
|
}
|
|
}
|
|
else if (letter == "x")
|
|
{
|
|
GoticFour();
|
|
}
|
|
else
|
|
{
|
|
text(letter, font=Font, size=variable_font_size, halign= "center", valign="center");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// the 4 minute holes
|
|
echo("-------> distance last letter row to minutes row = ", (panel_width-textarea[1])/2 + ( textarea[1]/(cols-1) ) - min_row_fp);
|
|
|
|
translate([panel_length/2 - 3*led_distance_min_holes/2, min_row_fp,0])
|
|
{
|
|
for (i=[0:3])
|
|
translate([i*led_distance_min_holes,0,0]) circle(min_hole_dia/2);
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
module frontpanel_2d() {
|
|
difference()
|
|
{
|
|
// adding in
|
|
union()
|
|
{
|
|
square([panel_length, panel_width], center = false);
|
|
}
|
|
// subtracting
|
|
union()
|
|
{
|
|
LettersAndMinutes2D();
|
|
}
|
|
}
|
|
}
|
|
|
|
module FrontPanel3D(panel_thickness) {
|
|
linear_extrude(panel_thickness)
|
|
frontpanel_2d();
|
|
}
|
|
|
|
module RaisedFrameOuter(frame_height, panel_thickness) {
|
|
translate([0,0,-frame_height])
|
|
linear_extrude(frame_height+panel_thickness)
|
|
difference() {
|
|
offset(delta = +frame_thickness) frontpanel_2d();
|
|
frontpanel_2d();
|
|
union()
|
|
{
|
|
LettersAndMinutes2D();
|
|
}
|
|
}
|
|
}
|
|
*/
|
|
|
|
module panel_plain_2d() {
|
|
square([panel_length, panel_width], center = false);
|
|
}
|
|
|
|
module frontpanel_2d() {
|
|
difference() {
|
|
panel_plain_2d(); // Platte
|
|
LettersAndMinutes2D(); // Buchstaben und Minutenlöcher ausschneiden
|
|
}
|
|
}
|
|
|
|
module FrontPanel3D(panel_thickness) {
|
|
linear_extrude(panel_thickness)
|
|
frontpanel_2d(); // -> Platte MIT ausgeschnittenen Buchstaben
|
|
}
|
|
|
|
module RaisedFrameOuter(frame_height, panel_thickness) {
|
|
translate([0,0,-frame_height])
|
|
linear_extrude(frame_height + panel_thickness)
|
|
difference() {
|
|
offset(delta = +frame_thickness) panel_plain_2d();
|
|
panel_plain_2d();
|
|
LettersAndMinutes2D(); // optional, für Freistellungen im Rahmen
|
|
}
|
|
}
|
|
|
|
module main() {
|
|
panel_thickness =
|
|
is_undef(thickness_override) ? 0.8 : thickness_override;
|
|
frame_height =
|
|
is_undef(frame_override) ? 11 : frame_override;
|
|
|
|
rotate([180, 0, 180])
|
|
union() {
|
|
FrontPanel3D(panel_thickness); // enthält die Buchstaben
|
|
RaisedFrameOuter(frame_height, panel_thickness);
|
|
}
|
|
}
|
|
|
|
main();
|
|
|
|
|