summaryrefslogtreecommitdiffabout
path: root/delta.jscad
authorMichael Krelin <hacker@klever.net>2016-01-08 22:12:09 (UTC)
committer Michael Krelin <hacker@klever.net>2016-01-08 22:12:09 (UTC)
commitaf783b9334f536d8adde19d39ed948c5274fe948 (patch) (unidiff)
treec9a85455457bd4812ee175f823a98c1c5e0d5b54 /delta.jscad
parentcc491344eef63b1a0d826de3864a33ff989e94cf (diff)
downloadredelta-af783b9334f536d8adde19d39ed948c5274fe948.zip
redelta-af783b9334f536d8adde19d39ed948c5274fe948.tar.gz
redelta-af783b9334f536d8adde19d39ed948c5274fe948.tar.bz2
duet holder
Diffstat (limited to 'delta.jscad') (more/less context) (ignore whitespace changes)
-rw-r--r--delta.jscad56
1 files changed, 56 insertions, 0 deletions
diff --git a/delta.jscad b/delta.jscad
index 5c63b41..dcf6fcc 100644
--- a/delta.jscad
+++ b/delta.jscad
@@ -287,486 +287,542 @@ var EFFECTOR = {
287 corner1: [s*hinges_apart,e.o-e.hinge.margin-e.hinge.d/2,e.h], 287 corner1: [s*hinges_apart,e.o-e.hinge.margin-e.hinge.d/2,e.h],
288 corner2: [s*(hinges_apart+e.hinge.w),e.o+e.hinge.margin+e.hinge.d/2,e.h+e.hinge.h] 288 corner2: [s*(hinges_apart+e.hinge.w),e.o+e.hinge.margin+e.hinge.d/2,e.h+e.hinge.h]
289 }).union(CSG.cylinder({ 289 }).union(CSG.cylinder({
290 start: [s*hinges_apart,e.o,e.h+e.hinge.h], 290 start: [s*hinges_apart,e.o,e.h+e.hinge.h],
291 end: [s*(hinges_apart+e.hinge.w),e.o,e.h+e.hinge.h], 291 end: [s*(hinges_apart+e.hinge.w),e.o,e.h+e.hinge.h],
292 radius: e.hinge.d/2+e.hinge.margin 292 radius: e.hinge.d/2+e.hinge.margin
293 })).subtract(CSG.cylinder({ 293 })).subtract(CSG.cylinder({
294 start: [s*(hinges_apart-1),e.o,e.h+e.hinge.h], 294 start: [s*(hinges_apart-1),e.o,e.h+e.hinge.h],
295 end: [s*(hinges_apart+e.hinge.w+1),e.o,e.h+e.hinge.h], 295 end: [s*(hinges_apart+e.hinge.w+1),e.o,e.h+e.hinge.h],
296 radius: e.hinge.d/2 296 radius: e.hinge.d/2
297 })); 297 }));
298 })); 298 }));
299 // add clamp guides 299 // add clamp guides
300 var cgrr = e.guide.width/3; 300 var cgrr = e.guide.width/3;
301 rv = rv.union([-1,1].map(function guide(s) { 301 rv = rv.union([-1,1].map(function guide(s) {
302 return CSG.roundedCube({ 302 return CSG.roundedCube({
303 center: [s*(e.mswitch.size[0]+PRINT.slide_tolerance+e.guide.width)/2,-rcorner+e.guide.length/2,e.h+e.guide.height/2-cgrr], 303 center: [s*(e.mswitch.size[0]+PRINT.slide_tolerance+e.guide.width)/2,-rcorner+e.guide.length/2,e.h+e.guide.height/2-cgrr],
304 radius: [e.guide.width/2,e.guide.length/2,e.guide.height/2+cgrr], 304 radius: [e.guide.width/2,e.guide.length/2,e.guide.height/2+cgrr],
305 roundradius: cgrr 305 roundradius: cgrr
306 }).intersect(CSG.cube({ 306 }).intersect(CSG.cube({
307 center: [s*(e.mswitch.size[0]+PRINT.slide_tolerance+e.guide.width)/2,-rcorner+e.guide.length/2,e.h+e.guide.height/2], 307 center: [s*(e.mswitch.size[0]+PRINT.slide_tolerance+e.guide.width)/2,-rcorner+e.guide.length/2,e.h+e.guide.height/2],
308 radius: [e.guide.width/2,e.guide.length/2,e.guide.height/2+.1], 308 radius: [e.guide.width/2,e.guide.length/2,e.guide.height/2+.1],
309 roundradius: cgrr 309 roundradius: cgrr
310 })); 310 }));
311 })); 311 }));
312 rv.properties.grove_connector = new CSG.Connector([0,0,e.h+e.hinge.e+6/2],[0,0,1],[1,0,0]); 312 rv.properties.grove_connector = new CSG.Connector([0,0,e.h+e.hinge.e+6/2],[0,0,1],[1,0,0]);
313 rv.properties.rcorner = rcorner; 313 rv.properties.rcorner = rcorner;
314 return rv.setColor([0.4,0.8,0.4,0.9]); 314 return rv.setColor([0.4,0.8,0.4,0.9]);
315 }, 315 },
316 hinged: function effector_hinged(o) { 316 hinged: function effector_hinged(o) {
317 var e = CONFIG.effector; 317 var e = CONFIG.effector;
318 var conel = e.rodend.screw_l-e.rodend.joint_w; 318 var conel = e.rodend.screw_l-e.rodend.joint_w;
319 var hinges_apart = e.rods_apart/2-conel; 319 var hinges_apart = e.rods_apart/2-conel;
320 var hhr = e.o-e.hinge.d/2-e.hinge.margin; // hotend holder radius 320 var hhr = e.o-e.hinge.d/2-e.hinge.margin; // hotend holder radius
321 var hhh = CONFIG.hotend.groove.h+CONFIG.hotend.ungroove.above; 321 var hhh = CONFIG.hotend.groove.h+CONFIG.hotend.ungroove.above;
322 var rv = CSG.cylinder({ /* hinge */ 322 var rv = CSG.cylinder({ /* hinge */
323 start: [-hinges_apart+PRINT.slide_tolerance,e.o,e.h+e.hinge.h], 323 start: [-hinges_apart+PRINT.slide_tolerance,e.o,e.h+e.hinge.h],
324 end: [hinges_apart-PRINT.slide_tolerance,e.o,e.h+e.hinge.h], 324 end: [hinges_apart-PRINT.slide_tolerance,e.o,e.h+e.hinge.h],
325 radius: e.hinge.d/2+e.hinge.margin 325 radius: e.hinge.d/2+e.hinge.margin
326 }).union( /* lower hotend holder */ 326 }).union( /* lower hotend holder */
327 CSG.cylinder({ 327 CSG.cylinder({
328 start: [0,0,e.h+e.hinge.e], end: [0,0,e.h+e.hinge.e+CONFIG.hotend.groove.h], 328 start: [0,0,e.h+e.hinge.e], end: [0,0,e.h+e.hinge.e+CONFIG.hotend.groove.h],
329 radius: hhr 329 radius: hhr
330 }).subtract(CSG.cylinder({ 330 }).subtract(CSG.cylinder({
331 start: [0,0,e.h+e.hinge.e-1], end: [0,0,e.h+e.hinge.e+CONFIG.hotend.groove.h+1], 331 start: [0,0,e.h+e.hinge.e-1], end: [0,0,e.h+e.hinge.e+CONFIG.hotend.groove.h+1],
332 radius: CONFIG.hotend.groove.d/2 +PRINT.fit_tolerance 332 radius: CONFIG.hotend.groove.d/2 +PRINT.fit_tolerance
333 })) 333 }))
334 ).union( /* upper hotend holder */ 334 ).union( /* upper hotend holder */
335 CSG.cylinder({ 335 CSG.cylinder({
336 start: [0,0,e.h+e.hinge.e+CONFIG.hotend.groove.h], 336 start: [0,0,e.h+e.hinge.e+CONFIG.hotend.groove.h],
337 end: [0,0,e.h+e.hinge.e+CONFIG.hotend.groove.h+CONFIG.hotend.ungroove.above], 337 end: [0,0,e.h+e.hinge.e+CONFIG.hotend.groove.h+CONFIG.hotend.ungroove.above],
338 radius: hhr 338 radius: hhr
339 }).subtract(CSG.cylinder({ 339 }).subtract(CSG.cylinder({
340 start: [0,0,e.h+e.hinge.e+CONFIG.hotend.groove.h-1], 340 start: [0,0,e.h+e.hinge.e+CONFIG.hotend.groove.h-1],
341 end: [0,0,e.h+e.hinge.e+CONFIG.hotend.groove.h+CONFIG.hotend.ungroove.above+1], 341 end: [0,0,e.h+e.hinge.e+CONFIG.hotend.groove.h+CONFIG.hotend.ungroove.above+1],
342 radius: CONFIG.hotend.ungroove.d/2 +PRINT.fit_tolerance 342 radius: CONFIG.hotend.ungroove.d/2 +PRINT.fit_tolerance
343 })) 343 }))
344 ).union( /* connect mount with hinge */ 344 ).union( /* connect mount with hinge */
345 CSG.cube({ 345 CSG.cube({
346 corner1: [-hinges_apart+PRINT.slide_tolerance,CONFIG.hotend.ungroove.d/2+PRINT.fit_tolerance,e.h+e.hinge.e], 346 corner1: [-hinges_apart+PRINT.slide_tolerance,CONFIG.hotend.ungroove.d/2+PRINT.fit_tolerance,e.h+e.hinge.e],
347 corner2: [hinges_apart-PRINT.slide_tolerance,e.o,e.h+e.hinge.h+e.hinge.d/2+e.hinge.margin] 347 corner2: [hinges_apart-PRINT.slide_tolerance,e.o,e.h+e.hinge.h+e.hinge.d/2+e.hinge.margin]
348 }) 348 })
349 ).subtract( /* hinge screwhole */ 349 ).subtract( /* hinge screwhole */
350 CSG.cylinder({ 350 CSG.cylinder({
351 start: [-hinges_apart-1,e.o,e.h+e.hinge.h], 351 start: [-hinges_apart-1,e.o,e.h+e.hinge.h],
352 end: [hinges_apart+1,e.o,e.h+e.hinge.h], 352 end: [hinges_apart+1,e.o,e.h+e.hinge.h],
353 radius: e.hinge.d/2 353 radius: e.hinge.d/2
354 }) 354 })
355 ).union( /* hold clamp together */ 355 ).union( /* hold clamp together */
356 [-1,1].map(function(s) { 356 [-1,1].map(function(s) {
357 return CSG.roundedCube({ 357 return CSG.roundedCube({
358 corner1: [s*(-hhr-e.clamp.margin*2-e.clamp.d),-e.clamp.shell,e.h+e.hinge.e], 358 corner1: [s*(-hhr-e.clamp.margin*2-e.clamp.d),-e.clamp.shell,e.h+e.hinge.e],
359 corner2: [s*(-CONFIG.hotend.ungroove.d/2-PRINT.fit_tolerance),+e.clamp.shell,e.h+e.hinge.e+hhh], 359 corner2: [s*(-CONFIG.hotend.ungroove.d/2-PRINT.fit_tolerance),+e.clamp.shell,e.h+e.hinge.e+hhh],
360 roundradius: 1.5 360 roundradius: 1.5
361 }); 361 });
362 }) 362 })
363 ).subtract( /* screws for holding clamp */ 363 ).subtract( /* screws for holding clamp */
364 [-1,1].map(function(s) { 364 [-1,1].map(function(s) {
365 var nuthole = nut(CONFIG.nut); 365 var nuthole = nut(CONFIG.nut);
366 var x = s*(-hhr-e.clamp.margin-e.clamp.d/2); 366 var x = s*(-hhr-e.clamp.margin-e.clamp.d/2);
367 return CSG.cylinder({ 367 return CSG.cylinder({
368 start: [x,-e.clamp.shell-1,e.h+e.hinge.e+hhh/2], 368 start: [x,-e.clamp.shell-1,e.h+e.hinge.e+hhh/2],
369 end: [x,e.clamp.shell+1,e.h+e.hinge.e+hhh/2], 369 end: [x,e.clamp.shell+1,e.h+e.hinge.e+hhh/2],
370 radius: e.clamp.d/2 370 radius: e.clamp.d/2
371 }).union(nuthole.connectTo( 371 }).union(nuthole.connectTo(
372 nuthole.properties.axis_connector, 372 nuthole.properties.axis_connector,
373 new CSG.Connector([x,e.clamp.shell,e.h+e.hinge.e+hhh/2],[0,-1,0],[0,0,1]), 373 new CSG.Connector([x,e.clamp.shell,e.h+e.hinge.e+hhh/2],[0,-1,0],[0,0,1]),
374 false, 0 374 false, 0
375 )).union(CSG.cylinder({ 375 )).union(CSG.cylinder({
376 start: [x,-e.clamp.shell-1,e.h+e.hinge.e+hhh/2], 376 start: [x,-e.clamp.shell-1,e.h+e.hinge.e+hhh/2],
377 end: [x,0,e.h+e.hinge.e+hhh/2], 377 end: [x,0,e.h+e.hinge.e+hhh/2],
378 radius: e.clamp.d/2+PRINT.slide_tolerance 378 radius: e.clamp.d/2+PRINT.slide_tolerance
379 })); 379 }));
380 }) 380 })
381 ); 381 );
382 var ms = o.microswitch; 382 var ms = o.microswitch;
383 var msedge = o.effector.properties.rcorner; 383 var msedge = o.effector.properties.rcorner;
384 var msh = 9.5; // microswitch holes apart 384 var msh = 9.5; // microswitch holes apart
385 var mshh = Math.abs(ms.properties.switch_connector.point.z-ms.properties.screw_connector[0].point.z); // microswitch holes height 385 var mshh = Math.abs(ms.properties.switch_connector.point.z-ms.properties.screw_connector[0].point.z); // microswitch holes height
386 rv = rv.union(CSG.cube({ // connect clamp with microswitch 386 rv = rv.union(CSG.cube({ // connect clamp with microswitch
387 corner1: [-ms.properties.microswitch.size.x/2,-msedge+.1,e.h+e.hinge.e], 387 corner1: [-ms.properties.microswitch.size.x/2,-msedge+.1,e.h+e.hinge.e],
388 corner2: [+ms.properties.microswitch.size.x/2,-CONFIG.hotend.ungroove.d/2-PRINT.fit_tolerance,e.h+e.hinge.e+hhh] 388 corner2: [+ms.properties.microswitch.size.x/2,-CONFIG.hotend.ungroove.d/2-PRINT.fit_tolerance,e.h+e.hinge.e+hhh]
389 })).union([-msh/2,msh/2].map(function(x) { // shell for microswitch screws 389 })).union([-msh/2,msh/2].map(function(x) { // shell for microswitch screws
390 return CSG.roundedCylinder({ 390 return CSG.roundedCylinder({
391 start: [x,-CONFIG.hotend.ungroove.d/2-PRINT.fit_tolerance-(e.mswitch.screw.d/2+e.mswitch.screw.s),e.h+e.hinge.e+mshh], 391 start: [x,-CONFIG.hotend.ungroove.d/2-PRINT.fit_tolerance-(e.mswitch.screw.d/2+e.mswitch.screw.s),e.h+e.hinge.e+mshh],
392 end: [x,-msedge+ms.properties.microswitch.size.y,e.h+e.hinge.e+mshh], 392 end: [x,-msedge+ms.properties.microswitch.size.y,e.h+e.hinge.e+mshh],
393 radius: e.mswitch.screw.d/2+e.mswitch.screw.s 393 radius: e.mswitch.screw.d/2+e.mswitch.screw.s
394 }); 394 });
395 })).subtract(CSG.cube({ // cut off excess if any 395 })).subtract(CSG.cube({ // cut off excess if any
396 corner1:[-hhr,-msedge+ms.properties.microswitch.size.y,e.h+e.hinge.e-1], 396 corner1:[-hhr,-msedge+ms.properties.microswitch.size.y,e.h+e.hinge.e-1],
397 corner2:[hhr,-msedge-1,e.h+e.hinge.e+hhh+e.mswitch.screw.d+e.mswitch.screw.s+1] 397 corner2:[hhr,-msedge-1,e.h+e.hinge.e+hhh+e.mswitch.screw.d+e.mswitch.screw.s+1]
398 })).subtract([-msh/2,msh/2].map(function(x) { return CSG.roundedCylinder({ // screwholes 398 })).subtract([-msh/2,msh/2].map(function(x) { return CSG.roundedCylinder({ // screwholes
399 start: [x,-CONFIG.hotend.ungroove.d/2-PRINT.fit_tolerance-(e.mswitch.screw.d/2+e.mswitch.screw.s),e.h+e.hinge.e+mshh], 399 start: [x,-CONFIG.hotend.ungroove.d/2-PRINT.fit_tolerance-(e.mswitch.screw.d/2+e.mswitch.screw.s),e.h+e.hinge.e+mshh],
400 end: [x,-msedge+ms.properties.microswitch.size.y,e.h+e.hinge.e+mshh], 400 end: [x,-msedge+ms.properties.microswitch.size.y,e.h+e.hinge.e+mshh],
401 radius: e.mswitch.screw.d/2 401 radius: e.mswitch.screw.d/2
402 })})).subtract(CSG.cylinder({ // pulldown screw 402 })})).subtract(CSG.cylinder({ // pulldown screw
403 start:[0,-msedge+ms.properties.microswitch.size.y+3/2/*XXX:config*/+PRINT.extrusion_width,e.h+e.hinge.e-1], 403 start:[0,-msedge+ms.properties.microswitch.size.y+3/2/*XXX:config*/+PRINT.extrusion_width,e.h+e.hinge.e-1],
404 end:[0,-msedge+ms.properties.microswitch.size.y+3/2/*XXX:config*/+PRINT.extrusion_width,e.h+e.hinge.e+hhh+1], 404 end:[0,-msedge+ms.properties.microswitch.size.y+3/2/*XXX:config*/+PRINT.extrusion_width,e.h+e.hinge.e+hhh+1],
405 radius: 3/2/*XXX:config*/ 405 radius: 3/2/*XXX:config*/
406 })); 406 }));
407 rv.properties.microswitch_screw_connector = new CSG.Properties(); 407 rv.properties.microswitch_screw_connector = new CSG.Properties();
408 [-msh/2,msh/2].forEach(function(x,i) { 408 [-msh/2,msh/2].forEach(function(x,i) {
409 rv.properties.microswitch_screw_connector[i] = new CSG.Connector( 409 rv.properties.microswitch_screw_connector[i] = new CSG.Connector(
410 [x,-msedge,e.h+e.hinge.e+mshh], 410 [x,-msedge,e.h+e.hinge.e+mshh],
411 [0,1,0], [0,0,-1] 411 [0,1,0], [0,0,-1]
412 ); 412 );
413 }); 413 });
414 return rv.setColor([0.3,0.8,0.3,0.9]); 414 return rv.setColor([0.3,0.8,0.3,0.9]);
415 }, 415 },
416 split_hinged: function effector_split_hinged(hinged) { 416 split_hinged: function effector_split_hinged(hinged) {
417 var e = CONFIG.effector; 417 var e = CONFIG.effector;
418 var b = hinged.getBounds(); 418 var b = hinged.getBounds();
419 var ymax = Math.max(Math.abs(b[0].y),Math.abs(b[1].y)); 419 var ymax = Math.max(Math.abs(b[0].y),Math.abs(b[1].y));
420 var zmax = Math.max(b[0].z,b[1].z); 420 var zmax = Math.max(b[0].z,b[1].z);
421 return [-1,1].map(function(s) { 421 return [-1,1].map(function(s) {
422 return hinged.intersect(CSG.cube({ 422 return hinged.intersect(CSG.cube({
423 corner1: [Math.min(b[0].x,b[1].x)-1,s*e.clamp.split/2,-zmax-1], 423 corner1: [Math.min(b[0].x,b[1].x)-1,s*e.clamp.split/2,-zmax-1],
424 corner2: [Math.max(b[0].x,b[1].x)+1,s*(ymax+1),zmax+1] 424 corner2: [Math.max(b[0].x,b[1].x)+1,s*(ymax+1),zmax+1]
425 })); 425 }));
426 }); 426 });
427 }, 427 },
428 fanholder: function effector_fanholder() { 428 fanholder: function effector_fanholder() {
429 var fh = CONFIG.effector.fanholder; 429 var fh = CONFIG.effector.fanholder;
430 var od = fh.screw.d+2*fh.screw.m; 430 var od = fh.screw.d+2*fh.screw.m;
431 return linear_extrude({height:fh.w},hull( 431 return linear_extrude({height:fh.w},hull(
432 CAG.circle({center:[0,-this.rmount],radius:od/2}), 432 CAG.circle({center:[0,-this.rmount],radius:od/2}),
433 CAG.circle({center:[0,-fh.r+od/2+fh.w/2],radius:fh.w/2}) 433 CAG.circle({center:[0,-fh.r+od/2+fh.w/2],radius:fh.w/2})
434 )).translate([0,0,-fh.w]).union( 434 )).translate([0,0,-fh.w]).union(
435 linear_extrude({height:fh.w},hull( 435 linear_extrude({height:fh.w},hull(
436 CAG.circle({center:[fh.w/2,-this.rmount-od/2-fh.w/2],radius:fh.w/2}), 436 CAG.circle({center:[fh.w/2,-this.rmount-od/2-fh.w/2],radius:fh.w/2}),
437 CAG.circle({center:[od/2,-fh.r],radius:od/2}) 437 CAG.circle({center:[od/2,-fh.r],radius:od/2})
438 )).rotateY(90).translate([-fh.w/2,0,0]) 438 )).rotateY(90).translate([-fh.w/2,0,0])
439 ).subtract( CSG.cylinder({ 439 ).subtract( CSG.cylinder({
440 start: [-fh.w,-fh.r,-od/2], 440 start: [-fh.w,-fh.r,-od/2],
441 end: [fh.w,-fh.r,-od/2], 441 end: [fh.w,-fh.r,-od/2],
442 radius: fh.screw.d/2 442 radius: fh.screw.d/2
443 })).subtract( CSG.cylinder({ 443 })).subtract( CSG.cylinder({
444 start: [0,-this.rmount,1], 444 start: [0,-this.rmount,1],
445 end: [0,-this.rmount,-fh.w-1], 445 end: [0,-this.rmount,-fh.w-1],
446 radius: fh.screw.d/2 446 radius: fh.screw.d/2
447 })).setColor([0.3,0.8,0.3,0.9]).rotateZ(-120); 447 })).setColor([0.3,0.8,0.3,0.9]).rotateZ(-120);
448 } 448 }
449}; 449};
450 450
451function columns() { 451function columns() {
452 var rv = [0,1,2].map(function(x) { 452 var rv = [0,1,2].map(function(x) {
453 return union(vector_char(0,0,String.fromCharCode('A'.charCodeAt(0)+x)).segments.map(function(x) { 453 return union(vector_char(0,0,String.fromCharCode('A'.charCodeAt(0)+x)).segments.map(function(x) {
454 return rectangular_extrude(x,{w:2,h:1}); 454 return rectangular_extrude(x,{w:2,h:1});
455 })).center().rotateX(90).translate([0,50,0]).rotateZ(x*120+120); 455 })).center().rotateX(90).translate([0,50,0]).rotateZ(x*120+120);
456 }); 456 });
457 return union(rv); 457 return union(rv);
458} 458}
459 459
460function microswitch() { 460function microswitch() {
461 var screw_connector = new CSG.Properties(); 461 var screw_connector = new CSG.Properties();
462 var rv = CSG.cube({ center:[0,0,2.5],radius: [19.8/2,6/2,10/2] }).union( 462 var rv = CSG.cube({ center:[0,0,2.5],radius: [19.8/2,6/2,10/2] }).union(
463 CSG.cube({ center: [2.5,0.5,6], radius: [2/2,3.5/2,5/2] }) 463 CSG.cube({ center: [2.5,0.5,6], radius: [2/2,3.5/2,5/2] })
464 ).union( 464 ).union(
465 [-8,-1,8].map(function(x) { 465 [-8,-1,8].map(function(x) {
466 return CSG.cube({ center:[x,0,0], radius: [0.6/2,3.2/2,13/2] }) 466 return CSG.cube({ center:[x,0,0], radius: [0.6/2,3.2/2,13/2] })
467 }) 467 })
468 ).subtract( 468 ).subtract(
469 [-9.5/2,9.5/2].map(function(x,i) { 469 [-9.5/2,9.5/2].map(function(x,i) {
470 screw_connector[i] = new CSG.Connector([x,6/2,0],[0,-1,0],[0,0,1]); 470 screw_connector[i] = new CSG.Connector([x,6/2,0],[0,-1,0],[0,0,1]);
471 return CSG.cylinder({ 471 return CSG.cylinder({
472 start: [x,-4,0], end: [x,4,0], 472 start: [x,-4,0], end: [x,4,0],
473 radius: 2/2 473 radius: 2/2
474 }) 474 })
475 }) 475 })
476 ); 476 );
477 rv.properties.switch_connector = new CSG.Connector([2.5,0.5,6+5/2],[0,0,1],[0,-1,0]); 477 rv.properties.switch_connector = new CSG.Connector([2.5,0.5,6+5/2],[0,0,1],[0,-1,0]);
478 rv.properties.screw_connector = screw_connector; 478 rv.properties.screw_connector = screw_connector;
479 rv.properties.microswitch = new CSG.Properties(); 479 rv.properties.microswitch = new CSG.Properties();
480 rv.properties.microswitch.size = new CSG.Vector3D( 480 rv.properties.microswitch.size = new CSG.Vector3D(
481 19.8,6,10 481 19.8,6,10
482 ); 482 );
483 return rv; 483 return rv;
484} 484}
485 485
486var FOURWINDS = [0,90,180,270]; 486var FOURWINDS = [0,90,180,270];
487 487
488var E2020 = { 488var E2020 = {
489 outer: 20, thickness: 1.8, 489 outer: 20, thickness: 1.8,
490 roundius: 1, centerhole: 5, 490 roundius: 1, centerhole: 5,
491 slot_width: 6, 491 slot_width: 6,
492 T: { width: 10, thickness: 1.5, depth: 6.5 }, 492 T: { width: 10, thickness: 1.5, depth: 6.5 },
493 493
494 extrusion: function(o) { 494 extrusion: function(o) {
495 if(!o) o = {}; 495 if(!o) o = {};
496 var e = o.extrusion || this; 496 var e = o.extrusion || this;
497 var l = o.l||5; 497 var l = o.l||5;
498 var iy = e.outer/2-e.T.depth; 498 var iy = e.outer/2-e.T.depth;
499 var ix = e.T.width/2-(e.outer/2-iy-e.thickness-e.T.thickness); 499 var ix = e.T.width/2-(e.outer/2-iy-e.thickness-e.T.thickness);
500 var rv = CAG.roundedRectangle({ 500 var rv = CAG.roundedRectangle({
501 corner1: [-e.outer/2,-e.outer/2], corner2: [e.outer/2,e.outer/2], 501 corner1: [-e.outer/2,-e.outer/2], corner2: [e.outer/2,e.outer/2],
502 roundradius: e.roundius 502 roundradius: e.roundius
503 }).subtract( 503 }).subtract(
504 FOURWINDS.map(function(w) { 504 FOURWINDS.map(function(w) {
505 return CAG.fromPoints([ 505 return CAG.fromPoints([
506 [ e.slot_width/2,e.outer/2+1], 506 [ e.slot_width/2,e.outer/2+1],
507 [ e.slot_width/2,e.outer/2-e.thickness], 507 [ e.slot_width/2,e.outer/2-e.thickness],
508 [ e.T.width/2,e.outer/2-e.thickness], 508 [ e.T.width/2,e.outer/2-e.thickness],
509 [ e.T.width/2,e.outer/2-e.thickness-e.T.thickness], 509 [ e.T.width/2,e.outer/2-e.thickness-e.T.thickness],
510 [ ix, iy ], 510 [ ix, iy ],
511 [ -ix, iy ], 511 [ -ix, iy ],
512 [ -e.T.width/2,e.outer/2-e.thickness-e.T.thickness], 512 [ -e.T.width/2,e.outer/2-e.thickness-e.T.thickness],
513 [ -e.T.width/2,e.outer/2-e.thickness], 513 [ -e.T.width/2,e.outer/2-e.thickness],
514 [ -e.slot_width/2,e.outer/2-e.thickness], 514 [ -e.slot_width/2,e.outer/2-e.thickness],
515 [ -e.slot_width/2,e.outer/2+1], 515 [ -e.slot_width/2,e.outer/2+1],
516 ]).rotateZ(w); 516 ]).rotateZ(w);
517 }) 517 })
518 ).subtract(CAG.circle({ 518 ).subtract(CAG.circle({
519 center: [0,0], radius: e.centerhole/2 519 center: [0,0], radius: e.centerhole/2
520 })).extrude({offset:[0,0,l]}); 520 })).extrude({offset:[0,0,l]});
521 rv.properties.c_top=rv.properties.c_left 521 rv.properties.c_top=rv.properties.c_left
522 = new CSG.Connector([0,0,l],[0,0,-1],[1,0,0]); 522 = new CSG.Connector([0,0,l],[0,0,-1],[1,0,0]);
523 rv.properties.c_bottom=rv.properties.c_right 523 rv.properties.c_bottom=rv.properties.c_right
524 = new CSG.Connector([0,0,0],[0,0,1],[1,0,0]); 524 = new CSG.Connector([0,0,0],[0,0,1],[1,0,0]);
525 rv.properties.c_midway = new CSG.Connector([0,0,l/2],[0,0,1],[1,0,0]); 525 rv.properties.c_midway = new CSG.Connector([0,0,l/2],[0,0,1],[1,0,0]);
526 rv.properties.P = new CSG.Connector([0,0,0],[0,0,1],[1,0,0]); 526 rv.properties.P = new CSG.Connector([0,0,0],[0,0,1],[1,0,0]);
527 rv.properties.vitamin = true; 527 rv.properties.vitamin = true;
528 return rv; 528 return rv;
529 }, 529 },
530 530
531 cap: function extrusion_cap(o) { 531 cap: function extrusion_cap(o) {
532 if(!o) o = {}; 532 if(!o) o = {};
533 var e = o.extrusion || this; 533 var e = o.extrusion || this;
534 var thickness = o.thickness||2, l = o.l||5; 534 var thickness = o.thickness||2, l = o.l||5;
535 var rv = CSG.roundedCube({ 535 var rv = CSG.roundedCube({
536 corner1: [-e.outer/2,-e.outer/2,thickness], 536 corner1: [-e.outer/2,-e.outer/2,thickness],
537 corner2: [e.outer/2,e.outer/2,0], 537 corner2: [e.outer/2,e.outer/2,0],
538 roundradius: [e.roundius,e.roundius,0] 538 roundradius: [e.roundius,e.roundius,0]
539 }); 539 });
540 var fw = [0,90,180,270]; // four winds 540 var fw = [0,90,180,270]; // four winds
541 var iy = e.outer/2-e.T.depth; 541 var iy = e.outer/2-e.T.depth;
542 var ix = e.T.width/2-(e.outer/2-iy-e.thickness-e.T.thickness); 542 var ix = e.T.width/2-(e.outer/2-iy-e.thickness-e.T.thickness);
543 rv = rv.union(fw.map(function(w) { 543 rv = rv.union(fw.map(function(w) {
544 return CAG.fromPoints([ 544 return CAG.fromPoints([
545 [ e.slot_width/2,e.outer/2], 545 [ e.slot_width/2,e.outer/2],
546 [ e.slot_width/2,e.outer/2-e.thickness], 546 [ e.slot_width/2,e.outer/2-e.thickness],
547 [ e.T.width/2,e.outer/2-e.thickness], 547 [ e.T.width/2,e.outer/2-e.thickness],
548 [ e.T.width/2,e.outer/2-e.thickness-e.T.thickness], 548 [ e.T.width/2,e.outer/2-e.thickness-e.T.thickness],
549 [ ix, iy ], 549 [ ix, iy ],
550 [ -ix, iy ], 550 [ -ix, iy ],
551 [ -e.T.width/2,e.outer/2-e.thickness-e.T.thickness], 551 [ -e.T.width/2,e.outer/2-e.thickness-e.T.thickness],
552 [ -e.T.width/2,e.outer/2-e.thickness], 552 [ -e.T.width/2,e.outer/2-e.thickness],
553 [ -e.slot_width/2,e.outer/2-e.thickness], 553 [ -e.slot_width/2,e.outer/2-e.thickness],
554 [ -e.slot_width/2,e.outer/2], 554 [ -e.slot_width/2,e.outer/2],
555 ]).extrude({offset:[0,0,l+thickness]}).rotateZ(w); 555 ]).extrude({offset:[0,0,l+thickness]}).rotateZ(w);
556 })); 556 }));
557 rv.properties.P = new CSG.Connector([0,0,0],[0,0,1],[1,0,0]); 557 rv.properties.P = new CSG.Connector([0,0,0],[0,0,1],[1,0,0]);
558 return rv; 558 return rv;
559 } 559 }
560}; 560};
561 561
562var THREEWINDS = [0,120,240]; 562var THREEWINDS = [0,120,240];
563 563
564function base_sides() { 564function base_sides() {
565 return [0,1].map(function(l) { 565 return [0,1].map(function(l) {
566 return THREEWINDS.map(function(w) { 566 return THREEWINDS.map(function(w) {
567 var e = E2020.extrusion({l:CONFIG.base.el}); 567 var e = E2020.extrusion({l:CONFIG.base.el});
568 e = e.connectTo(e.properties.c_midway, 568 e = e.connectTo(e.properties.c_midway,
569 new CSG.Connector([0,-CD.base.mid_inscription_r,CONFIG.extrusion.w/2],[1,0,0],[0,0,1]), 569 new CSG.Connector([0,-CD.base.mid_inscription_r,CONFIG.extrusion.w/2],[1,0,0],[0,0,1]),
570 false, 0); 570 false, 0);
571 return ( e.translate([0,0,CONFIG.foot.h+l*(CONFIG.extrusion.w+CONFIG.base.gap)]) 571 return ( e.translate([0,0,CONFIG.foot.h+l*(CONFIG.extrusion.w+CONFIG.base.gap)])
572 .rotateZ(w) 572 .rotateZ(w)
573 .setColor(CONFIG.color.extrusion) ); 573 .setColor(CONFIG.color.extrusion) );
574 }); 574 });
575 }); 575 });
576} 576}
577function base_extrusions() { 577function base_extrusions() {
578 var rv = union( base_sides().map(function(x){return union(x)}) ); 578 var rv = union( base_sides().map(function(x){return union(x)}) );
579 rv.properties.P = new CSG.Connector([0,0,0],[0,0,1],[1,0,0]); 579 rv.properties.P = new CSG.Connector([0,0,0],[0,0,1],[1,0,0]);
580 return rv; 580 return rv;
581} 581}
582 582
583function columns() { 583function columns() {
584 return THREEWINDS.map(function(w) { 584 return THREEWINDS.map(function(w) {
585 return (E2020.extrusion({l:CONFIG.column.h}) 585 return (E2020.extrusion({l:CONFIG.column.h})
586 .translate([0,CD.base.column_r,CONFIG.foot.h]) 586 .translate([0,CD.base.column_r,CONFIG.foot.h])
587 .rotateZ(w).setColor(CONFIG.color.extrusion) 587 .rotateZ(w).setColor(CONFIG.color.extrusion)
588 ); 588 );
589 }); 589 });
590} 590}
591function column_extrusions() { 591function column_extrusions() {
592 var rv = union( columns() ); 592 var rv = union( columns() );
593 rv.properties.P = new CSG.Connector([0,0,0],[0,0,1],[1,0,0]); 593 rv.properties.P = new CSG.Connector([0,0,0],[0,0,1],[1,0,0]);
594 return rv; 594 return rv;
595} 595}
596 596
597function duet() { 597function duet() {
598 var C = CONFIG.duet; 598 var C = CONFIG.duet;
599 var pholes = new CSG.Properties(); 599 var pholes = new CSG.Properties();
600 var hx = C.hole_spacing.x/2; 600 var hx = C.hole_spacing.x/2;
601 var hy = C.hole_spacing.y/2; 601 var hy = C.hole_spacing.y/2;
602 var hh = { nw: [-1,1], ne: [1,1], se: [1,-1], sw: [-1,-1] }; 602 var hh = { nw: [-1,1], ne: [1,1], se: [1,-1], sw: [-1,-1] };
603 var holes = []; 603 var holes = [];
604 for(w in hh) { 604 for(w in hh) {
605 var h = hh[w],_x=h[0]*hx,_y=h[1]*hy; 605 var h = hh[w],_x=h[0]*hx,_y=h[1]*hy;
606 holes.push(CSG.cylinder({start:[_x,_y,-1],end:[_x,_y,C.pcb_size.z+1],radius:3/2})); 606 holes.push(CSG.cylinder({start:[_x,_y,-1],end:[_x,_y,C.pcb_size.z+1],radius:3/2}));
607 pholes['c_'+w] = new CSG.Connector([_x,_y,0],[0,0,1],[1,0,0]); 607 pholes['c_'+w] = new CSG.Connector([_x,_y,0],[0,0,1],[1,0,0]);
608 } 608 }
609 rv = CSG.cube({ 609 rv = CSG.cube({
610 corner1: [-C.pcb_size.x/2, -C.pcb_size.y/2, 0], 610 corner1: [-C.pcb_size.x/2, -C.pcb_size.y/2, 0],
611 corner2: [ C.pcb_size.x/2, C.pcb_size.y/2, C.pcb_size.z] 611 corner2: [ C.pcb_size.x/2, C.pcb_size.y/2, C.pcb_size.z]
612 }).subtract(holes).setColor(CONFIG.color.pcb).union( 612 }).subtract(holes).setColor(CONFIG.color.pcb).union(
613 CSG.cube({ 613 CSG.cube({
614 corner1: [-C.pcb_size.x/2,-C.hole_spacing.y/2+3,C.pcb_size.z], 614 corner1: [-C.pcb_size.x/2,-C.hole_spacing.y/2+3,C.pcb_size.z],
615 corner2: [ C.pcb_size.x/2, C.hole_spacing.y/2-3,C.h] 615 corner2: [ C.pcb_size.x/2, C.hole_spacing.y/2-3,C.h]
616 }).setColor(CONFIG.color.bulk) 616 }).setColor(CONFIG.color.bulk)
617 ); 617 );
618 rv.properties.holes = pholes; 618 rv.properties.holes = pholes;
619 rv.properties.P = new CSG.Connector([0,0,0],[0,0,1],[1,0,0]); 619 rv.properties.P = new CSG.Connector([0,0,0],[0,0,1],[1,0,0]);
620 rv.properties.vitamin = true; 620 rv.properties.vitamin = true;
621 return rv; 621 return rv;
622} 622}
623 623
624function foot() { 624function foot() {
625 var F = CONFIG.foot; 625 var F = CONFIG.foot;
626 var br = F.bolt.hd/2+F.margin; 626 var br = F.bolt.hd/2+F.margin;
627 var bh = F.zscalefactor*Math.sqrt(Math.pow(F.d/2,2)-Math.pow(br,2)); 627 var bh = F.zscalefactor*Math.sqrt(Math.pow(F.d/2,2)-Math.pow(br,2));
628 var th = F.h-bh; 628 var th = F.h-bh;
629 var r = 2*F.d; 629 var r = 2*F.d;
630 var rv = CSG.sphere({ // botom contorted sphere 630 var rv = CSG.sphere({ // botom contorted sphere
631 center: [0,0,0], radius: F.d/2, resolution: r 631 center: [0,0,0], radius: F.d/2, resolution: r
632 }).scale([1,1,F.zscalefactor]).translate([0,0,bh]).union(CSG.cylinder({ // top hat 632 }).scale([1,1,F.zscalefactor]).translate([0,0,bh]).union(CSG.cylinder({ // top hat
633 start: [0,0,bh], end: [0,0,F.h], radius: F.d/2, resolution: r 633 start: [0,0,bh], end: [0,0,F.h], radius: F.d/2, resolution: r
634 })).intersect(CSG.cylinder({ // cut off excess 634 })).intersect(CSG.cylinder({ // cut off excess
635 start: [0,0,0], end: [0,0,F.h], radius: F.d 635 start: [0,0,0], end: [0,0,F.h], radius: F.d
636 })).subtract([ 636 })).subtract([
637 CSG.cylinder({ // bolt hole 637 CSG.cylinder({ // bolt hole
638 start: [0,0,-1], end: [0,0,F.h+1], radius: F.bolt.d/2+PRINT.slide_tolerance 638 start: [0,0,-1], end: [0,0,F.h+1], radius: F.bolt.d/2+PRINT.slide_tolerance
639 }), CSG.cylinder({ // nut hole 639 }), CSG.cylinder({ // nut hole
640 start: [0,0,F.h-F.nut.h-PRINT.play_tolerance], 640 start: [0,0,F.h-F.nut.h-PRINT.play_tolerance],
641 end: [0,0,F.h], 641 end: [0,0,F.h],
642 radius: F.nut.d/2+PRINT.slide_tolerance, resolution: 6 642 radius: F.nut.d/2+PRINT.slide_tolerance, resolution: 6
643 }), CSG.cylinder({ // bolthead/washer hole 643 }), CSG.cylinder({ // bolthead/washer hole
644 start: [0,0,-1], end: [0,0,F.h-F.nut.h-PRINT.play_tolerance-F.shell], 644 start: [0,0,-1], end: [0,0,F.h-F.nut.h-PRINT.play_tolerance-F.shell],
645 radius: F.bolt.hd/2+PRINT.play_tolerance 645 radius: F.bolt.hd/2+PRINT.play_tolerance
646 }) 646 })
647 ]).union(CSG.cylinder({ // bridging patch 647 ]).union(CSG.cylinder({ // bridging patch
648 start: [0,0,F.h-F.nut.h-PRINT.play_tolerance-PRINT.layer_height], 648 start: [0,0,F.h-F.nut.h-PRINT.play_tolerance-PRINT.layer_height],
649 end: [0,0,F.h-F.nut.h-PRINT.play_tolerance], 649 end: [0,0,F.h-F.nut.h-PRINT.play_tolerance],
650 radius: F.nut.d/2 650 radius: F.nut.d/2
651 })); 651 }));
652 rv.properties.c_column = new CSG.Connector([0,0,F.h],[0,0,1],[1,0,0]); 652 rv.properties.c_column = new CSG.Connector([0,0,F.h],[0,0,1],[1,0,0]);
653 rv.properties.P = new CSG.Connector([0,0,F.h],[0,0,-1],[1,0,0]); 653 rv.properties.P = new CSG.Connector([0,0,F.h],[0,0,-1],[1,0,0]);
654 return rv.setColor(CONFIG.color.parts); 654 return rv.setColor(CONFIG.color.parts);
655} 655}
656function foot_foot() { 656function foot_foot() {
657 // TODO: connect in the altogethernow? 657 // TODO: connect in the altogethernow?
658 var F = CONFIG.foot; 658 var F = CONFIG.foot;
659 var rv = CSG.cylinder({ 659 var rv = CSG.cylinder({
660 start: [0,0,0], end: [0,0,F.foot.ho], 660 start: [0,0,0], end: [0,0,F.foot.ho],
661 radius: F.bolt.hd/2+F.margin 661 radius: F.bolt.hd/2+F.margin
662 }).union(CSG.cylinder({ 662 }).union(CSG.cylinder({
663 start: [0,0,0], end: [0,0,F.foot.ho+F.foot.hi], 663 start: [0,0,0], end: [0,0,F.foot.ho+F.foot.hi],
664 radius: F.bolt.hd/2+PRINT.play_tolerance-PRINT.fit_tolerance 664 radius: F.bolt.hd/2+PRINT.play_tolerance-PRINT.fit_tolerance
665 })); 665 }));
666 rv.properties.c_foot = new CSG.Connector([0,0,F.foot.ho],[0,0,1],[1,0,0]); 666 rv.properties.c_foot = new CSG.Connector([0,0,F.foot.ho],[0,0,1],[1,0,0]);
667 rv.properties.P = new CSG.Connector([0,0,0],[0,0,1],[1,0,0]); 667 rv.properties.P = new CSG.Connector([0,0,0],[0,0,1],[1,0,0]);
668 return rv.setColor(CONFIG.color.softparts); 668 return rv.setColor(CONFIG.color.softparts);
669} 669}
670 670
671function duetholder() {
672 var DH = CONFIG.duetholder;
673 var DHD = CD.duetholder;
674 var hw = DH.bolt.head.d+2*DH.margin;
675 var s = DH.bolt.l-CONFIG.extrusion.slotdepth+PRINT.play_tolerance*2;
676 var lower = CONFIG.foot.h-2*DH.s;
677 var hl = DHD.distance-CONFIG.extrusion.w;
678 var rv = union([
679 CSG.cube({ // vertical
680 corner1: [-hw/2,s,CONFIG.extrusion.w],
681 corner2: [hw/2,0,-lower]
682 }),
683 CSG.cube({ // horizontal extrusion
684 corner1: [-hw/2,-CONFIG.extrusion.w,0],
685 corner2: [ hw/2,0,-s]
686 }),
687 CSG.cube({ // horizontal
688 corner1: [-hw/2,0,-lower],
689 corner2: [hw/2,hl,-lower+DH.s]
690 }),
691 CSG.cylinder({ // boltend of horizontal part
692 start: [0,hl,-lower], end: [0,hl,-lower+DH.s],
693 radius: hw/2
694 })
695 ]);
696 rv = rv.subtract([
697 CSG.cylinder({ // through vertical
698 start: [0,-1,CONFIG.extrusion.w/2], end: [0,s+1,CONFIG.extrusion.w/2],
699 radius: DH.bolt.d/2+PRINT.slide_tolerance
700 }),
701 CSG.cylinder({ // through horizontal to extrusion
702 start: [0,-CONFIG.extrusion.w/2,-s-1],
703 end: [0,-CONFIG.extrusion.w/2,1],
704 radius: DH.bolt.d/2+PRINT.slide_tolerance
705 }),
706 CSG.cube({ // cut off
707 corner1: [-hw/2-1,-2*s,0],
708 corner2: [hw/2+1,0,-2*s]
709 }).rotateX(45).translate([0,-CONFIG.extrusion.w,0]),
710 CSG.cylinder({ // duet bolt
711 start: [0,hl,-lower], end: [0,hl,-lower+DH.s],
712 radius: DH.bolt.d/2+PRINT.slide_tolerance
713 })
714 ]);
715 var cp = [0,hl,-lower+DH.s];
716 rv.properties.duet = new CSG.Properties();
717 rv.properties.duet.c_sw = new CSG.Connector(cp,[0,0,1],[1,0,0]);
718 rv.properties.duet.c_se = new CSG.Connector(cp,[0,0,1],[1,0,0]);
719 rv.properties.duet.c_ne = new CSG.Connector(cp,[0,0,1],[-Math.cos(Math.PI/3),-Math.sin(Math.PI/3),0]);
720 rv.properties.duet.c_nw = new CSG.Connector(cp,[0,0,1],[-Math.cos(Math.PI/3),Math.sin(Math.PI/3),0]);
721 rv.properties.c_h = new CSG.Connector([0,-CONFIG.extrusion.w/2,0],[0,0,1],[1,0,0]);
722 rv.properties.c_v = new CSG.Connector([0,0,CONFIG.extrusion.w/2],[0,-1,0],[0,0,1]);
723 rv.properties.P = new CSG.Connector([-hw/2,0,0],[1,0,0],[0,1,0]);
724 return rv.setColor(CONFIG.color.parts);
725}
726
671function refaxes(o) { 727function refaxes(o) {
672 if(!o) o = {}; 728 if(!o) o = {};
673 var l = o.l||20, g = o.g||0.7; 729 var l = o.l||20, g = o.g||0.7;
674 return union([ 730 return union([
675 CSG.roundedCylinder({start:[0,0,0],end:[l,0,0]}).setColor([1,0,0,g]), 731 CSG.roundedCylinder({start:[0,0,0],end:[l,0,0]}).setColor([1,0,0,g]),
676 CSG.roundedCylinder({start:[0,0,0],end:[0,l,0]}).setColor([0,1,0,g]), 732 CSG.roundedCylinder({start:[0,0,0],end:[0,l,0]}).setColor([0,1,0,g]),
677 CSG.roundedCylinder({start:[0,0,0],end:[0,0,l]}).setColor([0,0,1,g]) 733 CSG.roundedCylinder({start:[0,0,0],end:[0,0,l]}).setColor([0,0,1,g])
678 ]); 734 ]);
679} 735}
680 736
681function P(x) { 737function P(x) {
682 return x.connectTo(x.properties.P,new CSG.Connector([0,0,0],[0,0,1],[1,0,0]), false, 0); 738 return x.connectTo(x.properties.P,new CSG.Connector([0,0,0],[0,0,1],[1,0,0]), false, 0);
683} 739}
684 740
685var PARTS = { 741var PARTS = {
686 wip: function(params) { 742 wip: function(params) {
687 return foot(); 743 return foot();
688 return union(base_extrusions(),column_extrusions(),duet()); 744 return union(base_extrusions(),column_extrusions(),duet());
689 alltogethernow: function(params) { 745 alltogethernow: function(params) {
690 var cols = columns(); 746 var cols = columns();
691 var sides = base_sides(); 747 var sides = base_sides();
692 var feet = THREEWINDS.map(function(w,i) { 748 var feet = THREEWINDS.map(function(w,i) {
693 var rv = foot(); 749 var rv = foot();
694 rv = rv.connectTo(rv.properties.c_column,cols[i].properties.c_bottom,false,0); 750 rv = rv.connectTo(rv.properties.c_column,cols[i].properties.c_bottom,false,0);
695 return rv; 751 return rv;
696 }); 752 });
697 var rv = union(cols).union(sides.map(union)).union(feet); 753 var rv = union(cols).union(sides.map(union)).union(feet);
698 rv.properties.P = new CSG.Connector([0,0,0],[0,0,1],[1,0,0]); 754 rv.properties.P = new CSG.Connector([0,0,0],[0,0,1],[1,0,0]);
699 return rv; 755 return rv;
700 } 756 }
701}; 757};
702 758
703function main(params) { 759function main(params) {
704 var part = params.part && PARTS[params.part]; 760 var part = params.part && PARTS[params.part];
705 if(!part) return refaxes(); 761 if(!part) return refaxes();
706 var rv = P(part(params)); 762 var rv = P(part(params));
707 if(!params.print) rv = rv.union(refaxes()); 763 if(!params.print) rv = rv.union(refaxes());
708 return rv; 764 return rv;
709} 765}
710 766
711function _main(params) { 767function _main(params) {
712 var e = EFFECTOR.effector(); 768 var e = EFFECTOR.effector();
713 var hs = E3DV6.heatsink(); 769 var hs = E3DV6.heatsink();
714 hs = hs.connectTo(hs.properties.grove_connector,e.properties.grove_connector,false,0); 770 hs = hs.connectTo(hs.properties.grove_connector,e.properties.grove_connector,false,0);
715 var ms = microswitch(); 771 var ms = microswitch();
716 var hd = EFFECTOR.hinged({ 772 var hd = EFFECTOR.hinged({
717 microswitch:ms,effector:e 773 microswitch:ms,effector:e
718 }); 774 });
719 ms = ms.connectTo( 775 ms = ms.connectTo(
720 ms.properties.screw_connector[0], 776 ms.properties.screw_connector[0],
721 hd.properties.microswitch_screw_connector[0], 777 hd.properties.microswitch_screw_connector[0],
722 false, 0); 778 false, 0);
723 var hdhd = EFFECTOR.split_hinged(hd); 779 var hdhd = EFFECTOR.split_hinged(hd);
724 var fh = EFFECTOR.fanholder(); 780 var fh = EFFECTOR.fanholder();
725 return union({ 781 return union({
726 platform: e, 782 platform: e,
727 hinged: hdhd[1], 783 hinged: hdhd[1],
728 clamp: hdhd[0], 784 clamp: hdhd[0],
729 fanholder: fh, 785 fanholder: fh,
730 alltogethernow: [e,hdhd[0],hdhd[1], columns(),hs,ms,fh] 786 alltogethernow: [e,hdhd[0],hdhd[1], columns(),hs,ms,fh]
731 }[params.part||'alltogethernow']) 787 }[params.part||'alltogethernow'])
732 var rv = union( 788 var rv = union(
733 e, 789 e,
734 hs, 790 hs,
735 columns(), 791 columns(),
736 ///hd, 792 ///hd,
737 hdhd[0], hdhd[1], 793 hdhd[0], hdhd[1],
738 ms); 794 ms);
739 return rv; 795 return rv;
740} 796}
741 797
742function getParameterDefinitions() { 798function getParameterDefinitions() {
743 return [{ 799 return [{
744 name: 'part', 800 name: 'part',
745 type: 'choice', 801 type: 'choice',
746 values: [ 802 values: [
747 'platform', 803 'platform',
748 'hinged', 804 'hinged',
749 'clamp', 805 'clamp',
750 'fanholder', 806 'fanholder',
751 'alltogethernow', 807 'alltogethernow',
752 'wip' 808 'wip'
753 ], 809 ],
754 captions: [ 810 captions: [
755 'Effector platform', 811 'Effector platform',
756 'Hinged part', 812 'Hinged part',
757 'Clamp', 813 'Clamp',
758 'Fan holder', 814 'Fan holder',
759 'All together now!', 815 'All together now!',
760 'Work in progress' 816 'Work in progress'
761 ], 817 ],
762 caption: 'Part', 818 caption: 'Part',
763 initial: 'wip' 819 initial: 'wip'
764 },{ 820 },{
765 name: 'print', 821 name: 'print',
766 type: 'checkbox', 822 type: 'checkbox',
767 caption: 'For print, no nonsense', 823 caption: 'For print, no nonsense',
768 initial: false 824 initial: false
769 }]; 825 }];
770} 826}
771 827
772/* vim:set ft=javascript ai: */ 828/* vim:set ft=javascript ai: */