update
This commit is contained in:
26574
cases/profiles/rockpro/bottom.stl
Normal file
26574
cases/profiles/rockpro/bottom.stl
Normal file
File diff suppressed because it is too large
Load Diff
197
cases/profiles/rockpro/case.scad
Normal file
197
cases/profiles/rockpro/case.scad
Normal file
@ -0,0 +1,197 @@
|
||||
// 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);
|
||||
125
cases/profiles/rockpro/dual-tray-plate-part.scad
Normal file
125
cases/profiles/rockpro/dual-tray-plate-part.scad
Normal file
@ -0,0 +1,125 @@
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
BIN
cases/profiles/rockpro/dual-tray-plate-part.stl
Normal file
BIN
cases/profiles/rockpro/dual-tray-plate-part.stl
Normal file
Binary file not shown.
125
cases/profiles/rockpro/dual-tray.scad
Normal file
125
cases/profiles/rockpro/dual-tray.scad
Normal file
@ -0,0 +1,125 @@
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
BIN
cases/profiles/rockpro/dual-tray.stl
Normal file
BIN
cases/profiles/rockpro/dual-tray.stl
Normal file
Binary file not shown.
201
cases/profiles/rockpro/newcase.scad
Normal file
201
cases/profiles/rockpro/newcase.scad
Normal file
@ -0,0 +1,201 @@
|
||||
|
||||
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();
|
||||
33546
cases/profiles/rockpro/newcase.stl
Normal file
33546
cases/profiles/rockpro/newcase.stl
Normal file
File diff suppressed because it is too large
Load Diff
198
cases/profiles/rockpro/railTest.stl
Normal file
198
cases/profiles/rockpro/railTest.stl
Normal file
@ -0,0 +1,198 @@
|
||||
solid OpenSCAD_Model
|
||||
facet normal -1 0 0
|
||||
outer loop
|
||||
vertex 0 2.41621 -5
|
||||
vertex 0 4.05 5
|
||||
vertex 0 4.05 -5
|
||||
endloop
|
||||
endfacet
|
||||
facet normal -1 -0 0
|
||||
outer loop
|
||||
vertex 0 4.05 5
|
||||
vertex 0 2.41621 -5
|
||||
vertex 0 2.41621 5
|
||||
endloop
|
||||
endfacet
|
||||
facet normal -1 0 0
|
||||
outer loop
|
||||
vertex 0 -4.05 -5
|
||||
vertex 0 -2.41621 5
|
||||
vertex 0 -2.41621 -5
|
||||
endloop
|
||||
endfacet
|
||||
facet normal -1 -0 0
|
||||
outer loop
|
||||
vertex 0 -2.41621 5
|
||||
vertex 0 -4.05 -5
|
||||
vertex 0 -4.05 5
|
||||
endloop
|
||||
endfacet
|
||||
facet normal -1 0 0
|
||||
outer loop
|
||||
vertex -2.325 -3.62432 -5
|
||||
vertex -2.325 3.62432 5
|
||||
vertex -2.325 3.62432 -5
|
||||
endloop
|
||||
endfacet
|
||||
facet normal -1 -0 0
|
||||
outer loop
|
||||
vertex -2.325 3.62432 5
|
||||
vertex -2.325 -3.62432 -5
|
||||
vertex -2.325 -3.62432 5
|
||||
endloop
|
||||
endfacet
|
||||
facet normal 0.461085 0.887356 -0
|
||||
outer loop
|
||||
vertex 0 2.41621 -5
|
||||
vertex -2.325 3.62432 5
|
||||
vertex 0 2.41621 5
|
||||
endloop
|
||||
endfacet
|
||||
facet normal 0.461085 0.887356 0
|
||||
outer loop
|
||||
vertex -2.325 3.62432 5
|
||||
vertex 0 2.41621 -5
|
||||
vertex -2.325 3.62432 -5
|
||||
endloop
|
||||
endfacet
|
||||
facet normal 0.461085 -0.887356 0
|
||||
outer loop
|
||||
vertex -2.325 -3.62432 -5
|
||||
vertex 0 -2.41621 5
|
||||
vertex -2.325 -3.62432 5
|
||||
endloop
|
||||
endfacet
|
||||
facet normal 0.461085 -0.887356 0
|
||||
outer loop
|
||||
vertex 0 -2.41621 5
|
||||
vertex -2.325 -3.62432 -5
|
||||
vertex 0 -2.41621 -5
|
||||
endloop
|
||||
endfacet
|
||||
facet normal 1 -0 0
|
||||
outer loop
|
||||
vertex 3.5 -4.05 5
|
||||
vertex 3.5 4.05 -5
|
||||
vertex 3.5 4.05 5
|
||||
endloop
|
||||
endfacet
|
||||
facet normal 1 0 0
|
||||
outer loop
|
||||
vertex 3.5 4.05 -5
|
||||
vertex 3.5 -4.05 5
|
||||
vertex 3.5 -4.05 -5
|
||||
endloop
|
||||
endfacet
|
||||
facet normal 0 0 1
|
||||
outer loop
|
||||
vertex -2.325 3.62432 5
|
||||
vertex 0 -2.41621 5
|
||||
vertex 0 2.41621 5
|
||||
endloop
|
||||
endfacet
|
||||
facet normal 0 0 1
|
||||
outer loop
|
||||
vertex 0 -2.41621 5
|
||||
vertex -2.325 3.62432 5
|
||||
vertex -2.325 -3.62432 5
|
||||
endloop
|
||||
endfacet
|
||||
facet normal 0 0 1
|
||||
outer loop
|
||||
vertex 0 2.41621 5
|
||||
vertex 3.5 4.05 5
|
||||
vertex 0 4.05 5
|
||||
endloop
|
||||
endfacet
|
||||
facet normal 0 0 1
|
||||
outer loop
|
||||
vertex 3.5 4.05 5
|
||||
vertex 0 2.41621 5
|
||||
vertex 3.5 -4.05 5
|
||||
endloop
|
||||
endfacet
|
||||
facet normal -0 0 1
|
||||
outer loop
|
||||
vertex 0 -2.41621 5
|
||||
vertex 3.5 -4.05 5
|
||||
vertex 0 2.41621 5
|
||||
endloop
|
||||
endfacet
|
||||
facet normal 0 0 1
|
||||
outer loop
|
||||
vertex 3.5 -4.05 5
|
||||
vertex 0 -2.41621 5
|
||||
vertex 0 -4.05 5
|
||||
endloop
|
||||
endfacet
|
||||
facet normal 0 0 -1
|
||||
outer loop
|
||||
vertex -2.325 -3.62432 -5
|
||||
vertex 0 2.41621 -5
|
||||
vertex 0 -2.41621 -5
|
||||
endloop
|
||||
endfacet
|
||||
facet normal -0 0 -1
|
||||
outer loop
|
||||
vertex 0 2.41621 -5
|
||||
vertex -2.325 -3.62432 -5
|
||||
vertex -2.325 3.62432 -5
|
||||
endloop
|
||||
endfacet
|
||||
facet normal 0 0 -1
|
||||
outer loop
|
||||
vertex 0 -2.41621 -5
|
||||
vertex 3.5 -4.05 -5
|
||||
vertex 0 -4.05 -5
|
||||
endloop
|
||||
endfacet
|
||||
facet normal 0 0 -1
|
||||
outer loop
|
||||
vertex 3.5 -4.05 -5
|
||||
vertex 0 -2.41621 -5
|
||||
vertex 3.5 4.05 -5
|
||||
endloop
|
||||
endfacet
|
||||
facet normal 0 0 -1
|
||||
outer loop
|
||||
vertex 0 2.41621 -5
|
||||
vertex 3.5 4.05 -5
|
||||
vertex 0 -2.41621 -5
|
||||
endloop
|
||||
endfacet
|
||||
facet normal -0 0 -1
|
||||
outer loop
|
||||
vertex 3.5 4.05 -5
|
||||
vertex 0 2.41621 -5
|
||||
vertex 0 4.05 -5
|
||||
endloop
|
||||
endfacet
|
||||
facet normal 0 1 -0
|
||||
outer loop
|
||||
vertex 3.5 4.05 -5
|
||||
vertex 0 4.05 5
|
||||
vertex 3.5 4.05 5
|
||||
endloop
|
||||
endfacet
|
||||
facet normal 0 1 0
|
||||
outer loop
|
||||
vertex 0 4.05 5
|
||||
vertex 3.5 4.05 -5
|
||||
vertex 0 4.05 -5
|
||||
endloop
|
||||
endfacet
|
||||
facet normal 0 -1 0
|
||||
outer loop
|
||||
vertex 0 -4.05 -5
|
||||
vertex 3.5 -4.05 5
|
||||
vertex 0 -4.05 5
|
||||
endloop
|
||||
endfacet
|
||||
facet normal 0 -1 -0
|
||||
outer loop
|
||||
vertex 3.5 -4.05 5
|
||||
vertex 0 -4.05 -5
|
||||
vertex 3.5 -4.05 -5
|
||||
endloop
|
||||
endfacet
|
||||
endsolid OpenSCAD_Model
|
||||
65
cases/profiles/rockpro/rockpro.scad
Normal file
65
cases/profiles/rockpro/rockpro.scad
Normal file
@ -0,0 +1,65 @@
|
||||
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);
|
||||
|
||||
|
||||
|
||||
|
||||
45698
cases/profiles/rockpro/top.stl
Normal file
45698
cases/profiles/rockpro/top.stl
Normal file
File diff suppressed because it is too large
Load Diff
129
cases/profiles/rpi/frontPlate.scad
Normal file
129
cases/profiles/rpi/frontPlate.scad
Normal file
@ -0,0 +1,129 @@
|
||||
include <../common.scad>
|
||||
include <../rack/screws.scad>
|
||||
include <../sinusoid.scad>
|
||||
|
||||
vU = 2;
|
||||
uHeight = 10;
|
||||
|
||||
plateScrewDiffV = uHeight*vU;
|
||||
plateScrewDiffH = 180;
|
||||
|
||||
plateScrewToHEdge = 4.5;
|
||||
plateScrewToVEdge = 5.5;
|
||||
|
||||
frontPlateThickness = 2.5;
|
||||
|
||||
frontPlateV = plateScrewDiffV + 2*plateScrewToHEdge;
|
||||
frontPlateH = plateScrewDiffH + 2*plateScrewToVEdge;
|
||||
|
||||
|
||||
plateScrewToBoxMin = 6;
|
||||
|
||||
|
||||
length = 170;
|
||||
resolution = 250;
|
||||
period = PI/6;
|
||||
shift = 0.0;
|
||||
amplitudeFunction = function(x) 2;
|
||||
|
||||
module _frontPlateBody() {
|
||||
|
||||
difference() {
|
||||
translate(v = [- plateScrewToVEdge, 0, - plateScrewToHEdge])
|
||||
cube(size = [frontPlateH, frontPlateThickness, frontPlateV]);
|
||||
}
|
||||
|
||||
translate(v=[5,-3,-1])
|
||||
rotate(a=[180,0,0])
|
||||
sineWaveHull(length, resolution, amplitudeFunction, period+0.02, 2, 5);
|
||||
|
||||
translate(v=[5,-3,4-1])
|
||||
rotate(a=[180,0,0])
|
||||
sineWaveHull(length, resolution, amplitudeFunction, period, 2 , 5);
|
||||
|
||||
translate(v=[5,-3,8-1])
|
||||
rotate(a=[180,0,0])
|
||||
sineWaveHull(length, resolution, amplitudeFunction, period+0.03, 2.5, 5);
|
||||
|
||||
translate(v=[5,-3,12-1])
|
||||
rotate(a=[180,0,0])
|
||||
sineWaveHull(length, resolution, amplitudeFunction, period+0.1, 3.3, 5);
|
||||
|
||||
translate(v=[5,-3,16-1])
|
||||
rotate(a=[180,0,0])
|
||||
sineWaveHull(length, resolution, amplitudeFunction, period+0.1, 5, 5);
|
||||
|
||||
translate(v=[5,-3,20-1])
|
||||
rotate(a=[180,0,0])
|
||||
sineWaveHull(length, resolution, amplitudeFunction, period+0.1, 6, 5);
|
||||
|
||||
translate(v=[5,-3,24-1])
|
||||
rotate(a=[180,0,0])
|
||||
sineWaveHull(length, resolution, amplitudeFunction, period+0.08, 7, 5);
|
||||
}
|
||||
|
||||
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() {
|
||||
difference() {
|
||||
|
||||
difference() {
|
||||
union() {
|
||||
rotate(a = [- 90, 0, 0])
|
||||
frontPlate();
|
||||
}
|
||||
|
||||
union() {
|
||||
translate(v=[1,0,0])
|
||||
rotate(a=[0,-15, 0])
|
||||
translate(v=[0,-50,0])
|
||||
cube(size=[100, 100, 30]);
|
||||
|
||||
translate(v=[180-1,0,0])
|
||||
mirror(v=[1,0,0]) {
|
||||
rotate(a = [0, - 15, 0])
|
||||
translate(v = [0, - 50, 0])
|
||||
cube(size = [100, 100, 30]);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
// lug holes
|
||||
union() {
|
||||
translate(v=[160,-3,-frontPlateThickness])
|
||||
cube(size=[5.2, 5.2, 3]);
|
||||
translate(v=[160-91.1,-3,-frontPlateThickness])
|
||||
cube(size=[5.2, 5.2, 3]);
|
||||
}
|
||||
}
|
||||
for (i=[0:5]) {
|
||||
translate(v=[5,i*4 - 0.75,-10])
|
||||
cube(size=[170, 1.5, 20]);
|
||||
}
|
||||
}
|
||||
BIN
cases/profiles/rpi/frontPlate.stl
Normal file
BIN
cases/profiles/rpi/frontPlate.stl
Normal file
Binary file not shown.
148
cases/profiles/rpi/rpi2b.scad
Normal file
148
cases/profiles/rpi/rpi2b.scad
Normal file
@ -0,0 +1,148 @@
|
||||
/*
|
||||
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 <../common.scad>
|
||||
|
||||
// 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]];
|
||||
|
||||
module pcb() {
|
||||
cube(size=[pcbDimensions[0], pcbDimensions[1], pcbThickness]);
|
||||
}
|
||||
|
||||
module pcbCaseBottom_() {
|
||||
translate(v=[-pcbCaseSpace[1]-caseWallThickness, -pcbCaseSpace[3]-caseWallThickness, -caseBottomThickness-pcbRise])
|
||||
difference() {
|
||||
cube(size=[
|
||||
pcbDimensions[0]+pcbCaseSpace[0]+pcbCaseSpace[1] + 2*caseWallThickness,
|
||||
pcbDimensions[1]+pcbCaseSpace[2]+pcbCaseSpace[3] + 2*caseWallThickness,
|
||||
26 // 3u case, subtracted for and other bullshit
|
||||
]);
|
||||
translate(v=[caseWallThickness, caseWallThickness, caseBottomThickness])
|
||||
cube(size=[
|
||||
pcbDimensions[0]+pcbCaseSpace[0]+pcbCaseSpace[1],
|
||||
pcbDimensions[1]+pcbCaseSpace[2]+pcbCaseSpace[3],
|
||||
26 // 3u case, subtracted 4 for lid and bullshit
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
module pcbCaseWithRisers_() {
|
||||
union() {
|
||||
translate(v=[0,0,-pcbRise]){
|
||||
|
||||
difference () {
|
||||
mountPoints_N(pcbRise, mountPointDiameter/1.5, mountPointDiameter/2, 32, false);
|
||||
mountPoints_N(pcbRise + 2, 1.95/2 - 0.05, 1.95/2 - 0.05, 32, false);
|
||||
}
|
||||
}
|
||||
pcbCaseBottom_();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
module cutoutProfileAirflow_N() {
|
||||
|
||||
// bottom cutouts
|
||||
union() {
|
||||
for (i=[0:11]) {
|
||||
translate(v=[pcbDimensions[0]/2.0, i*6 + 10,0])
|
||||
minkowski() {
|
||||
cube(size=[30,1,20], center=true);
|
||||
cylinder(h=1,r=1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// back cutout
|
||||
translate(v=[5,pcbDimensions[1]+5,-1])
|
||||
minkowski() {
|
||||
cube(size=[50,90,15], center=false);
|
||||
rotate(a=[90,0,0])
|
||||
cylinder(h=1,r=2);
|
||||
}
|
||||
|
||||
// front cutout
|
||||
translate(v=[pcbDimensions[0],2.5,1])
|
||||
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];
|
||||
translate(v=[p[0], p[1], p[2]])
|
||||
cylinder(r1=cylRad1, r2=cylRad2, h=cylHeight, $fn=cylFn, center=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])
|
||||
union() {
|
||||
// front I/O
|
||||
mirror(v=[0,1,0])
|
||||
translate(v=[1, -eps*100, pcbThickness-4])
|
||||
cube(size=[58.0 + 0.1, inf50, 19.0 + 0.1]);
|
||||
|
||||
// side I/O
|
||||
translate(v=[-48-3, (pcbDimensions[1]-54)-10, pcbThickness-4])
|
||||
cube(size=[inf50, 64, 19]);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
*cutoutProfile_N();
|
||||
//pcb();
|
||||
|
||||
BIN
cases/profiles/rpi/rpi2b.stl
Normal file
BIN
cases/profiles/rpi/rpi2b.stl
Normal file
Binary file not shown.
30438
cases/profiles/rpi/rpi2bDimTest.stl
Normal file
30438
cases/profiles/rpi/rpi2bDimTest.stl
Normal file
File diff suppressed because it is too large
Load Diff
22
cases/profiles/rpi/top.scad
Normal file
22
cases/profiles/rpi/top.scad
Normal file
@ -0,0 +1,22 @@
|
||||
|
||||
|
||||
difference() {
|
||||
union() {
|
||||
cube(size=[67,95.7,1]);
|
||||
translate(v=[2,2,1])
|
||||
cube(size=[63.2,92,3]);
|
||||
}
|
||||
|
||||
union() {
|
||||
translate(v=[3.5, 3.8,1])
|
||||
cube(size=[60,88,3]);
|
||||
|
||||
for(i=[0:7]) {
|
||||
translate(v=[33.5,i*10 + 12,0])
|
||||
minkowski() {
|
||||
cylinder(h=1,r=1);
|
||||
cube(size=[50,5,10], center=true);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
BIN
cases/profiles/rpi/top.stl
Normal file
BIN
cases/profiles/rpi/top.stl
Normal file
Binary file not shown.
95
cases/profiles/rpi/voronoi.scad
Normal file
95
cases/profiles/rpi/voronoi.scad
Normal file
@ -0,0 +1,95 @@
|
||||
|
||||
// (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