chiark / gitweb /
knifeblock: PegTemplate apex
[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 holesize = 12.5;
40 holestrut = 7;
41 holeedge = 4;
42
43 holeoffx = 0.45;
44 holeoffy = 0.25;
45
46 pegstem = 3.5;
47 peghead = 10;
48 pegstemheight = 2;
49 pegheight = 9;
50 peglen = 12;
51
52 recessblockwidth = peghead + pegstem*3;
53 recessblockheight = peglen/2 + pegstem*1.5;
54
55 pegsloph = 0.5;
56 pegslopv = 0.5;
57 pegslopl = 0.5;
58
59 pegdepthproportion = 0.80;
60
61 // computed
62 side = minsidein + screwcsinkdia + minsideout;
63 totaldepth = front + maxhandledepth + back;
64
65 minkx = locations[0] -         widths[0]        /2;
66 maxkx = locations[nknives-1] + widths[nknives-1]/2;
67
68 minx = minkx - side;
69 maxx = maxkx + side;
70
71 holepitch = holesize+holestrut;
72
73 pegrecess = pegdepthproportion*totaldepth - 0.5*peglen;
74
75 module ImportTemplate(w,k,t) {
76   fn = str("knifeblock-knives-t",k,t,".dxf");
77   echo(fn);
78   translate([0,0, -w/2])
79     linear_extrude(height=w)
80     scale(templatescale) import(file=fn, convexity=100);
81 }
82
83 module Knife(k){
84   ImportTemplate(bladew, k,"bl");
85   hull(){
86     ImportTemplate(widths[k], k,"hl");
87     translate([-100,0,0])
88       ImportTemplate(widths[k], k,"hl");
89   }
90 }
91
92 module DoKnife(k){
93   translate([locations[k],0,0]){
94     rotate([0,90,0])
95       translate([-(handlelenbase + handlelendelta[k]),0,0])
96       Knife(k);
97   }
98 }
99
100 module DoKnives(){
101   for (k=[0:nknives-1])
102     DoKnife(k);
103 }
104
105 module ScrewHole(){
106   translate([0,-50,0])
107     rotate([-90,0,0])
108     cylinder(r=screwdia/2, h=150, $fn=40);
109   translate([0, totaldepth-front - screwbackdepth, 0])
110     rotate([90,0,0])
111     cylinder(r=screwcsinkdia/2 / (sqrt(3)/2), h=100, $fn=6);
112 }
113
114 module PegTemplate(apex){
115   for (mx=[0,1]) for (my=[0,1]) {
116       mirror([mx,0,0]) mirror([0,my,0])
117         polygon([[-0.1,      -0.1],
118                  [pegstem/2, -0.1],
119                  [pegstem/2, pegstemheight/2],
120                  [peghead/2, pegheight    /2],
121                  [-0.1,      pegheight    /2 + apex]]);
122     }
123 }
124
125 module AtSides(){
126   translate([minx,0,0])                 child(0);
127   translate([maxx,0,0]) mirror([1,0,0]) child(1);
128 }
129
130 module BlockPegSlot(){
131   translate([recessblockwidth/2, pegrecess - 0.5*peglen, -height]){
132     rotate([-90,0,0]) linear_extrude(height=totaldepth){
133       PegTemplate(peghead/2 * 1.2);
134     }
135   }
136 }
137
138 module Block(){
139   sidemidx = minsideout + screwcsinkdia/2;
140
141   difference(){
142     mirror([0,0,1]) {
143       translate([minx, -front, 0])
144         cube([maxx-minx, totaldepth, height]);
145     }
146     for (x=[minx + sidemidx, maxx - sidemidx]) {
147       translate([x, 0, -screwabove])
148         ScrewHole();
149     }
150     for (yshift=[-1,1])
151       translate([0, yshift * frontbackslop, 0])
152         DoKnives();
153     AtSides() { BlockPegSlot(); BlockPegSlot(); }
154   }
155 }
156
157 module BlockPrint(){ ////toplevel
158   rotate([0,0,90])
159     Block();
160 }
161
162 module CoverTemplate(){
163   linear_extrude(height=coverthick)
164     polygon([[minx, 0],
165              [maxx, 0],
166              [maxx, coverlonglen],
167              [maxx - coverside, coverlonglen],
168              [minx, covershortlen]]);
169 }
170
171 module CoverSide(len){
172   translate([0, 0 ,0]) {
173     rotate([90,0,90])
174       linear_extrude(height=coverside)
175       polygon([[0,                      0],
176                [0,                      totaldepth],
177                [covertopwing,           totaldepth],
178                [covertopwingbase,       coverside + coverthick],
179                [len - covertopwingbase, coverside + coverthick],
180                [len - covertopwing,     totaldepth],
181                [len,                    totaldepth],
182                [len,                    0]]);
183     cube([recessblockwidth, recessblockheight, totaldepth]);
184   }
185 }
186
187 module Peg(){
188   echo("peg angle slope (must be <1)",
189        (peghead-pegstem)/(pegheight-pegstemheight));
190   dx = pegsloph;
191   dy = pegslopv;
192   rotate([90,0,0]) {
193     linear_extrude(height=peglen-pegslopl) {
194       intersection(){
195         translate([-dx,-dy,0]) PegTemplate(0);
196         translate([-dx,+dy,0]) PegTemplate(0);
197         translate([+dx,+dy,0]) PegTemplate(0);
198         translate([+dx,-dy,0]) PegTemplate(0);
199       }
200     }
201   }
202 }
203
204 module CoverPegSlot(coverlen){
205   translate([recessblockwidth/2, 0, -1]){
206     linear_extrude(height= 1 + pegrecess + 0.5*peglen){
207       PegTemplate(0);
208     }
209   }
210 }
211
212 module HoleRow(){
213   for (i=[0:10]) {
214     translate([0, (i+0.5)*holepitch, -1])
215       cylinder(r=holesize/2, h=coverthick+2, $fn=20);
216   }
217 }
218
219 module HolesScope(){
220   intersection_for (dx=[-1,+1]) {
221     intersection_for (dy=[-1,+1]) {
222       translate([dx * holeedge, dy * holeedge, -1])
223         scale([1,1,2])
224         CoverTemplate();
225     }
226   }
227 }
228
229 module Holes(){
230   intersection(){
231     translate([holeoffx * holepitch, holeoffy * holepitch, 0]) {
232       for (i=[-10:10]) {
233         translate([i * sqrt(3) * holepitch, 0, 0]) {
234           HoleRow();
235           translate([sqrt(3)/2 * holepitch, -0.5 * holepitch, 0])
236             HoleRow();
237         }
238       }
239     }
240     HolesScope();
241   }
242 }
243
244 module CoverCover(){
245   difference(){
246     CoverTemplate();
247     Holes();
248   }
249 }
250
251 module Cover(){
252   difference(){
253     union(){
254       CoverCover();
255       AtSides() { CoverSide(covershortlen); CoverSide(coverlonglen); }
256     }
257     AtSides() { CoverPegSlot(); CoverPegSlot(); }
258   }
259 }
260
261 module CoverAligned(){
262   translate([0,-front,-height])
263     rotate([-90,0,0])
264     Cover();
265 }
266
267 module DemoPeg(){
268   translate([recessblockwidth/2, pegrecess, -height])
269     Peg();
270 }
271
272 module Demo(){ ////toplevel
273   %Block();
274   DoKnives();
275   color([0,0,1]) CoverAligned();
276   color([1,0,0]) AtSides() { DemoPeg(); DemoPeg(); }
277 }
278
279 module CoverParts(){ ////toplevel
280   Cover();
281   translate([0, coverlonglen, pegheight/2]) {
282     Peg();
283     translate([-peghead-3, 0,0]) Peg();
284   }
285 }
286
287 //Block();
288 //Demo();
289 //Cover();
290 //CoverParts();
291 //Peg();
292 //Cover();