use ; /* [Basic] */ shape = "Heart"; // [Flower, Circle, Heart] model = "Outer"; // [Outer, Inner] width = 30; radius = 20; height = 100; thickness = 1; spacing = 0.65; twist = 180; /* [Advanced] */ slices = 200; module twist_bottle(model, height, thickness, twist, spacing, slices) { $fn = 48; module bottle() { box_extrude(height = height + thickness, shell_thickness = thickness, twist = twist, slices = slices) children(); } module inner_container() { bottle() offset(r = -thickness - spacing) children(); linear_extrude(thickness) children(); } if(model == "Outer") { bottle() children(); } else if(model == "Inner") { inner_container() children(); } } module heart(radius, center = false) { sin45 = sin(45); cos45 = cos(45); module heart_sub_component(radius) { diameter = radius * 2; $fn = 48; translate([-radius * cos45, 0, 0]) rotate(-45) { circle(radius); translate([0, -radius, 0]) square(diameter); } } offsetX = center ? 0 : radius + radius * cos(45); offsetY = center ? 1.5 * radius * sin45 - 0.5 * radius : 3 * radius * sin45; translate([offsetX, offsetY, 0]) { heart_sub_component(radius); mirror([1, 0, 0]) heart_sub_component(radius); } } if(shape == "Flower") { twist_bottle(model, height, thickness, twist, spacing, slices) union() { for(i = [0:3]) { rotate(90 * i) translate([radius * 0.5, 0, 0]) circle(radius * 0.5); } } } else if(shape == "Circle") { twist_bottle(model, height, thickness, twist, spacing, slices) difference() { circle(radius); union() { for(a = [0:120:240]) { rotate(a) translate([radius, 0, 0]) circle(radius / 4); } } } } else if(shape == "Heart") { twist_bottle(model, height, thickness, twist, spacing, slices) heart(radius * 1.9 / (3 * sin(45) + 1), center = true); }