//mode = "exploded"; mode = "assembled"; //mode = "cut_layout"; Scale = 1; precision = 36; thickness = 14.6; Tool_diam = 6; //Scale_mat_thx = 2.8; //Scale = Scale_mat_thx / thickness; BoundingBoard_W = 650; BoundingBoard_H = 880; Seat_H1 = 520; Seat_H2 = 500; FrontEdge_W = 420; BackRest_dx = 140; BackRest_dy = 50; BackRest2_dy = 150; BackRest_H = 75; BackCurve_R = BoundingBoard_W * 0.8; BackRest_EntryAngle = 60; BackRest_L = 600; BackRestGroove_thk = thickness * (1 + (cos(BackRest_EntryAngle)/sin(BackRest_EntryAngle))); BackFoot_dx = 130; ForeFoot_dx = 40; FootPrint_L = 50; Seat_tenon = 40; Front_to_X = (sqrt(2)/2)*FrontEdge_W; Elipse_CutOffW = BoundingBoard_W - BackFoot_dx - ForeFoot_dx; //variables to figure out... Elipse_W_adj = 50; ElipsAngle = asin(((BoundingBoard_W/2)-Front_to_X)/Seat_H1); ElipsAngle = asin(BackFoot_dx/BoundingBoard_H); Elipse_W = BoundingBoard_W - Elipse_W_adj; ElipseScale = Seat_H2 / (cos(asin(Elipse_CutOffW/Elipse_W))*(Elipse_W/2)); Elipse_H = Elipse_W * ElipseScale; BackRestAngle = 90 + ElipsAngle; Arch_H = 380; Arch_W = BoundingBoard_W - BackFoot_dx - ForeFoot_dx - (FootPrint_L*2); ArchScale = (Arch_H*2)/Arch_W; FtSupport_diam = Arch_W; SeatAngle = asin(((Seat_H1-Seat_H2)/2)/Front_to_X); Floor_to_Ass = Seat_H1 - (Front_to_X*sin(SeatAngle)); Ass_support = Floor_to_Ass - Arch_H; Floor_to_X = Floor_to_Ass - (Ass_support/2); SeatBoard_diag = (BoundingBoard_W - BackRest_dx) / cos(SeatAngle); SeatSupport_diag = SeatBoard_diag - (Seat_tenon*2); SnapGroove_offset = Ass_support/4; Seat_sizeAdj = thickness * (sqrt(2)/4); Seat_FrontLip = 60; Seat_LipRadius = 900; Seat_FrontCorner = FrontEdge_W/2 + Seat_sizeAdj+Seat_FrontLip; Seat_BackCorner = ((SeatBoard_diag - Front_to_X) * (sqrt(2)/2)) + Seat_sizeAdj; Support_centerR = Arch_W/3; Support_LockRndD = 88; SnapWedge = 16; // NOT USED - - V V V SeatBoard_depth = SeatBoard_diag * (sqrt(2)/2); //echo(Front_to_X*sin(SeatAngle)); //echo("Floor_to_Ass: ",Floor_to_Ass); //echo("Floor_to_X: ",Floor_to_X); //echo("Front_to_X: ",Front_to_X); //echo("ElipseScale: ",ElipseScale); //echo("ElipseAngle: ",ElipsAngle); //echo("Arch_W: ",Arch_W); echo("BackRestGroove_thk : ",BackRestGroove_thk ); echo("Ass_support : ",Ass_support ); LapSquare = SeatBoard_diag; module Mickey (direction, offsetMk, thk, Mk_Angle) { //rotate (Mk_Angle) //translate (offsetMk) if (direction == "down") { { rotate (Mk_Angle) translate (offsetMk) translate ([thk/2-(Tool_diam/sqrt(2)/2),Tool_diam/sqrt(2)/2]) circle(Tool_diam/2, center=true); rotate (Mk_Angle) translate (offsetMk) translate ([-thk/2+(Tool_diam*sqrt(2)/2)/2,Tool_diam/sqrt(2)/2]) circle(Tool_diam/2, center=true); } } if (direction == "up") { { rotate (Mk_Angle) translate (offsetMk) translate ([(thk-Tool_diam*sqrt(2)/2)/2,-Tool_diam/sqrt(2)/2]) circle(Tool_diam/2, center=true); rotate (Mk_Angle) translate (offsetMk) translate ([(-thk+Tool_diam*sqrt(2)/2)/2,-Tool_diam/sqrt(2)/2]) circle(Tool_diam/2, center=true); } } if (direction == "R") { { rotate (Mk_Angle) translate (offsetMk) translate ([-(Tool_diam/sqrt(2)/2),thk/2-Tool_diam/sqrt(2)/2]) circle(Tool_diam/2, center=true); rotate (Mk_Angle) translate (offsetMk) translate ([(-Tool_diam*sqrt(2)/2)/2,-thk/2+Tool_diam/sqrt(2)/2]) circle(Tool_diam/2, center=true); } } if (direction == "L") { { rotate (Mk_Angle) translate (offsetMk) translate ([(Tool_diam/sqrt(2)/2),thk/2-Tool_diam/sqrt(2)/2]) circle(Tool_diam/2, center=true); rotate (Mk_Angle) translate (offsetMk) translate ([(Tool_diam*sqrt(2)/2)/2,-thk/2+Tool_diam/sqrt(2)/2]) circle(Tool_diam/2, center=true); } } } module Mickeyzzz (direction, offsetMk, thk, Mk_Angle) { rotate (Mk_Angle) //translate (offsetMk+[(thk-Tool_diam*sqrt(2)/2)/2,+Tool_diam/sqrt(2)/2]) translate (offsetMk) translate ([-(Tool_diam/sqrt(2)/2),thk/2-Tool_diam/sqrt(2)/2]) circle(Tool_diam/2, center=true); rotate (Mk_Angle) translate (offsetMk) translate ([(-Tool_diam*sqrt(2)/2)/2,-thk/2+Tool_diam/sqrt(2)/2]) circle(Tool_diam/2, center=true); } module Mortise (M_angle, offset, M_height, M_width, corr) { rotate (M_angle) translate (offset) square([M_height,M_width], center = true); Mickey ("R", offset+[M_height/2,0], M_width, M_angle); Mickey ("L", offset-[M_height/2,0], M_width, M_angle); } //ElipseMask trim ---- V V V extremely UGLY series of patches... module ElipseMask () { union () { //translate([0,0]) //translate([0,(BoundingBoard_H/2)-((Seat_H1+Seat_H2)/2)]) //translate([-Elipse_W_adj/2,-Ass_support/2]) //rotate(-ElipsAngle) //scale([1,ElipseScale]) difference () { translate([-18,-18]) rotate(-8.5) scale([1,2.7777]) circle($fn=precision, r=Elipse_W/2, center=true); translate([BoundingBoard_W/2,0])square([BoundingBoard_W/2,BoundingBoard_H], center=true); } translate([30,-60]) scale([1,2.7777]) circle($fn=precision, r=Elipse_W/2, center=true); } } //Arch cut-off ---- V V V module Arch_X () { translate ([0, Floor_to_X]) scale([1,ArchScale]) //translate ([0,Arch_H]) circle(r=Arch_W/2, center=true); translate ([0, Floor_to_X - Arch_H/3]) square ([FtSupport_diam,thickness], center=true); Mickey ("R", [0, Floor_to_X - Arch_H/3]+[FtSupport_diam/2,0], thickness); Mickey ("L", [0, Floor_to_X - Arch_H/3]-[FtSupport_diam/2,0], thickness); //Mickey ("up", [FtSupport_diam/2,(Floor_to_X - Arch_H/3)], SeatSupport_diag); } //lap zone cut-off ---- V V V --- dirty too module LapZone_X () { rotate(-SeatAngle) translate([Front_to_X - (LapSquare/2)+9, Floor_to_X - (Floor_to_Ass + thickness) - (LapSquare/2) ]) //scale([1,ElipseScale]) square([LapSquare+18,LapSquare], center=true); difference() { rotate(-SeatAngle) translate([Front_to_X - (LapSquare/2), Floor_to_X - (Floor_to_Ass + thickness) - (LapSquare/2) -197]) scale([1,ElipseScale]) circle($fn=precision, r=(Elipse_W/2)+5, center=true); rotate(-SeatAngle) translate([Front_to_X - (LapSquare/2), Floor_to_X - (Floor_to_Ass + thickness) + (LapSquare/2) ]) square(LapSquare, center=true); } } //SeatBoard cut-off ---- V V V module SeatBoardGroove () { rotate(-SeatAngle) translate([Front_to_X - (LapSquare/2), Floor_to_X - Floor_to_Ass -thickness/2]) square([SeatSupport_diag,thickness], center= true); Mickey ("down", [Front_to_X-(LapSquare/2), Floor_to_X - Floor_to_Ass -thickness/2] + [0,thickness/4], SeatSupport_diag,-SeatAngle); // Mickey ("L", [0, Floor_to_X - Arch_H/3]-[FtSupport_diam/2,0], thickness); //Mickey ("up", [SeatSupport_diag/2,thickness], SeatSupport_diag); } //BackRest cut-off ---- V V V module BackRestGroove () { translate([Front_to_X - BoundingBoard_W + BackRest_dx/3.6, BackRest_dy - BoundingBoard_H/2 +BackRest_H/2]) rotate(-BackRestAngle+3) square([BackRest_H,BackRestGroove_thk], center= true); translate([Front_to_X - BoundingBoard_W + BackRest_dx/2.8, BackRest2_dy - BoundingBoard_H/2 +BackRest_H/2]) rotate(-BackRestAngle) square([BackRest_H,BackRestGroove_thk], center= true); Mickey ("R", -[Front_to_X - BoundingBoard_W + BackRest_dx/2.8, BackRest2_dy - BoundingBoard_H/2 +BackRest_H/2]-[BackRest_H/2,0], BackRestGroove_thk, -BackRestAngle); Mickey ("L", -[Front_to_X - BoundingBoard_W + BackRest_dx/2.8, BackRest2_dy - BoundingBoard_H/2 +BackRest_H/2]+[BackRest_H/2,0], BackRestGroove_thk, -BackRestAngle); } //SnapJoint cut-off ---- V V V module SnapGroove (direction, depth) { if (direction == "up") { assign (SnapGroove_offset = -(depth/2)) { translate([0, SnapGroove_offset]) square([thickness,Ass_support/2], center= true); } } if (direction == "down") { assign (SnapGroove_offset = depth/2) { translate([0, SnapGroove_offset]) square([thickness,Ass_support/2], center= true); } } Mickey (direction, [0,0], thickness); } //Seat ---- V V V module seat () { //square([FrontEdge_W,10], center= true); xSE = Seat_FrontCorner; ySE = Seat_FrontCorner; xSW = -Seat_FrontCorner; ySW = Seat_FrontCorner; xNE = Seat_BackCorner; yNE = -Seat_BackCorner; xNW = -Seat_BackCorner; yNW = -Seat_BackCorner; Seat_trimRadius = 214; difference() { intersection () { polygon([ [ xSE, ySE ], [ xNE, yNE ], [ xNW, yNW ], [ xSW, ySW ] ]); //_______________________________________________________________ translate([0,Seat_FrontCorner-Seat_LipRadius]) circle ($fn=precision, Seat_LipRadius, center = true); union () { translate([0,0]) circle ($fn=precision, Seat_trimRadius, center = true); translate([0,Seat_trimRadius]) square ([Seat_LipRadius,Seat_trimRadius*2], center = true); } } Mortise (135, [Front_to_X-(Seat_tenon/2),0], Seat_tenon, thickness, 0); Mortise (45, [Front_to_X-(Seat_tenon/2),0], Seat_tenon, thickness, 0); //============ substraction of 0.1 because of BUG... - - V V V Mortise (-45, [(SeatBoard_diag - Front_to_X)-(Seat_tenon/2)-0.1,0], Seat_tenon, thickness, 0); Mortise (-135, [(SeatBoard_diag - Front_to_X)-(Seat_tenon/2),0], Seat_tenon, thickness, 0); } } //FeetSupport ---- V V V module FeetSupport () { difference () { circle (FtSupport_diam/2, center=true); for (i=[[(FtSupport_diam/2) + Support_centerR,0], [0,(FtSupport_diam/2) + Support_centerR], [-(FtSupport_diam/2) - Support_centerR,0], [0,-(FtSupport_diam/2) - Support_centerR]]) { translate(i) circle (FtSupport_diam/2, center=true); } } for (i=[45, -45, 135, -135]) { rotate (i) translate([(FtSupport_diam/2)-(Support_LockRndD/2)+SnapWedge,0]) difference () { circle (Support_LockRndD/2, center=true); square ([Support_LockRndD,thickness], center=true); translate([Support_LockRndD/2+5,Support_LockRndD/2-20]) rotate(16) square ([Support_LockRndD/2,Support_LockRndD/2], center=true); } } } //BackRest ---- V V V module BackRest () { square([BackRest_H,BackRest_L], center = true); } //translate([0,Floor_to_X+8]) square([Arch_W+(FootPrint_L*2),10], center=true); //square([BoundingBoard_W,BoundingBoard_H], center=true); module Support (GrooveDir) { difference () { translate ([Front_to_X - (BoundingBoard_W/2), Floor_to_X - (BoundingBoard_H/2)]) intersection () { // offset [+20] is added to finish the curve of backrest square([BoundingBoard_W +20 ,BoundingBoard_H], center=true); ElipseMask (); } Arch_X (); SeatBoardGroove (); LapZone_X (); BackRestGroove (); SnapGroove (GrooveDir, Ass_support/2); } } module parts() { Support ("down"); rotate(180) translate ([-90,180]) Support ("up"); translate ([BoundingBoard_W-30,-Front_to_X-50]) rotate(180) seat (); translate ([BoundingBoard_W-150,150]) BackRest (); translate ([BoundingBoard_W-50,150]) BackRest (); translate ([0,Floor_to_X-50]) FeetSupport (); } module exploded() { translate([Front_to_X - BoundingBoard_W + BackRest_dx/3.6, BackRest_dy - BoundingBoard_H/2 +BackRest_H/2]); } module assembled() { rotate([ -90, 0, 0 ])linear_extrude(height = thickness, convexity = 4) Support ("up"); rotate([ -90, 0, -90 ]) linear_extrude(height = thickness, convexity = 4) Support ("down"); rotate([ -SeatAngle, -SeatAngle, 0]) color([ 0.7, 0.7, 1 ]) rotate([ 0, 0, -135]) translate ([0,0,Floor_to_Ass-Floor_to_X+thickness]) linear_extrude(height = thickness, convexity = 10, center = true) seat(); color([ 0.7, 0.7, 1 ]) rotate([ 0, 0, 45]) translate ([0,0,-Floor_to_X + Arch_H/3]) linear_extrude(height = thickness, convexity = 10, center = true) FeetSupport(); color([ 0.7, 0.7, 1 ]) translate ([Front_to_X - BoundingBoard_W + BackRest_dx/3.6,0,BoundingBoard_H/2 - BackRest_dy - BackRest_H/2]) rotate([ 0, 90, -45]) translate ([0,BackRest_L/2.6,0]) linear_extrude(height = thickness, convexity = 10, center = true) BackRest(); color([ 0.7, 0.7, 1 ]) translate ([Front_to_X - BoundingBoard_W + BackRest_dx/2.8,0,BoundingBoard_H/2 - BackRest2_dy - BackRest_H/2]) rotate([ 0, 90, -45]) translate ([0,BackRest_L/2.7,0]) linear_extrude(height = thickness, convexity = 10, center = true) BackRest(); } if (mode == "cut_layout") parts(); if (mode == "exploded") exploded(); if (mode == "assembled") assembled();