$fn=64; // --- Parameters --- jar_diameter = 120; // Inner diameter to fit the treat jar wall_thickness = 4; // Thickness of the holder walls base_thickness = 5; // Thickness of the solid base holder_height = 90; // Total height of the holder front_cutout_width = 75; // Width of the front slot for easy gripping/viewing front_cutout_z = 45; // Height from the bottom where the front slot begins suction_hole_radius = 12; // Hole in the base to prevent vacuum when removing jar // --- Calculated Variables --- outer_radius = (jar_diameter / 2) + wall_thickness; inner_radius = jar_diameter / 2; // --- Geometry --- difference() { // Main outer body cylinder(r=outer_radius, h=holder_height); // Inner hollow for the jar translate([0, 0, base_thickness]) cylinder(r=inner_radius, h=holder_height + 1); // Anti-suction hole in the bottom base translate([0, 0, -1]) cylinder(r=suction_hole_radius, h=base_thickness + 2); // Front access and viewing slot translate([0, 0, front_cutout_z]) { // Rounded bottom of the slot rotate([-90, 0, 0]) cylinder(r=front_cutout_width/2, h=outer_radius + 2); // Straight vertical cutout for the slot translate([-front_cutout_width/2, 0, 0]) cube([front_cutout_width, outer_radius + 2, holder_height]); } }