|
|
@@ -1,6 +1,6 @@ |
|
|
|
links_count=6; // [1..20] |
|
|
|
links_count=3; // [1..20] |
|
|
|
include_terminal=true; // [true,false] |
|
|
|
export=3; // [0:6] |
|
|
|
export=0; // [0:6] |
|
|
|
|
|
|
|
MODEL_DEMO=0; |
|
|
|
MODEL_LINKS=1; |
|
|
@@ -33,6 +33,7 @@ function get_link_socket_size() = [get_link_segment_size().z, |
|
|
|
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]; |
|
|
|
function get_link_socket_roundgap() = 2; |
|
|
|
|
|
|
|
echo("==============================="); |
|
|
|
echo(str("Strap length: ", (links_count * get_link_segment_size().x), " mm")); |
|
|
@@ -41,46 +42,68 @@ echo("==============================="); |
|
|
|
assert(get_link_segment_size().x >= 10, "Link segment is too short."); |
|
|
|
assert(get_link_segment_size().z >= (get_link_pin_diameter() + get_link_socket_slack().z + 1), "Link segment is too thin."); |
|
|
|
|
|
|
|
module link(terminal=false) { |
|
|
|
module pin() { |
|
|
|
segment_size=get_link_segment_size(); |
|
|
|
module pin() { |
|
|
|
h=segment_size.y; |
|
|
|
d=get_link_pin_diameter(); |
|
|
|
back(h/2) xrot(90) cylinder(h=h, d=d, $fn=$preview ? 10 : 30); |
|
|
|
} |
|
|
|
module pin_socket_area() { |
|
|
|
h=segment_size.y-get_link_socket_slack().y; |
|
|
|
d=segment_size.z; |
|
|
|
back(h/2) xrot(90) cylinder(h=h, d=d, $fn=$preview ? 10 : 30); |
|
|
|
} |
|
|
|
module pin_socket() { |
|
|
|
difference() { |
|
|
|
pin_socket_area(); |
|
|
|
scaleup = [ |
|
|
|
((get_link_pin_diameter() + get_link_socket_slack().x) / get_link_pin_diameter()), |
|
|
|
((get_link_pin_diameter() + get_link_socket_slack().y) / get_link_pin_diameter()), |
|
|
|
((get_link_pin_diameter() + get_link_socket_slack().z) / get_link_pin_diameter()) |
|
|
|
]; |
|
|
|
scale(scaleup) pin(); |
|
|
|
} |
|
|
|
h=segment_size.y; |
|
|
|
d=get_link_pin_diameter(); |
|
|
|
back(h/2) xrot(90) cylinder(h=h, d=d, $fn=$preview ? 10 : 30); |
|
|
|
} |
|
|
|
module pin_socket_area() { |
|
|
|
segment_size=get_link_segment_size(); |
|
|
|
h=segment_size.y-get_link_socket_slack().y; |
|
|
|
d=segment_size.z; |
|
|
|
back(h/2) xrot(90) cylinder(h=h, d=d, $fn=$preview ? 10 : 30); |
|
|
|
} |
|
|
|
module pin_socket() { |
|
|
|
difference() { |
|
|
|
pin_socket_area(); |
|
|
|
scaleup = [ |
|
|
|
((get_link_pin_diameter() + get_link_socket_slack().x) / get_link_pin_diameter()), |
|
|
|
((get_link_pin_diameter() + get_link_socket_slack().y) / get_link_pin_diameter()), |
|
|
|
((get_link_pin_diameter() + get_link_socket_slack().z) / get_link_pin_diameter()) |
|
|
|
]; |
|
|
|
scale(scaleup) pin(); |
|
|
|
} |
|
|
|
module joiner() { |
|
|
|
gap=2; |
|
|
|
} |
|
|
|
|
|
|
|
module arm() { |
|
|
|
arm_size=get_link_joiner_arm_size(); |
|
|
|
fwd(segment_size.y/2 + arm_size.y/2 - 1) right(arm_size.x/2 - 1) cuboid(arm_size, fillet=1, edges=EDGES_FRONT + EDGES_Y_ALL); |
|
|
|
} |
|
|
|
module armFront() { |
|
|
|
arm(); |
|
|
|
} |
|
|
|
module armBack() { |
|
|
|
scale([1, -1, 1]) arm(); |
|
|
|
} |
|
|
|
module armJoiner() { |
|
|
|
gap=get_link_socket_roundgap(); |
|
|
|
arm_size=get_link_joiner_arm_size(); |
|
|
|
joiner_size=[arm_size.x-get_link_socket_size().x, segment_size.y, segment_size.z]; |
|
|
|
right(joiner_size.x/2 + get_link_socket_size().x/2 + gap) cuboid(joiner_size, fillet=1, edges=EDGES_Z_ALL + EDGES_BOTTOM); |
|
|
|
} |
|
|
|
module link_arms() { |
|
|
|
armFront(); |
|
|
|
armBack(); |
|
|
|
armJoiner(); |
|
|
|
} |
|
|
|
|
|
|
|
module link_connector_pin() { |
|
|
|
pin(); |
|
|
|
link_arms(); |
|
|
|
} |
|
|
|
|
|
|
|
module link_connector_socket() { |
|
|
|
pin_socket(); |
|
|
|
} |
|
|
|
|
|
|
|
module link(terminal=false) { |
|
|
|
|
|
|
|
module link_joiner() { |
|
|
|
gap=get_link_socket_roundgap(); |
|
|
|
arm_size=get_link_joiner_arm_size(); |
|
|
|
module arm() { |
|
|
|
fwd(segment_size.y/2 + arm_size.y/2 - 1) right(arm_size.x/2 - 1) cuboid(arm_size, fillet=1, edges=EDGES_FRONT + EDGES_Y_ALL); |
|
|
|
} |
|
|
|
module armFront() { |
|
|
|
arm(); |
|
|
|
} |
|
|
|
module armBack() { |
|
|
|
scale([1, -1, 1]) arm(); |
|
|
|
} |
|
|
|
module armJoiner() { |
|
|
|
joiner_size=[arm_size.x-get_link_socket_size().x, segment_size.y, segment_size.z]; |
|
|
|
right(joiner_size.x/2 + get_link_socket_size().x/2 + gap) cuboid(joiner_size, fillet=1, edges=EDGES_Z_ALL + EDGES_BOTTOM); |
|
|
|
} |
|
|
|
module socketJoiner() { |
|
|
|
|
|
|
|
module pin_to_socket_joiner() { |
|
|
|
joiner_size=[segment_size.x-get_link_socket_size().x+get_link_socket_size().x*0.2, |
|
|
|
segment_size.y-4, |
|
|
|
segment_size.z]; |
|
|
@@ -89,31 +112,16 @@ module link(terminal=false) { |
|
|
|
right(segment_size.x) scale([1, 2, 1]) pin_socket_area(); |
|
|
|
} |
|
|
|
} |
|
|
|
module terminalArm() { |
|
|
|
left(5) { |
|
|
|
shift=arm_size.x - get_link_pin_diameter(); |
|
|
|
right(segment_size.x + shift + gap/2) pin(); |
|
|
|
right(segment_size.x + gap/2) { |
|
|
|
armFront(); |
|
|
|
armBack(); |
|
|
|
} |
|
|
|
right(arm_size.x - get_link_socket_size().x + gap) armJoiner(); |
|
|
|
} |
|
|
|
} |
|
|
|
armFront(); |
|
|
|
armBack(); |
|
|
|
armJoiner(); |
|
|
|
if (terminal) { |
|
|
|
terminalArm(); |
|
|
|
} else { |
|
|
|
socketJoiner(); |
|
|
|
} |
|
|
|
|
|
|
|
pin_to_socket_joiner(); |
|
|
|
} |
|
|
|
|
|
|
|
pin(); |
|
|
|
joiner(); |
|
|
|
if (!terminal) { |
|
|
|
right(segment_size.x) pin_socket(); |
|
|
|
link_connector_pin(); |
|
|
|
if (terminal) { |
|
|
|
right(segment_size.x + 2) zrot(180) link_connector_pin(); |
|
|
|
} else { |
|
|
|
link_joiner(); |
|
|
|
right(segment_size.x) link_connector_socket(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
@@ -141,7 +149,7 @@ module clip() { |
|
|
|
module joiner(groove) { |
|
|
|
slack=groove?0.5:0; |
|
|
|
joiner_size=[entry_size.x-6+slack, entry_size.y-6+slack, entry_size.z-4+slack]; |
|
|
|
joiner_pos=[entry_pos.x, entry_pos.y, entry_pos.z - entry_size.z/2]; |
|
|
|
joiner_pos=[entry_pos.x, entry_pos.y, entry_pos.z - entry_size.z/2 + joiner_size.z/2]; |
|
|
|
translate(joiner_pos) cube(joiner_size, center=true); |
|
|
|
} |
|
|
|
|
|
|
@@ -175,7 +183,7 @@ module clip() { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
module clip_ratcheting(ratchet_length=30) { |
|
|
|
module clip_ratcheting(ratchet_length=28) { |
|
|
|
socket_size=get_link_socket_size(); |
|
|
|
clip_size=get_link_clip_size(); |
|
|
|
pin_diam=get_link_pin_diameter(); |
|
|
@@ -195,10 +203,10 @@ module clip_ratcheting(ratchet_length=30) { |
|
|
|
} |
|
|
|
} |
|
|
|
module hookRight() { |
|
|
|
hook(); |
|
|
|
right(12.5) zrot(180) link_connector_pin(); |
|
|
|
} |
|
|
|
module hookLeft() { |
|
|
|
scale([-1, 1, 1]) hook(); |
|
|
|
left(12.5) link_connector_pin(); |
|
|
|
} |
|
|
|
wall=2; |
|
|
|
tooth_size=[4, 3, 3]; |
|
|
@@ -296,7 +304,7 @@ module clip_ratcheting(ratchet_length=30) { |
|
|
|
railBack(); |
|
|
|
} |
|
|
|
|
|
|
|
if (is_model(MODEL_CLIP_RATCHETING_A) || is_model(MODEL_CLIP_RATCHETING)) { |
|
|
|
left(2) if (is_model(MODEL_CLIP_RATCHETING_A) || is_model(MODEL_CLIP_RATCHETING)) { |
|
|
|
left(ratchet_length + wall + 1) { |
|
|
|
hookLeft(); |
|
|
|
left(0.1) { |
|
|
@@ -335,7 +343,7 @@ if (!is_undef(validation)) { |
|
|
|
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(); |
|
|
|
left(get_link_clip_size().x * 2 + 3) clip_ratcheting(); |
|
|
|
} |
|
|
|
if (is_model(MODEL_LINKS)) for (i = [0:links_count-1]) { |
|
|
|
terminal=(i==links_count-1) && include_terminal; |
|
|
|