diff --git a/openscad/Fonts/CharGraphFont2.ttf b/openscad/Fonts/CharGraphFont2.ttf new file mode 100644 index 0000000..d68a391 Binary files /dev/null and b/openscad/Fonts/CharGraphFont2.ttf differ diff --git a/openscad/GoticFour.svg b/openscad/GoticFour.svg new file mode 100644 index 0000000..326ee55 --- /dev/null +++ b/openscad/GoticFour.svg @@ -0,0 +1,16 @@ + + + + + + + + \ No newline at end of file diff --git a/openscad/model.scad b/openscad/model.scad new file mode 100644 index 0000000..f9994aa --- /dev/null +++ b/openscad/model.scad @@ -0,0 +1,297 @@ +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(); + + diff --git a/openscad/readme.md b/openscad/readme.md new file mode 100644 index 0000000..cce22d7 --- /dev/null +++ b/openscad/readme.md @@ -0,0 +1,5 @@ +## Weiterführende Ressourcen + +- [OpenSCAD auf GitHub](https://github.com/openscad/openscad) - Für parametrische CAD-Modellierung mit Code +- [Fusion 360 Community](https://www.autodesk.com/community/fusion-360) +- [JLCPCB Dokumentation](https://jlcpcb.com/help) diff --git a/openscad/testmodel.scad b/openscad/testmodel.scad new file mode 100644 index 0000000..6ee9e86 --- /dev/null +++ b/openscad/testmodel.scad @@ -0,0 +1,21 @@ +clock_text_def = + "ESHISTRBALDFÜNFASTZEHNVIERTELSVORJNACHWHALBKOSECHSIEBEN-----------ZEHNEUNACHTDREIELFVIERZWÖLFÜNFACWIZWEINSAUHR"; + +module main() { + // HIER, innerhalb des Moduls, wird der -D-Wert sicher gesehen + clock_txt = + is_undef(ovclock_text) + ? clock_text_def + : ovclock_text; + + echo("SCAD-Script V0.1"); + echo(clock_text_default = clock_text_def); + echo(ovclock_text = ovclock_text); + echo(clock_txt = clock_txt); + + // ab hier clock_txt verwenden + // z.B.: + // text(clock_txt, size = 10); +} + +main();