chiark / gitweb /
486d36bb660006b5665096e629ece22acd149e49
[reprap-play.git] / sealing-box.scad.m4
1 // -*- C -*-
2
3 // This file can be used in two ways:
4 //
5 // A. Rectangular boxes
6 //      1. include <sealing-box.scad>
7 //      2. assign() values to (xxx these should be $ variables)
8 //           $sealingbox_wallth
9 //           $sealingbox_sz[0] (outer dimension)
10 //           $sealingbox_sz[1] (outer dimension)
11 //           $sealingbox_sz[2] (inner dimension)
12 //           $sealingbox_ceilth
13 //           $sealingbox_floorth
14 //           $sealingbox_wallth
15 //      3. use the modules
16 //           SealingBox_RectBox
17 //           SealingBox_RectLid
18 //           (origin is notional outside corner, but at level of
19 //            inside of base; box extends to positive x,y,z)
20 //
21 // B. Complicated shapes, but harder work
22 //      1. Be a .m4 file and m4_include sealing-box.scad.m4
23 //      2. Define your own BoxDoShapeSomething like BoxDoShapeRect
24 //      3. Invoke BoxUseShape
25 //      4. Use the Box and Lid modules generated
26 //
27 // Other settings
28 //  $sealingbox_cnrrad
29
30 $sealingbox_cnrrad = 10;
31 $sealingbox_crude = false;
32
33 m4_define(`BoxLocals',`
34   xbox = $sealingbox_sz[0];
35   ybox = $sealingbox_sz[1];
36   zbox = $sealingbox_sz[2];
37   wall = $sealingbox_wallth;
38   floorth = $sealingbox_floorth;
39   ceilth = $sealingbox_ceilth;
40   cnrrad = $sealingbox_cnrrad;
41
42   xbox_lin = xbox - cnrrad*2;
43   ybox_lin = ybox - cnrrad*2;
44 ')
45
46 m4_define(`innertube', `(1.0 + 0.2)')
47 m4_define(`lidoverlap', `1.5')
48 m4_define(`lidoverhang', `6')
49 m4_define(`tubesealrad', `2.0')
50
51 m4_define(`BoxFn',`$fn= $sealingbox_crude ? ($2) : ($1)')
52
53 m4_dnl Box_Part($1=transl_x,$2=transl_y, $3=rot_z,$4=mirror_xy)
54 m4_dnl          $5=kind, $6=kindargs, $7=profile(profileargsargs))
55 m4_define(`Box_Part',`
56   translate([($1),($2)])
57     rotate([0,0,($3)])
58     mirror([($4),0,0])
59     BoxPart_Extrude_$5($6, $7)') m4_dnl
60
61 boxpart_d = 0.01;
62
63 m4_dnl BoxPart_Extrude_Linear(dist, `profile(...);');
64 m4_define(`BoxPart_Extrude_Linear',`
65   rotate([90,0,0])
66     translate([0,0, -($1)])
67     linear_extrude(height= boxpart_d + ($1)) {
68       $2
69     }
70 ')
71
72 m4_dnl BoxPart_Extrude_Arc(x0_radius, swept_angle, `profile(...);')
73 m4_dnl  arc starting at transl_x, transl_y, moving towards positive
74 m4_dnl  y at first and then bending towards negative x, until
75 m4_dnl  use negative x0_radius to inciate bending towards positive x
76 m4_dnl  swept_angle is reached
77 m4_dnl  x0_radius is the radius of the extruded part at x=0, not of the box
78 m4_define(`BoxPart_Extrude_Arc',`
79   translate([-($1),0,0])
80     intersection(){
81       translate([0,0,-500])
82         linear_extrude(height=1000)
83         scale(500)
84         mirror([($1)<0, 0,0])
85         FArcSegment_mask($2);
86       rotate_extrude(convexity=10, $fs=1, BoxFn(36,8))
87         mirror([($1)<0, 0,0])
88         translate([+($1),0,0]){
89           $3
90         }
91     }
92 ')
93
94 m4_dnl BoxDoShapeRect(`profile(profileargs)');
95 m4_define(`BoxDoShapeRect',`
96   Box_Part(0,           cnrrad,         0,0, Linear,`ybox_lin', `$1' )
97   Box_Part(0,           ybox-cnrrad,    0,0, Arc,`-cnrrad,90' , `$1' )
98   Box_Part(cnrrad,      ybox,         -90,0, Linear,`xbox_lin', `$1' )
99   Box_Part(xbox-cnrrad, ybox,         -90,0, Arc,`-cnrrad,90' , `$1' )
100   Box_Part(xbox,        ybox-cnrrad, -180,0, Linear,`ybox_lin', `$1' )
101   Box_Part(xbox,        cnrrad,      -180,0, Arc,`-cnrrad,90' , `$1' )
102   Box_Part(xbox-cnrrad, 0,           -270,0, Linear,`xbox_lin', `$1' )
103   Box_Part(cnrrad,      0,           -270,0, Arc,`-cnrrad,90' , `$1' )
104 ')
105
106 m4_dnl '
107
108 module SealingBox_WallProfile(){
109   BoxLocals
110   z = zbox - innertube - tubesealrad;
111   translate([0, -0.1]) square([wall, z]);
112   translate([tubesealrad, z]) circle(r=tubesealrad, BoxFn(20,6));
113 }
114
115 module SealingBox_FloorProfile(){
116   BoxLocals
117   mirror([0,1]) square([wall, floorth]);
118 }
119
120 function SealingBox_lidbigger() = lidoverlap + innertube;
121
122 module SealingBox_LidProfile(){
123   BoxLocals
124   rad = tubesealrad + innertube;
125   morex = wall;
126   difference(){
127     translate([0, zbox + ceilth]) mirror([0,1]) {
128       translate([-SealingBox_lidbigger(),
129                  0])
130       square([lidoverlap + innertube + tubesealrad,
131               lidoverhang + innertube + ceilth]);
132       square([tubesealrad*2 + innertube + lidoverlap,
133               tubesealrad*1.5 + innertube + ceilth]);
134     }
135     hull(){
136       translate([tubesealrad,
137                  zbox - innertube - tubesealrad])
138         for (t=[ [0,0],
139                  [0, -zbox]
140                  ]) {
141           translate(t)
142             circle(r= tubesealrad + innertube, BoxFn(20,6));
143         }
144     }
145   }
146 }
147
148 module SealingBox_CeilProfile(){
149   BoxLocals
150   translate([0, zbox])
151     square([wall*2, ceilth]);
152 }
153
154 // BoxDoShape(Basename,BoxDoShapeSomething)
155 // generates modules BasenameBox and BasenameLid
156 m4_define(`BoxUseShape',`
157   module $1Box(){
158     BoxLocals
159     $2(SealingBox_WallProfile(););
160     hull(){ $2(SealingBox_FloorProfile();); }
161   }
162
163   module $1Lid(){
164     BoxLocals
165     $2(SealingBox_LidProfile(););
166     hull(){ $2(SealingBox_CeilProfile();); }
167   }
168 ')
169
170 BoxUseShape(`SealingBox_Rect',`BoxDoShapeRect')