diff --git a/strap_link.scad b/strap_link.scad index 90a2cf4..c9812f0 100644 --- a/strap_link.scad +++ b/strap_link.scad @@ -1,5 +1,13 @@ -links_count=6; -include_terminal=true; +links_count=6; // [1..20] +include_terminal=true; // [true,false] +export=4; // [0:5] + +MODEL_DEMO=0; +MODEL_LINKS=1; +MODEL_CLIP=2; +MODEL_CLIP_RATCHETING=3; +MODEL_CLIP_RATCHETING_A=4; +MODEL_CLIP_RATCHETING_B=5; //validation=1; VALIDATE_INTERSECTION=1; @@ -10,6 +18,11 @@ use use include +function is_not_export() = is_undef(export) || export == 0; +function is_export() = !is_not_export(); +function is_model_strict(m) = is_export() && export == m; +function is_model(m) = is_not_export() || export == m; + function get_link_segment_size() = [15, 30, 5]; function get_link_pin_diameter() = 2; function get_link_socket_slack() = [1, 4, 1]; @@ -18,6 +31,8 @@ function get_link_socket_size() = [get_link_segment_size().z, get_link_segment_size().y - get_link_joiner_arm_size().y*2, get_link_segment_size().z]; +function get_link_clip_size() = [get_link_pin_diameter()*5, get_link_segment_size().y - 5, get_link_segment_size().z]; + echo("==============================="); echo(str("Strap length: ", (links_count * get_link_segment_size().x), " mm")); echo("==============================="); @@ -101,6 +116,127 @@ module link(terminal=false) { } } +module clip() { + socket_size=get_link_socket_size(); + clip_size=get_link_clip_size(); + pin_diam=get_link_pin_diameter(); + slot_slack=get_link_socket_slack(); + size=[clip_size.x+socket_size.x, clip_size.y, clip_size.z]; + slot_size=[clip_size.x+slot_slack.x, size.y+1, pin_diam+slot_slack.z]; + entry_size=[slot_size.x-5, clip_size.y+1, clip_size.z]; + right(clip_size.x/2) + difference() { + cuboid(size, fillet=1); + cuboid(slot_size, fillet=1); + up(entry_size.z/2) cube(entry_size, center=true); + } +} + +module clip_ratcheting(ratchet_length=20) { + socket_size=get_link_socket_size(); + clip_size=get_link_clip_size(); + pin_diam=get_link_pin_diameter(); + slot_slack=get_link_socket_slack(); + size=[clip_size.x+socket_size.x, clip_size.y, clip_size.z]; + slot_size=[clip_size.x+slot_slack.x, size.y+1, pin_diam+slot_slack.z]; + entry_size=[slot_size.x-5, clip_size.y+1, clip_size.z]; + //right(clip_size.x/2) + module hook() { + intersection() { + difference() { + cuboid(size, fillet=1); + cuboid(slot_size, fillet=1); + up(entry_size.z/2) cube(entry_size, center=true); + } + translate([0, -50, -50]) cube([100, 100, 100]); + } + } + module hookRight() { + hook(); + } + module hookLeft() { + scale([-1, 1, 1]) hook(); + } + wall=2; + tooth_size=[2, 2, 3]; + module tooth() { + s=[tooth_size.x, tooth_size.z, tooth_size.y]; + up(tooth_size.z/2) xrot(-90) right_triangle(s); + } + module teethFwd() { + tooth_count = ratchet_length/tooth_size.x; + fwd((clip_size.y-wall*2)/2) + right(ratchet_length/2) { + for (i=[1:tooth_count]) { + left(i*tooth_size.x) tooth(); + } + cap_size=[ratchet_length, tooth_size.y, 1]; + up(tooth_size.z/2 + cap_size.z/2) left(cap_size.x/2) back(tooth_size.y/2) { + difference() { + cube(cap_size, center=true); + translate([0.1, 0.1, 0]) back(tooth_size.y/2) right(ratchet_length/2) zrot(180) tooth(); + } + } + } + } + module teethBack() { + scale([1, -1, 1]) teethFwd(); + } + module ratchetLeft() { + right(ratchet_length/2) { + difference() { + cube([ratchet_length, clip_size.y, clip_size.z], center=true); + up(wall/2) cube([ratchet_length, clip_size.y-wall*2, clip_size.z], center=true); + } + teethFwd(); + teethBack(); + } + } + ratchet_tooth_count=3; + ratchet_wall=1; + module ratchetTeethFront() { + module ratchetButton() { + size=[3,wall*4,2]; + up(4) fwd(wall*2 - ratchet_wall) cuboid(size, fillet=1, edges=EDGES_FRONT); + up(2) back(wall/2) cube([size.x, wall, tooth_size.z + size.z], center=true); + } + fwd((clip_size.y-wall*2)/2 - tooth_size.y - 0.5) + left(ratchet_length) { + for (i=[0:ratchet_tooth_count-1]) { + right(i*tooth_size.x) scale([-1,-1,1]) tooth(); + } + ratchetButton(); + } + + module ratchetWall() { + up(tooth_size.z/2) left(ratchet_length/2 + wall - wall/2) fwd(clip_size.y/2-wall-tooth_size.y-ratchet_wall) + down(wall/2+0.5) cube([ratchet_length + wall, ratchet_wall, tooth_size.z], center=true); + } + ratchetWall(); + } + module ratchetTeethBack() { + scale([1,-1,1]) ratchetTeethFront(); + } + module ratchetRight() { + left(wall/2) cube([wall, clip_size.y, clip_size.z], center=true); + + ratchetTeethFront(); + ratchetTeethBack(); + } + + if (is_model(MODEL_CLIP_RATCHETING_A) || is_model(MODEL_CLIP_RATCHETING)) { + left(ratchet_length + wall + 1) { + hookLeft(); + left(0.5) ratchetLeft(); + } + } + if (is_model(MODEL_CLIP_RATCHETING_B) || is_model(MODEL_CLIP_RATCHETING)) { + ratchetRight(); + hookRight(); + } +} + +// Export / Demo / Validation: segment_size=get_link_segment_size(); if (!is_undef(validation)) { if (validation==VALIDATE_INTERSECTION) { @@ -121,7 +257,13 @@ if (!is_undef(validation)) { } } } else { - for (i = [0:links_count-1]) { + if (is_model(MODEL_CLIP)) { + left(get_link_clip_size().x) clip(); + } + if (is_model(MODEL_CLIP_RATCHETING) || is_model(MODEL_CLIP_RATCHETING_A) || is_model(MODEL_CLIP_RATCHETING_B)) { + left(get_link_clip_size().x) clip_ratcheting(); + } + if (is_model(MODEL_LINKS)) for (i = [0:links_count-1]) { terminal=(i==links_count-1) && include_terminal; right(i*segment_size.x) link(terminal=terminal); }