This commit is contained in:
zhao
2023-08-17 23:44:23 -04:00
parent 122b45aef4
commit 63af3ac058
13 changed files with 53 additions and 887 deletions

View File

@ -6,47 +6,47 @@
## Instructions: ## Instructions:
Slide in M3 hex nuts into the Y-bars - 4 times. Each corner should have 3 hex nuts: Slide in M3 hex nuts into the Y-bars - 4 times. Each corner should have 3 hex nuts:
![insert heatset inserts](./gifs/slideHexNutsIntoYBar.gif) ![slideHexNutsIntoYBar](./gifs/slideHexNutsIntoYBar.gif)
Glue magnets into magnet side-modules - 4 times: Glue magnets into magnet side-modules - 4 times:
![glue magnets to magnet modules](./gifs/addMagnetsToMagnetModules.gif) ![addMagnetsToMagnetModules](./gifs/addMagnetsToMagnetModules.gif)
Glue top and bottom magnets into side walls - 2 times: Glue top and bottom magnets into side walls - 2 times:
![glue magnets to side walls](./gifs/addMagnetsToSideWall.gif) ![addMagnetsToSideWall](./gifs/addMagnetsToSideWall.gif)
Insert top and bottom dowel rods into side walls - 2 times: Insert top and bottom dowel rods into side walls - 2 times:
![insert dowels into side walls](./gifs/insertDowelsIntoSideWall.gif) ![insertDowelsIntoSideWall](./gifs/insertDowelsIntoSideWall.gif)
Slide Y-bars into X-bars - 2 times: Slide Y-bars into X-bars - 2 times:
![slide y-bar into x-bar](./gifs/attachXBarWithYBar.gif) ![attachXBarWithYBar](./gifs/attachXBarWithYBar.gif)
Screw together Y-bars and X-bars using 4 M3x12 FHCS screws (one screw per corner) - 2 times: Screw together Y-bars and X-bars using 4 M3x12 FHCS screws (one screw per corner) - 2 times:
![attach x-bar with y-bar](./gifs/screwXBarAndYBar.gif) ![screwXBarAndYBar](./gifs/screwXBarAndYBar.gif)
Screw in the side-modules with M3x8 FHCS screws. Orientation matters here. The magnets modules should be on the eventual front side, facing outwards, and the two hinge modules should be in the back. Do this 2 times (for both trays): Screw in the side-modules with M3x8 FHCS screws. Orientation matters here. The magnets modules should be on the eventual front side, facing outwards, and the two hinge modules should be in the back. Do this 2 times (for both trays):
![attachSideConnectorModulesToYBars.gif](./gifs/attachSideConnectorModulesToYBars.gif) ![attachSideConnectorModulesToYBars](./gifs/attachSideConnectorModulesToYBars.gif)
Screw in the main rails with M3x16 FHCS screws. Screw in the main rails with M3x16 FHCS screws.
![connect xy-tray with main rails](./gifs/connectXYTrayWithMainRails.gif) ![connectXYTrayWithMainRails](./gifs/connectXYTrayWithMainRails.gif)
Prop us the side wall using the side modules. Make sure the dowels are inserted properly, and the magnets align: Prop us the side wall using the side modules. Make sure the dowels are inserted properly, and the magnets align:
![prop up side walls](./gifs/propUpBottomXYTraywithSideWalls.gif) ![propUpBottomXYTraywithSideWalls](./gifs/propUpBottomXYTraywithSideWalls.gif)
Slide in the other (top) tray. Make sure the magnets and dowels align. Screw in the main rails with M3x16 FHCS screws: Slide in the other (top) tray. Make sure the magnets and dowels align. Screw in the main rails with M3x16 FHCS screws:
![attach xy-trays](./gifs/attachXYTrays.gif) ![attachXYTrays](./gifs/attachXYTrays.gif)
Attach the top and bottom plates with 4 M3x8 screws each: Attach the top and bottom plates with 4 M3x8 screws each:
![slideHexNutsIntoYBarXYPlate](./gifs/slideHexNutsIntoYBarXYPlate.gif) ![slideHexNutsIntoYBarXYPlate](./gifs/slideHexNutsIntoYBarXYPlate.gif)
![attachXYPlates.gif](gifs%2FattachXYPlates.gif) ![attachXYPlates](./gifs/attachXYPlates.gif)
Slide in hex nuts into feet - 2 times: Slide in hex nuts into feet - 2 times:
![slide hex nuts into feet](./gifs/slideHexNutToFeet.gif) ![slideHexNutToFeet](./gifs/slideHexNutToFeet.gif)
Insert feet into the bottom of the rack: Insert feet into the bottom of the rack:
![insert feet](./gifs/insertFeet.gif) ![insertFeet](./gifs/insertFeet.gif)
Screw in feet using 4 M3x12 FHCS screws: Screw in feet using 4 M3x12 FHCS screws:
![screw feet](./gifs/screwFeet.gif) ![screwFeet](./gifs/screwFeet.gif)
**FIN** **FIN**

View File

@ -1,26 +1,15 @@
/*
TODO this case has many many problems as it currently is. The following
should be addressed before it is printed again:
- risers are made of plastic and really easily break
- no locking lid for case
*/
include <../../../config/common.scad> include <../../../config/common.scad>
include <../../../helper/common.scad> include <../../../helper/common.scad>
// All coordinates are in [x,y], or [x,y,z] format
// All coordinates are in [x,y], or [x,y,z] format
pcbDimensions = [56.0, 85.1]; // [x,y] pcbDimensions = [56.0, 85.1]; // [x,y]
pcbThickness = 1.42; pcbThickness = 1.42;
// [+x, -x, +y, -y] // [+x, -x, +y, -y]
pcbCaseSpace = [5, 2, 5, 2]; pcbCaseSpace = [5, 2, 5, 2];
pcbRise = 3; pcbRise = 3;
caseWallThickness = 2; caseWallThickness = 2;
caseBottomThickness = 2; caseBottomThickness = 2;
mountPointDiameter = 5; mountPointDiameter = 5;
mountPoints = [[3.65,23.30,0], [3.65,pcbDimensions[1]-3.65,0], [pcbDimensions[0]-3.65,23.30,0], [pcbDimensions[0]-3.65,pcbDimensions[1]-3.65,0]]; mountPoints = [[3.65,23.30,0], [3.65,pcbDimensions[1]-3.65,0], [pcbDimensions[0]-3.65,23.30,0], [pcbDimensions[0]-3.65,pcbDimensions[1]-3.65,0]];
@ -85,30 +74,6 @@ module cutoutProfileAirflow_N() {
cube(size=[inf50, 80, 15]); cube(size=[inf50, 80, 15]);
} }
difference() {
union() {
pcbCaseWithRisers_();
// lugs
// -4
translate(v=[pcbDimensions[0]+caseWallThickness+pcbCaseSpace[0],-caseWallThickness-pcbCaseSpace[3],-pcbRise-caseBottomThickness])
cube(size=[2,5,5]);
// 87.1
translate(v=[pcbDimensions[0]+caseWallThickness+pcbCaseSpace[0],pcbDimensions[1]+pcbCaseSpace[2]-5+caseWallThickness,-pcbRise-caseBottomThickness])
cube(size=[2,5,5]);
// -> 87.1 + 4 = 91.1
}
union() {
cutoutProfile_N();
cutoutProfileAirflow_N();
}
}
//cutoutProfileAirflow_N();
module mountPoints_N(cylHeight, cylRad1, cylRad2, cylFn, center) { module mountPoints_N(cylHeight, cylRad1, cylRad2, cylFn, center) {
for (i=[0:3]) { for (i=[0:3]) {
p = mountPoints[i]; p = mountPoints[i];
@ -118,15 +83,6 @@ module mountPoints_N(cylHeight, cylRad1, cylRad2, cylFn, center) {
} }
*difference() {
union () {
pcb();
mountPoints_N(7, mountPointDiameter/2.5, mountPointDiameter/2.5, 32, false);
mountPoints_N(5, mountPointDiameter, mountPointDiameter, 32, false);
}
}
// fucked up // fucked up
module cutoutProfile_N() { module cutoutProfile_N() {
color([1,0,1]) color([1,0,1])
@ -143,6 +99,32 @@ module cutoutProfile_N() {
} }
*cutoutProfile_N();
//pcb();
module mainCase() {
difference() {
union() {
pcbCaseWithRisers_();
// lugs
// -4
translate(v = [pcbDimensions[0]+caseWallThickness+pcbCaseSpace[0], -caseWallThickness-pcbCaseSpace[3], -pcbRise-
caseBottomThickness])
cube(size = [2, 5, 5]);
// 87.1
translate(v = [pcbDimensions[0]+caseWallThickness+pcbCaseSpace[0], pcbDimensions[1]+pcbCaseSpace[2]-5+
caseWallThickness, -pcbRise-caseBottomThickness])
cube(size = [2, 5, 5]);
// -> 87.1 + 4 = 91.1
}
union() {
cutoutProfile_N();
cutoutProfileAirflow_N();
}
}
}
mainCase();

View File

@ -1,5 +1,4 @@
difference() { difference() {
union() { union() {
cube(size=[67,95.7,1]); cube(size=[67,95.7,1]);

View File

@ -1,9 +1,9 @@
module sfxPowerSupply() { module sfxPowerSupply() {
// corsair sf450
length = 125.3; length = 125.0;
width = 100.2; width = 100.0;
height = 63.8; height = 64;
screwD = 3.5; screwD = 3.5;
eps = 0.001; eps = 0.001;
@ -56,3 +56,5 @@ module sfxPowerSupply() {
} }
sfxPowerSupply();

View File

@ -1,10 +0,0 @@
// Spatial transformations between various parts' local spaces
include <./connectors.scad>
function transform(from, to) =
(from == "yBar" && to == "xBar")
? identity
: (from == "xBar" && to == "yBar")
? identity
: identity;

View File

@ -180,7 +180,8 @@ def build_assembly_gifs(config, dz, nightly):
def build_gif_from_png(fileName): def build_gif_from_png(fileName):
try: try:
subprocess.run(["bash", BUILD_GIF_FROM_PNG_SCRIPT, fileName, ASSEMBLY_GIF_TEMP_DIR, ASSEMBLY_GIF_BUILD_DIR], check=True) subprocess.run(["bash", BUILD_GIF_FROM_PNG_SCRIPT, fileName, ASSEMBLY_GIF_TEMP_DIR, ASSEMBLY_GIF_BUILD_DIR],
check=True)
except subprocess.CalledProcessError as e: except subprocess.CalledProcessError as e:
print(f"Error calling shell script: {e}") print(f"Error calling shell script: {e}")

View File

@ -1,197 +0,0 @@
// test for screw tolerances
include <./rockpro.scad>;
include <../power/src/base.scad>;
$fn = 128;
outerD = 4.65;
innerD = 2.93;
module caseOuter() {
rotate(a=[90,0,0])
minkowski() {
cube(size=[80,40,195], center=true);
cylinder(h=0.00000000001, r=10);
}
}
module caseInner() {
translate(v=[0,0,2])
rotate(a=[90,0,0])
minkowski() {
cube(size=[81.5,47,195+0.01], center=true);
*cylinder(h=0.00000000001, r=5);
}
}
module hgill(i) {
minkowski() {
*sphere(r=2);
translate(v=[0,i*10,5])
rotate(a=[30,0,0])
cube(size=[200, 4, 30], center=true);
}
}
module caseShell() {
difference() {
caseOuter();
union() {
caseInner();
// side perforations
for (i=[-7:7]) {
hgill(i=i);
}
// top perforations
for (i=[-3:3]) {
translate(v=[0,i*20,50])
cube(size=[75,10,60], center=true);
}
// bottom perforations
for (i=[2:4]) {
translate(v=[0,i*20,-20])
cube(size=[60,8,50], center=true);
}
for (i=[-4:0]) {
translate(v=[0,i*20,-20])
cube(size=[60,8,50], center=true);
}
}
}
}
module faceMountDiffs() {
translate(v=[45,0,20])
rotate(a=[90,0,0])
cylinder(r=innerD/2,h=300, center=true);
translate(v=[45,0,-20])
rotate(a=[90,0,0])
cylinder(r=innerD/2,h=300, center=true);
translate(v=[-45,0,-20])
rotate(a=[90,0,0])
cylinder(r=innerD/2,h=300, center=true);
translate(v=[-45,0,20])
rotate(a=[90,0,0])
cylinder(r=innerD/2,h=300, center=true);
}
module caseWithMountHoles() {
difference() {
union() {
caseShell();
translate(v=[-35, 25,-27.5])
rotate(a=[0,0,-90])
rockProMountPoints(6, 3.8, 64, false);
}
union() {
translate(v=[-35, 25,-27.5])
rotate(a=[0,0,-90])
rockProMountPoints(6, innerD/2, 64, false);
faceMountDiffs();
}
}
}
*caseWithMountHoles();
module bottomTray() {
difference() {
union() {
intersection() {
caseWithMountHoles();
translate(v=[0,0,-115])
cube(size=[500,500,200], center=true);
}
translate(v=[-45.5,0,-15])
rotate(a=[90,90,0])
joinTriangle(185);
translate(v=[45.5,0,-15])
rotate(a=[90,90,0])
joinTriangle(185);
}
// bottom lugs
union() {
translate(v=[-40,-90,-29])
cube(size=[10.2,10.2,2.5], center=true);
translate(v=[40,-90,-29])
cube(size=[10.2,10.2,2.5],center=true);
translate(v=[40,90,-29])
cube(size=[10.2,10.2,2.5],center=true);
translate(v=[-40,90,-29])
cube(size=[10.2,10.2,2.5],center=true);
}
}
}
module topTray() {
difference () {
union() {
difference() {
caseWithMountHoles();
translate(v=[0,0,-115])
cube(size=[500,500,200], center=true);
}
}
// bottom lugs
union() {
translate(v=[-40,-90,29])
cube(size=[10.2,10.2,2.5], center=true);
translate(v=[40,-90,29])
cube(size=[10.2,10.2,2.5],center=true);
translate(v=[40,90,29])
cube(size=[10.2,10.2,2.5],center=true);
translate(v=[-40,90,29])
cube(size=[10.2,10.2,2.5],center=true);
translate(v=[-45.5,0,-15])
rotate(a=[90,90,0])
scale(v=[1,0.9,1])
joinTriangle(300);
translate(v=[45.5,0,-15])
rotate(a=[90,90,0])
scale(v=[1,0.9,1])
joinTriangle(300);
}
}
}
topTray();
// TODO make sure rail works!!!
scale(v=[1,0.9,1])
*joinTriangle(10);

View File

@ -1,125 +0,0 @@
include <../rack-tray/rack-tray.scad>
include <../common.scad>
include <../rack/screws.scad>
include <./rockpro.scad>
vU = 3;
uHeight = 10;
plateScrewDiffV = uHeight*vU;
plateScrewDiffH = 180;
plateScrewToHEdge = 4.5;
plateScrewToVEdge = 5.5;
frontPlateThickness = 3;
frontPlateV = plateScrewDiffV + 2*plateScrewToHEdge;
frontPlateH = plateScrewDiffH + 2*plateScrewToVEdge;
plateScrewToBoxMin = 6;
module _frontPlateBody() {
translate(v=[-plateScrewToVEdge,0,-plateScrewToHEdge])
cube(size=[frontPlateH,frontPlateThickness,frontPlateV]);
}
module _plateHole() {
rotate(a=[90,0,0])
cylinder(r=m4RadiusSlacked, h=inf, center=true);
}
module frontPlate() {
difference() {
_frontPlateBody();
union() {
// TODO: introduce helper modules for this pattern
_plateHole();
translate(v=[plateScrewDiffH,0,0])
_plateHole();
translate(v=[0,0,plateScrewDiffV])
_plateHole();
translate(v=[plateScrewDiffH,0,plateScrewDiffV])
_plateHole();
}
}
}
difference() {
frontPlate();
union() {
translate(v = [13, 0, - 10])
cube(size = [300, 100, 100]);
translate(v=[6,0,0])
cube(size=[5,5,5]);
translate(v=[6,0,20])
cube(size=[5,5,5]);
}
}
// todo use library constants
module screwRiser(height) {
difference() {
cylinder(d=5, h=height, $fn=64);
cylinder(d=2.88, h=height, $fn=64);
}
}
module mountPoints_N(cylHeight, cylRad1, cylRad2, cylFn, center) {
for (i=[0:3]) {
p = mountPoints[i];
translate(v=[p[0], p[1], p[2]])
cylinder(r1=cylRad1, r2=cylRad2, h=cylHeight, $fn=cylFn, center=center);
}
}
module rockProScrewMounts() {
for (i=[0:3]) {
p = mountPoints[i];
translate(v=[p[0], p[1], p[2]])
screwRiser(5);
}
}
module rockProDualTray() {
trayBody();
translate(v=[9,8,trayBottomThickness])
rockProScrewMounts();
translate(v=[9 + pcbDimensions[0],8,trayBottomThickness])
rockProScrewMounts();
}
*difference() {
rockProDualTray();
// file specific bottom holes
union() {
translate(v = [10, 15, 0])
minkowski() {
cube(size = [69, 100, 5]);
cylinder(r = 1);
}
translate(v=[88,15,0])
minkowski() {
cube(size = [69, 100, 5]);
cylinder(r=1);
}
}
}

View File

@ -1,125 +0,0 @@
include <../rack-tray/rack-tray.scad>
include <../common.scad>
include <../rack/screws.scad>
include <./rockpro.scad>
vU = 3;
uHeight = 10;
plateScrewDiffV = uHeight*vU;
plateScrewDiffH = 180;
plateScrewToHEdge = 4.5;
plateScrewToVEdge = 5.5;
frontPlateThickness = 2;
frontPlateV = plateScrewDiffV + 2*plateScrewToHEdge;
frontPlateH = plateScrewDiffH + 2*plateScrewToVEdge;
plateScrewToBoxMin = 6;
module _frontPlateBody() {
translate(v=[-plateScrewToVEdge,0,-plateScrewToHEdge])
cube(size=[frontPlateH,frontPlateThickness,frontPlateV]);
}
module _plateHole() {
rotate(a=[90,0,0])
cylinder(r=m4RadiusSlacked, h=inf, center=true);
}
module frontPlate() {
difference() {
_frontPlateBody();
union() {
// TODO: introduce helper modules for this pattern
_plateHole();
translate(v=[plateScrewDiffH,0,0])
_plateHole();
translate(v=[0,0,plateScrewDiffV])
_plateHole();
translate(v=[plateScrewDiffH,0,plateScrewDiffV])
_plateHole();
}
}
}
difference() {
frontPlate();
union() {
translate(v = [13, 0, - 10])
cube(size = [300, 100, 100]);
translate(v=[6,0,-2])
cube(size=[5.5,5.5,5.5]);
translate(v=[6,0,20-2])
cube(size=[5.5,5.5,5.5]);
}
}
// todo use library constants
// TODO these risers are prone to snapping off
module screwRiser(height) {
difference() {
cylinder(d=5, h=height, $fn=64);
cylinder(d=2.88, h=height, $fn=64);
}
}
module mountPoints_N(cylHeight, cylRad1, cylRad2, cylFn, center) {
for (i=[0:3]) {
p = mountPoints[i];
translate(v=[p[0], p[1], p[2]])
cylinder(r1=cylRad1, r2=cylRad2, h=cylHeight, $fn=cylFn, center=center);
}
}
module rockProScrewMounts() {
for (i=[0:3]) {
p = mountPoints[i];
translate(v=[p[0], p[1], p[2]])
screwRiser(5);
}
}
module rockProDualTray() {
trayBody();
translate(v=[9,8,trayBottomThickness])
rockProScrewMounts();
translate(v=[9 + pcbDimensions[0],8,trayBottomThickness])
rockProScrewMounts();
}
*difference() {
rockProDualTray();
// file specific bottom holes
union() {
translate(v = [10, 15, 0])
minkowski() {
cube(size = [69, 100, 5]);
cylinder(r = 1);
}
translate(v=[88,15,0])
minkowski() {
cube(size = [69, 100, 5]);
cylinder(r=1);
}
}
}

View File

@ -1,201 +0,0 @@
include <./rockpro.scad>;
include <../power/src/base.scad>;
$fn = 128;
outerD = 4.65;
innerD = 2.93;
module caseOuter() {
rotate(a=[90,0,0])
minkowski() {
//translate(v=[-35, -15, -32.5])
cube(size=[70,30,130], center=true);
cylinder(h=0.00000000001, r=15);
}
}
module caseInner() {
translate(v=[0,0,0])
rotate(a=[90,0,0])
minkowski() {
cube(size=[70,30,130+0.01], center=true);
cylinder(h=0.00000000001, r=12);
}
}
module hgill(i) {
minkowski() {
*sphere(r=2);
translate(v=[0,i*10,5])
rotate(a=[30,0,0])
cube(size=[200, 4, 30], center=true);
}
}
module caseShell() {
union() {
difference() {
caseOuter();
union() {
caseInner();
// side perforations
for (i=[-7:7]) {
*hgill(i=i);
}
// top perforations
for (i=[-2:2]) {
translate(v=[0,i*20,50])
cube(size=[50,8,50], center=true);
}
for (i=[-2:2]) {
translate(v=[0,i*20,-20])
rotate(a=[0,0,25])
cube(size=[50,3,50], center=true);
}
}
}
}
}
module caseWithMountHoles() {
difference() {
union() {
caseShell();
translate(v=[-35, 59,-28])
rotate(a=[0,0,-90])
rockProMountPoints(5.0, 5.5, 2.5, 64, false);
faceMountSupports();
}
union() {
translate(v=[-35, 59,-29.5])
rotate(a=[0,0,-90])
rockProMountPoints(6.5, innerD/2, innerD/2, 64, false);
faceMountDiffs();
}
}
}
module guideRail(x,y,z) {
// gross
cube(size=[y,z,x]);
}
module faceMountDiffs() {
for (i = [-1,1]) {
for (j = [-1,1]) {
translate(v=[i*47,0,j*15]) {
rotate(a=[90,0,0])
translate(v=[0,0,93])
*cylinder(r=innerD/2,h=12, center=true);
rotate(a=[90,0,0])
translate(v=[0,0,-93])
*cylinder(r=innerD/2,h=12, center=true);
rotate(a=[90,0,0])
translate(v=[0,0,90])
cylinder(r=innerD/2,h=400, center=true);
}
}
}
}
module faceMountSupports() {
intersection() {
caseOuter();
for (i = [-1,1]) {
for (j = [-1,1]) {
translate(v=[i*47,0,j*15]) {
rotate(a=[90,0,0])
translate(v=[0,0,90])
cylinder(r=innerD,h=400, center=true);
}
}
}
}
}
module bottomTray() {
difference() {
union() {
translate(v=[-48,0,-11])
cube(size=[4,130,4], center=true);
translate(v=[48,0,-11])
cube(size=[4,130,4], center=true);
intersection() {
caseWithMountHoles();
translate(v=[0,0,-110])
cube(size=[500,500,200], center=true);
}
translate(v=[-50,65,-10+3])
rotate(a=[90,90,0])
guideRail(130,2,2);
translate(v=[48, 65, -10+3])
rotate(a=[90,90,0])
guideRail(130,2,2);
}
// bottom lugs
union() {
translate(v=[-35,-56.5,-30])
*cube(size=[10.2,10.2,2.5], center=true);
translate(v=[35,-56.5,-30])
*cube(size=[10.2,10.2,2.5],center=true);
translate(v=[35,56.5,-30])
*cube(size=[10.2,10.2,2.5],center=true);
translate(v=[-35,56.5,-30])
*cube(size=[10.2,10.2,2.5],center=true);
}
}
}
bottomTray();
*caseWithMountHoles();
*caseShell();

View File

@ -1,65 +0,0 @@
include <../common.scad>
// All coordinates are in [x,y], or [x,y,z] format
pcbDimensions = [79.41, 127.06]; // [x,y]
pcbThickness = 1.22;
// TODO move mount points
mountPoints = [[0,0,0], [0,118,0], [71.0,118, 0], [71.0,0,0]];
module mountPoints_N(cylHeight, cylRad1, cylRad2, cylFn, center) {
for (i=[0:3]) {
p = mountPoints[i];
translate(v=[p[0], p[1], p[2]])
cylinder(r1=cylRad1, r2=cylRad2, h=cylHeight, $fn=cylFn, center=center);
}
}
module pcb() {
cube(size=[pcbDimensions[0], pcbDimensions[1], pcbThickness]);
}
// defined on x-z plane, start at top of pcb
module frontFaceIOCutouts_N() {
translate(v=[9,0,0])
cube(size=[26.0,inf50,7.5]);
translate(v=[35,0,0])
cube(size=[35,inf50,17.9]);
}
module backFaceIOCutouts_N() {
translate(v=[9,0,0])
cube(size=[61,inf50,14]);
}
module cutoutProfile_N() {
color([1,0,1])
union() {
mirror(v=[0,1,0])
translate(v=[0,-1,pcbThickness])
frontFaceIOCutouts_N();
translate(v=[0,pcbDimensions[1]-1, pcbThickness])
backFaceIOCutouts_N();
}
color([0.3,0.8,0.1])
difference() {
pcb();
translate(v=[3.75, 3.75])
mountPoints_N(10,2,2,10,true);
}
}
//cutoutProfile_N();
//mountPoints_N(10,2,2, true);

View File

@ -1,95 +0,0 @@
// (c)2013 Felipe Sanches <juca@members.fsf.org>
// licensed under the terms of the GNU GPL version 3 (or later)
function normalize(v) = v / (sqrt(v[0] * v[0] + v[1] * v[1]));
//
// The voronoi() function generates a 2D surface, which can be provided to
// a) linear_extrude() to produce a 3D object
// b) intersection() to restrict it to a a specified shape -- see voronoi_polygon.scad
//
// Parameters:
// points (required) ... nuclei coordinates (array of [x, y] pairs)
// L ... the radius of the "world" (the pattern is built within this circle)
// thickness ... the thickness of the lines between cells
// round ... the radius applied to corners (fillet in CAD terms)
// nuclei (bool) ... show nuclei sites
//
// These parameters need to be kept more or less in proportion to each other, and to the distance
// apart of points in the point_set. If one or the other parameter is increased or decreased too
// much, you'll get no output.
//
module voronoi(points, L = 200, thickness = 1, round = 6, nuclei = true) {
for (p = points) {
difference() {
minkowski() {
intersection_for(p1 = points){
if (p != p1) {
angle = 90 + atan2(p[1] - p1[1], p[0] - p1[0]);
translate((p + p1) / 2 - normalize(p1 - p) * (thickness + round))
rotate([0, 0, angle])
translate([-L, -L])
square([2 * L, L]);
}
}
circle(r = round, $fn = 20);
}
if (nuclei)
translate(p) circle(r = 1, $fn = 20);
}
}
}
//
// The random_voronoi() function is the helper wrapper over the voronoi() core.
// It generates random nuclei site coordinates into the square area,
// passing other arguments to voronoi() unchanged.
//
// Parameters:
// n ... number of nuclei sites to be generated
// nuclei (bool) ... show nuclei sites
// L ... the radius of the "world" (the pattern is built within this circle)
// thickness ... the thickness of the lines between cells
// round ... the radius applied to corners (fillet in CAD terms)
// min ... minimum x and y coordinate for nuclei generation
// max ... maximum x and y coordinate for nuclei generation
// seed ... seed for the random generator (random if undefined)
// center (bool) ... move resulting pattern to [0, 0] if true
//
module random_voronoi(n = 20, nuclei = true, L = 200, thickness = 1, round = 6, min = 0, max = 100, seed = undef, center = false) {
seed = seed == undef ? rands(0, 100, 1)[0] : seed;
echo("Seed", seed);
// Generate points.
x = rands(min, max, n, seed);
y = rands(min, max, n, seed + 1);
points = [ for (i = [0 : n - 1]) [x[i], y[i]] ];
// Center Voronoi.
offset_x = center ? -(max(x) - min(x)) / 2 : 0;
offset_y = center ? -(max(y) - min(y)) / 2 : 0;
translate([offset_x, offset_y])
voronoi(points, L = L, thickness = thickness, round = round, nuclei = nuclei);
}
// example with an explicit list of points:
point_set = [
[0, 0], [30, 0], [20, 10], [50, 20], [15, 30], [85, 30], [35, 30], [12, 60],
[45, 50], [80, 80], [20, -40], [-20, 20], [-15, 10], [-15, 50]
];
//voronoi(points = point_set, round = 4, nuclei = true);
module voronoi3u_N(h) {
intersection() {
translate(v=[10,5,0])
cube(size=[160, 10, h]);
translate(v=[20,-52,0])
scale(v=[0.40,0.44,10])
linear_extrude(height=10)
random_voronoi(n = 128, round = 2, min = 0, max = 350, seed = 40, thickness=3.5, nuclei=false);
}
}