// -*- C -*- include tube_dia = 48.3; th = 7; pin_gap = 1.5; // around smooth_r = 15; bolt_dia = 5 + 0.75; bolt_flat = 10 + 1; open_gap = 10; hinge_unit = 10; hinge_z_gap = 1; hinge_units = 4; // vhook vhook_th = 10; // calculated pin_dia = th; hole_dia = th + pin_gap; main_r = tube_dia/2 + th; hinge_gap = pin_gap; hinge_o_r = 0.5 * hole_dia + th; hinge_x = -0.5 * tube_dia - hinge_o_r; bolt_x = 0.5 * tube_dia + th + bolt_flat * 0.5; max_x = bolt_x + max(0.5 + bolt_dia + th, 0.5 * bolt_flat/2); flats_y = open_gap/2 + th; stride_z = hinge_unit*2 + hinge_z_gap*2; total_z = hinge_units * stride_z - hinge_z_gap; min_z = -total_z/2; max_z = +total_z/2; pin_flatten = pin_dia/2 * (1 - cos(45)); // calculated - vhook vhook_inside = 15; vhook_theta = atan2( smooth_r, main_r ); vhook_y0 = -cos(vhook_theta) * (main_r + smooth_r); vhook_ctr = vhook_y0 - vhook_inside/2; vhook_outer_dia = vhook_inside + vhook_th*2; $fa = 3; $fs = 0.1; module SmoothPlan(){ offset(r=-smooth_r) offset(delta=smooth_r) children(0); } module TubePlan(){ circle(r = tube_dia/2); } module MainCirclePlan(){ circle(r = main_r); } module PlanWeldMainCircle(){ intersection(){ difference(){ SmoothPlan(){ union(){ MainCirclePlan(); children(0); } } TubePlan(); } rotate(-135) square(100); } } module MainPlan(flatten=false) { difference(){ SmoothPlan() union(){ translate([hinge_x, 0]) circle(r= hinge_o_r); MainCirclePlan(); rectfromto([0, -flats_y], [max_x, +flats_y]); } TubePlan(); rectfromto([0, -open_gap/2], [max_x+1, +open_gap/2]); translate([hinge_x, 0]) { intersection(){ circle(r= hole_dia/2); if (flatten) translate([ pin_flatten, 0 ]) square(center=true, [hole_dia, hole_dia + 1]); } } } } module Portion(d=0) { translate([hinge_x, 0]) circle(r= hinge_o_r + d); rectfromto([hinge_x*2, 0], [max_x+10, -(tube_dia/2+th+10)]); } module MainPlanA(flatten){ intersection(){ MainPlan(flatten); Portion(0); } } module MainPlanB(flatten){ difference(){ MainPlan(flatten); Portion(hinge_gap); } } module HalfClampX(flatten=false){ difference(){ translate([0,0, min_z]) { linextr(0, total_z) mirror([0,1]) MainPlanB(); for (i=[0 : hinge_units-1]) { translate([0,0, stride_z*i]) linextr(0, hinge_unit) MainPlanA(flatten); } } for (dz=[-1,+1]) { translate([ bolt_x, 0, dz * total_z/4 ]) { translate([0, -tube_dia/2, 0]) rotate([-90,0,0]) cylinder(r= bolt_dia/2, h= tube_dia); translate([0, -flats_y, 0]) rotate([90,0,0]) cylinder(r= bolt_flat/2, h= tube_dia/2); } } } } module PlanDemo(){ ////toplevel MainPlan(); translate([0,0,-4]) color("red") Portion(1); translate([0,0,-2]) color("grey") Portion(0); translate([0, tube_dia*1.5]) { MainPlanB(); MainPlanA(); } translate([0, -tube_dia*1.5]) { VHookPlanDemo(); } // translate([max_x - hinge_x + 20, 0]) color("blue") MainPlanA(); } // ---------- vhook ---------- module VHookPlan() { PlanWeldMainCircle(){ rectfromto([ -vhook_th/2, 0 ], [ +vhook_th/2, vhook_y0 ]); } } module VHookProfile() { translate([0, -vhook_inside/2 - vhook_th/2]) circle(r = vhook_th/2); } module VHookHookMain(){ ////toplevel rotate([0,90,0]) rotate_extrude(convexity=10) rotate([0,0,90]) VHookProfile(); } module VHookPartA(){ ////toplevel DummyA(); linextr(min_z, min(min_z + vhook_outer_dia * 1.5, max_z)) VHookPlan(); translate([0, vhook_ctr, min_z + vhook_outer_dia/2]){ linextr(-0.1, vhook_outer_dia/2) VHookProfile(); intersection(){ VHookHookMain(); translate([0,0, -vhook_outer_dia]) cube(center=true, vhook_outer_dia*2); } } //translate([0, vhook_y0, 50]) rotate([0,0,-90]) color("black") cube(10); // translate([0,0,-150]) rotate([0,0,180 + theta]) color("blue") cube(100); } module VHookPlanDemo(){ VHookPlan(); translate([0, vhook_ctr, 5]) for (m=[0,1]) { mirror([0,m]) color("blue") VHookProfile(); } } // ---------- misc ---------- module GeneralB(){ ////toplevel HalfClampX(true); } module DummyA(){ ////toplevel HalfClampX(); } module Demo(){ ////toplevel color("red") rotate([180,0,0]) GeneralB(); color("blue") DummyA(); } //PlanDemo(); //HalfClamp();