diff --git a/chamfer.scad b/chamfer.scad new file mode 100644 index 0000000..fb16d1d --- /dev/null +++ b/chamfer.scad @@ -0,0 +1,78 @@ +/// 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); diff --git a/headband.scad b/headband.scad index 9ab8fcd..df4c3a0 100644 --- a/headband.scad +++ b/headband.scad @@ -10,51 +10,65 @@ TIP_BEND=20; RAKE_DEPTH=1; RAKE_WIDTH=1; RAKE_STRETCH=1; -RAKE_CHAMPFER=0.5; +RAKE_CHAMFER=0.5; +CHAMFER=1; +CHAMFER_SHAPE="cone"; + +use module partial_ring(part, radius, thickness, height) { - rotate(180-180*part, [0, 0, 1]) - rotate_extrude(angle=360*part) - translate([radius, 0]) - square([thickness, height], center=true); + rotate(180-180*part, [0, 0, 1]) + rotate_extrude(angle=360*part) + translate([radius, 0]) + square([thickness, height], center=true); } -module headband(debug=DEBUG, size=SIZE, height=HEIGHT, thickness=THICKNESS, part=PART, stretch_len=STRETCH_LEN, tip_len=TIP_LEN, tip_bend=TIP_BEND, rake_depth=RAKE_DEPTH, rake_width=RAKE_WIDTH, rake_stretch=RAKE_STRETCH, rake_champfer=RAKE_CHAMPFER) { - union() { - color("purple") partial_ring(part, radius=size, thickness=thickness, height=height); - rotate( 90-180*part, [0, 0, 1]) translate([stretch_len/2, size, 0]) { - color("orange") cube([stretch_len, thickness, height], center=true); +module headband(debug=DEBUG, size=SIZE, height=HEIGHT, thickness=THICKNESS, part=PART, stretch_len=STRETCH_LEN, tip_len=TIP_LEN, tip_bend=TIP_BEND, rake_depth=RAKE_DEPTH, rake_width=RAKE_WIDTH, rake_stretch=RAKE_STRETCH, rake_chamfer=RAKE_CHAMFER, chamfer=CHAMFER, chamfer_shape=CHAMFER_SHAPE) { + union() { + chamfer(size=chamfer, child_h=height, child_bot=-height/2, shape=chamfer_shape) union() { + color("purple") + partial_ring(part, radius=size, thickness=thickness, height=height); + rotate( 90-180*part, [0, 0, 1]) + translate([stretch_len/2, size, 0]) { + color("orange") cube([stretch_len, thickness, height], center=true); color("purple") translate([stretch_len/2, tip_bend, 0]) - rotate(90+180*tip_len, [0, 0, 1]) - partial_ring( - part=tip_len, - radius=tip_bend, - thickness=thickness, - height=height - ); + rotate(90+180*tip_len, [0, 0, 1]) + partial_ring( + part=tip_len, + radius=tip_bend, + thickness=thickness, + height=height + ); } - rotate(-90+180*part, [0, 0, 1]) translate([stretch_len/2, -size, 0]) { - color("orange") cube([stretch_len, thickness, height], center=true); - color("purple") scale([1, -1, 1]) translate([stretch_len/2, tip_bend, 0]) + rotate(-90+180*part, [0, 0, 1]) + translate([stretch_len/2, -size, 0]) { + color("orange") + cube([stretch_len, thickness, height], center=true); + color("purple") + scale([1, -1, 1]) + translate([stretch_len/2, tip_bend, 0]) rotate(90+180*tip_len, [0, 0, 1]) - partial_ring( - part=tip_len, - radius=tip_bend, - thickness=thickness, - height=height - ); + partial_ring( + part=tip_len, + radius=tip_bend, + thickness=thickness, + height=height + ); + } + } + for (i=[-size/2:size/2]) { + rotate(i*2-rake_width/2, [0, 0, 1]) + intersection() { + scale([1, 1, rake_stretch/(rake_depth/height)]) + translate([0, rake_width/2, 0]) + rotate_extrude(angle=rake_width) + translate([rake_depth/2-size+thickness/2, 0, 0]) + scale([1, 0.5, 1]) + circle(r=rake_depth, $fn=3); + translate([rake_depth/2-size+thickness/2-rake_chamfer, 0, 0]) + color("red") + cube([2*rake_depth, rake_width, height], center=true); } - for (i=[-size/2:size/2]) { - rotate(i*2-rake_width/2, [0, 0, 1]) intersection() { - scale([1, 1, rake_stretch/(rake_depth/height)]) - translate([0, rake_width/2, 0]) rotate_extrude(angle=rake_width) - translate([rake_depth/2-size+thickness/2, 0, 0]) - scale([1, 0.5, 1]) - circle(r=rake_depth, $fn=3); - translate([rake_depth/2-size+thickness/2-rake_champfer, 0, 0]) - color("red") - cube([2*rake_depth, rake_width, height], center=true); - } - }; }; + }; }