// Show, export 2D design, uncomment one option display3D(); // show complete 3D build, see if everthing fits //animateBuild(); // assembly animation //display2DT(); // 2D layout, export dxf for laser cutting (transparent material) //display2DB(); // 2D layout, export dxf for laser cutting (opaque (black) material) // Material parameter materialT = 1; // transparent material for the pyramid materialB = 3; // (black) material for the rest // display parameter screenZ = 100; // heigth of the pyramid (including removed head) screenOffset = 10; // cut off top - removed Height screenX = 196.6; // since the pyramid is quadratic, just the smaller dimension of the (visible) screen necessary displayX = 220.6; // size of the display in x, should be at least 8*materialB bigger than screenX (check 3D view, adjust distanceHolderDiameter) displayY = 305.7; // size of the display in y, should be at least 8*materialB bigger than screenX (check 3D view, adjust distanceHolderDiameter) displayR = 10; // rounded courner, if 1/2*displayX and displayX=displayY results in a round shape, shouldn't be bigger than displayY/2 and displayX/2 // Dependencies... from here on, normaly nothing to do startAnimationY = 1000; // animation start out of viewpoint in y-axis safetyGap = 3; // parts distance for laser cutting pyramidTopLines = materialB*2; pyramidBottomLines = materialB*4; pyramidAngle = atan(screenZ/(screenX/2)); pyramidWallHeight = pow(pow(screenX/2,2) + pow (screenZ,2),0.5); pyramidBottomOffset=cos(90-pyramidAngle)*materialT*2; pyramidInlay=materialB/cos(90-pyramidAngle); pyramidBottomInset=screenX-tan(90-pyramidAngle)*materialB*2; pyramidTopOffset = tan(90-pyramidAngle)*materialB*2+materialT/cos(90-pyramidAngle)*2+tan(90-pyramidAngle)*screenOffset*2; pyramidTopInset = tan(90-pyramidAngle)*screenOffset*2+materialT/cos(90-pyramidAngle)*2-cos(90-pyramidAngle)*materialT*2; pyramidTopSquare = materialB*2+pyramidTopOffset; pyramidWallCutoff = tan(90-pyramidAngle)*materialT+screenOffset/cos(90-pyramidAngle); distanceHolderLength = screenZ-2*materialB-screenOffset; distanceHolderDiameter = 4*materialB; distanceHolderPositionX = displayX/4+screenX/4; distanceHolderPositionY = displayY/4+screenX/4; materialBColor = "dimgrey"; //materialBColor = "black"; module display2DT() { projection (cut=true) { rotate([0,0,0]) translate([0,-pyramidWallHeight/2-pyramidWallCutoff/2,0]) pyramidPlate(); translate([pyramidTopOffset/2+pyramidBottomInset/2+safetyGap ,0,0]) rotate([0,0,180]) translate([0,-pyramidWallHeight/2-pyramidWallCutoff/2,0]) pyramidPlate(); rotate([0,0,0]) translate([pyramidTopOffset+pyramidBottomInset+safetyGap*2 ,-pyramidWallHeight/2-pyramidWallCutoff/2,0]) pyramidPlate(); translate([pyramidTopOffset/2*3+pyramidBottomInset/2*3+safetyGap*3,0,0]) rotate([0,0,180]) translate([0,-pyramidWallHeight/2-pyramidWallCutoff/2,0]) pyramidPlate(); } } module display2DB() { projection (cut=true) { translate([+displayX+safetyGap,0,0]) screenPlate(); pyramideBasePlate(); translate([-displayX-safetyGap,0,0]) basePlate(); translate([screenOffset+distanceHolderLength/2,safetyGap*0.5+distanceHolderDiameter*0.5,0]) rotate([0,90,0]) rotate([0,0,45]) distanceHolderA(); translate([screenOffset+distanceHolderLength/2,safetyGap*1.5+distanceHolderDiameter*1.5,0]) rotate([0,90,0]) rotate([0,0,45]) distanceHolderA(); translate([screenOffset+distanceHolderLength/2,safetyGap*2.5+distanceHolderDiameter*2.5,0]) rotate([0,90,0]) rotate([0,0,45]) distanceHolderA(); translate([screenOffset+distanceHolderLength/2,safetyGap*3.5+distanceHolderDiameter*3.5,0]) rotate([0,90,0]) rotate([0,0,45]) distanceHolderA(); translate([screenOffset+distanceHolderLength/2,-safetyGap*0.5-distanceHolderDiameter*0.5,0]) rotate([0,90,0]) rotate([0,0,-45]) distanceHolderB(); translate([screenOffset+distanceHolderLength/2,-safetyGap*1.5-distanceHolderDiameter*1.5,0]) rotate([0,90,0]) rotate([0,0,-45]) distanceHolderB(); translate([screenOffset+distanceHolderLength/2,-safetyGap*2.5-distanceHolderDiameter*2.5,0]) rotate([0,90,0]) rotate([0,0,-45]) distanceHolderB(); translate([screenOffset+distanceHolderLength/2,-safetyGap*3.5-distanceHolderDiameter*3.5,0]) rotate([0,90,0]) rotate([0,0,-45]) distanceHolderB(); } } module display3D() { pyramid(); translate([0,0,-materialB-screenOffset]) screenPlate(); translate([0,0,-screenZ]) pyramideBasePlate(); translate([0,0,-screenZ-materialB]) basePlate(); allDistanceHolderA(); allDistanceHolderB(); } module animateBuild() { rotate([0,180,0]) { translate([0,0,-materialB-screenOffset-max(0,startAnimationY-startAnimationY*7*$t)]) screenPlate(); translate([0,0,-startAnimationY-max(-startAnimationY,startAnimationY-startAnimationY*7*$t)]) allDistanceHolderB(); translate([0,0,-startAnimationY*2-max(-startAnimationY*2,startAnimationY-startAnimationY*7*$t)]) allDistanceHolderA(); translate([0,0,-screenZ-startAnimationY*3-max(-startAnimationY*3,startAnimationY-startAnimationY*7*$t)]) pyramideBasePlate(); translate([0,0,-startAnimationY*4-max(-startAnimationY*4,startAnimationY-startAnimationY*7*$t)]) pyramid(); translate([0,0,-screenZ-materialB-startAnimationY*5-max(-startAnimationY*5,startAnimationY-startAnimationY*7*$t)]) basePlate(); } } module pyramid() { rotate([-pyramidAngle,0,90]) pyramidPlate(); rotate([-pyramidAngle,0,-90]) pyramidPlate(); rotate([-pyramidAngle,0,180]) pyramidPlate(); rotate([-pyramidAngle,0,0]) pyramidPlate(); } module pyramidPlate() { translate([0,0,materialT/2]) color("Gainsboro",0.3) { difference() { linear_extrude(height = materialT, center = true, convexity = 10, twist = 0) polygon(points = [ [-screenX/2, pyramidWallHeight],[screenX/2, pyramidWallHeight],[0, 0]], paths = [ [0, 1, 2]], convexity = 1); translate([0,-pyramidWallHeight/2+pyramidWallCutoff,0]) cube([screenX,pyramidWallHeight,materialT*2], center=true); // cutOff top translate([0,pyramidInlay/2+pyramidWallCutoff,0]) cube([pyramidTopInset/3,pyramidInlay,materialT*2], center=true); // top cutIn } } } module distanceHolderA() { color(materialBColor) { rotate([0,0,45]) translate([0,0,-screenZ/2-screenOffset/2]) { difference() { cube([distanceHolderDiameter,materialB,distanceHolderLength], center=true); translate([0,0,distanceHolderLength/4]) cube([materialB,materialB*2,distanceHolderLength/2], center=true); } translate([0,0,-materialB-distanceHolderLength/2]) cube([materialB,materialB,materialB*2], center=true); } } } module distanceHolderB() { color(materialBColor) { rotate([0,0,45]) translate([0,0,-screenZ/2-screenOffset/2]) { difference() { cube([materialB,distanceHolderDiameter,distanceHolderLength], center=true); translate([0,0,-distanceHolderLength/4]) cube([materialB*2,materialB,distanceHolderLength/2], center=true); } translate([0,0,materialB/2+distanceHolderLength/2]) cube([materialB,materialB,materialB], center=true); } } } module allDistanceHolderA() { translate([distanceHolderPositionX,distanceHolderPositionY,0]) distanceHolderA(); translate([distanceHolderPositionX,-distanceHolderPositionY,0]) distanceHolderA(); translate([-distanceHolderPositionX,-distanceHolderPositionY,0]) distanceHolderA(); translate([-distanceHolderPositionX,distanceHolderPositionY,0]) distanceHolderA(); } module allDistanceHolderB() { translate([distanceHolderPositionX,distanceHolderPositionY,0]) distanceHolderB(); translate([distanceHolderPositionX,-distanceHolderPositionY,0]) distanceHolderB(); translate([-distanceHolderPositionX,-distanceHolderPositionY,0]) distanceHolderB(); translate([-distanceHolderPositionX,distanceHolderPositionY,0]) distanceHolderB(); } module screenPlate() { color(materialBColor) { translate([0,0,materialB/2]) { cube([pyramidTopInset,pyramidTopInset,materialB], center=true); cube([pyramidTopInset/3,pyramidTopOffset,materialB], center=true); cube([pyramidTopOffset,pyramidTopInset/3,materialB], center=true); } difference() { basePlate(); cube([pyramidTopOffset,pyramidTopOffset,materialB*4], center=true); difference() { cube([screenX,screenX,materialB*3], center=true); rotate([0,0,45]) cube([pow(screenX,2),pyramidTopLines,materialB*4], center=true); rotate([0,0,-45]) cube([pow(screenX,2),pyramidTopLines,materialB*4], center=true); cube([pyramidTopSquare,pyramidTopSquare,materialB*4], center=true); } } } } module pyramideBasePlate () { color(materialBColor) { difference() { basePlate(); cube([screenX+pyramidBottomOffset,screenX+pyramidBottomOffset,materialB*3], center=true); } } } module basePlate() { color(materialBColor) { difference() { $fn=36; translate([displayR-displayX/2,displayR-displayY/2,0]) minkowski() { cube([displayX-displayR*2,displayY-displayR*2,materialB/2]); cylinder(r=displayR,h=materialB/2); } translate([distanceHolderPositionX,distanceHolderPositionY,materialB]) rotate([0,0,45]) cube([materialB,materialB,materialB*3], center=true); translate([distanceHolderPositionX,-distanceHolderPositionY,materialB]) rotate([0,0,45]) cube([materialB,materialB,materialB*3], center=true); translate([-distanceHolderPositionX,-distanceHolderPositionY,materialB]) rotate([0,0,45]) cube([materialB,materialB,materialB*3], center=true); translate([-distanceHolderPositionX,distanceHolderPositionY,materialB]) rotate([0,0,45]) cube([materialB,materialB,materialB*3], center=true); } } }