module BallWithHole() { translate([2, 3, 7]) scale([0.7, 0.5, 1]) difference() { sphere(30); translate([0, 0, -31]) cylinder(r=10, h=62); } sphere(5); } module XDimensionBound(maxval=1000) { union() { translate([0, 1]) projection() rotate([90, 0, 0]) linear_extrude(maxval+1) projection() children(); translate([0, -1]) projection() translate([0, 1]) rotate([-90, 0, 0]) linear_extrude(maxval+1) projection() children(); } } module XYPlaneIntersect(maxval=1000) { intersection() { XDimensionBound(maxval) children(); rotate([0, 0, 90]) XDimensionBound(maxval) rotate([0, 0, -90]) children(); } } module XZPlaneIntersect(maxval=1000) { intersection() { XDimensionBound(maxval) rotate([-90, 0, 0]) children(); rotate([0, 0, 90]) XDimensionBound(maxval) rotate([-90, 0, -90]) children(); } } module YZPlaneIntersect(maxval=1000) { intersection() { XDimensionBound(maxval) rotate([0, -90, 0]) children(); rotate([0, 0, 90]) XDimensionBound(maxval) rotate([0, -90, -90]) children(); } } module XYExtent(maxval=1000) { translate([0, 0, -1]) linear_extrude(maxval+1) XYPlaneIntersect(maxval) children(); mirror([0, 0, 1]) translate([0, 0, -1]) linear_extrude(maxval+1) XYPlaneIntersect(maxval) children(); } module XZExtent(maxval=1000) { rotate([90, 0, 0]) { translate([0, 0, -1]) linear_extrude(maxval+1) XZPlaneIntersect(maxval) children(); mirror([0, 0, 1]) translate([0, 0, -1]) linear_extrude(maxval+1) XZPlaneIntersect(maxval) children(); } } module YZExtent(maxval=1000) { rotate([0, 90, 0]) { translate([0, 0, -1]) linear_extrude(maxval+1) YZPlaneIntersect(maxval) children(); mirror([0, 0, 1]) translate([0, 0, -1]) linear_extrude(maxval+1) YZPlaneIntersect(maxval) children(); } } module BoundingBox(maxval=1000) { intersection() { XYExtent(maxval) children(); XZExtent(maxval) children(); YZExtent(maxval) children(); } } BallWithHole(); color("red", alpha=0.2) BoundingBox(100) BallWithHole();