# Werner's Miscellanea Git Source Tree

## Root/bacon/case/case.fpd

 1 /* 2 * Draw a rounded edge in one quadrant 3 * 4 * Draw a arc from corner point vc plus rector ra to vc+rb. vc+ra is stored 5 * in va and vc+rb is stored in vb. 6 */ 7 8 #define Q(va, vb, vc, ra, rb) \ 9 va: vec vc ra; \ 10 vb: vec vc rb; \ 11 vc##_center: vec va rb; \ 12 arc vc##_center va vb 13 14 #define QLL(pfx, r) \ 15 Q(pfx##lly, pfx##llx, pfx##ll, (0mm, r), (r, 0mm)) 16 #define QLR(pfx, r) \ 17 Q(pfx##lrx, pfx##lry, pfx##lr, (-(r), 0mm), (0mm, r)) 18 #define QUL(pfx, r) \ 19 Q(pfx##ulx, pfx##uly, pfx##ul, (r, 0mm), (0mm, -(r))) 20 #define QUR(pfx, r) \ 21 Q(pfx##ury, pfx##urx, pfx##ur, (0mm, -(r)), (-(r), 0mm)) 22 23 /* 24 * Rectangle with rounded corners. 25 * 26 * pfx is the prefix for all the names generated by this macro. origin is the 27 * lower left corner. w and h are the width and height. r is the radius of the 28 * corners. 29 */ 30 31 #define RRECT_SETUP(pfx, origin, w, h) \ 32 pfx##ll: vec origin(0mm, 0mm); \ 33 pfx##lr: vec pfx##ll(w, 0mm); \ 34 pfx##ul: vec pfx##ll(0mm, h); \ 35 pfx##ur: vec pfx##ll(w, h); \ 36 37 #define RRECT_DRAW_ARCS(pfx, r) \ 38 QLL(pfx, r); \ 39 QLR(pfx, r); \ 40 QUL(pfx, r); \ 41 QUR(pfx, r) 42 43 #define RRECT_DRAW_LINES(pfx) \ 44 line pfx##llx pfx##lrx; \ 45 line pfx##ulx pfx##urx; \ 46 line pfx##lly pfx##uly; \ 47 line pfx##lry pfx##ury 48 49 #define RRECT(pfx, origin, w, h, r) \ 50 RRECT_SETUP(pfx, origin, w, h); \ 51 RRECT_DRAW_ARCS(pfx, r); \ 52 RRECT_DRAW_LINES(pfx) 53 54 55 /* ----- Top part ---------------------------------------------------------- */ 56 57 58 frame top_outline { 59 RRECT(edge_, @, width, length, ro_edge) 60 } 61 62 frame top_window { 63 loop if = 1, top_window 64 65 set off = topborder+topridge 66 67 frame top_outline @ 68 69 win_orig: vec @(off+pcbgap+win_x0, off) 70 RRECT(win_, win_orig, win_x1-win_x0, length-2*off, win_r) 71 72 cmp_orig: vec @(off+pcbgap+cmp_x0, off+pcbgap+cmp_y0) 73 RRECT(cmp_, cmp_orig, cmp_x1-cmp_x0, cmp_y1-cmp_y0, cmp_r) 74 } 75 76 frame top_pcb { 77 loop if = 1, top_pcb 78 79 set inside = topborder+topridge 80 81 frame top_outline @ 82 ro: vec @(topborder, topborder) 83 ri: vec ro(topridge, topridge) 84 RRECT(ridge_i_, ri, width-2*inside, length-2*inside, ri_ridge) 85 } 86 87 frame top_ridge { 88 loop if = 1, top_ridge 89 90 set inside = topborder+topridge 91 92 ro: vec @(topborder, topborder) 93 RRECT(ridge_o_, ro, width-2*topborder, length-2*topborder, ro_ridge) 94 ri: vec ro(topridge, topridge) 95 RRECT(ridge_i_, ri, width-2*inside, length-2*inside, ri_ridge) 96 } 97 98 frame top_surface { 99 loop if = 1, top_surface 100 101 frame top_outline @ 102 } 103 104 105 /* ----- Middle part ------------------------------------------------------- */ 106 107 108 frame mid_rrect_ridge { 109 RRECT_SETUP(edge_, @, width, length); 110 RRECT_DRAW_ARCS(edge_, ro_edge); 111 112 base: vec @(red, red) 113 RRECT_SETUP(ridge_, base, width-2*red, length-2*red); 114 RRECT_DRAW_ARCS(ridge_, r); 115 116 usb_ur: vec edge_ur(-usb_roff, 0mm) 117 usb_ul: vec usb_ur(-usb_w, 0mm) 118 usb_ll: vec usb_ul(0mm, -red) 119 usb_lr: vec usb_ur(0mm, -red) 120 121 line edge_lly edge_uly /* outside */ 122 line edge_ulx usb_ul 123 line usb_ul usb_ll /* USB bay */ 124 line usb_ll ridge_ulx 125 line ridge_uly ridge_lly /* inside */ 126 line ridge_llx ridge_lrx 127 line ridge_lry ridge_ury 128 line ridge_urx usb_lr 129 line usb_lr usb_ur /* USB bay */ 130 line usb_ur edge_urx 131 line edge_ury edge_lry /* outside */ 132 line edge_lrx edge_llx 133 } 134 135 136 frame mid_rrect_body { 137 RRECT_SETUP(edge_, @, width, length); 138 RRECT_DRAW_ARCS(edge_, ro_edge); 139 140 usb_ur: vec edge_ur(-usb_roff, 0mm) 141 usb_ul: vec usb_ur(-usb_w, 0mm) 142 usb_ll: vec usb_ul(0mm, -usb_d) 143 usb_lr: vec usb_ur(0mm, -usb_d) 144 145 line edge_llx edge_lrx 146 line edge_ulx usb_ul 147 148 line usb_ul usb_ll /* USB bay */ 149 line usb_ll usb_lr 150 line usb_lr usb_ur 151 152 line usb_ur edge_urx 153 line edge_lly edge_uly 154 line edge_lry edge_ury 155 } 156 157 158 frame mid_ridge { 159 loop if = 1, mid_ridge 160 161 set red = topborder 162 set r = ro_ridge 163 frame mid_rrect_ridge @ 164 } 165 166 167 frame mid_pcb { 168 loop if = 1, mid_pcb 169 170 set red = topborder+topridge 171 set r = ri_ridge 172 frame mid_rrect_ridge @ 173 } 174 175 176 frame post { 177 vec @(r, 0mm) 178 circ @ . 179 } 180 181 182 frame mid_body { 183 loop if = 1, mid_body 184 185 frame mid_rrect_body @ 186 187 bc: vec @(width/2, batt_y) 188 br: vec bc(batt_d/2, 0mm) 189 circ bc br 190 191 set r = post_do/2 192 vec @(post_x, cvr_f+cvr_d+post_y) 193 frame post . 194 vec @(width-post_x, cvr_f+cvr_d+post_y) 195 frame post . 196 } 197 198 199 /* ----- Bottom part ------------------------------------------------------- */ 200 201 202 frame bot_rrect { 203 base: vec @(0mm, cvr_f) 204 205 RRECT_SETUP(edge_, base, width, length-cvr_f); 206 QUL(edge_, ro_edge); 207 QUR(edge_, ro_edge); 208 209 set side = (width-cvr_w-2*cvr_play)/2-red 210 cvr_ll: vec edge_ll(side, 0mm) 211 cvr_lr: vec edge_lr(-side, 0mm) 212 cvr_ul: vec cvr_ll(0mm, cvr_d+2*cvr_play+red) 213 cvr_ur: vec cvr_lr(0mm, cvr_d+2*cvr_play+red) 214 215 line edge_ll cvr_ll /* outside */ 216 217 QUL(cvr_, cvr_r+red+cvr_play) /* cover bay */ 218 QUR(cvr_, cvr_r+red+cvr_play) 219 220 line cvr_ll cvr_uly 221 line cvr_ulx cvr_urx 222 line cvr_ury cvr_lr 223 224 line cvr_lr edge_lr /* outside */ 225 line edge_ll edge_uly 226 line edge_lr edge_ury 227 line edge_ulx edge_urx 228 } 229 230 231 frame bot_posts { 232 loop if = 1, bot_posts 233 234 set r = post_di/2 235 vec @(post_x, cvr_f+cvr_d+post_y) 236 frame post . 237 vec @(width-post_x, cvr_f+cvr_d+post_y) 238 frame post . 239 } 240 241 242 frame bot_base { 243 loop if = 1, bot_base 244 245 set red = cvr_foot 246 frame bot_rrect @ 247 } 248 249 250 frame bot_surface { 251 loop if = 1, bot_surface 252 253 set red = 0mm 254 frame bot_rrect @ 255 } 256 257 258 /* ----- Main -------------------------------------------------------------- */ 259 260 261 package "\$part-\$z" 262 unit mm 263 264 table 265 { part, z, top_surface, top_window, top_pcb, top_ridge, 266 mid_ridge, mid_pcb, mid_body, 267 bot_posts, bot_base, bot_surface} 268 { "top_surface", 3.3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 } 269 { "top_window", 2.3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 } 270 { "top_pcb", 1.2, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 } 271 { "top_ridge", 0.5, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 } 272 { "mid_ridge", 0.6, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0 } 273 { "mid_pcb", 1.2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 } 274 { "mid_body", 4.7, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0 } 275 { "bot_posts", 1.2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 } 276 { "bot_base", 2.0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0 } 277 { "bot_surface", 2.7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 } 278 279 table 280 { pcbw, pcbl, pcbgap } 281 { 20mm, 45mm, 0.2mm } 282 283 table 284 /* window position relative to left edge of PCB */ 285 { topridge, topborder, win_x0, win_x1, win_r } 286 { 1.0mm, 1.0mm, 1.0mm, 5.0mm, 1.6mm } 287 288 table 289 /* component area position relative to lower left corner of PCB */ 290 { cmp_x0, cmp_y0, cmp_x1, cmp_y1, cmp_r } 291 { 6.5mm, 1.0mm, 19.5mm, 30.0mm, 2.0mm } 292 293 table 294 /* usb_roff = offset from right outer case edge */ 295 /* usb_d = 10 mm for prototypes (mini-USB); reduce to 6.0 mm for micro */ 296 { usb_w, usb_d, usb_roff } 297 { 8.6mm, 10.0mm, 4.9mm } 298 299 table 300 /* post_y is from the edge of the battery bay. post_x is from the edge */ 301 { batt_d, batt_y, post_do, post_di, post_y, post_x } 302 { 20.2mm, 12.1mm, 4.1mm, 4.0mm, 5.0mm, 4.5mm } 303 304 table 305 { cvr_w, cvr_d, cvr_f, cvr_foot, cvr_play, cvr_r } 306 { 20.0mm, 15.0mm, 5.0mm, 0.8mm, 0.1mm, 2.0mm } 307 308 set width = pcbw+2*(pcbgap+topridge+topborder) 309 set length = pcbl+2*(pcbgap+topridge+topborder) 310 311 set ri_ridge = 2.0mm 312 set ro_ridge = ri_ridge+topridge 313 314 /* 315 * ro_edge is an outer edge, so we can make the radius smaller than ro_ridge, 316 * for added strength and less fruity esthetics. 317 */ 318 319 set ro_edge = 1.5mm 320 321 frame top_ridge @ 322 frame top_pcb @ 323 frame top_window @ 324 frame top_surface @ 325 326 frame mid_ridge @ 327 frame mid_pcb @ 328 frame mid_body @ 329 330 frame bot_posts @ 331 frame bot_base @ 332 frame bot_surface @ 333 334 measx top_outline.edge_ul -> top_outline.edge_ur 4mm 335 measy top_outline.edge_ll -> top_outline.edge_ul 4mm 336 //measx top_pcb.pcb_ul -> top_pcb.pcb_ur 3mm 337 //measy top_pcb.pcb_ll -> top_pcb.pcb_ul 3mm 338 339 measx top_ridge.ridge_o_ul -> top_ridge.ridge_o_ur 4mm 340 measy top_ridge.ridge_o_ll -> top_ridge.ridge_o_ul 4mm 341 measx top_ridge.ridge_i_ul -> top_ridge.ridge_i_ur 3mm 342 measy top_ridge.ridge_i_ll -> top_ridge.ridge_i_ul 3mm 343 344 measy bot_rrect.edge_ll -> bot_rrect.edge_ul 4mm 345 measx bot_rrect.edge_ll -> bot_rrect.cvr_ll -3mm 346

Branches:
master