/*////////////////////////////////////////////////////////////////// - FB Aka Heartman/Hearty 2016 - - http://heartygfx.blogspot.com - - OpenScad Parametric Box - - CC BY-NC 3.0 License - //////////////////////////////////////////////////////////////////// 12/02/2016 - Fixed minor bug 28/02/2016 - Added holes ventilation option 09/03/2016 - Added PCB feet support, fixed the shell artefact on export mode. */////////////////////////// - Info - ////////////////////////////// // All coordinates are starting as integrated circuit pins. // From the top view : // CoordD <--- CoordC // ^ // ^ // ^ // CoordA ---> CoordB //////////////////////////////////////////////////////////////////// ////////// - Paramètres de la boite - Box parameters - ///////////// /* [Box dimensions] */ // - Longueur - Length Length = 160; // - Largeur - Width Width = 170; // - Hauteur - Height Height = 100; // - Epaisseur - Wall thickness Thick = 2;//[2:5] /* [Box options] */ // - Diamètre Coin arrondi - Filet diameter Filet = 2;//[0.1:12] // - lissage de l'arrondi - Filet smoothness Resolution = 50;//[1:100] // - Tolérance - Tolerance (Panel/rails gap) m = 0.9; // Pieds PCB - PCB feet (x4) PCBFeet = 1;// [0:No, 1:Yes] // - Decorations to ventilation holes Vent = 1;// [0:No, 1:Yes] // - Decoration-Holes width (in mm) Vent_width = 1.5; /* [PCB_Feet] */ //All dimensions are from the center foot axis // - Coin bas gauche - Low left corner X position PCBPosX = 7; // - Coin bas gauche - Low left corner Y position PCBPosY = 6; // - Longueur PCB - PCB Length PCBLength = 70; // - Largeur PCB - PCB Width PCBWidth = 50; // - Heuteur pied - Feet height FootHeight = 10; // - Diamètre pied - Foot diameter FootDia = 8; // - Diamètre trou - Hole diameter FootHole = 3; /* [STL element to export] */ //Coque haut - Top shell TShell = 0;// [0:No, 1:Yes] //Coque bas- Bottom shell BShell = 1;// [0:No, 1:Yes] //Panneau avant - Front panel FPanL = 1;// [0:No, 1:Yes] //Panneau arrière - Back panel BPanL = 1;// [0:No, 1:Yes] /* [Hidden] */ // - Couleur coque - Shell color Couleur1 = "Orange"; // - Couleur panneaux - Panels color Couleur2 = "OrangeRed"; // Thick X 2 - making decorations thicker if it is a vent to make sure they go through shell Dec_Thick = Vent ? Thick*2 : Thick; // - Depth decoration Dec_size = Vent ? Thick*2 : 0.8; /////////// - Boitier générique bord arrondis - Generic rounded box - ////////// module RoundBox($a=Length, $b=Width, $c=Height) {// Cube bords arrondis $fn=Resolution; translate([0,Filet,Filet]) { minkowski () { cube ([$a-(Length/2),$b-(2*Filet),$c-(2*Filet)], center = false); rotate([0,90,0]) { cylinder(r=Filet,h=Length/2, center = false); } } } } // End of RoundBox Module ////////////////////////////////// - Module Coque/Shell - ////////////////////////////////// module Coque() {//Coque - Shell Thick = Thick*2; difference() { difference() {//sides decoration union() { difference() {//soustraction de la forme centrale - Substraction Fileted box difference() {//soustraction cube median - Median cube slicer union() {//union difference() {//Coque RoundBox(); translate([Thick/2,Thick/2,Thick/2]) { RoundBox($a=Length-Thick, $b=Width-Thick, $c=Height-Thick); } }//Fin diff Coque difference() {//largeur Rails translate([Thick+m,Thick/2,Thick/2]) {// Rails RoundBox($a=Length-((2*Thick)+(2*m)), $b=Width-Thick, $c=Height-(Thick*2)); }//fin Rails translate([((Thick+m/2)*1.55),Thick/2,Thick/2+0.1]) { // +0.1 added to avoid the artefact RoundBox($a=Length-((Thick*3)+2*m), $b=Width-Thick, $c=Height-Thick); } }//Fin largeur Rails }//Fin union translate([-Thick,-Thick,Height/2]) {// Cube à soustraire cube ([Length+100, Width+100, Height], center=false); } }//fin soustraction cube median - End Median cube slicer translate([-Thick/2,Thick,Thick]) {// Forme de soustraction centrale RoundBox($a=Length+Thick, $b=Width-Thick*2, $c=Height-Thick); } } difference() {// wall fixation box legs union() { translate([3*Thick +5,Thick,Height/2]) { rotate([90,0,0]) { $fn=6; cylinder(d=16,Thick/2); } } translate([Length-((3*Thick)+5),Thick,Height/2]) { rotate([90,0,0]) { $fn=6; cylinder(d=16,Thick/2); } } } translate([4,Thick+Filet,Height/2-57]) { rotate([45,0,0]) { cube([Length,40,40]); } } translate([0,-(Thick*1.46),Height/2]) { cube([Length,Thick*2,10]); } } //Fin fixation box legs } union() {// outbox sides decorations for(i=[0:Thick:Length/4]) { // Ventilation holes part code submitted by Ettie - Thanks ;) translate([10+i,-Dec_Thick+Dec_size,1]) { cube([Vent_width,Dec_Thick,Height/4]); } translate([(Length-10) - i,-Dec_Thick+Dec_size,1]) { cube([Vent_width,Dec_Thick,Height/4]); } translate([(Length-10) - i,Width-Dec_size,1]) { cube([Vent_width,Dec_Thick,Height/4]); } translate([10+i,Width-Dec_size,1]) { cube([Vent_width,Dec_Thick,Height/4]); } }// fin de for }//fin union decoration }//fin difference decoration union() { //sides holes $fn=50; translate([3*Thick+5,20,Height/2+4]) { rotate([90,0,0]) { cylinder(d=2,20); } } translate([Length-((3*Thick)+5),20,Height/2+4]) { rotate([90,0,0]) { cylinder(d=2,20); } } translate([3*Thick+5,Width+5,Height/2-4]) { rotate([90,0,0]) { cylinder(d=2,20); } } translate([Length-((3*Thick)+5),Width+5,Height/2-4]) { rotate([90,0,0]) { cylinder(d=2,20); } } }//fin de sides holes }//fin de difference holes }// fin coque ////////////////////////////// - Experiment - /////////////////////////////////////////// /////////////////////// - Foot with base filet - ///////////////////////////// module foot(FootDia,FootHole,FootHeight) { Filet=2; color(Couleur1) translate([0,0,Filet-1.5]) difference() { difference() { cylinder(d=FootDia+Filet,FootHeight-Thick, $fn=100); rotate_extrude($fn=100) { translate([(FootDia+Filet*2)/2,Filet,0]) { minkowski() { square(10); circle(Filet, $fn=100); } } } } cylinder(d=FootHole,FootHeight+1, $fn=100); } }// Fin module foot module Feet() { //////////////////// - PCB only visible in the preview mode - ///////////////////// translate([3*Thick+2,Thick+5,FootHeight+(Thick/2)-0.5]) { %square ([PCBLength+10,PCBWidth+10]); translate([PCBLength/2,PCBWidth/2,0.5]) { color("Olive") %text("PCB", halign="center", valign="center", font="Arial black"); } } // Fin PCB ////////////////////////////// - 4 Feet - ////////////////////////////////////////// translate([3*Thick+7,Thick+10,Thick/2]) { foot(FootDia,FootHole,FootHeight); } translate([(3*Thick)+PCBLength+7,Thick+10,Thick/2]) { foot(FootDia,FootHole,FootHeight); } translate([(3*Thick)+PCBLength+7,(Thick)+PCBWidth+10,Thick/2]) { foot(FootDia,FootHole,FootHeight); } translate([3*Thick+7,(Thick)+PCBWidth+10,Thick/2]) { foot(FootDia,FootHole,FootHeight); } } // Fin du module Feet //////////////////////////////////////////////////////////////////////// ////////////////////// <- Holes Panel Manager -> /////////////////////// //////////////////////////////////////////////////////////////////////// // <- Panel -> module Panel(Length,Width,Thick,Filet) { scale([0.5,1,1]) minkowski() { cube([Thick,Width-(Thick*2+Filet*2+m),Height-(Thick*2+Filet*2+m)]); translate([0,Filet,Filet]) rotate([0,90,0]) cylinder(r=Filet,h=Thick, $fn=100); } } // <- Circle hole -> // Cx=Cylinder X position | Cy=Cylinder Y position | Cdia= Cylinder dia | Cheight=Cyl height module CylinderHole(OnOff,Cx,Cy,Cdia) { if(OnOff==1) translate([Cx,Cy,-1]) cylinder(d=Cdia,10, $fn=50); } // <- Square hole -> // Sx=Square X position | Sy=Square Y position | Sl= Square Length | Sw=Square Width | Filet = Round corner module SquareHole(OnOff,Sx,Sy,Sl,Sw,Filet) { if(OnOff==1) minkowski() { translate([Sx+Filet/2,Sy+Filet/2,-1]) cube([Sl-Filet,Sw-Filet,10]); cylinder(d=Filet,h=10, $fn=100); } } // <- Linear text panel -> module LText(OnOff,Tx,Ty,Font,Size,Content) { if(OnOff==1) translate([Tx,Ty,Thick+.5]) linear_extrude(height = 0.5) { text(Content, size=Size, font=Font); } } // <- Circular text panel-> module CText(OnOff,Tx,Ty,Font,Size,TxtRadius,Angl,Turn,Content) { if(OnOff==1) { Angle = -Angl / len(Content); translate([Tx,Ty,Thick+.5]) for (i= [0:len(Content)-1] ) { rotate([0,0,i*Angle+90+Turn]) translate([0,TxtRadius,0]) { linear_extrude(height = 0.5) { text(Content[i], font = Font, size = Size, valign ="baseline", halign ="center"); } } } } } ////////////////////// <- New module Panel -> ////////////////////// module FPanL() { difference() { color(Couleur2) Panel(Length,Width,Thick,Filet); rotate([90,0,90]) { color(Couleur2) { // <- Cutting shapes from here -> SquareHole (1,20,20,15,10,1); //(On/Off, Xpos,Ypos,Length,Width,Filet) SquareHole (1,40,20,15,10,1); SquareHole (1,60,20,15,10,1); CylinderHole(1,27,40,8); //(On/Off, Xpos, Ypos, Diameter) CylinderHole(1,47,40,8); CylinderHole(1,67,40,8); SquareHole (1,20,50,80,30,3); CylinderHole(1,93,30,10); SquareHole (1,120,20,30,60,3); // <- To here -> } } } color(Couleur1) { translate ([-.5,0,0]) rotate([90,0,90]) { // <- Adding text from here -> LText(1,20,83,"Arial Black",4,"Digital Screen");//(On/Off, Xpos, Ypos, "Font", Size, "Text") LText(1,120,83,"Arial Black",4,"Level"); LText(1,20,11,"Arial Black",6," 1 2 3"); CText(1,93,29,"Arial Black",4,10,180,0,"1 . 2 . 3 . 4 . 5 . 6");//(On/Off, Xpos, Ypos, "Font", Size, Diameter, Arc(Deg), Starting Angle(Deg),"Text") // <- To here -> } } } /////////////////////////// <- Main part -> ///////////////////////// if(TShell==1) // Coque haut - Top Shell color( Couleur1,1) { translate([0,Width,Height+0.2]) { rotate([0,180,180]) { Coque(); } } } if(BShell==1) // Coque bas - Bottom shell color(Couleur1) { Coque(); } // Pied support PCB - PCB feet if (PCBFeet==1) // Feet translate([PCBPosX,PCBPosY,0]) { Feet(); } // Panneau avant - Front panel <<<<<< Text and holes only on this one. //rotate([0,-90,-90]) if(FPanL==1) translate([Length-(Thick*2+m/2),Thick+m/2,Thick+m/2]) FPanL(); //Panneau arrière - Back panel if(BPanL==1) color(Couleur2) translate([Thick+m/2,Thick+m/2,Thick+m/2]) Panel(Length,Width,Thick,Filet);