Werner's Miscellanea
Sign in or create your account | Project List | Help
Werner's Miscellanea Git Source Tree
Root/
| 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
