chiark / gitweb /
threads: download v2.5
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 10 May 2020 14:33:51 +0000 (15:33 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 10 May 2020 14:33:51 +0000 (15:33 +0100)
https://www.dkprojects.net/openscad-threads/

Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
threads.scad

index c958cb5558873ddf4f8e5746b82349a3ef2e42b7..b2eee23309a8de23d208d0473ad6620bb1a8be04 100644 (file)
@@ -15,6 +15,7 @@
  *\r
  * See <http://www.gnu.org/licenses/>.\r
  *\r
+ * Version 2.5.  2020-04-11  Leadin option works for internal threads.\r
  * Version 2.4.  2019-07-14  Add test option - do not render threads.\r
  * Version 2.3.  2017-08-31  Default for leadin: 0 (best for internal threads).\r
  * Version 2.2.  2017-01-01  Correction for angle; leadfac option.  (Thanks to\r
@@ -93,7 +94,7 @@ function segments (diameter) = min (50, max (ceil (diameter*6), 25));
 //               as z increases.  Default: 0 (no taper).\r
 // leadin      - 0 (default): no chamfer; 1: chamfer (45 degree) at max-z end;\r
 //               2: chamfer at both ends, 3: chamfer at z=0 end.\r
-// leadfac     - scale of leadin chamfer (default: 1.0 = 1/2 thread).\r
+// leadfac     - scale of leadin chamfer length (default: 1.0 = 1/2 thread).\r
 // test        - true = do not render threads (just draw "blank" cylinder).\r
 //               Default: false (draw threads).\r
 module metric_thread (diameter=8, pitch=1, length=1, internal=false, n_starts=1,\r
@@ -149,27 +150,50 @@ module metric_thread (diameter=8, pitch=1, length=1, internal=false, n_starts=1,
                }\r
             }\r
          }\r
-      }\r
 \r
-      // chamfer z=0 end if leadin is 2 or 3\r
-      if (leadin == 2 || leadin == 3) {\r
-         difference () {\r
-            cylinder (r=diameter/2 + 1, h=h*h_fac1*leadfac, $fn=n_segments);\r
+         // Internal thread lead-in: take away from external solid.\r
+         if (internal) {\r
+\r
+            // "Negative chamfer" z=0 end if leadin is 2 or 3.\r
+            if (leadin == 2 || leadin == 3) {\r
+               cylinder (r1=diameter/2, r2=diameter/2 - h*h_fac1*leadfac, h=h*h_fac1*leadfac,\r
+                         $fn=n_segments);\r
+            }\r
 \r
-            cylinder (r2=diameter/2, r1=diameter/2 - h*h_fac1*leadfac, h=h*h_fac1*leadfac,\r
-                      $fn=n_segments);\r
+            // "Negative chamfer" z-max end if leadin is 1 or 2.\r
+            if (leadin == 1 || leadin == 2) {\r
+               translate ([0, 0, length + 0.05 - h*h_fac1*leadfac]) {\r
+                  cylinder (r1=tapered_diameter/2 - h*h_fac1*leadfac, h=h*h_fac1*leadfac,\r
+                            r2=tapered_diameter/2,\r
+                            $fn=n_segments);\r
+               }\r
+            }\r
          }\r
       }\r
 \r
-      // chamfer z-max end if leadin is 1 or 2.\r
-      if (leadin == 1 || leadin == 2) {\r
-         translate ([0, 0, length + 0.05 - h*h_fac1*leadfac]) {\r
+      if (! internal) {\r
+\r
+         // Chamfer z=0 end if leadin is 2 or 3.\r
+         if (leadin == 2 || leadin == 3) {\r
             difference () {\r
                cylinder (r=diameter/2 + 1, h=h*h_fac1*leadfac, $fn=n_segments);\r
-               cylinder (r1=tapered_diameter/2, r2=tapered_diameter/2 - h*h_fac1*leadfac, h=h*h_fac1*leadfac,\r
+\r
+               cylinder (r2=diameter/2, r1=diameter/2 - h*h_fac1*leadfac, h=h*h_fac1*leadfac,\r
                          $fn=n_segments);\r
             }\r
          }\r
+\r
+         // Chamfer z-max end if leadin is 1 or 2.\r
+         if (leadin == 1 || leadin == 2) {\r
+            translate ([0, 0, length + 0.05 - h*h_fac1*leadfac]) {\r
+               difference () {\r
+                  cylinder (r=diameter/2 + 1, h=h*h_fac1*leadfac, $fn=n_segments);\r
+\r
+                  cylinder (r1=tapered_diameter/2, r2=tapered_diameter/2 - h*h_fac1*leadfac, h=h*h_fac1*leadfac,\r
+                            $fn=n_segments);\r
+               }\r
+            }\r
+         }\r
       }\r
    }\r
 }\r
@@ -380,3 +404,4 @@ module thread_polyhedron (radius, pitch, internal, n_starts, thread_size,
 }\r
 \r
 \r
+\r