|
// Sawing fixtures for Tek Circuit Computer cursor hairline |
|
// Ed Nisley KE4ZNU Jan 2021 |
|
// Rotated 90° and screwed to 123 blocks for sawing |
|
|
|
Layout = "Show"; // [Show, Build, Cursor] |
|
|
|
Gap = 4.0; |
|
|
|
/* [Hidden] */ |
|
|
|
ThreadThick = 0.25; |
|
ThreadWidth = 0.40; |
|
|
|
HoleWindage = 0.2; |
|
|
|
Protrusion = 0.1; // make holes end cleanly |
|
|
|
inch = 25.4; |
|
|
|
function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit); |
|
|
|
module PolyCyl(Dia,Height,ForceSides=0) { // based on nophead's polyholes |
|
Sides = (ForceSides != 0) ? ForceSides : (ceil(Dia) + 2); |
|
FixDia = Dia / cos(180/Sides); |
|
cylinder(d=(FixDia + HoleWindage),h=Height,$fn=Sides); |
|
} |
|
|
|
//---------------------- |
|
// Dimensions |
|
|
|
CursorHubOD = 1.0*inch; // must match SVG hub OD |
|
CursorThick = 0.71; // including protective layers |
|
|
|
HairlineMin = 48.4188; // extent of hairline |
|
HairlineMax = 97.4250; |
|
|
|
HairlineDepth = 0.20; |
|
|
|
PocketDepth = 0.75*CursorThick; // half above surface for taping |
|
PocketClear = 0.25; // E-Z insertion clearance |
|
|
|
TableOC = [1.16*inch,1.16*inch]; // Sherline tooling plate grid |
|
|
|
BlockOC = [(9/16)*inch,(9/16)*inch]; // 123 block hole grid |
|
BlockOffset = [(3/8)*inch,(3/8)*inch]; // .. block edge to hole center |
|
|
|
ScrewClear = 5.0; // … screw clearance |
|
|
|
CursorOffset = [2*BlockOC.x,0,0]; // hub center relative to leftmost screw |
|
|
|
FixtureGrid = [5*TableOC.x,0,0]; // size in Table grid units |
|
|
|
Screws = [ // relative to leftmost screw |
|
[0,0,0], // on table grid |
|
CursorOffset, // on block grid |
|
[FixtureGrid.x,0,0] // on table grid |
|
]; |
|
echo(str("Screw centers: ",Screws)); |
|
|
|
CornerRad = 10.0; // corner radius |
|
|
|
Fixture = [2*CornerRad + FixtureGrid.x,2*CornerRad + CursorHubOD,5.0]; |
|
echo(str("Fixture plate: ",Fixture)); |
|
|
|
//---------------------- |
|
// Import SVG of cursor outline |
|
// Requires our CursorHubOD to match actual cut outline |
|
// Hub center at origin |
|
|
|
module CursorSVG(t=CursorThick,ofs=0.0) { |
|
|
|
hr = CursorHubOD/2; |
|
|
|
translate([-hr,-hr,0]) |
|
linear_extrude(height=t,convexity=3) |
|
offset(r=ofs) |
|
import( |
|
file="/mnt/bulkdata/Project Files/Tektronix Circuit Computer/Firmware/TekCC-Cursor-Mark.svg", |
|
center=false); |
|
} |
|
|
|
//---------------------- |
|
// Show-n-Tell cursor |
|
|
|
module Cursor() { |
|
|
|
difference() { |
|
CursorSVG(CursorThick,0.0); |
|
translate([0,0,-Protrusion]) |
|
rotate(180/6) |
|
PolyCyl(ScrewClear,CursorThick + 2*Protrusion,6); |
|
} |
|
} |
|
|
|
//---------------------- |
|
// Sawing fixture for cursor hairline |
|
// Plate center at origin |
|
|
|
module Fixture() { |
|
|
|
difference() { |
|
hull() // basic plate shape |
|
for (i=[-1,1], j=[-1,1]) |
|
translate([i*(Fixture.x/2 - CornerRad),j*(Fixture.y/2 - CornerRad),0]) |
|
cylinder(r=CornerRad,h=Fixture.z,$fn=24); |
|
|
|
translate([0,0,Fixture.z - ThreadThick/2 + Protrusion/2]) // will be Z=0 index |
|
cube([2*Fixture.x,ThreadWidth,ThreadThick + Protrusion],center=true); |
|
|
|
translate(-FixtureGrid/2) { |
|
|
|
translate(CursorOffset + [0,0,Fixture.z - 2*PocketDepth]) |
|
difference() { |
|
CursorSVG(2*PocketDepth + Protrusion,PocketClear); |
|
CursorSVG(PocketDepth + Protrusion,-PocketClear); |
|
} |
|
|
|
translate([CursorOffset.x,0,Fixture.z - ThreadThick/2 + Protrusion/2]) // will be front X=0 index |
|
cube([ThreadWidth,2*Fixture.y,ThreadThick + Protrusion],center=true); |
|
|
|
translate([CursorOffset.x,Fixture.y/2 - ThreadThick/2 + Protrusion/2,0]) // will be top X=0 index |
|
cube([ThreadWidth,ThreadThick + Protrusion,2*Fixture.z],center=true); |
|
|
|
translate([CursorOffset.x + HairlineMin,0,Fixture.z - ThreadThick/2 + Protrusion/2]) // hairline min |
|
cube([ThreadWidth,2*Fixture.y,ThreadThick + Protrusion],center=true); |
|
|
|
translate([CursorOffset.x + HairlineMax,0,Fixture.z - ThreadThick/2 + Protrusion/2]) // hairline min |
|
cube([ThreadWidth,2*Fixture.y,ThreadThick + Protrusion],center=true); |
|
/* |
|
# translate(CursorOffset + [0,0,Fixture.z - 2*ThreadThick]) { // alignment pips |
|
for (x=[-20.0,130.0], y=[-30.0,0.0,30.0]) |
|
translate([x,y,0]) |
|
cylinder(d=4*ThreadWidth,h=1,$fn=6); |
|
|
|
# for (x=[-30.0,130.0,150.0]) |
|
translate([x,0,0]) |
|
cylinder(d=4*ThreadWidth,h=1,$fn=6); |
|
*/ |
|
for (pt=Screws) |
|
translate(pt + [0,0,-Protrusion]) |
|
rotate(180/6) |
|
PolyCyl(ScrewClear,Fixture.z + 2*Protrusion,6); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
//---------------------- |
|
// Build it |
|
|
|
if (Layout == "Cursor") { |
|
Cursor(); |
|
} |
|
|
|
if (Layout == "Show") { |
|
rotate([0*90,0,0]) { |
|
Fixture(); |
|
color("Green",0.3) |
|
translate(-FixtureGrid/2 + CursorOffset + [0,0,Fixture.z + Gap]) |
|
Cursor(); |
|
} |
|
} |
|
|
|
if (Layout == "Build"){ |
|
// rotate(90) |
|
Fixture(); |
|
} |
|
|