2025-02-08 03:46:00 +00:00
|
|
|
use <./common/common.scad>;
|
|
|
|
use <./common/threads.scad>;
|
|
|
|
include <./common/string.scad>;
|
|
|
|
|
|
|
|
FilmThickness = 4.11; //mil
|
|
|
|
FilmThicknessMM = FilmThickness * 0.0254;
|
|
|
|
|
|
|
|
CoreD = 2 * 25.4;
|
2023-06-18 20:01:24 +00:00
|
|
|
|
|
|
|
Core16mm = 25.5;
|
2023-06-27 22:42:54 +00:00
|
|
|
Socket16mmH = 11;
|
2023-06-18 20:01:24 +00:00
|
|
|
PlatterThickness = 1.6;
|
2025-02-08 03:46:00 +00:00
|
|
|
//Platter120m = 178;
|
2023-06-23 22:31:20 +00:00
|
|
|
Thread16mmD = 17.5;
|
2023-06-27 22:42:54 +00:00
|
|
|
Pitch16mm = 1.525;
|
|
|
|
|
|
|
|
SocketSuper8H = 4;
|
|
|
|
ThreadSuper8D = 21;
|
|
|
|
|
2025-02-08 03:46:00 +00:00
|
|
|
Title = "";
|
|
|
|
|
|
|
|
module rotary_text (Text = "Test", D = 40, CharacterAngle = 15) {
|
|
|
|
TextArr = split(Text, "");
|
2023-06-27 22:42:54 +00:00
|
|
|
Radius = R(D);
|
|
|
|
Chars = len(TextArr);
|
|
|
|
for (i = [0:1:Chars]) {
|
|
|
|
rotate([0, 0, -i * CharacterAngle]) translate([0, Radius, 0]) {
|
|
|
|
scale([0.5, 0.5, 1]) linear_extrude(height = 1) {
|
|
|
|
text(TextArr[i], halign = "center");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2023-06-18 20:01:24 +00:00
|
|
|
|
2025-02-08 03:46:00 +00:00
|
|
|
module length_text (Gauge = "16mm", Length = 120, Footage = 400, PlatterD = 178) {
|
|
|
|
Text = join(concat(Gauge, " ", str(Length), "m/", str(Footage), "ft"));
|
|
|
|
CharacterAngle = Length == 120 ? 3.75 : Length == 60 ? 4.5 : Length == 30 ? 6.25 : 3.75;
|
|
|
|
rotary_text( Text, D = PlatterD - 15, CharacterAngle);
|
|
|
|
}
|
|
|
|
|
|
|
|
module thread_16mm ( pos = [0, 0, 0], Length = 11, chamfer = false, pad = 0) {
|
2023-06-18 20:01:24 +00:00
|
|
|
translate(pos) {
|
2023-06-19 00:35:24 +00:00
|
|
|
if (chamfer) {
|
2025-02-08 03:46:00 +00:00
|
|
|
metric_thread (diameter=Thread16mmD + pad, pitch=Pitch16mm, length=Length, internal=false, n_starts=1, thread_size=-1, groove=false, square=false, rectangle=0, angle=30, taper=0, leadin=2, leadfac=1.5);
|
2023-06-27 22:42:54 +00:00
|
|
|
} else {
|
2025-02-08 03:46:00 +00:00
|
|
|
metric_thread (diameter=Thread16mmD + pad, pitch=Pitch16mm, length=Length, internal=false, n_starts=1, thread_size=-1, groove=false, square=false, rectangle=0, angle=30, taper=0, leadin=0, leadfac=1.5);
|
2023-06-27 22:42:54 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2025-02-08 03:46:00 +00:00
|
|
|
module thread_8mm ( pos = [0, 0, 0], Length = 6, chamfer = false, pad = 0) {
|
2023-06-27 22:42:54 +00:00
|
|
|
translate(pos) {
|
|
|
|
if (chamfer) {
|
2025-02-08 03:46:00 +00:00
|
|
|
metric_thread (diameter=ThreadSuper8D + pad, pitch=Pitch16mm, length=Length, internal=false, n_starts=1, thread_size=-1, groove=false, square=false, rectangle=0, angle=30, taper=0, leadin=2, leadfac=1.5);
|
2023-06-19 00:35:24 +00:00
|
|
|
} else {
|
2025-02-08 03:46:00 +00:00
|
|
|
metric_thread (diameter=ThreadSuper8D + pad, pitch=Pitch16mm, length=Length, internal=false, n_starts=1, thread_size=-1, groove=false, square=false, rectangle=0, angle=30, taper=0, leadin=0, leadfac=1.5);
|
2023-06-19 00:35:24 +00:00
|
|
|
}
|
2023-06-18 20:01:24 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2025-02-08 03:46:00 +00:00
|
|
|
module threaded_core (pos = [0, 0, 0], Gauge = "16mm") {
|
2023-06-18 20:01:24 +00:00
|
|
|
$fn = 120;
|
|
|
|
translate (pos) {
|
2025-02-08 03:46:00 +00:00
|
|
|
if (Gauge == "16mm") {
|
2023-06-18 20:01:24 +00:00
|
|
|
union () {
|
|
|
|
cylinder(r = R(Core16mm), h = 6, center = true);
|
2025-02-08 03:46:00 +00:00
|
|
|
thread_16mm([0, 0, 1.5], Length = Socket16mmH + 3, chamfer = true, pad = -0.2);
|
2023-06-27 22:42:54 +00:00
|
|
|
}
|
2025-02-08 03:46:00 +00:00
|
|
|
} else if (Gauge == "8mm") {
|
2023-06-27 22:42:54 +00:00
|
|
|
union () {
|
|
|
|
cylinder(r = R(Core16mm), h = 4, center = true);
|
2025-02-08 03:46:00 +00:00
|
|
|
thread_8mm([0, 0, 0], Length = SocketSuper8H + 3, chamfer = true, pad = -0.2);
|
2023-06-18 20:01:24 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2025-02-08 03:46:00 +00:00
|
|
|
module socket_core (pos = [0, 0, 0], Gauge = "16mm") {
|
2023-06-18 20:01:24 +00:00
|
|
|
$fn = 120;
|
|
|
|
translate (pos) {
|
2025-02-08 03:46:00 +00:00
|
|
|
if (Gauge == "16mm") {
|
2023-06-18 20:01:24 +00:00
|
|
|
difference () {
|
2023-06-27 22:42:54 +00:00
|
|
|
cylinder(r = R(Core16mm), h = Socket16mmH, center = true);
|
|
|
|
}
|
2025-02-08 03:46:00 +00:00
|
|
|
} else if (Gauge == "8mm") {
|
2023-06-27 22:42:54 +00:00
|
|
|
difference () {
|
|
|
|
cylinder(r = R(Core16mm), h = SocketSuper8H, center = true);
|
2023-06-18 20:01:24 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2025-02-08 03:46:00 +00:00
|
|
|
module platter (pos = [0, 0, 0], PlatterD = 178) {
|
|
|
|
VoidD = (PlatterD - CoreD) / 3;
|
|
|
|
VoidX = floor(((PlatterD - CoreD) * 0.43) + CoreD);
|
|
|
|
echo(VoidD);
|
|
|
|
difference () {
|
|
|
|
cylinder(r = R(PlatterD), h = PlatterThickness, center = true, $fn = 300);
|
|
|
|
if (VoidD > 22) {
|
2023-06-18 20:01:24 +00:00
|
|
|
for (i = [0 : 3]) {
|
2025-02-08 03:46:00 +00:00
|
|
|
rotate([0, 0, i * 90]) translate([VoidX / 2, 0, 0]) cylinder(r = R(VoidD), h = PlatterThickness + 1, center = true, $fn = 100);
|
2023-06-18 20:01:24 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2025-02-08 03:46:00 +00:00
|
|
|
module split_reel_16mm_A (Length = 120, Footage = 400, PlatterD = 178) {
|
2023-06-27 22:42:54 +00:00
|
|
|
difference () {
|
|
|
|
union () {
|
|
|
|
difference () {
|
2025-02-08 03:46:00 +00:00
|
|
|
platter(pos = [0, 0, 0], PlatterD = PlatterD);
|
|
|
|
translate([0, 0, -0.5]) rotate([180, 0, 0]) rotate([0, 0, (5 * 3.75) / 2]) length_text("16mm", Length, Footage, PlatterD);
|
2023-06-18 20:01:24 +00:00
|
|
|
}
|
2025-02-08 03:46:00 +00:00
|
|
|
threaded_core([0, 0, (PlatterThickness / 2) + (6 / 2)], Gauge = "16mm");
|
2023-06-27 22:42:54 +00:00
|
|
|
rotate([0, 0, 135]) translate([18.5, 0, (PlatterThickness / 2) + (4.75 / 2)]) cylinder(r = R(6.25), h = 4.75, center = true, $fn = 60);
|
|
|
|
|
2023-06-18 20:01:24 +00:00
|
|
|
}
|
2023-06-27 22:42:54 +00:00
|
|
|
cube([8.5, 8.5, 50], center = true);
|
|
|
|
rotate([0, 0, 45]) translate([5.5, 0, 0]) cube([3, 3, 50], center = true);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2025-02-08 03:46:00 +00:00
|
|
|
module split_reel_16mm_B ( Length = 120, Footage = 400, PlatterD = 178) {
|
2023-06-27 22:42:54 +00:00
|
|
|
difference () {
|
|
|
|
union () {
|
2025-02-08 03:46:00 +00:00
|
|
|
platter([0, 0, 0], PlatterD = PlatterD);
|
|
|
|
socket_core([0, 0, (PlatterThickness / 2) + (Socket16mmH / 2)], Gauge = "16mm");
|
2023-06-27 22:42:54 +00:00
|
|
|
}
|
|
|
|
rotate([180, 0, 0]) scale([1.02, 1.02, 1]) {
|
|
|
|
thread_16mm([0, 0, -13], 15);
|
|
|
|
thread_16mm([0, 0, -13.1], 15);
|
2023-06-18 20:01:24 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2025-02-08 03:46:00 +00:00
|
|
|
module split_reel_8mm_A ( Length = 120, Footage = 400, PlatterD = 178) {
|
2023-06-27 22:42:54 +00:00
|
|
|
BaseH = 4;
|
|
|
|
NotchH = 2;
|
2023-06-29 21:15:58 +00:00
|
|
|
NotchW = 21;
|
2023-06-27 22:42:54 +00:00
|
|
|
|
|
|
|
difference () {
|
|
|
|
union () {
|
2023-06-27 23:34:42 +00:00
|
|
|
difference () {
|
2025-02-08 03:46:00 +00:00
|
|
|
platter([0, 0, 0], PlatterD = PlatterD);
|
|
|
|
translate([0, 0, -0.5]) rotate([180, 0, 0]) rotate([0, 0, (5 * 3.75) / 2]) length_text("8mm", Length, Footage, PlatterD);
|
2023-06-27 23:34:42 +00:00
|
|
|
}
|
2025-02-08 03:46:00 +00:00
|
|
|
threaded_core([0, 0, (PlatterThickness / 2) + (BaseH / 2)], Gauge = "8mm");
|
2023-06-27 22:42:54 +00:00
|
|
|
rotate([0, 0, 135]) translate([18.5, 0, (PlatterThickness / 2) + (NotchH / 2)]) cylinder(r = R(6.25), h = NotchH, center = true, $fn = 60);
|
|
|
|
}
|
|
|
|
cylinder(r = R(13), h = 50, center = true, $fn = 80);
|
|
|
|
for (i = [0 : 2]) {
|
|
|
|
rotate([0, 0, i * (360 / 3)]) translate([NotchW / 4, 0, 0]) cube([NotchW / 2, 2.25, 8], center = true);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2025-02-08 03:46:00 +00:00
|
|
|
module split_reel_8mm_B ( Length = 120, Footage = 400, PlatterD = 178) {
|
2023-06-27 22:42:54 +00:00
|
|
|
difference () {
|
|
|
|
union () {
|
2025-02-08 03:46:00 +00:00
|
|
|
platter([0, 0, 0], PlatterD = PlatterD);
|
|
|
|
socket_core([0, 0, (PlatterThickness / 2) + (SocketSuper8H / 2)], Gauge = "8mm");
|
2023-06-27 22:42:54 +00:00
|
|
|
}
|
2025-02-08 03:46:00 +00:00
|
|
|
|
2023-06-27 22:42:54 +00:00
|
|
|
rotate([180, 0, 0]) scale([1.02, 1.02, 1]) {
|
2025-02-08 03:46:00 +00:00
|
|
|
thread_8mm([0, 0, -13], 15);
|
|
|
|
thread_8mm([0, 0, -13.1], 15);
|
2023-06-27 22:42:54 +00:00
|
|
|
}
|
2023-06-25 02:54:04 +00:00
|
|
|
}
|
2023-06-27 22:42:54 +00:00
|
|
|
}
|
|
|
|
|
2025-02-08 03:46:00 +00:00
|
|
|
//Length in meters
|
|
|
|
module split_reel (Gauge = "16mm", Length = 120, Side = "A") {
|
|
|
|
PlatterD = ceil((2 * sqrt(((Length * 1000) * FilmThicknessMM) / PI)) + (CoreD));
|
|
|
|
echo("PlatterD", PlatterD);
|
|
|
|
Footage = Length == 120 ? 400 : Length == 60 ? 200 : Length == 30 ? 100 : round((Length * 1000) / (12 * 25.4));
|
|
|
|
|
|
|
|
if (Gauge == "16mm") {
|
|
|
|
if (Side == "A") {
|
|
|
|
split_reel_16mm_A(Length = Length, Footage = Footage, PlatterD = PlatterD);
|
|
|
|
} else if (Side == "B") {
|
|
|
|
split_reel_16mm_B(Length = Length, Footage = Footage, PlatterD = PlatterD);
|
|
|
|
}
|
|
|
|
} else if (Gauge == "8mm") {
|
|
|
|
if (Side == "A") {
|
|
|
|
split_reel_8mm_A(Length = Length, Footage = Footage, PlatterD = PlatterD);
|
|
|
|
} else if (Side == "B") {
|
|
|
|
split_reel_8mm_B(Length = Length, Footage = Footage, PlatterD = PlatterD);
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
echo("Unrecognized Gauge:", Gauge);
|
2023-06-27 22:42:54 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2025-02-08 03:46:00 +00:00
|
|
|
module buildPyramidalExtrude(height, maxOffset, nSlices){
|
2025-02-03 00:52:50 +00:00
|
|
|
heightIncrement = height / nSlices;
|
|
|
|
offsetIncrement = maxOffset / (nSlices-1);
|
|
|
|
for (i = [1 : nSlices]) {
|
|
|
|
linear_extrude(height=i * heightIncrement) {
|
|
|
|
offset(r = maxOffset - (i - 1) * offsetIncrement) {
|
|
|
|
children();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
module logo_test () {
|
|
|
|
difference () {
|
|
|
|
split_reel("16mm", 120, "B");
|
|
|
|
translate([-45, -48, -0.65]) scale([0.25, 0.25, 1]) {
|
|
|
|
rotate([180, 0, 0]) buildPyramidalExtrude(.5, .25, 20) {
|
|
|
|
import(file = "svg/logo.svg", center = true);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2025-02-08 03:46:00 +00:00
|
|
|
PART = "16mm_120m_A";
|
2025-02-03 00:52:50 +00:00
|
|
|
|
2025-02-03 01:21:51 +00:00
|
|
|
if (PART == "16mm_120m_A") {
|
2023-06-27 22:42:54 +00:00
|
|
|
split_reel("16mm", 120, "A");
|
2025-02-03 01:21:51 +00:00
|
|
|
} else if (PART == "16mm_120m_B") {
|
2023-06-27 22:42:54 +00:00
|
|
|
split_reel("16mm", 120, "B");
|
2025-02-08 03:46:00 +00:00
|
|
|
} else if (PART == "8mm_120m_A") {
|
|
|
|
split_reel("8mm", 120, "A");
|
|
|
|
} else if (PART == "8mm_120m_B") {
|
|
|
|
split_reel("8mm", 120, "B");
|
|
|
|
} else if (PART == "16mm_60m_A") {
|
|
|
|
split_reel("16mm", 60, "A");
|
|
|
|
} else if (PART == "16mm_60m_B") {
|
|
|
|
split_reel("16mm", 60, "B");
|
|
|
|
} else if (PART == "8mm_60m_A") {
|
|
|
|
split_reel("8mm", 60, "A");
|
|
|
|
} else if (PART == "8mm_120m_B") {
|
|
|
|
split_reel("8mm", 60, "B");
|
|
|
|
} else if (PART == "16mm_30m_A") {
|
|
|
|
split_reel("16mm", 30, "A");
|
|
|
|
} else if (PART == "16mm_30m_B") {
|
|
|
|
split_reel("16mm", 30, "B");
|
|
|
|
} else if (PART == "8mm_30m_A") {
|
|
|
|
split_reel("8mm", 30, "A");
|
|
|
|
} else if (PART == "8mm_30m_B") {
|
|
|
|
split_reel("8mm", 30, "B");
|
2023-06-27 22:42:54 +00:00
|
|
|
}
|