Created
February 16, 2021 00:19
-
-
Save ednisley/46fe45b2b7e7c03f28d32478d0cd1079 to your computer and use it in GitHub Desktop.
OpenSCAD source code: Fixture for sawing hairlines into plastic cursors
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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(); | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
More details on my blog at https://wp.me/poZKh-9Qc