Skip to content

Instantly share code, notes, and snippets.

@mdekrey
Last active February 24, 2020 14:26
Show Gist options
  • Save mdekrey/46bfabac8997de8a917bce83362f18a4 to your computer and use it in GitHub Desktop.
Save mdekrey/46bfabac8997de8a917bce83362f18a4 to your computer and use it in GitHub Desktop.
Table Saw Mitre Angle Guide
$fn = 120;
$fnHole = 360;
inch = 25.4;
diskHeight = 8;
radius = 4.8 * inch;
maxDegrees = 30;
step = 1;
fenceThickness = 10;
fenceHeight = inch*2;
tickHeight = 0.4;
tickWidth = 0.8;
fontSize = 10;
lockDistance = 3*inch;
settingInset = 1 * inch;
settingSize = 5.6;
settingBoltDiameter = 5.1;
settingRaisedEdge = 3;
originBoltHoleDiameter = 0.141*inch;
mountingHoleDiameter = 1/4*inch;
trimWidth = radius * cos(maxDegrees)*2;
distanceToSetting = radius - settingInset;
%translate([0, distanceToSetting, 0])
cylinder(fenceHeight * 5, r=settingBoltDiameter / 2);
echo("distanceToSetting", distanceToSetting);
module base() {
difference() {
union() {
intersection() {
cylinder(diskHeight, r = radius, $fn = $fn);
translate([0, radius, diskHeight / 2])
cube([trimWidth, radius * 2, diskHeight], center = true);
}
// setting rim, main
translate([0,0,settingRaisedEdge])
rotate([0,0, (90 - maxDegrees) / 2])
rotate_extrude(angle = (90 - maxDegrees) * 2, convexity = 10, $fn = $fn)
offset(settingRaisedEdge)
translate([radius - settingInset - settingSize / 2, 0])
square([settingSize, (diskHeight - settingRaisedEdge)]);
// setting rim, left side
rotate([0,0, (90 - maxDegrees)])
translate([0, radius - settingInset, 0])
translate([-settingSize, -settingSize/2, 0])
minkowski() {
translate([settingSize/2, settingSize/2, (diskHeight-1)/2])
cylinder(1, r = settingSize / 2, center=true);
translate([settingSize/2, 0, diskHeight/2])
sphere(r=settingRaisedEdge, $fn=$fn);
}
// setting rim, right side
rotate([0,0, (maxDegrees - 90)])
translate([0, radius - settingInset, 0])
translate([-settingSize, -settingSize/2, 0])
minkowski() {
translate([settingSize/2, settingSize/2, (diskHeight-1)/2])
cylinder(1, r = settingSize / 2, center=true);
translate([settingSize/2, 0, diskHeight/2])
sphere(r=settingRaisedEdge, $fn=$fn);
}
}
union() {
// setting slot
translate([0,0,-diskHeight/2])
rotate([0,0, (90 - maxDegrees) / 2])
rotate_extrude(angle = (90 - maxDegrees) * 2, convexity = 10, $fn = $fnHole)
translate([radius - settingInset - settingSize / 2, 0])
square([settingSize, (diskHeight + settingRaisedEdge)*2]);
// setting slot rounded, left side
rotate([0,0, (90 - maxDegrees)])
translate([0, radius - settingInset, 0])
cylinder((diskHeight + settingRaisedEdge) * 3, r = settingSize / 2, center=true, $fn = $fnHole);
// setting slot rounded, right side
rotate([0,0, (maxDegrees - 90)])
translate([0, radius - settingInset, 0])
cylinder((diskHeight + settingRaisedEdge) * 3, r = settingSize / 2, center=true, $fn = $fnHole);
}
}
}
module fence() {
difference() {
translate([-trimWidth / 2, -fenceThickness/2, 0])
cube([trimWidth, fenceThickness, fenceHeight]);
translate([-trimWidth/3,0, fenceHeight/2])
rotate([90,0,0])
cylinder(fenceThickness * 3, r = mountingHoleDiameter, $fn = $fnHole, center=true);
translate([trimWidth/3,0, fenceHeight/2])
rotate([90,0,0])
cylinder(fenceThickness * 3, r = mountingHoleDiameter, $fn = $fnHole, center=true);
}
}
module ticks() {
color("grey")
union() {
for (i = [(maxDegrees - 90):step:(90 - maxDegrees)]) {
tickLength =
i % 10 == 0 ? 10
: i % 5 == 0 ? 5
: i % 1 == 0 ? 3
: 1;
rotate([0,0,i])
translate([0, radius - 1 - tickLength / 2, diskHeight])
cube([tickWidth, tickLength, tickHeight], center=true);
if (i % 10 == 0) {
rotate([0,0,i])
translate([0, radius - 1 - tickLength / 2, diskHeight])
rotate([0,0,180])
linear_extrude(height = 0.5) {
text(text = str(90 - abs(i)), size = fontSize, valign = "bottom", halign = "center");
}
}
}
}
}
module originbolthole() {
cylinder(fenceHeight*3, r=originBoltHoleDiameter/2, center=true, $fn=$fnHole);
}
difference() {
union() {
base();
fence();
}
originbolthole();
}
ticks();
inch = 25.4;
$fn = 360;
guidelock_width = 23.5;
guidelock_height = 4;
main_width = 19;
full_height = 11;
protractorInset = 1*inch;
settingInset = 1*inch;
distanceBetweenSettingAndOrigin = 96.52;
settingBoltDiameter = 5.1;
originBoltDiameter = 0.141 * inch;
originNutHeight = 1/8 * inch;
originNutDiameter = 7/16 * inch;
//slideSample();
//slide(200);
slideWithBoltHoles(200);
module slideSample() {
difference() {
slide(inch);
translate([inch / 3, 0, 0])
settingBolt();
translate([-inch / 4, 0, 0])
pivotBolt();
}
}
module slideWithBoltHoles(length) {
difference() {
slide(length);
translate([length / 2 - protractorInset - settingInset, 0, 0])
settingBolt();
translate([length / 2 - protractorInset - settingInset - distanceBetweenSettingAndOrigin, 0, 0])
pivotBolt();
}
}
module slide(length) {
translate([0,0, (guidelock_height - full_height) / 2])
cube([length, guidelock_width, guidelock_height], center=true);
cube([length, main_width, full_height], center=true);
}
module settingBolt() {
cylinder(full_height * 3, r=settingBoltDiameter/2, $fn=$fn, center = true);
}
module pivotBolt() {
union() {
translate([0, 0, 0])
cylinder(full_height * 3, r=originBoltDiameter/2, $fn=$fn, center = true);
translate([0, 0, (originNutHeight - full_height - 1)/2])
cylinder(originNutHeight + 1, r=originNutDiameter/2, $fn=$fn, center = true);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment