chiark / gitweb /
7e03782c58da25e51faf8e176c796fd4ed490eb1
[reprap-play.git] / knifeblock.scad
1 // -*- C -*-
2
3 // properties of the knives
4 nknives = 3;
5 widths = [15.5, 15.8, 19.0];
6 handlelenbase = 75;
7 handlelendelta = [-15, 0, 10];
8 locations = [-35, 0, 40];
9 bladew = 5; // 2.5
10 maxhandledepth = 45;
11
12 templatescale = 27.2 / 19.6;
13
14 coverlonglen = 120; // xxx
15 covershortlen = 70; // xxx
16
17 // other tuneables
18 front = 5;
19 back = 5;
20 height = 50;
21 minsidein = 4;
22 minsideout = 4;
23
24 frontbackslop = 0.25;
25
26 screwbackdepth = 6.0 - 1.0;
27 screwdia =       4.0 + 0.5;
28 screwcsinkdia =  9.8 + 1.0;
29
30 screwabove = 15;
31
32 coverthick = 2.4;
33 coverside = coverthick;
34
35 covertopwing = 15;
36 covertopwingbase = 20;
37 coveredge = 3;
38
39 pegstem = 3.5;
40 peghead = 10;
41 pegstemheight = 2;
42 pegheight = 9;
43 peglen = 12;
44
45 recessblockwidth = peghead + pegstem*3;
46 recessblockheight = peglen + pegstem*1.5;
47
48 pegsloph = 0.5;
49 pegslopv = 0.5;
50 pegslopl = 0.5;
51
52 pegdepthproportion = 0.67;
53
54 // computed
55 side = minsidein + screwcsinkdia + minsideout;
56 totaldepth = front + maxhandledepth + back;
57
58 minkx = locations[0] -         widths[0]        /2;
59 maxkx = locations[nknives-1] + widths[nknives-1]/2;
60
61 minx = minkx - side;
62 maxx = maxkx + side;
63
64 pegrecess = pegdepthproportion*totaldepth - 0.5*peglen;
65
66 module ImportTemplate(w,k,t) {
67   fn = str("knifeblock-knives-t",k,t,".dxf");
68   echo(fn);
69   translate([0,0, -w/2])
70     linear_extrude(height=w)
71     scale(templatescale) import(file=fn, convexity=100);
72 }
73
74 module Knife(k){
75   ImportTemplate(bladew, k,"bl");
76   hull(){
77     ImportTemplate(widths[k], k,"hl");
78     translate([-100,0,0])
79       ImportTemplate(widths[k], k,"hl");
80   }
81 }
82
83 module DoKnife(k){
84   translate([locations[k],0,0]){
85     rotate([0,90,0])
86       translate([-(handlelenbase + handlelendelta[k]),0,0])
87       Knife(k);
88   }
89 }
90
91 module DoKnives(){
92   for (k=[0:nknives-1])
93     DoKnife(k);
94 }
95
96 module ScrewHole(){
97   translate([0,-50,0])
98     rotate([-90,0,0])
99     cylinder(r=screwdia/2, h=150, $fn=40);
100   translate([0, totaldepth-front - screwbackdepth, 0])
101     rotate([90,0,0])
102     cylinder(r=screwcsinkdia/2 / (sqrt(3)/2), h=100, $fn=6);
103 }
104
105 module PegTemplate(){
106   for (mx=[0,1]) for (my=[0,1]) {
107       mirror([mx,0,0]) mirror([0,my,0])
108         polygon([[-0.1,      -0.1],
109                  [pegstem/2, -0.1],
110                  [pegstem/2, pegstemheight/2],
111                  [peghead/2, pegheight    /2],
112                  [-0.1,      pegheight    /2]]);
113     }
114 }
115
116 module AtSides(){
117   translate([minx,0,0])                 child(0);
118   translate([maxx,0,0]) mirror([1,0,0]) child(1);
119 }
120
121 module BlockPegSlot(){
122   translate([recessblockwidth/2, pegrecess - 0.5*peglen, -height]){
123     rotate([-90,0,0]) linear_extrude(height=totaldepth){
124       PegTemplate();
125     }
126   }
127 }
128
129 module Block(){
130   sidemidx = minsideout + screwcsinkdia/2;
131
132   difference(){
133     hull() mirror([0,0,1]) {
134       translate([minx, 0, 0])
135         cube([maxx-minx, totaldepth-front, height]);
136       for (x=[minx + front/2, maxx - front/2])
137         translate([x, -front/2, 0])
138         cylinder(r=front/2, h=height, $fn=30);
139     }
140     for (x=[minx + sidemidx, maxx - sidemidx]) {
141       translate([x, 0, -screwabove])
142         ScrewHole();
143     }
144     for (yshift=[-1,1])
145       translate([0, yshift * frontbackslop, 0])
146         DoKnives();
147     AtSides() { BlockPegSlot(); BlockPegSlot(); }
148   }
149 }
150
151 module BlockPrint(){ ////toplevel
152   rotate([0,0,90])
153     Block();
154 }
155
156 module CoverTemplate(){
157   linear_extrude(height=coverthick)
158     polygon([[minx, 0],
159              [maxx, 0],
160              [maxx, coverlonglen],
161              [maxx - coverside, coverlonglen],
162              [minx, covershortlen]]);
163 }
164
165 module CoverSide(len){
166   translate([0, 0 ,0]) {
167     rotate([90,0,90])
168       linear_extrude(height=coverside)
169       polygon([[0,                      0],
170                [0,                      totaldepth],
171                [covertopwing,           totaldepth],
172                [covertopwingbase,       coverside + coverthick],
173                [len - covertopwingbase, coverside + coverthick],
174                [len - covertopwing,     totaldepth],
175                [len,                    totaldepth],
176                [len,                    0]]);
177     cube([recessblockwidth, recessblockheight, totaldepth]);
178   }
179 }
180
181 module Peg(){
182   echo("peg angle slope (must be <1)",
183        (peghead-pegstem)/(pegheight-pegstemheight));
184   dx = pegsloph;
185   dy = pegslopv;
186   rotate([90,0,0]) {
187     linear_extrude(height=peglen-pegslopl) {
188       intersection(){
189         translate([-dx,-dy,0]) PegTemplate();
190         translate([-dx,+dy,0]) PegTemplate();
191         translate([+dx,+dy,0]) PegTemplate();
192         translate([+dx,-dy,0]) PegTemplate();
193       }
194     }
195   }
196 }
197
198 module CoverPegSlot(coverlen){
199   translate([recessblockwidth/2, 0, -1]){
200     linear_extrude(height= 1 + pegrecess + 0.5*peglen){
201       PegTemplate();
202     }
203   }
204 }
205
206 module Cover(){
207   difference(){
208     union(){
209       CoverTemplate();
210       AtSides() { CoverSide(covershortlen); CoverSide(coverlonglen); }
211     }
212     AtSides() { CoverPegSlot(); CoverPegSlot(); }
213   }
214 }
215
216 module CoverAligned(){
217   translate([0,-front,-height])
218     rotate([-90,0,0])
219     Cover();
220 }
221
222 module Demo(){ ////toplevel
223   %Block();
224   DoKnives();
225   color([0,0,1]) CoverAligned();
226 }
227
228 Demo();
229 //Cover();
230 //Peg();