Skip to content

Instantly share code, notes, and snippets.

@ednisley
Created February 16, 2021 00:19
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ednisley/46fe45b2b7e7c03f28d32478d0cd1079 to your computer and use it in GitHub Desktop.
Save ednisley/46fe45b2b7e7c03f28d32478d0cd1079 to your computer and use it in GitHub Desktop.
OpenSCAD source code: Fixture for sawing hairlines into plastic cursors
// 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();
}
@ednisley
Copy link
Author

More details on my blog at https://wp.me/poZKh-9Qc

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment