I just upgraded my cutting boards and didn’t want them to get damaged by sitting in water. So my latest 3D printing project is a behind-the-faucet cutting board holder that will keep my boards out of water, while letting them dry off. So far it’s working great.

Below is the OpenSCAD code that I wrote:

$fn = 60;
x = 0; y = 1; z = 2;
rack = [110, 82, 50];	// the width, depth, height of rack
faucet = 50;		// the diameter of the faucet
faucetH = 15;		// the height of the loop around the faucet
thick = 5;		// the wall thickness
spacer = 2;		// the distance between the faucet and rack
smallerX = rack[x]-2*thick;
smallerZ = rack[z]-2*thick;

// bottom frame
difference() {
   cube([rack[x], rack[y], 2*thick]);
   translate([thick, thick, -thick])
      cube([rack[x]-2*thick, rack[y]-2*thick, 4*thick]);
}
difference() {
   union() {
      // front arch
      difference() {
         translate([rack[x]/2, thick, 0])
            scale([rack[x]/(rack[z]*2), 1, 1])
         rotate([90, 0, 0])
         cylinder(h=thick, r=rack[z]);
         translate([rack[x]/2, 1.5*thick, 0])
            scale([smallerX/(smallerZ*2), 1, 1])
         rotate([90, 0, 0])
         cylinder(h=2*thick, r=smallerZ);
      }
      //  back arch
      difference() {
         translate([rack[x]/2, rack[y], 0])
            scale([rack[x]/(rack[z]*2), 1, 1])
         rotate([90, 0, 0])
         cylinder(h=thick, r=rack[z]);
         translate([rack[x]/2, rack[y]+.75*thick, 0])
            scale([smallerX/(smallerZ*2), 1, 1])
         rotate([90, 0, 0])
         cylinder(h=2*thick, r=smallerZ);
      }
   }
   translate([0, 0, -rack[z]])
   cube([2*rack[x], 2*rack[y], 2*rack[z]], center=true);
}
// faucet loop
translate([0, -spacer, 0])
   difference() {
      // faucet cylinder
      translate([rack[x]/2, -(faucet/2)-thick, faucetH/2])
         difference() {
            cylinder(h=faucetH, d=faucet+2*thick, center=true);
            cylinder(h=2*faucetH, d=faucet, center=true);
         }
      // faucet space
      translate([rack[x]/2-(.8*faucet)/2, -1.5*faucet, -faucetH])
      cube([.8*faucet, faucet, 3*faucetH]);
   }