// -*- C -*- include cable_maxdia = 12; cable_mindia = 6; strap_width = 4 + 0.5; total_len = 70; wallmin = 1.5; strap_count = 2; strap_wall_h = 1.5; strap_wall_l = 2.0; delta_ellipse = 0.45; // calculated delta_shift = 1 - delta_ellipse; roundoff_rad = cable_maxdia/2 * sqrt(delta_shift) + cable_mindia/2 * (1-sqrt(delta_shift)); outerdia = 2*(roundoff_rad / cos(30) + wallmin); delta_shift_gap = (cable_maxdia-cable_mindia) * delta_shift; writing_dx = outerdia * sin(30); writing_dz = total_len / 3; module CrossSection(plus=0) { difference(){ for (dx = [-plus, 0, plus]) translate([dx, 0]) circle(r= outerdia/2, $fn=6); intersection(){ scale([cable_maxdia, cable_maxdia * delta_shift + cable_mindia * delta_ellipse]) circle(r= sqrt(0.5) * delta_shift + 0.5 * delta_ellipse, $fn=4); circle(r= roundoff_rad, $fn=20); } square(center=true, [40, delta_shift_gap]); } } module CrossSectionDemo(){ ////toplevel color("blue"){ translate([0, delta_shift_gap/2, 0]){ difference(){ circle(r = cable_maxdia/2, $fn=20); circle(r = cable_mindia/2, $fn=20); } } } linear_extrude(height=20) CrossSection(0); color("red") linear_extrude(height=1) CrossSection(2); } module CompleteClamp(){ ////toplevel difference(){ union(){ linear_extrude(height=total_len) CrossSection(); for (i=[0 : strap_count]){ if (i*2 != strap_count) { translate([0, 0, total_len * (i + 0.5) / (strap_count + 1)]) for (m=[0,1]){ mirror([0,0,m]) translate([0,0, strap_width/2]) linear_extrude(height=strap_wall_l) CrossSection(strap_wall_h); } } } } for (my = [0,1]) { mirror([0,my,0]) translate([-writing_dx/2, cos(30) * outerdia/2, (total_len - writing_dz)/2]) rotate([90,0,0]) Commitid_BestCount([writing_dx, writing_dz]); } } } module HalfPrint(){ ////toplevel rotate([0,180,0]){ intersection(){ rotate([-90,0,-90]) CompleteClamp(); translate([-100,-100,0]) cube([1000,200,200]); } } } //CrossSectionDemo(); //CompleteClamp(); HalfPrint();