CharGraph-CAD/openscad/model.scad
2026-01-26 01:39:16 +01:00

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