From 9a4b38b2c82fac19dd684c6865560a6fd774856d Mon Sep 17 00:00:00 2001 From: pseudoku Date: Wed, 18 Sep 2019 15:22:44 -0500 Subject: [PATCH] file renaming and concaves --- ...ordCaps.scad => DES_Choc_ChicagoSteno.scad | 0 DES_Choc_Concave.scad | 398 ++++++++++++++++++ DES_Levee.scad => DES_Choc_Levee.scad | 31 +- DES_MX_Concave.png | Bin 0 -> 110286 bytes DES_MX_Concave.scad | 395 +++++++++++++++++ DES_Cornes.scad => DES_MX_Corne+Kyria.scad | 38 +- DES_MiniWarp.scad => DES_MX_MiniWarp.scad | 0 RP_MX.scad | 74 ++-- 8 files changed, 885 insertions(+), 51 deletions(-) rename DES_ChocChordCaps.scad => DES_Choc_ChicagoSteno.scad (100%) create mode 100644 DES_Choc_Concave.scad rename DES_Levee.scad => DES_Choc_Levee.scad (88%) create mode 100644 DES_MX_Concave.png create mode 100644 DES_MX_Concave.scad rename DES_Cornes.scad => DES_MX_Corne+Kyria.scad (92%) rename DES_MiniWarp.scad => DES_MX_MiniWarp.scad (100%) diff --git a/DES_ChocChordCaps.scad b/DES_Choc_ChicagoSteno.scad similarity index 100% rename from DES_ChocChordCaps.scad rename to DES_Choc_ChicagoSteno.scad diff --git a/DES_Choc_Concave.scad b/DES_Choc_Concave.scad new file mode 100644 index 0000000..d82f42a --- /dev/null +++ b/DES_Choc_Concave.scad @@ -0,0 +1,398 @@ +use //for cheaper minwoski +use +use +use +use +use +use + +/*DES (Distorted Elliptical Saddle) Sculpted Profile for 6x3 and corne thumb +Version 2: Eliptical Rectangle + +*/ +//#square([18.16, 18.16], center = true); + +//TODO add shift +mirror([0,0,0])keycap(keyID = 3, cutLen = 0, Stem =true, Dish = true, Stab = 0 , visualizeDish = true, crossSection = false, homeDot = false, Legends = false); +//#translate([0,0,0])cube([14.5, 13.5, 10], center = true); // internal check +//#translate([0,0,0])cube([17.5, 16.5, 10], center = true); // external check + + +//n translate([0,19, 0])keycap(keyID = 3, cutLen = 0, Stem =true, Dish = true, visualizeDish = true, crossSection = true, homeDot = false, Legends = false); +// translate([0,38, 0])mirror([0,1,0])keycap(keyID = 2, cutLen = 0, Stem =true, Dish = true, visualizeDish = false, crossSection = true, homeDot = false, Legends = false); +RowHome = [0,2.5,5,2.5,0,0]; + +//for(Col = [6:6]){ +// for(Row = [1:3]){ +// translate([19*Col, 19*Row +RowHome[Col], 0])keycap(keyID = Col*4+Row, cutLen = 0, Stem = false, Dish = true, visualizeDish = false, crossSection = false,Legends = false); +// } +//} + +//////corne thumb +// translate([-15, -4, 0])rotate([0,0,30])keycap(keyID = 0, cutLen = 0, Stem =false, Dish = true, visualizeDish = false, crossSection = false); +// translate([6, 0, 0])rotate([0,0,15])keycap(keyID = 4, cutLen = 0, Stem =false, Dish = true, visualizeDish = false, crossSection = false); +// translate([26, 2.2, 0])rotate([0,0,0])keycap(keyID = 8, cutLen = 0, Stem =false, Dish = true, visualizeDish = false, crossSection = false); + +////kyria Thumb +// translate([-39, 0, 0])rotate([0,0,30])translate([0,-19.5, 0])keycap(keyID = 24, cutLen = 0, Stem =false, Dish = true, visualizeDish = false, crossSection = false); +// translate([-39, 0, 0])rotate([0,0,30])translate([0, -1, 0])keycap(keyID = 25, cutLen = 0, Stem =false, Dish = true, visualizeDish = false, crossSection = false); +// translate([-17, 0, 0])rotate([0,0,30])translate([0, 0, 0])keycap(keyID = 26, cutLen = 0, Stem =false, Dish = true, visualizeDish = false, crossSection = false); +// translate([6, 0, 0])rotate([0,0,15])keycap(keyID = 27, cutLen = 0, Stem =false, Dish = true, visualizeDish = false, crossSection = false); +// translate([26, 2.2, 0])rotate([0,0,0])keycap(keyID = 28, cutLen = 0, Stem =false, Dish = true, visualizeDish = false, crossSection = false); + +//normie hipro +// for(Row = [0:4]){ +// translate([0, 19*Row, 0])keycap(keyID = 29+Row, cutLen = 0, Stem = false, Dish = true, visualizeDish = false, crossSection = false,Legends = false); +// } + +//#translate([0,38,13])cube([18-5.7, 18-5.7,1],center = true); + +//Parameters +wallthickness = 1.2; +topthickness = 3; // +stepsize = 50; //resolution of Trajectory +step = 1; //resolution of ellipes +fn = 64; //resolution of Rounded Rectangles: 60 for output +layers = 40; //resolution of vertical Sweep: 50 for output +dotRadius = 1.25; //home dot size +//---Stem param +slop = 0.25; +stemRot = 0; +stemWid = 7.2; +stemLen = 5.5; +stemCrossHeight = 1.8; +extra_vertical = 0.6; +StemBrimDep = 0; +stemLayers = 50; //resolution of stem to cap top transition + +keyParameters = //keyParameters[KeyID][ParameterID] +[ +// BotWid, BotLen, TWDif, TLDif, keyh, WSft, LSft XSkew, YSkew, ZSkew, WEx, LEx, CapR0i, CapR0f, CapR1i, CapR1f, CapREx, StemEx +//normie hipro + [17.16, 17.16, 6.5, 6.5, 11, 0, 0, -10, 0, 0, 2, 2, 1, 5, 1, 3.5, 2, 2], //R5 + [17.16*2, 17.16, 6.5, 6.5, 11, 0, 0, -10, 0, 0, 2, 2, 1, 5, 1, 3.5, 2, 2], //R5 2u + [16.80, 15.80, 7, 4, 5.5, 0, .0, 5, -0, -0, 2, 3, .75, 1, .75, 4, 2, 2], + [16.80, 15.80, 7, 4, 5.5, 0, .0, 5, -0, -0, 2, 3, .75, 1, .75, 4, 2, 2], + [17.16, 17.16, 6.5, 6.5, 14.0, 0, 0, -14, 0, 0, 2, 2, 1, 5, 1, 3.5, 2, 2], //R1 +]; + +dishParameters = //dishParameter[keyID][ParameterID] +[ +//FFwd1 FFwd2 FPit1 FPit2 DshDepi DishDepf,DshHDif FArcIn FArcFn FArcEx BFwd1 BFwd2 BPit1 BPit2 BArcIn BArcFn BArcEx + [ 3, 3, -10, -50, 3, 7, 8.2, 9, 2, 5, 3, 0, -30, 8.2, 9, 2], //R5 + [ 3, 3, -10, -50, 3, 7, 18.2, 21, 2, 5, 3, 0, -30, 18.2, 21, 2], //R4 + [ 4., 1.5, 8, -55, 3, 7, 9.0, 9, 2, 4, 3, 3, -50, 9, 9, 2], //R3 + [ 4., 1.5, -0, -50, 3, 7, 9.0, 9, 2, 4, 3, -10, -50, 9, 9, 2], //R3 + [ 5, 3.5, 8, -50, 5, 1.8, 8.8, 15, 2, 6, 4, 13, 30, 8.8, 16, 2], //R1 +]; + +function FrontForward1(keyID) = dishParameters[keyID][0]; // +function FrontForward2(keyID) = dishParameters[keyID][1]; // +function FrontPitch1(keyID) = dishParameters[keyID][2]; // +function FrontPitch2(keyID) = dishParameters[keyID][3]; // +function DishDepth(keyID) = dishParameters[keyID][4]; // +function DishHeightDif(keyID) = dishParameters[keyID][5]; // +function FrontInitArc(keyID) = dishParameters[keyID][6]; +function FrontFinArc(keyID) = dishParameters[keyID][7]; +function FrontArcExpo(keyID) = dishParameters[keyID][8]; +function BackForward1(keyID) = dishParameters[keyID][9]; // +function BackForward2(keyID) = dishParameters[keyID][10]; // +function BackPitch1(keyID) = dishParameters[keyID][11]; // +function BackPitch2(keyID) = dishParameters[keyID][12]; // +function BackInitArc(keyID) = dishParameters[keyID][13]; +function BackFinArc(keyID) = dishParameters[keyID][14]; +function BackArcExpo(keyID) = dishParameters[keyID][15]; + +function BottomWidth(keyID) = keyParameters[keyID][0]; // +function BottomLength(keyID) = keyParameters[keyID][1]; // +function TopWidthDiff(keyID) = keyParameters[keyID][2]; // +function TopLenDiff(keyID) = keyParameters[keyID][3]; // +function KeyHeight(keyID) = keyParameters[keyID][4]; // +function TopWidShift(keyID) = keyParameters[keyID][5]; +function TopLenShift(keyID) = keyParameters[keyID][6]; +function XAngleSkew(keyID) = keyParameters[keyID][7]; +function YAngleSkew(keyID) = keyParameters[keyID][8]; +function ZAngleSkew(keyID) = keyParameters[keyID][9]; +function WidExponent(keyID) = keyParameters[keyID][10]; +function LenExponent(keyID) = keyParameters[keyID][11]; +function CapRound0i(keyID) = keyParameters[keyID][12]; +function CapRound0f(keyID) = keyParameters[keyID][13]; +function CapRound1i(keyID) = keyParameters[keyID][14]; +function CapRound1f(keyID) = keyParameters[keyID][15]; +function ChamExponent(keyID) = keyParameters[keyID][16]; +function StemExponent(keyID) = keyParameters[keyID][17]; + +function FrontTrajectory(keyID) = + [ + trajectory(forward = FrontForward1(keyID), pitch = FrontPitch1(keyID)), //more param available: yaw, roll, scale + trajectory(forward = FrontForward2(keyID), pitch = FrontPitch2(keyID)) //You can add more traj if you wish + ]; + +function BackTrajectory (keyID) = + [ + trajectory(forward = BackForward1(keyID), pitch = BackPitch1(keyID)), + trajectory(forward = BackForward2(keyID), pitch = BackPitch2(keyID)), + ]; + +//------- function defining Dish Shapes + +function ellipse(a, b, d = 0, rot1 = 0, rot2 = 360) = [for (t = [rot1:step:rot2]) [a*cos(t)+a, b*sin(t)*(1+d*cos(t))]]; //Centered at a apex to avoid inverted face + +function DishShape (a,b,c,d) = + concat( + [[c+a,-b]], + ellipse(a, b, d = 0,rot1 = 270, rot2 =450), + [[c+a,b]] + ); + +function oval_path(theta, phi, a, b, c, deform = 0) = [ + a*cos(theta)*cos(phi), //x + c*sin(theta)*(1+deform*cos(theta)) , // + b*sin(phi), +]; + +path_trans2 = [for (t=[0:step:180]) translation(oval_path(t,0,10,15,2,0))*rotation([0,90,0])]; + + +//--------------Function definng Cap +function CapTranslation(t, keyID) = + [ + ((1-t)/layers*TopWidShift(keyID)), //X shift + ((1-t)/layers*TopLenShift(keyID)), //Y shift + (t/layers*KeyHeight(keyID)) //Z shift + ]; + +function InnerTranslation(t, keyID) = + [ + ((1-t)/layers*TopWidShift(keyID)), //X shift + ((1-t)/layers*TopLenShift(keyID)), //Y shift + (t/layers*(KeyHeight(keyID)-topthickness)) //Z shift + ]; + +function CapRotation(t, keyID) = + [ + ((1-t)/layers*XAngleSkew(keyID)), //X shift + ((1-t)/layers*YAngleSkew(keyID)), //Y shift + ((1-t)/layers*ZAngleSkew(keyID)) //Z shift + ]; + +function CapTransform(t, keyID) = + [ + pow(t/layers, WidExponent(keyID))*(BottomWidth(keyID) -TopWidthDiff(keyID)) + (1-pow(t/layers, WidExponent(keyID)))*BottomWidth(keyID) , + pow(t/layers, LenExponent(keyID))*(BottomLength(keyID)-TopLenDiff(keyID)) + (1-pow(t/layers, LenExponent(keyID)))*BottomLength(keyID) + ]; +function CapRoundness(t, keyID) = + [ + pow(t/layers, ChamExponent(keyID))*(CapRound0f(keyID)) + (1-pow(t/layers, ChamExponent(keyID)))*CapRound0i(keyID), + pow(t/layers, ChamExponent(keyID))*(CapRound1f(keyID)) + (1-pow(t/layers, ChamExponent(keyID)))*CapRound1i(keyID) + ]; + +function CapRadius(t, keyID) = pow(t/layers, ChamExponent(keyID))*ChamfFinRad(keyID) + (1-pow(t/layers, ChamExponent(keyID)))*ChamfInitRad(keyID); + +function InnerTransform(t, keyID) = + [ + pow(t/layers, WidExponent(keyID))*(BottomWidth(keyID) -TopLenDiff(keyID)-wallthickness*2) + (1-pow(t/layers, WidExponent(keyID)))*(BottomWidth(keyID) -wallthickness*2), + pow(t/layers, LenExponent(keyID))*(BottomLength(keyID)-TopLenDiff(keyID)-wallthickness*2) + (1-pow(t/layers, LenExponent(keyID)))*(BottomLength(keyID)-wallthickness*2) + ]; + +function StemTranslation(t, keyID) = + [ + ((1-t)/stemLayers*TopWidShift(keyID)), //X shift + ((1-t)/stemLayers*TopLenShift(keyID)), //Y shift + stemCrossHeight+.1 + (t/stemLayers*(KeyHeight(keyID)- topthickness - stemCrossHeight-.1)) //Z shift + ]; + +function StemRotation(t, keyID) = + [ + ((1-t)/stemLayers*XAngleSkew(keyID)), //X shift + ((1-t)/stemLayers*YAngleSkew(keyID)), //Y shift + ((1-t)/stemLayers*ZAngleSkew(keyID)) //Z shift + ]; + +function StemTransform(t, keyID) = + [ + pow(t/stemLayers, StemExponent(keyID))*(BottomWidth(keyID) -TopLenDiff(keyID)-wallthickness) + (1-pow(t/stemLayers, StemExponent(keyID)))*(stemWid - 2*slop), + pow(t/stemLayers, StemExponent(keyID))*(BottomLength(keyID)-TopLenDiff(keyID)-wallthickness) + (1-pow(t/stemLayers, StemExponent(keyID)))*(stemLen - 2*slop) + ]; + +function StemRadius(t, keyID) = pow(t/stemLayers,3)*3 + (1-pow(t/stemLayers, 3))*1; + //Stem Exponent + + +///----- KEY Builder Module +module keycap(keyID = 0, cutLen = 0, visualizeDish = false, rossSection = false, Dish = true, Stem = false, homeDot = false, Stab = 0) { + + //Set Parameters for dish shape + FrontPath = quantize_trajectories(FrontTrajectory(keyID), steps = stepsize, loop=false, start_position= $t*4); + BackPath = quantize_trajectories(BackTrajectory(keyID), steps = stepsize, loop=false, start_position= $t*4); + + //Scaling initial and final dim tranformation by exponents + function FrontDishArc(t) = pow((t)/(len(FrontPath)),FrontArcExpo(keyID))*FrontFinArc(keyID) + (1-pow(t/(len(FrontPath)),FrontArcExpo(keyID)))*FrontInitArc(keyID); + function BackDishArc(t) = pow((t)/(len(FrontPath)),BackArcExpo(keyID))*BackFinArc(keyID) + (1-pow(t/(len(FrontPath)),BackArcExpo(keyID)))*BackInitArc(keyID); + + FrontCurve = [ for(i=[0:len(FrontPath)-1]) transform(FrontPath[i], DishShape(DishDepth(keyID), FrontDishArc(i), DishDepth(keyID)+1.5, d = 0)) ]; + BackCurve = [ for(i=[0:len(BackPath)-1]) transform(BackPath[i], DishShape(DishDepth(keyID), BackDishArc(i), DishDepth(keyID)+1.5, d = 0)) ]; + + //builds + difference(){ + union(){ + difference(){ + skin([for (i=[0:layers-1]) transform(translation(CapTranslation(i, keyID)) * rotation(CapRotation(i, keyID)), elliptical_rectangle(CapTransform(i, keyID), b = CapRoundness(i,keyID),fn=fn))]); //outer shell + + //Cut inner shell + if(Stem == true){ + translate([0,0,-.001])skin([for (i=[0:layers-1]) transform(translation(InnerTranslation(i, keyID)) * rotation(CapRotation(i, keyID)), elliptical_rectangle(InnerTransform(i, keyID), b = CapRoundness(i,keyID),fn=fn))]); + } + } + if(Stem == true){ + translate([0,0,StemBrimDep])rotate([0,0,stemRot])choc_stem(); // generate mx cherry stem, not compatible with box + if (Stab != 0){ + translate([Stab/2,0,0])rotate([0,0,stemRot])cherry_stem(KeyHeight(keyID), slop); + translate([-Stab/2,0,0])rotate([0,0,stemRot])cherry_stem(KeyHeight(keyID), slop); + //TODO add binding support? + } + #translate([0,0,-.001])skin([for (i=[0:stemLayers-1]) transform(translation(StemTranslation(i,keyID))*rotation(StemRotation(i, keyID)), rounded_rectangle_profile(StemTransform(i, keyID),fn=fn,r=StemRadius(i, keyID)))]); //Transition Support for taller profile + } + //cut for fonts and extra pattern for light? + } + + //Cuts + + //Fonts + if(Legends == true){ + #rotate([-XAngleSkew(keyID),YAngleSkew(keyID),ZAngleSkew(keyID)])translate([-1,-5,KeyHeight(keyID)-2.5])linear_extrude(height = 1)text( text = "ver2", font = "Constantia:style=Bold", size = 3, valign = "center", halign = "center" ); + // #rotate([-XAngleSkew(keyID),YAngleSkew(keyID),ZAngleSkew(keyID)])translate([0,-3.5,0])linear_extrude(height = 0.5)text( text = "Me", font = "Constantia:style=Bold", size = 3, valign = "center", halign = "center" ); + } + //Dish Shape + if(Dish == true){ + if(visualizeDish == false){ + translate([-TopWidShift(keyID),.00001-TopLenShift(keyID),KeyHeight(keyID)-DishHeightDif(keyID)])rotate([0,-YAngleSkew(keyID),0])rotate([0,-90+XAngleSkew(keyID),90-ZAngleSkew(keyID)])skin(FrontCurve); + translate([-TopWidShift(keyID),-TopLenShift(keyID),KeyHeight(keyID)-DishHeightDif(keyID)])rotate([0,-YAngleSkew(keyID),0])rotate([0,-90-XAngleSkew(keyID),270-ZAngleSkew(keyID)])skin(BackCurve); + } else { + #translate([-TopWidShift(keyID),.00001-TopLenShift(keyID),KeyHeight(keyID)-DishHeightDif(keyID)]) rotate([0,-YAngleSkew(keyID),0])rotate([0,-90+XAngleSkew(keyID),90-ZAngleSkew(keyID)])skin(FrontCurve); + #translate([-TopWidShift(keyID),-TopLenShift(keyID),KeyHeight(keyID)-DishHeightDif(keyID)])rotate([0,-YAngleSkew(keyID),0])rotate([0,-90-XAngleSkew(keyID),270-ZAngleSkew(keyID)])skin(BackCurve); + } + } + if(crossSection == true) { + translate([0,-15,-.1])cube([15,30,15]); + } + } + //Homing dot + if(homeDot == true)translate([0,0,KeyHeight(keyID)-DishHeightDif(keyID)-.25])sphere(d = dotRadius); +} + +//------------------stems +$fn = fn; + +function outer_cherry_stem(slop) = [ stemWid - slop * 2, stemLen - slop * 2]; +function outer_cherry_stabilizer_stem(slop) = [4.85 - slop * 2, 6.05 - slop * 2]; +function outer_box_cherry_stem(slop) = [6 - slop, 6 - slop]; + +// .005 purely for aesthetics, to get rid of that ugly crosshatch +function cherry_cross(slop, extra_vertical = 0) = [ + // horizontal tine + [4.03 + slop, 1.15 + slop / 3], + // vertical tine + [1.25 + slop / 3, 4.23 + extra_vertical + slop / 3 + .005], +]; +module inside_cherry_cross(slop) { + // inside cross + // translation purely for aesthetic purposes, to get rid of that awful lattice + translate([0,0,-0.005]) { + linear_extrude(height = stemCrossHeight) { + square(cherry_cross(slop, extra_vertical)[0], center=true); + square(cherry_cross(slop, extra_vertical)[1], center=true); + } + } + + // Guides to assist insertion and mitigate first layer squishing + { + for (i = cherry_cross(slop, extra_vertical)) hull() { + linear_extrude(height = 0.01, center = false) offset(delta = 0.4) square(i, center=true); + translate([0, 0, 0.5]) linear_extrude(height = 0.01, center = false) square(i, center=true); + } + } +} + +module cherry_stem(depth, slop) { + D1=.15; + D2=.05; + H1=3.5; + CrossDist = 1.75; + difference(){ + // outside shape + linear_extrude(height = depth) { + offset(r=1){ + square(outer_cherry_stem(slop) - [2,2], center=true); + } + } + inside_cherry_cross(slop); + hull(){ + translate([CrossDist,CrossDist-.1,0])cylinder(d1=D1, d2=D2, H1); + translate([-CrossDist,-CrossDist+.1,0])cylinder(d1=D1, d2=D2, H1); + } + hull(){ + translate([-CrossDist,CrossDist-.1])cylinder(d1=D1, d2=D2, H1); + translate([CrossDist,-CrossDist+.1])cylinder(d1=D1, d2=D2, H1); + } + } +} + +module choc_stem() { + + translate([5.7/2,0,-3.4/2+2])difference(){ + cube([1.25,3, 3.4], center= true); + translate([3.9,0,0])cylinder(d=7,3.4,center = true); + translate([-3.9,0,0])cylinder(d=7,3.4,center = true); + } + translate([-5.7/2,0,-3.4/2+2])difference(){ + cube([1.25,3, 3.4], center= true); + translate([3.9,0,0])cylinder(d=7,3.4,center = true); + translate([-3.9,0,0])cylinder(d=7,3.4,center = true); + } + +} +/// ----- helper functions +function rounded_rectangle_profile(size=[1,1],r=1,fn=32) = [ + for (index = [0:fn-1]) + let(a = index/fn*360) + r * [cos(a), sin(a)] + + sign_x(index, fn) * [size[0]/2-r,0] + + sign_y(index, fn) * [0,size[1]/2-r] +]; + +function elliptical_rectangle(a = [1,1], b =[1,1], fn=32) = [ + for (index = [0:fn-1]) // section right + let(theta1 = -atan(a[1]/b[1])+ 2*atan(a[1]/b[1])*index/fn) + [b[1]*cos(theta1), a[1]*sin(theta1)] + + [a[0]*cos(atan(b[0]/a[0])) , 0] + - [b[1]*cos(atan(a[1]/b[1])) , 0], + + for(index = [0:fn-1]) // section Top + let(theta2 = atan(b[0]/a[0]) + (180 -2*atan(b[0]/a[0]))*index/fn) + [a[0]*cos(theta2), b[0]*sin(theta2)] + - [0, b[0]*sin(atan(b[0]/a[0]))] + + [0, a[1]*sin(atan(a[1]/b[1]))], + + for(index = [0:fn-1]) // section left + let(theta2 = -atan(a[1]/b[1])+180+ 2*atan(a[1]/b[1])*index/fn) + [b[1]*cos(theta2), a[1]*sin(theta2)] + - [a[0]*cos(atan(b[0]/a[0])) , 0] + + [b[1]*cos(atan(a[1]/b[1])) , 0], + + for(index = [0:fn-1]) // section Top + let(theta2 = atan(b[0]/a[0]) + 180 + (180 -2*atan(b[0]/a[0]))*index/fn) + [a[0]*cos(theta2), b[0]*sin(theta2)] + + [0, b[0]*sin(atan(b[0]/a[0]))] + - [0, a[1]*sin(atan(a[1]/b[1]))] +]/2; + +function sign_x(i,n) = + i < n/4 || i > n-n/4 ? 1 : + i > n/4 && i < n-n/4 ? -1 : + 0; + +function sign_y(i,n) = + i > 0 && i < n/2 ? 1 : + i > n/2 ? -1 : + 0; diff --git a/DES_Levee.scad b/DES_Choc_Levee.scad similarity index 88% rename from DES_Levee.scad rename to DES_Choc_Levee.scad index 19519e4..3cd6f43 100644 --- a/DES_Levee.scad +++ b/DES_Choc_Levee.scad @@ -11,11 +11,15 @@ use /*Tester */ -translate([0, 0, 0])rotate([0,0,0])mirror([0,0,0])keycap(keyID = 1, cutLen = -ChocCut, Stem =true, Dish = true, SecondaryDish = true ,Stab = 0 , visualizeDish = false, crossSection = false, homeDot = false, Legends = false); - translate([0,-17.5, 0])rotate([0,0,0])mirror([0,1,0])keycap(keyID = 1, cutLen = -ChocCut, Stem =true, Dish = true, SecondaryDish = true ,Stab = 0 , visualizeDish = false, crossSection = false, homeDot = false, Legends = false); - - translate([18,-17.5, 0])rotate([0,0,180])mirror([0,0,0])keycap(keyID = 1, cutLen = -ChocCut, Stem =true, Dish = true, SecondaryDish = true ,Stab = 0 , visualizeDish = false, crossSection = false, homeDot = false, Legends = false); - translate([18, 0, 0])rotate([0,0,180])mirror([0,1,0])keycap(keyID = 1, cutLen = -ChocCut, Stem =true, Dish = true, SecondaryDish = true ,Stab = 0 , visualizeDish = false, crossSection = false, homeDot = true, Legends = false); +translate([0, 17, 0])rotate([0,0,0])mirror([1,0,0])keycap(keyID = 0, cutLen = -6, Stem =true, Dish = true, SecondaryDish = false ,Stab = 0 , visualizeDish = false, crossSection = false, homeDot = false, Legends = false); + +//translate([-3, 0, 0])rotate([0,0,0])mirror([0,0,0])keycap(keyID = 0, cutLen = 7, Stem =true, Dish = true, SecondaryDish = false ,Stab = 0 , visualizeDish = false, crossSection = false, homeDot = false, Legends = false); +//translate([3, 0, 0])rotate([0,0,0])mirror([0,0,0])keycap(keyID = 0, cutLen = -7, Stem =true, Dish = true, SecondaryDish = false ,Stab = 0 , visualizeDish = false, crossSection = false, homeDot = false, Legends = false); + +// translate([0,-17.5, 0])rotate([0,0,0])mirror([0,1,0])keycap(keyID = 1, cutLen = -ChocCut, Stem =true, Dish = true, SecondaryDish = true ,Stab = 0 , visualizeDish = false, crossSection = false, homeDot = false, Legends = false); +// +// translate([18,-17.5, 0])rotate([0,0,180])mirror([0,0,0])keycap(keyID = 1, cutLen = -ChocCut, Stem =true, Dish = true, SecondaryDish = true ,Stab = 0 , visualizeDish = false, crossSection = false, homeDot = false, Legends = false); +// translate([18, 0, 0])rotate([0,0,180])mirror([0,1,0])keycap(keyID = 1, cutLen = -ChocCut, Stem =true, Dish = true, SecondaryDish = true ,Stab = 0 , visualizeDish = false, crossSection = false, homeDot = true, Legends = false); //#translate([0,0,0])cube([14.5, 13.5, 10], center = true); // internal check @@ -32,8 +36,8 @@ thumbSec = false; wallthickness = 1.1; // 1.75 for mx size, 1.1 topthickness = 3; //2 for phat 3 for chicago stepsize = 50; //resolution of Trajectory -step = 6; //resolution of ellipes -fn = 32; //resolution of Rounded Rectangles: 60 for output +step = 1; //resolution of ellipes +fn = 64; //resolution of Rounded Rectangles: 60 for output layers = 40; //resolution of vertical Sweep: 50 for output //---Stem param @@ -62,6 +66,7 @@ keyParameters = //keyParameters[KeyID][ParameterID] [17.20, 16.00, 4.25, 3.25, 5.5, -.7, 0.7, 0, -4, -0, 2, 2, .10, 2, .10, 2, 2, 2], //Levee Corner R2 [17.20, 16.00, 4.25, 3.25, 5.2, -.8, 0.6, 0, -4, -0, 2, 3, .10, 2, .10, 2, 2, 2], //Levee Corner R2 + [16.80*1.25, 15.60, 5, 4, 4.5, 0, .0, 0, -0, -0, 2, 3, .75, 3, .75, 3, 2, 2], //Chicago Steno R2/R4 1.25u ]; dishParameters = //dishParameter[keyID][ParameterID] @@ -73,6 +78,8 @@ dishParameters = //dishParameter[keyID][ParameterID] [ 6, 3.5, 7, -50, 5, 1.0, 16, 23, 2, 6, 3.5, 7, -50, 16, 23, 2], //Levee Steno R2/R4 [ 6, 3.5, 7, -50, 5, 1.0, 16, 23, 2, 6, 3.5, 7, -50, 16, 23, 2], //Levee Steno R2/R4 + + [ 4.5, 4, 5, -40, 8, 1.8, 15, 16, 2, 4.5, 4, 5, -40, 15, 16, 2] //Chicago Steno R2/R4 ]; SecondaryDishParam = @@ -82,6 +89,8 @@ SecondaryDishParam = [ 6, 3.5, 7, -50, 3, 2, 8, 8, 2, 5, 5, 5, 15, 10, 20, 2], //Levee Steno R2/R4 [ 6, 3.5, 7, -50, 5, 1.0, 16, 23, 2, 6, 3.5, 7, -50, 16, 23, 2], //Levee Steno R2/R4 + + [ 6, 3.5, 7, -50, 3, 2, 8, 8, 2, 5, 5, 5, 15, 10, 20, 2], //Chicago Steno R2/R4 ]; function BottomWidth(keyID) = keyParameters[keyID][0]; // function BottomLength(keyID) = keyParameters[keyID][1]; // @@ -298,7 +307,7 @@ module keycap(keyID = 0, cutLen = 0, visualizeDish = false, crossSection = false //Fonts if(cutLen != 0){ - translate([0,sign(cutLen)*(BottomLength(keyID)+CapRound0i(keyID)+abs(cutLen))/2,0]) + translate([sign(cutLen)*(BottomLength(keyID)+CapRound0i(keyID)+abs(cutLen))/2,0,0]) cube([BottomWidth(keyID)+CapRound1i(keyID)+1,BottomLength(keyID)+CapRound0i(keyID),50], center = true); } if(Legends == true){ @@ -319,9 +328,9 @@ module keycap(keyID = 0, cutLen = 0, visualizeDish = false, crossSection = false translate([BottomWidth(keyID)/2,-BottomLength(keyID)/2,KeyHeight(keyID)-SDishHeightDif(keyID)])rotate([0,-YAngleSkew(keyID),0])rotate([0,-90+XAngleSkew(keyID),90-ZAngleSkew(keyID)])skin(SFrontCurve); - rotate([0,0,180])translate([BottomWidth(keyID)/2,-BottomLength(keyID)/2,KeyHeight(keyID)-SDishHeightDif(keyID)])rotate([0,-YAngleSkew(keyID),0])rotate([0,-90-XAngleSkew(keyID),270-ZAngleSkew(keyID)])skin(SBackCurve); - - rotate([0,0,180])translate([BottomWidth(keyID)/2,-BottomLength(keyID)/2,KeyHeight(keyID)-SDishHeightDif(keyID)])rotate([0,-YAngleSkew(keyID),0])rotate([0,-90+XAngleSkew(keyID),90-ZAngleSkew(keyID)])skin(SFrontCurve); +// rotate([0,0,180])translate([BottomWidth(keyID)/2,-BottomLength(keyID)/2,KeyHeight(keyID)-SDishHeightDif(keyID)])rotate([0,-YAngleSkew(keyID),0])rotate([0,-90-XAngleSkew(keyID),270-ZAngleSkew(keyID)])skin(SBackCurve); +// +// rotate([0,0,180])translate([BottomWidth(keyID)/2,-BottomLength(keyID)/2,KeyHeight(keyID)-SDishHeightDif(keyID)])rotate([0,-YAngleSkew(keyID),0])rotate([0,-90+XAngleSkew(keyID),90-ZAngleSkew(keyID)])skin(SFrontCurve); } } if(crossSection == true) { diff --git a/DES_MX_Concave.png b/DES_MX_Concave.png new file mode 100644 index 0000000000000000000000000000000000000000..c4d4e0df9f5f020bd4ce08a0a13ca64407e64146 GIT binary patch literal 110286 zcmeFYS6ow17&e$72#Qivx`2QJN{I+a2Sw=uHhL8Vr1wrpR1lD+bg2R&CG_3`SO95> zf^-O-NDTx+NC;#P|8MtZFLw80fBRkRcfpT2Z)WB#^UgER%$XDO*g)&zdG7Nd5a^15Ti0&E#4ImLISf2#`o%7N*^96yJexCk;Q^lBgK%i?Norm|I2W4;0T9n__ zvz{ZCIaw#U`X;hmnlQNb{-smhWZ;wQj4$7EG5PLmF!|VVUKfmW>JrlUm=xs383m$= zV|{W>m^O6K`>KY);)BfzrL3WEw(qz&4Wv09_PbYR5Us3Q{%x--QmE9ja1^=>r&Tz) zu~k`Fi8XU2kX5MbZ>et}6hV3r^Y&H~CTxo!=b>^Q6m%iVf*G(FWTJ6$1_a_{Bmqyh z;>&6v5WMCC75Je?{r|Hc24YWbIg3BA@I=|PACP&Pc+bHP=Mx$)8(b?)o7> z1%p6wr_DgO*@2p%F4JEyz&-o_SAMXb2?6^3&@>m~d$QOtKG(dZ4T_5cl#SmOQM2QR zhu%9m17|Flr=Mp!b%%254j14K>K$OOz^T2@0k0BI%@YYes*sC;g7{8{BA^gxk`FZb z%u&PKwRhUfS)eX~Z!zC&`zHySzXCiIHczcVPs5r(p|`zaqJ(4yZC?e{C*0pW zv(pT;tv&;&mp)Z5X*tL^KY5J`hDW{u^hW_|X-@T@I?DqTSOI6?6ZHS3(30Q*nDa7; zxhuLkgQM%$sSWDim_b0#UGkXl4ShR)kUW;Di4PbCQ01v7|5rn^O{D>ue4nKU&zu8> z&+=*_57^5D=+f)v6$)rZ&AI_hOB7pcVoW_^)G`_Kbjw3HA2wY3+ z)D@tiG7sQBv$$ie*ybCc>ZxNv+TGVTC*NK>^;q-d%#OAs?*K4fnt=B^ph}j3=CU(g z@_^#)@lm@ujX*Gn2#m)3HlT98;8aXk!wjl?3y2OX1GagAhf{wqTD5R%9iD*$gWlC3 zb&e6#1k5+D8-P*GmjMgXH8#({LmvR5n=?$}$_^FV#|*0G03hVdH2^QT0Cbpv09b2D1Bhl%Aw=U; z#CR&A2Si(J9D6h%NdSQ79YqhpUHSlCTJit@;{o91ye@!!ULpXnNybjl{|~Ht3P9lh z!l?h*Z0Y}}6B6zk3J@eu6~AP z5AT7_0Ibf|6q4-=l$TEDo6pJIRWL98LlBxnO97POj;00yI_=KW!kuDv=s}g?Cp@ey zz%&lNoJ-ZCr3Hb4dLk&;XgIKhqtmmgGu&XE*Qe#UOzKsW2%w~_wZ1pkticXUVE!`j zO!f!r=|eW}=|iFf)!U5*Ubpo7{5%tKeu5U{)SJ)Nr4stB<{StWdCD$J#sQwIclqrd|M6l>fNg|A~PukeNZvN&9`Bmhv?7?@rm48DSPY za*Y8re#)TqKKb$$ss0BFAg7+Cd!QMGQx)_8bt(jy6lZs&-6-YfX;vsIA!g&uPjHww)X&= zg-+xB5-6MjkPHr_0B7&CCsJqg3oy-HEL$E>1b^ z(L+EcEpz~G_B{;|GeBy!POBxKCc{<0q^oa%uzH^w$uGG|xAX5mSAd32r=;(7_oIMF ztJA9gG0W172$fKl(|Gp))%f~~>`w#2a9ZwSv*R-H2XUT4@Nw(^&c-o75N3E!k@*TB zMxN%A|EUNwib4V=o%-9HFJ`jD00Z4VE#DP>0iJIJx~l}3E-3H~U_tFEV0!{0$w;MJ zXS$$3;>$~)4+nW+t=o^svaS|_vw>^|B`$WmR(0N|rS*~l)G23kpcDkJ!3(|rf#6ZT z8B}Slu4yJZAp1$HfikuJ)u>Vyy z@i{r22OzkU?hq`2fdK^CxoSp2dusrtuDX%%6I__Di3iI?P_r-fAAP6GiC}~qiGrRV zrZ!hm#$Z81HQ>Oa9IB(T5G}|{jEZHZPTm~ybA6{5IX}}n5z3*SNmF<4Uk)Sc_y>;K z-vYHH8c|8qfbG|30?Xv6fCHfU?~ZAOxdl^OX9FdEgMH%&|5JGpn1I_XQD1xUXxK7Z;YC{GBfn7^4*c+3N)t;l z)E*T}`1T?Fcpcdb(Rm$I8Gu#8&V(s2M45w#Zz+N3lPZ4FIw>|}>aGMn=6#CsAk8@R zeW|4647X?M&vJ)Z^p)=>)D`LvzUw<)34Ji>ghtRdz1A0{T{c`ec8(%l)dr zKfCeco9B&~?1PJhf|tT_+uu+rD@8*67kqx5y=Bb))_2>rXIzy?#>=@ z_l8Jla23lUzM}u2JNCT#iC85^X%u%76g4nM%7<;jwS03aa!ZGd^TzTgSFvK4V-)VV z%=x5MalzeM^f#k-Uy`gV7e`RE$a>MrLlraOP$r%EIvx`eM2&>byklTeR27~njGY;W z_NtX?o}X#(T~+H9;OvU`+F2uxQFpLdNSS=fNiW;LK)Iu^M$LQSr#N)&L5W6JH5;j% zwAz~FWW_yWE*sf8dC&+|xyh2aGzcX5m9t)qSA#D|?F{{FzwRiikamtoJbuH`oc59Z zGll%}!FA!+hFkhq%>#}&NoCeWdA0XM%zOR zRm~1=eB~21p0D1IgJYL-S{s@(Iy7;!y{dSe5?1?lvlB-tRU=H0-i!APpF8HHrYaQ` zKjIR$l0IZAY!G*T`tL{W=CU7C1}bKcvpEt%OZm^+anOyQO%96myt8JRb3Y>$G;%y9 zLepb5&&A3TxKT?&UkrYH)(iUfstX1c8zw;2&6)Ris9g(Q&opkm%;BJ;yYrkW(hW@!{2ZXfxo~!Pns(PQ^RJ#}83&vCXdFZIk>4%_`%XdfOmn_dSa$GHZ>MqG zbGwMkLZ4@z4hH!5J;LaXzD>zKpX@cBp-Fq?Zq2hf@~HW89h$rRY~d9KCC`hO_iTQ7 z8u5PJ!B7|T6y|d+g{Un~&{t=@m~%(&ucn8G-NcWk-~J0O8-t};Z%9h0Pr9kd8R|z) zEtlSfS=vne;h5_G#c?KGDilFTyTY)dXya=%`yhJgdu=vDbem5R1skNv0M`rIrx5kj zPEcX@!&S35Pm+u_((wx9l2Xnyr$b1c-MYuFSrY}eAdTi8)x%R? z65yoBRv#>WO130b>74p98~tsG80nWoW2Ia3Gd9;~7RNk3P-m8|mV%YvhpLuQd~!)Y ze_w~7(|fe-tgvkaIoKbz6LKEK!sdg3zv)**ZgFc->{rT7cYM$nn&P`PVwAe~aEsN; zh!~5NCpk(9D!+bc5qT%GsexUnsSvSc~q@0uTs$+Q_Fps?qdzrWX5; z50}94di*kDMIHU+Req(ON;F@kzgLu5EAS!iiCQw`Y>IICs_wR3tPLAkzv(7;&12p1 zztsx9*Ahi>a_aaLbd*$nfAWzzGK{M{ZPK73&Hs*G)D*wWz?!YMu3Xg__P`INO6+>x zYe=K_Rhta2l&32^EHQs>%ZubNWEf<~?ahs(tc;R2s5_lx4yNW-i`C9am8%V4D^M;`SmD@#{jWf&(ZwR6wk1?=fW zdnH}$^0%!|GqVyKjkfI#RnQyme`=sA|uD zHl6IKapwlIFVrB(4k^|^X)Y5EsMC+-W#>^-aga4!2)*tupNQ9KefdRo8jXEom?bPs zvzWPk<8Oqrl^udzu_Qb%yr%Fw}TTAgk&?9N(adTMQj!Y!=u#=R&A_kUR zO2FqWy=MXSDteyi+1u#G-UuKk4LmWftH52(!)}D&mc{o+f_+}F7LoBb3a0rfqNDVC zUrI(Pi)wX`95LLQTV>6c^+|5bg;DLaruD3P@I3^Og^Jr^)FDw?nu(45rJhc5OqH+M z%MV#}4ml}mDHQ|l4l>!Dn-^d9>o{&b{Q3xIew2j!P~NWcGz1YS5_NlJ=Kc#gjkm>p zAtl+Y;NnuVxt&_?A5JkRrSI&2lSkebO59oyFX-!>sYar^Ub)k$$x zV9&BMOK15BTl!fg>2t6nr2`&Io13VcBUJ_rYN*JbneAcS^Ex3aPl7u4_l37TDk7Yf z?g-g>6W;0BG^gk_MVsaLXE3!+m1Xx-q&q$9>IFKmNL@n?>yzwo@M z5FL}%CXZYtlW@MWOP}Sx%$Eh3q}q;L`W(QfePL1{g1TIVT!RlZ&;6&URhF5f^RAPs z3Q?QDziYFhUcoQ*Mij~U?fW)qpPs-S>ZZC}fkB1L_j+60^qij2@!?syRX>WO*2W-g zYW$gOhQEt~*QF}mJX1g$=dc-9V&Kgm+EB0rF?G=XAN(Bq(QuI+ug)uziY>7$x~*X= zXEU_&=2&grxZw4*2+U_S^&m8=RGAvBW=f@YwxW zgomp>xUHR>vDF2c9T?=nGBS|BCA(c@VPD0blz*xMR-KlFJV*eOV%>CW6+9}mZG zz_vu1-sJJRfA4pbCJNQ>s(LnB?QBH$_~_MC?4gP!#ucBpsyS!Z)XX^j={TNha!2O9 ziKS+7Odg}ZvMf?V0%QVZ^aW1PY!FL~U8usdY)PZDY2_D&H%iK#QD|uJN>M8bO2k0) zzf+iBbm|D%Ai+g;l6wV~W^I2q4Q z9x`_r_~{r@&AP70>u!-aDT<1Ewrbj)lY{FCU+>A^2>F;$@l(;V155UM(2^va4zhoQ zF{2qYzpD$^&GI2#;Rh{_WznGqk}ug#PPE)??mT2&zb2nZKX95$@Yly=bFA;^1=~!j zB_+%95BnNPV_PTov7NuZ+q6}TZ)Grc*^l{KOM;l%&pphSm!%$VYT^1*qI0^x0tuM6 zzLEx8?_<2gYK@m3JHCE!g2rz+Xssw^BHzD6;Pn}Nq+jeg&)&djNL-)w6Wa$i7Rf$|hPl=6$K>Vc6 z$;Oyh{0#iJ~cfw2E%G7xDmVSH_@%$QyI{p{c`Gz6-vWn?RY&v|fFOh*k zS(-|Qot!n%9~}xqY99uo&>TkE@n!Nw$9<5%4B-nZ51Liv4t#UWe0cXNbH`8G0$6RH zG%^Z=^t1lPxbzvB{Y$Q@EA34td`Pt4Dt*TN#e7Z|myHN8WAdc3)GnmF_`AJ5pDy?5 zRBI2#llADm(ZhT5e}-y2$J)&wh@TDLj#WDh?jyk}rJvj^4jHxJE*y5ewDmHXX_(WQ zJx#cd$($gb(>O5^G8`b#DgEu-=>6ayA+}Rlv;N-i>b2XO3&qEZF4w6jC8=I{W%Bw; zPQ=T8vn)D{0Zn%8*?bqSxz#P2oST$l*jt8Zp;`YEX*-+QxGN0GS8pB^ara$gLsK_G z|3%iOuMeOG6yEqespbTyV&iT;@Sm2*8G4u1(=9l9FBHdXnsaWvqsFGTq&e0p+6ZZ zA|xEF&eTEnD0-U51#Wob5HOru-z2094?aR&vR(4Y&be{V)kx}CvhfpsO#Pf!i)$S7 zG~2fq+pn)gBY`#4pPdpn6a(*qCfVn8Xd};P)pV1`rG{YL?9gwbzl@}%!kx|Z%*)1w zBHga1Z|^&_RSE}8?|Y0}FTT-yUCsTLw{uuyifAedUbV?7q%DzQ*MobsjeS9;${?rz zI9lHdB_ zmu&w`l*n#R=vt>jdrHt-V*LE+9HhpyjVoRsnXJ6BnWDq%-V>w$kGlX(gD|H!s74cz zX^r7a#lr(ZbUikqLQ!joM$#Orf3A{8)`IR=85*_8;Yk(q7Zcy=^wcYneucGu!y=iw z$Bi{2>%G$K0)i}cyR|?@WOF|I#y$7Z+)MMyv=Y>!X%8Y5;c=ASctPWyW#<}ftqtRI zFN$Zmld-!agyYM-`To@j4%y_#J2Lx>fZvV}Vu4TktDkx{;7tA5+ z&a!*p2T6d8aXj-vv4a2j0mlkITmTN-oGo}DJMb*T`f04Fu9`YRk;>KZsr7;Xy%sBG z^gm=(e{21PlnRE45K%8z?fh559Mr~w@G%@pKc zo^3V8+e$0-Ry2HR@rMt`3M>NYJ>X};qLhJP9$fbe_ERAjlG5(rCNxXZRNmgtm2Ym(G`m(VtIv2KXbf~u6~9n~owOxSqzlr}6d%Rs zk$b{kvqdNheO7@rNo>d$ZH=af{p0OCp6%~yEg^Y1dDJh@uz)cZ1P8+cS}PL{tPd=co2DQat*pts{;Wm z3SRSb8h{0I9zC^WrMZf|tVW18)|`Gui7kIAX#6^x4?M0mUHpv4QMS*{?)Y&mmC;^+d3}UvI!jtey$JQJ#u{xp1#p_&Bi;-?wpsk zLprGY&Vr14)#q#olln=P`r#_>M1%gh!4NEv@96v$n%4$-zYx$xn-xEQ!_AFmx4#zz zd-9$tP}z>$mf2)ejbq~}w|Z(%as$Y4DqQ zM&m~&$}OvPc7s|SU+*)MIwJc=KCZs}=M`O2OnKjg@)^{IJ>E`F|Zx_|%6Q}0V-+{<{4snE56}HJHJV#6bgy3R ztiR8D1SIiSd;DCXR*4qBnpZ&HVOwwm`aKPjtH^Bs)AatAoICflr`yR({EC#ZK(m}L zHavS}i!73c(YKp&bXT;DAZAM9m!Bp2WVv`@TB_T| zL!vG2vBM}4#4l6McmGl2EhGRHS=y8&-xtO}m!jv__nO5pc4TSBMrVuut7`jalWN&jx^uWGxz-IOYC zNFp?}>Rl(oNyIXFI;f}y`Mc7f*otT{NJU?GV;7h|(UXC02)|{n=0{?AFj@u`yyx>I z@~`U2^!V!*7<+TZW3?r5FNSIPR5RNbZDjV_)}4@fIVr{q*sG^Ig54Rm8Z;N|bCb{9 zZXd+Cuxa?@@Dp-UD27y33FgW#M1*q$3dG;%fwtd>s*h>^(OOX2zS<#n>x(}=U1JY* zUA(7I+-6iI@Pd*k)##m5)mUtcPl9Zc<>Ui=vb3BV23BV23C>`$#{TIKGT z+1KmjOPydMT*UI`4193zG!0R7y{dZ_4?J1DxMEITv6R8DQ6-|`L44tRIHc>5)?A0sS_W11^Ge_4P3f{k2J-I1FM;AA6JJrrO`TuFxEtSUcU z{|ggMPIfW$7J;tRR4Nyv==4$rBuFWwDyVFXOx7yddg?j->-wcuq!qe+??Z}b#D*6U zMKiAO!^6XA=R~Sr&~{wdk=CupsSS$Y&Vr`b;xy)NLcNVdjf0(&KL@1tXw_)S>sy#N zB->ElFvyGJ^WeaVEU~YBemu_23O1nR7#^9aN$erc+Fn<`xC+AiPz1b!A|hL=Rw9EbTFna5rHwP{ddyr7 zp?OCFi)=L6>fWkZJ9sfA+*wySme;u|<84Lqb)ems)QcLSSJkDx%1ScSr2Ppczm!G0 zQd3=1%~rcBYM=ZrfLqCalzYtRHfpCdmj=g%Y&f(*LZ6_rmoA3ZKs(bL*z3wOWWQxoY~+O zxOF~7iE%qz)RG{&fE;I-X07%=)|w3W*n6Gmqwov3*T`PU@XZ~Hx5uqt1WylZ1~Ggy zHQRq7F?e!m<9G`yZ(+Dmjy`lqq7HXY&wWp5ACa>cqjIJ34B%c0IB@m0Wph<3xL5AbQixHeI7DjqmDscgddGKwj>}tYi~@-^#1Z#=c5^8(w48fr&jfhAy{RpkU_asSj?p znU@qMN)+Fw8m>9l-F4eE=et*}n5Ulc^>;9u14o%@rh@%)?A%{Lb3fgMSJe3KX5Y!z z_m#uAl>~MY>X#%+$YuxI(S9*+t980MFFC;m~YhHGgn1wi_t~Yw%7ZuMdcXz}s8d2HK ztraC42wO2ToYOn5!rqEMbeL==sJ=}0I4}z+My?Ir`n)eGH{k9A(L&QiDe~pqVZ2&T z5J?9i*xPjB-Z0gp^xsBpw47?{4*m~Y{>t4P7)^TNzlW{gm5B_-3AEtlW}j%MJ*K-# zORC~vWl7&Fy?)T3p5_a!fgE9<ozXpStDac5=_rqCrPrH{0UJ}GCw1=U@I=@|-#wB!4 ziZPp_#r$z0nxUEEsKa~~<#Cbohh2M0kk$T`Hv{}!l%a=R;M>&c*ce;O@5QPImEsgS zr$=QHVq3!>WnO0)?E0Ywr-p{>=Ic~$)ftQoKUyD3m%vh;eI3?@F~JkJiS7FQ8@~Q) z+G7V#H~a*LbLFbe4rhGdcRqY(t|#3wTh}F!<>SwrT&7EOaDpzCbNoEY`DfvrRdR87 zJaApSxxAh@? z$Fb~DTijdVzUs z5HNe2Br1tT7d|YxkH;9(c%W$7_Q}j^tFYbdSaM63$8n#b=fz_Qs)Sr*FzOeq*H)6V z_om%kd7z{IRISLA3@&rEOwBwK#mHwKXs$zD_9KXFBZCMUCrV^+2P%kzJ2}t_|M$-X zhHpfN^>#`zE+=Rh38_v$8eZyHuv&)aY+46=8 zZv?|(oD?z~qdHVUenKC?{OKaJ5X)>#S9$0!&#J$*061Ycd ziOUyVI%-tTpr&F~*frFPj`0$Y!^=af==CV+#b0WI78{Fx9(kf|kIu2CxR9lp*w5S&cWHChS>tN({(S}wyl{{G zC6^pICQIR8Z$f+1PezLkDTEL$b#$oiTdSt(Ni!P1;Pu~?)uop*P48}Se;`yC)K1?F zjL1!Q&*7D0oGGv1tI_#m-KKs+dp0(5x5E0>mSP^s$l^d%>C4oYLy}wCxusr-1>rY# zyO4-OwC4iXH}oIiHqiX*A)|YO*Ie4{@;1(~^s&O6n9YiAy03OmZ)Lu{S!O)Ve+ikr zl6t)u2i3|PPRb^BYzt!`O*cKJK1J1!7aZ8URB}F2q{QHAC_N^;WpjD$Uf3L5Sf9C} zh10S9ZF2cshA||xlVd}?y|x8y5O2wSbco*U9h_*`?fI&PIDVVx9Li%+yY=meoWAYl z^}_r>w1Tkb`HWIvnt+WW&y_X{(w5GVkM!`abd3`|9@T}>c3&SLL06{S&#Mq8TW-|uYP!rrnwbA2V0>H^;+WpCMs|T(>p9||Gf-uLZP0}TsiP>x%9bJ z3xV{}&HZhNjkgaeduw;m&^1}Mg#W}i9W-vJyLL+#j%Fs|ltpQoBzrnOg?|t1_;o1c za>6P-{Khg*nvg3oK4S6DV{*zL`JK<{BlYWwv(HxZOPCT_XdXl1Xw3eCQ*|zu|WyBN_sXlYe9m`E!}@C6gN$X845Etm=1N` z3LXs|$ECMhi(9tCkLO|wf?I<92Ufz0@4F%aN<&hB9!kZLI=Yuiy0U=9+~ZV!|BcINT^@#7mh^?`R#&0+e%Q9+@t_+ zf6`C!n;JgRWv#B+Q^i;K%AtWKl1p9@cb?W>tDq9nk2V*K213L_fwK>bEdR0H6uTE% zbdpvz#pfqTcGE^(z?tQ)@$K&rb#cbBGXnvT1YN}VC&GP1$AmKL?Vid~^9J|DqLn`P z(PZBfZinwd%O7(YYwucjW|~0f3!j7ec?g|)3w~W%#A&tT?YWb+Kw^qqrflP5RmUIe z_oo-8VrF8A8g*_(V_D|+E!q&d$QMQ>At+VL16BW=vWz(6@X%CT!f=J<#Pq@?5t^?i z7dNMebN1gKOe>=!^9#<1ydw7qZ(Py!#g)c78u-YG0;!{!Ak7Dy1qpbm{l%4;B8#!nX)$TN#2qy8;^B-5-KO|;o5P3q@+u5EE<%mE){6_o|Bi;% zYqF_pYyGvMdo&(|6gTlmHQwA$s%ef1%gR_5D!^9*yG_5*r1BwpRdOs-VhnlC;R#*X zHQ#TZC#^=6V%#Z4kstW}5u_(F#{>TTh<0jra&O1O|5WGRdPR_J8q8Zj?4T6ZxH{Hj zTnN$u@h4c&1O^AEe0d2Y6>$G~0LZX2iVvGw}F@Ggks>j(9Ds4io8o#w4)BnbR?!<(E zDwygd8X1a}CvUkU5mV!@MwGh7?3|sc4~EJ7*oIA!obD!zfPe|^$AwL@Qo-0H9xyLg z?YKZn;_612#>N%*8AneM%(NOu$KmKe=YY?rnsU8XQ-OGg3eL2~zU;%(D&#T|f0t0LewiaN; zB6NHn)3n^UGdrQF&7+Z3xe@$!!zIniA8}z;>`2zYy$r=&f0yB#Kjw;8X<6fYiJHN} zDWmU773YJ7W8l4RZjk9oanfsp?T4SLw6pRMcWi|M}IqbnRm9FvppU!BXjqz4QcF=V6Y*#;q5QGTjCrm9EEsE}*znIOWa_s$~+@h70!$LbotsfdefqINs%{is#(V4Xj+4o?5VGUQG4( zIr2?y2#7Jd*Qc|j-1sQn&1uvW5-ezom_D#AgYo#cHLPdoSDcST*4I0xa}xM1p+8p6 zW48FhHEwv8(yR_7bLT##iyMFjI9KN}>n`F7{WPirQM{CI-p{(|A0Fe*_LS3Lc8p+T zC(KedLh|aB`t#wu8b!w7%8iJ2ufNh^hTB8_c@ZY{ZXP30kGWhL%MKX~71F%@Z1nGU zYuvEFHbaR=;L~%zd5!2cZ#w1XpEnI>8}1StWr)Qr+}C^~E9Xa?fheJ`y=0i?}NZ&DYd*ZG6>;Z}?b}5)RzN zEYdH`1IV$El{N%-+c)cW!RLzYM7V&OR3I^|h82vsIa`1KLz2zdR=p*=wQ^t>Fdh0mJsZni5= zuD`VUs77s4bKNTaR2mOq0YCWHa`jM{wYp9>G>ze((z^R13UwJwU=N@bw;BJ#x)bs2 z?1RyAE^v1;-3S9G-hFBHVVBlV60AvPbq&q|9nCxWL<|GQqt4Q8ygy)-D|~8d#g9MK z7i;PLtvuYS+CR0DsBZGEbWa%8Ju$dfrikm2!wDjxpPM)2BM300c`=1>7v~n5|Li0n zJ47U+GuL-HuBbR}HDfD5mG$;<-bCWQrc6M<&y}tKj#0J_jp?z5ADSlCE?n7+laAez ziwZ;E=+ZIbU*&DQj)yKA5(fAV+8X1=f!l$sswtjhGs5y%W>tCO+ib=|;L@_3CarS% z4bqL4?~E{!#?hg++rQ+VdeE!M4s)G*B&~0yk%BKce_R0ecOxi`@+w+| zO#}k(BA0v8W8gjmd%fKR-Lwxc1qhe>5|{>xW=%w88aL+Zx66<(OlaL?Uv2j$`1!{s z3)(K}e)MbG?1{AaK}w60DvJ5!qZ6+h109y^XW-0cT-#e&pY9k`fW#-(3@MfQMIZg7 z;H-i^$IMIT{s>GnIaX4Wwn0yq+~9>yYWWyEvVU4pr)uIMd^c;|;k$5rQudt+`wQ1Z z153uNKZOM3DH0nBedF&EGtktY?&HgqM*$)dZ9m1m?5~ZjGoon%J*G%@XdmxUhbp>1 zjkqiZcEe;Dtk+f=zPvKvyG^T(cBgTIt)ANbPpo5TrZ8RMH=U7Y^GBK|Z5%|HhPL8& zU%Ihp)`T=l!Mg1nC3%KYIHDR_g)8M#Ip?OZT$a=Q*3;K>!=U2pWZ8jqSZb$K08!-n z2gkW0^wAvw;6mah@Y{e-kqX&b@8Md@YA+0*7T)r4pq5wlRZM4df(I_s?^PKn{D2&M zbvL^3DC}<)H-FPcSR|?exGSs|4JXD?0&TXdSvW;pVqfQYm$bE#bAoiL#?%$d()7u8 zHlv8)7);Km(Ky3(b5AQ+N*iSLVrARdza+zht?(mjf1wrEfmYxUFv zdyWHIkC|)FT@n8#QupGF1l+1n2{D9=;GZII%4;4sM`th`-une3{(Hw-Epjlr1%WEs zI^nb212=~m-G*0@u%J!aFaDSD#zRmA=>lh%KqfCP*fjKm?%Q7ajoPearJGZdB*V2f z-hl)Qm^tl?4b5|UyNWdWN!icRnqAw~M~AGB6&`bXSD0Ejbca1SUe)#fu~?t7YGpfo zq>%2u=x&o#L|9siV8|#Jq`?T_=W<$oXlHni)`uXhU>MdZ9UGAG5n*XDxVf*aTrv6? zQ;dl*d!VR7k`28~{0$YT@?BH<>NqKcP;!u49JUwwoI}k%_PvssDhpjP5}Kcx;@-%; z9}vI#M99`KP1ZiGIlb&P*BYK}*!#go=@ZrRjYwzwWul2Jvvh<@=U# z@V>3wh`KW|@W9RP3VM)P`-6UsXY(;NkW8&m^5Z4Mi9PHPiE{7NBcW%>#a=2xPOfW7 zZ$IPzMO1dWO#PYj?42o#^vg={&1-VI zP>7mxA@yN=65rax{F zojRhheB6?FNo8#$kQ!IatE|?uI?m^n_otze5=0X}0r4}tm{_g2AFXZm-(E;?@wI31 zGhEX0mp^ncqAX5i=`Z?}P-oj1*=QiFl7{^2z;`30-jkistvm5gwi)ktWI`%u75|K# zqb4;7&7L?NHadB>QG?11ou{+(M?@!C&!C>t%}n>rgdwPm$r+4UvrR(H<^S3Ip0Ys}HtMSs5* zyH=h0f7}IVI5$@gA0N>)&6Shp>uQpV76e zEq6wFKcsDU+(ZOcY{?{)m6JvX)pCalGIpc#cWW$2SIf7mGBAJM{mBD%Y3fJmaSivKlhC7g$V3Wf(JJ) zig&73vZ&B#S6^n){5aHE^WF_~LxDANrrBoxPL7~#iO^>~VUyJ}f9Rv(fp7{@J3-zV z*VvR)>dCd0efqswIMHd&LPk<`-q>{ymdTGf+5kHSJx_idzTBXB$^UCT%JBs*Rd6dM zOABMApdGlv&@A>p5Z`yB&|1mKnoy+PD7|{4?cMmqziig(*)KWRb^T5A;GC)V?MAq- zzqXEj+tjh-DEL0*vUlq5d|oi3Ualh0T;k3mC2{@hZB=)Ls-p8jzRR7xb#lYA$~5eB zYHzK=TpV%(*4FzC2_@Tkfln3vCapLFWX6b_^;am-tUKN5(8E#Bu$P7mAryv*CVk8F zp`CRL88w5*&04XBx}$jbeG9dw+tQy@n?GM{$han|R3Ba%d({41R?oj8(GIY9dxj^7c)@qB)63IU&af{Fws#GdTRfrOqis_16 z|ERy>vd0`V);U*sc}7@v%pYS!6wgqXen&n%wETk9LHf^dy*Mv0u5I%;49;z=^cqb}6suv^p4QZTIS$iGtc5r~ zv;Vb**?1>1!}evpZ1g3m{_+>X{o~XR7_9 z)}1B!m{y*cZ}w{*%?8uXjC4C3_`lggOZ)6chrP6ptNrck-Huogd4ELEjZ zsa^18TceQ5OvIs$cW&WfRlD&-`;_f_7~N29!3*n8vy8tH76go6^`7F#o)-9I+5VIw z!oOko{49PE>3o0vWg!3evjHN&=5g$R{2uEoXnVly`q;vu(i3v*`EfsIV_o9$XHrZ1vq`y=EjrV%%(&xgKns9pdk$ z+-Im@<`qBRCo9N*D4O`L4V+6om{`5uBsQG0VdmaIF2lsj6(${vir7ytduniHm&FPO zT1tOxv`i#A!*b+wq`q59C65K3iw@kSbwShxM>s-4jrZ012ffmYf8;Fu@#;TMlFb~+ zv2s5m-Z+?~zG@cS?j>2RWRD9S_zYV-m%SXi$BRtWPkAQPKVp+yoTlI)(r3KRoG=hh z#O|h@lbUW`ujlr}S0EBq`l{a|I`T$0%I7ZR$yo;0H0T}u<~uP~-E+T~?vnL``!ciY zyY~HaKF=613h2TGk9g7?c7D|)f`UOKiNx@2zbN;UJldqs#KA8tzW%kcTDu7 zUKN`Z*SZR){P-i&fEJFE$ohz?8Y1JEgd#g9KKX8lxidXhnX&c}45Hq*&NP@A>8s?; z4VU<3^@!HBQyV*>hqd@iQswkizm1J;vT-iO7avnXkDs1P=N0Uye4W5}IuWy~%F+A2 zBm#e5y?4NIRC|j_71QqM(Umdu+3sck@b>4cu_J3Zw>R?Bcef?CEt+Ls9t&O{kEZNI zWzcniS7CXHLfec>1|72dxKgJ>GyWAssCdfs!OQXj9ehogRT9cb^!QVHo*OcUcsAT( zAYoXKs1FY0SmTCR&UE($7=u^F>_oaLo(M*F*zo&pDO`viT9vhZX-Lr-V&(Y+J1x0C zM&xDr>ZgQx>Fi>P$=dZO&j$`kX5>9{5^jb2)b%(kQ-5HLO&i#+#w$%1^ZUf+r^$sG zBp3OjC)CE@}j&C!XencOPpY6w8>;flq}gF`#I4Uy^;#d9p>izg+P9R) zVt{-$>Oy_n-%k_2ean@=m(Z4A+H4ieexqX1PW8FBs0CPJ3>j97;x>BXARY@RH#(F; zKB=ZlDkczFCd#s+>IJ!KKZ*~v@6ltK^^za>4B-O4MFo0$L)o;&hfXBQ;N#sS7+QDG zmqUg3aRo`%$3m?C`bK(R>_MsOcgZ(*b=Gr6wu_$f!hiUb>DqVVyT2I)y3~<6gV`P{ z(-jw#m)gYWxL1}pcelXtk5OKd^OeN1Hg9T&WT@c0_cW1JQ?j#5aeN=iOb*&xF$=uE z4qHO^M1RU%ZT-)=N*#T6VhXp>)vQxiU09UT{~m=Xtv*ZuG~m0Ljl5p3mzX z`w4@}xUmt!_u*h;l9=Io0QbHqoT5eO1l&u!I1k5*m zxBpIBhfe3(zft5$8N2k=$D|uO_n9AFrgnB?Fj7_+`*WFtW4Ucy7uxeYiH|A%#g=pB z@x_k+4X!{@zmJLF;@hds|5{xrOZy&~XF0>Z>XxVOy=(hDd(nTk?PY!ML+4zr*1!GP zQTn|M+NylH^$VC@9g_c39Z0&$czr?KJY<9E@4TKDj;G0JR{=YHRegbQwQvcv>(}1R z2juGPnkj^DW)}Eb$bZk)887nvy`OupI8|XE*_(eJg1%~5){0r}8$0LsASm{h2C(LB z{+18T_L)6#VU;zt-S?c{SD$ZW@7-Lnv-!P7!1^cS$o!|Qcvg3W*}45SBcOFikdFyv zOYs*{3{u9g?)*a3mxOlGgGqGR$-DN_)Q4)aZd*=9;^ zf*22a;@xD3fLFu$f6vxgF7lO5^7AggB&}NM)O$NGYn`xpa^{?HJLRgUp6hUflfz%y zq5QP8igD#{amrtM>Y;Ulo$tCvSUcY+?P=$V%l5Nxr^lWPxYbxrKM_z_@k}lUK5F}u zZpYF2wt49wu>Qb{KlaJOY+ZJ4Tu2rcJ<4MU>A|Xg;pHIL7V<%C>D6yXF!gynTL3sk`)Eeyaz~VnuI< zLO|}_MQep@S3hSt5zy^EGtImBSJ64Q{QcbVGIyTxcj`?6`v-A_a{=Yw+0*uN%3GB0 z!rDOlT?plZWRtGVgz=YW%SpvQvETft<3p1CysPd`YQ9IlK6kJjcKMw(j(OSHcurmA zLbf)2XX0tl>xq8#>3zQ3k#sA;IpHmH!RxI7=O|d5ILI9VuY>vD=Wp*7A;16g?@Rx= z{(37ZD*I2pRy+<@&CG+{EWN9M){pt@jG(lUx0xnuM@h53Fn4_H6Fci(YOUDWTv~D4 zM}urtK<7ee&;OR&cP&+3WA~WPurIM?U&AyjZ@cY&$Gi8UzC|6skzJn>>!c`rHq{py z2M_yWs`if6gOGL}@_#lO6pih<_4>eCv^H-FGq+zqJr&V8`R7#bV*Y1-YGXcB^}N7% z09-HrC{E5vPaK@T{HE`E%i)s9f1~Ir1Qy9});`D1T3dYH-qU$-PK|W>p-tac&!g3< z8!YQtv;S6qp&f!xITNn2)LLqY(&5%7{Y|8Erb>43lg^Y5$6e#SX= z#z{5l=JVHLDSvI?mGv%22hf#I&yx{Wr2VX?_?a^bewym=Cyadx%m11uNfl=n8qN3r zE$=_I%wBPZ-f#415b1KHqc-nYx~q$m_H~I90n;6BGm;m&DPYKcZ~Hb~5`}icpS(&b z1Nv&Satv}XEw_^oS;dAvTVDShmZu7a^!wX&ex`Rm-CW!(U0;2(yzw4-zuXOQew)&l zpgsj8A3%A^;Px`NrSnbx=9bG1|H67&WN(^c}_YHsad^Pj%yt!-E`b+Z`nvF2`JlW*Zyj|IO^_f z@{Igt&jnOEx#3L#+uz`37adF07udbKGwiG0`m~$+$tRiZ-%+xrd_D57x)+LheXqqj z*Kk`QA2P&^v@x!2@_xjZSN#OqPdaygDQ;yS3-fdGvJQl28K(oAbCTY^_%0hKPFiOT z_N@|^hY*@=(&fn);(3!eC+dG=NvnWT&2RaI6ra_b9JGYbp-ps{Ra1U(Y^Ha z7kDRCz{ZuCnv|s#WKf$@Ggdfxp7K&l`a=Yxm+3wOM;t@fwamsbJ za=X}V?A{k;zUq?R;^izoZ2e?+Rj{tut$yNsGQM(EUIp~}s%-iC<|mu@nYiuJI4S<6 z4G!M@@P{Y?UJB>`jpz@O*ca-OTk>_|_9N>jJZ)pA9NE+Jh|3-%%PeZ^v!HdeWur~8 zMf~GXoSLKUwBxiwr@Rl^uJ@3)QG436i@lv(|6IUyk1xLT!>>N^k+`C}haD>({icA* z=3Uz>zsSOBG5PJ?v(cY55^FQ-n`ex~KB{Qj7ylN|LljP}(^uCYuFHXC$JA`CuLcm3 znVR{AHR3QrNZz%oRGFUMo%AqIrYCp%+gb^m&kd5sL1-|!Z~AUd1Ux_Le`EQBpMPHw z{+wP#h!=>-YlHkLKkZyQs>TNjHS2lV&H0p}SoiSrWiw-6%dnME)kV*a8~APK-}Jb* zD&XEuu3rVbR9Q}0@#r@NR5ovK-#QTFg*0IoMQ7@fL;8KmYKrwpmWA3d(!yA^H)*?U z7$L~ti1IZguTXq#)q3IO`)tSMe&=#p`aYE3IKLcni(&g@0QGw~H;Y}xVa>-t?|fN4 z^vMy@Z|&C#-&Wd8#worJ&Zm_^FTAMaNx|-ixg+2OaQ@#Y{@@qh=iK)DT^xSmX(-Fw zXfZRAZ&DsE<9QsuYEW#s>L|k5C*$?@)7fTe*>SRockZe8PA3kU8Po6@($h zb#ifS*>!rbtWMV}A6{GztY}}}ywDrRp}6gOS3mv4L7$zyBcH<;;y5wXS4JqFIECwKtiHtoNt0gK+{O1W`+!lOI2gwupHmpW5usXDb*L@Ro(r;;dedWIOnyJ|oty}GX5_!; zEKPp)0oRT!>9+D=x0QH|SZQ=p?<+oC&G=&%LRX&K!f5LcXB`m5sl!`F^#} z&&Kh^tD9$YyW66&Mz{{GbqR>EYMc9wPnN4X+-8~A4-#wa6Xty9p)PaTYjNRkb32%` zV*dAe+6sQkQ8-y^SL1|*>7;J6&}HAtpxMK`FEPy3GiDt(b8$|b5mx5!j1ptAMfpeK zTr+X|yBc~TSn1;A*SK?fxU+HpzAicotlr>L8B&mc>YL+f9t4D~8+W0yx{GUfZYPx6 zgv3^kv+EFQ?b-{W(46^QyU=$$XJh48Hr|{?`fjG*@c9(L?Me}!zM^HKHhr_@3E$*4 zEXr z%2gD;Y-7Ecc+rMZ3tB(;3j34q=DE|qfKwnK6DysE}!Wz(84 z<6JZ-x~}ej)cLKCqY}THF8N@e1i1QrS$`hlOh4*h4c~pnVtvsI`mHf7L`-N;Kzx0Ehlq_3w!OJeJHhBW` z&dG+drW0w+GK4UD(!({clpDb9@ zPxVe}QSyixXP1s9IV2WSx32n_T#qVbN3JsTrAM}T+q6ykrmf3;x|cN$$7Jc(PMmY@ z;N2nrAdwae>zC}k_v7}g8|NAw>=m(kVQ6Tl3 zW9&L6z5I7S&iqP0b;&N`bsJgct1b{uFY@(OKrF5f(Y7s1m1lZ(h+8iZcFrBV`=ggn zO#hx2^}omVnO}JS9R9M|nW{LHf3Pb*CZ^k3Yn7VQQiL;qGkcz{n>;*2t#(Y-r}k}= zp6fq+_m#hPLA2O)w)7HJz@>`2zTs!70`45=u6^FiwIFWC%RIviymiG64kmv=T7+Lq0i^PpqZ}pE*`0rwMx&) zZ){9#@iTGJHXaA{!>$k6W7E?8V{g%`V)mmYI77i9-p@*@IX zV2@XhfT!*&N`B|XcG}&Z#UFFw2v9wXENj1IOW{z^HRxi?5c7n(S);q6Kk-N@g-O32 z)Z&Iddqcd_-^`->BWIkGNLLrwgf8;pTwJ&&!gTxOb>*|MMPzibz!|?0JrOV;!@PO= zp+Jj(FJDb_=KI{srJ)SxFC7s#E?{1Q(Pi zbH}Sm>H%mMWVrIEk@XgWocxN;l1iR+L>3Ev(xFuSlVj2|!+9fMy(=PM=N?Zl%Ux!7 z=Xo>xKC3iN`^yq!_9xs3T*)CN`x(`8kCBH$x;t$%Ib$Z9=P%CMoqnClJQ0~Du=Kn) z7qd~dRq_IYlkOc@CBmwO-`4u7g}L8l*S<`I>Gtux5-X}pnK1h^kqjcO4g?qK2ZU^$ z%zq9-zG~^jJLf+4a{AoMDaJnMifFifeORl?M8GrR{J%%?*^j?JD8KycFKFwmo{rd; zcbd&Lgk%m^JIBbnXNq^O`(`e&A8kkTCQ@&8XX{H-`tr)mlh9E^tkG2~&U8AU_sWpe zvC1pC+=?7dvEVc>qouYi@oEr0+>WJc|48RA)fRmE$i&Ay`A`D zqwR8Au6$0iZ_8wn~a22z!s;=TCz2bhe*OKfsuk!`(vK>_O3UX~P zu1!xT^-9any?T22G=1*X^to4)OD1!jD=+M=zE~E>`cQ zkFl=xc`+(KAm(ecd*CTOwQu5ASLvkQ?Ccmn%hu6Qo7QReWt1E`7Tc7{(YdOC`-*+~ zcrI53+*Kso>29llr(b<+>`Q$OXRU>Z`w`ylZRgF3RJ}@nJB{OnHccy!Fey`7?~f1@ zmvd^?4fF4aUz=4=1kT1_?K+E?_3LdNDXS`-R7z}BD2)qyli|<1Gp_yb1z>_ z>%O*Cv1k{PN}kJ$dCe-I_`F~ojr!mHnrnV;=kcqP`l)n1!U@H^xNe=sO|PO5OBeG; z!z}#yjTzxa2a~1H4_l4dO{^WE1 zn&V%qPx{V<-K#Z4UcK7pi4OYfkLUBbb``MP@M#M3 z|3V1UG=2ZK{b_A4u#x}n(P!r?JksCBa*iXJni1CSnlC5?yMavC(ydQ6Y%{+pYk%Uw*7)4*%iBrU zW44DUbTGdn?L%5Ix9hiwU2(1S20Fh^+OA)BP1;V$U#ql^umyBwrWm`B|L({<+dC73 zms>w@7stEKV5grdr*0pQv2~lGx1N9%Lf4<*&g9qi(2nF&`Mx8Bn17G!YNQA#doB@h z*SoYU0?OS6HQDr~E9r?H+Ce~^$rU<1a#Y$uW*JYua(nCI-}`znK^=C_NYd~ZM^YV8 zvfawl3)}nI3PV|#RJIiNZ5*Ggv+?S2mYH!`w7%}@(I!Pge3{&M*;i||2w1eNPx$le z^0|jsQ>aH???sD%&bjaZwm`yM0(~k0hJn&2RFTnjZ*O?SDDvV2GLZ$kZIiUB)m%-Rk4lBV9C+kN$FivLr4v-ef~nAfwtub!q?Pt(&B zUd7wHRx`iNh`lgUk0TWB&?F&9NJnjD~WXR zxRq^^JkQOlpLFFp>Em6aD|t|@8IU82Sz7J#RiE|%03ZNKL_t)_yenaUM|D5SD?4tO zH>d*c?c`pnfc?AM^R3x85#0YO%$KbF796pOII87ERX?|#!`F6Y^l102Ro3$8Bt4l} z{myh3^Qy5neiW-bmlPO_|CYPgI-Wb(zJt{thPudFU)7t=?N*yxQ@zIYYY_ooJt@sP z9t4~&pQi1v6E_7s1^Mr0n#nIJ=6uT=pybDeRy{9nrv3p5>io{~;Zu2%Z=MeOeiiG& zp>njzdnyYRNIttsMbe$sxU z%iZ*CB8|!zn0&}+%|VBC57OAg9$h^FJr6LitjWJ=|cG!@?XK8v9;R!)_1LUr+Y@TtCQ1j3h0`p zm!3VI{sPV4-=dlL)@wIaQHRl!;gWynxur@m{d>_~LTg~oty7QAx%?L=*o8>_xS`A= z_iSnX9JB`09!7o0a{8NT>^uHrofi^@9ja7Vzu4kh-ST8XeNGEkSuzxU;ARG@xFjla74gP)c>ySv;SZXf5M*w=bTWXvhUSdP1JTB88_Ys z`DQLz(Xn}{S7S%(Huf3TNmp`T_1#(3F?qlJztr3AQdHcaJOf6KZbwuBmFm%{Rls6W z?6^*j7|pIup7(vBH^mR>_Q$?4uw55#$sfVQ@l+Ru=AA1mj>@COR{awf#;>n63}xeW zOLZi2vXckX{&7hUS#e{r@LrCzHDR505|mUJ7o@l4vqoEVAXWjTySFn)&f@}B%% zdwMlFwF=n&I_kf11gQUA&zAfW_MfZ92k7d65m#!R7Yni;q+J;`#cc+sK1hk}t@>p0 zF|PI7TYj_@hgDApcGgIargYTvl27ZW(Y~xo?s*&Z@BJ|&=~?j{s({Ap(taO><;r*D zhzMx>it9l~`#I_Q9j><5U#769zVWExPkJw;{nvvzawLs2PsE*Xi$b-e)pZPDp=eSb z{$&yO8F;SFf^zbv?t zK&R|mIT1|x)Ts^WnChT3CVi;-2JLT7*KlI{?FhQ_ZJ-L+*Msnfe5PH{P`2Hcw?A%G z%XfUl5Q}EwYZcFL>)wwO&a`vN%g^_u?M5t9_J5
nv)_4OFLFAy<0ufCyTIX_EX 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

L3bJ(}M45U_J^sJOteicdD=|1kv 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¬CPUid2T_aJ7x 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 //for cheaper minwoski +use +use +use +use +use +use + +/*DES (Distorted Elliptical Saddle) Sculpted Profile for 6x3 and corne thumb +Version 2: Eliptical Rectangle + +*/ +//#square([18.16, 18.16], center = true); + +//TODO add shift +mirror([0,0,0])keycap(keyID = 2, cutLen = 0, Stem =true, Dish = true, Stab = 0 , visualizeDish = true, crossSection = false, homeDot = false, Legends = false); + +//n translate([0,19, 0])keycap(keyID = 3, cutLen = 0, Stem =true, Dish = true, visualizeDish = true, crossSection = true, homeDot = false, Legends = false); +// translate([0,38, 0])mirror([0,1,0])keycap(keyID = 2, cutLen = 0, Stem =true, Dish = true, visualizeDish = false, crossSection = true, homeDot = false, Legends = false); +RowHome = [0,2.5,5,2.5,0,0]; + +//for(Col = [6:6]){ +// for(Row = [1:3]){ +// translate([19*Col, 19*Row +RowHome[Col], 0])keycap(keyID = Col*4+Row, cutLen = 0, Stem = false, Dish = true, visualizeDish = false, crossSection = false,Legends = false); +// } +//} + +//////corne thumb +// translate([-15, -4, 0])rotate([0,0,30])keycap(keyID = 0, cutLen = 0, Stem =false, Dish = true, visualizeDish = false, crossSection = false); +// translate([6, 0, 0])rotate([0,0,15])keycap(keyID = 4, cutLen = 0, Stem =false, Dish = true, visualizeDish = false, crossSection = false); +// translate([26, 2.2, 0])rotate([0,0,0])keycap(keyID = 8, cutLen = 0, Stem =false, Dish = true, visualizeDish = false, crossSection = false); + +////kyria Thumb +// translate([-39, 0, 0])rotate([0,0,30])translate([0,-19.5, 0])keycap(keyID = 24, cutLen = 0, Stem =false, Dish = true, visualizeDish = false, crossSection = false); +// translate([-39, 0, 0])rotate([0,0,30])translate([0, -1, 0])keycap(keyID = 25, cutLen = 0, Stem =false, Dish = true, visualizeDish = false, crossSection = false); +// translate([-17, 0, 0])rotate([0,0,30])translate([0, 0, 0])keycap(keyID = 26, cutLen = 0, Stem =false, Dish = true, visualizeDish = false, crossSection = false); +// translate([6, 0, 0])rotate([0,0,15])keycap(keyID = 27, cutLen = 0, Stem =false, Dish = true, visualizeDish = false, crossSection = false); +// translate([26, 2.2, 0])rotate([0,0,0])keycap(keyID = 28, cutLen = 0, Stem =false, Dish = true, visualizeDish = false, crossSection = false); + +//normie hipro +// for(Row = [0:4]){ +// translate([0, 19*Row, 0])keycap(keyID = 29+Row, cutLen = 0, Stem = false, Dish = true, visualizeDish = false, crossSection = false,Legends = false); +// } + +//#translate([0,38,13])cube([18-5.7, 18-5.7,1],center = true); + +//Parameters +wallthickness = 2; +topthickness = 3; // +stepsize = 50; //resolution of Trajectory +step = 1; //resolution of ellipes +fn = 64; //resolution of Rounded Rectangles: 60 for output +layers = 40; //resolution of vertical Sweep: 50 for output +dotRadius = 1.25; //home dot size +//---Stem param +slop = 0.25; +stemRot = 0; +stemWid = 7.2; +stemLen = 5.5; +stemCrossHeight = 4; +extra_vertical = 0.6; +StemBrimDep = 0.75; +stemLayers = 50; //resolution of stem to cap top transition + +keyParameters = //keyParameters[KeyID][ParameterID] +[ +// BotWid, BotLen, TWDif, TLDif, keyh, WSft, LSft XSkew, YSkew, ZSkew, WEx, LEx, CapR0i, CapR0f, CapR1i, CapR1f, CapREx, StemEx +//normie hipro + [17.16, 17.16, 6.5, 6.5, 11, 0, 0, -10, 0, 0, 2, 2, 1, 5, 1, 3.5, 2, 2], //R5 + [17.16*2,17.16, 6.5, 6.5, 11, 0, 0, -10, 0, 0, 2, 2, 1, 5, 1, 3.5, 2, 2], //R5 2u + [17.16, 17.16, 6.5, 6.5, 9, 0, 0, 3, 0, 0, 2, 2, 1, 5, 1, 3.5, 2, 2], //R3 Home + [17.16, 17.16, 6.5, 6.5, 10, 0, 0, -11, 0, 0, 2, 2, 1, 5, 1, 3.5, 2, 2], //R2 + [17.16, 17.16, 6.5, 6.5, 14.0, 0, 0, -14, 0, 0, 2, 2, 1, 5, 1, 3.5, 2, 2], //R1 +]; + +dishParameters = //dishParameter[keyID][ParameterID] +[ +//FFwd1 FFwd2 FPit1 FPit2 DshDepi DishDepf,DshHDif FArcIn FArcFn FArcEx BFwd1 BFwd2 BPit1 BPit2 BArcIn BArcFn BArcEx + [ 3, 3, -10, -50, 3, 7, 8.2, 9, 2, 5, 3, 0, -30, 8.2, 9, 2], //R5 + [ 3, 3, -10, -50, 3, 7, 18.2, 21, 2, 5, 3, 0, -30, 18.2, 21, 2], //R4 + [ 3, 3, -10, -50, 3, 7, 8.8, 9, 2, 4, 3, -5, -30, 8.8, 9, 2], //R3 + [ 6, 3, 10, -50, 5, 1.8, 8.8, 15, 2, 5, 4, 12, -55, 8.8, 16, 2], //R2 + [ 5, 3.5, 8, -50, 5, 1.8, 8.8, 15, 2, 6, 4, 13, 30, 8.8, 16, 2], //R1 +]; + +function FrontForward1(keyID) = dishParameters[keyID][0]; // +function FrontForward2(keyID) = dishParameters[keyID][1]; // +function FrontPitch1(keyID) = dishParameters[keyID][2]; // +function FrontPitch2(keyID) = dishParameters[keyID][3]; // +function DishDepth(keyID) = dishParameters[keyID][4]; // +function DishHeightDif(keyID) = dishParameters[keyID][5]; // +function FrontInitArc(keyID) = dishParameters[keyID][6]; +function FrontFinArc(keyID) = dishParameters[keyID][7]; +function FrontArcExpo(keyID) = dishParameters[keyID][8]; +function BackForward1(keyID) = dishParameters[keyID][9]; // +function BackForward2(keyID) = dishParameters[keyID][10]; // +function BackPitch1(keyID) = dishParameters[keyID][11]; // +function BackPitch2(keyID) = dishParameters[keyID][12]; // +function BackInitArc(keyID) = dishParameters[keyID][13]; +function BackFinArc(keyID) = dishParameters[keyID][14]; +function BackArcExpo(keyID) = dishParameters[keyID][15]; + +function BottomWidth(keyID) = keyParameters[keyID][0]; // +function BottomLength(keyID) = keyParameters[keyID][1]; // +function TopWidthDiff(keyID) = keyParameters[keyID][2]; // +function TopLenDiff(keyID) = keyParameters[keyID][3]; // +function KeyHeight(keyID) = keyParameters[keyID][4]; // +function TopWidShift(keyID) = keyParameters[keyID][5]; +function TopLenShift(keyID) = keyParameters[keyID][6]; +function XAngleSkew(keyID) = keyParameters[keyID][7]; +function YAngleSkew(keyID) = keyParameters[keyID][8]; +function ZAngleSkew(keyID) = keyParameters[keyID][9]; +function WidExponent(keyID) = keyParameters[keyID][10]; +function LenExponent(keyID) = keyParameters[keyID][11]; +function CapRound0i(keyID) = keyParameters[keyID][12]; +function CapRound0f(keyID) = keyParameters[keyID][13]; +function CapRound1i(keyID) = keyParameters[keyID][14]; +function CapRound1f(keyID) = keyParameters[keyID][15]; +function ChamExponent(keyID) = keyParameters[keyID][16]; +function StemExponent(keyID) = keyParameters[keyID][17]; + +function FrontTrajectory(keyID) = + [ + trajectory(forward = FrontForward1(keyID), pitch = FrontPitch1(keyID)), //more param available: yaw, roll, scale + trajectory(forward = FrontForward2(keyID), pitch = FrontPitch2(keyID)) //You can add more traj if you wish + ]; + +function BackTrajectory (keyID) = + [ + trajectory(forward = BackForward1(keyID), pitch = BackPitch1(keyID)), + trajectory(forward = BackForward2(keyID), pitch = BackPitch2(keyID)), + ]; + +//------- function defining Dish Shapes + +function ellipse(a, b, d = 0, rot1 = 0, rot2 = 360) = [for (t = [rot1:step:rot2]) [a*cos(t)+a, b*sin(t)*(1+d*cos(t))]]; //Centered at a apex to avoid inverted face + +function DishShape (a,b,c,d) = + concat( + [[c+a,-b]], + ellipse(a, b, d = 0,rot1 = 270, rot2 =450), + [[c+a,b]] + ); + +function oval_path(theta, phi, a, b, c, deform = 0) = [ + a*cos(theta)*cos(phi), //x + c*sin(theta)*(1+deform*cos(theta)) , // + b*sin(phi), +]; + +path_trans2 = [for (t=[0:step:180]) translation(oval_path(t,0,10,15,2,0))*rotation([0,90,0])]; + + +//--------------Function definng Cap +function CapTranslation(t, keyID) = + [ + ((1-t)/layers*TopWidShift(keyID)), //X shift + ((1-t)/layers*TopLenShift(keyID)), //Y shift + (t/layers*KeyHeight(keyID)) //Z shift + ]; + +function InnerTranslation(t, keyID) = + [ + ((1-t)/layers*TopWidShift(keyID)), //X shift + ((1-t)/layers*TopLenShift(keyID)), //Y shift + (t/layers*(KeyHeight(keyID)-topthickness)) //Z shift + ]; + +function CapRotation(t, keyID) = + [ + ((1-t)/layers*XAngleSkew(keyID)), //X shift + ((1-t)/layers*YAngleSkew(keyID)), //Y shift + ((1-t)/layers*ZAngleSkew(keyID)) //Z shift + ]; + +function CapTransform(t, keyID) = + [ + pow(t/layers, WidExponent(keyID))*(BottomWidth(keyID) -TopWidthDiff(keyID)) + (1-pow(t/layers, WidExponent(keyID)))*BottomWidth(keyID) , + pow(t/layers, LenExponent(keyID))*(BottomLength(keyID)-TopLenDiff(keyID)) + (1-pow(t/layers, LenExponent(keyID)))*BottomLength(keyID) + ]; +function CapRoundness(t, keyID) = + [ + pow(t/layers, ChamExponent(keyID))*(CapRound0f(keyID)) + (1-pow(t/layers, ChamExponent(keyID)))*CapRound0i(keyID), + pow(t/layers, ChamExponent(keyID))*(CapRound1f(keyID)) + (1-pow(t/layers, ChamExponent(keyID)))*CapRound1i(keyID) + ]; + +function CapRadius(t, keyID) = pow(t/layers, ChamExponent(keyID))*ChamfFinRad(keyID) + (1-pow(t/layers, ChamExponent(keyID)))*ChamfInitRad(keyID); + +function InnerTransform(t, keyID) = + [ + pow(t/layers, WidExponent(keyID))*(BottomWidth(keyID) -TopLenDiff(keyID)-wallthickness*2) + (1-pow(t/layers, WidExponent(keyID)))*(BottomWidth(keyID) -wallthickness*2), + pow(t/layers, LenExponent(keyID))*(BottomLength(keyID)-TopLenDiff(keyID)-wallthickness*2) + (1-pow(t/layers, LenExponent(keyID)))*(BottomLength(keyID)-wallthickness*2) + ]; + +function StemTranslation(t, keyID) = + [ + ((1-t)/stemLayers*TopWidShift(keyID)), //X shift + ((1-t)/stemLayers*TopLenShift(keyID)), //Y shift + stemCrossHeight+.1+StemBrimDep + (t/stemLayers*(KeyHeight(keyID)- topthickness - stemCrossHeight-.1 -StemBrimDep)) //Z shift + ]; + +function StemRotation(t, keyID) = + [ + ((1-t)/stemLayers*XAngleSkew(keyID)), //X shift + ((1-t)/stemLayers*YAngleSkew(keyID)), //Y shift + ((1-t)/stemLayers*ZAngleSkew(keyID)) //Z shift + ]; + +function StemTransform(t, keyID) = + [ + pow(t/stemLayers, StemExponent(keyID))*(BottomWidth(keyID) -TopLenDiff(keyID)-wallthickness) + (1-pow(t/stemLayers, StemExponent(keyID)))*(stemWid - 2*slop), + pow(t/stemLayers, StemExponent(keyID))*(BottomLength(keyID)-TopLenDiff(keyID)-wallthickness) + (1-pow(t/stemLayers, StemExponent(keyID)))*(stemLen - 2*slop) + ]; + +function StemRadius(t, keyID) = pow(t/stemLayers,3)*3 + (1-pow(t/stemLayers, 3))*1; + //Stem Exponent + + +///----- KEY Builder Module +module keycap(keyID = 0, cutLen = 0, visualizeDish = false, rossSection = false, Dish = true, Stem = false, homeDot = false, Stab = 0) { + + //Set Parameters for dish shape + FrontPath = quantize_trajectories(FrontTrajectory(keyID), steps = stepsize, loop=false, start_position= $t*4); + BackPath = quantize_trajectories(BackTrajectory(keyID), steps = stepsize, loop=false, start_position= $t*4); + + //Scaling initial and final dim tranformation by exponents + function FrontDishArc(t) = pow((t)/(len(FrontPath)),FrontArcExpo(keyID))*FrontFinArc(keyID) + (1-pow(t/(len(FrontPath)),FrontArcExpo(keyID)))*FrontInitArc(keyID); + function BackDishArc(t) = pow((t)/(len(FrontPath)),BackArcExpo(keyID))*BackFinArc(keyID) + (1-pow(t/(len(FrontPath)),BackArcExpo(keyID)))*BackInitArc(keyID); + + FrontCurve = [ for(i=[0:len(FrontPath)-1]) transform(FrontPath[i], DishShape(DishDepth(keyID), FrontDishArc(i), DishDepth(keyID)+1.5, d = 0)) ]; + BackCurve = [ for(i=[0:len(BackPath)-1]) transform(BackPath[i], DishShape(DishDepth(keyID), BackDishArc(i), DishDepth(keyID)+1.5, d = 0)) ]; + + //builds + difference(){ + union(){ + difference(){ + skin([for (i=[0:layers-1]) transform(translation(CapTranslation(i, keyID)) * rotation(CapRotation(i, keyID)), elliptical_rectangle(CapTransform(i, keyID), b = CapRoundness(i,keyID),fn=fn))]); //outer shell + + //Cut inner shell + if(Stem == true){ + translate([0,0,-.001])skin([for (i=[0:layers-1]) transform(translation(InnerTranslation(i, keyID)) * rotation(CapRotation(i, keyID)), elliptical_rectangle(InnerTransform(i, keyID), b = CapRoundness(i,keyID),fn=fn))]); + } + } + if(Stem == true){ + translate([0,0,StemBrimDep])rotate([0,0,stemRot])cherry_stem(KeyHeight(keyID)-StemBrimDep, slop); // generate mx cherry stem, not compatible with box + if (Stab != 0){ + translate([Stab/2,0,0])rotate([0,0,stemRot])cherry_stem(KeyHeight(keyID), slop); + translate([-Stab/2,0,0])rotate([0,0,stemRot])cherry_stem(KeyHeight(keyID), slop); + //TODO add binding support? + } + translate([0,0,-.001])skin([for (i=[0:stemLayers-1]) transform(translation(StemTranslation(i,keyID))*rotation(StemRotation(i, keyID)), rounded_rectangle_profile(StemTransform(i, keyID),fn=fn,r=StemRadius(i, keyID)))]); //Transition Support for taller profile + } + //cut for fonts and extra pattern for light? + } + + //Cuts + + //Fonts + if(Legends == true){ + #rotate([-XAngleSkew(keyID),YAngleSkew(keyID),ZAngleSkew(keyID)])translate([-0,0,KeyHeight(keyID)-2.0])linear_extrude(height = 1)text( text = "No U", font = "Constantia:style=Bold", size = 3, valign = "center", halign = "center" ); + // #rotate([-XAngleSkew(keyID),YAngleSkew(keyID),ZAngleSkew(keyID)])translate([0,-3.5,0])linear_extrude(height = 0.5)text( text = "Me", font = "Constantia:style=Bold", size = 3, valign = "center", halign = "center" ); + } + //Dish Shape + if(Dish == true){ + if(visualizeDish == false){ + translate([-TopWidShift(keyID),.00001-TopLenShift(keyID),KeyHeight(keyID)-DishHeightDif(keyID)])rotate([0,-YAngleSkew(keyID),0])rotate([0,-90+XAngleSkew(keyID),90-ZAngleSkew(keyID)])skin(FrontCurve); + translate([-TopWidShift(keyID),-TopLenShift(keyID),KeyHeight(keyID)-DishHeightDif(keyID)])rotate([0,-YAngleSkew(keyID),0])rotate([0,-90-XAngleSkew(keyID),270-ZAngleSkew(keyID)])skin(BackCurve); + } else { + #translate([-TopWidShift(keyID),.00001-TopLenShift(keyID),KeyHeight(keyID)-DishHeightDif(keyID)]) rotate([0,-YAngleSkew(keyID),0])rotate([0,-90+XAngleSkew(keyID),90-ZAngleSkew(keyID)])skin(FrontCurve); + #translate([-TopWidShift(keyID),-TopLenShift(keyID),KeyHeight(keyID)-DishHeightDif(keyID)])rotate([0,-YAngleSkew(keyID),0])rotate([0,-90-XAngleSkew(keyID),270-ZAngleSkew(keyID)])skin(BackCurve); + } + } + if(crossSection == true) { + translate([0,-15,-.1])cube([15,30,15]); + } + } + //Homing dot + if(homeDot == true)translate([0,0,KeyHeight(keyID)-DishHeightDif(keyID)-.25])sphere(d = dotRadius); +} + +//------------------stems +$fn = fn; + +function outer_cherry_stem(slop) = [ stemWid - slop * 2, stemLen - slop * 2]; +function outer_cherry_stabilizer_stem(slop) = [4.85 - slop * 2, 6.05 - slop * 2]; +function outer_box_cherry_stem(slop) = [6 - slop, 6 - slop]; + +// .005 purely for aesthetics, to get rid of that ugly crosshatch +function cherry_cross(slop, extra_vertical = 0) = [ + // horizontal tine + [4.03 + slop, 1.15 + slop / 3], + // vertical tine + [1.25 + slop / 3, 4.23 + extra_vertical + slop / 3 + .005], +]; +module inside_cherry_cross(slop) { + // inside cross + // translation purely for aesthetic purposes, to get rid of that awful lattice + translate([0,0,-0.005]) { + linear_extrude(height = stemCrossHeight) { + square(cherry_cross(slop, extra_vertical)[0], center=true); + square(cherry_cross(slop, extra_vertical)[1], center=true); + } + } + + // Guides to assist insertion and mitigate first layer squishing + { + for (i = cherry_cross(slop, extra_vertical)) hull() { + linear_extrude(height = 0.01, center = false) offset(delta = 0.4) square(i, center=true); + translate([0, 0, 0.5]) linear_extrude(height = 0.01, center = false) square(i, center=true); + } + } +} + +module cherry_stem(depth, slop) { + D1=.15; + D2=.05; + H1=3.5; + CrossDist = 1.75; + difference(){ + // outside shape + linear_extrude(height = depth) { + offset(r=1){ + square(outer_cherry_stem(slop) - [2,2], center=true); + } + } + inside_cherry_cross(slop); + hull(){ + translate([CrossDist,CrossDist-.1,0])cylinder(d1=D1, d2=D2, H1); + translate([-CrossDist,-CrossDist+.1,0])cylinder(d1=D1, d2=D2, H1); + } + hull(){ + translate([-CrossDist,CrossDist-.1])cylinder(d1=D1, d2=D2, H1); + translate([CrossDist,-CrossDist+.1])cylinder(d1=D1, d2=D2, H1); + } + } +} + +module choc_stem() { + + translate([5.7/2,0,-3.4/2+2])difference(){ + cube([1.25,3, 3.4], center= true); + translate([3.9,0,0])cylinder(d=7,3.4,center = true); + translate([-3.9,0,0])cylinder(d=7,3.4,center = true); + } + translate([-5.7/2,0,-3.4/2+2])difference(){ + cube([1.25,3, 3.4], center= true); + translate([3.9,0,0])cylinder(d=7,3.4,center = true); + translate([-3.9,0,0])cylinder(d=7,3.4,center = true); + } + +} +/// ----- helper functions +function rounded_rectangle_profile(size=[1,1],r=1,fn=32) = [ + for (index = [0:fn-1]) + let(a = index/fn*360) + r * [cos(a), sin(a)] + + sign_x(index, fn) * [size[0]/2-r,0] + + sign_y(index, fn) * [0,size[1]/2-r] +]; + +function elliptical_rectangle(a = [1,1], b =[1,1], fn=32) = [ + for (index = [0:fn-1]) // section right + let(theta1 = -atan(a[1]/b[1])+ 2*atan(a[1]/b[1])*index/fn) + [b[1]*cos(theta1), a[1]*sin(theta1)] + + [a[0]*cos(atan(b[0]/a[0])) , 0] + - [b[1]*cos(atan(a[1]/b[1])) , 0], + + for(index = [0:fn-1]) // section Top + let(theta2 = atan(b[0]/a[0]) + (180 -2*atan(b[0]/a[0]))*index/fn) + [a[0]*cos(theta2), b[0]*sin(theta2)] + - [0, b[0]*sin(atan(b[0]/a[0]))] + + [0, a[1]*sin(atan(a[1]/b[1]))], + + for(index = [0:fn-1]) // section left + let(theta2 = -atan(a[1]/b[1])+180+ 2*atan(a[1]/b[1])*index/fn) + [b[1]*cos(theta2), a[1]*sin(theta2)] + - [a[0]*cos(atan(b[0]/a[0])) , 0] + + [b[1]*cos(atan(a[1]/b[1])) , 0], + + for(index = [0:fn-1]) // section Top + let(theta2 = atan(b[0]/a[0]) + 180 + (180 -2*atan(b[0]/a[0]))*index/fn) + [a[0]*cos(theta2), b[0]*sin(theta2)] + + [0, b[0]*sin(atan(b[0]/a[0]))] + - [0, a[1]*sin(atan(a[1]/b[1]))] +]/2; + +function sign_x(i,n) = + i < n/4 || i > n-n/4 ? 1 : + i > n/4 && i < n-n/4 ? -1 : + 0; + +function sign_y(i,n) = + i > 0 && i < n/2 ? 1 : + i > n/2 ? -1 : + 0; diff --git a/DES_Cornes.scad b/DES_MX_Corne+Kyria.scad similarity index 92% rename from DES_Cornes.scad rename to DES_MX_Corne+Kyria.scad index 9718125..736e353 100644 --- a/DES_Cornes.scad +++ b/DES_MX_Corne+Kyria.scad @@ -13,18 +13,18 @@ Version 2: Eliptical Rectangle //#square([18.16, 18.16], center = true); //TODO add shift -keycap(keyID = 28, cutLen = 0, Stem =true, Dish = true, Stab = 0 , visualizeDish = false, crossSection = false, homeDot = false, Legends = false); +mirror([1,0,0])keycap(keyID = 33, cutLen = 0, Stem =true, Dish = true, Stab = 0 , visualizeDish = false, crossSection = false, homeDot = false, Legends = false); -// translate([0,19, 0])keycap(keyID = 3, cutLen = 0, Stem =true, Dish = true, visualizeDish = true, crossSection = true, homeDot = false, Legends = false); +//n translate([0,19, 0])keycap(keyID = 3, cutLen = 0, Stem =true, Dish = true, visualizeDish = true, crossSection = true, homeDot = false, Legends = false); // translate([0,38, 0])mirror([0,1,0])keycap(keyID = 2, cutLen = 0, Stem =true, Dish = true, visualizeDish = false, crossSection = true, homeDot = false, Legends = false); RowHome = [0,2.5,5,2.5,0,0]; -//for(Col = [0:2]){ +//for(Col = [6:6]){ // for(Row = [1:3]){ // translate([19*Col, 19*Row +RowHome[Col], 0])keycap(keyID = Col*4+Row, cutLen = 0, Stem = false, Dish = true, visualizeDish = false, crossSection = false,Legends = false); // } //} -//// + //////corne thumb // translate([-15, -4, 0])rotate([0,0,30])keycap(keyID = 0, cutLen = 0, Stem =false, Dish = true, visualizeDish = false, crossSection = false); // translate([6, 0, 0])rotate([0,0,15])keycap(keyID = 4, cutLen = 0, Stem =false, Dish = true, visualizeDish = false, crossSection = false); @@ -37,6 +37,13 @@ RowHome = [0,2.5,5,2.5,0,0]; // translate([6, 0, 0])rotate([0,0,15])keycap(keyID = 27, cutLen = 0, Stem =false, Dish = true, visualizeDish = false, crossSection = false); // translate([26, 2.2, 0])rotate([0,0,0])keycap(keyID = 28, cutLen = 0, Stem =false, Dish = true, visualizeDish = false, crossSection = false); +//normie hipro +// for(Row = [0:4]){ +// translate([0, 19*Row, 0])keycap(keyID = 29+Row, cutLen = 0, Stem = false, Dish = true, visualizeDish = false, crossSection = false,Legends = false); +// } + +//#translate([0,38,13])cube([18-5.7, 18-5.7,1],center = true); + //Parameters wallthickness = 2; topthickness = 3; // @@ -48,8 +55,8 @@ dotRadius = 1.25; //home dot size //---Stem param slop = 0.25; stemRot = 0; -stemWid = 7.2; -stemLen = 5.5; +stemWid = 5.5; +stemLen = 7.2; stemCrossHeight = 4; extra_vertical = 0.6; StemBrimDep = 0.75; @@ -59,17 +66,17 @@ keyParameters = //keyParameters[KeyID][ParameterID] [ // BotWid, BotLen, TWDif, TLDif, keyh, WSft, LSft XSkew, YSkew, ZSkew, WEx, LEx, CapR0i, CapR0f, CapR1i, CapR1f, CapREx, StemEx //Column 0 - [17.16, 17.16*1.5, 6, 7, 13, 0, 0, -13, 10, -5, 2, 2, 1, 4.85, 1, 3, 2, 2], //R5 0 + [17.16, 17.16*1.5, 6, 7, 13, 0, 0, -13, 10, -5, 2, 2, 1, 4.85, 1, 3, 2, 2], //R5 0 Corne thumb [17.16, 17.16, 6.5, 6.5, 9+4, 0, 0, 12, -10, -5, 2, 2, 1, 5, 1, 3.5, 2, 2], //R4 [17.16, 17.16, 6.5, 6.5, 8+4, 0, 0, -2, -10, -5, 2, 2, 1, 5, 1, 3.5, 2, 2], //R3 Home [17.16, 17.16, 6.5, 6.5, 9+4, 0, 0, -10, -10, -5, 2, 2, 1, 5, 1, 3.5, 2, 2], //R2 //Column 1 - [17.16, 17.16, 4, 5, 14, 0, 0, -13, 5, 0, 2, 2, 1, 5, 1, 3, 2, 2], //R5 4 + [17.16, 17.16, 4, 5, 14, 0, 0, -13, 5, 0, 2, 2, 1, 5, 1, 3, 2, 2], //R5 4 corne thumb [17.16, 17.16, 6.5, 6.5, 9+3, 0, 0, 12, -3, 0, 2, 2, 1, 5, 1, 3.5, 2, 2], //R4 [17.16, 17.16, 6.5, 6.5,8+2.5, 0, 0, -2, -3, 0, 2, 2, 1, 5, 1, 3.5, 2, 2], //R3 Home [17.16, 17.16, 6.5, 6.5, 9+3, 0, 0, -12, -3, 0, 2, 2, 1, 5, 1, 3.5, 2, 2], //R2 //Column 2 middle - [17.16, 17.16, 4, 6, 15, 0, 0, -13, 10, 15, 2, 2, 1, 5, 1, 2, 2, 2], //R5 8 + [17.16, 17.16, 4, 6, 15, 0, 0, -13, 10, 15, 2, 2, 1, 5, 1, 2, 2, 2], //R5 8 corne thumb [17.16, 17.16, 6.5, 6.5, 9, 0, 0, 10, 0, 0, 2, 2, 1, 5, 1, 3.5, 2, 2], //R4 [17.16, 17.16, 6.5, 6.5, 8, 0, 0, -2, 0, 0, 2, 2, 1, 5, 1, 3.5, 2, 2], //R3 Home [17.16, 17.16, 6.5, 6.5, 9, 0, 0, -12, 0, 0, 2, 2, 1, 5, 1, 3.5, 2, 2], //R2 @@ -94,7 +101,12 @@ keyParameters = //keyParameters[KeyID][ParameterID] [17.16, 17.16*2, 6, 7, 11, 0, 0, -8, 10, -5, 2, 2, 1, 4.85, 1, 3.5, 2, 2], //T1R1 2u [17.16, 17.16, 4, 5, 12, 0, 0, -13, 5, 0, 2, 2, 1, 5, 1, 3.5, 2, 2], //T2R1 [17.16, 17.16, 4, 6, 13, 0, 0, -13, 10, 15, 2, 2, 1, 5, 1, 2, 2, 2], //T3R1 - +//normie hipro + [17.16, 17.16, 6.5, 6.5, 11, 0, 0, -11, 0, 0, 2, 2, 1, 5, 1, 3.5, 2, 2], //R5 8 corne thumb + [17.16, 17.16, 6.5, 6.5, 11.0, 0, 0, 9, 0, 0, 2, 2, 1, 5, 1, 3.5, 2, 2], //R4 + [17.16, 17.16, 6.5, 6.5, 9, 0, 0, 3, 0, 0, 2, 2, 1, 5, 1, 3.5, 2, 2], //R3 Home + [17.16, 17.16, 6.5, 6.5, 10, 0, 0, -11, 0, 0, 2, 2, 1, 5, 1, 3.5, 2, 2], //R2 + [17.16, 17.16, 6.5, 6.5, 14.0, 0, 0, -14, 0, 0, 2, 2, 1, 5, 1, 3.5, 2, 2], //R1 ]; dishParameters = //dishParameter[keyID][ParameterID] @@ -136,6 +148,12 @@ dishParameters = //dishParameter[keyID][ParameterID] [ 13, 4.5, 7, -39, 4, 1.8, 9.5, 15, 2, 13, 4, 8, -30, 9.5, 20, 2], //T1R1 2u [ 5, 4.4, 5, -48, 5, 2, 10.5, 10, 2, 6, 4, 13, -30, 10.5, 18, 2], //T2R1 [ 5, 4.4, 5, -48, 4, 1.9, 11, 12, 2, 6, 4, 13, -35, 11, 28, 2], //T3R1 + + [ 6, 3, 10, -50, 5, 1.8, 8.8, 15, 2, 6, 4, 13, 30, 8.8, 16, 2], //R5 + [ 6, 3, 18, -50, 5, 1.8, 8.8, 15, 2, 5, 4.4, 5, -55, 8.8, 15, 2], //R4 + [ 6, 3, 18, -55, 5, 1.8, 8.8, 15, 2, 5, 3.5, 8, -55, 8.8, 15, 2], //R3 + [ 6, 3, 10, -50, 5, 1.8, 8.8, 15, 2, 5, 4, 12, -55, 8.8, 16, 2], //R2 + [ 5, 3.5, 8, -50, 5, 1.8, 8.8, 15, 2, 6, 4, 13, 30, 8.8, 16, 2], //R1 ]; function FrontForward1(keyID) = dishParameters[keyID][0]; // diff --git a/DES_MiniWarp.scad b/DES_MX_MiniWarp.scad similarity index 100% rename from DES_MiniWarp.scad rename to DES_MX_MiniWarp.scad diff --git a/RP_MX.scad b/RP_MX.scad index 91d3cf1..0d0d532 100644 --- a/RP_MX.scad +++ b/RP_MX.scad @@ -9,15 +9,15 @@ use //DP (Distored Pyramidal) [Double Penetration] Profile //TODO add shift -keycap(keyID = 9, cutLen = 0, Stem =true, Dish = true, visualizeDish = true, crossSection = false, homeDot = false, Legends = false); +translate([0, -19, 0])keycap(keyID = 4, cutLen = 0, Stem =true, Dish = true, visualizeDish = true, crossSection = false, homeDot = false, Legends = false); ////fullsetee RowHome = [0,2.5,5,2.5,0,0]; -//for(Col = [4:4]){ -// for(Row = [1:3]){ -// translate([19*Col, 19*Row +RowHome[Col], 0])keycap(keyID = Col*4+Row, cutLen = 0, Stem = true, Dish = true, visualizeDish = false, crossSection = true); -// } -//} +for(Col = [0:0]){ + for(Row = [0:3]){ + translate([19*Col, 19*Row +RowHome[Col], 0])keycap(keyID = Col*4+Row, cutLen = 0, Stem = true, Dish = true, visualizeDish = true, crossSection = false); + } +} ////// thumb // translate([-15, -4, 0])rotate([0,0,30])keycap(keyID = 0, cutLen = 0, Stem =false, Dish = true, visualizeDish = false, crossSection = false); @@ -25,12 +25,12 @@ RowHome = [0,2.5,5,2.5,0,0]; // translate([31, 2.2, 0])rotate([0,0,0])keycap(keyID = 8, cutLen = 0, Stem =false, Dish = true, visualizeDish = false, crossSection = false); //Parameters -wallthickness = 1.75; +wallthickness = 1.95; topthickness = 2.5; -stepsize = 30; //resolution of Trajectory -step = 4; //resolution of ellipes +stepsize = 50; //resolution of Trajectory +step = 6; //resolution of ellipes fn = 32; //resolution of Rounded Rectangles: 60 for output -layers = 30; //resolution of vertical Sweep: 50 for output +layers = 50; //resolution of vertical Sweep: 50 for output //---Stem param slop = 0.3; @@ -39,7 +39,8 @@ stemWid = 7.2; stemLen = 5.5; stemCrossHeight = 4; extra_vertical = 0.6; -stemLayers = 50; //resolution of stem to cap top transition +StemBrimDep = 0.75; +stemLayers = 50; //resolution of stem to cap top transition dishLayers = 30; @@ -47,19 +48,19 @@ keyParameters = //keyParameters[KeyID][ParameterID] [ // BotWid, BotLen, TWDif, TLDif, keyh, WSft, LSft XSkew, YSkew, ZSkew, WEx, LEx, CapR0i, CapR0f, CapR1i, CapR1f, CapREx, StemEx //Column 0 - [17.16, 17.16*1.5, 6, 6, 14, 0, 0, -13, -10, -5, 2, 2, 1, 5, 1, 3, 2, 2], //R5 0 - [17.16, 17.16, 6.5, 6.5, 8+4, 0, 0, 10, -10, -5, 2, 2, 1, 5, 1, 3, 2, 2], //R4 - [17.16, 17.16, 6.5, 6.5, 7+4, 0, 0, -2, -10, -5, 2, 2, 1, 5, 1, 3, 2, 2], //R3 Home - [17.16, 17.16, 6.5, 6.5, 8+4, 0, 0, -10, -10, -5, 2, 2, 1, 5, 1, 3, 2, 2], //R2 + [17.16, 17.16, 5.5, 5.5, 7.8+3, 0, 0, 9, 0, -0, 2, 2, 1, 3.999, 1, 5, 2, 2], //R4 + [17.16, 17.16, 5.5, 5.5, 7+3, 0, 0, -3, 0, -0, 2, 2, 1, 3.399, 1, 5, 2, 2], //R3 + [17.16, 17.16, 5.5, 5.5, 8.5+3, 0, 0, -8, 0, -0, 2, 2, 1, 3.399, 1, 5, 2, 2], //R2 Home + [17.16, 17.16, 5.5, 5.5,11.5+3, 0, 0, -14, 0, -0, 2, 2, 1, 3.399, 1, 5, 2, 2], //R1 //Column 1 - [17.16, 17.16, 6, 6, 13, 0, 0, -13, 5, 0, 2, 2, 1, 5, 1, 3, 2, 2], //R5 4 - [17.16, 17.16, 6.5, 6.5, 8+3, 0, 0, 5, -3, 0, 2, 2, 1, 5, 1, 3, 2, 2], //R4 - [17.16, 17.16, 6.5, 6.5,7+2.5, 0, 0, -2, -3, 0, 2, 2, 1, 5, 1, 3, 2, 2], //R3 Home - [17.16, 17.16, 6.5, 6.5, 8+3, 0, 0, -12, -3, 0, 2, 2, 1, 5, 1, 3, 2, 2], //R2 + [17.16, 17.16, 6, 6, 12, 0, 0, -5, 0, 0, 2, 2, 1, 3.399, 1, 5, 2, 2], //R5 1u + [17.16, 17.16, 6.5, 6.5, 8+3, 0, 0, 5, -3, 0, 2, 2, 1, 5, 1, 3, 2, 2], //R5 1.258 + [17.16, 17.16, 6.5, 6.5,7+2.5, 0, 0, -2, -3, 0, 2, 2, 1, 5, 1, 3, 2, 2], //R5 1.58 + [17.16, 17.16, 6.5, 6.5, 8+3, 0, 0, -12, -3, 0, 2, 2, 1, 5, 1, 3, 2, 2], //R5 Concave 1u //Column 2 middle [17.16, 17.16, 6, 6, 13, 0, 0, -13, 10, 15, 2, 2, 1, 5, 1, 3, 2, 2], //R5 8 [17.16, 17.16, 6.5, 6.5, 7.1, 0, 0, 0, 0, 0, 2, 2, 1, 4.85, 1, 3, 2, 2], //R4 - [17.16, 17.16, 6.5, 6.5, 7, 0, 0, -2, 0, 0, 2, 2, 1, 5, 1, 3, 2, 2], //R3 Home + [17.16, 17.16, 6.5, 6.5, 7, 0, 0, -2, 0, 0, 2, 2, 1, 5, 1, 3, 2, 2], //R3 RPA low pro [17.16, 17.16, 6.5, 6.5, 8, 0, 0, -12, 0, 0, 2, 2, 1, 5, 1, 3, 2, 2], //R2 //Column 3 [17.16, 17.16, 6, 6, 11+3, 0, 0, 13, -4, 0, 2, 2, 1, 5, 1, 3, 2, 2], //R5 12 @@ -101,10 +102,10 @@ dishParameters = //dishParameter[keyID][ParameterID] [ // EdOf fn LEx WEx DshDep Ch0i, ch1i, Ch0f, Ch1f, DishExp //Column 0 - [ 2, .005, 2, 2, 1.5, 6, 4, .001, .001, 2], //R2 - [ 2, .005, 2, 2, 1.5, 6, 4, .001, .001, 2], //R3 - [ 2, .005, 2, 2, 1.5, 6, 4, .001, .001, 2], //R4 - [ 2, .005, 2, 2, 1.5, 6, 4, .001, .001, 2], //R5 + [ 1, .005, 3, 3, 2.0, 3.399, 5, .001, .001, 1.5], //R4 + [ 1, .005, 3, 3, 2.0, 3.399, 5, .001, .001, 1.5], //R3 + [ 1, .005, 3, 3, 2.0, 3.399, 5, .001, .001, 1.5], //R2 + [ 1, .005, 3, 3, 2.0, 3.399, 5, .001, .001, 1.5], //R1 //Column 1 [ 2, .005, 2, 2, 1.5, 6, 4, .001, .001, 2], //R2 [ 2, .005, 2, 2, 1.5, 6, 4, .001, .001, 2], //R3 @@ -219,7 +220,7 @@ function StemTranslation(t, keyID) = [ ((1-t)/stemLayers*TopWidShift(keyID)), //X shift ((1-t)/stemLayers*TopLenShift(keyID)), //Y shift - stemCrossHeight+.1 + (t/stemLayers*(KeyHeight(keyID)- topthickness - stemCrossHeight-.1)) //Z shift + stemCrossHeight+.1+StemBrimDep + (t/stemLayers*(KeyHeight(keyID)- topthickness - stemCrossHeight-.1 -StemBrimDep)) //Z shift ]; function StemRotation(t, keyID) = @@ -231,8 +232,8 @@ function StemRotation(t, keyID) = function StemTransform(t, keyID) = [ - pow(t/stemLayers, StemExponent(keyID))*(BottomWidth(keyID) -TopWidthDiff(keyID)-wallthickness*2) + (1-pow(t/stemLayers, StemExponent(keyID)))*(stemWid - 2*slop), - pow(t/stemLayers, StemExponent(keyID))*(BottomLength(keyID)-TopLenDiff(keyID)-wallthickness*2) + (1-pow(t/stemLayers, StemExponent(keyID)))*(stemLen - 2*slop) + pow(t/stemLayers, StemExponent(keyID))*(BottomWidth(keyID) -TopWidthDiff(keyID)-wallthickness) + (1-pow(t/stemLayers, StemExponent(keyID)))*(stemWid - 2*slop), + pow(t/stemLayers, StemExponent(keyID))*(BottomLength(keyID)-TopLenDiff(keyID)-wallthickness) + (1-pow(t/stemLayers, StemExponent(keyID)))*(stemLen - 2*slop) ]; function StemRadius(t, keyID) = pow(t/stemLayers,3)*3 + (1-pow(t/stemLayers, 3))*1; @@ -266,7 +267,7 @@ function DishRoundness(t, keyID) = ]; ///----- KEY Builder Module -module keycap(keyID = 0, cutLen = 0, visualizeDish = false, rossSection = false, Dish = true, Stem = false, homeDot = false, Stab = false) { +module keycap(keyID = 0, cutLen = 0, visualizeDish = false, rossSection = false, Dish = true, Stem = false, homeDot = false, Stab = false, Stab = 0) { // //Set Parameters for dish shape // FrontPath = quantize_trajectories(FrontTrajectory(keyID), steps = stepsize, loop=false, start_position= $t*4); @@ -291,7 +292,7 @@ module keycap(keyID = 0, cutLen = 0, visualizeDish = false, rossSection = false, } } if(Stem == true){ - rotate([0,0,stemRot])cherry_stem(KeyHeight(keyID), slop); // generate mx cherry stem, not compatible with box + translate([0,0,StemBrimDep])rotate([0,0,stemRot])cherry_stem(KeyHeight(keyID)-StemBrimDep-1, slop); // if (Stab != 0){ translate([Stab/2,0,0])rotate([0,0,stemRot])cherry_stem(KeyHeight(keyID), slop); translate([-Stab/2,0,0])rotate([0,0,stemRot])cherry_stem(KeyHeight(keyID), slop); @@ -364,17 +365,30 @@ module inside_cherry_cross(slop) { } module cherry_stem(depth, slop) { + D1=.15; + D2=.05; + H1=3.5; + CrossDist = 1.75; difference(){ // outside shape - linear_extrude(height = depth-topthickness/2) { + linear_extrude(height = depth) { offset(r=1){ square(outer_cherry_stem(slop) - [2,2], center=true); } } inside_cherry_cross(slop); + hull(){ + translate([CrossDist,CrossDist-.1,0])cylinder(d1=D1, d2=D2, H1); + translate([-CrossDist,-CrossDist+.1,0])cylinder(d1=D1, d2=D2, H1); + } + hull(){ + translate([-CrossDist,CrossDist-.1])cylinder(d1=D1, d2=D2, H1); + translate([CrossDist,-CrossDist+.1])cylinder(d1=D1, d2=D2, H1); + } } } + /// ----- helper functions function rounded_rectangle_profile(size=[1,1],r=1,fn=32) = [ for (index = [0:fn-1])