All improvements to script, make truly parametric. Still have some TODOs
52
README.md
|
@ -1,5 +1,53 @@
|
|||
# Split Reels
|
||||
|
||||
3D-printable threaded split reels for 16mm and Super8 film.
|
||||
This script generates 3D-printable, threaded split reels for 16mm and 8mm film.
|
||||
This is a parametric model, so download the source code and generate split reels of any capacity for either 16mm or 8mm gauge film.
|
||||
|
||||
-----
|
||||
The design is roughly-compatible with the aluminum reels, but threading plastic onto metal or *vice versa* may break the printed parts.
|
||||
|
||||
The downloadable models are 120m/400ft reels for 16mm and 8mm film and are designed to hold standard film cores.
|
||||
|
||||
To use this script download the source files and create a new file in the directory in OpenSCAD.
|
||||
|
||||
```scad
|
||||
use <scad/split_reel.scad>;
|
||||
|
||||
split_reel("8mm", 240, "A");
|
||||
```
|
||||
|
||||
This will generate the threaded side of a split reel for 8mm gauge film for 240m or 800ft of film.
|
||||
|
||||
## 16mm Split Reel 120m/400ft - Side A (Threaded)
|
||||
|
||||
### [Download STL](./stl/split_reel_16mm_120m_A.stl)
|
||||
|
||||

|
||||
|
||||
## 16mm Split Reel 120m/400ft - Side B
|
||||
|
||||
### [Download STL](./stl/split_reel_16mm_120m_B.stl)
|
||||
|
||||

|
||||
|
||||
## 8mm Split Reel 120m/400ft - Side A (Threaded)
|
||||
|
||||
### [Download STL](./stl/split_reel_super8_120m_A.stl)
|
||||
|
||||

|
||||
|
||||
## 8mm Split Reel 120m/400ft - Side B
|
||||
|
||||
### [Download STL](./stl/split_reel_super8_120m_B.stl)
|
||||
|
||||

|
||||
|
||||
## Other STLs
|
||||
|
||||
* [16mm Split Reel 60m/200ft - Side A (Threaded)](./stl/split_reel_16mm_60m_A.stl)
|
||||
* [16mm Split Reel 60m/200ft - Side B](./stl/split_reel_16mm_60m_B.stl)
|
||||
* [16mm Split Reel 30m/100ft - Side A (Threaded)](./stl/split_reel_16mm_30m_A.stl)
|
||||
* [16mm Split Reel 30m/200ft - Side B](./stl/split_reel_16mm_30m_B.stl)
|
||||
* [8mm Split Reel 60m/200ft - Side A (Threaded)](./stl/split_reel_8mm_60m_A.stl)
|
||||
* [8mm Split Reel 60m/200ft - Side B](./stl/split_reel_8mm_60m_A.stl)
|
||||
* [8mm Split Reel 30m/100ft - Side A (Threaded)](./stl/split_reel_8mm_30m_A.stl)
|
||||
* [8mm Split Reel 30m/100ft - Side B](./stl/split_reel_8mm_30m_B.stl)
|
||||
|
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 10 KiB |
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 10 KiB |
After Width: | Height: | Size: 10 KiB |
After Width: | Height: | Size: 9.9 KiB |
Before Width: | Height: | Size: 10 KiB |
Before Width: | Height: | Size: 10 KiB |
|
@ -39,7 +39,9 @@
|
|||
"LICENSE",
|
||||
"scad.sh",
|
||||
"scad/split_reel.scad",
|
||||
"scad/common/common.scad",
|
||||
"scad/common/threads.scad",
|
||||
"scad/common/string.scad",
|
||||
"scad/common/c14n_stl.py"
|
||||
]
|
||||
}
|
||||
|
|
4
scad.sh
|
@ -1,3 +1,5 @@
|
|||
#!/bin/bash
|
||||
|
||||
bash scad/common/scad.sh scad/split_reel.scad "${@}"
|
||||
bash scad/common/scad.sh scad/split_reel.scad "${@}"
|
||||
rm img/*30m*.jpg
|
||||
rm img/*60m*.jpg
|
|
@ -1 +1 @@
|
|||
Subproject commit 6c223d0fc67c1888429aee60cf68915b9bbaa1ca
|
||||
Subproject commit e2eeb27f173d739a174c0d147bcb62a16859e2d9
|
|
@ -1,17 +1,26 @@
|
|||
include <./common/common.scad>;
|
||||
include <./common/threads.scad>;
|
||||
use <./common/common.scad>;
|
||||
use <./common/threads.scad>;
|
||||
include <./common/string.scad>;
|
||||
|
||||
FilmThickness = 4.11; //mil
|
||||
FilmThicknessMM = FilmThickness * 0.0254;
|
||||
|
||||
CoreD = 2 * 25.4;
|
||||
|
||||
Core16mm = 25.5;
|
||||
Socket16mmH = 11;
|
||||
PlatterThickness = 1.6;
|
||||
Platter120m = 178;
|
||||
//Platter120m = 178;
|
||||
Thread16mmD = 17.5;
|
||||
Pitch16mm = 1.525;
|
||||
|
||||
SocketSuper8H = 4;
|
||||
ThreadSuper8D = 21;
|
||||
|
||||
module rotary_text (TextArr = ["T","e","s","t"], D = 40, CharacterAngle = 15) {
|
||||
Title = "";
|
||||
|
||||
module rotary_text (Text = "Test", D = 40, CharacterAngle = 15) {
|
||||
TextArr = split(Text, "");
|
||||
Radius = R(D);
|
||||
Chars = len(TextArr);
|
||||
for (i = [0:1:Chars]) {
|
||||
|
@ -23,51 +32,57 @@ module rotary_text (TextArr = ["T","e","s","t"], D = 40, CharacterAngle = 15) {
|
|||
}
|
||||
}
|
||||
|
||||
module thread_16mm ( pos = [0, 0, 0], length = 11, chamfer = false, pad = 0) {
|
||||
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) {
|
||||
translate(pos) {
|
||||
if (chamfer) {
|
||||
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);
|
||||
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);
|
||||
} else {
|
||||
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);
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module thread_super8 ( pos = [0, 0, 0], length = 6, chamfer = false, pad = 0) {
|
||||
module thread_8mm ( pos = [0, 0, 0], Length = 6, chamfer = false, pad = 0) {
|
||||
translate(pos) {
|
||||
if (chamfer) {
|
||||
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);
|
||||
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);
|
||||
} else {
|
||||
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);
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module threaded_core (pos = [0, 0, 0], format = "16mm") {
|
||||
module threaded_core (pos = [0, 0, 0], Gauge = "16mm") {
|
||||
$fn = 120;
|
||||
translate (pos) {
|
||||
if (format == "16mm") {
|
||||
if (Gauge == "16mm") {
|
||||
union () {
|
||||
cylinder(r = R(Core16mm), h = 6, center = true);
|
||||
thread_16mm([0, 0, 1.5], length = Socket16mmH + 3, chamfer = true, pad = -0.2);
|
||||
thread_16mm([0, 0, 1.5], Length = Socket16mmH + 3, chamfer = true, pad = -0.2);
|
||||
}
|
||||
} else if (format == "super8") {
|
||||
} else if (Gauge == "8mm") {
|
||||
union () {
|
||||
cylinder(r = R(Core16mm), h = 4, center = true);
|
||||
thread_super8([0, 0, 0], length = SocketSuper8H + 3, chamfer = true, pad = -0.2);
|
||||
thread_8mm([0, 0, 0], Length = SocketSuper8H + 3, chamfer = true, pad = -0.2);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module socket_core (pos = [0, 0, 0], format = "16mm") {
|
||||
module socket_core (pos = [0, 0, 0], Gauge = "16mm") {
|
||||
$fn = 120;
|
||||
translate (pos) {
|
||||
if (format == "16mm") {
|
||||
if (Gauge == "16mm") {
|
||||
difference () {
|
||||
cylinder(r = R(Core16mm), h = Socket16mmH, center = true);
|
||||
}
|
||||
} else if (format == "super8") {
|
||||
} else if (Gauge == "8mm") {
|
||||
difference () {
|
||||
cylinder(r = R(Core16mm), h = SocketSuper8H, center = true);
|
||||
}
|
||||
|
@ -75,25 +90,28 @@ module socket_core (pos = [0, 0, 0], format = "16mm") {
|
|||
}
|
||||
}
|
||||
|
||||
module platter (pos = [0, 0, 0], length = 120) {
|
||||
if (length == 120) {
|
||||
difference () {
|
||||
cylinder(r = R(Platter120m), h = PlatterThickness, center = true, $fn = 300);
|
||||
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) {
|
||||
for (i = [0 : 3]) {
|
||||
rotate([0, 0, i * 90]) translate([105 / 2, 0, 0]) cylinder(r = R(44.5), h = PlatterThickness + 1, center = true, $fn = 100);
|
||||
rotate([0, 0, i * 90]) translate([VoidX / 2, 0, 0]) cylinder(r = R(VoidD), h = PlatterThickness + 1, center = true, $fn = 100);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module split_reel_16mm_A (length = 120) {
|
||||
module split_reel_16mm_A (Length = 120, Footage = 400, PlatterD = 178) {
|
||||
difference () {
|
||||
union () {
|
||||
difference () {
|
||||
platter([0, 0, 0], length = length);
|
||||
translate([0, 0, -0.5]) rotate([180, 0, 0]) rotate([0, 0, (5 * 3.75) / 2]) rotary_text(["1", "6", "m", "m", " ", " ", "1", "2", "0", "m", "/", "4", "0", "0", "f", "t"], D = Platter120m - 15, CharacterAngle=3.75);
|
||||
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);
|
||||
}
|
||||
threaded_core([0, 0, (PlatterThickness / 2) + (6 / 2)], format = "16mm");
|
||||
threaded_core([0, 0, (PlatterThickness / 2) + (6 / 2)], Gauge = "16mm");
|
||||
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);
|
||||
|
||||
}
|
||||
|
@ -102,11 +120,11 @@ module split_reel_16mm_A (length = 120) {
|
|||
}
|
||||
}
|
||||
|
||||
module split_reel_16mm_B ( length = 120) {
|
||||
module split_reel_16mm_B ( Length = 120, Footage = 400, PlatterD = 178) {
|
||||
difference () {
|
||||
union () {
|
||||
platter([0, 0, 0], length = length);
|
||||
socket_core([0, 0, (PlatterThickness / 2) + (Socket16mmH / 2)], format = "16mm");
|
||||
platter([0, 0, 0], PlatterD = PlatterD);
|
||||
socket_core([0, 0, (PlatterThickness / 2) + (Socket16mmH / 2)], Gauge = "16mm");
|
||||
}
|
||||
rotate([180, 0, 0]) scale([1.02, 1.02, 1]) {
|
||||
thread_16mm([0, 0, -13], 15);
|
||||
|
@ -115,7 +133,7 @@ module split_reel_16mm_B ( length = 120) {
|
|||
}
|
||||
}
|
||||
|
||||
module split_reel_super8_A ( length = 120) {
|
||||
module split_reel_8mm_A ( Length = 120, Footage = 400, PlatterD = 178) {
|
||||
BaseH = 4;
|
||||
NotchH = 2;
|
||||
NotchW = 21;
|
||||
|
@ -123,10 +141,10 @@ module split_reel_super8_A ( length = 120) {
|
|||
difference () {
|
||||
union () {
|
||||
difference () {
|
||||
platter([0, 0, 0], length = length);
|
||||
translate([0, 0, -0.5]) rotate([180, 0, 0]) rotate([0, 0, (5 * 3.75) / 2]) rotary_text(["S", "u", "p", "e", "r", "8", " ", " ", "1", "2", "0", "m", "/", "4", "0", "0", "f", "t"], D = Platter120m - 15, CharacterAngle=3.75);
|
||||
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);
|
||||
}
|
||||
threaded_core([0, 0, (PlatterThickness / 2) + (BaseH / 2)], format = "super8");
|
||||
threaded_core([0, 0, (PlatterThickness / 2) + (BaseH / 2)], Gauge = "8mm");
|
||||
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);
|
||||
|
@ -136,37 +154,44 @@ module split_reel_super8_A ( length = 120) {
|
|||
}
|
||||
}
|
||||
|
||||
module split_reel_super8_B ( length = 120) {
|
||||
module split_reel_8mm_B ( Length = 120, Footage = 400, PlatterD = 178) {
|
||||
difference () {
|
||||
union () {
|
||||
platter([0, 0, 0], length = length);
|
||||
socket_core([0, 0, (PlatterThickness / 2) + (SocketSuper8H / 2)], format = "super8");
|
||||
platter([0, 0, 0], PlatterD = PlatterD);
|
||||
socket_core([0, 0, (PlatterThickness / 2) + (SocketSuper8H / 2)], Gauge = "8mm");
|
||||
}
|
||||
|
||||
rotate([180, 0, 0]) scale([1.02, 1.02, 1]) {
|
||||
thread_super8([0, 0, -13], 15);
|
||||
thread_super8([0, 0, -13.1], 15);
|
||||
thread_8mm([0, 0, -13], 15);
|
||||
thread_8mm([0, 0, -13.1], 15);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//length in meters
|
||||
module split_reel (format = "16mm", length = 120, half = "A") {
|
||||
if (format == "16mm") {
|
||||
if (half == "A") {
|
||||
split_reel_16mm_A(length = length);
|
||||
} else if (half == "B") {
|
||||
split_reel_16mm_B(length = length);
|
||||
//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 (format == "super8") {
|
||||
if (half == "A") {
|
||||
split_reel_super8_A(length = length);
|
||||
} else if (half == "B") {
|
||||
split_reel_super8_B(length = length);
|
||||
} 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);
|
||||
}
|
||||
}
|
||||
|
||||
module buildPyramidalExtrude(height,maxOffset,nSlices){
|
||||
module buildPyramidalExtrude(height, maxOffset, nSlices){
|
||||
heightIncrement = height / nSlices;
|
||||
offsetIncrement = maxOffset / (nSlices-1);
|
||||
for (i = [1 : nSlices]) {
|
||||
|
@ -189,14 +214,30 @@ module logo_test () {
|
|||
}
|
||||
}
|
||||
|
||||
PART = "16mm_120m_B";
|
||||
PART = "16mm_120m_A";
|
||||
|
||||
if (PART == "16mm_120m_A") {
|
||||
split_reel("16mm", 120, "A");
|
||||
} else if (PART == "16mm_120m_B") {
|
||||
split_reel("16mm", 120, "B");
|
||||
} else if (PART == "super8_120m_A") {
|
||||
split_reel("super8", 120, "A");
|
||||
} else if (PART == "super8_120m_B") {
|
||||
split_reel("super8", 120, "B");
|
||||
} 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");
|
||||
}
|
||||
|
|