summaryrefslogtreecommitdiffabout
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--delta.jscad25
1 files changed, 15 insertions, 10 deletions
diff --git a/delta.jscad b/delta.jscad
index e6516f9..7dedfab 100644
--- a/delta.jscad
+++ b/delta.jscad
@@ -355,364 +355,369 @@ var EFFECTOR = {
355 nuthole.properties.axis_connector, 355 nuthole.properties.axis_connector,
356 new CSG.Connector([x,e.clamp.shell,e.h+e.hinge.e+hhh/2],[0,-1,0],[0,0,1]), 356 new CSG.Connector([x,e.clamp.shell,e.h+e.hinge.e+hhh/2],[0,-1,0],[0,0,1]),
357 false, 0 357 false, 0
358 )).union(CSG.cylinder({ 358 )).union(CSG.cylinder({
359 start: [x,-e.clamp.shell-1,e.h+e.hinge.e+hhh/2], 359 start: [x,-e.clamp.shell-1,e.h+e.hinge.e+hhh/2],
360 end: [x,0,e.h+e.hinge.e+hhh/2], 360 end: [x,0,e.h+e.hinge.e+hhh/2],
361 radius: e.clamp.d/2+PRINT.slide_tolerance 361 radius: e.clamp.d/2+PRINT.slide_tolerance
362 })); 362 }));
363 }) 363 })
364 ); 364 );
365 var ms = o.microswitch; 365 var ms = o.microswitch;
366 var msedge = o.effector.properties.rcorner; 366 var msedge = o.effector.properties.rcorner;
367 var msh = 9.5; // microswitch holes apart 367 var msh = 9.5; // microswitch holes apart
368 var mshh = Math.abs(ms.properties.switch_connector.point.z-ms.properties.screw_connector[0].point.z); // microswitch holes height 368 var mshh = Math.abs(ms.properties.switch_connector.point.z-ms.properties.screw_connector[0].point.z); // microswitch holes height
369 rv = rv.union(CSG.cube({ // connect clamp with microswitch 369 rv = rv.union(CSG.cube({ // connect clamp with microswitch
370 corner1: [-ms.properties.microswitch.size.x/2,-msedge+.1,e.h+e.hinge.e], 370 corner1: [-ms.properties.microswitch.size.x/2,-msedge+.1,e.h+e.hinge.e],
371 corner2: [+ms.properties.microswitch.size.x/2,-CONFIG.hotend.ungroove.d/2-PRINT.fit_tolerance,e.h+e.hinge.e+hhh] 371 corner2: [+ms.properties.microswitch.size.x/2,-CONFIG.hotend.ungroove.d/2-PRINT.fit_tolerance,e.h+e.hinge.e+hhh]
372 })).union([-msh/2,msh/2].map(function(x) { // shell for microswitch screws 372 })).union([-msh/2,msh/2].map(function(x) { // shell for microswitch screws
373 return CSG.roundedCylinder({ 373 return CSG.roundedCylinder({
374 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], 374 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],
375 end: [x,-msedge+ms.properties.microswitch.size.y,e.h+e.hinge.e+mshh], 375 end: [x,-msedge+ms.properties.microswitch.size.y,e.h+e.hinge.e+mshh],
376 radius: e.mswitch.screw.d/2+e.mswitch.screw.s 376 radius: e.mswitch.screw.d/2+e.mswitch.screw.s
377 }); 377 });
378 })).subtract(CSG.cube({ // cut off excess if any 378 })).subtract(CSG.cube({ // cut off excess if any
379 corner1:[-hhr,-msedge+ms.properties.microswitch.size.y,e.h+e.hinge.e-1], 379 corner1:[-hhr,-msedge+ms.properties.microswitch.size.y,e.h+e.hinge.e-1],
380 corner2:[hhr,-msedge-1,e.h+e.hinge.e+hhh+e.mswitch.screw.d+e.mswitch.screw.s+1] 380 corner2:[hhr,-msedge-1,e.h+e.hinge.e+hhh+e.mswitch.screw.d+e.mswitch.screw.s+1]
381 })).subtract([-msh/2,msh/2].map(function(x) { return CSG.roundedCylinder({ // screwholes 381 })).subtract([-msh/2,msh/2].map(function(x) { return CSG.roundedCylinder({ // screwholes
382 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], 382 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],
383 end: [x,-msedge+ms.properties.microswitch.size.y,e.h+e.hinge.e+mshh], 383 end: [x,-msedge+ms.properties.microswitch.size.y,e.h+e.hinge.e+mshh],
384 radius: e.mswitch.screw.d/2 384 radius: e.mswitch.screw.d/2
385 })})).subtract(CSG.cylinder({ // pulldown screw 385 })})).subtract(CSG.cylinder({ // pulldown screw
386 start:[0,-msedge+ms.properties.microswitch.size.y+3/2/*XXX:config*/+PRINT.extrusion_width,e.h+e.hinge.e-1], 386 start:[0,-msedge+ms.properties.microswitch.size.y+3/2/*XXX:config*/+PRINT.extrusion_width,e.h+e.hinge.e-1],
387 end:[0,-msedge+ms.properties.microswitch.size.y+3/2/*XXX:config*/+PRINT.extrusion_width,e.h+e.hinge.e+hhh+1], 387 end:[0,-msedge+ms.properties.microswitch.size.y+3/2/*XXX:config*/+PRINT.extrusion_width,e.h+e.hinge.e+hhh+1],
388 radius: 3/2/*XXX:config*/ 388 radius: 3/2/*XXX:config*/
389 })); 389 }));
390 rv.properties.microswitch_screw_connector = new CSG.Properties(); 390 rv.properties.microswitch_screw_connector = new CSG.Properties();
391 [-msh/2,msh/2].forEach(function(x,i) { 391 [-msh/2,msh/2].forEach(function(x,i) {
392 rv.properties.microswitch_screw_connector[i] = new CSG.Connector( 392 rv.properties.microswitch_screw_connector[i] = new CSG.Connector(
393 [x,-msedge,e.h+e.hinge.e+mshh], 393 [x,-msedge,e.h+e.hinge.e+mshh],
394 [0,1,0], [0,0,-1] 394 [0,1,0], [0,0,-1]
395 ); 395 );
396 }); 396 });
397 return rv.setColor([0.3,0.8,0.3,0.9]); 397 return rv.setColor([0.3,0.8,0.3,0.9]);
398 }, 398 },
399 split_hinged: function effector_split_hinged(hinged) { 399 split_hinged: function effector_split_hinged(hinged) {
400 var e = CONFIG.effector; 400 var e = CONFIG.effector;
401 var b = hinged.getBounds(); 401 var b = hinged.getBounds();
402 var ymax = Math.max(Math.abs(b[0].y),Math.abs(b[1].y)); 402 var ymax = Math.max(Math.abs(b[0].y),Math.abs(b[1].y));
403 var zmax = Math.max(b[0].z,b[1].z); 403 var zmax = Math.max(b[0].z,b[1].z);
404 return [-1,1].map(function(s) { 404 return [-1,1].map(function(s) {
405 return hinged.intersect(CSG.cube({ 405 return hinged.intersect(CSG.cube({
406 corner1: [Math.min(b[0].x,b[1].x)-1,s*e.clamp.split/2,-zmax-1], 406 corner1: [Math.min(b[0].x,b[1].x)-1,s*e.clamp.split/2,-zmax-1],
407 corner2: [Math.max(b[0].x,b[1].x)+1,s*(ymax+1),zmax+1] 407 corner2: [Math.max(b[0].x,b[1].x)+1,s*(ymax+1),zmax+1]
408 })); 408 }));
409 }); 409 });
410 }, 410 },
411 fanholder: function effector_fanholder() { 411 fanholder: function effector_fanholder() {
412 var fh = CONFIG.effector.fanholder; 412 var fh = CONFIG.effector.fanholder;
413 var od = fh.screw.d+2*fh.screw.m; 413 var od = fh.screw.d+2*fh.screw.m;
414 return linear_extrude({height:fh.w},hull( 414 return linear_extrude({height:fh.w},hull(
415 CAG.circle({center:[0,-this.rmount],radius:od/2}), 415 CAG.circle({center:[0,-this.rmount],radius:od/2}),
416 CAG.circle({center:[0,-fh.r+od/2+fh.w/2],radius:fh.w/2}) 416 CAG.circle({center:[0,-fh.r+od/2+fh.w/2],radius:fh.w/2})
417 )).translate([0,0,-fh.w]).union( 417 )).translate([0,0,-fh.w]).union(
418 linear_extrude({height:fh.w},hull( 418 linear_extrude({height:fh.w},hull(
419 CAG.circle({center:[fh.w/2,-this.rmount-od/2-fh.w/2],radius:fh.w/2}), 419 CAG.circle({center:[fh.w/2,-this.rmount-od/2-fh.w/2],radius:fh.w/2}),
420 CAG.circle({center:[od/2,-fh.r],radius:od/2}) 420 CAG.circle({center:[od/2,-fh.r],radius:od/2})
421 )).rotateY(90).translate([-fh.w/2,0,0]) 421 )).rotateY(90).translate([-fh.w/2,0,0])
422 ).subtract( CSG.cylinder({ 422 ).subtract( CSG.cylinder({
423 start: [-fh.w,-fh.r,-od/2], 423 start: [-fh.w,-fh.r,-od/2],
424 end: [fh.w,-fh.r,-od/2], 424 end: [fh.w,-fh.r,-od/2],
425 radius: fh.screw.d/2 425 radius: fh.screw.d/2
426 })).subtract( CSG.cylinder({ 426 })).subtract( CSG.cylinder({
427 start: [0,-this.rmount,1], 427 start: [0,-this.rmount,1],
428 end: [0,-this.rmount,-fh.w-1], 428 end: [0,-this.rmount,-fh.w-1],
429 radius: fh.screw.d/2 429 radius: fh.screw.d/2
430 })).setColor([0.3,0.8,0.3,0.9]).rotateZ(-120); 430 })).setColor([0.3,0.8,0.3,0.9]).rotateZ(-120);
431 } 431 }
432}; 432};
433 433
434function columns() { 434function columns() {
435 var rv = [0,1,2].map(function(x) { 435 var rv = [0,1,2].map(function(x) {
436 return union(vector_char(0,0,String.fromCharCode('A'.charCodeAt(0)+x)).segments.map(function(x) { 436 return union(vector_char(0,0,String.fromCharCode('A'.charCodeAt(0)+x)).segments.map(function(x) {
437 return rectangular_extrude(x,{w:2,h:1}); 437 return rectangular_extrude(x,{w:2,h:1});
438 })).center().rotateX(90).translate([0,50,0]).rotateZ(x*120+120); 438 })).center().rotateX(90).translate([0,50,0]).rotateZ(x*120+120);
439 }); 439 });
440 return union(rv); 440 return union(rv);
441} 441}
442 442
443function microswitch() { 443function microswitch() {
444 var screw_connector = new CSG.Properties(); 444 var screw_connector = new CSG.Properties();
445 var rv = CSG.cube({ center:[0,0,2.5],radius: [19.8/2,6/2,10/2] }).union( 445 var rv = CSG.cube({ center:[0,0,2.5],radius: [19.8/2,6/2,10/2] }).union(
446 CSG.cube({ center: [2.5,0.5,6], radius: [2/2,3.5/2,5/2] }) 446 CSG.cube({ center: [2.5,0.5,6], radius: [2/2,3.5/2,5/2] })
447 ).union( 447 ).union(
448 [-8,-1,8].map(function(x) { 448 [-8,-1,8].map(function(x) {
449 return CSG.cube({ center:[x,0,0], radius: [0.6/2,3.2/2,13/2] }) 449 return CSG.cube({ center:[x,0,0], radius: [0.6/2,3.2/2,13/2] })
450 }) 450 })
451 ).subtract( 451 ).subtract(
452 [-9.5/2,9.5/2].map(function(x,i) { 452 [-9.5/2,9.5/2].map(function(x,i) {
453 screw_connector[i] = new CSG.Connector([x,6/2,0],[0,-1,0],[0,0,1]); 453 screw_connector[i] = new CSG.Connector([x,6/2,0],[0,-1,0],[0,0,1]);
454 return CSG.cylinder({ 454 return CSG.cylinder({
455 start: [x,-4,0], end: [x,4,0], 455 start: [x,-4,0], end: [x,4,0],
456 radius: 2/2 456 radius: 2/2
457 }) 457 })
458 }) 458 })
459 ); 459 );
460 rv.properties.switch_connector = new CSG.Connector([2.5,0.5,6+5/2],[0,0,1],[0,-1,0]); 460 rv.properties.switch_connector = new CSG.Connector([2.5,0.5,6+5/2],[0,0,1],[0,-1,0]);
461 rv.properties.screw_connector = screw_connector; 461 rv.properties.screw_connector = screw_connector;
462 rv.properties.microswitch = new CSG.Properties(); 462 rv.properties.microswitch = new CSG.Properties();
463 rv.properties.microswitch.size = new CSG.Vector3D( 463 rv.properties.microswitch.size = new CSG.Vector3D(
464 19.8,6,10 464 19.8,6,10
465 ); 465 );
466 return rv; 466 return rv;
467} 467}
468 468
469var FOURWINDS = [0,90,180,270]; 469var FOURWINDS = [0,90,180,270];
470 470
471var E2020 = { 471var E2020 = {
472 outer: 20, thickness: 1.8, 472 outer: 20, thickness: 1.8,
473 roundius: 1, centerhole: 5, 473 roundius: 1, centerhole: 5,
474 slot_width: 6, 474 slot_width: 6,
475 T: { width: 10, thickness: 1.5, depth: 6.5 }, 475 T: { width: 10, thickness: 1.5, depth: 6.5 },
476 476
477 extrusion: function(o) { 477 extrusion: function(o) {
478 if(!o) o = {}; 478 if(!o) o = {};
479 var e = o.extrusion || this; 479 var e = o.extrusion || this;
480 var l = o.l||5; 480 var l = o.l||5;
481 var iy = e.outer/2-e.T.depth; 481 var iy = e.outer/2-e.T.depth;
482 var ix = e.T.width/2-(e.outer/2-iy-e.thickness-e.T.thickness); 482 var ix = e.T.width/2-(e.outer/2-iy-e.thickness-e.T.thickness);
483 var rv = CAG.roundedRectangle({ 483 var rv = CAG.roundedRectangle({
484 corner1: [-e.outer/2,-e.outer/2], corner2: [e.outer/2,e.outer/2], 484 corner1: [-e.outer/2,-e.outer/2], corner2: [e.outer/2,e.outer/2],
485 roundradius: e.roundius 485 roundradius: e.roundius
486 }).subtract( 486 }).subtract(
487 FOURWINDS.map(function(w) { 487 FOURWINDS.map(function(w) {
488 return CAG.fromPoints([ 488 return CAG.fromPoints([
489 [ e.slot_width/2,e.outer/2+1], 489 [ e.slot_width/2,e.outer/2+1],
490 [ e.slot_width/2,e.outer/2-e.thickness], 490 [ e.slot_width/2,e.outer/2-e.thickness],
491 [ e.T.width/2,e.outer/2-e.thickness], 491 [ e.T.width/2,e.outer/2-e.thickness],
492 [ e.T.width/2,e.outer/2-e.thickness-e.T.thickness], 492 [ e.T.width/2,e.outer/2-e.thickness-e.T.thickness],
493 [ ix, iy ], 493 [ ix, iy ],
494 [ -ix, iy ], 494 [ -ix, iy ],
495 [ -e.T.width/2,e.outer/2-e.thickness-e.T.thickness], 495 [ -e.T.width/2,e.outer/2-e.thickness-e.T.thickness],
496 [ -e.T.width/2,e.outer/2-e.thickness], 496 [ -e.T.width/2,e.outer/2-e.thickness],
497 [ -e.slot_width/2,e.outer/2-e.thickness], 497 [ -e.slot_width/2,e.outer/2-e.thickness],
498 [ -e.slot_width/2,e.outer/2+1], 498 [ -e.slot_width/2,e.outer/2+1],
499 ]).rotateZ(w); 499 ]).rotateZ(w);
500 }) 500 })
501 ).subtract(CAG.circle({ 501 ).subtract(CAG.circle({
502 center: [0,0], radius: e.centerhole/2 502 center: [0,0], radius: e.centerhole/2
503 })).extrude({offset:[0,0,l]}); 503 })).extrude({offset:[0,0,l]});
504 rv.properties.c_top=rv.properties.c_left 504 rv.properties.c_top=rv.properties.c_left
505 = new CSG.Connector([0,0,l],[0,0,-1],[1,0,0]); 505 = new CSG.Connector([0,0,l],[0,0,-1],[1,0,0]);
506 rv.properties.c_bottom=rv.properties.c_right 506 rv.properties.c_bottom=rv.properties.c_right
507 = new CSG.Connector([0,0,0],[0,0,1],[1,0,0]); 507 = new CSG.Connector([0,0,0],[0,0,1],[1,0,0]);
508 rv.properties.c_midway = new CSG.Connector([0,0,l/2],[0,0,1],[1,0,0]); 508 rv.properties.c_midway = new CSG.Connector([0,0,l/2],[0,0,1],[1,0,0]);
509 rv.properties.P = new CSG.Connector([0,0,0],[0,0,1],[1,0,0]); 509 rv.properties.P = new CSG.Connector([0,0,0],[0,0,1],[1,0,0]);
510 rv.properties.vitamin = true; 510 rv.properties.vitamin = true;
511 return rv; 511 return rv;
512 }, 512 },
513 513
514 cap: function extrusion_cap(o) { 514 cap: function extrusion_cap(o) {
515 if(!o) o = {}; 515 if(!o) o = {};
516 var e = o.extrusion || this; 516 var e = o.extrusion || this;
517 var thickness = o.thickness||2, l = o.l||5; 517 var thickness = o.thickness||2, l = o.l||5;
518 var rv = CSG.roundedCube({ 518 var rv = CSG.roundedCube({
519 corner1: [-e.outer/2,-e.outer/2,thickness], 519 corner1: [-e.outer/2,-e.outer/2,thickness],
520 corner2: [e.outer/2,e.outer/2,0], 520 corner2: [e.outer/2,e.outer/2,0],
521 roundradius: [e.roundius,e.roundius,0] 521 roundradius: [e.roundius,e.roundius,0]
522 }); 522 });
523 var fw = [0,90,180,270]; // four winds 523 var fw = [0,90,180,270]; // four winds
524 var iy = e.outer/2-e.T.depth; 524 var iy = e.outer/2-e.T.depth;
525 var ix = e.T.width/2-(e.outer/2-iy-e.thickness-e.T.thickness); 525 var ix = e.T.width/2-(e.outer/2-iy-e.thickness-e.T.thickness);
526 rv = rv.union(fw.map(function(w) { 526 rv = rv.union(fw.map(function(w) {
527 return CAG.fromPoints([ 527 return CAG.fromPoints([
528 [ e.slot_width/2,e.outer/2], 528 [ e.slot_width/2,e.outer/2],
529 [ e.slot_width/2,e.outer/2-e.thickness], 529 [ e.slot_width/2,e.outer/2-e.thickness],
530 [ e.T.width/2,e.outer/2-e.thickness], 530 [ e.T.width/2,e.outer/2-e.thickness],
531 [ e.T.width/2,e.outer/2-e.thickness-e.T.thickness], 531 [ e.T.width/2,e.outer/2-e.thickness-e.T.thickness],
532 [ ix, iy ], 532 [ ix, iy ],
533 [ -ix, iy ], 533 [ -ix, iy ],
534 [ -e.T.width/2,e.outer/2-e.thickness-e.T.thickness], 534 [ -e.T.width/2,e.outer/2-e.thickness-e.T.thickness],
535 [ -e.T.width/2,e.outer/2-e.thickness], 535 [ -e.T.width/2,e.outer/2-e.thickness],
536 [ -e.slot_width/2,e.outer/2-e.thickness], 536 [ -e.slot_width/2,e.outer/2-e.thickness],
537 [ -e.slot_width/2,e.outer/2], 537 [ -e.slot_width/2,e.outer/2],
538 ]).extrude({offset:[0,0,l+thickness]}).rotateZ(w); 538 ]).extrude({offset:[0,0,l+thickness]}).rotateZ(w);
539 })); 539 }));
540 rv.properties.P = new CSG.Connector([0,0,0],[0,0,1],[1,0,0]); 540 rv.properties.P = new CSG.Connector([0,0,0],[0,0,1],[1,0,0]);
541 return rv; 541 return rv;
542 } 542 }
543}; 543};
544 544
545var THREEWINDS = [0,120,240]; 545var THREEWINDS = [0,120,240];
546 546
547function base_sides() {
548 return [0,1].map(function(l) {
549 return THREEWINDS.map(function(w) {
550 var e = E2020.extrusion({l:CONFIG.base.el});
551 e = e.connectTo(e.properties.c_midway,
552 new CSG.Connector([0,-CD.base.mid_inscription_r,CONFIG.extrusion.w/2],[1,0,0],[0,0,1]),
553 false, 0);
554 return ( e.translate([0,0,CONFIG.foot.h+l*(CONFIG.extrusion.w+CONFIG.base.gap)])
555 .rotateZ(w)
556 .setColor(CONFIG.color.extrusion) );
557 });
558 });
559}
547function base_extrusions() { 560function base_extrusions() {
548 var rv = union( THREEWINDS.map(function(w) { 561 var rv = union( base_sides().map(function(x){return union(x)}) );
549 var e = E2020.extrusion({l:CONFIG.base.el});
550 e = e.connectTo(e.properties.c_midway,
551 new CSG.Connector([0,-CD.base.mid_inscription_r,CONFIG.extrusion.w/2],[1,0,0],[0,0,1]),
552 false, 0);
553 return union( [0,CONFIG.extrusion.w+CONFIG.base.gap].map(function(z) {
554 return e.translate([0,0,z]);
555 }) ).rotateZ(w);
556 }) );
557 rv.properties.P = new CSG.Connector([0,0,0],[0,0,1],[1,0,0]); 562 rv.properties.P = new CSG.Connector([0,0,0],[0,0,1],[1,0,0]);
558 return rv.setColor(CONFIG.color.extrusion); 563 return rv;
559} 564}
560 565
561function column_extrusions() { 566function column_extrusions() {
562 var rv = union( THREEWINDS.map(function(w) { 567 var rv = union( THREEWINDS.map(function(w) {
563 return E2020.extrusion({l:CONFIG.column.h}).translate([0,CD.base.column_r,0]).rotateZ(w); 568 return E2020.extrusion({l:CONFIG.column.h}).translate([0,CD.base.column_r,0]).rotateZ(w);
564 }) ); 569 }) );
565 rv.properties.P = new CSG.Connector([0,0,0],[0,0,1],[1,0,0]); 570 rv.properties.P = new CSG.Connector([0,0,0],[0,0,1],[1,0,0]);
566 return rv.setColor(CONFIG.color.extrusion); 571 return rv.setColor(CONFIG.color.extrusion);
567} 572}
568 573
569function duet() { 574function duet() {
570 var C = CONFIG.duet; 575 var C = CONFIG.duet;
571 var pholes = new CSG.Properties(); 576 var pholes = new CSG.Properties();
572 var hx = C.hole_spacing.x/2; 577 var hx = C.hole_spacing.x/2;
573 var hy = C.hole_spacing.y/2; 578 var hy = C.hole_spacing.y/2;
574 var hh = { nw: [1,-1], ne: [1,1], se: [-1,1], sw: [-1,-1] }; 579 var hh = { nw: [1,-1], ne: [1,1], se: [-1,1], sw: [-1,-1] };
575 var holes = []; 580 var holes = [];
576 for(w in hh) { 581 for(w in hh) {
577 var h = hh[w],_x=h[0]*hx,_y=h[1]*hy; 582 var h = hh[w],_x=h[0]*hx,_y=h[1]*hy;
578 holes.push(CSG.cylinder({start:[_x,_y,-1],end:[_x,_y,C.pcb_size.z+1],radius:3/2})); 583 holes.push(CSG.cylinder({start:[_x,_y,-1],end:[_x,_y,C.pcb_size.z+1],radius:3/2}));
579 pholes['c_'+w] = new CSG.Connector([_x,_y,0],[0,0,1],[1,0,0]); 584 pholes['c_'+w] = new CSG.Connector([_x,_y,0],[0,0,1],[1,0,0]);
580 } 585 }
581 rv = CSG.cube({ 586 rv = CSG.cube({
582 corner1: [-C.pcb_size.x/2, -C.pcb_size.y/2, 0], 587 corner1: [-C.pcb_size.x/2, -C.pcb_size.y/2, 0],
583 corner2: [ C.pcb_size.x/2, C.pcb_size.y/2, C.pcb_size.z] 588 corner2: [ C.pcb_size.x/2, C.pcb_size.y/2, C.pcb_size.z]
584 }).subtract(holes).setColor(CONFIG.color.pcb).union( 589 }).subtract(holes).setColor(CONFIG.color.pcb).union(
585 CSG.cube({ 590 CSG.cube({
586 corner1: [-C.pcb_size.x/2,-C.hole_spacing.y/2+3,C.pcb_size.z], 591 corner1: [-C.pcb_size.x/2,-C.hole_spacing.y/2+3,C.pcb_size.z],
587 corner2: [ C.pcb_size.x/2, C.hole_spacing.y/2-3,C.h] 592 corner2: [ C.pcb_size.x/2, C.hole_spacing.y/2-3,C.h]
588 }).setColor(CONFIG.color.bulk) 593 }).setColor(CONFIG.color.bulk)
589 ); 594 );
590 rv.properties.holes = pholes; 595 rv.properties.holes = pholes;
591 rv.properties.P = new CSG.Connector([0,0,0],[0,0,1],[1,0,0]); 596 rv.properties.P = new CSG.Connector([0,0,0],[0,0,1],[1,0,0]);
592 rv.properties.vitamin = true; 597 rv.properties.vitamin = true;
593 return rv; 598 return rv;
594} 599}
595 600
596function foot() { 601function foot() {
597 var F = CONFIG.foot; 602 var F = CONFIG.foot;
598 var br = F.bolt.hd/2+F.margin; 603 var br = F.bolt.hd/2+F.margin;
599 var bh = F.zscalefactor*Math.sqrt(Math.pow(F.d/2,2)-Math.pow(br,2)); 604 var bh = F.zscalefactor*Math.sqrt(Math.pow(F.d/2,2)-Math.pow(br,2));
600 var th = F.h-bh; 605 var th = F.h-bh;
601 var r = 2*F.d; 606 var r = 2*F.d;
602 var rv = CSG.sphere({ // botom contorted sphere 607 var rv = CSG.sphere({ // botom contorted sphere
603 center: [0,0,0], radius: F.d/2, resolution: r 608 center: [0,0,0], radius: F.d/2, resolution: r
604 }).scale([1,1,F.zscalefactor]).translate([0,0,bh]).union(CSG.cylinder({ // top hat 609 }).scale([1,1,F.zscalefactor]).translate([0,0,bh]).union(CSG.cylinder({ // top hat
605 start: [0,0,bh], end: [0,0,F.h], radius: F.d/2, resolution: r 610 start: [0,0,bh], end: [0,0,F.h], radius: F.d/2, resolution: r
606 })).intersect(CSG.cylinder({ // cut off excess 611 })).intersect(CSG.cylinder({ // cut off excess
607 start: [0,0,0], end: [0,0,F.h], radius: F.d 612 start: [0,0,0], end: [0,0,F.h], radius: F.d
608 })).subtract([ 613 })).subtract([
609 CSG.cylinder({ // bolt hole 614 CSG.cylinder({ // bolt hole
610 start: [0,0,-1], end: [0,0,F.h+1], radius: F.bolt.d/2+PRINT.slide_tolerance 615 start: [0,0,-1], end: [0,0,F.h+1], radius: F.bolt.d/2+PRINT.slide_tolerance
611 }), CSG.cylinder({ // nut hole 616 }), CSG.cylinder({ // nut hole
612 start: [0,0,F.h-F.nut.h-PRINT.play_tolerance], 617 start: [0,0,F.h-F.nut.h-PRINT.play_tolerance],
613 end: [0,0,F.h], 618 end: [0,0,F.h],
614 radius: F.nut.d/2+PRINT.slide_tolerance, resolution: 6 619 radius: F.nut.d/2+PRINT.slide_tolerance, resolution: 6
615 }), CSG.cylinder({ // bolthead/washer hole 620 }), CSG.cylinder({ // bolthead/washer hole
616 start: [0,0,-1], end: [0,0,F.h-F.nut.h-PRINT.play_tolerance-F.shell], 621 start: [0,0,-1], end: [0,0,F.h-F.nut.h-PRINT.play_tolerance-F.shell],
617 radius: F.bolt.hd/2+PRINT.play_tolerance 622 radius: F.bolt.hd/2+PRINT.play_tolerance
618 }) 623 })
619 ]).union(CSG.cylinder({ // bridging patch 624 ]).union(CSG.cylinder({ // bridging patch
620 start: [0,0,F.h-F.nut.h-PRINT.play_tolerance-PRINT.layer_height], 625 start: [0,0,F.h-F.nut.h-PRINT.play_tolerance-PRINT.layer_height],
621 end: [0,0,F.h-F.nut.h-PRINT.play_tolerance], 626 end: [0,0,F.h-F.nut.h-PRINT.play_tolerance],
622 radius: F.nut.d/2 627 radius: F.nut.d/2
623 })); 628 }));
624 rv.properties.P = new CSG.Connector([0,0,F.h],[0,0,-1],[1,0,0]); 629 rv.properties.P = new CSG.Connector([0,0,F.h],[0,0,-1],[1,0,0]);
625 return rv.setColor(CONFIG.color.parts); 630 return rv.setColor(CONFIG.color.parts);
626} 631}
627 632
628function refaxes(o) { 633function refaxes(o) {
629 if(!o) o = {}; 634 if(!o) o = {};
630 var l = o.l||20, g = o.g||0.7; 635 var l = o.l||20, g = o.g||0.7;
631 return union([ 636 return union([
632 CSG.roundedCylinder({start:[0,0,0],end:[l,0,0]}).setColor([1,0,0,g]), 637 CSG.roundedCylinder({start:[0,0,0],end:[l,0,0]}).setColor([1,0,0,g]),
633 CSG.roundedCylinder({start:[0,0,0],end:[0,l,0]}).setColor([0,1,0,g]), 638 CSG.roundedCylinder({start:[0,0,0],end:[0,l,0]}).setColor([0,1,0,g]),
634 CSG.roundedCylinder({start:[0,0,0],end:[0,0,l]}).setColor([0,0,1,g]) 639 CSG.roundedCylinder({start:[0,0,0],end:[0,0,l]}).setColor([0,0,1,g])
635 ]); 640 ]);
636} 641}
637 642
638function P(x) { 643function P(x) {
639 return x.connectTo(x.properties.P,new CSG.Connector([0,0,0],[0,0,1],[1,0,0]), false, 0); 644 return x.connectTo(x.properties.P,new CSG.Connector([0,0,0],[0,0,1],[1,0,0]), false, 0);
640} 645}
641 646
642var PARTS = { 647var PARTS = {
643 wip: function(params) { 648 wip: function(params) {
644 return foot(); 649 return foot();
645 return union(base_extrusions(),column_extrusions(),duet()); 650 return union(base_extrusions(),column_extrusions(),duet());
646 } 651 }
647}; 652};
648 653
649function main(params) { 654function main(params) {
650 var part = params.part && PARTS[params.part]; 655 var part = params.part && PARTS[params.part];
651 if(!part) return refaxes(); 656 if(!part) return refaxes();
652 var rv = P(part(params)); 657 var rv = P(part(params));
653 if(!params.print) rv = rv.union(refaxes()); 658 if(!params.print) rv = rv.union(refaxes());
654 return rv; 659 return rv;
655} 660}
656 661
657function _main(params) { 662function _main(params) {
658 var e = EFFECTOR.effector(); 663 var e = EFFECTOR.effector();
659 var hs = E3DV6.heatsink(); 664 var hs = E3DV6.heatsink();
660 hs = hs.connectTo(hs.properties.grove_connector,e.properties.grove_connector,false,0); 665 hs = hs.connectTo(hs.properties.grove_connector,e.properties.grove_connector,false,0);
661 var ms = microswitch(); 666 var ms = microswitch();
662 var hd = EFFECTOR.hinged({ 667 var hd = EFFECTOR.hinged({
663 microswitch:ms,effector:e 668 microswitch:ms,effector:e
664 }); 669 });
665 ms = ms.connectTo( 670 ms = ms.connectTo(
666 ms.properties.screw_connector[0], 671 ms.properties.screw_connector[0],
667 hd.properties.microswitch_screw_connector[0], 672 hd.properties.microswitch_screw_connector[0],
668 false, 0); 673 false, 0);
669 var hdhd = EFFECTOR.split_hinged(hd); 674 var hdhd = EFFECTOR.split_hinged(hd);
670 var fh = EFFECTOR.fanholder(); 675 var fh = EFFECTOR.fanholder();
671 return union({ 676 return union({
672 platform: e, 677 platform: e,
673 hinged: hdhd[1], 678 hinged: hdhd[1],
674 clamp: hdhd[0], 679 clamp: hdhd[0],
675 fanholder: fh, 680 fanholder: fh,
676 alltogethernow: [e,hdhd[0],hdhd[1], columns(),hs,ms,fh] 681 alltogethernow: [e,hdhd[0],hdhd[1], columns(),hs,ms,fh]
677 }[params.part||'alltogethernow']) 682 }[params.part||'alltogethernow'])
678 var rv = union( 683 var rv = union(
679 e, 684 e,
680 hs, 685 hs,
681 columns(), 686 columns(),
682 ///hd, 687 ///hd,
683 hdhd[0], hdhd[1], 688 hdhd[0], hdhd[1],
684 ms); 689 ms);
685 return rv; 690 return rv;
686} 691}
687 692
688function getParameterDefinitions() { 693function getParameterDefinitions() {
689 return [{ 694 return [{
690 name: 'part', 695 name: 'part',
691 type: 'choice', 696 type: 'choice',
692 values: [ 697 values: [
693 'platform', 698 'platform',
694 'hinged', 699 'hinged',
695 'clamp', 700 'clamp',
696 'fanholder', 701 'fanholder',
697 'alltogethernow', 702 'alltogethernow',
698 'wip' 703 'wip'
699 ], 704 ],
700 captions: [ 705 captions: [
701 'Effector platform', 706 'Effector platform',
702 'Hinged part', 707 'Hinged part',
703 'Clamp', 708 'Clamp',
704 'Fan holder', 709 'Fan holder',
705 'All together now!', 710 'All together now!',
706 'Work in progress' 711 'Work in progress'
707 ], 712 ],
708 caption: 'Part', 713 caption: 'Part',
709 initial: 'wip' 714 initial: 'wip'
710 },{ 715 },{
711 name: 'print', 716 name: 'print',
712 type: 'checkbox', 717 type: 'checkbox',
713 caption: 'For print, no nonsense', 718 caption: 'For print, no nonsense',
714 initial: false 719 initial: false
715 }]; 720 }];
716} 721}
717 722
718/* vim:set ft=javascript ai: */ 723/* vim:set ft=javascript ai: */