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);
|
||||
}
|