$fn = $preview ? 32 : 64; eraser_width = 125.6; eraser_height = 51; eraser_depth = 24; frame_margin = 10; frame_thickness = 2; nub_diameter = 2; screw_holes = true; screw_hole_diameter = 5; holder_offset = 60; pen_diameter = 17.7; pen_count = 6; module clasp(diameter) { difference() { cube([ diameter + frame_thickness * 2, frame_margin, diameter * 0.74 + frame_thickness * 2 + nub_diameter / 2 ]); translate([ frame_thickness, -1, frame_thickness + diameter / 2 ]) cube([ diameter, frame_margin * 4 + 2, diameter ]); translate([ diameter / 2 + frame_thickness, -1, diameter / 2 + frame_thickness ]) rotate([-90, 0, 0]) cylinder( h=frame_margin + 2, r=diameter / 2 ); } translate([ frame_thickness, frame_margin / 2, frame_thickness + diameter * 0.74 ]) sphere(nub_diameter / 2); translate([ frame_thickness + diameter, frame_margin / 2, frame_thickness + diameter * 0.74 ]) sphere(nub_diameter / 2); } // Eraser shelf difference() { cube([ eraser_width + frame_thickness * 2, eraser_height + frame_thickness * 2, eraser_depth + frame_thickness * 2 ]); translate([ frame_thickness, frame_thickness, frame_thickness ]) cube([ eraser_width, eraser_height + frame_thickness + 1, eraser_depth + frame_thickness + 1 ]); if (screw_holes) { translate([ frame_thickness + frame_margin, eraser_height + frame_thickness * 2 - frame_margin, -1 ]) cylinder( h=frame_thickness + 2, r=screw_hole_diameter / 2 ); translate([ eraser_width + frame_thickness - frame_margin, eraser_height + frame_thickness * 2 - frame_margin, -1 ]) cylinder( h=frame_thickness + 2, r=screw_hole_diameter / 2 ); } } // Pen holder frame difference() { translate([ 0, -holder_offset, 0 ]) cube([ eraser_width + frame_thickness * 2, holder_offset, frame_thickness ]); translate([ frame_margin, -holder_offset + frame_margin, -1 ]) cube([ eraser_width + frame_thickness * 2 - frame_margin * 2, holder_offset - frame_margin, frame_thickness + 2 ]); } // Lower screw bar difference() { union() { translate([ 0, -holder_offset * 0.618 + frame_margin * 0.375, 0, ]) cube([ eraser_width, frame_margin / 2, frame_thickness ]); translate([ eraser_width / 2 + frame_thickness, -holder_offset * 0.618 + frame_margin * 0.625, 0, ]) cylinder( h=frame_thickness, r=frame_margin / 2 ); } translate([ eraser_width / 2 + frame_thickness, -holder_offset * 0.618 + frame_margin * 0.625, -1, ]) cylinder( h=frame_thickness + 2, r=screw_hole_diameter / 2 ); } // Pen holder clasps translate([ (eraser_width - pen_count * (pen_diameter + frame_thickness) + frame_thickness) / 2, -holder_offset, 0 ]) for(i = [0:pen_count - 1]) { translate([(pen_diameter + frame_thickness) * i, 0]) clasp(pen_diameter); }