infty = 100; eps = 0.01; fuse_w = 40; gear_w = fuse_w - 16; gear_l = 30; spring_l = 6; base_w = fuse_w - 10; base_l = gear_l + 5; base_h = 0.5; base_beam_w = spring_l + 2; base_reinf_h = 1; base_reinf_w = 1; rear_spring_l = 2.5; rear_spring_rear_l = 6; rear_beam_w = rear_spring_l + 4; rear_spring_w = 3; rear_spring_bot_w = 9; rear_slot_w = 1.2; side_spring_bot_w = 3.5; side_spring_w = 1.5; hook_wall = 1; hook_in = 1.7; hook_h = base_h + base_reinf_h/2; side_hook_angle = 7; side_hook_angle_cut = 17; module body() { // wide beam hull() { translate([0, -base_w/2, 0]) cube([base_beam_w, base_w, base_h]); translate([base_beam_w/2-base_reinf_w/2, -base_w/2, base_h-eps]) cube([base_reinf_w, base_w, base_reinf_h + eps]); } // long center beam hull() { translate([base_beam_w/2, -rear_beam_w/2, 0]) cube([base_l - base_beam_w/2, rear_beam_w, base_h]); translate([base_beam_w/2, -base_reinf_w/2, base_h-eps]) cube([base_l - base_beam_w/2, base_reinf_w, base_reinf_h + eps]); } // rear hook - front part hull() { translate([gear_l-rear_spring_bot_w/2, -rear_spring_l/2, base_h]) cube([rear_spring_bot_w/2-rear_slot_w/2, rear_spring_l, eps]); translate([gear_l-rear_spring_w/2, -rear_spring_l/2, hook_h+hook_in+hook_wall-eps]) cube([rear_spring_w/2-rear_slot_w/2, rear_spring_l, eps]); } // rear hook - rear part hull() { translate([gear_l + rear_slot_w/2, -rear_spring_rear_l/2, base_h]) cube([rear_spring_bot_w/2-rear_slot_w/2, rear_spring_rear_l, eps]); translate([gear_l + rear_slot_w/2, -rear_spring_rear_l/2, hook_h+hook_in+hook_wall-eps]) cube([rear_spring_w/2-rear_slot_w/2, rear_spring_rear_l, eps]); } // side hooks for (y = [-1, 1]) scale([1, y, 1]) intersection() { translate([0, gear_w/2, eps]) rotate([0, 0, -side_hook_angle]) translate([-10, 0, 0]) hull() { cube([20, side_spring_bot_w, base_h-eps]); cube([20, side_spring_w, hook_h + hook_in + hook_wall-eps]); } // above the beam translate([0, -base_w/2, base_h/2]) cube([base_beam_w, base_w, infty]); // cut the front sides translate([0, gear_w/2 + 1.25, eps]) rotate([0, 0, -side_hook_angle_cut]) translate([-5, 0, 0]) cube(20); } } difference() { body(); // rear hole translate([gear_l, 0, hook_h+hook_in/2]) rotate([90, 90, 0]) translate([0, 0, -rear_beam_w/2-eps]) cylinder(h = rear_beam_w+2*eps, r = hook_in/2, $fn = 6); // rear slot above the hole // translate([gear_l-rear_slot_w/2, -rear_beam_w/2+eps, hook_h+hook_in/2]) // cube([rear_slot_w, rear_beam_w+2*eps, infty]); // side slots for (y = [-1, 1]) scale([1, y, 1]) { translate([0, gear_w/2, hook_h+hook_in/2]) { rotate([0, 90, -side_hook_angle]) translate([0, 0, -10]) cylinder(r = hook_in/2, h = 20, $fn = 6); } } }