| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 |
- // Process control
- FAST = 1;
- DEBUG = 0;
- // Circle smoothness =~ build smoothness
- $fs = 0.1 * (FAST * 10);
- $fa = 1;
- // Main tube paramteters
- stageA = -18;
- stageRadius = 26.25;
- stageOffsetX = 51.5;
- stageOffsetY = 31.0;
- stageOffsetZ = 10.5;
- stageOffsetA = 86.5;
- stageZFuzz = 1.0;
- stageAZ = 4.0;
- // Side tube parameters
- sideHeight = 3.75;
- sideLength = 57.0;
- sideRadius = 11.0;
- sideSpread = 14.5 - sideRadius;
- // There is probably a way to calculate this, but guess-and-check is fine for now
- sideOverlap = (1 - 0.170);
- // Tertiary offsets
- stage3OffsetX = 45;
- stage3OffsetY = -45;
- // Base parmaeters
- baseEdge = 5;
- baseHeight = 50;
- baseX = 137 + baseEdge;
- baseY = 131 + (baseEdge / 2);
- module sideBox(stageOffset) {
- polyhedron(
- points = [
- [stageRadius * sideOverlap, -sideSpread, 0], //FBR 0
- [stageRadius * sideOverlap, (sideRadius * 2) + sideSpread, 0], //NBR 1
- [stageRadius * sideOverlap, -sideSpread, (baseHeight - stageOffset)], //FTR 2
- [stageRadius * sideOverlap, (sideRadius * 2) + sideSpread, (baseHeight - stageOffset) ], //NTR 3
- [sideLength - sideRadius, 0, sideHeight], //FBL 4
- [sideLength - sideRadius, sideRadius * 2, sideHeight], //NBL 5
- [sideLength - sideRadius, 0, (baseHeight - stageOffset)], //FTL 6
- [sideLength - sideRadius, sideRadius * 2, (baseHeight - stageOffset)] //NTL 7
- ],
- faces=[
- [0,1,3,2], //L
- [7,5,4,6], //R
- [2,3,7,6], //T
- [4,5,1,0], //B
- [0,2,6,4], //F
- [3,1,5,7], //N
- ]);
- }
- module stageInset(stageOffset) {
- translate([0, 0, stageOffset]) {
- cylinder(h=(baseHeight - stageOffset + stageZFuzz), r=stageRadius);
- translate([sideLength - sideRadius, 0, sideHeight]) {
- cylinder(h=(baseHeight - stageOffset) - sideHeight, r=sideRadius);
- }
- translate([0, -sideRadius, 0]) {
- sideBox(stageOffset);
- }
- }
- }
- module dualStage() {
- color("red")
- translate([stage3OffsetX, stage3OffsetY, 0]) {
- rotate([2 * stageAZ, 0, -stageA + 180]) {
- stageInset(stageOffsetZ * 2);
- }
- }
-
- color("green")
- rotate([stageAZ, 0, stageOffsetA]) {
- stageInset(stageOffsetZ);
- }
-
- color("blue")
- translate([stageOffsetX, stageOffsetY, 0]) {
- rotate([0, 0, stageA]) {
- stageInset(0);
- }
- }
- }
- // Main build
- difference() {
- // Base
- cube([baseX, baseY, baseHeight]);
- // Dual-stage inset, aligned to base
- translate([stageRadius + baseEdge, 67 + (baseEdge / 2), baseEdge]) {
- rotate([0,0,90 - stageOffsetA])
- dualStage();
- }
-
- // Carve just a little off the edges to help the preview render cleanly
- if (DEBUG) {
- translate([0, 0, baseHeight - 0.01]) {
- color("purple")
- cube([baseX, baseY, 0.02]);
- }
- translate([0, 0, -0.01]) {
- color("purple")
- cube([baseX, baseY, 0.02]);
- }
- translate([-0.01, 0, 0]) {
- color("purple")
- cube([0.02, baseY, baseHeight]);
- }
- translate([baseX - 0.01, 0, 0]) {
- color("purple")
- cube([0.02, baseY, baseHeight]);
- }
- }
- // Carve out the base for print speed
- if (FAST) {
- translate([223 + baseEdge, 10 - baseEdge, 0]) {
- color("green")
- cylinder(r=120, h=baseHeight);
- }
- translate([baseX - 11 + baseEdge, baseY - 1 + baseEdge, 0]) {
- color("blue")
- cylinder(r=30, h=baseHeight);
- }
- translate([-(58 + baseEdge), baseY - 10, 0]) {
- color("red")
- cylinder(r=80, h=baseHeight);
- }
- }
- }
|