Compare commits

...

34 Commits

Author SHA1 Message Date
mmcwilliams fa1bf6d8a1 Merge branch 'stacking' of ssh://git.sixteenmillimeter.com/16mm/GNAL into stacking 2023-04-07 11:08:38 -04:00
mmcwilliams 70c0c54f13 Merge branch 'master' into stacking 2023-01-16 22:01:50 -05:00
mmcwilliams 4384251026 Add python3 to deps 2023-01-16 22:01:26 -05:00
mmcwilliams 54f16a864a Add build step which orders stl if ascii 2023-01-16 21:58:57 -05:00
mmcwilliams bc5789018e Add script which orders STL 2023-01-16 21:55:26 -05:00
Matt McWilliams 4c24489e8f Add reference to the tank by James Harter 2021-12-13 23:13:34 -05:00
Matt McWilliams 84764e26e6 Correct echo statement language 2021-12-13 19:44:25 -05:00
Matt McWilliams 72aff30b11 Update the language in the deps.sh script 2021-12-13 15:50:54 -05:00
Matt McWilliams 7e4f6dd476 Fix attribution 2021-11-07 20:45:40 -05:00
Matt McWilliams a54583ff12 Merge branch 'main' into stacking 2021-11-07 20:17:30 -05:00
Matt McWilliams 8a3300fab6 Add release notes to the Readme 2021-11-07 20:10:53 -05:00
Matt McWilliams 08bc7d16b6 All render notes with updated CSV header.
All 100ft objects re-rendered with new lib.
tar.gz process is still broken
2021-11-07 00:17:23 -04:00
Matt McWilliams 9eb3bd0ae2 Create a table for tracking individual changes in a more granular way than the notes, which track changes for release 2021-11-07 00:08:32 -04:00
Matt McWilliams 9d9e5e260f Rendered spindles that were causing issues 2021-11-06 13:02:07 -04:00
Matt McWilliams a3d2727261 Fixed script to allow it to render spindle bottom 2021-11-06 13:01:44 -04:00
Matt McWilliams cdc80b3c93 Rendered 50ft models with updated measurements and scripts. 2021-11-06 12:22:48 -04:00
Matt McWilliams 479a2466a2 Resize inserts to have a slightly looser fit. Issue currently is that they are too tight and difficult to remove. 2021-11-03 18:21:36 -04:00
Matt McWilliams 473d8e99ca Don't print camera position (only needed in gui) 2021-11-03 18:20:41 -04:00
Matt McWilliams 29b40d4fb6 Notes on debugging the stacking spacer 2021-11-03 18:20:11 -04:00
Matt McWilliams 1af2b43d36 Begin grouping variables for refactor 2021-11-03 17:23:12 -04:00
Matt McWilliams 62b0cae3bd Add stacking spindle to render script 2021-11-03 17:20:03 -04:00
Matt McWilliams 5e09bd394b Move stacking spindle design to shared library 2021-11-03 17:05:37 -04:00
Matt McWilliams 61a990ad0c Merge remote-tracking branch 'origin/master' into stacking 2021-10-22 14:35:44 -04:00
mmcwilliams cb73a66c29 Python script to (hopefully) automatically convert .csg files to .step 2021-10-22 00:48:41 -04:00
Matt McWilliams 88446c4d28 Create the csg dir at the correct place in render_part 2021-10-18 14:15:01 -04:00
Matt McWilliams 9e267517d5 Reinforce 100ft outer spiral 2021-10-18 13:23:48 -04:00
Matt McWilliams 8c106c3d42 Force DEBUG variable to false when rendering with this script 2021-10-18 13:07:19 -04:00
Matt McWilliams f4fbdbe614 Add a spiral reinforcement for the outside spiral. 2021-10-18 12:25:55 -04:00
Matt McWilliams aa520c3a2c Re-add spacer to build script 2021-10-15 12:32:31 -04:00
Matt McWilliams 9e2d4e4cd7 Remove commented out code 2021-10-15 12:27:22 -04:00
Matt McWilliams 814fe80e50 Accidentally removed the gnal_spacer() module in what can only be called an "over optimization" of the code while refactoring at 2AM. 2021-10-15 12:26:58 -04:00
Matt McWilliams dfa22adc8c What tank? Don't worry about it. 2021-10-15 12:21:50 -04:00
Matt McWilliams c1ae9a9d7d Only build step files and prerequisites for the spiral and only when STEP is true 2021-10-15 12:13:08 -04:00
Matt McWilliams ba2b701a7a Created a new branch to explore creating a method of stacking 4 or more spirals. In theory. Potentially.
First attempt misused the single spiral diameter thread. The number of parts means two things: improve the documentation and potentially add identifying features to the different parts.
2021-10-15 12:12:36 -04:00
54 changed files with 631 additions and 86 deletions

3
.gitignore vendored
View File

@ -2,4 +2,5 @@
benchmark
releases
stl/*/*.txt
csg/*
csg/*
notes/renders.sqlite

View File

@ -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:

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 73 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 62 KiB

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

After

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 132 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 88 KiB

After

Width:  |  Height:  |  Size: 136 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 77 KiB

After

Width:  |  Height:  |  Size: 144 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 73 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 62 KiB

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

After

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 132 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 88 KiB

After

Width:  |  Height:  |  Size: 136 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 KiB

After

Width:  |  Height:  |  Size: 118 KiB

18
notes/setup.sql Normal file
View File

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

99
notes/stacking_debug.scad Normal file
View File

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

View File

@ -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

1 version openscad cpu file stl file_hash stl_hash file_size stl_size source_hash source_size facets volume render_time commit
2 2020.08.18 2021.01 Intel(R) Core(TM) i7-4770HQ CPU @ 2.20GHz AMD Ryzen 7 3700X 8-Core Processor ./stl/50ft_v3/gnal_50ft_spindle_bottom.stl ./stl/50ft_v3/gnal_50ft_spindle_bottom.stl 06424e6ddf76a857fc3b9bc5e5346e74c04ce48eabcbb80b94676b3088277ef6 acb87696d7018c4075fe7a5b805c2b4b9f9461bb00b8cc13f1311a59bcc5911e 3760384 3748384 09f2e406d8a1ba16229d89fcb1aa36e635dcd185811b98e41224cb7bbf72f315 fa01c1fcd2f664dc525042ccdea21ac0a0cb12a28f03260c0426b587a0368c43 8420 8328 75206 74966 4134.077637 4303.875977 1291 264 9d9e5e2
3 2020.08.18 2021.01 Intel(R) Core(TM) i7-4770HQ CPU @ 2.20GHz AMD Ryzen 7 3700X 8-Core Processor ./stl/50ft_v3/gnal_50ft_spindle_top.stl ./stl/50ft_v3/gnal_50ft_spindle_top.stl be80982ec5cdad509266021300fcd7519981092e0fcc45f8180b342b10446e8b b5d22abdd6bfc86aaf7abf03e1bc4f44f32997cd498a859ef72d9791d4c6c809 6915384 6918984 09f2e406d8a1ba16229d89fcb1aa36e635dcd185811b98e41224cb7bbf72f315 fa01c1fcd2f664dc525042ccdea21ac0a0cb12a28f03260c0426b587a0368c43 8420 8328 138306 138378 22229.814453 22225.964844 1128 319 9d9e5e2
4 2020.08.18 2021.01 Intel(R) Core(TM) i7-4770HQ CPU @ 2.20GHz AMD Ryzen 7 3700X 8-Core Processor ./stl/50ft_v3/gnal_50ft_spacer.stl ./stl/50ft_v3/gnal_50ft_spindle_single.stl 227b24571911a243312d4945dfbe020cf1dedee17b745f37ae6aa5d4ff4dfda6 73456df963eac39ca5fd60cae7098ef85d0555e478e7111c50a0da11233b868e 286884 5963084 09f2e406d8a1ba16229d89fcb1aa36e635dcd185811b98e41224cb7bbf72f315 fa01c1fcd2f664dc525042ccdea21ac0a0cb12a28f03260c0426b587a0368c43 8420 8328 5736 119260 2888.150635 26349.712891 62 306 9d9e5e2
5 2020.08.18 2021.01 Intel(R) Core(TM) i7-4770HQ CPU @ 2.20GHz AMD Ryzen 7 3700X 8-Core Processor ./stl/50ft_v3/gnal_50ft_top.stl ./stl/50ft_v3/gnal_50ft_spindle_stacking.stl 7bdad60d3f656d2a6f596f91265c9ff646b70980fa21017d4d9dc4039efefc09 4d80c9798ac9877230e2de70ea5b95f066fe1a294d11d220feae0ef6fec94889 1104884 2968184 09f2e406d8a1ba16229d89fcb1aa36e635dcd185811b98e41224cb7bbf72f315 fa01c1fcd2f664dc525042ccdea21ac0a0cb12a28f03260c0426b587a0368c43 8420 8328 22096 59362 57933.800781 8448.288086 585 206 9d9e5e2
6 2020.08.18 2021.01 Intel(R) Core(TM) i7-4770HQ CPU @ 2.20GHz AMD Ryzen 7 3700X 8-Core Processor ./stl/50ft_v3/gnal_50ft_spiral.stl ./stl/50ft_v3/gnal_50ft_insert_s8.stl f97986b3f90f765e5510b3a10940203e16fc1fe2300ea04e5977c538ac4325d3 a2dd82c2fe9a9f66ed1b9ef98ab008314eadd50d3f109e7a00e097dd33dd8ced 9500384 1361584 09f2e406d8a1ba16229d89fcb1aa36e635dcd185811b98e41224cb7bbf72f315 fa01c1fcd2f664dc525042ccdea21ac0a0cb12a28f03260c0426b587a0368c43 8420 8328 190006 27230 171712.140625 3286.772461 1111 55 9d9e5e2
7 2020.08.18 2021.01 Intel(R) Core(TM) i7-4770HQ CPU @ 2.20GHz AMD Ryzen 7 3700X 8-Core Processor ./stl/50ft_v3/gnal_50ft_insert_s8.stl ./stl/50ft_v3/gnal_50ft_insert_16.stl 8803f73172ec6aa44f70b389210bc55bd7541a9d76924bd3ea056a5615986592 011ce17a4c083d226bb131a92962d831ebf280fb923a32c19e5d39ffa82d2fbb 1361584 2071384 09f2e406d8a1ba16229d89fcb1aa36e635dcd185811b98e41224cb7bbf72f315 fa01c1fcd2f664dc525042ccdea21ac0a0cb12a28f03260c0426b587a0368c43 8420 8328 27230 41426 3493.544922 4355.436523 276 91 9d9e5e2
8 2020.08.18 2021.01 Intel(R) Core(TM) i7-4770HQ CPU @ 2.20GHz AMD Ryzen 7 3700X 8-Core Processor ./stl/50ft_v3/gnal_50ft_insert_16.stl ./stl/50ft_v3/gnal_50ft_spacer.stl ed6a80eac3b2c82dc3be22130f1d0fe6e44c37016b27522a95a5f268c23c83be f22165803ac56a1bec0b9efbb3615c10256850ea19f6d28cfc16ffb8894e9cd8 2071384 286884 09f2e406d8a1ba16229d89fcb1aa36e635dcd185811b98e41224cb7bbf72f315 fa01c1fcd2f664dc525042ccdea21ac0a0cb12a28f03260c0426b587a0368c43 8420 8328 41426 5736 4665.019531 2888.156250 439 14 9d9e5e2
9 2020.08.18 2021.01 Intel(R) Core(TM) i7-4770HQ CPU @ 2.20GHz AMD Ryzen 7 3700X 8-Core Processor ./stl/50ft_v3/gnal_50ft_spacer_16.stl ./stl/50ft_v3/gnal_50ft_spacer_16.stl d9b8c412792f6b6d3b9817fc7f8e0f1b431202844374f44800da97caad3b15e8 43b1ea67592d6d68e0c1e2e0c3d73e8414c4771126245a4c85b72ba98409878a 602084 605284 09f2e406d8a1ba16229d89fcb1aa36e635dcd185811b98e41224cb7bbf72f315 fa01c1fcd2f664dc525042ccdea21ac0a0cb12a28f03260c0426b587a0368c43 8420 8328 12040 12104 4019.470703 3951.205566 281 52 9d9e5e2
10 2020.08.18 2021.01 Intel(R) Core(TM) i7-4770HQ CPU @ 2.20GHz AMD Ryzen 7 3700X 8-Core Processor ./stl/100ft_v3/gnal_100ft_spindle_bottom.stl ./stl/50ft_v3/gnal_50ft_insert_single.stl df189c1345ab5da921857fb837a3814bbfdc9fd9da8eb5bbaf6cf63c2347859e 8e71d04042e1e41bdb88e991871ca63cf97cd2213c719bbedc1d18be4c755eb1 3760384 1362184 a435a7d28947374c724e7618466d7f38d4fb5eb1f5bbaacb9061ef58dab3f8e2 fa01c1fcd2f664dc525042ccdea21ac0a0cb12a28f03260c0426b587a0368c43 11728 8328 75206 27242 4134.064941 2946.449707 1275 98 9d9e5e2
11 2020.08.18 2021.01 Intel(R) Core(TM) i7-4770HQ CPU @ 2.20GHz AMD Ryzen 7 3700X 8-Core Processor ./stl/100ft_v3/gnal_100ft_spindle_top.stl ./stl/50ft_v3/gnal_50ft_top.stl bad92e882e26ee489d7625e65f40c035b6e7c632473f3db6d0b3633eab9d8411 570de760a862220ba22e88625196e0ddda74976950889998c327232c7fde3638 6979184 1104884 a435a7d28947374c724e7618466d7f38d4fb5eb1f5bbaacb9061ef58dab3f8e2 fa01c1fcd2f664dc525042ccdea21ac0a0cb12a28f03260c0426b587a0368c43 11728 8328 139582 22096 22229.773438 57933.875000 1139 109 9d9e5e2
12 2020.08.18 2021.01 Intel(R) Core(TM) i7-4770HQ CPU @ 2.20GHz AMD Ryzen 7 3700X 8-Core Processor ./stl/100ft_v3/gnal_100ft_spacer.stl ./stl/50ft_v3/gnal_50ft_spiral.stl dda2654f9209e8b17515f42cd7602d59b542630469b1f848442665a6ce2b2158 9f0990ad3bcecb3e7eb706e79da5f1e802ecf867198c8cb53c3a3979565b43ae 286884 9493184 a435a7d28947374c724e7618466d7f38d4fb5eb1f5bbaacb9061ef58dab3f8e2 fa01c1fcd2f664dc525042ccdea21ac0a0cb12a28f03260c0426b587a0368c43 11728 8328 5736 189862 2888.143555 172539.781250 63 836 9d9e5e2
13 2020.08.18 2021.01 Intel(R) Core(TM) i7-4770HQ CPU @ 2.20GHz AMD Ryzen 7 3700X 8-Core Processor ./stl/100ft_v3/gnal_100ft_top.stl ./stl/100ft_v3/gnal_100ft_spindle_bottom.stl bc39a67711877624917866f3ce80e4164c165969f52cf0e34b7e7fb65b0b1565 5218e3383e46b13bdeadc2166531c11d2aea4eafb8e4c7346e9a5e6536fc9805 1620084 3748384 a435a7d28947374c724e7618466d7f38d4fb5eb1f5bbaacb9061ef58dab3f8e2 f6079933217206a4c314ba11d758a35f002be4442ef54928c7f443e9bd4c0fce 11728 10795 32400 74966 102557.437500 4303.873535 998 270 9d9e5e2
14 2020.08.18 2021.01 Intel(R) Core(TM) i7-4770HQ CPU @ 2.20GHz AMD Ryzen 7 3700X 8-Core Processor ./stl/100ft_v3/gnal_100ft_spiral.stl ./stl/100ft_v3/gnal_100ft_spindle_top.stl bf12d37e85d88a3d9aeccbf2e0661e9bb8aae7a919dbc9a065c7919b0e0321c3 8dbd307cf5aaec9099e901909fdc6472dd7e0fc487b890be00443c99790776a7 18364384 6982784 a435a7d28947374c724e7618466d7f38d4fb5eb1f5bbaacb9061ef58dab3f8e2 f6079933217206a4c314ba11d758a35f002be4442ef54928c7f443e9bd4c0fce 11728 10795 367286 139654 326573.812500 22226.011719 3746 334 9d9e5e2
15 2020.08.18 2021.01 Intel(R) Core(TM) i7-4770HQ CPU @ 2.20GHz AMD Ryzen 7 3700X 8-Core Processor ./stl/100ft_v3/gnal_100ft_insert_s8.stl ./stl/100ft_v3/gnal_100ft_spindle_single.stl 64e954bbe40e104e7a3fc571420ea71841e752c443b2f3bbc54b7a7f316bdc02 af5245e9b1f4aee95ef73d88fca51e9b2036f71a587f55853742bde7b19e22a3 1361584 6026884 a435a7d28947374c724e7618466d7f38d4fb5eb1f5bbaacb9061ef58dab3f8e2 f6079933217206a4c314ba11d758a35f002be4442ef54928c7f443e9bd4c0fce 11728 10795 27230 120536 3493.548340 26350.066406 272 328 9d9e5e2
16 2020.08.18 2021.01 Intel(R) Core(TM) i7-4770HQ CPU @ 2.20GHz AMD Ryzen 7 3700X 8-Core Processor ./stl/100ft_v3/gnal_100ft_insert_16.stl ./stl/100ft_v3/gnal_100ft_spindle_stacking.stl 3a0474be55afc9fd8217149dddd474530e8259e217d9a861d39f7e933b5da741 1b440745d0c251fb2986f63b15de196a958d5726088a660c4ae0e92da11706a9 2071384 2968184 a435a7d28947374c724e7618466d7f38d4fb5eb1f5bbaacb9061ef58dab3f8e2 f6079933217206a4c314ba11d758a35f002be4442ef54928c7f443e9bd4c0fce 11728 10795 41426 59362 4664.790527 8448.282227 450 203 9d9e5e2
17 2020.08.18 2021.01 Intel(R) Core(TM) i7-4770HQ CPU @ 2.20GHz AMD Ryzen 7 3700X 8-Core Processor ./stl/100ft_v3/gnal_100ft_spacer_16.stl ./stl/100ft_v3/gnal_100ft_insert_s8.stl b6272b501d6c4dcd86369c9a9b21b355f941fbaf60abca9f88c43a22ddbc443b d53020825b2abadcab80e5a256af23b5ae4faa7c207268c6bcecf742be1d73b4 755684 1361584 a435a7d28947374c724e7618466d7f38d4fb5eb1f5bbaacb9061ef58dab3f8e2 f6079933217206a4c314ba11d758a35f002be4442ef54928c7f443e9bd4c0fce 11728 10795 15112 27230 4019.479248 3286.773926 368 56 9d9e5e2
18 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
19 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
20 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
21 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
22 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
23 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

View File

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

View File

@ -3,6 +3,8 @@
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;
@ -180,14 +182,17 @@ module gnal_50ft_top () {
}
}
FN = 200;
$fn = FN;
module film_guide (rotations = 40, id = 45.55 - .5, spacing = 2.075, bottom = -2) {
spiral(rotations, id, spacing, bottom, $fn);
//reinforce outer spiral
difference () {
spiral_reinforcement(208.9, spacing, -0.1, $fn);
translate([107.35, 6, 0]) cube([5, 15, 10], center = true);
}
}
PART="quarter_a";
PART="spiral";
if (PART == "spiral") {
gnal_50ft_spiral();
@ -203,20 +208,22 @@ 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 == "spiral_test") {
difference () {
gnal_50ft_spiral();
@ -224,3 +231,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);
*/

View File

@ -17,6 +17,7 @@ include <./Triangles.scad>;
*
*/
DEBUG = false;
FINE = 200;
OD = 10 + .5;
@ -80,6 +81,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 +236,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 +264,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 +308,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 +331,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 +358,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 +405,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,28 +448,21 @@ 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);
cylinder(r = void_d / 2, h = h + 1, center = true, $fn = 200);
}
translate([0, 0, -.75]) rotate([0, 180, 0]) spacer_outer_ridges();
}
difference () {
gnal_spacer_solid();
cylinder(r = void_d / 2, h = h + 1, center = true, $fn = 200);
}
translate([0, 0, 0]) {
for (i = [0: RIDGES - 1]) {
@ -405,9 +475,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 +494,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 +521,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,10 +548,18 @@ module gnal_spindle_bottom (ALT = false, HEX = false) {
gnal_spindle_bottom_base(HEX);
//inner screw negative
translate([0, 0, -30]) union() {
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);
}
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);
}
}
}
}
@ -480,8 +570,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,7 +671,11 @@ module gnal_spindle_top () {
}
//screw
translate([0, 0, -37.5]) {
metric_thread (diameter=13.6, pitch = PITCH, thread_size = THREAD, length = 21);
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]) {
@ -689,10 +781,47 @@ module gnal_spindle_single () {
}
//screw
translate([0, 0, -37.5 - SINGLE_INSERT]) {
metric_thread (diameter=SINGLE_THREAD_D, pitch = PITCH, thread_size = THREAD, length = 21);
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);
}
}

117
scripts/c14n_stl.py Normal file
View File

@ -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)

43
scripts/csg2step.py Executable file
View File

@ -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)

View File

@ -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

View File

@ -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"
@ -21,9 +24,11 @@ LOGGING=true
FILES=(
"spindle_bottom"
"spindle_top"
"spindle_single"
"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 --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 --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
start=`date +%s`
if [[ "${SIZE}" == "100ft" ]]; then
openscad --csglimit=20000000 -o "$csg" -D "PART=\"${FILE}\"" -D "FN=800" "${scad}"
else
openscad --csglimit=10000000 -o "$csg" -D "PART=\"${FILE}\"" -D "FN=600" "${scad}"
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" -D "DEBUG=false" "${scad}"
else
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
end=`date +%s`
runtime=$((end-start))
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

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.