/// Chamfering OpenSCAD Example /// Written by Robert Quattlebaum, 2022-12-14 /// /// This example shows a method for adding a chamfer to a certain /// class of 3D objects where the profile in the Z dimension doesn't /// change significantly. /// /// You must specify the size of the chamfer, the height of the child /// and the Z-offset for the bottom of the object. You can also specify /// the shape of the chamfer, which can be either "cone", "curve", "curve-in", /// or "pyramid". /// /// This process is ultimately slow, but should be faster than using minkowski. module chamfer(size=2, child_h=5, child_bot=0, shape="curve") { chamfer_size=size; module chamfer_shape() { if (shape == "cone") { $fn=16; cylinder(chamfer_size/2,chamfer_size/2,0); } else if (shape == "curve") { $fn=4; for( y = [0:1/$fn:1]) { cylinder(chamfer_size/2*(1-y),chamfer_size/2/cos(180/$fn)*y,0); } } else if (shape == "curve-in") { $fn=16; intersection() { sphere(chamfer_size/2/cos(180/$fn)); translate([0,0,chamfer_size/2]) cube(chamfer_size, center=true); } } else if (shape == "pyramid") { $fn=4; cylinder(chamfer_size/2/cos(180/$fn),chamfer_size/2,0); } } module lower_chamfer() { minkowski() { linear_extrude(0.0001) difference() { square([1000,1000],center=true); projection()children(0); } chamfer_shape(); } } module upper_chamfer() { scale([1,1,-1])lower_chamfer()children(); } render()difference() { children(); translate([0,0,child_bot])lower_chamfer()children(); translate([0,0,child_bot+child_h])upper_chamfer()children(); } } ///////////////////////////////////////////////////////////////////////// module my_shape(h=5) { translate([0,0,h/2]) { difference() { cube([50,50,h],center=true); cube([20,20,h+1],center=true); } translate([20,21,0])cylinder(h=h,r=20,center=true); } } h=5; chamfer(3, child_h=h, shape="cone") my_shape(h);