creepy-hand: simple hack to split a creepy hand in two
[clinton/3d-models.git] / acorn / acorn-threads.scad
CommitLineData
28ef71df
CE
1// Threads for acorn model
2// Copyright (c) 2017 Clinton Ebadi <clinton@unknownlamer.org>
3
0cbf5490 4use <screw_threads.scad> // http://www.thingiverse.com/thing:1686322
28ef71df 5
244fc8f0 6AUTO_CALCULATE = -1;
28ef71df 7
5d6b539a
CE
8acorn_parts = [ "body", "cap", "gasket" ];
9
0cbf5490
CE
10internal_thread_tolerance = 0.3;
11external_thread_tolerance = 0.2;
12thread_angle = 50;
28ef71df 13
5d6b539a
CE
14
15function contains (x, lst) = len([ for (i = lst) if (x == i) i]) > 0;
16
b097fbc1
CE
17// dome module from https://github.com/Sembiance/common/blob/master/openscad/dome.scad, Public Domain
18module dome(d=5, h=2, hollow=false, wallWidth=0.5) {
19 sphereRadius = (pow(h, 2) + pow((d/2), 2) ) / (2*h);
20 translate([0, 0, (sphereRadius-h)*-1]) {
21 difference() {
22 sphere(sphereRadius);
23 translate([0, 0, -h]) cube([2*sphereRadius, 2*sphereRadius, 2*sphereRadius], center=true);
24 if(hollow) sphere(sphereRadius-wallWidth);
25 }
26 }
27}
28
244fc8f0
CE
29module acorn (thread_pitch = 3.0,
30 thread_size = 2.5,
31 thread_height = 3.5,
32 thread_tooth_height = AUTO_CALCULATE,
28ef71df 33
244fc8f0
CE
34 inner_d = 24.5,
35 base_height = AUTO_CALCULATE,
36 wall_thickness = AUTO_CALCULATE,
37 outer_d = AUTO_CALCULATE,
28ef71df 38
244fc8f0
CE
39 keychain = true) {
40
41 // derived settings
42 wall_thickness = (wall_thickness == AUTO_CALCULATE) ? thread_size : wall_thickness;
43 outer_d = (outer_d == AUTO_CALCULATE) ? inner_d + wall_thickness*2 : outer_d;
44 thread_tooth_height = (thread_tooth_height == AUTO_CALCULATE) ? ((thread_pitch - 0.4 > 0) ? thread_pitch - 0.4 : thread_pitch) : thread_tooth_height;
45 base_height = (base_height == AUTO_CALCULATE) ? inner_d : base_height;
46
b097fbc1
CE
47 echo ("outer_d = ", outer_d);
48
244fc8f0
CE
49
50 module acorn_thread (outer_d = outer_d, internal = false, ring = true) {
51 if (internal) {
52 outer_ring_d = outer_d+max(thread_size, wall_thickness)+1;
53 echo ("outer ring = ", outer_ring_d);
54 ScrewHole (outer_diam=outer_d, height = thread_height, pitch = thread_pitch, tooth_height = thread_tooth_height, tooth_angle = thread_angle, tolerance=internal_thread_tolerance) {
55 if (ring) cylinder (d = outer_ring_d, h = thread_height);
56 }
28ef71df 57 }
28ef71df 58
244fc8f0
CE
59 if (!internal) {
60 difference () {
61 ScrewThread (outer_diam=outer_d, height = thread_height, pitch = thread_pitch, tooth_height = thread_tooth_height, tooth_angle = thread_angle, tolerance=external_thread_tolerance);
62 cylinder (d = outer_d-wall_thickness-thread_size-0.01, h = thread_height * 4, center=true);
63 }
28ef71df
CE
64 }
65 }
28ef71df 66
244fc8f0
CE
67 module nut_body (h = base_height, d = outer_d, nub = false) {
68 translate ([0 ,0, h]) {
69 intersection () {
70 union () {
71 resize ([d, d, h*2]) sphere (d=h*2);
72 if (nub) {
73 translate ([0, d/2-wall_thickness/2, -thread_height]) sphere (d=wall_thickness*2, $fs = 0.1);
74 }
0cbf5490 75 }
244fc8f0 76 translate ([0 ,0, -h/2]) cube ([d*2, d*2, h], center=true);
0cbf5490 77 }
0cbf5490 78 }
28ef71df 79 }
28ef71df 80
244fc8f0
CE
81 module nut () {
82 difference () {
83 nut_body ();
84 translate ([0, 0, wall_thickness + 0.01]) nut_body (d=outer_d-wall_thickness*2, nub=false);
85 }
28ef71df 86
244fc8f0
CE
87 translate ([0, 0, base_height-0.1]) acorn_thread (outer_d = outer_d);
88 }
28ef71df 89
28ef71df 90
b097fbc1 91 module cap_keychain_holes (hole_d=3, spacing=12) {
244fc8f0
CE
92 h=100;
93 translate ([-spacing/2, 0, 0]) cylinder (d=hole_d, h=h, $fs=0.1);
94 translate ([spacing/2, 0, 0]) cylinder (d=hole_d, h=h, $fs=0.1);
95 }
28ef71df 96
b097fbc1
CE
97 module cap (model="3D/RaleighAcorn_Filled_simple.stl", native_d = 168) {
98 scale_f = outer_d / native_d; //168;
99 echo ("scale_f = ", scale_f);
244fc8f0
CE
100 difference () {
101 scale ([scale_f, scale_f, scale_f]) {
102 difference () {
103 union () {
b097fbc1 104 translate ([0, 0, -1]) import (model);
244fc8f0 105 echo ("h = ", thread_height/scale_f);
244fc8f0 106 }
b097fbc1 107 // todo: only makes sense for RaleighAcorn, fix in original model...
244fc8f0 108 translate ([0, 0, -0.51]) cube ([200, 200, 1], center=true);
0cbf5490 109 }
0cbf5490 110 }
244fc8f0 111 if (keychain) cap_keychain_holes ();
b097fbc1
CE
112
113 // hollow it out (make parametric later, this is pretty ugly now, but calc seems to be ok for RaleighAcorn)
114 diam_to_height_ratio = 3.2;
115 dome_h = outer_d / diam_to_height_ratio - thread_height;
116 echo ("dome_h = ", dome_h);
117 difference () {
118 translate ([0, 0, thread_height-0.01]) dome (d=outer_d, h=dome_h);
119 }
120
121
122 translate ([0, 0, -0.01]) acorn_thread (internal = true, ring = false);
0cbf5490 123 }
0cbf5490 124 }
28ef71df 125
244fc8f0
CE
126 module gasket (gasket_height=0.9) {
127 cylinder (d = outer_d, h = gasket_height, center=true);
28ef71df
CE
128 }
129
244fc8f0 130 module nuts () {
5d6b539a
CE
131 if (contains ("body", acorn_parts))
132 translate ([outer_d+10, 0, 0,]) nut ();
133 if (contains ("cap", acorn_parts))
b097fbc1 134 cap (native_d=167);//model="3D/RaleighAcorn_ExaggeratedCap_Decimated.stl", native_d = 178);
5d6b539a
CE
135 if (contains ("gasket", acorn_parts))
136 translate ([-(outer_d+10), 0, 0,]) gasket ();
244fc8f0 137 }
28ef71df 138
244fc8f0 139 nuts ();
28ef71df 140}
244fc8f0 141
b097fbc1
CE
142//$fs = 1;
143//$fa = 1;
244fc8f0 144
b097fbc1
CE
145acorn_parts = [ "cap"];
146
147//acorn ();
148huge_acorn ();
149
150module huge_acorn () {
151 acorn (inner_d=100, base_height=80,
152 thread_size=4, thread_pitch=4, thread_height=8,
153 keychain=false);
154}