This is now ready for the first release, with a fully customizable, 3d printable traditional shoebox layout. Other layouts may come later.
The layout below (that I have personally printed and am using) is 7.15L with a Noctua NH-L12S, an SFX PSU, a 140mm intake fan, and a Zotac 1080 Mini. There are other power supply and cooling options to choose from (including an AIO). The case will automatically resize to match the chosen components. Everything else in the case is fully customizable too with more effort using OpenSCAD.
Full instructions and files for download are up on GitHub. The license is 2-clause BSD (a common open source software license): https://github.com/eclecticc/ParametricCase
Original Post
I've kicked off a project to build a parametric 3D printed Mini-ITX case. The goal is to create a couple of architectures that are programmatic to the point that CPU cooler height and GPU length can be input as numbers, and a case to fit those perfectly is outputted.
I'm holding a few constraints for this project:
I'm doing this using OpenSCAD, which is a fully parametric CAD program where you create models basically by writing code. As an example, here is a Mini-ITX motherboard with keepouts:
The layout below (that I have personally printed and am using) is 7.15L with a Noctua NH-L12S, an SFX PSU, a 140mm intake fan, and a Zotac 1080 Mini. There are other power supply and cooling options to choose from (including an AIO). The case will automatically resize to match the chosen components. Everything else in the case is fully customizable too with more effort using OpenSCAD.
Full instructions and files for download are up on GitHub. The license is 2-clause BSD (a common open source software license): https://github.com/eclecticc/ParametricCase
Original Post
I've kicked off a project to build a parametric 3D printed Mini-ITX case. The goal is to create a couple of architectures that are programmatic to the point that CPU cooler height and GPU length can be input as numbers, and a case to fit those perfectly is outputted.
I'm holding a few constraints for this project:
- I want the entire case (minus side panels and some accessory pieces) to be printable in one print on the 3D printer I have. This is a Prusa i3 MK3 with a 250x210x210 print volume. Parameters larger than that can still be used if you have access to a bigger printer, but the architectures I'm picking are designed within these bounds.
- I'm architecting for the 250mm axis to be along the length of the video card. This again constrains the possible layouts, and you can adjust the parameters differently if you choose to.
- The PSU is going in the case with AC in. This means either FlexATX in the architecture shown above, or trading off against CPU cooler height in an architecture with it above the motherboard and using SFX or SFX-L.
I'm doing this using OpenSCAD, which is a fully parametric CAD program where you create models basically by writing code. As an example, here is a Mini-ITX motherboard with keepouts:
Code:
// Base PCB dimensions
miniitx = [170, 170, 1.57];
// Motherboard mounting hold diameter and offsets (relative to hole c)
miniitx_hole = 3.96;
miniitx_hole_c = [10.16, 6.35];
miniitx_hole_f = [22.86, 157.48];
miniitx_hole_h = [154.94, 0];
miniitx_hole_j = [154.94, 157.48];
extra = 1.0;
// Keepouts on top and bottom of board
miniitx_bottom_keepout = 0.25 * 25.4;
module motherboard(keepouts) {
area_a_keepout = [27, 15, 170-27-30, 170-15, 57];
area_b_keepout = [0, 0, 170, 15, 16];
area_c_keepout = [170-30, 15, 30, 170-15, 38];
area_d_keepout = [0, 15, 27, 170-15, 39];
color("Green", 1.0) {
difference() {
cube(miniitx);
translate([miniitx_hole_c[0], miniitx_hole_c[1], -extra/2]) {
cylinder(r = miniitx_hole/2, h = miniitx[2]+extra);
for (hole = [miniitx_hole_f, miniitx_hole_h, miniitx_hole_j]) {
translate([hole[0], hole[1], 0]) cylinder(r = miniitx_hole/2, h = miniitx[2]+extra);
}
}
}
}
color("GreenYellow", 0.25) {
if (keepouts == true) {
translate([0, 0, -miniitx_bottom_keepout]) cube([miniitx[0], miniitx[1], miniitx_bottom_keepout]);
for (keepout = [area_a_keepout, area_b_keepout, area_c_keepout, area_d_keepout]) {
translate([keepout[0], keepout[1], miniitx[2]]) {
cube([keepout[2], keepout[3], keepout[4]]);
}
}
}
}
}
Last edited: