1// Eclipse by OnTake
  2// Version 1
  3// 22/12/2021 - 20:56 UTC
  4// A pencil-sharpening plane.
  5
  6
  7include <BOSL/constants.scad>
  8use <BOSL/masks.scad>
  9
 10renderResolution = 10;
 11
 12sharpenerBodySize = [60,30,10]; // mm
 13sharpenerAngle = 45; // °
 14sharpenerScrewDiameter = 2; //mm
 15ScrewHeadDiameter = 4; // mm
 16ScrewHeadHeight = 5; //mm : Use a flat head screw or it's going to get ugly.
 17bladeDimensions = [23,7,1]; //mm : KUM Spare Blades for Standard Sharpeners
 18bladeTolerances = 0.1; //mm
 19bladeAlignOffset = [0,0,-1.1]; // mm
 20bladeClearanceAlignOffset = [-6,0,0]; //mm
 21bladeClearanceExtraY = 6; //mm
 22ScrewHeadAlignOffset = [0,0,4.5]; // mm
 23bevelRadius = 2; // mm
 24textAValue = "Eclipse";
 25textAFont = "Arial:style=Bold";
 26textAHeight = 1;
 27textASize = 5; // mm
 28textAOffset = [15,0,0.4]; // mm
 29textBValue = "by OnTake";
 30textBFont = "Arial:style=Bold";
 31textBHeight = 1;
 32textBSize = 3.5; // mm
 33textBOffset = [22,0,0.4]; // mm
 34
 35difference() {
 36    // Body shape
 37    cube(center = false, size = sharpenerBodySize);
 38    // Blade shape
 39    translate([sharpenerBodySize.x/2,sharpenerBodySize.y/2,10])
 40    rotate([0,sharpenerAngle,0])
 41    translate(bladeAlignOffset)
 42    cube(center = true, size = [bladeDimensions.y+bladeTolerances,bladeDimensions.x+bladeTolerances,20]);   
 43    // Blade clearance shape
 44    translate([sharpenerBodySize.x/2,sharpenerBodySize.y/2,10])
 45    rotate([0,sharpenerAngle,0])
 46    translate(bladeAlignOffset)
 47    translate(bladeClearanceAlignOffset)
 48    cube(center = true, size = [bladeDimensions.y+bladeTolerances+bladeClearanceExtraY,bladeDimensions.x+bladeTolerances,20]);   
 49    // Screw hole shape
 50    translate([sharpenerBodySize.x/2,sharpenerBodySize.y/2,10])
 51    rotate([0,sharpenerAngle,0])
 52    translate(bladeAlignOffset)
 53    translate([0,0,-20])
 54    cylinder(h = 20, r1 = sharpenerScrewDiameter/2, r2 = sharpenerScrewDiameter/2, center = false, $fn=10*renderResolution);
 55    // Screw head hole shape 
 56    translate([sharpenerBodySize.x/2,sharpenerBodySize.y/2,10])
 57    rotate([0,sharpenerAngle,0])
 58    translate(bladeAlignOffset)
 59    translate([0,0,-20])
 60    translate(ScrewHeadAlignOffset)
 61    cylinder(h = ScrewHeadHeight, r1 = ScrewHeadDiameter/2, r2 = ScrewHeadDiameter/2, center = false, $fn=10*renderResolution);
 62    // Bevels
 63    // Height Filet
 64    translate([0,0,sharpenerBodySize.z]) fillet_mask_z(l=sharpenerBodySize.x*3, r=bevelRadius, $fn=10*renderResolution);
 65    translate([sharpenerBodySize.x,0,sharpenerBodySize.z]) fillet_mask_z(l=sharpenerBodySize.x*3, r=bevelRadius, $fn=10*renderResolution);
 66    translate([0,sharpenerBodySize.y,sharpenerBodySize.z]) fillet_mask_z(l=sharpenerBodySize.x*3, r=bevelRadius, $fn=10*renderResolution);
 67    translate(sharpenerBodySize) fillet_mask_z(l=sharpenerBodySize.x*3, r=bevelRadius, $fn=10*renderResolution);
 68    // Top Start
 69    // First Corner
 70    translate([0,0,sharpenerBodySize.z]) fillet_mask_x(l=sharpenerBodySize.x*3, r=bevelRadius, $fn=10*renderResolution);
 71    translate([0,0,sharpenerBodySize.z]) fillet_mask_y(l=sharpenerBodySize.x*3, r=bevelRadius, $fn=10*renderResolution);
 72    // Opposite Corner
 73    translate(sharpenerBodySize) fillet_mask_x(l=sharpenerBodySize.x*3, r=bevelRadius, $fn=10*renderResolution);
 74    translate(sharpenerBodySize) fillet_mask_y(l=sharpenerBodySize.x*3, r=bevelRadius, $fn=10*renderResolution);
 75    // Corner Filet
 76    translate([0,0,sharpenerBodySize.z]) fillet_corner_mask(r=bevelRadius, $fn=10*renderResolution);
 77    translate([sharpenerBodySize.x,0,sharpenerBodySize.z]) fillet_corner_mask(r=bevelRadius, $fn=10*renderResolution);
 78    translate([0,sharpenerBodySize.y,sharpenerBodySize.z]) fillet_corner_mask(r=bevelRadius, $fn=10*renderResolution);
 79    translate(sharpenerBodySize) fillet_corner_mask(r=bevelRadius, $fn=10*renderResolution);
 80    // Top End
 81    // Bottom Start
 82    // First Corner
 83    translate([0,0,0]) fillet_mask_x(l=sharpenerBodySize.x*3, r=bevelRadius, $fn=10*renderResolution);
 84    translate([0,0,0]) fillet_mask_y(l=sharpenerBodySize.x*3, r=bevelRadius, $fn=10*renderResolution);
 85    // Opposite Corner
 86    translate([sharpenerBodySize.x,sharpenerBodySize.y,0]) fillet_mask_x(l=sharpenerBodySize.x*3, r=bevelRadius, $fn=10*renderResolution);
 87    translate([sharpenerBodySize.x,sharpenerBodySize.y,0]) fillet_mask_y(l=sharpenerBodySize.x*3, r=bevelRadius, $fn=10*renderResolution);
 88    // Corner Filet
 89    translate([0,0,0]) fillet_corner_mask(r=bevelRadius, $fn=10*renderResolution);
 90    translate([sharpenerBodySize.x,0,0]) fillet_corner_mask(r=bevelRadius, $fn=10*renderResolution);
 91    translate([0,sharpenerBodySize.y,0]) fillet_corner_mask(r=bevelRadius, $fn=10*renderResolution);
 92    translate([sharpenerBodySize.x,sharpenerBodySize.y,0]) fillet_corner_mask(r=bevelRadius, $fn=10*renderResolution);
 93    // Bottom End
 94}
 95// TextA
 96translate([sharpenerBodySize.x/2,sharpenerBodySize.y/2,sharpenerBodySize.z])
 97translate(textAOffset)
 98rotate([0,0,90])
 99linear_extrude(height=textAHeight)
100text(textAValue,font=textAFont,size=textASize,valign="center",halign="center",$fn=10*renderResolution);
101// TextB
102translate([sharpenerBodySize.x/2,sharpenerBodySize.y/2,sharpenerBodySize.z])
103translate(textBOffset)
104rotate([0,0,90])
105linear_extrude(height=textBHeight)
106text(textBValue,font=textBFont,size=textBSize,valign="center",halign="center",$fn=10*renderResolution);