include // design new building blocks module designCircle(x, y, numberOfSides, sideLength, sideWidth, kerf, materialThickness, mountDepth, numberOfElementEdges, numberOfElementsFactor = 1.5){ newPolygon(x, y, numberOfSides, sideLength, sideWidth, kerf, materialThickness, mountDepth); halfInnerAngle = 360 / numberOfSides / 2; numberOfCircles = round(numberOfSides * numberOfElementsFactor); polygonInnerRadius = sideLength / (2 * tan(halfInnerAngle)) - sideWidth; outerRadiusCircle = polygonInnerRadius / 3 + materialThickness / 3 * 2 + kerf /2; innerRadiusCircle = polygonInnerRadius / 3 - kerf /2; //translate([x,y]) color("red") #circle(r = polygonInnerRadius, $fn = numberOfElementEdges); translate([x, y]){ for(i = [0: 360 / numberOfCircles : 360 - failOffset]){ rotate([0, 0, i + halfInnerAngle]) translate([polygonInnerRadius / 3 * 2, 0, 0]) difference(){ circle(r = outerRadiusCircle, $fn = numberOfElementEdges); circle(r = innerRadiusCircle, $fn = numberOfElementEdges); } if(numberOfSides > 3){ difference(){ circle(r = outerRadiusCircle, $fn = numberOfElementEdges); circle(r = innerRadiusCircle, $fn = numberOfElementEdges); } } } } } module designCircleMix (x, y, numberOfSides, sideLength, sideWidth, kerf, materialThickness, mountDepth, numberOfElementEdges, numberOfElementsFactor = 1.5){ newPolygon(x, y, numberOfSides, sideLength, sideWidth, kerf, materialThickness, mountDepth); halfInnerAngle = 360 / numberOfSides / 2; numberOfCircles = round(numberOfSides * numberOfElementsFactor); polygonInnerRadius = sideLength / (2 * tan(halfInnerAngle)) - sideWidth; outerRadiusCircle = polygonInnerRadius / 3 + materialThickness / 3 * 2 + kerf /2; innerRadiusCircle = polygonInnerRadius / 3 - kerf /2; translate([x, y]){ for(i = [0: 360 / numberOfCircles : 360 - failOffset]){ rotate([0, 0, i + halfInnerAngle]) translate([polygonInnerRadius / 3 * 2, 0, 0]) difference(){ circle(r = outerRadiusCircle, $fn = numberOfElementEdges); circle(r = innerRadiusCircle, $fn = numberOfElementEdges); } if(numberOfSides > 3){ difference(){ circle(r = outerRadiusCircle, $fn = numberOfElementEdges); circle(r = innerRadiusCircle, $fn = numberOfElementEdges); } difference(){ circle(r = outerRadiusCircle + (outerRadiusCircle - kerf) * 0.5, $fn = numberOfElementEdges); circle(r = innerRadiusCircle + (outerRadiusCircle - kerf) * 0.5, $fn = numberOfElementEdges); } difference(){ circle(r = outerRadiusCircle + (outerRadiusCircle - kerf) * 1.25, $fn = numberOfElementEdges); circle(r = innerRadiusCircle + (outerRadiusCircle - kerf) * 1.25, $fn = numberOfElementEdges); } } } } } module designSquares (x, y, numberOfSides, sideLength, sideWidth, kerf, materialThickness, mountDepth, numberOfElementEdges, numberOfElementsFactor = 1.5){ newPolygon(x, y, numberOfSides, sideLength, sideWidth, kerf, materialThickness, mountDepth); halfInnerAngle = 360 / numberOfSides / 2; numberOfSquares = round(numberOfSides * numberOfElementsFactor); polygonInnerRadius = sideLength / (2 * tan(halfInnerAngle)) - sideWidth; outerRadiusCircle = polygonInnerRadius / 3 + materialThickness / 3 * 2 + kerf /2; innerRadiusCircle = polygonInnerRadius / 3 - kerf /2; translate([x, y]){ for(i = [1: 1 : numberOfSquares]){ rotate([0, 0, i * 90 / numberOfSquares]) difference(){ square(size = (polygonInnerRadius * 2 / 1.41) / numberOfSquares * i + materialThickness * 3 / 2 + kerf / 2, center = true); square(size = (polygonInnerRadius * 2 / 1.41) / numberOfSquares * i - kerf / 2, center = true); } } } } module designTriangle (x, y, numberOfSides, sideLength, sideWidth, kerf, materialThickness, mountDepth, numberOfElementEdges, numberOfElementsFactor = 1.5){ newPolygon(x, y, numberOfSides, sideLength, sideWidth, kerf, materialThickness, mountDepth); halfInnerAngle = 360 / numberOfSides / 2; numberOfTriangle = round(numberOfSides * numberOfElementsFactor); polygonInnerRadius = sideLength / (2 * tan(halfInnerAngle)) - sideWidth; outerRadiusCircle = polygonInnerRadius / 3 + materialThickness / 3 * 2 + kerf /2; innerRadiusCircle = polygonInnerRadius / 3 - kerf /2; translate([x, y]){ for(i = [1: 1 : numberOfTriangle]){ rotate([0, 0, i * 360 / numberOfTriangle + halfInnerAngle / 3]) difference(){ circle(d = (polygonInnerRadius * 2) / numberOfTriangle * i + ((materialThickness / 2 * 3 + sideWidth / 2) * cos(halfInnerAngle)) + kerf / 2, $fn = 3); circle(d = (polygonInnerRadius * 2) / numberOfTriangle * i - kerf / 2, $fn = 3); } } } } module designPolygon (x, y, numberOfSides, sideLength, sideWidth, kerf, materialThickness, mountDepth, numberOfElementEdges, numberOfElementsFactor = 1.5){ newPolygon(x, y, numberOfSides, sideLength, sideWidth, kerf, materialThickness, mountDepth); halfInnerAngle = 360 / numberOfSides / 2; numberOfPolygon = round(numberOfSides * numberOfElementsFactor); polygonInnerRadius = sideLength / (2 * tan(halfInnerAngle)) - sideWidth; outerRadiusCircle = polygonInnerRadius / 3 + materialThickness / 3 * 2 + kerf /2; innerRadiusCircle = polygonInnerRadius / 3 - kerf /2; translate([x, y]){ for(i = [1: 1 : numberOfPolygon]){ rotate([0, 0, i * 90 / numberOfPolygon]) difference(){ circle(d = (polygonInnerRadius * 2 / cos(halfInnerAngle)) / numberOfPolygon * i + materialThickness * 3 / 2 + kerf / 2, $fn = numberOfSides - 1); circle(d = (polygonInnerRadius * 2 / cos(halfInnerAngle)) / numberOfPolygon * i - kerf / 2, $fn = numberOfSides - 1); } } } } module designConnector (x, y, kerf, materialThickness, mountDepth){ translate([x, y]){ circle(r = mountDepth + materialThickness / 2 + kerf / 2); } } module designLampmount(x, y, numberOfSides, sideLength, sideWidth, kerf, materialThickness, mountDepth, numberOfElementEdges, numberOfElementsFactor = 1.5){ newPolygon(x, y, numberOfSides, sideLength, sideWidth, kerf, materialThickness, mountDepth); halfInnerAngle = 360 / numberOfSides / 2; numberOfCircles = round(numberOfSides * numberOfElementsFactor); polygonInnerRadius = sideLength / (2 * tan(halfInnerAngle)) - sideWidth; outerRadiusCircle = polygonInnerRadius / 3 + materialThickness / 3 * 2 + kerf /2; shadeMountDiameter = 41; translate([x, y]){ difference(){ circle(r = polygonInnerRadius + sideWidth / 4 + kerf / 2, $fn = numberOfElementEdges); circle(r = shadeMountDiameter / 2 - kerf / 2, $fn = numberOfElementEdges); } } }