//Parametric L Bracket
//You can make this any length, Width, Height & Thickness you want
//You can also have 1, 2 or 4 screws on each leg of the L
//8/19/2015 By: David Bunch
//
//Revised 8/20/2015 to make rounded ends instead of chamfers
//                  and more flexibility on screws
//CUSTOMIZER VARIABLES

/* [Basic Dimensions] */

//1. Length of Part along 1st L
Len = 1.75*25.4;           //[25:1:75]

//2. Width of L along 2nd L
Wid = 0.65*25.4;           //[25:1:75]

//3. Height of L Bracket
Ht = 1*25.4;            //[20:1:75]

//4. Thickness of Leg along X-Axis
Thk_X = 0.25*25.4;          //[2:.5:12]

//5. Thickness of Leg along Y-axis
Thk_Y = 0.5*25.4;          //[2:.5:12]

//6. Weld Diameter at L junction
WeldDia = 0.5*25.4;        //[2:.5:12]

//7. Round Corners (0 = No, 1 = Yes)
RndON = 1;          //[0:No, 1:Yes]

//8. # of parts to make (1,2,3 or 4)
Parts = 1;                      //[1:1:4]

/* [Hole Sizes] */

//9. Hole Diameter for Screws (#8 screw default)
HoleSize = 3;                //[0:#6, 1:#8, 2:#10, 3:3mm, 4:4mm, 5:5mm, 6:6mm]
                            //#10 Screws are 4.5 measured
                            //#8 Screws are 4.2 measured
                            //#6 Screws are 3.4 measured

//10. Taper or Countersink Hole
Tap_CnkSnk = 1;             //[0:None, 1:Tapered, 2:Counter Sink]

//11. Drill Hole Tolerance
Tolerance = .1;           //[0:.05:.8]

/* [Hole Offsets] */
//12. 1st Hole Offset distance from end of X-Axis
HoleOffset_X1 = 10;         //[6:.5:30]

//13. 2nd Hole Offset distance from 1st Hole of X-Axis
HoleOffset_X2 = 10;         //[6:.5:30]

//14. 1st Hole Offset distance from end of Y-Axis
HoleOffset_Y1 = 0.5*25.4;         //[6:.5:30]

//15. 2nd Hole Offset distance from 1st Hole of Y-Axis
HoleOffset_Y2 = 10;         //[6:.5:30]

/* [Number of Holes] */
//16. # of Screws on each side of L (1 or 2)
Screws_X = 2;                 //[1:One Screw, 2:Two Screws]

//17. # of Screws on each side of L (1 or 2)
Screws_Y = 1;                 //[1:One Screw, 2:Two Screws]

//18. # of Screws along Height of L on X-Axis (1 or 2)
Screws_ZX = 1;                 //[1:One Screw, 2:Two Screws]

//19. # of Screws along Height of L on Y-Axis (1 or 2)
Screws_ZY = 1;                 //[1:One Screw, 2:Two Screws]

//20. Screw Height (I use 3/4" screws for default)
ScrewHt = 19.0;                //[9.5:.5:38]

//CUSTOMIZER VARIABLES END

//HoleSize = 4.2;             //[#6:3.4, #8:4.2, #10:4.5, 3mm:3, 4mm:4, 5mm:5, 6mm:6]
//                            //#10 Screws are 4.5 measured
//                            //#8 Screws are 4.2 measured
//                            //#6 Screws are 3.4 measured
//
////10. Taper or Countersink Hole
//Tap_CnkSnk = 1;             //[0:None, 1:Tapered, 2:Counter Sink]
//
////11. Dia. of Taper Head of Screw (#8 used for default)
//TaperDia = 7.9;             //[6.45:#6, 7.95:#8, 9.0:#10, 6:3mm, 4mm:8, 5mm:10, 6mm:12]
A_Hole_OD = [3.4,4.2,4.5,3,4,5,6];
A_Head_OD = [6.45,7.95,9,6,8,10,12];
A_TaperLen =  [2.66,3.5,3.9,3,4.2,5.5,6.5];

HoleOD = A_Hole_OD[HoleSize] + Tolerance;      //Calculated Hole Diameter
TapOD = A_Head_OD[HoleSize] + Tolerance;       //Calculated Tapered Head Diameter
TaperLen = A_TaperLen[HoleSize];
WeldRad = WeldDia / 2;              //Radius of Weld

//Calcs for Hole(s) along X axis
Ht2ZX = Ht / (Screws_ZX + 1);       //Half Height or 1/3 height if 2 screws are used
echo("Ht2ZX = ", Ht2ZX);
H_X = (Len - Thk_Y - WeldRad) / (Screws_X + 1);
echo("H_X = ",H_X);
//Hole_X =  H_X + Thk_Y + WeldRad;
Hole_X1 =  Len - HoleOffset_X1;
Hole_X2 =  Hole_X1 - HoleOffset_X2;
echo("Hole_X1 = ",Hole_X1);
//Hole_X2 = Hole_X1 + H_X;
echo("Hole_X2 = ",Hole_X2);
//
//Calcs for Hole(s) along Y axis
Ht2ZY = Ht / (Screws_ZY + 1);       //Half Height or 1/3 height if 2 screws are used
echo("Ht2ZY = ", Ht2ZY);
H_Y = (Wid - Thk_X - WeldRad) / (Screws_Y + 1);
echo("H_Y = ",H_Y);
//Hole_Y = H_Y + Thk_X + WeldRad;
Hole_Y1 =  Wid - HoleOffset_Y1;
Hole_Y2 =  Hole_Y1 - HoleOffset_Y2;
echo("Hole_Y = ",Hole_Y1);
//Hole_Y2 = Hole_Y + H_Y;
echo("Hole_Y2 = ",Hole_Y2);
//
ScrewThreadHt = ScrewHt - TaperLen;
Ht2x = Ht * 2;
Ht_Half = Ht / 2;
Ires = round(((Ht * 3.14) / 4) / .8) * 4;
Hole_Res = round(((TapOD * 3.14) / 4) / 1) * 4;
echo(Hole_Res = Hole_Res);
module DrawSrewCut()
{
//This combines the head to the screw
    if (Tap_CnkSnk == 0)
    {
        cylinder(d=HoleOD,h=ScrewThreadHt,$fn=Hole_Res);

    } else if (Tap_CnkSnk == 1)
    {
        union()
        {
            cylinder(d1=TapOD,d2=HoleOD,h=TaperLen,$fn=Hole_Res);
            cylinder(d=HoleOD,h=ScrewThreadHt,$fn=Hole_Res);
        }
    } else if (Tap_CnkSnk == 2)
    {
        union()
        {
            cylinder(d=TapOD,h=TaperLen,$fn=Hole_Res);
            cylinder(d=HoleOD,h=ScrewThreadHt,$fn=Hole_Res);
        }
    }
}
module LBracket()
{
    union()
    {
        cube([Len,Thk_X,Ht]);         //Draw the X axis side
        cube([Thk_Y,Wid,Ht]);         //Draw the Y axis side
        translate([Thk_Y,Thk_X,0])
        cylinder(d=WeldDia,h=Ht,$fn=4);     //Add the Weld
    }
}
module RndCorner_XY()
{
    difference()
    {
        cylinder(d=Ht2x,h=Thk_X+Thk_Y,$fn=Ires);
        translate([0,0,-1])
        cylinder(d=Ht,h=Thk_X+Thk_Y+2,$fn=Ires);
        translate([-(Ht2x+2),-(Ht+1),-1])
        cube([Ht2x+2,Ht2x+2,Thk_X+Thk_Y+2]);
    }
}
module Screws_X()
{
//Drill holes for Screws along the X axis
    translate([Hole_X1,Thk_X+.02,Ht2ZX])
    rotate([90,0,0])
    DrawSrewCut();
    if (Screws_X == 2)
    {
        translate([Hole_X2,Thk_X+.02,Ht2ZX])
        rotate([90,0,0])
        DrawSrewCut();
    }
}
module Screws_Y()
{
//Drill holes for Screws along the Y axis
    translate([Thk_Y+.02,Hole_Y1,Ht2ZY])
    rotate([0,-90,0])
    DrawSrewCut();
    if (Screws_Y == 2)
    {
        translate([Thk_Y+.02,Hole_Y2,Ht2ZY])
        rotate([0,-90,0])
        DrawSrewCut();
    }
}
module DrawL()
{
    rotate([90,0,0])
    difference()
    {
        LBracket();
        Screws_X();
        if (Screws_ZX == 2)
        {
            translate([0,0,Ht2ZX])
            Screws_X();
        }
        Screws_Y();
        if (Screws_ZY == 2)
        {
            translate([0,0,Ht2ZY])
            Screws_Y();
        }
        if (RndON == 1)
        {
//Round the X-Axis Corner
            translate([Len-Ht_Half,-1,Ht_Half])
            rotate([-90,0,0])
            RndCorner_XY();
//Round the Y-Axis Corner
            translate([-1,Wid-Ht_Half,Ht_Half])
            rotate([90,0,90])
            RndCorner_XY();
        }
//The following section is only for visual checks of how far screws go into wood
//These will not draw on final render
        translate([0,-12.7,0])
        %cube([Hole_X1,12.7,38.1]);          //Check how far screw goes into 1/2" wood
        translate([-19.02,0,0])
        %cube([19.02,Hole_Y1,38.1]);         //Check how far screw goes into 3/4" wood
        if (Tap_CnkSnk != 0)
        {
            translate([Hole_X1,Thk_X + 2 + TaperLen,Ht2ZX])
            rotate([90,0,0])
            color("red")
            %DrawSrewCut();
            translate([Thk_Y+2+TaperLen,Hole_Y1,Ht2ZY])
            rotate([0,-90,0])
            color("red")
            %DrawSrewCut();
        }
    }
}
//Draw how ever many parts user wants along the Y-Axis
for ( i = [1 : Parts] )
{
    translate([0,(Ht+6) * i,0])
    DrawL();
}

