//---------------------------------------------------------------------
//
// OpenSCAD-Script for mosaic grid 50x25mm with 2x4mm connectors
//
// derived from:
// https://github.com/MakeMagazinDE/OpenSCAD_Frontplatten/
//---------------------------------------------------------------------
//
// 2024-06-03 xsider    modified for 25mm grid M2 screws
//
//---------------------------------------------------------------------

//Moduldefinition mit Parametern für Frontplattensystem im 19mm-Raster
module FrontElem (
    //Frontplattenelement
    xwert=2,        //Anzahl der Segmente in horizontaler Richtung
    ywert=1,        //Anzahl der Segmente in vertikaler Richtung
    segment=25,   //Kantenlänge des Segments
    hght=3.0,       //Höhe des Rands des Frontplattensegments
    thick=2,      //verbleibende Dicke des Frontplattensegments
    wo=1.0,         //Wandstärke oben
    wu=2.0,         //Wandstärke unten
    splt = 0.05,     // Luftspalt
    //M2-Schrauben
    M2=true,       //Bohrungen für M3-Zylinderkopf-Inbusschraube
    skd3=4.3,       //Schraubenkopfdurchmesser M3-Schraube
    skh3=2,       //Schraubenkopfhöhe M3-Schraube
    dsh3=2.2,       //Schaftdurchmesser M3-Schraube
    dvst3=6.3,        //Verstärkung für M3-Schraube
    //Schneidschrauben 2mmx6mm
    B2mm=false,      //Bohrungen für 2mm-Schneidschrauben
    //Beschriftungsfeld eingesenkt

    Btext=6.2,      //Breite Beschriftungsband
    Ltext=30.2,       //Länge Beschriftungsband
    Dtext=0.2,      //Tiefe Beschriftungsfeld, oder Null

    TRSdia=8.0,     //Bohrung für Telefonbuchse 4mm BLK-Vollisiolierte KLemmen
    //MC-Einbaubuchse
)
//Beginn Modul
{
    difference()
    {   //difference 1
        union()
        {        //union 1
            difference()
            {   //difference 2
                union()
                {        //union 2
                    //alles, was vor der nächsten geschweiften Klammer steht, wird zusammengefügt (union 2)
                    //Körper des Frontplattensegments
                    cube([xwert*segment, ywert*segment, hght]);
                }               //union 2 end
                //alles, was vor der nächsten geschweiften Klammer steht, wird davon abgezogen (difference 2)
                //Einsenkung in das Segment
                polyhedron(
                               points= [[wu,wu,thick],                                  //0 unten
                                        [xwert*segment-wu,wu,thick],                    //1 unten
                                        [xwert*segment-wu,ywert*segment-wu,thick],      //2 unten
                                        [wu,ywert*segment-wu,thick],                    //3 unten
                                        [wo,wo,hght+0.01],                              //4 oben
                                        [wo,ywert*segment-wo, hght+0.01],               //5 oben
                                        [xwert*segment-wo,ywert*segment-wo,hght+0.01],  //6 oben
                                        [xwert*segment-wo,wo,hght+0.01],                //7 oben
                                       ],
                               faces=  [[0,1,2,3],      //Boden
                                        [0,4,7,1],      //Deckel
                                        [1,7,6,2],      //Front
                                        [2,6,5,3],      //Seitenwand rechts
                                        [3,5,4,0],      //Rückwand
                                        [4,5,6,7]]      //Seitenwand links
                               );   


                //Bohrung für 4mm-Telefonbuchse (Mindestgröße 1x1)
                translate([xwert*segment/2-(19/2),ywert*segment/2+3,-0.1])  cylinder(d=TRSdia, h=10, $fn=32);
                translate([xwert*segment/2+(19/2),ywert*segment/2+3,-0.1])  cylinder(d=TRSdia, h=10, $fn=32);
                translate([xwert*segment/2-Ltext/2,ywert*segment/2-9,thick-Dtext+0.05])  cube([Ltext, Btext, Dtext]); 
            }  //difference 2 end
            
            //alles, was vor der nächsten geschweiften Klammer steht, wird dazu hinzugefügt (union 1)
            //Verstärkungen für Schrauben x-Achse unten
            for (x=[0:segment:xwert*segment])
            {
                translate([x,0,0]) cylinder(d=dvst3,h=hght,$fn=16);
            }
            //Verstärkungen für Schrauben x-Achse oben
            for (x=[0:segment:xwert*segment])
            {
                translate([x,ywert*segment,0]) cylinder(d=dvst3,h=hght,$fn=16);
            }
            //Verstärkungen für Schrauben y-Achse links
            for (y=[0:segment:ywert*segment])
            {
                translate([0,y,0]) cylinder(d=dvst3,h=hght,$fn=16);
            }
            //Verstärkungen für Schrauben y-Achse rechts
            for (y=[0:segment:ywert*segment])
            {
                translate([xwert*segment,y,0]) cylinder(d=dvst3,h=hght,$fn=16);
            }
        }               //union 1 end
        
        //alles, was vor der nächsten geschweiften Klammer steht, wird davon wieder abgezogen (difference 1)
        //Bohrungen für Schrauben x-Achse unten
        for (x=[0:segment:xwert*segment])
        {
            translate([x,0,-0.1]) cylinder(d=dsh3,h=2*hght,$fn=16);
            translate([x,0,hght-skh3]) cylinder(d=skd3,h=2*hght,$fn=16);
        }
        //Bohrungen für Schrauben x-Achse oben
        for (x=[0:segment:xwert*segment])
        {
            translate([x,ywert*segment,-0.1]) cylinder(d=dsh3,h=2*hght,$fn=16);
            translate([x,ywert*segment,hght-skh3]) cylinder(d=skd3,h=2*hght,$fn=16);
        }
        //Bohrungen für Schrauben y-Achse links
        for (y=[0:segment:ywert*segment])
        {
            translate([0,y,-0.1]) cylinder(d=dsh3,h=2*hght,$fn=16);
            translate([0,y,hght-skh3]) cylinder(d=skd3,h=2*hght,$fn=16);
        }
        //Bohrungen für Schrauben y-Achse rechts
        for (y=[0:segment:ywert*segment])
        {
            translate([xwert*segment,y,-0.1]) cylinder(d=dsh3,h=2*hght,$fn=16);
            translate([xwert*segment,y,hght-skh3]) cylinder(d=skd3,h=2*hght,$fn=16);
        }
        //Abschneiden Verstärkungen unten
        translate([-250,-10,-0.1])
        cube([500,10,25]);
        //Abschneiden Verstärkungen oben
        translate([-250,ywert*segment,-0.1])
        cube([500,10,25]);
        //Abschneiden Verstärkungen links
        translate([-10,-250,-0.1])
        cube([10,500,25]);
        //Abschneiden Verstärkungen rechts
        translate([xwert*segment,-250,-0.1])
        cube([10,500,25]);
    }               //difference 1 end

}  //module end

//Hier werden Instanzen des Moduls aufgerufen
translate([0,0,0]) FrontElem();

