$fn = 64; // --- PARAMETERS --- bottle_radius = 45; base_height = 8; neck_radius = 14; neck_height = 30; rim_radius = 19; rim_height = 6; cork_radius = 14; cork_height = 15; inner_cavity_radius = 28; wall_thickness = 6; num_cable_slots = 6; slot_width = 7; slot_height = 8; // Calculated Z heights for smooth transitions z_sphere = 35; z_neck = 80; z_rim = z_neck + neck_height - rim_height; z_cork = z_rim + rim_height; // --- MAIN MODULE --- difference() { // Solid exterior union() { // Main base and lower bulbous body hull() { cylinder(r=bottle_radius, h=base_height); translate([0, 0, z_sphere]) sphere(r=bottle_radius); } // Upper body / shoulder taper hull() { translate([0, 0, z_sphere]) sphere(r=bottle_radius); translate([0, 0, z_neck]) cylinder(r=neck_radius, h=1); } // Neck translate([0, 0, z_neck]) cylinder(r=neck_radius, h=neck_height); // Rim translate([0, 0, z_rim]) cylinder(r=rim_radius, h=rim_height); // Cork translate([0, 0, z_cork - 1]) cylinder(r1=neck_radius-1, r2=cork_radius+1, h=cork_height + 1); // Decorative leather tie / ring around the base of the neck translate([0, 0, z_neck - 2]) rotate_extrude() translate([neck_radius + 1.5, 0, 0]) circle(r=2.5); } // Hollow interior for hiding excess cable loops union() { // Central cavity bottom opening translate([0, 0, -1]) cylinder(r=inner_cavity_radius, h=20); // Main inner cavity hull() { translate([0, 0, 15]) cylinder(r=inner_cavity_radius, h=1); translate([0, 0, z_sphere]) sphere(r=bottle_radius - wall_thickness); } // Inner upper body taper (tapered to a point to print without internal supports) hull() { translate([0, 0, z_sphere]) sphere(r=bottle_radius - wall_thickness); translate([0, 0, z_neck - 5]) cylinder(r=1, h=1); } } // Archway cable routing slots (mouse holes) for(i=[0:num_cable_slots-1]) { rotate([0, 0, i * (360/num_cable_slots)]) { // Cutout for cable to pass through the thick base wall translate([inner_cavity_radius - 5, -slot_width/2, -1]) { // Rectangular base of the slot cube([bottle_radius + 10, slot_width, slot_height + 1]); // Arched top of the slot translate([0, slot_width/2, slot_height + 1]) rotate([0, 90, 0]) cylinder(r=slot_width/2, h=bottle_radius + 10); } } } }