All cores projects merged into a single script. Layout of all cores fore rendering, will need changes.
|
@ -0,0 +1,3 @@
|
||||||
|
[submodule "scad/common"]
|
||||||
|
path = scad/common
|
||||||
|
url = https://git.sixteenmillimeter.com/modules/common.git
|
|
@ -0,0 +1,19 @@
|
||||||
|
Copyright (c) 2025 M McWilliams
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
|
@ -0,0 +1,49 @@
|
||||||
|
# Film Cores
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Film cores are used wind film for storage, handling, editing or projection.
|
||||||
|
This project contains a script for generating cores of abitrary diameter, and the standards of 2 inch cores for camera usage and 3 inch cores for projection are included as printable STL files.
|
||||||
|
|
||||||
|
This script will generate cores for 16mm, 8mm or 35mm gauge films.
|
||||||
|
These can be used with the [split_reel](../split_reel) module.
|
||||||
|
|
||||||
|
8mm cores are not common or standard but these seem to work for storage, editing and projection.
|
||||||
|
|
||||||
|
This script will generate film cores with or without a center partition making them possible to print with no overhangs.
|
||||||
|
Keep in mind cores *without* that center partition this makes for a weaker part and may buckle under the tension of longer films depending on how it is printed.
|
||||||
|
|
||||||
|
Download the source and create an OpenSCAD file in the directory to generate arbitrary size cores as follows.
|
||||||
|
|
||||||
|
```scad
|
||||||
|
use <scad/film_core.scad>;
|
||||||
|
|
||||||
|
film_core(16, 4 * 25.4, true);
|
||||||
|
```
|
||||||
|
|
||||||
|
This will generate a 4 inch core for 16mm gauge film with a center partition.
|
||||||
|
|
||||||
|
```scad
|
||||||
|
use <scad/film_core.scad>;
|
||||||
|
|
||||||
|
film_core(8, 2.5 * 25.4, true);
|
||||||
|
```
|
||||||
|
|
||||||
|
This will generate a 2.5 inch core for 8mm gauge film without a center partition.
|
||||||
|
|
||||||
|
The script can even be used to generate cores for more uncommon gauges, such as Pathé 9.5mm.
|
||||||
|
|
||||||
|
```scad
|
||||||
|
use <scad/film_core.scad>;
|
||||||
|
|
||||||
|
film_core(9.5, 3 * 25.4, true);
|
||||||
|
```
|
||||||
|
|
||||||
|
# 35mm Cores
|
||||||
|
|
||||||
|
-----
|
||||||
|
|
||||||
|
## 35mm Cores
|
||||||
|
|
||||||
|
-----
|
||||||
|
|
After Width: | Height: | Size: 18 KiB |
After Width: | Height: | Size: 18 KiB |
After Width: | Height: | Size: 16 KiB |
After Width: | Height: | Size: 17 KiB |
After Width: | Height: | Size: 18 KiB |
After Width: | Height: | Size: 18 KiB |
After Width: | Height: | Size: 18 KiB |
After Width: | Height: | Size: 18 KiB |
After Width: | Height: | Size: 16 KiB |
After Width: | Height: | Size: 17 KiB |
After Width: | Height: | Size: 15 KiB |
After Width: | Height: | Size: 18 KiB |
|
@ -0,0 +1,41 @@
|
||||||
|
function rotatePoint(centerX, centerY, distance, angleInDegrees) {
|
||||||
|
const angleInRadians = angleInDegrees * (Math.PI / 180);
|
||||||
|
|
||||||
|
const x = centerX + (distance * Math.cos(angleInRadians));
|
||||||
|
const y = centerY + (distance * Math.sin(angleInRadians));
|
||||||
|
|
||||||
|
return { x, y, z : 0 };
|
||||||
|
}
|
||||||
|
let obj = [
|
||||||
|
"16mm_2in",
|
||||||
|
"16mm_2in_np",
|
||||||
|
"16mm_3in",
|
||||||
|
"16mm_3in_np",
|
||||||
|
|
||||||
|
"8mm_2in",
|
||||||
|
"8mm_2in_np",
|
||||||
|
"8mm_3in",
|
||||||
|
"8mm_3in_np",
|
||||||
|
|
||||||
|
"35mm_2in",
|
||||||
|
"35mm_2in_np",
|
||||||
|
"35mm_3in",
|
||||||
|
"35mm_3in_np"
|
||||||
|
];
|
||||||
|
let meta = {
|
||||||
|
objects : []
|
||||||
|
}
|
||||||
|
for (let i = 0; i < 12; i++) {
|
||||||
|
meta.objects.push ({
|
||||||
|
name : obj[i],
|
||||||
|
material : "white_plastic",
|
||||||
|
position : rotatePoint(0, 0, 160, i * (360 / 12)),
|
||||||
|
rotation : {
|
||||||
|
x : 0,
|
||||||
|
y : 90,
|
||||||
|
z : i * (360 / 12)
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(JSON.stringify(meta, null, '\t'))
|
|
@ -0,0 +1,186 @@
|
||||||
|
{
|
||||||
|
"camera" : {
|
||||||
|
"x" : 0,
|
||||||
|
"y" : 0,
|
||||||
|
"z" : 0
|
||||||
|
},
|
||||||
|
"objects": [
|
||||||
|
{
|
||||||
|
"name": "16mm_2in",
|
||||||
|
"material": "white_plastic",
|
||||||
|
"position": {
|
||||||
|
"x": 160,
|
||||||
|
"y": 0,
|
||||||
|
"z": 0
|
||||||
|
},
|
||||||
|
"rotation": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 90,
|
||||||
|
"z": 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "16mm_2in_np",
|
||||||
|
"material": "white_plastic",
|
||||||
|
"position": {
|
||||||
|
"x": 138.5640646055102,
|
||||||
|
"y": 79.99999999999999,
|
||||||
|
"z": 0
|
||||||
|
},
|
||||||
|
"rotation": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 90,
|
||||||
|
"z": 30
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "16mm_3in",
|
||||||
|
"material": "white_plastic",
|
||||||
|
"position": {
|
||||||
|
"x": 80.00000000000001,
|
||||||
|
"y": 138.56406460551017,
|
||||||
|
"z": 0
|
||||||
|
},
|
||||||
|
"rotation": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 90,
|
||||||
|
"z": 60
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "16mm_3in_np",
|
||||||
|
"material": "white_plastic",
|
||||||
|
"position": {
|
||||||
|
"x": 9.797174393178826e-15,
|
||||||
|
"y": 160,
|
||||||
|
"z": 0
|
||||||
|
},
|
||||||
|
"rotation": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 90,
|
||||||
|
"z": 90
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "8mm_2in",
|
||||||
|
"material": "white_plastic",
|
||||||
|
"position": {
|
||||||
|
"x": -79.99999999999997,
|
||||||
|
"y": 138.5640646055102,
|
||||||
|
"z": 0
|
||||||
|
},
|
||||||
|
"rotation": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 90,
|
||||||
|
"z": 120
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "8mm_2in_np",
|
||||||
|
"material": "white_plastic",
|
||||||
|
"position": {
|
||||||
|
"x": -138.5640646055102,
|
||||||
|
"y": 79.99999999999999,
|
||||||
|
"z": 0
|
||||||
|
},
|
||||||
|
"rotation": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 90,
|
||||||
|
"z": 150
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "8mm_3in",
|
||||||
|
"material": "white_plastic",
|
||||||
|
"position": {
|
||||||
|
"x": -160,
|
||||||
|
"y": 1.9594348786357652e-14,
|
||||||
|
"z": 0
|
||||||
|
},
|
||||||
|
"rotation": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 90,
|
||||||
|
"z": 180
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "8mm_3in_np",
|
||||||
|
"material": "white_plastic",
|
||||||
|
"position": {
|
||||||
|
"x": -138.56406460551017,
|
||||||
|
"y": -80.00000000000001,
|
||||||
|
"z": 0
|
||||||
|
},
|
||||||
|
"rotation": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 90,
|
||||||
|
"z": 210
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "35mm_2in",
|
||||||
|
"material": "white_plastic",
|
||||||
|
"position": {
|
||||||
|
"x": -80.00000000000007,
|
||||||
|
"y": -138.56406460551017,
|
||||||
|
"z": 0
|
||||||
|
},
|
||||||
|
"rotation": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 90,
|
||||||
|
"z": 240
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "35mm_2in_np",
|
||||||
|
"material": "white_plastic",
|
||||||
|
"position": {
|
||||||
|
"x": -2.9391523179536473e-14,
|
||||||
|
"y": -160,
|
||||||
|
"z": 0
|
||||||
|
},
|
||||||
|
"rotation": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 90,
|
||||||
|
"z": 270
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "35mm_3in",
|
||||||
|
"material": "white_plastic",
|
||||||
|
"position": {
|
||||||
|
"x": 80.00000000000001,
|
||||||
|
"y": -138.56406460551017,
|
||||||
|
"z": 0
|
||||||
|
},
|
||||||
|
"rotation": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 90,
|
||||||
|
"z": 300
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "35mm_3in_np",
|
||||||
|
"material": "white_plastic",
|
||||||
|
"position": {
|
||||||
|
"x": 138.56406460551014,
|
||||||
|
"y": -80.00000000000007,
|
||||||
|
"z": 0
|
||||||
|
},
|
||||||
|
"rotation": {
|
||||||
|
"x": 0,
|
||||||
|
"y": 90,
|
||||||
|
"z": 330
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"src" : [
|
||||||
|
"README.md",
|
||||||
|
"LICENSE",
|
||||||
|
"scad.sh",
|
||||||
|
"scad/film_core.scad",
|
||||||
|
"scad/common/common.scad",
|
||||||
|
"scad/common/c14n_stl.py",
|
||||||
|
"scad/common/scad.sh"
|
||||||
|
]
|
||||||
|
}
|
|
@ -0,0 +1,3 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
bash scad/common/scad.sh scad/film_core.scad "${@}"
|
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit e2eeb27f173d739a174c0d147bcb62a16859e2d9
|
|
@ -0,0 +1,108 @@
|
||||||
|
use <./common/common.scad>;
|
||||||
|
|
||||||
|
$fn = 200;
|
||||||
|
|
||||||
|
IN = 25.4;
|
||||||
|
InnerD = 30.6;
|
||||||
|
|
||||||
|
module supports (Gauge = 16, Count = 8, OuterD = 50.8) {
|
||||||
|
rotate([0, 0, -13]) for (i = [0 : Count - 1]) {
|
||||||
|
rotate ([0, 0, i * (360 / Count)]) {
|
||||||
|
translate ([(InnerD / 2) + ((OuterD - InnerD) / 4) - 1, 0, 0]) {
|
||||||
|
cube([((OuterD - InnerD - 1) / 2), 2, Gauge], center = true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module inner_core_shape (Gauge = 16, D, X, CubeW, CubeL, Pad = 0) {
|
||||||
|
union () {
|
||||||
|
cylinder(r = R(D), h = Gauge + Pad, center = true);
|
||||||
|
translate([X, 0, 0]) {
|
||||||
|
cube([CubeW, CubeL, Gauge + Pad], center = true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module inner_core (Gauge = 16) {
|
||||||
|
difference () {
|
||||||
|
inner_core_shape(Gauge, InnerD, (InnerD / 2) + 0.5, 6, 7);
|
||||||
|
inner_core_shape(Gauge, InnerD - 4, (InnerD / 2) - 0.5, 4, 4, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module clip (Gauge = 16, OuterD = 50.8) {
|
||||||
|
translate([(OuterD - 3.5) / 2, 0, 0]) {
|
||||||
|
rotate(45, [0, 0, 1]){
|
||||||
|
cube([7, 1, Gauge + 1], center = true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module outer_clip (Gauge = 16, OuterD = 50.8) {
|
||||||
|
translate([(OuterD - 3.75) / 2, 0, 0]) {
|
||||||
|
difference() {
|
||||||
|
rotate(45, [0, 0, 1]){
|
||||||
|
cube([9, 4, Gauge], center = true);
|
||||||
|
}
|
||||||
|
translate([3.9, 0, 0]) {
|
||||||
|
cube([6, 10, Gauge + 1], center = true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module outer_core (Gauge = 16, OuterD = 50.8) {
|
||||||
|
difference () {
|
||||||
|
union () {
|
||||||
|
difference () {
|
||||||
|
cylinder(r = R(OuterD), h = Gauge, center = true);
|
||||||
|
cylinder(r = R(OuterD) - 2, h = Gauge + 1, center = true);
|
||||||
|
}
|
||||||
|
outer_clip(Gauge, OuterD);
|
||||||
|
}
|
||||||
|
clip(Gauge, OuterD);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module film_core (Gauge = 16, OuterD = 50.8, Partition = true) {
|
||||||
|
supports(Gauge, 8, OuterD);
|
||||||
|
inner_core(Gauge);
|
||||||
|
outer_core(Gauge, OuterD);
|
||||||
|
if (Partition) {
|
||||||
|
difference () {
|
||||||
|
cylinder(r = R(OuterD - 1), h = 2, center = true);
|
||||||
|
outer_clip(Gauge, OuterD);
|
||||||
|
clip(Gauge, OuterD);
|
||||||
|
inner_core_shape(Gauge, InnerD - 3, (InnerD / 2) - 0.5, 4, 4, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
PART = "16mm_2in";
|
||||||
|
|
||||||
|
if (PART == "16mm_2in") {
|
||||||
|
film_core(16, 2 * IN, true);
|
||||||
|
} else if (PART == "16mm_3in") {
|
||||||
|
film_core(16, 3 * IN, true);
|
||||||
|
} else if (PART == "16mm_2in_np") {
|
||||||
|
film_core(16, 2 * IN, false);
|
||||||
|
} else if (PART == "16mm_3in_np") {
|
||||||
|
film_core(16, 3 * IN, false);
|
||||||
|
} else if (PART == "8mm_2in") {
|
||||||
|
film_core(8, 2 * IN, true);
|
||||||
|
} else if (PART == "8mm_3in") {
|
||||||
|
film_core(8, 3 * IN, true);
|
||||||
|
} else if (PART == "8mm_2in_np") {
|
||||||
|
film_core(8, 2 * IN, false);
|
||||||
|
} else if (PART == "8mm_3in_np") {
|
||||||
|
film_core(8, 3 * IN, false);
|
||||||
|
} else if (PART == "35mm_2in") {
|
||||||
|
film_core(35, 2 * IN, true);
|
||||||
|
} else if (PART == "35mm_3in") {
|
||||||
|
film_core(35, 3 * IN, true);
|
||||||
|
} else if (PART == "35mm_2in_np") {
|
||||||
|
film_core(35, 2 * IN, false);
|
||||||
|
} else if (PART == "35mm_3in_np") {
|
||||||
|
film_core(35, 3 * IN, false);
|
||||||
|
}
|