// Copyright 2022 Thorsten Brehm // brehmt (at) gmail dot com // Radius of the corners Box_Corner_Radius = 3.0*ScalingFactor; // [0: 10] // Box skin width SKIN = 1.0; // [1: 0.1: 5] /* [Hidden] */ // Width (X) of the box BoxX_Width = 155.5*ScalingFactor; // [60: 145] // Height (Y) of the box BoxY_Height = 91*ScalingFactor; // [10: 100] // Depth (Z) of the box BoxZ_Depth = 219*ScalingFactor; // [10: 200] // Width of the ventilation cut VentilationWidth = 4*ScalingFactor; VentilationYHeight = 30*ScalingFactor; VentilationXLength = 15*ScalingFactor; // Distance of the first ventilation cut from the rear VentilationZOffset = 17*ScalingFactor; // Distance between the ventilation cuts VentilationZDistance = 9.2*ScalingFactor; // Number of ventilation cuts VentilationCount = 9; // Top grooves TopGrooveXWidth = 110*ScalingFactor; TopGrooveZLength = 80*ScalingFactor; TopGrooveYDepth = 2;//*ScalingFactor; TopGrooveCornerRadius = 6*ScalingFactor; // Rear wall RearWallGap = 1.5; RearWallCableGapHeight = 3; RearWallCableGapWidth = 27+3; //26mm cable width RearWallCableGapXOffset = 10+2*ScalingFactor; RearWallZLedge = 17; RearWallZOffset = 2.5; // Strain Relief CableStrainReliefYOffset = BoxY_Height-20; // distance from the top of the box // Front panel FrontPanelGap = 0.5; FrontPanelZLedge = 10; FrontPanelZOffset = 2; // Distance of the gap at the front (from the left/right edge) FrontGapX = 21; FrontGapWidth = 0.8; FrontGapY = FrontPanelZOffset+5; // Screws ScrewDiameter = 3; ScrewPostDiameter = ScrewDiameter+2; ScrewPostHeight = 5; ScrewPostFillet = 2; // Display DisplayWidth = (LCD == "large") ? 55.01+2 : 30+2; // active area: 29.42 DisplayHeight = (LCD == "large") ? 27.5+2 : 15+3; // active area: 14.7 DisplayXDistance = 15*ScalingFactor; // distance from the left of the panel DisplayYDistance = 3.5+9*ScalingFactor; // distance from the top of the panel DisplayCornerRadius = 2; DisplayPegXDistance = (LCD == "large") ? 72.0 : (31.0-0.2); DisplayPegYDistance = (LCD == "large") ? 38.8 : 28.5; DisplayPegYOffset = (LCD == "large") ? 2.64 : 2.25; // from the top. The display mounting ports are not centered, but have an offset (shifted towards the bottom). // frame around the display opening DisplayFrameZHeight = 0.5; // Pegs to hold the display DisplayPegHeight = 4+1; DisplayPegDiameter = 3; // 3.5 // SDSlot SDSlotWidth = 12.5; // 12 SDSlotHeight = 3; SDSlotCorners = 1; SDSlotXDistance = BoxX_Width/2-SDSlotWidth/2; // distance from the left of the panel SDSlotYDistance = 10; // distance from the bottom of the panel to the bottom of the SD slot // Square Buttons ButtonYHeight = (ScalingFactor<1) ? 8.5 : 10; ButtonXWidth = (ScalingFactor<1) ? 8.5 : 10; ButonZDepth = SKIN*2+1.5; ButtonCorners = 1; ButtonLedgeWidth = 2-0.5; ButtonPegDiameter = 3.5+0.2-0.1; ButtonPegDepth = 2.5; ButtonXOfs = 15*ScalingFactor; // distance from the right edge ButtonYOfs = 9*ScalingFactor;//9*ScalingFactor; // distance from the top ButtonRaster = 2.54; // 0.01" ButtonXSpacing = ButtonRaster*5; // multiple of 2.54mm => allow micro switches to be soldered on prototype raster PCBs ButtonYSpacing = ButtonRaster*5; // multiple of 2.54mm => allow micro switches to be soldered on prototype raster PCBs ButtonScrewPostHeight = 9-0.5; // LEDs LedDiameter = (ScalingFactor<1) ? 3.4-0.1 : 5; // 3.4 LedSocketHeight = 1.5; LedYDistance = (ScalingFactor<1) ? LedDiameter+3 : LedDiameter+3.5; // distance between the two LEDs LedXOfs = (ScalingFactor<1) ? 22 : 20+LedDiameter/2; // distance from the left edge LedYOfs = (ScalingFactor<1) ? 16 : 20; // FloppyEmu PCB PcbXWidth = 45-1; PcbYHeight = 2; PcbZDepth = 100.0; PcbXOfs = -0.75+0.5; // from the center. SD Slot on FloppyEmu is not quite centered PcbYOfs = SDSlotYDistance-PcbYHeight+1; PcbZOfs = FrontPanelZOffset+SKIN+0.5; PcbScrewDiameter = 3; PcbScrewPostDiameter = PcbScrewDiameter+3; PcbScrewDistance = 2.5; // distance from the PCB edges include ; include ; include ; include ; include ; include ; module main() { if (part == "test") { intersection() { makeTop(); translate([-10,BoxY_Height-22,BoxZ_Depth-32]) cube([40, 40, 32]); } } else if (part == "button") { for (x = [0,1]) for (y = [0,1]) if ((x!=0)||(y!=0)) translate([x*ButtonXSpacing, y*ButtonYSpacing, -ButonZDepth]) button(); else translate([x*ButtonXSpacing, y*ButtonYSpacing, -ButonZDepth]) resetButton(); translate([-15, 20, 0]) rotate([0,0,90]) makeCableStrainRelief(); translate([30, -15, 0]) makeRearPcbFeet(); } else if (part == "rear") { makeRear(); } else if (part == "front") { makeFront(); } else if (part == "top") { makeTop(); } else if (part == "topBottom") { makeTop(); translate([0, -ComponentSeparation, 0 ]) makeBottom(); } else if (part == "bottom") { makeBottom(); } else if (part == "all") { makeTop(); translate([0, -ComponentSeparation, 0 ]) makeBottom(); translate([0, 0, ComponentSeparation ]) makeRear(); translate([0, 0, -ComponentSeparation ]) makeFront(); } else if ((part == "noFront")||(part == "noRear")||(part=="noBottom")||(part=="frontBottom")) { if (part != "frontBottom") makeTop(); if (part != "noBottom") makeBottom(); if ((part != "noRear")&&(part != "frontBottom")) makeRear(); if (part != "noFront") makeFront(); } else { // nothing! } if ((showPcb == "yes")&&(part != "button")) makePcb(); } main();