summaryrefslogtreecommitdiffabout
path: root/delta.jscad
authorMichael Krelin <hacker@klever.net>2016-01-07 20:55:09 (UTC)
committer Michael Krelin <hacker@klever.net>2016-01-07 20:55:09 (UTC)
commit38331f5dc2cb18d65baf24c5a181de1656c9b8c4 (patch) (unidiff)
tree2f9f5c3dafce947d74ac94a9e212d18336242910 /delta.jscad
parent07d64020a23339f759f183c12ebda7a5f69acc78 (diff)
downloadredelta-38331f5dc2cb18d65baf24c5a181de1656c9b8c4.zip
redelta-38331f5dc2cb18d65baf24c5a181de1656c9b8c4.tar.gz
redelta-38331f5dc2cb18d65baf24c5a181de1656c9b8c4.tar.bz2
base sides generation separated
Diffstat (limited to 'delta.jscad') (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
@@ -451,204 +451,209 @@ function microswitch() {
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;