infty = 300; eps = 0.01; base_w = 30; base_l = 150; center_w = 5; center_l = base_l - base_w; center_h = 1.5; tip_r = 25; tip_rv = 25; tip_rv_off = base_l/2-2; wall = 1.2; axle_hole = 1.2 + 0.5; axle_slot = 1.2; axle_top_l = 15; axle_bot_l = 20; axle_top_w = 3; axle_bot_w = 10; axle_h = 3; module body() { // base translate([-base_l/2, 0 ]) cube([base_l, wall, base_w]); // center reinforcement intersection() { translate([-center_l/2, wall, base_w/2]) rotate([0, 90, 0]) scale([1, center_h/center_w, 1]) cylinder(r = center_w, h = center_l, $fn = 4); translate([-infty/2, eps, 0]) cube(infty); } hull() { translate([-axle_bot_w/2, wall, base_w/2-axle_bot_l/2]) cube([axle_bot_w, eps, axle_bot_l]); translate([-axle_top_w/2, wall+axle_h, base_w/2-axle_top_l/2]) cube([axle_top_w, eps, axle_top_l]); } // tip intersection() { // the main tube difference() { translate([base_l/2, tip_r, 0]) cylinder(r = tip_r, h = base_w, $fn = 128); translate([base_l/2, tip_r, -eps]) cylinder(r = tip_r - wall, h = base_w+2*eps, $fn = 128); } // the appropriate quarter of the tube only translate([base_l/2, -eps, -eps]) cube([tip_r + eps, tip_r + eps, base_w+2*eps]); // make the tip round translate([tip_rv_off, -eps, base_w/2-eps]) rotate([-90, 0, 0]) cylinder(r = tip_rv, h = base_w + 2*eps); } } module ski() { difference() { body(); // slot translate([-axle_slot/2, wall+axle_h/2, 0]) cube([axle_slot, infty, base_w]); // hole translate([0, wall+axle_h/2, 0]) cylinder(r = axle_hole/2, h = base_w, $fn = 6); } } // ski(); // left and right part for (i = [-1, 1]) scale([1, i, 1]) translate([0, 8, 0]) ski();