+ difference(){
+ union(){
+ cylinder(r= stem_dia/2 * 1/(0.5 * sqrt(3)),
+ h = stem_l,
+ $fn=6);
+ cylinder(r= stem_base_dia/2,
+ h = stem_base_th);
+ }
+ OurThread(stem_inner_l);
+ }
+}
+
+module Wingnut(){ ////toplevel
+ difference(){
+ union(){
+ cylinder(r= (thread_nom+wingnut_wall)/2,
+ h= wingnut_th);
+ minkowski(){
+ sphere(r= wingnut_cnr);
+ translate([0,0, wingnut_cnr*0.5])
+ linear_extrude(height= wingnut_wing_xh + wingnut_th
+ - wingnut_cnr*1.5)
+ square([wingnut_wing_mindia + wingnut_wing_xrad*2 - wingnut_cnr*2,
+ wingnut_wing_th - wingnut_cnr*2],
+ center=true);
+ }
+ }
+ translate([0,0, wingnut_th])
+ linear_extrude(height= wingnut_wing_xh+1)
+ square(wingnut_wing_mindia, center=true);
+ translate([0,0, wingnut_th])
+ rotate([180,0,0])
+ OurThread(wingnut_th+3);
+ mirror([0,0,1])
+ linear_extrude(height=5)
+ square(center=true, wingnut_wing_mindia*2);
+ }
+}
+
+module ClampCollarPlan(){
+ circle(r= thread_nom/2 + clamp_bot_collar_th);
+}
+module ClampHolePlan(){
+ circle(r= clamp_hole_dia/2);
+}
+module ClampArmPlan(){
+ rectfromto([0, -clamp_w/2],
+ [clamp_l, +clamp_w/2]);
+}
+
+module ClampTop(){ ////toplevel
+ linear_extrude(height = clamp_top_th, convexity=4) {
+ difference(){
+ union(){
+ ClampArmPlan();
+ ClampCollarPlan();
+ }
+ ClampHolePlan();
+ }
+ }
+ linear_extrude(height = clamp_reg_sz, convexity=4) {
+ difference(){
+ for (m=[0,1]){
+ mirror([0,m,0])
+ translate([0, clamp_reg_sz/2 + clamp_reg_clear_y, 0])
+ rectfromto([-clamp_reg_bot_x_min - clamp_reg_extra_x, 0 ],
+ [0, clamp_reg_sz ]);
+ }
+ ClampHolePlan();
+ }
+ }
+}
+
+module ClampBot(){ ////toplevel
+ linear_extrude(height = clamp_bot_th, convexity=4) {
+ difference(){
+ ClampArmPlan();
+ ClampHolePlan();
+ }
+ }
+ translate([clamp_l, 0, clamp_bot_th-0.1])
+ linear_extrude(height = clamp_bot_tooth_h +0.1)
+ rectfromto([ -clamp_bot_tooth_d, -clamp_w/2 ],
+ [ 0, +clamp_w/2 ]);
+ translate([0,0, clamp_bot_th])
+ mirror([0,0,1])
+ linear_extrude(height = clamp_bot_collar)
+ difference(){
+ ClampCollarPlan();
+ ClampHolePlan();
+ }
+ translate([0, 0, clamp_bot_th]) {
+ linextr(-clamp_reg_sz, clamp_max_table_th+clamp_reg_sz) {
+ translate([-clamp_reg_bot_x_min, 0]) {
+ rectfromto([ 0, -clamp_reg_sz/2 ],
+ [ clamp_reg_sz, +clamp_reg_sz/2 ]);
+ }
+ }
+ linextr(-clamp_reg_sz, 0) {
+ difference(){
+ rectfromto([ -clamp_reg_bot_x_min, -clamp_reg_sz/2 ],
+ [ 0, +clamp_reg_sz/2 ]);
+ ClampHolePlan();
+ }
+ }