All cores projects merged into a single script. Layout of all cores fore rendering, will need changes.
This commit is contained in:
commit
38e6045fde
.gitmodulesLICENSEREADME.md
img
film_core_16mm_2in.jpgfilm_core_16mm_2in_np.jpgfilm_core_16mm_3in.jpgfilm_core_16mm_3in_np.jpgfilm_core_35mm_2in.jpgfilm_core_35mm_2in_np.jpgfilm_core_35mm_3in.jpgfilm_core_35mm_3in_np.jpgfilm_core_8mm_2in.jpgfilm_core_8mm_2in_np.jpgfilm_core_8mm_3in.jpgfilm_core_8mm_3in_np.jpg
layout.jsmeta.jsonscad.shscad
stl
|
@ -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
|
||||||
|
|
||||||
|
-----
|
||||||
|
|
Binary file not shown.
After ![]() (image error) Size: 18 KiB |
Binary file not shown.
After ![]() (image error) Size: 18 KiB |
Binary file not shown.
After ![]() (image error) Size: 16 KiB |
Binary file not shown.
After ![]() (image error) Size: 17 KiB |
Binary file not shown.
After ![]() (image error) Size: 18 KiB |
Binary file not shown.
After ![]() (image error) Size: 18 KiB |
Binary file not shown.
After ![]() (image error) Size: 18 KiB |
Binary file not shown.
After ![]() (image error) Size: 18 KiB |
Binary file not shown.
After ![]() (image error) Size: 16 KiB |
Binary file not shown.
After ![]() (image error) Size: 17 KiB |
Binary file not shown.
After ![]() (image error) Size: 15 KiB |
Binary file not shown.
After ![]() (image error) 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);
|
||||||
|
}
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue