RAKE_DEPTH=1; RAKE_WIDTH=1; RAKE_STRETCH=1; RAKE_CHAMFER=0.5; module partial_ring(part, radius, thickness, height) { rotate(180-180*part, [0, 0, 1]) rotate_extrude(angle=360*part) translate([radius, 0]){ polygon(points = [[thickness/2,height/2-0.5], [thickness/2-0.5,height/2], [-thickness/2+0.5,height/2], [-thickness/2,height/2-0.5], [-thickness/2,-height/2+0.5], [-thickness/2+0.5,-height/2], [thickness/2-0.5,-height/2], [thickness/2,-height/2+0.5]]); } } module headband(size, height, thickness, part, stretch_len, tip_len, tip_bend, rake_depth = RAKE_DEPTH, rake_width = RAKE_WIDTH, rake_stretch = RAKE_STRETCH, rake_chamfer = RAKE_CHAMFER, with_rake=true) { union() { 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"){ rotate(90,[0,1,0]){ rotate(90, [0,0,1]){ linear_extrude(stretch_len, center = true, convexity = 10){ polygon(points = [[thickness/2,height/2-0.5], [thickness/2-0.5,height/2], [-thickness/2+0.5,height/2], [-thickness/2,height/2-0.5], [-thickness/2,-height/2+0.5], [-thickness/2+0.5,-height/2], [thickness/2-0.5,-height/2], [thickness/2,-height/2+0.5]]); } } } } 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*part, [0, 0, 1]) translate([stretch_len/2, -size, 0]) { color("orange"){ rotate(90,[0,1,0]){ rotate(90, [0,0,1]){ linear_extrude(stretch_len, center = true, convexity = 10){ polygon(points = [[thickness/2,height/2-0.5], [thickness/2-0.5,height/2], [-thickness/2+0.5,height/2], [-thickness/2,height/2-0.5], [-thickness/2,-height/2+0.5], [-thickness/2+0.5,-height/2], [thickness/2-0.5,-height/2], [thickness/2,-height/2+0.5]]); } } } } 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 ); } } if (with_rake) 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); } } } }