Compare commits
35 Commits
Author | SHA1 | Date |
---|---|---|
Matt McWilliams | 2d82d2d04f | |
mmcwilliams | fa1bf6d8a1 | |
mmcwilliams | 70c0c54f13 | |
mmcwilliams | 4384251026 | |
mmcwilliams | 54f16a864a | |
mmcwilliams | bc5789018e | |
Matt McWilliams | 4c24489e8f | |
Matt McWilliams | 84764e26e6 | |
Matt McWilliams | 72aff30b11 | |
Matt McWilliams | 7e4f6dd476 | |
Matt McWilliams | a54583ff12 | |
Matt McWilliams | 8a3300fab6 | |
Matt McWilliams | 08bc7d16b6 | |
Matt McWilliams | 9eb3bd0ae2 | |
Matt McWilliams | 9d9e5e260f | |
Matt McWilliams | a3d2727261 | |
Matt McWilliams | cdc80b3c93 | |
Matt McWilliams | 479a2466a2 | |
Matt McWilliams | 473d8e99ca | |
Matt McWilliams | 29b40d4fb6 | |
Matt McWilliams | 1af2b43d36 | |
Matt McWilliams | 62b0cae3bd | |
Matt McWilliams | 5e09bd394b | |
Matt McWilliams | 61a990ad0c | |
mmcwilliams | cb73a66c29 | |
Matt McWilliams | 88446c4d28 | |
Matt McWilliams | 9e267517d5 | |
Matt McWilliams | 8c106c3d42 | |
Matt McWilliams | f4fbdbe614 | |
Matt McWilliams | aa520c3a2c | |
Matt McWilliams | 9e2d4e4cd7 | |
Matt McWilliams | 814fe80e50 | |
Matt McWilliams | dfa22adc8c | |
Matt McWilliams | c1ae9a9d7d | |
Matt McWilliams | ba2b701a7a |
|
@ -3,3 +3,4 @@ benchmark
|
|||
releases
|
||||
stl/*/*.txt
|
||||
csg/*
|
||||
notes/renders.sqlite
|
|
@ -1,6 +1,6 @@
|
|||
MIT License
|
||||
|
||||
Copyright (c) 2021 Matt McWilliams
|
||||
Copyright (c) 2024 Matt McWilliams
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this hardware, software, and associated documentation files (the "Product"), to deal in the Product without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Product, and to permit persons to whom the Product is furnished to do so, subject to the following conditions:
|
||||
|
||||
|
|
40
README.md
|
@ -6,10 +6,11 @@ A free and open-source processing system for 16mm and Super8 film
|
|||
|
||||
1. [What's GNAL?](#what)
|
||||
2. [STL Files](#stls)
|
||||
3. [Printers](#printers)
|
||||
4. [Material](#material)
|
||||
5. [Troubleshooting](#troubleshooting)
|
||||
6. [Contact](#contact)
|
||||
3. [Release Notes](#)
|
||||
4. [Printers](#printers)
|
||||
5. [Material](#material)
|
||||
6. [Troubleshooting](#troubleshooting)
|
||||
7. [Contact](#contact)
|
||||
|
||||
---
|
||||
<a name="what"></a>
|
||||
|
@ -34,7 +35,8 @@ There has been a lot of development around 3D printed processing spirals and any
|
|||
If you find any, please share with the email address at the bottom of this README.
|
||||
|
||||
* [Movie Film Spiral Developing Tank by mb_maker on Thingiverse](https://www.thingiverse.com/thing:4715086)
|
||||
* [New 16mm developing tank](https://cinematography.com/index.php?/forums/topic/83456-new-16mm-developing-tank/)
|
||||
* [New 16mm developing tank by Sam Davisson](https://cinematography.com/index.php?/forums/topic/83456-new-16mm-developing-tank/)
|
||||
* [16mm Multi-Reel Film Developing Tank by James Harter](https://www.thingiverse.com/thing:4960952)
|
||||
|
||||
## Where's the tank?
|
||||
|
||||
|
@ -42,6 +44,19 @@ Good question!
|
|||
|
||||
----
|
||||
<a name="stls"></a>
|
||||
## Latest - 3.0.1
|
||||
|
||||
#### [All 50ft 3.0.1 STL files in a .zip]()
|
||||
|
||||
* [Spiral](stl/50ft_v3/gnal_50ft_spiral.stl)
|
||||
* [Top](stl/50ft_v3/gnal_50ft_top.stl)
|
||||
* [Top Spacer](stl/50ft_v3/gnal_50ft_spacer.stl)
|
||||
* [Bottom Spiral Insert S8](stl/50ft_v3/gnal_50ft_insert_s8.stl)
|
||||
* [Bottom Spiral Insert 16mm](stl/50ft_v3/gnal_50ft_insert_16.stl)
|
||||
* [Bottom Spacer 16mm](stl/50ft_v3/gnal_50ft_spacer_16.stl)
|
||||
* [Spindle Top](stl/50ft_v3/gnal_50ft_spindle_top.stl)
|
||||
* [Spindle Bottom](stl/50ft_v3/gnal_50ft_spindle_bottom.stl)
|
||||
|
||||
## V3 STL Files
|
||||
|
||||
![V3 50ft spiral top and bottom](/img/gnal_50ft_v3_spiral_render.jpg)
|
||||
|
@ -121,6 +136,17 @@ Good question!
|
|||
* [Spacer](stl/100ft_v1/gnal_100ft_spacer.stl)
|
||||
|
||||
-----
|
||||
|
||||
<a name="notes"></a>
|
||||
## Release Notes
|
||||
|
||||
#### v1, v2, v3
|
||||
|
||||
* All files were published including the 3 major development versions of the GNAL
|
||||
* v3 was determined to be the release candidate and is the version in active development
|
||||
|
||||
|
||||
|
||||
<a name="printers"></a>
|
||||
## Printers
|
||||
|
||||
|
@ -183,7 +209,7 @@ If your prints are warping, there are a few things to look at:
|
|||
3. Slicer settings
|
||||
|
||||
The first thing to consider when your prints are coming out warped off the print bed is whether or not your **material** is appropriate for this model.
|
||||
Check the [material](#material) section of this README for more information, but theres a chance if you are using PLA or ABS that large flat prints of this size are warping due to limitations with the material you are using. PETG has proven to warp far less in my own anecdotal experience and is the recommended material for this project.
|
||||
Check the [material](#material) section of this README for more information, but there's a chance if you are using PLA or ABS that large flat prints of this size are warping due to limitations with the material you are using. PETG has proven to warp far less in my own anecdotal experience and is the recommended material for this project.
|
||||
|
||||
The thermal properties of the material you're printing with are what causes warping, so check if your printer is being set to the recommended **temperatures** on both the bed and extruder for the material and printer you are using.
|
||||
Warping occurs consistently when a section of a part cools too quickly and contracts while the rest of it is still being printed.
|
||||
|
@ -223,7 +249,7 @@ Had issues or success printing this? Interested in getting in contact?
|
|||
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2020 Matt McWilliams
|
||||
Copyright (c) 2021 Matt McWilliams
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this hardware, software, and associated documentation files (the "Product"), to deal in the Product without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Product, and to permit persons to whom the Product is furnished to do so, subject to the following conditions:
|
||||
|
||||
|
|
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 80 KiB |
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 73 KiB |
After Width: | Height: | Size: 78 KiB |
Before Width: | Height: | Size: 62 KiB After Width: | Height: | Size: 82 KiB |
Before Width: | Height: | Size: 56 KiB After Width: | Height: | Size: 69 KiB |
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 89 KiB |
After Width: | Height: | Size: 132 KiB |
After Width: | Height: | Size: 87 KiB |
Before Width: | Height: | Size: 88 KiB After Width: | Height: | Size: 136 KiB |
Before Width: | Height: | Size: 77 KiB After Width: | Height: | Size: 144 KiB |
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 80 KiB |
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 73 KiB |
After Width: | Height: | Size: 78 KiB |
Before Width: | Height: | Size: 62 KiB After Width: | Height: | Size: 82 KiB |
Before Width: | Height: | Size: 56 KiB After Width: | Height: | Size: 69 KiB |
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 89 KiB |
After Width: | Height: | Size: 132 KiB |
After Width: | Height: | Size: 87 KiB |
Before Width: | Height: | Size: 88 KiB After Width: | Height: | Size: 136 KiB |
Before Width: | Height: | Size: 68 KiB After Width: | Height: | Size: 118 KiB |
|
@ -0,0 +1,18 @@
|
|||
CREATE TABLE IF NOT EXISTS renders (
|
||||
time INTEGER PRIMARY KEY,
|
||||
commit_id TEXT,
|
||||
source TEXT,
|
||||
model TEXT,
|
||||
stl TEXT,
|
||||
stl_size INTEGER,
|
||||
facets INTEGER,
|
||||
volume REAL,
|
||||
x REAL,
|
||||
y REAL,
|
||||
z REAL,
|
||||
render_time INTEGER,
|
||||
source_hash TEXT,
|
||||
stl_hash TEXT,
|
||||
openscad TEXT,
|
||||
cpu TEXT
|
||||
);
|
|
@ -0,0 +1,99 @@
|
|||
/**
|
||||
* Used to workshop the stacking screw
|
||||
* */
|
||||
|
||||
module stacking_debug () {
|
||||
translate([0, 0, 72 + 72 + 36]) {
|
||||
color("blue") gnal_spindle_top();
|
||||
}
|
||||
translate([0, 0, 72 + 72]) rotate([0, 180, 0]) intersection () {
|
||||
gnal_50ft_top();
|
||||
cylinder(r = 50 / 2, h = 50, center = true);
|
||||
}
|
||||
|
||||
translate([0, 0, 72 + 30]) {
|
||||
color("blue") rotate([0, 180, 0]) gnal_spindle_bottom();
|
||||
}
|
||||
|
||||
translate([0, 0, 72 + 36]) difference () {
|
||||
cylinder(r = 50 / 2, h = 16, center = true);
|
||||
cylinder(r = 22.5 / 2, h = 16 + 1, center = true);
|
||||
}
|
||||
|
||||
translate([0, 0, 36 + 30]) {
|
||||
color("green") rotate([0, 180, 0]) gnal_stacking_spindle();
|
||||
}
|
||||
|
||||
translate([0, 0, 72]) difference () {
|
||||
cylinder(r = 50 / 2, h = 16, center = true);
|
||||
cylinder(r = 22.5 / 2, h = 16 + 1, center = true);
|
||||
}
|
||||
|
||||
translate([0, 0, 30]) {
|
||||
color("green") rotate([0, 180, 0]) gnal_stacking_spindle();
|
||||
}
|
||||
|
||||
translate([0, 0, 36]) difference () {
|
||||
cylinder(r = 50 / 2, h = 16, center = true);
|
||||
cylinder(r = 22.5 / 2, h = 16 + 1, center = true);
|
||||
}
|
||||
|
||||
color("blue") translate([0, 0, 12 + 3]) gnal_spacer_16();
|
||||
//#1 - bottom spiral
|
||||
difference () {
|
||||
cylinder(r = 50 / 2, h = 16, center = true);
|
||||
cylinder(r = 22.5 / 2, h = 16 + 1, center = true);
|
||||
translate([0, 0, -8]) spiral_insert_void();
|
||||
}
|
||||
|
||||
color("blue") translate([0, 0, -12]) gnal_spiral_bottom_insert_16();
|
||||
|
||||
}
|
||||
|
||||
module stacking_debug2 () {
|
||||
translate([0, 0, 72 + 47]) {
|
||||
color("blue") gnal_spindle_top();
|
||||
}
|
||||
translate([0, 0, 72 + 26]) rotate([0, 180, 0]) intersection () {
|
||||
gnal_50ft_top();
|
||||
cylinder(r = 50 / 2, h = 50, center = true);
|
||||
}
|
||||
|
||||
translate([0, 0, 72 - 4]) {
|
||||
color("blue") rotate([0, 180, 0]) gnal_spindle_bottom();
|
||||
}
|
||||
|
||||
translate([0, 0, 72 + 8]) difference () {
|
||||
cylinder(r = 50 / 2, h = 16, center = true);
|
||||
cylinder(r = 22.5 / 2, h = 16 + 1, center = true);
|
||||
}
|
||||
|
||||
translate([0, 0, 36 + 8]) {
|
||||
color("green") rotate([0, 180, 0]) gnal_stacking_spindle();
|
||||
}
|
||||
|
||||
translate([0, 0, 55.5]) difference () {
|
||||
cylinder(r = 50 / 2, h = 16, center = true);
|
||||
cylinder(r = 22.5 / 2, h = 16 + 1, center = true);
|
||||
}
|
||||
|
||||
translate([0, 0, 20]) {
|
||||
color("green") rotate([0, 180, 0]) gnal_stacking_spindle();
|
||||
}
|
||||
|
||||
translate([0, 0, 32]) difference () {
|
||||
cylinder(r = 50 / 2, h = 16, center = true);
|
||||
cylinder(r = 22.5 / 2, h = 16 + 1, center = true);
|
||||
}
|
||||
|
||||
color("blue") translate([0, 0, 12 + 3 + 5]) gnal_spacer_16();
|
||||
//#1 - bottom spiral
|
||||
translate([0, 0, 8]) difference () {
|
||||
cylinder(r = 50 / 2, h = 16, center = true);
|
||||
cylinder(r = 22.5 / 2, h = 16 + 1, center = true);
|
||||
translate([0, 0, -8]) spiral_insert_void();
|
||||
}
|
||||
color("blue") translate([0, 0, 11]) gnal_spiral_bottom_insert_16();
|
||||
H = 120;
|
||||
translate([0, 0, H / 2 - 2]) color("red") cube([1, 50, H], center = true);
|
||||
}
|
40
notes/v3.csv
|
@ -1,17 +1,23 @@
|
|||
version,cpu,file,file_hash,file_size,source_hash,source_size,facets,volume,render_time
|
||||
2020.08.18,Intel(R) Core(TM) i7-4770HQ CPU @ 2.20GHz,./stl/50ft_v3/gnal_50ft_spindle_bottom.stl,06424e6ddf76a857fc3b9bc5e5346e74c04ce48eabcbb80b94676b3088277ef6,3760384,09f2e406d8a1ba16229d89fcb1aa36e635dcd185811b98e41224cb7bbf72f315,8420,75206,4134.077637,1291
|
||||
2020.08.18,Intel(R) Core(TM) i7-4770HQ CPU @ 2.20GHz,./stl/50ft_v3/gnal_50ft_spindle_top.stl,be80982ec5cdad509266021300fcd7519981092e0fcc45f8180b342b10446e8b,6915384,09f2e406d8a1ba16229d89fcb1aa36e635dcd185811b98e41224cb7bbf72f315,8420,138306,22229.814453,1128
|
||||
2020.08.18,Intel(R) Core(TM) i7-4770HQ CPU @ 2.20GHz,./stl/50ft_v3/gnal_50ft_spacer.stl,227b24571911a243312d4945dfbe020cf1dedee17b745f37ae6aa5d4ff4dfda6,286884,09f2e406d8a1ba16229d89fcb1aa36e635dcd185811b98e41224cb7bbf72f315,8420,5736,2888.150635,62
|
||||
2020.08.18,Intel(R) Core(TM) i7-4770HQ CPU @ 2.20GHz,./stl/50ft_v3/gnal_50ft_top.stl,7bdad60d3f656d2a6f596f91265c9ff646b70980fa21017d4d9dc4039efefc09,1104884,09f2e406d8a1ba16229d89fcb1aa36e635dcd185811b98e41224cb7bbf72f315,8420,22096,57933.800781,585
|
||||
2020.08.18,Intel(R) Core(TM) i7-4770HQ CPU @ 2.20GHz,./stl/50ft_v3/gnal_50ft_spiral.stl,f97986b3f90f765e5510b3a10940203e16fc1fe2300ea04e5977c538ac4325d3,9500384,09f2e406d8a1ba16229d89fcb1aa36e635dcd185811b98e41224cb7bbf72f315,8420,190006,171712.140625,1111
|
||||
2020.08.18,Intel(R) Core(TM) i7-4770HQ CPU @ 2.20GHz,./stl/50ft_v3/gnal_50ft_insert_s8.stl,8803f73172ec6aa44f70b389210bc55bd7541a9d76924bd3ea056a5615986592,1361584,09f2e406d8a1ba16229d89fcb1aa36e635dcd185811b98e41224cb7bbf72f315,8420,27230,3493.544922,276
|
||||
2020.08.18,Intel(R) Core(TM) i7-4770HQ CPU @ 2.20GHz,./stl/50ft_v3/gnal_50ft_insert_16.stl,ed6a80eac3b2c82dc3be22130f1d0fe6e44c37016b27522a95a5f268c23c83be,2071384,09f2e406d8a1ba16229d89fcb1aa36e635dcd185811b98e41224cb7bbf72f315,8420,41426,4665.019531,439
|
||||
2020.08.18,Intel(R) Core(TM) i7-4770HQ CPU @ 2.20GHz,./stl/50ft_v3/gnal_50ft_spacer_16.stl,d9b8c412792f6b6d3b9817fc7f8e0f1b431202844374f44800da97caad3b15e8,602084,09f2e406d8a1ba16229d89fcb1aa36e635dcd185811b98e41224cb7bbf72f315,8420,12040,4019.470703,281
|
||||
2020.08.18,Intel(R) Core(TM) i7-4770HQ CPU @ 2.20GHz,./stl/100ft_v3/gnal_100ft_spindle_bottom.stl,df189c1345ab5da921857fb837a3814bbfdc9fd9da8eb5bbaf6cf63c2347859e,3760384,a435a7d28947374c724e7618466d7f38d4fb5eb1f5bbaacb9061ef58dab3f8e2,11728,75206,4134.064941,1275
|
||||
2020.08.18,Intel(R) Core(TM) i7-4770HQ CPU @ 2.20GHz,./stl/100ft_v3/gnal_100ft_spindle_top.stl,bad92e882e26ee489d7625e65f40c035b6e7c632473f3db6d0b3633eab9d8411,6979184,a435a7d28947374c724e7618466d7f38d4fb5eb1f5bbaacb9061ef58dab3f8e2,11728,139582,22229.773438,1139
|
||||
2020.08.18,Intel(R) Core(TM) i7-4770HQ CPU @ 2.20GHz,./stl/100ft_v3/gnal_100ft_spacer.stl,dda2654f9209e8b17515f42cd7602d59b542630469b1f848442665a6ce2b2158,286884,a435a7d28947374c724e7618466d7f38d4fb5eb1f5bbaacb9061ef58dab3f8e2,11728,5736,2888.143555,63
|
||||
2020.08.18,Intel(R) Core(TM) i7-4770HQ CPU @ 2.20GHz,./stl/100ft_v3/gnal_100ft_top.stl,bc39a67711877624917866f3ce80e4164c165969f52cf0e34b7e7fb65b0b1565,1620084,a435a7d28947374c724e7618466d7f38d4fb5eb1f5bbaacb9061ef58dab3f8e2,11728,32400,102557.437500,998
|
||||
2020.08.18,Intel(R) Core(TM) i7-4770HQ CPU @ 2.20GHz,./stl/100ft_v3/gnal_100ft_spiral.stl,bf12d37e85d88a3d9aeccbf2e0661e9bb8aae7a919dbc9a065c7919b0e0321c3,18364384,a435a7d28947374c724e7618466d7f38d4fb5eb1f5bbaacb9061ef58dab3f8e2,11728,367286,326573.812500,3746
|
||||
2020.08.18,Intel(R) Core(TM) i7-4770HQ CPU @ 2.20GHz,./stl/100ft_v3/gnal_100ft_insert_s8.stl,64e954bbe40e104e7a3fc571420ea71841e752c443b2f3bbc54b7a7f316bdc02,1361584,a435a7d28947374c724e7618466d7f38d4fb5eb1f5bbaacb9061ef58dab3f8e2,11728,27230,3493.548340,272
|
||||
2020.08.18,Intel(R) Core(TM) i7-4770HQ CPU @ 2.20GHz,./stl/100ft_v3/gnal_100ft_insert_16.stl,3a0474be55afc9fd8217149dddd474530e8259e217d9a861d39f7e933b5da741,2071384,a435a7d28947374c724e7618466d7f38d4fb5eb1f5bbaacb9061ef58dab3f8e2,11728,41426,4664.790527,450
|
||||
2020.08.18,Intel(R) Core(TM) i7-4770HQ CPU @ 2.20GHz,./stl/100ft_v3/gnal_100ft_spacer_16.stl,b6272b501d6c4dcd86369c9a9b21b355f941fbaf60abca9f88c43a22ddbc443b,755684,a435a7d28947374c724e7618466d7f38d4fb5eb1f5bbaacb9061ef58dab3f8e2,11728,15112,4019.479248,368
|
||||
openscad,cpu,stl,stl_hash,stl_size,source_hash,source_size,facets,volume,render_time,commit
|
||||
2021.01,AMD Ryzen 7 3700X 8-Core Processor,./stl/50ft_v3/gnal_50ft_spindle_bottom.stl,acb87696d7018c4075fe7a5b805c2b4b9f9461bb00b8cc13f1311a59bcc5911e,3748384,fa01c1fcd2f664dc525042ccdea21ac0a0cb12a28f03260c0426b587a0368c43,8328,74966,4303.875977,264,9d9e5e2
|
||||
2021.01,AMD Ryzen 7 3700X 8-Core Processor,./stl/50ft_v3/gnal_50ft_spindle_top.stl,b5d22abdd6bfc86aaf7abf03e1bc4f44f32997cd498a859ef72d9791d4c6c809,6918984,fa01c1fcd2f664dc525042ccdea21ac0a0cb12a28f03260c0426b587a0368c43,8328,138378,22225.964844,319,9d9e5e2
|
||||
2021.01,AMD Ryzen 7 3700X 8-Core Processor,./stl/50ft_v3/gnal_50ft_spindle_single.stl,73456df963eac39ca5fd60cae7098ef85d0555e478e7111c50a0da11233b868e,5963084,fa01c1fcd2f664dc525042ccdea21ac0a0cb12a28f03260c0426b587a0368c43,8328,119260,26349.712891,306,9d9e5e2
|
||||
2021.01,AMD Ryzen 7 3700X 8-Core Processor,./stl/50ft_v3/gnal_50ft_spindle_stacking.stl,4d80c9798ac9877230e2de70ea5b95f066fe1a294d11d220feae0ef6fec94889,2968184,fa01c1fcd2f664dc525042ccdea21ac0a0cb12a28f03260c0426b587a0368c43,8328,59362,8448.288086,206,9d9e5e2
|
||||
2021.01,AMD Ryzen 7 3700X 8-Core Processor,./stl/50ft_v3/gnal_50ft_insert_s8.stl,a2dd82c2fe9a9f66ed1b9ef98ab008314eadd50d3f109e7a00e097dd33dd8ced,1361584,fa01c1fcd2f664dc525042ccdea21ac0a0cb12a28f03260c0426b587a0368c43,8328,27230,3286.772461,55,9d9e5e2
|
||||
2021.01,AMD Ryzen 7 3700X 8-Core Processor,./stl/50ft_v3/gnal_50ft_insert_16.stl,011ce17a4c083d226bb131a92962d831ebf280fb923a32c19e5d39ffa82d2fbb,2071384,fa01c1fcd2f664dc525042ccdea21ac0a0cb12a28f03260c0426b587a0368c43,8328,41426,4355.436523,91,9d9e5e2
|
||||
2021.01,AMD Ryzen 7 3700X 8-Core Processor,./stl/50ft_v3/gnal_50ft_spacer.stl,f22165803ac56a1bec0b9efbb3615c10256850ea19f6d28cfc16ffb8894e9cd8,286884,fa01c1fcd2f664dc525042ccdea21ac0a0cb12a28f03260c0426b587a0368c43,8328,5736,2888.156250,14,9d9e5e2
|
||||
2021.01,AMD Ryzen 7 3700X 8-Core Processor,./stl/50ft_v3/gnal_50ft_spacer_16.stl,43b1ea67592d6d68e0c1e2e0c3d73e8414c4771126245a4c85b72ba98409878a,605284,fa01c1fcd2f664dc525042ccdea21ac0a0cb12a28f03260c0426b587a0368c43,8328,12104,3951.205566,52,9d9e5e2
|
||||
2021.01,AMD Ryzen 7 3700X 8-Core Processor,./stl/50ft_v3/gnal_50ft_insert_single.stl,8e71d04042e1e41bdb88e991871ca63cf97cd2213c719bbedc1d18be4c755eb1,1362184,fa01c1fcd2f664dc525042ccdea21ac0a0cb12a28f03260c0426b587a0368c43,8328,27242,2946.449707,98,9d9e5e2
|
||||
2021.01,AMD Ryzen 7 3700X 8-Core Processor,./stl/50ft_v3/gnal_50ft_top.stl,570de760a862220ba22e88625196e0ddda74976950889998c327232c7fde3638,1104884,fa01c1fcd2f664dc525042ccdea21ac0a0cb12a28f03260c0426b587a0368c43,8328,22096,57933.875000,109,9d9e5e2
|
||||
2021.01,AMD Ryzen 7 3700X 8-Core Processor,./stl/50ft_v3/gnal_50ft_spiral.stl,9f0990ad3bcecb3e7eb706e79da5f1e802ecf867198c8cb53c3a3979565b43ae,9493184,fa01c1fcd2f664dc525042ccdea21ac0a0cb12a28f03260c0426b587a0368c43,8328,189862,172539.781250,836,9d9e5e2
|
||||
2021.01,AMD Ryzen 7 3700X 8-Core Processor,./stl/100ft_v3/gnal_100ft_spindle_bottom.stl,5218e3383e46b13bdeadc2166531c11d2aea4eafb8e4c7346e9a5e6536fc9805,3748384,f6079933217206a4c314ba11d758a35f002be4442ef54928c7f443e9bd4c0fce,10795,74966,4303.873535,270,9d9e5e2
|
||||
2021.01,AMD Ryzen 7 3700X 8-Core Processor,./stl/100ft_v3/gnal_100ft_spindle_top.stl,8dbd307cf5aaec9099e901909fdc6472dd7e0fc487b890be00443c99790776a7,6982784,f6079933217206a4c314ba11d758a35f002be4442ef54928c7f443e9bd4c0fce,10795,139654,22226.011719,334,9d9e5e2
|
||||
2021.01,AMD Ryzen 7 3700X 8-Core Processor,./stl/100ft_v3/gnal_100ft_spindle_single.stl,af5245e9b1f4aee95ef73d88fca51e9b2036f71a587f55853742bde7b19e22a3,6026884,f6079933217206a4c314ba11d758a35f002be4442ef54928c7f443e9bd4c0fce,10795,120536,26350.066406,328,9d9e5e2
|
||||
2021.01,AMD Ryzen 7 3700X 8-Core Processor,./stl/100ft_v3/gnal_100ft_spindle_stacking.stl,1b440745d0c251fb2986f63b15de196a958d5726088a660c4ae0e92da11706a9,2968184,f6079933217206a4c314ba11d758a35f002be4442ef54928c7f443e9bd4c0fce,10795,59362,8448.282227,203,9d9e5e2
|
||||
2021.01,AMD Ryzen 7 3700X 8-Core Processor,./stl/100ft_v3/gnal_100ft_insert_s8.stl,d53020825b2abadcab80e5a256af23b5ae4faa7c207268c6bcecf742be1d73b4,1361584,f6079933217206a4c314ba11d758a35f002be4442ef54928c7f443e9bd4c0fce,10795,27230,3286.773926,56,9d9e5e2
|
||||
2021.01,AMD Ryzen 7 3700X 8-Core Processor,./stl/100ft_v3/gnal_100ft_insert_16.stl,3a810cb106d6713a389b2f60139a19733d8d357ee7fc5d1a481b8a75fda40b8e,2071384,f6079933217206a4c314ba11d758a35f002be4442ef54928c7f443e9bd4c0fce,10795,41426,4355.436035,89,9d9e5e2
|
||||
2021.01,AMD Ryzen 7 3700X 8-Core Processor,./stl/100ft_v3/gnal_100ft_spacer.stl,665cbe1e8ad4ff401939d64b725540fa6ba4d77aee4d265de1b92a8a0a880f6a,286884,f6079933217206a4c314ba11d758a35f002be4442ef54928c7f443e9bd4c0fce,10795,5736,2888.155518,14,9d9e5e2
|
||||
2021.01,AMD Ryzen 7 3700X 8-Core Processor,./stl/100ft_v3/gnal_100ft_spacer_16.stl,cb1bae331e85d92b9581f7c199b8fee2045b720a89d1a0588ab38df6241f938b,755684,f6079933217206a4c314ba11d758a35f002be4442ef54928c7f443e9bd4c0fce,10795,15112,3951.218750,72,9d9e5e2
|
||||
2021.01,AMD Ryzen 7 3700X 8-Core Processor,./stl/100ft_v3/gnal_100ft_insert_single.stl,4f68f9cb0d3b042a2e8527389b9a148e674670ddd4579c51e6e4cf60150bd3fa,1362184,f6079933217206a4c314ba11d758a35f002be4442ef54928c7f443e9bd4c0fce,10795,27242,2946.450684,94,9d9e5e2
|
||||
2021.01,AMD Ryzen 7 3700X 8-Core Processor,./stl/100ft_v3/gnal_100ft_top.stl,f79c78fcd614d9a2ae0a4df293696f443b3a23e46849caaaee3cd81df310a80d,1620084,f6079933217206a4c314ba11d758a35f002be4442ef54928c7f443e9bd4c0fce,10795,32400,102557.703125,187,9d9e5e2
|
||||
2021.01,AMD Ryzen 7 3700X 8-Core Processor,./stl/100ft_v3/gnal_100ft_spiral.stl,e9c33c69bcc11f1f3273427dc6bab46d1fdd6fe955467402fac880dd0a9d2460,18336384,f6079933217206a4c314ba11d758a35f002be4442ef54928c7f443e9bd4c0fce,10795,366726,327833.812500,4682,9d9e5e2
|
||||
|
|
|
|
@ -3,6 +3,8 @@
|
|||
include <../libraries/gnal_v3.scad>;
|
||||
|
||||
SPOKE_COUNT = 24;
|
||||
FN = 200;
|
||||
$fn = FN;
|
||||
|
||||
module gnal_100ft_spiral (spiral_count = 60, od = 298.75, quarter = false) {
|
||||
outer_d = 299;
|
||||
|
@ -250,11 +252,13 @@ module gnal_100ft_top () {
|
|||
}
|
||||
}
|
||||
|
||||
FN = 200;
|
||||
$fn = FN;
|
||||
|
||||
module film_guide (rotations = 60, id = 45.55, spacing = 2.075, bottom = -2) {
|
||||
spiral(rotations, id, spacing, bottom, $fn);
|
||||
//reinforce outer spiral
|
||||
difference () {
|
||||
spiral_reinforcement(292.9, spacing, -0.1, $fn);
|
||||
translate([149.125, 9, 0]) cube([5, 20, 10], center = true);
|
||||
}
|
||||
}
|
||||
|
||||
PART="spiral";
|
||||
|
@ -273,18 +277,20 @@ if (PART == "spiral") {
|
|||
gnal_100ft_top();
|
||||
} else if (PART == "spacer") {
|
||||
gnal_spacer();
|
||||
} else if (PART == "spacer_16") {
|
||||
gnal_spacer_16();
|
||||
} else if (PART == "insert_s8") {
|
||||
gnal_spiral_bottom_insert_s8();
|
||||
} else if (PART == "insert_16") {
|
||||
gnal_spiral_bottom_insert_16();
|
||||
} else if (PART == "insert_single") {
|
||||
gnal_spiral_bottom_insert_single();
|
||||
} else if (PART == "spacer_16") {
|
||||
gnal_spacer_16();
|
||||
} else if (PART == "spindle_top") {
|
||||
gnal_spindle_top();
|
||||
} else if (PART == "spindle_bottom") {
|
||||
gnal_spindle_bottom();
|
||||
} else if (PART == "spindle_single") {
|
||||
gnal_spindle_single();
|
||||
} else if (PART == "spindle_stacking") {
|
||||
rotate([0, 180, 0]) gnal_stacking_spindle();
|
||||
}
|
|
@ -3,13 +3,15 @@
|
|||
include <../libraries/gnal_v3.scad>;
|
||||
|
||||
SPOKE_COUNT = 24;
|
||||
FN = 200;
|
||||
$fn = FN;
|
||||
|
||||
module gnal_50ft_spiral (spiral_count = 40, od = 215.75, quarter = false) {
|
||||
outer_d = 215;
|
||||
outer_d_inside = 209;
|
||||
module gnal_50ft_spiral (spiral_count = 40, od = 215, quarter = false, reinforced = true) {
|
||||
outer_d = od;
|
||||
outer_d_inside = outer_d - 6;
|
||||
outer_h = 7.5;
|
||||
|
||||
spoke_len = 81;
|
||||
spoke_len = ((outer_d - 48) / 2) - 2.5; //81;
|
||||
spoke_w = 3;
|
||||
spoke_h = 4.2 + 3;
|
||||
|
||||
|
@ -44,6 +46,7 @@ module gnal_50ft_spiral (spiral_count = 40, od = 215.75, quarter = false) {
|
|||
}
|
||||
}
|
||||
//secondary spokes
|
||||
/*
|
||||
for (i = [0 : SPOKE_COUNT]) {
|
||||
rotate([0, 0, (i + 0.5) * (360 / SPOKE_COUNT)]) {
|
||||
translate([(outer_d / 2) - (spoke_2_len / 2) - 2, 0, -3.6]) {
|
||||
|
@ -51,7 +54,9 @@ module gnal_50ft_spiral (spiral_count = 40, od = 215.75, quarter = false) {
|
|||
}
|
||||
}
|
||||
}
|
||||
*/
|
||||
//spoke cross bars
|
||||
if (outer_d > 130) {
|
||||
for (i = [0 : SPOKE_COUNT]) {
|
||||
rotate([0, 0, (i + 0.5) * (360 / SPOKE_COUNT)]) {
|
||||
translate([63, 0, -3.6]) {
|
||||
|
@ -61,10 +66,11 @@ module gnal_50ft_spiral (spiral_count = 40, od = 215.75, quarter = false) {
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
translate([0, 0, -.1]) {
|
||||
rotate([0, 0, -90]) {
|
||||
film_guide(spiral_count);
|
||||
film_guide(spiral_count, reinforced = reinforced);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -180,14 +186,19 @@ module gnal_50ft_top () {
|
|||
}
|
||||
}
|
||||
|
||||
FN = 200;
|
||||
$fn = FN;
|
||||
|
||||
module film_guide (rotations = 40, id = 45.55 - .5, spacing = 2.075, bottom = -2) {
|
||||
module film_guide (rotations = 40, id = 45.55 - .5, spacing = 2.075, bottom = -2, reinforced = true) {
|
||||
spiral(rotations, id, spacing, bottom, $fn);
|
||||
//reinforce outer spiral
|
||||
if (reinforced) {
|
||||
difference () {
|
||||
spiral_reinforcement(208.9, spacing, -0.1, $fn);
|
||||
translate([107.35, 6, 0]) cube([5, 15, 10], center = true);
|
||||
}
|
||||
}
|
||||
|
||||
PART="quarter_a";
|
||||
}
|
||||
|
||||
PART="30ft_spiral";
|
||||
|
||||
if (PART == "spiral") {
|
||||
gnal_50ft_spiral();
|
||||
|
@ -203,20 +214,24 @@ if (PART == "spiral") {
|
|||
gnal_50ft_top();
|
||||
} else if (PART == "spacer") {
|
||||
gnal_spacer();
|
||||
} else if (PART == "spacer_16") {
|
||||
gnal_spacer_16();
|
||||
} else if (PART == "insert_s8") {
|
||||
gnal_spiral_bottom_insert_s8();
|
||||
} else if (PART == "insert_16") {
|
||||
gnal_spiral_bottom_insert_16();
|
||||
} else if (PART == "insert_single") {
|
||||
gnal_spiral_bottom_insert_single();
|
||||
} else if (PART == "spacer_16") {
|
||||
gnal_spacer_16();
|
||||
} else if (PART == "spindle_top") {
|
||||
gnal_spindle_top();
|
||||
} else if (PART == "spindle_bottom") {
|
||||
gnal_spindle_bottom();
|
||||
} else if (PART == "spindle_single") {
|
||||
gnal_spindle_top();
|
||||
gnal_spindle_single();
|
||||
} else if (PART == "spindle_stacking") {
|
||||
rotate([0, 180, 0]) gnal_stacking_spindle();
|
||||
} else if (PART == "30ft_spiral") {
|
||||
gnal_50ft_spiral(spiral_count = 19, od = 127, reinforced = false);
|
||||
} else if (PART == "spiral_test") {
|
||||
difference () {
|
||||
gnal_50ft_spiral();
|
||||
|
@ -224,3 +239,13 @@ if (PART == "spiral") {
|
|||
rotate([0, 0, 30]) translate([-125, 0, 0]) cube([250, 250, 100], center = true);
|
||||
}
|
||||
}
|
||||
|
||||
if (DEBUG) {
|
||||
echo("WARNING: DEBUG is enabled");
|
||||
}
|
||||
|
||||
/*
|
||||
echo($vpt);
|
||||
echo($vpr);
|
||||
echo($vpd);
|
||||
*/
|
|
@ -17,6 +17,7 @@ include <./Triangles.scad>;
|
|||
*
|
||||
*/
|
||||
|
||||
DEBUG = false;
|
||||
FINE = 200;
|
||||
|
||||
OD = 10 + .5;
|
||||
|
@ -47,7 +48,9 @@ function calcIncrement(spacing, fn) = spacing / fn;
|
|||
* 2019.05 (and maybe earlier), but should be explored.
|
||||
**/
|
||||
module spiral (rotations = 40, start_d = 48, spacing = 2.075, bottom = -7.1, fn) {
|
||||
|
||||
diam = (rotations * spacing * 2) + start_d;
|
||||
echo("DIAM", diam);
|
||||
echo("SPIRAL", rotations * PI * ((start_d + diam) / 2));
|
||||
//bottom = -7.1;
|
||||
w = 1.4;
|
||||
top_w = .8;
|
||||
|
@ -80,6 +83,39 @@ module spiral (rotations = 40, start_d = 48, spacing = 2.075, bottom = -7.1, fn)
|
|||
path_extrude(exShape=facetProfile, exPath=spiralPath);
|
||||
}
|
||||
|
||||
module spiral_reinforcement ( start_d = 48, spacing = 2.075, bottom = -2, fn) {
|
||||
rotations = 1;
|
||||
w = 1;
|
||||
top_w = .8;
|
||||
top_offset = (w - top_w);
|
||||
h = 2.2;
|
||||
|
||||
facetProfile = [
|
||||
[w, -bottom],
|
||||
[0, -bottom],
|
||||
[0, 0],
|
||||
[0, -h],
|
||||
[w, -h],
|
||||
[w, 0]
|
||||
];
|
||||
|
||||
end_d = start_d + (spacing * 2 * rotations);
|
||||
end_r = end_d / 2;
|
||||
start_r = start_d / 2;
|
||||
|
||||
facetSize = calcFacetSize(end_d, fn);
|
||||
start_fn = round(circ(start_d) / facetSize);
|
||||
|
||||
|
||||
spiralPath = [ for (r = [0 : rotations - 1]) for (i = [0 : round(calcFn(start_d, start_fn, end_d, spacing, r )) - 1 ])
|
||||
[
|
||||
X(start_r, spacing, round(calcFn(start_d, start_fn, end_d, spacing, r )), r, i),
|
||||
Y(start_r, spacing, round(calcFn(start_d, start_fn, end_d, spacing, r )), r, i),
|
||||
0]
|
||||
];
|
||||
path_extrude(exShape=facetProfile, exPath=spiralPath);
|
||||
}
|
||||
|
||||
/**
|
||||
* Core (center of the reel)
|
||||
**/
|
||||
|
@ -202,7 +238,8 @@ module spiral_insert_void () {
|
|||
|
||||
module gnal_spiral_bottom_insert_s8 () {
|
||||
$fn = 160;
|
||||
void_d = 18 - .3;
|
||||
OD = 10.5 + .3;
|
||||
void_d = 18 - .6;
|
||||
H = 17;
|
||||
D2 = INSERT_D;
|
||||
|
||||
|
@ -229,14 +266,21 @@ module gnal_spiral_bottom_insert_s8 () {
|
|||
}
|
||||
}
|
||||
}
|
||||
translate([0, 0, -LEN / 2]) metric_thread (diameter=OD, pitch=PITCH, thread_size = THREAD, length=LEN);
|
||||
translate([0, 0, -LEN / 2]) {
|
||||
if (DEBUG) {
|
||||
cylinder(r = OD / 2, h = LEN);
|
||||
} else {
|
||||
metric_thread (diameter=OD, pitch=PITCH, thread_size = THREAD, length=LEN);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module gnal_spiral_bottom_insert_16 () {
|
||||
$fn = 160;
|
||||
OD = 10.5 + .3;
|
||||
|
||||
void_d = 18 - .3;
|
||||
void_d = 18 - .6;
|
||||
H = 17 + 8;
|
||||
D2 = INSERT_D;
|
||||
|
||||
|
@ -266,7 +310,13 @@ module gnal_spiral_bottom_insert_16 () {
|
|||
}
|
||||
}
|
||||
}
|
||||
translate([0, 0, -(H / 2) - 2]) metric_thread (diameter=OD, pitch=PITCH, thread_size = THREAD, length=LEN + 8);
|
||||
translate([0, 0, -(H / 2) - 2]) {
|
||||
if (DEBUG) {
|
||||
cylinder(r = OD / 2, h = LEN + 8);
|
||||
} else {
|
||||
metric_thread (diameter=OD, pitch=PITCH, thread_size = THREAD, length=LEN + 8);
|
||||
}
|
||||
}
|
||||
translate([0, 0, 8.5]) {
|
||||
for (i = [0: RIDGES - 1]) {
|
||||
rotate([0, 0, i * (360 / RIDGES)]) translate([void_d / 2, 0, 0]) cylinder(r = RIDGE_D / 2, h = 8.1, center = true);
|
||||
|
@ -283,7 +333,7 @@ module gnal_spiral_bottom_insert_16 () {
|
|||
**/
|
||||
module gnal_spiral_bottom_insert_single () {
|
||||
$fn = 160;
|
||||
void_d = 18 - .3;
|
||||
void_d = 18 - .6;
|
||||
H = 17;
|
||||
D2 = INSERT_D;
|
||||
|
||||
|
@ -310,7 +360,13 @@ module gnal_spiral_bottom_insert_single () {
|
|||
}
|
||||
}
|
||||
}
|
||||
translate([0, 0, -LEN / 2]) metric_thread (diameter=SINGLE_THREAD_D, pitch=PITCH, thread_size = THREAD, length = LEN);
|
||||
translate([0, 0, -LEN / 2]) {
|
||||
if (DEBUG) {
|
||||
cylinder(r = SINGLE_THREAD_D / 2, h = LEN);
|
||||
} else {
|
||||
metric_thread (diameter=SINGLE_THREAD_D, pitch=PITCH, thread_size = THREAD, length = LEN);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -351,6 +407,29 @@ module spacer_outer_ridges () {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
module gnal_spacer_solid () {
|
||||
core_d = 29.5;
|
||||
core_bottom_d = 26.2 + .2;
|
||||
void_d = 18;
|
||||
h = 8;
|
||||
|
||||
RIDGES = 8;
|
||||
RIDGE_D = 3;
|
||||
translate([0, 0, 0]) difference () {
|
||||
union () {
|
||||
difference () {
|
||||
cylinder(r = core_d / 2, h = h, center = true, $fn = 200);
|
||||
}
|
||||
translate([0, 0, -.75]) rotate([0, 180, 0]) spacer_outer_ridges();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* This spacer attaches to the top piece when it is used
|
||||
* for Super8 film.
|
||||
**/
|
||||
module gnal_spacer () {
|
||||
add = 3.25;
|
||||
core_d = 29.5;
|
||||
|
@ -371,29 +450,22 @@ module gnal_spacer () {
|
|||
translate([0, 0, h - 0.1]) cylinder(r = (core_d + 1) / 2, h = h, center = true, $fn = 200);
|
||||
//trim bottom
|
||||
translate([0, 0, -h + 0.9]) cylinder(r = (core_d + 1) / 2, h = h, center = true, $fn = 200);
|
||||
//finger grips
|
||||
//translate([0, 24, 0]) rotate([-6, 0, 0]) cylinder(r = 10, h = 6, center = true, $fn = 100);
|
||||
//translate([0, -24, 0]) rotate([6, 0, 0]) cylinder(r = 10, h = 6, center = true, $fn = 100);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
module gnal_spacer_16 () {
|
||||
core_d = 29.5;
|
||||
core_bottom_d = 26.2 + .2;
|
||||
void_d = 18;
|
||||
void_d = 18.3;
|
||||
h = 8;
|
||||
|
||||
RIDGES = 8;
|
||||
RIDGE_D = 3;
|
||||
translate([0, 0, 0]) difference () {
|
||||
union () {
|
||||
difference () {
|
||||
cylinder(r = core_d / 2, h = h, center = true, $fn = 200);
|
||||
gnal_spacer_solid();
|
||||
cylinder(r = void_d / 2, h = h + 1, center = true, $fn = 200);
|
||||
}
|
||||
translate([0, 0, -.75]) rotate([0, 180, 0]) spacer_outer_ridges();
|
||||
}
|
||||
}
|
||||
translate([0, 0, 0]) {
|
||||
for (i = [0: RIDGES - 1]) {
|
||||
rotate([0, 0, i * (360 / RIDGES)]) translate([void_d / 2, 0, 0]) cylinder(r = RIDGE_D / 2, h = 8, center = true);
|
||||
|
@ -405,9 +477,17 @@ module gnal_spacer_16 () {
|
|||
* Spindles
|
||||
**/
|
||||
|
||||
module gnal_spindle_bottom_base ( HEX = false) {
|
||||
module gnal_spindle_base ( ) {
|
||||
D = 8.45 * 2;
|
||||
H = 20;
|
||||
union() {
|
||||
translate([0, 0, -15]) {
|
||||
cylinder(r = D / 2, h = H, center = true, $fn = FINE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module gnal_spindle_bottom_base ( HEX = false) {
|
||||
//for grip
|
||||
BUMP = 2; //diameter
|
||||
BUMPS = 6;
|
||||
|
@ -416,9 +496,7 @@ module gnal_spindle_bottom_base ( HEX = false) {
|
|||
TOP_OFFSET = -24.5;
|
||||
|
||||
union() {
|
||||
translate([0, 0, -15]) {
|
||||
cylinder(r = D / 2, h = H, center = true, $fn = FINE);
|
||||
}
|
||||
gnal_spindle_base();
|
||||
//hex version
|
||||
if (HEX) {
|
||||
translate([0, 0, TOP_OFFSET]) {
|
||||
|
@ -445,7 +523,13 @@ module outer_screw (LEN) {
|
|||
THREAD = 1.6;
|
||||
|
||||
difference () {
|
||||
translate([0, 0, -7.1]) metric_thread (diameter=OD, pitch=PITCH, thread_size = THREAD, length=LEN);
|
||||
translate([0, 0, -7.1]) {
|
||||
if (DEBUG) {
|
||||
cylinder(r = OD / 2, h = LEN);
|
||||
} else {
|
||||
metric_thread (diameter=OD, pitch=PITCH, thread_size = THREAD, length=LEN);
|
||||
}
|
||||
}
|
||||
//bevel top of screw
|
||||
translate([0, 0, LEN - 8]) difference() {
|
||||
cylinder(r = 8, h = 3, center = true, $fn = FINE);
|
||||
|
@ -466,12 +550,20 @@ module gnal_spindle_bottom (ALT = false, HEX = false) {
|
|||
gnal_spindle_bottom_base(HEX);
|
||||
//inner screw negative
|
||||
translate([0, 0, -30]) union() {
|
||||
if (DEBUG) {
|
||||
cylinder(r = OD / 2, h = IN_LEN);
|
||||
} else {
|
||||
metric_thread (diameter=OD, pitch=PITCH, thread_size = THREAD, length = IN_LEN);
|
||||
}
|
||||
translate([0, 0, 0.2]) {
|
||||
if (DEBUG) {
|
||||
cylinder(r = OD / 2, h = IN_LEN);
|
||||
} else {
|
||||
metric_thread (diameter=OD, pitch=PITCH, thread_size = THREAD, length = IN_LEN);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
difference () {
|
||||
//outer screw
|
||||
|
@ -480,8 +572,6 @@ module gnal_spindle_bottom (ALT = false, HEX = false) {
|
|||
} else {
|
||||
outer_screw(LEN);
|
||||
}
|
||||
//hollow center
|
||||
cylinder(r = 3.8 / 2, h = 100, center = true, $fn = 60);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -583,8 +673,12 @@ module gnal_spindle_top () {
|
|||
}
|
||||
//screw
|
||||
translate([0, 0, -37.5]) {
|
||||
if (DEBUG) {
|
||||
cylinder(r = 13.6 / 2, h = 21);
|
||||
} else {
|
||||
metric_thread (diameter=13.6, pitch = PITCH, thread_size = THREAD, length = 21);
|
||||
}
|
||||
}
|
||||
//cylinder plug
|
||||
translate([0, 0, -37.5 + (21 / 2) - 1]) {
|
||||
cylinder(r = 12 / 2, h = 21, center = true, $fn = FINE);
|
||||
|
@ -689,10 +783,47 @@ module gnal_spindle_single () {
|
|||
}
|
||||
//screw
|
||||
translate([0, 0, -37.5 - SINGLE_INSERT]) {
|
||||
if (DEBUG) {
|
||||
cylinder(r = SINGLE_THREAD_D / 2, h = 21);
|
||||
} else {
|
||||
metric_thread (diameter=SINGLE_THREAD_D, pitch = PITCH, thread_size = THREAD, length = 21);
|
||||
}
|
||||
}
|
||||
//cylinder plug
|
||||
translate([0, 0, -37.5 - SINGLE_INSERT + (21 / 2) - 1]) {
|
||||
cylinder(r = 10 / 2, h = 21, center = true, $fn = FINE);
|
||||
}
|
||||
}
|
||||
|
||||
module gnal_stacking_spindle () {
|
||||
OD = 10.5 + .3;
|
||||
IN_LEN = 21;
|
||||
|
||||
LEN = 17.1;
|
||||
ALT_LEN = 27.1;
|
||||
difference () {
|
||||
union () {
|
||||
gnal_spindle_base();
|
||||
translate([0, 0, -23.75]) gnal_spacer_solid();
|
||||
}
|
||||
//inner screw negative
|
||||
translate([0, 0, -30]) union() {
|
||||
if (DEBUG) {
|
||||
cylinder(r = OD / 2, h = IN_LEN);
|
||||
} else {
|
||||
metric_thread (diameter=OD, pitch=PITCH, thread_size = THREAD, length = IN_LEN);
|
||||
}
|
||||
translate([0, 0, 0.2]) {
|
||||
if (DEBUG) {
|
||||
cylinder(r = OD / 2, h = IN_LEN);
|
||||
} else {
|
||||
metric_thread (diameter=OD, pitch=PITCH, thread_size = THREAD, length = IN_LEN);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
difference () {
|
||||
outer_screw(LEN - 2);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,117 @@
|
|||
#!/usr/bin/env python
|
||||
|
||||
#
|
||||
# NopSCADlib Copyright Chris Palmer 2018
|
||||
# nop.head@gmail.com
|
||||
# hydraraptor.blogspot.com
|
||||
#
|
||||
# This file is part of NopSCADlib.
|
||||
#
|
||||
# NopSCADlib is free software: you can redistribute it and/or modify it under the terms of the
|
||||
# GNU General Public License as published by the Free Software Foundation, either version 3 of
|
||||
# the License, or (at your option) any later version.
|
||||
#
|
||||
# NopSCADlib is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
||||
# without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
# See the GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License along with NopSCADlib.
|
||||
# If not, see <https://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
#
|
||||
#! OpenSCAD produces randomly ordered STL files. This script re-orders them consistently so that GIT can tell if they have changed or not.
|
||||
#
|
||||
# OpenSCAD produces randomly ordered STL files so source control like GIT can't tell if they have changed or not.
|
||||
# This scrip orders each triangle to start with the lowest vertex first (comparing x, then y, then z)
|
||||
# It then sorts the triangles to start with the one with the lowest vertices first (comparing first vertex, second, then third)
|
||||
# This has no effect on the model but makes the STL consistent. I.e. it makes a canonical form.
|
||||
#
|
||||
|
||||
from __future__ import print_function
|
||||
|
||||
import sys
|
||||
|
||||
def cmz(x):
|
||||
''' Convert "-0" to "0". '''
|
||||
return '0' if x == '-0' else x
|
||||
|
||||
class Vertex:
|
||||
def __init__(self, x, y, z):
|
||||
self.x, self.y, self.z = x, y, z
|
||||
self.key = (float(x), float(y), float(z))
|
||||
|
||||
class Normal:
|
||||
def __init__(self, dx, dy, dz):
|
||||
self.dx, self.dy, self.dz = dx, dy, dz
|
||||
|
||||
class Facet:
|
||||
def __init__(self, normal, v1, v2, v3):
|
||||
self.normal = normal
|
||||
if v1.key < v2.key:
|
||||
if v1.key < v3.key:
|
||||
self.vertices = (v1, v2, v3) #v1 is the smallest
|
||||
else:
|
||||
self.vertices = (v3, v1, v2) #v3 is the smallest
|
||||
else:
|
||||
if v2.key < v3.key:
|
||||
self.vertices = (v2, v3, v1) #v2 is the smallest
|
||||
else:
|
||||
self.vertices = (v3, v1, v2) #v3 is the smallest
|
||||
|
||||
def key(self):
|
||||
return (self.vertices[0].x, self.vertices[0].y, self.vertices[0].z,
|
||||
self.vertices[1].x, self.vertices[1].y, self.vertices[1].z,
|
||||
self.vertices[2].x, self.vertices[2].y, self.vertices[2].z)
|
||||
|
||||
class STL:
|
||||
def __init__(self, fname):
|
||||
self.facets = []
|
||||
|
||||
with open(fname) as f:
|
||||
words = [cmz(s.strip()) for s in f.read().split()]
|
||||
|
||||
if words[0] == 'solid' and words[1] == 'OpenSCAD_Model':
|
||||
i = 2
|
||||
while words[i] == 'facet':
|
||||
norm = Normal(words[i + 2], words[i + 3], words[i + 4])
|
||||
v1 = Vertex(words[i + 8], words[i + 9], words[i + 10])
|
||||
v2 = Vertex(words[i + 12], words[i + 13], words[i + 14])
|
||||
v3 = Vertex(words[i + 16], words[i + 17], words[i + 18])
|
||||
i += 21
|
||||
self.facets.append(Facet(norm, v1, v2, v3))
|
||||
|
||||
self.facets.sort(key = Facet.key)
|
||||
else:
|
||||
print("Not an OpenSCAD ascii STL file")
|
||||
sys.exit(1)
|
||||
|
||||
def write(self, fname):
|
||||
mins = [float('inf'), float('inf'), float('inf')]
|
||||
maxs = [float('-inf'), float('-inf'), float('-inf')]
|
||||
with open(fname,"wt") as f:
|
||||
print('solid OpenSCAD_Model', file=f)
|
||||
for facet in self.facets:
|
||||
print(' facet normal %s %s %s' % (facet.normal.dx, facet.normal.dy, facet.normal.dz), file=f)
|
||||
print(' outer loop', file=f)
|
||||
for vertex in facet.vertices:
|
||||
print(' vertex %s %s %s' % (vertex.x, vertex.y, vertex.z), file=f)
|
||||
for i in range(3):
|
||||
ordinate = vertex.key[i]
|
||||
if ordinate > maxs[i]: maxs[i] = ordinate
|
||||
if ordinate < mins[i]: mins[i] = ordinate
|
||||
print(' endloop', file=f)
|
||||
print(' endfacet', file=f)
|
||||
print('endsolid OpenSCAD_Model', file=f)
|
||||
return mins, maxs
|
||||
|
||||
def canonicalise(fname):
|
||||
stl = STL(fname)
|
||||
return stl.write(fname)
|
||||
|
||||
if __name__ == '__main__':
|
||||
if len(sys.argv) == 2:
|
||||
canonicalise(sys.argv[1])
|
||||
else:
|
||||
print("\nusage:\n\t c14n_stl file - Canonicalise an STL file created by OpenSCAD.")
|
||||
sys.exit(1)
|
|
@ -0,0 +1,43 @@
|
|||
#!/Applications/FreeCAD.app/Contents/Resources/bin/python
|
||||
|
||||
# FROM https://forum.freecadweb.org/viewtopic.php?p=341824&sid=58456759bd632dffcf09baeeb397dcb6#p341824
|
||||
|
||||
import sys
|
||||
import os
|
||||
|
||||
if not len(sys.argv) == 3:
|
||||
print("Usage: %s file.csg file.step" % sys.argv[0])
|
||||
sys.exit(1)
|
||||
|
||||
file_input = sys.argv[1]
|
||||
file_output = sys.argv[2]
|
||||
|
||||
print("Converting %s to %s" % (file_input, file_output))
|
||||
|
||||
sys.path.append("/Applications/FreeCAD.app/Contents/Resources/lib")
|
||||
import FreeCAD
|
||||
import importCSG
|
||||
import Part
|
||||
|
||||
d = importCSG.open(file_input)
|
||||
|
||||
o = []
|
||||
|
||||
# Select parent node
|
||||
for i in d.Objects:
|
||||
if not i.InList:
|
||||
o.append(i)
|
||||
print(len(o))
|
||||
quit()
|
||||
# Perform the Fusion
|
||||
App.activeDocument().addObject("Part::MultiFuse", "Fusion")
|
||||
App.activeDocument().Fusion.Shapes = o
|
||||
App.ActiveDocument.recompute()
|
||||
|
||||
# Then the Refine
|
||||
#App.ActiveDocument.addObject('Part::Feature','Refine').Shape=App.ActiveDocument.Fusion.Shape.removeSplitter()
|
||||
#App.ActiveDocument.recompute()
|
||||
|
||||
# Export as STEP
|
||||
#Part.export([App.ActiveDocument.Refine], file_output)
|
||||
Part.export([App.ActiveDocument.Fusion.Shape], file_output)
|
|
@ -12,6 +12,8 @@ DEPS=(
|
|||
sqlite3
|
||||
admesh
|
||||
openscad
|
||||
bc
|
||||
python3
|
||||
)
|
||||
|
||||
for dep in ${DEPS[@]}; do
|
||||
|
@ -23,7 +25,9 @@ for dep in ${DEPS[@]}; do
|
|||
echo "For more information about how to install admesh https://github.com/admesh/admesh"
|
||||
echo "OR https://www.howtoinstall.me/ubuntu/18-04/admesh/"
|
||||
fi
|
||||
echo "Individual .scad files can be compiled directly without this script"
|
||||
if [[ "${dep}" == "openscad" ]]; then
|
||||
echo "Individual .scad files can be compiled directly without this application"
|
||||
fi
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
|
|
105
scripts/v3.sh
|
@ -1,6 +1,8 @@
|
|||
#!/bin/bash
|
||||
V="v3"
|
||||
|
||||
# Commit changes before running this build script
|
||||
|
||||
echo "Rendering GNAL ${V}"
|
||||
|
||||
bash ./scripts/deps.sh
|
||||
|
@ -12,7 +14,8 @@ DIST=./stl
|
|||
CSG=./csg
|
||||
IMG=./img
|
||||
NOTES=./notes/${V}.csv
|
||||
STEP=true
|
||||
DB="./notes/renders.sqlite"
|
||||
STEP=false
|
||||
LOGGING=true
|
||||
|
||||
#"quarter_a" "quarter_b" "quarter_c" "quarter_d"
|
||||
|
@ -22,8 +25,10 @@ FILES=(
|
|||
"spindle_bottom"
|
||||
"spindle_top"
|
||||
"spindle_single"
|
||||
"spindle_stacking"
|
||||
"insert_s8"
|
||||
"insert_16"
|
||||
"spacer"
|
||||
"spacer_16"
|
||||
"insert_single"
|
||||
"top"
|
||||
|
@ -31,12 +36,21 @@ FILES=(
|
|||
)
|
||||
SIZES=( "50ft" "100ft" )
|
||||
|
||||
|
||||
mkdir -p "${DIST}"
|
||||
|
||||
if [ $STEP = true ]; then
|
||||
mkdir -p "${CSG}"
|
||||
mkdir -p "${CSG}/${SIZE}_${V}/"
|
||||
fi
|
||||
|
||||
if [[ ! -f "${DB}" ]]; then
|
||||
cat "./notes/setup.sql" | sqlite3 "${DB}"
|
||||
fi
|
||||
|
||||
db () {
|
||||
sqlite3 "${DB}" "${1}"
|
||||
}
|
||||
|
||||
render_part () {
|
||||
scad="${1}"
|
||||
SIZE="${2}"
|
||||
|
@ -49,9 +63,9 @@ render_part () {
|
|||
|
||||
start=`date +%s`
|
||||
if [[ "${SIZE}" == "100ft" ]]; then
|
||||
openscad --csglimit=2000000 -o "$stl" -D "PART=\"${FILE}\"" -D "FN=800" "${scad}"
|
||||
openscad --enable manifold --csglimit=20000000 -o "$stl" -D "PART=\"${FILE}\"" -D "FN=800" -D "DEBUG=false" "${scad}"
|
||||
else
|
||||
openscad --csglimit=1000000 -o "$stl" -D "PART=\"${FILE}\"" -D "FN=600" "${scad}"
|
||||
openscad --enable manifold --csglimit=20000000 -o "$stl" -D "PART=\"${FILE}\"" -D "FN=600" -D "DEBUG=false" "${scad}"
|
||||
fi
|
||||
|
||||
end=`date +%s`
|
||||
|
@ -61,11 +75,16 @@ render_part () {
|
|||
fileSize=`echo $fileSize | xargs`
|
||||
|
||||
if ! [ -x "$(command -v admesh)" ]; then
|
||||
facets="N/A"
|
||||
volume="N/A"
|
||||
facets="-1"
|
||||
volume="-1"
|
||||
X="-1"
|
||||
Y="-1"
|
||||
Z="-1"
|
||||
else
|
||||
firstline=`head -n 1 "$stl"`
|
||||
if [[ $firstline == solid* ]]; then
|
||||
#order stl file if ascii
|
||||
python3 scripts/c14n_stl.py "$stl"
|
||||
#convert from ascii to binary
|
||||
tmpBinary=`mktemp`
|
||||
admesh -c -b "$tmpBinary" "$stl"
|
||||
|
@ -85,25 +104,82 @@ render_part () {
|
|||
ao=`admesh -c "$stl"`
|
||||
facets=`echo "$ao" | grep "Number of facets" | awk '{print $5}'`
|
||||
volume=`echo "$ao" | grep "Number of parts" | awk '{print $8}'`
|
||||
|
||||
minX=`echo "$ao" | grep "Min X" | awk '{print $4}'`
|
||||
minX=`echo "${minX//,/}"`
|
||||
maxX=`echo "$ao" | grep "Min X" | awk '{print $8}'`
|
||||
minY=`echo "$ao" | grep "Min Y" | awk '{print $4}'`
|
||||
minY=`echo "${minY//,/}"`
|
||||
maxY=`echo "$ao" | grep "Min Y" | awk '{print $8}'`
|
||||
minZ=`echo "$ao" | grep "Min Z" | awk '{print $4}'`
|
||||
minZ=`echo "${minZ//,/}"`
|
||||
maxZ=`echo "$ao" | grep "Min Z" | awk '{print $8}'`
|
||||
X=`echo "scale=5;($maxX)-($minX)" | bc`
|
||||
Y=`echo "scale=5;($maxY)-($minY)" | bc`
|
||||
Z=`echo "scale=5;($maxZ)-($minZ)" | bc`
|
||||
fi
|
||||
|
||||
hash=`sha256sum "$stl" | awk '{ print $1 }'`
|
||||
commit=`git rev-parse --short HEAD`
|
||||
|
||||
if [ ${LOGGING} = true ]; then
|
||||
line="${VERSION},${CPU},$stl,$hash,$fileSize,$srchash,$srcsize,$facets,$volume,$runtime"
|
||||
line="${VERSION},${CPU},$stl,$hash,$fileSize,$srchash,$srcsize,$facets,$volume,$runtime,$commit"
|
||||
echo "$line" >> $NOTES
|
||||
echo "$line"
|
||||
fi
|
||||
|
||||
TIME=`date '+%s'`
|
||||
QUERY="INSERT OR IGNORE INTO renders ( \
|
||||
time, \
|
||||
commit_id, \
|
||||
source, \
|
||||
model, \
|
||||
stl, \
|
||||
stl_size, \
|
||||
facets, \
|
||||
volume, \
|
||||
x, \
|
||||
y, \
|
||||
z, \
|
||||
render_time, \
|
||||
source_hash, \
|
||||
stl_hash, \
|
||||
openscad, \
|
||||
cpu \
|
||||
) \
|
||||
VALUES ( \
|
||||
$TIME, \
|
||||
'$commit', \
|
||||
'$scad', \
|
||||
'$FILE', \
|
||||
'$stl', \
|
||||
$fileSize, \
|
||||
$facets, \
|
||||
$volume, \
|
||||
$X, \
|
||||
$Y, \
|
||||
$Z, \
|
||||
$runtime, \
|
||||
'$srchash', \
|
||||
'$hash', \
|
||||
'$VERSION', \
|
||||
'$CPU' \
|
||||
)"
|
||||
#echo -n "${QUERY}"
|
||||
db "${QUERY}"
|
||||
|
||||
if [ ${STEP} = true ] && [[ "${FILE}" == "spiral" ]]; then
|
||||
mkdir -p "${CSG}/${SIZE}_${V}/"
|
||||
start=`date +%s`
|
||||
if [[ "${SIZE}" == "100ft" ]]; then
|
||||
openscad --csglimit=20000000 -o "$csg" -D "PART=\"${FILE}\"" -D "FN=800" "${scad}"
|
||||
openscad --csglimit=20000000 -o "$csg" -D "PART=\"${FILE}\"" -D "FN=800" -D "DEBUG=false" "${scad}"
|
||||
else
|
||||
openscad --csglimit=10000000 -o "$csg" -D "PART=\"${FILE}\"" -D "FN=600" "${scad}"
|
||||
openscad --csglimit=20000000 -o "$csg" -D "PART=\"${FILE}\"" -D "FN=600" -D "DEBUG=false" "${scad}"
|
||||
fi
|
||||
|
||||
end=`date +%s`
|
||||
runtime=$((end-start))
|
||||
echo "Compiling CSG took ${runtime}sec"
|
||||
fi
|
||||
|
||||
echo "Rendering image of ${stl}..."
|
||||
|
||||
|
@ -112,9 +188,9 @@ render_part () {
|
|||
fullPath=`realpath "${stl}"`
|
||||
data="import(\"${fullPath}\");"
|
||||
echo data > "${tmp}.scad"
|
||||
openscad -o "$png" --imgsize=2048,2048 --colorscheme=DeepOcean "${tmp}.scad"
|
||||
openscad -o "$png" --csglimit=20000000 --imgsize=2048,2048 --colorscheme=DeepOcean "${tmp}.scad"
|
||||
else
|
||||
openscad -o "$png" --imgsize=2048,2048 --colorscheme=DeepOcean -D "PART=\"${FILE}\"" "${scad}"
|
||||
openscad -o "$png" --csglimit=20000000 --imgsize=2048,2048 --colorscheme=DeepOcean -D "DEBUG=false" -D "PART=\"${FILE}\"" "${scad}"
|
||||
fi
|
||||
}
|
||||
|
||||
|
@ -122,6 +198,9 @@ if [[ "${1}" != "" ]]; then
|
|||
LOGGING=false
|
||||
SIZE="${1}"
|
||||
scad="./scad/${SIZE}_${V}/gnal_${SIZE}.scad"
|
||||
srchash=`sha256sum "${scad}" | awk '{ print $1 }'`
|
||||
srcsize=`wc -c < "${scad}"`
|
||||
srcsize=`echo $srcsize | xargs`
|
||||
|
||||
mkdir -p "${DIST}/${SIZE}_${V}"
|
||||
if [[ "${2}" != "" ]]; then
|
||||
|
@ -135,7 +214,7 @@ if [[ "${1}" != "" ]]; then
|
|||
exit 0
|
||||
fi
|
||||
|
||||
echo "version,cpu,file,file_hash,file_size,source_hash,source_size,facets,volume,render_time" > $NOTES
|
||||
echo "openscad,cpu,stl,stl_hash,stl_size,source_hash,source_size,facets,volume,render_time,commit" > $NOTES
|
||||
|
||||
for SIZE in "${SIZES[@]}"
|
||||
do
|
||||
|
|