include //export=MODEL_PLATFORM_HARNESS; //export=MODEL_PLATFORM_STRAP; // dependency: https://github.com/revarbat/BOSL include use use use use use use use use use // DEBUG: //validation = 1; //xray = 1; // PROP >> module prop_arm() { $fn=$preview ? 10 : 30; arm_size=[200, 55, 40]; color("gray") down(arm_size.z/2) { cuboid(arm_size, fillet=16, edges=EDGES_X_ALL); left(arm_size.x*0.6) scale([1, 1, 0.8]) yrot(90) cylinder(d1=arm_size.y*1.4, d2=arm_size.y*0.95, h=arm_size.x/2); } } module model_prop_arm() { if (is_not_export()) down(3) prop_arm(); } // <<< // Blocks: module platform(base) { size=get_platform_size(); base_size=size; wall=get_platform_wall(); 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=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() { braced_thinning_wall(h=size.y, l=size.x, thick=size.z, wall=0, strut=wall, orient=ORIENT_X_90); } difference() { base_platform_core(); base_platform_cutout_for_top(); platform_screwholes(); } } module top_platform() { 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() { //down(size.z/2) difference() { foreach_platform_strap_connector() { link_connector_pin(); } base_platform_cutout_for_top(); } } color(top?"Olive":"YellowGreen") if (base) { base_platform(); strap_connectors(); } else { top_platform(); } } // Models: module model_platform_harness() { platform(base=false); } module model_platform_strap() { platform(base=true); } // Validation: /*intersection() { model_platform_harness(); model_platform_strap(); }*/ // Export: difference() { union() { if (is_model(MODEL_PLATFORM_HARNESS)) model_platform_harness(); if (is_model(MODEL_PLATFORM_STRAP)) model_platform_strap(); //if (is_model(MODEL_DEMO)) model_prop_arm(); } // xray: //left(500+5) cube([1000, 1000, 1000], center=true); }