/************************************************* Parametric circular two-part mold generator Author: Jason Webb Website: http://jason-webb.info *************************************************/ // Model parameters model_filename = "Extrudy_Object_2018_09_15_16_31_37.stl"; model_rotate = [0,90,90]; model_translate = [0,-25,0]; model_scale = .75; // Mold parameters mold_diameter = 33; mold_height = 25; mold_spacing = 5; // Pour hole parameters pour_hole_translate = [0,0,0]; pour_hole_rotate = [90,0,-90]; pour_hole_r1 = 3.5; pour_hole_r2 = 3.5; pour_hole_height = 50; // Registration marks parameters key_size = 3; key_margin = 7; key_fettle = 0.4; master_key_size = [6,6,4]; side_by_side(); /**************************************** Rotate and place both halves side by side along the X axis for easy single-plate printing *****************************************/ module side_by_side() { // Rotate about the Z axis to align parts with X axis - helps when printing rotate([0,0,90]) { // Scoot the left half over a bit translate([0, -mold_diameter - mold_spacing/2, mold_height]) bottom_half(); // Rotate the top half, then scoot it over a bit rotate([0,180,0]) translate(v = [0, mold_diameter + mold_spacing/2, -mold_height]) top_half(); } } /******************************************* Bottom half of the mold ********************************************/ module bottom_half() { // Create the mold form with negative keys difference() { // Create the basic mold form by subtracting the STL from a cube half it's size difference() { translate([0,0,-mold_height]) cylinder(r1 = mold_diameter, r2 = mold_diameter, mold_height); scale(model_scale) translate(model_translate) rotate(model_rotate) import(model_filename); } // Key 1 (negative) translate([-mold_diameter/2 + key_margin, -mold_diameter + key_margin, 0]) sphere(key_size + key_fettle, $fn = 30); // Key 2 (negative) translate([mold_diameter/2 - key_margin, mold_diameter - key_margin, 0]) sphere(key_size + key_fettle, $fn = 30); // Pour hole translate(pour_hole_translate) rotate(pour_hole_rotate) cylinder(pour_hole_height, pour_hole_r1, pour_hole_r2); } // Key 3 (positive) translate([-mold_diameter/2 + key_margin, mold_diameter/2 + key_margin, 0]) sphere(key_size, $fn = 30); // Key 4 (positive) translate([mold_diameter/2 - key_margin, -mold_diameter/2 - key_margin, 0]) sphere(key_size, $fn = 30); } /******************************************* Top half of the mold ********************************************/ module top_half() { // Create the mold form with negative keys difference() { // Create the mold form by subtracting the STL from a cube half it's size difference() { translate([0,0,0]) cylinder(r1 = mold_diameter, r2 = mold_diameter, mold_height); scale(model_scale) translate(model_translate) rotate(model_rotate) import(model_filename); } // Key 3 (negative) translate([-mold_diameter/2 + key_margin, mold_diameter/2 + key_margin, 0]) sphere(key_size + key_fettle, $fn = 30); // Key 4 (negative) translate([mold_diameter/2 - key_margin, -mold_diameter/2 - key_margin, 0]) sphere(key_size + key_fettle, $fn = 30); // Pour hole translate(pour_hole_translate) rotate(pour_hole_rotate) cylinder(pour_hole_height, pour_hole_r1, pour_hole_r2); } // Key 1 (positive) translate([-mold_diameter/2 + key_margin, -mold_diameter + key_margin, 0]) sphere(key_size, $fn = 30); // Key 2 (positive) translate([mold_diameter/2 - key_margin, mold_diameter - key_margin, 0]) sphere(key_size, $fn = 30); }