|
|
@@ -1,6 +1,6 @@ |
|
|
|
include <export.scad> |
|
|
|
//export=MODEL_PLATFORM_HARNESS; |
|
|
|
export=MODEL_PLATFORM_STRAP; |
|
|
|
//export=MODEL_PLATFORM_STRAP; |
|
|
|
|
|
|
|
// dependency: https://github.com/revarbat/BOSL |
|
|
|
include <BOSL/constants.scad> |
|
|
@@ -36,73 +36,6 @@ module model_prop_arm() { |
|
|
|
// <<< |
|
|
|
|
|
|
|
// Blocks: |
|
|
|
module lock_pin(groove) { |
|
|
|
slack=groove |
|
|
|
?[1, 0.5, 0.3] |
|
|
|
:[0, 0, 0]; |
|
|
|
pin_size=get_platform_lock_pin_size(); |
|
|
|
size=vec_sum(pin_size, slack); |
|
|
|
down(size.z/2) |
|
|
|
translate([slack.x/2, slack.y/2, slack.z/2]) |
|
|
|
xrot(-4) zrot(-90) right_triangle([size.y, size.x, size.z]); |
|
|
|
} |
|
|
|
module lock_arm() { |
|
|
|
size=get_platform_lock_arm_size(); |
|
|
|
down(get_platform_top_size().z) back(size.y/2) right(size.x/2) cube(size, center=true); |
|
|
|
joiner_size=[get_platform_lock_pin_size().x, size.y, get_platform_top_size().z]; |
|
|
|
translate([joiner_size.x/2, joiner_size.y/2, -joiner_size.z/2 + size.z/2]) cube(joiner_size, center=true); |
|
|
|
} |
|
|
|
module lock_mechanism_button(groove=false) { |
|
|
|
button_size=get_platform_lock_button_profile(groove); |
|
|
|
size=get_platform_lock_button_size(groove); |
|
|
|
translate(get_platform_lock_button_pos()) |
|
|
|
left(groove?1:0) |
|
|
|
difference() { |
|
|
|
cube(size, center=true); |
|
|
|
up(size.z/2 + (groove?0.5:0)) back(3) cube(size, center=true); |
|
|
|
} |
|
|
|
} |
|
|
|
module lock_buttons_cutout() { |
|
|
|
module cutout_side(groove) { |
|
|
|
translate(get_platform_lock_pin_pos()) lock_mechanism_button(groove=true); |
|
|
|
} |
|
|
|
cutout_side(); |
|
|
|
scale([1, -1, 1]) cutout_side(); |
|
|
|
} |
|
|
|
module lock_mechanism() { |
|
|
|
lock_pin(groove=false); |
|
|
|
lock_arm(); |
|
|
|
lock_mechanism_button(); |
|
|
|
} |
|
|
|
module lock_socket() { |
|
|
|
pin_size=get_platform_lock_pin_size(); |
|
|
|
size=[pin_size.x, pin_size.y, pin_size.z]; |
|
|
|
module socket_connector() { |
|
|
|
conn_size=[pin_size.x+4, get_platform_wall()*3, get_platform_top_size().z]; |
|
|
|
up(pin_size.z/2) fwd(pin_size.y+conn_size.y/2) right(pin_size.x/2) { |
|
|
|
prismoid(size1=[conn_size.x, conn_size.y], size2=[conn_size.x, conn_size.y-2], shift=[0, -1], h=conn_size.z/2); |
|
|
|
down(conn_size.z/4) cube([conn_size.x, conn_size.y, conn_size.z/2], center=true); |
|
|
|
} |
|
|
|
} |
|
|
|
down(pin_size.z) |
|
|
|
translate(get_platform_lock_pin_pos()) { |
|
|
|
fwd(pin_size.y) scale([1, -1, -1]) lock_pin(); |
|
|
|
socket_connector(); |
|
|
|
} |
|
|
|
} |
|
|
|
module platform_locks_pins() { |
|
|
|
platform_size=get_platform_size(); |
|
|
|
lock_pin_size=get_platform_lock_pin_size(); |
|
|
|
module lock_side(groove) { |
|
|
|
translate(get_platform_lock_pin_pos()) lock_mechanism(); |
|
|
|
} |
|
|
|
lock_side(); |
|
|
|
scale([1, -1, 1]) lock_side(); |
|
|
|
} |
|
|
|
module platform_locks_sockets() { |
|
|
|
lock_socket(); |
|
|
|
scale([1, -1, 1]) lock_socket(); |
|
|
|
} |
|
|
|
module platform(base) { |
|
|
|
size=get_platform_size(); |
|
|
|
base_size=size; |
|
|
@@ -110,11 +43,29 @@ module platform(base) { |
|
|
|
top_size=get_platform_top_size(); |
|
|
|
top=!base; |
|
|
|
|
|
|
|
module platform_screwholes() { |
|
|
|
module screwhole_one() { |
|
|
|
fwd(base_size.y/2) xrot(90) down(get_platform_screwhole_h()) screwhole(d=get_platform_screwhole_d(), h=get_platform_screwhole_h()); |
|
|
|
} |
|
|
|
module screwhole_sided() { |
|
|
|
offset=16; |
|
|
|
left(offset) screwhole_one(); |
|
|
|
right(offset) screwhole_one(); |
|
|
|
} |
|
|
|
up(top_size.z/5) { |
|
|
|
screwhole_sided(); |
|
|
|
scale([1,-1,1]) screwhole_sided(); |
|
|
|
} |
|
|
|
} |
|
|
|
module base_platform_cutout_for_top() { |
|
|
|
base_top_diff=[base_size.x-top_size.x, base_size.y-top_size.y]; |
|
|
|
guiding=0.4; |
|
|
|
translate(get_platform_top_pos()) down(top_size.z/2) prismoid(size1=[top_size.x,top_size.y], size2=[top_size.x+base_top_diff.x*guiding,top_size.y+base_top_diff.y*guiding], h=top_size.z); |
|
|
|
lock_buttons_cutout(); |
|
|
|
guiding=1; |
|
|
|
top_slack=[0.2, 0.2, 0]; |
|
|
|
translate(get_platform_top_pos()) { |
|
|
|
cube(vec_sum(top_size, top_slack), center=true); |
|
|
|
down(top_size.z/2 - 2) |
|
|
|
prismoid(size1=[top_size.x,top_size.y], size2=[top_size.x+base_top_diff.x*guiding,top_size.y+base_top_diff.y*guiding], h=top_size.z); |
|
|
|
} |
|
|
|
} |
|
|
|
module base_platform() { |
|
|
|
module base_platform_core() { |
|
|
@@ -124,11 +75,18 @@ module platform(base) { |
|
|
|
difference() { |
|
|
|
base_platform_core(); |
|
|
|
base_platform_cutout_for_top(); |
|
|
|
platform_screwholes(); |
|
|
|
} |
|
|
|
} |
|
|
|
module top_platform() { |
|
|
|
up((base_size.z-top_size.z)/2) |
|
|
|
braced_thinning_wall(h=top_size.y, l=top_size.x, thick=top_size.z, wall=0, strut=wall/4, orient=ORIENT_X_90); |
|
|
|
difference() { |
|
|
|
up((base_size.z-top_size.z)/2) |
|
|
|
up(top_size.z/2) intersection() { |
|
|
|
scale([1,1,4]) braced_thinning_wall(h=top_size.y, l=top_size.x, thick=top_size.z, wall=0, strut=wall/4, orient=ORIENT_X_90); |
|
|
|
down(top_size.z/2) scale([2,2,1]) cube(top_size, center=true); |
|
|
|
} |
|
|
|
platform_screwholes(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
module strap_connectors() { |
|
|
@@ -144,11 +102,9 @@ module platform(base) { |
|
|
|
color(top?"Olive":"YellowGreen") |
|
|
|
if (base) { |
|
|
|
base_platform(); |
|
|
|
platform_locks_pins(); |
|
|
|
strap_connectors(); |
|
|
|
} else { |
|
|
|
top_platform(); |
|
|
|
platform_locks_sockets(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|