Zimablade rack
This commit is contained in:
Binary file not shown.
|
After Width: | Height: | Size: 26 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 27 KiB |
@@ -0,0 +1,305 @@
|
|||||||
|
/*
|
||||||
|
INTRODUCTION
|
||||||
|
|
||||||
|
Fan adaptor in scad.
|
||||||
|
|
||||||
|
Versions:
|
||||||
|
1.11 Played around with a module for the flange. Works fine, but some more understanding is needed.
|
||||||
|
1.1. Aiming for a more complex version now. I will try and use IF statements to choose between having a lower flange with holes going through the inside or not. Essentially emulating the thruholes and no holes versions of the SWorks files. Geometry still very simple and unrefined. There is a lot of repetition, I should get the hang of using modules and functions I guess.
|
||||||
|
1. Very simple, two flanges, cowling, and no special treatment of lower flange holes.
|
||||||
|
|
||||||
|
Initial values are 120 to 80.
|
||||||
|
|
||||||
|
Very basic appearance at the moment, just testing out the software and getting a feel for it. I may tidy up in later versions and as I learn more about the software.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* BASIC SETUP */
|
||||||
|
//Select type option. Cowling: Small fan screws accessed through the cowling. External: Small fan screws accessed from outside of the adaptor. Customiser makes the "Cowling" option look messy, but they are fine once created. Flange: A simple flat plate with mounting holes for large and small size but no cowling. Very inefficient flow but a very low profile.
|
||||||
|
holeaccess="Cowling"; //[Cowling,External,Flange]
|
||||||
|
|
||||||
|
//Smoothing of cylindrical faces (Can be ignored under most circumstances)
|
||||||
|
$fn = 80;
|
||||||
|
|
||||||
|
/* VARIABLES */
|
||||||
|
//Nominal fan sizes
|
||||||
|
//Nominal size of the smaller fan
|
||||||
|
smallsize=80;
|
||||||
|
//Nominal size of the larger fan. It is possible to choose the same size for both. This can lead to funky results sometimes.
|
||||||
|
largesize=120;
|
||||||
|
|
||||||
|
//Flange thicknesses
|
||||||
|
//Small side flange thickness
|
||||||
|
smallflange=3; //[1:0.2:6]
|
||||||
|
//Large side flange thickness (flange thickness used for the "Flange" option above)
|
||||||
|
largeflange=4; //[1:0.2:6]
|
||||||
|
|
||||||
|
//Cowling size
|
||||||
|
//Total height is cowling height plus the flange thicknesses.
|
||||||
|
//Thickness of the cowling wall
|
||||||
|
wallthickness=2; //[1:0.2:5]
|
||||||
|
//Height of the cowling, taller generally leads to better airflow. Total height will be this plus flange thicknesses.
|
||||||
|
cowlingheight=30;
|
||||||
|
|
||||||
|
/*
|
||||||
|
Mounting hole spacing and size
|
||||||
|
Size is usually pretty uniform (4.5 mm) due to using standard screws however for smaller sizes the screw holes are likely smaller
|
||||||
|
*/
|
||||||
|
//Spacing
|
||||||
|
//Small fan side mounting hole spacing
|
||||||
|
smallholes=71.5;
|
||||||
|
//Large fan side mounting hole spacing
|
||||||
|
largeholes=105;
|
||||||
|
//Size
|
||||||
|
//Diameter of the mounting holes on the small fan side
|
||||||
|
smallholesize=4.5; //[2:0.25:6]
|
||||||
|
//Diameter of the mounting holes on the large fan side
|
||||||
|
largeholesize=4.5; //[2:0.25:6]
|
||||||
|
|
||||||
|
|
||||||
|
/* MODULES */
|
||||||
|
module flange (size_fan,thick_wall,thick_flange,space_mount,size_mount) {
|
||||||
|
/*
|
||||||
|
Creates a flange with or without mounting holes cut.
|
||||||
|
|
||||||
|
VARIABLES
|
||||||
|
size_fan: The given nominal size of the fan
|
||||||
|
thick_wall: The cowling wall thickness
|
||||||
|
thick_flange: The thickness of the flange
|
||||||
|
space_mount: The spacing between mounting holes. If 0 then no holes will be cut.
|
||||||
|
size_mount: The diameter of the mounting holes
|
||||||
|
*/
|
||||||
|
|
||||||
|
//OPERATION
|
||||||
|
//difference() to perform subtractive operations on the base flange piece
|
||||||
|
difference(){
|
||||||
|
//translate() half flange thickness from initial centre position.
|
||||||
|
//This ensures the base small flange is sitting at z=0 on the XY plane.
|
||||||
|
translate([0,0,thick_flange/2])
|
||||||
|
//Uncut flange shape.
|
||||||
|
cube(size=[size_fan+thick_wall*2, size_fan+thick_wall*2, thick_flange], center=true);
|
||||||
|
|
||||||
|
//Cut fan hole
|
||||||
|
translate([0,0,thick_flange/2])
|
||||||
|
//Hole shape removed by the difference() operation
|
||||||
|
cylinder(h=thick_flange, d=size_fan, center=true);
|
||||||
|
|
||||||
|
//Check for mounting hole requirement
|
||||||
|
if (space_mount>0) {
|
||||||
|
//Cut each hole individually.
|
||||||
|
//I haven't yet found a pattern command and mirror doesn't copy as far as I can see.
|
||||||
|
//This way will suffice for now.
|
||||||
|
translate([space_mount/2, space_mount/2, thick_flange/2])
|
||||||
|
cylinder(h=thick_flange, d=size_mount, center=true);
|
||||||
|
|
||||||
|
translate([-space_mount/2, space_mount/2, thick_flange/2])
|
||||||
|
cylinder(h=thick_flange, d=size_mount, center=true);
|
||||||
|
|
||||||
|
translate([space_mount/2, -space_mount/2, thick_flange/2])
|
||||||
|
cylinder(h=thick_flange, d=size_mount, center=true);
|
||||||
|
|
||||||
|
translate([-space_mount/2, -space_mount/2, thick_flange/2])
|
||||||
|
cylinder(h=thick_flange, d=size_mount, center=true);
|
||||||
|
} // if (space_mount>0)
|
||||||
|
|
||||||
|
else { /*do nothing*/ } // else
|
||||||
|
|
||||||
|
} // difference
|
||||||
|
} // module flange
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
MODEL CODE
|
||||||
|
Starts with an if statement to distinguish between type choices.
|
||||||
|
holeaccess variable is user choice.
|
||||||
|
Choices are:
|
||||||
|
1. Cowling: Small side hole access from inside the cowling
|
||||||
|
2. External: Small side access from outside the adaptor
|
||||||
|
3. Angled: With an angle between flanges. Hole access is as external.
|
||||||
|
*/
|
||||||
|
if (holeaccess=="Cowling") {
|
||||||
|
/*
|
||||||
|
MATHS
|
||||||
|
*/
|
||||||
|
//Calculate boss and countersink sizes
|
||||||
|
smallholeboss=smallholesize*3;
|
||||||
|
smallholecountersink=smallholesize*1.75;
|
||||||
|
|
||||||
|
//difference() to subtract the inner parts and mounting holes from a solid geometry.
|
||||||
|
difference(){
|
||||||
|
/*
|
||||||
|
union() command to join cowling and flanges together and add small side hole bosses.
|
||||||
|
Lower flange built centred on the xy plane at z=0
|
||||||
|
Cowling built centrally on top of the lower flange
|
||||||
|
Upper flange built centrally on top of the cowling
|
||||||
|
|
||||||
|
Create geometry:
|
||||||
|
1. lower flange
|
||||||
|
2. cowling
|
||||||
|
3. lower mounting hole bosses
|
||||||
|
4. upper flange
|
||||||
|
*/
|
||||||
|
union(){
|
||||||
|
//1. Lower flange
|
||||||
|
translate([0,0,smallflange/2])
|
||||||
|
//Uncut flange shape. Centred for ease. The position uses basic maths.
|
||||||
|
cube(size=[smallsize+wallthickness*2, smallsize+wallthickness*2, smallflange], center=true);
|
||||||
|
|
||||||
|
//2. Cowling
|
||||||
|
translate([0,0,smallflange+cowlingheight/2])
|
||||||
|
//tapered cylinder for cowling
|
||||||
|
//difference to other tapered cylinder
|
||||||
|
cylinder(h=cowlingheight, r1=smallsize/2+wallthickness, r2=largesize/2+wallthickness, center=true);
|
||||||
|
|
||||||
|
//3. Lower mounting hole bosses
|
||||||
|
/*
|
||||||
|
Extruding the mounting hole bosses.
|
||||||
|
I don't know of a way to extrude to a surface, so for now will do it this way.
|
||||||
|
Mirror seems to not have a copy option, so I have to recreate each boss for each corner. Again, there is probably a better way to do it, but I will have to learn it.
|
||||||
|
*/
|
||||||
|
translate([smallholes/2,smallholes/2, (cowlingheight+smallflange)/2])
|
||||||
|
cylinder(h=cowlingheight+smallflange, d=smallholeboss, center=true);
|
||||||
|
|
||||||
|
translate([-smallholes/2,smallholes/2, (cowlingheight+smallflange)/2])
|
||||||
|
cylinder(h=cowlingheight+smallflange, d=smallholeboss, center=true);
|
||||||
|
|
||||||
|
translate([smallholes/2,-smallholes/2, (cowlingheight+smallflange)/2])
|
||||||
|
cylinder(h=cowlingheight+smallflange, d=smallholeboss, center=true);
|
||||||
|
|
||||||
|
translate([-smallholes/2,-smallholes/2, (cowlingheight+smallflange)/2])
|
||||||
|
cylinder(h=cowlingheight+smallflange, d=smallholeboss, center=true);
|
||||||
|
|
||||||
|
//4. Upper flange
|
||||||
|
translate([0,0,smallflange+cowlingheight])
|
||||||
|
flange(largesize,wallthickness,largeflange,largeholes,largeholesize);
|
||||||
|
} //union
|
||||||
|
|
||||||
|
/*
|
||||||
|
Remove inner geometry:
|
||||||
|
1. lower flange fan hole
|
||||||
|
2. cowling
|
||||||
|
3. lower mounting holes
|
||||||
|
4. lower mounting hole countersink
|
||||||
|
*/
|
||||||
|
//1. Lower flange fan hole
|
||||||
|
translate([0,0,smallflange/2])
|
||||||
|
//Uncut flange shape. Centred for ease. The position uses basic maths.
|
||||||
|
cylinder(h=smallflange, d=smallsize, center=true);
|
||||||
|
|
||||||
|
//2. Cowling
|
||||||
|
translate([0,0,smallflange+cowlingheight/2])
|
||||||
|
//tapered cylinder for cowling
|
||||||
|
//difference to other tapered cylinder
|
||||||
|
cylinder(h=cowlingheight, d1=smallsize, d2=largesize, center=true);
|
||||||
|
|
||||||
|
//3. lower mounting holes
|
||||||
|
/*
|
||||||
|
Cutting the mounting holes.
|
||||||
|
Mirror seems to not have a copy option, so I have to recreate each hole for each corner. Again, there is probably a better way to do it, but I will have to learn it.
|
||||||
|
*/
|
||||||
|
translate([smallholes/2,smallholes/2,(smallflange+cowlingheight+largeflange)/2])
|
||||||
|
cylinder(h=smallflange+cowlingheight+largeflange, d=smallholesize, center=true);
|
||||||
|
|
||||||
|
translate([-smallholes/2,smallholes/2,(smallflange+cowlingheight+largeflange)/2])
|
||||||
|
cylinder(h=smallflange+cowlingheight+largeflange, d=smallholesize, center=true);
|
||||||
|
|
||||||
|
translate([smallholes/2,-smallholes/2,(smallflange+cowlingheight+largeflange)/2])
|
||||||
|
cylinder(h=smallflange+cowlingheight+largeflange, d=smallholesize, center=true);
|
||||||
|
|
||||||
|
translate([-smallholes/2,-smallholes/2,(smallflange+cowlingheight+largeflange)/2])
|
||||||
|
cylinder(h=smallflange+cowlingheight+largeflange, d=smallholesize, center=true);
|
||||||
|
|
||||||
|
//4. lower mounting hole countersink
|
||||||
|
/*
|
||||||
|
Cutting the mounting hole counter sinks.
|
||||||
|
Mirror seems to not have a copy option, so I have to recreate each countersink for each corner. Again, there is probably a better way to do it, but I will have to learn it.
|
||||||
|
*/
|
||||||
|
translate([smallholes/2,smallholes/2, (cowlingheight+largeflange)/2+smallflange])
|
||||||
|
cylinder(h=cowlingheight+largeflange, d=smallholecountersink, center=true);
|
||||||
|
|
||||||
|
translate([-smallholes/2,smallholes/2, (cowlingheight+largeflange)/2+smallflange])
|
||||||
|
cylinder(h=cowlingheight+largeflange, d=smallholecountersink, center=true);
|
||||||
|
|
||||||
|
translate([smallholes/2,-smallholes/2, (cowlingheight+largeflange)/2+smallflange])
|
||||||
|
cylinder(h=cowlingheight+largeflange, d=smallholecountersink, center=true);
|
||||||
|
|
||||||
|
translate([-smallholes/2,-smallholes/2, (cowlingheight+largeflange)/2+smallflange])
|
||||||
|
cylinder(h=cowlingheight+largeflange, d=smallholecountersink, center=true);
|
||||||
|
|
||||||
|
} //difference
|
||||||
|
} //if
|
||||||
|
|
||||||
|
else if (holeaccess=="External") {
|
||||||
|
/*
|
||||||
|
1. Begin by revolving the shape of the cowling.
|
||||||
|
2: Add the lower and upper flanges using the flange() module
|
||||||
|
|
||||||
|
1. Revolve the cowling
|
||||||
|
Draw revolved polygon shape
|
||||||
|
This requires a polygon following points inside a rotate_extrude
|
||||||
|
*/
|
||||||
|
|
||||||
|
rotate_extrude(angle=360, convexity=10)
|
||||||
|
polygon(points=[[smallsize/2,smallflange],
|
||||||
|
[(smallsize/2)+wallthickness,smallflange],
|
||||||
|
[(largesize/2)+wallthickness,cowlingheight+smallflange],
|
||||||
|
[largesize/2,cowlingheight+smallflange]]);
|
||||||
|
|
||||||
|
//2. Use modules to create the flanges
|
||||||
|
//Lower (smaller) flange
|
||||||
|
flange(smallsize,wallthickness,smallflange,smallholes,smallholesize);
|
||||||
|
|
||||||
|
//Upper (larger) flange
|
||||||
|
translate([0,0,smallflange+cowlingheight])
|
||||||
|
flange(largesize,wallthickness,largeflange,largeholes,largeholesize);
|
||||||
|
} //else if (holeaccess=="External")
|
||||||
|
|
||||||
|
else if (holeaccess=="Flange") {
|
||||||
|
/*
|
||||||
|
1. Create blank flange according to "largesize"
|
||||||
|
2. Cut "smallsize" hole into flange blank
|
||||||
|
3. Drill large size holes (largeholes, largeholesize)
|
||||||
|
4. Drill small size holes (smallholes, smallholesize)
|
||||||
|
*/
|
||||||
|
//1. Create blank flange according to "largesize"
|
||||||
|
//difference() to perform subtractive operations on the base flange piece
|
||||||
|
difference(){
|
||||||
|
//translate() half flange thickness from initial centre position.
|
||||||
|
//This ensures the base small flange is sitting at z=0 on the XY plane.
|
||||||
|
translate([0,0,largeflange/2])
|
||||||
|
//Uncut flange shape.
|
||||||
|
cube(size=[largesize+largeflange*2, largesize+largeflange*2, largeflange], center=true);
|
||||||
|
//2. Cut "smallsize" hole into flange blank
|
||||||
|
//Cut fan hole
|
||||||
|
translate([0,0,largeflange/2])
|
||||||
|
//Hole shape removed by the difference() operation
|
||||||
|
cylinder(h=largeflange, d=smallsize, center=true);
|
||||||
|
|
||||||
|
//3. Drill large size holes (largeholes, largeholesize)
|
||||||
|
//4. Drill small size holes (smallholes, smallholesize)
|
||||||
|
//Cut each largesize hole individually.
|
||||||
|
translate([largeholes/2, largeholes/2, largeflange/2])
|
||||||
|
cylinder(h=largeflange, d=largeholesize, center=true);
|
||||||
|
|
||||||
|
translate([-largeholes/2, largeholes/2, largeflange/2])
|
||||||
|
cylinder(h=largeflange, d=largeholesize, center=true);
|
||||||
|
|
||||||
|
translate([largeholes/2, -largeholes/2, largeflange/2])
|
||||||
|
cylinder(h=largeflange, d=largeholesize, center=true);
|
||||||
|
|
||||||
|
translate([-largeholes/2, -largeholes/2, largeflange/2])
|
||||||
|
cylinder(h=largeflange, d=largeholesize, center=true);
|
||||||
|
|
||||||
|
//Cut each smallsize hole individually.
|
||||||
|
translate([smallholes/2, smallholes/2, largeflange/2])
|
||||||
|
cylinder(h=largeflange, d=smallholesize, center=true);
|
||||||
|
|
||||||
|
translate([-smallholes/2, smallholes/2, largeflange/2])
|
||||||
|
cylinder(h=largeflange, d=smallholesize, center=true);
|
||||||
|
|
||||||
|
translate([smallholes/2, -smallholes/2, largeflange/2])
|
||||||
|
cylinder(h=largeflange, d=smallholesize, center=true);
|
||||||
|
|
||||||
|
translate([-smallholes/2, -smallholes/2, largeflange/2])
|
||||||
|
cylinder(h=largeflange, d=smallholesize, center=true);
|
||||||
|
} //difference()
|
||||||
|
} //else if (holeaccess=="Flange")
|
||||||
@@ -62,13 +62,13 @@ bullets();
|
|||||||
federal_holder();
|
federal_holder();
|
||||||
cci_holder();
|
cci_holder();
|
||||||
|
|
||||||
base_l=77;
|
|
||||||
base_w=45;
|
|
||||||
plate_l=70;
|
|
||||||
plate_w=37.5;
|
|
||||||
riser_l=70;
|
riser_l=70;
|
||||||
riser_w=35;
|
riser_w=35;
|
||||||
riser_h=6;
|
riser_h=6;
|
||||||
|
base_l=riser_l+10;
|
||||||
|
base_w=riser_w+10;
|
||||||
|
plate_l=70;
|
||||||
|
plate_w=37.5;
|
||||||
|
|
||||||
// federal_riser_vertical
|
// federal_riser_vertical
|
||||||
color("blue", alpha=1) {
|
color("blue", alpha=1) {
|
||||||
@@ -80,7 +80,7 @@ color("blue", alpha=1) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// federal_riser_horizontal
|
// federal_riser_horizontal
|
||||||
color("blue", alpha=1) {
|
*color("blue", alpha=1) {
|
||||||
cuboid([base_l,base_w,4], rounding=4, edges=[FWD+RIGHT,FWD+LEFT,BACK+RIGHT,BACK+LEFT], anchor=TOP);
|
cuboid([base_l,base_w,4], rounding=4, edges=[FWD+RIGHT,FWD+LEFT,BACK+RIGHT,BACK+LEFT], anchor=TOP);
|
||||||
cuboid([riser_l,riser_w,riser_h], rounding=1, edges=[FWD+RIGHT,FWD+LEFT,BACK+RIGHT,BACK+LEFT], anchor=BOT);
|
cuboid([riser_l,riser_w,riser_h], rounding=1, edges=[FWD+RIGHT,FWD+LEFT,BACK+RIGHT,BACK+LEFT], anchor=BOT);
|
||||||
for (i = [-14.5:14.5:14.5]) {
|
for (i = [-14.5:14.5:14.5]) {
|
||||||
@@ -89,7 +89,7 @@ color("blue", alpha=1) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// cci riser
|
// cci riser
|
||||||
!color("orange", alpha=1) {
|
color("orange", alpha=1) {
|
||||||
difference() {
|
difference() {
|
||||||
rect_tube(size=[base_l,base_w], isize=[riser_l+1,riser_w+1], h=23, rounding=4, irounding=1, anchor=BOT);
|
rect_tube(size=[base_l,base_w], isize=[riser_l+1,riser_w+1], h=23, rounding=4, irounding=1, anchor=BOT);
|
||||||
translate([0,0,20]) rect_tube(size=[plate_l+1,plate_w+1], wall=3, h=3, rounding=1, anchor=BOT);
|
translate([0,0,20]) rect_tube(size=[plate_l+1,plate_w+1], wall=3, h=3, rounding=1, anchor=BOT);
|
||||||
|
|||||||
@@ -53,4 +53,10 @@ translate([0,-tube_length/2,0]) end();
|
|||||||
|
|
||||||
color("red") {
|
color("red") {
|
||||||
mid();
|
mid();
|
||||||
|
}
|
||||||
|
|
||||||
|
// extension
|
||||||
|
color("pink") {
|
||||||
|
translate([0,tube_length/2+2,-27.5]) cuboid([100,26,5], rounding=2, edges=[BOT,FRONT+LEFT,FRONT+RIGHT,BACK+LEFT,BACK+RIGHT]);
|
||||||
|
translate([0,tube_length/2+12.5,-2.5]) cuboid([100,5,55], rounding=2, edges=[BACK,TOP+LEFT,TOP+RIGHT,BOT+LEFT,BOT+RIGHT]);
|
||||||
}
|
}
|
||||||
Binary file not shown.
Reference in New Issue
Block a user