cleanup
This commit is contained in:
@ -6,47 +6,47 @@
|
||||
|
||||
## Instructions:
|
||||
Slide in M3 hex nuts into the Y-bars - 4 times. Each corner should have 3 hex nuts:
|
||||

|
||||

|
||||
|
||||
Glue magnets into magnet side-modules - 4 times:
|
||||

|
||||

|
||||
|
||||
Glue top and bottom magnets into side walls - 2 times:
|
||||

|
||||

|
||||
|
||||
Insert top and bottom dowel rods into side walls - 2 times:
|
||||

|
||||

|
||||
|
||||
Slide Y-bars into X-bars - 2 times:
|
||||

|
||||

|
||||
|
||||
Screw together Y-bars and X-bars using 4 M3x12 FHCS screws (one screw per corner) - 2 times:
|
||||

|
||||

|
||||
|
||||
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 main rails with M3x16 FHCS screws.
|
||||

|
||||

|
||||
|
||||
Prop us the side wall using the side modules. Make sure the dowels are inserted properly, and the magnets align:
|
||||

|
||||

|
||||
|
||||
Slide in the other (top) tray. Make sure the magnets and dowels align. Screw in the main rails with M3x16 FHCS screws:
|
||||

|
||||

|
||||
|
||||
Attach the top and bottom plates with 4 M3x8 screws each:
|
||||

|
||||

|
||||

|
||||
|
||||
Slide in hex nuts into feet - 2 times:
|
||||

|
||||

|
||||
|
||||
Insert feet into the bottom of the rack:
|
||||

|
||||

|
||||
|
||||
Screw in feet using 4 M3x12 FHCS screws:
|
||||

|
||||

|
||||
|
||||
|
||||
**FIN**
|
||||
@ -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 <../../../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]
|
||||
pcbThickness = 1.42;
|
||||
|
||||
|
||||
// [+x, -x, +y, -y]
|
||||
pcbCaseSpace = [5, 2, 5, 2];
|
||||
|
||||
pcbRise = 3;
|
||||
caseWallThickness = 2;
|
||||
caseBottomThickness = 2;
|
||||
|
||||
|
||||
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]];
|
||||
|
||||
@ -85,30 +74,6 @@ module cutoutProfileAirflow_N() {
|
||||
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) {
|
||||
for (i=[0:3]) {
|
||||
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
|
||||
module cutoutProfile_N() {
|
||||
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();
|
||||
@ -1,5 +1,4 @@
|
||||
|
||||
|
||||
difference() {
|
||||
union() {
|
||||
cube(size=[67,95.7,1]);
|
||||
@ -1,9 +1,9 @@
|
||||
|
||||
module sfxPowerSupply() {
|
||||
// corsair sf450
|
||||
length = 125.3;
|
||||
width = 100.2;
|
||||
height = 63.8;
|
||||
|
||||
length = 125.0;
|
||||
width = 100.0;
|
||||
height = 64;
|
||||
screwD = 3.5;
|
||||
|
||||
eps = 0.001;
|
||||
@ -56,3 +56,5 @@ module sfxPowerSupply() {
|
||||
|
||||
|
||||
}
|
||||
|
||||
sfxPowerSupply();
|
||||
@ -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;
|
||||
@ -4,7 +4,7 @@ import argparse
|
||||
import subprocess
|
||||
import os
|
||||
|
||||
#------------- EDIT THESE VARIABLES WITH THE LOCATION OF YOUR OPENSCAD BINARIES
|
||||
# ------------- EDIT THESE VARIABLES WITH THE LOCATION OF YOUR OPENSCAD BINARIES
|
||||
PATH_TO_OPENSCAD = '/usr/bin/openscad'
|
||||
PATH_TO_OPENSCAD_NIGHTLY = '/snap/bin/openscad-nightly'
|
||||
###############################################################################
|
||||
@ -180,7 +180,8 @@ def build_assembly_gifs(config, dz, nightly):
|
||||
|
||||
def build_gif_from_png(fileName):
|
||||
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:
|
||||
print(f"Error calling shell script: {e}")
|
||||
|
||||
|
||||
@ -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);
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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();
|
||||
@ -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);
|
||||
|
||||
|
||||
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user