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();