Release 0.4

Enhancements
=============

- PCO-1810
- tap module
- list metric threads under short *and* full designators

Fixes
======

- $fn is not ignored anymore in module thread(...)
- better error message when thread_specs(...) cannot find designator
- error in README.rst related to thread_specs(...) demo

Improvements
=============

- docs
This commit is contained in:
Adrian Schlatter
2022-04-03 21:04:42 +02:00
21 changed files with 387 additions and 80 deletions

18
.gitignore vendored
View File

@@ -1,4 +1,20 @@
# Apple
.DS_Store
*.xcf
# Editor
.*.swp
.vscode/
# Build
design/THREAD_TABLE.csv
# Files not intended for repository
*.xcf
*.xlsx
*.stl
renderall*.scad
ASME*.pdf
docs/*.png
design/UIS.py
*.afdesign
experimental/

65
CONTRIBUTING.md Normal file
View File

@@ -0,0 +1,65 @@
# How to contribute to threadlib
Thank for considering a contribution to threadlib! Any help is greatly
appreciated.
## Did you find an issue?
* Check whether your issue has already been reported by searching under
[existing issues](https://github.com/adrianschlatter/threadlib/issues).
* If don't find an issue addressing the problem, open a new issue.
* Choose a meaningful title, describe clearly what you consider to be a
problem.
* If possible, provide example code or other means to make it easy for a
maintainer to reproduce your problem.
## Did you write a patch?
You already have a solution for an issue or a new feature? All the better! A
pull request ("PR") is what you want to do.
* Open a new [pull-request](https://github.com/adrianschlatter/threadlib/pulls)
with your patch.
* Try to create PRs that address a specific issue/feature/topic.
* Avoid PRs containing an assortment of unrelated fixes and features. Better
split it into separate PRs for each topic.
* Clean up your code before creating a pull request: Remove code that you have
commented out for debugging, remove test code you have added, e.g., inside
threadlib.scad.
* Make sure the PR's description clearly describes the problem and your solution.
Include relevant issue numbers if appropriate.
* You increase the chances of quick acceptance of your PR significantly if you
have taken measures to assure quality (such as writing and passing tests).
## You intend to contribute new threads?
That's what we need the most! This is how to do it:
* Find the specs (usually specified in a norm, sometimes published openly)
* Convert these specs for use in threadlib:
* Find help on this topic in [Design of threadlib](docs/DesignOfThreadlib.md)
and [Creating Thread Specs](docs/CreatingThreadSpecs.md)
* Use existing threads as examples. You find them beneath design/
* When done, proceed with a pull request (see "Did you write a patch?" above)
## Final remarks
Currently, threadlib is maintained in the spare time of a single person having
a family and a job. If you do not get immediate feedback to your issue or pull
request, please have some patience.

View File

@@ -1,4 +1,4 @@
Copyright 2019 Adrian Schlatter
Copyright 2019 Adrian Schlatter and Contributors
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

View File

@@ -59,6 +59,16 @@ threadlib:
Clone threadlib into the folder 'threadlib' inside your OpenSCAD library folder
Your libraries folder should now look similar to this:
::
libraries
├── list-comprehension-demos/
├── scad-utils/
├── thread_profile.scad
└── threadlib/
Usage
===========================
@@ -89,6 +99,32 @@ argument for higbee_arc):
Note that for a nut you also have to specify an outer diameter. The inner
diameter is implicitly given by the thread designator ("M12x0.5" in this case).
To make a threaded hole (e.g. in a plate), an intuitive approach would be to
create the difference of the plate and a bolt. However, this part would not work
well in practice: You need a little space around the bolt to avoid collisions.
threadlib's solution is to provide the tap module:
.. code-block:: OpenSCAD
tap("G1/2", turns=5);
.. image:: docs/imgs/tap-G1o2.png
:alt: G1/2 tap
The tap shown above *is* intended for use like this and has accounted for the
allowances needed in practice. Also, it will create the tapers:
.. code-block:: OpenSCAD
difference() {
part_to_be_tapped_here();
tap("G1/2", turns=5);
}
Make sure that the tap extends a tiny bit out of the part to be tapped.
Otherwise, you will end up with infinitely thin artifacts covering the entrance
of your tapped hole.
If you only need the threads alone:
.. code-block:: OpenSCAD
@@ -98,12 +134,13 @@ If you only need the threads alone:
.. image:: docs/imgs/thread-G1o2-ext.png
:alt: G1/2 external thread
Then, add the support you want. In the simplest case, a cylinder (which is what
nut(...) uses):
(Note: You need to specify whether you want internal ("-int") or external
("-ext") thread here.) Then, add the support you want. In the simplest
case, a cylinder (which is what nut(...) uses):
.. code-block:: OpenSCAD
specs = thread_specs("G2 1/2-ext");
specs = thread_specs("G1/2-ext");
P = specs[0]; Rrot = specs[1]; Dsupport = specs[2];
section_profile = specs[3];
H = (5 + 1) * P;
@@ -122,9 +159,15 @@ List of supported threads
Currently, threadlib knows these threads:
- `Metric threads <http://mdmetric.com/tech/M-thead%20600.htm>`__ (coarse, fine, and super-fine pitches) M0.25 to M600
- `BSP parallel thread <https://www.amesweb.info/Screws/British-Standard-Pipe-Parallel-Thread-BSPP.aspx>`__ G1/16 to G6
- `PCO-1881 <https://www.bevtech.org/assets/Committees/Packaging-Technology/20/3784253-20.pdf>`__ (PET-bottle thread)
- Metric threads (coarse, fine, and super-fine pitches) M0.25 to M600.
- Unified Inch Screw Threads (UNC, UNF, UNEF, 4-UN, 6-UN, 8-UN, 12-UN,
16-UN, 20-UN, 28-UN, and 32-UN). All threads are class 2 threads.
- `BSP parallel thread
<https://www.amesweb.info/Screws/British-Standard-Pipe-Parallel-Thread-BSPP.aspx>`__
G1/16 to G6. All threads are class A threads.
- `PCO-1881
<https://www.bevtech.org/assets/Committees/Packaging-Technology/20/3784253-20.pdf>`__
(PET-bottle thread)
Extensibility
@@ -146,15 +189,28 @@ add your own:
Care to share? Safe others from repeating the valuable work you have already
accomplished and get the fame you deserve: Send in your tried and tested threads
for addition to threadlib!
for addition to threadlib! See `Design of Threadlib <./docs/DesignOfThreadlib.md>`_
for help on how to hack your own thread as shown above and
`Creating Thread Specs <./docs/CreatingThreadSpecs.md>`_ for an introduction on how
to contribute entire thread classes to threadlib.
Still reading?
===========================
If you read this far, you're probably not here for the first time. If you
use and like threadlib, would you consider giving it a Github Star? (The
button is at the top of this website.)
Change Log
===========================
- 0.4: `PCO-1810 <https://www.isbt.com/assets/Threadspecs/pco1810.pdf>`__.
tap module. Fixes bug with $fn in straight_thread(). Lists metric
threads under short designator and full designator.
- 0.3: Unified Inch Screw Threads (UNC, UNF, UNEF, 4-UN, 6-UN, 8-UN, 12-UN,
16-UN, 20-UN, 28-UN, and 32-UN. Fixed problem with PCO-1881-int. Fixed problem
with G-ext threads . New build system.
- 0.2: `Metric threads <http://mdmetric.com/tech/M-thead%20600.htm>`__, `PCO-1881 <https://www.bevtech.org/assets/Committees/Packaging-Technology/20/3784253-20.pdf>`__
with G-ext threads. New build system.
- 0.2: Metric threads, `PCO-1881 <https://www.bevtech.org/assets/Committees/Packaging-Technology/20/3784253-20.pdf>`__
- 0.1: Initial release supporting `BSP parallel thread <https://www.amesweb.info/Screws/British-Standard-Pipe-Parallel-Thread-BSPP.aspx>`__

View File

@@ -74,7 +74,9 @@ THREAD_TABLE = [["G1/16-ext", [0.907, 3.1631, 6.3625, [[0, -0.4252], [0, 0.4252]
["M0.9x0.225-ext", [0.225, 0.2930, 0.6080, [[0, -0.1010], [0, 0.1010], [0.1487, 0.0151], [0.1487, -0.0151]]]],
["M0.9x0.225-int", [0.225, -0.4790, 0.9390, [[0, 0.1114], [0, -0.1114], [0.1250, -0.0392], [0.1250, 0.0392]]]],
["M1-ext", [0.25, 0.3065, 0.6620, [[0, -0.1146], [0, 0.1146], [0.1678, 0.0178], [0.1678, -0.0178]]]],
["M1x0.25-ext", [0.25, 0.3065, 0.6620, [[0, -0.1146], [0, 0.1146], [0.1678, 0.0178], [0.1678, -0.0178]]]],
["M1-int", [0.25, -0.5428, 1.0535, [[0, 0.1237], [0, -0.1237], [0.1583, -0.0323], [0.1583, 0.0323]]]],
["M1x0.25-int", [0.25, -0.5428, 1.0535, [[0, 0.1237], [0, -0.1237], [0.1583, -0.0323], [0.1583, 0.0323]]]],
["M1x0.2-ext", [0.2, 0.3410, 0.7240, [[0, -0.0924], [0, 0.0924], [0.1365, 0.0136], [0.1365, -0.0136]]]],
["M1x0.2-int", [0.2, -0.5356, 1.0460, [[0, 0.0990], [0, -0.0990], [0.1254, -0.0266], [0.1254, 0.0266]]]],
["M1.1x0.25-ext", [0.25, 0.3565, 0.7620, [[0, -0.1146], [0, 0.1146], [0.1678, 0.0178], [0.1678, -0.0178]]]],
@@ -82,15 +84,21 @@ THREAD_TABLE = [["G1/16-ext", [0.907, 3.1631, 6.3625, [[0, -0.4252], [0, 0.4252]
["M1.1x0.2-ext", [0.2, 0.3910, 0.8240, [[0, -0.0924], [0, 0.0924], [0.1365, 0.0136], [0.1365, -0.0136]]]],
["M1.1x0.2-int", [0.2, -0.5856, 1.1460, [[0, 0.0990], [0, -0.0990], [0.1254, -0.0266], [0.1254, 0.0266]]]],
["M1.2-ext", [0.25, 0.4065, 0.8620, [[0, -0.1146], [0, 0.1146], [0.1677, 0.0178], [0.1677, -0.0178]]]],
["M1.2x0.25-ext", [0.25, 0.4065, 0.8620, [[0, -0.1146], [0, 0.1146], [0.1677, 0.0178], [0.1677, -0.0178]]]],
["M1.2-int", [0.25, -0.6428, 1.2535, [[0, 0.1237], [0, -0.1237], [0.1583, -0.0323], [0.1583, 0.0323]]]],
["M1.2x0.25-int", [0.25, -0.6428, 1.2535, [[0, 0.1237], [0, -0.1237], [0.1583, -0.0323], [0.1583, 0.0323]]]],
["M1.2x0.2-ext", [0.2, 0.4410, 0.9240, [[0, -0.0924], [0, 0.0924], [0.1365, 0.0136], [0.1365, -0.0136]]]],
["M1.2x0.2-int", [0.2, -0.6356, 1.2460, [[0, 0.0990], [0, -0.0990], [0.1254, -0.0266], [0.1254, 0.0266]]]],
["M1.4-ext", [0.3, 0.5350, 1.1180, [[0, -0.1192], [0, 0.1192], [0.1377, 0.0396], [0.1377, -0.0396]]]],
["M1.4x0.3-ext", [0.3, 0.5350, 1.1180, [[0, -0.1192], [0, 0.1192], [0.1377, 0.0396], [0.1377, -0.0396]]]],
["M1.4-int", [0.3, -0.7545, 1.4545, [[0, 0.1324], [0, -0.1324], [0.1442, -0.0492], [0.1442, 0.0492]]]],
["M1.4x0.3-int", [0.3, -0.7545, 1.4545, [[0, 0.1324], [0, -0.1324], [0.1442, -0.0492], [0.1442, 0.0492]]]],
["M1.4x0.2-ext", [0.2, 0.5410, 1.1240, [[0, -0.0924], [0, 0.0924], [0.1365, 0.0136], [0.1365, -0.0136]]]],
["M1.4x0.2-int", [0.2, -0.7356, 1.4460, [[0, 0.0990], [0, -0.0990], [0.1254, -0.0266], [0.1254, 0.0266]]]],
["M1.6-ext", [0.35, 0.5375, 1.1385, [[0, -0.1589], [0, 0.1589], [0.2318, 0.0251], [0.2318, -0.0251]]]],
["M1.6x0.35-ext", [0.35, 0.5375, 1.1385, [[0, -0.1589], [0, 0.1589], [0.2318, 0.0251], [0.2318, -0.0251]]]],
["M1.6-int", [0.35, -0.8563, 1.6680, [[0, 0.1732], [0, -0.1732], [0.2208, -0.0458], [0.2208, 0.0458]]]],
["M1.6x0.35-int", [0.35, -0.8563, 1.6680, [[0, 0.1732], [0, -0.1732], [0.2208, -0.0458], [0.2208, 0.0458]]]],
["M1.6x0.3-ext", [0.3, 0.5785, 1.2070, [[0, -0.1349], [0, 0.1349], [0.1937, 0.0230], [0.1937, -0.0230]]]],
["M1.6x0.3-int", [0.3, -0.8448, 1.6515, [[0, 0.1485], [0, -0.1485], [0.1861, -0.0411], [0.1861, 0.0411]]]],
["M1.6x0.2-ext", [0.2, 0.6400, 1.3230, [[0, -0.0927], [0, 0.0927], [0.1375, 0.0133], [0.1375, -0.0133]]]],
@@ -98,15 +106,21 @@ THREAD_TABLE = [["G1/16-ext", [0.907, 3.1631, 6.3625, [[0, -0.4252], [0, 0.4252]
["M1.7x0.35-ext", [0.35, 0.5875, 1.2385, [[0, -0.1589], [0, 0.1589], [0.2318, 0.0251], [0.2318, -0.0251]]]],
["M1.7x0.35-int", [0.35, -0.9063, 1.7680, [[0, 0.1732], [0, -0.1732], [0.2208, -0.0458], [0.2208, 0.0458]]]],
["M1.8-ext", [0.35, 0.6375, 1.3385, [[0, -0.1589], [0, 0.1589], [0.2318, 0.0251], [0.2318, -0.0251]]]],
["M1.8x0.35-ext", [0.35, 0.6375, 1.3385, [[0, -0.1589], [0, 0.1589], [0.2318, 0.0251], [0.2318, -0.0251]]]],
["M1.8-int", [0.35, -0.9563, 1.8680, [[0, 0.1732], [0, -0.1732], [0.2208, -0.0458], [0.2208, 0.0458]]]],
["M1.8x0.35-int", [0.35, -0.9563, 1.8680, [[0, 0.1732], [0, -0.1732], [0.2208, -0.0458], [0.2208, 0.0458]]]],
["M1.8x0.2-ext", [0.2, 0.7400, 1.5230, [[0, -0.0927], [0, 0.0927], [0.1375, 0.0133], [0.1375, -0.0133]]]],
["M1.8x0.2-int", [0.2, -0.9366, 1.8480, [[0, 0.0990], [0, -0.0990], [0.1264, -0.0260], [0.1264, 0.0260]]]],
["M2-ext", [0.4, 0.7040, 1.4780, [[0, -0.1807], [0, 0.1807], [0.2628, 0.0290], [0.2628, -0.0290]]]],
["M2x0.4-ext", [0.4, 0.7040, 1.4780, [[0, -0.1807], [0, 0.1807], [0.2628, 0.0290], [0.2628, -0.0290]]]],
["M2-int", [0.4, -1.0622, 2.0740, [[0, 0.1980], [0, -0.1980], [0.2507, -0.0532], [0.2507, 0.0532]]]],
["M2x0.4-int", [0.4, -1.0622, 2.0740, [[0, 0.1980], [0, -0.1980], [0.2507, -0.0532], [0.2507, 0.0532]]]],
["M2x0.25-ext", [0.25, 0.8050, 1.6605, [[0, -0.1150], [0, 0.1150], [0.1693, 0.0173], [0.1693, -0.0173]]]],
["M2x0.25-int", [0.25, -1.0438, 2.0555, [[0, 0.1237], [0, -0.1237], [0.1593, -0.0318], [0.1593, 0.0318]]]],
["M2.2-ext", [0.45, 0.7700, 1.6165, [[0, -0.2027], [0, 0.2027], [0.2950, 0.0324], [0.2950, -0.0324]]]],
["M2.2x0.45-ext", [0.45, 0.7700, 1.6165, [[0, -0.2027], [0, 0.2027], [0.2950, 0.0324], [0.2950, -0.0324]]]],
["M2.2-int", [0.45, -1.1687, 2.2800, [[0, 0.2228], [0, -0.2228], [0.2810, -0.0605], [0.2810, 0.0605]]]],
["M2.2x0.45-int", [0.45, -1.1687, 2.2800, [[0, 0.2228], [0, -0.2228], [0.2810, -0.0605], [0.2810, 0.0605]]]],
["M2.2x0.25-ext", [0.25, 0.9050, 1.8605, [[0, -0.1150], [0, 0.1150], [0.1693, 0.0173], [0.1693, -0.0173]]]],
["M2.2x0.25-int", [0.25, -1.1438, 2.2555, [[0, 0.1237], [0, -0.1237], [0.1593, -0.0318], [0.1593, 0.0318]]]],
["M2.3x0.45-ext", [0.45, 0.8200, 1.7165, [[0, -0.2027], [0, 0.2027], [0.2950, 0.0324], [0.2950, -0.0324]]]],
@@ -114,21 +128,29 @@ THREAD_TABLE = [["G1/16-ext", [0.907, 3.1631, 6.3625, [[0, -0.4252], [0, 0.4252]
["M2.3x0.4-ext", [0.4, 0.8540, 1.7780, [[0, -0.1807], [0, 0.1807], [0.2628, 0.0290], [0.2628, -0.0290]]]],
["M2.3x0.4-int", [0.4, -1.2122, 2.3740, [[0, 0.1980], [0, -0.1980], [0.2507, -0.0532], [0.2507, 0.0532]]]],
["M2.5-ext", [0.45, 0.9200, 1.9165, [[0, -0.2027], [0, 0.2027], [0.2950, 0.0324], [0.2950, -0.0324]]]],
["M2.5x0.45-ext", [0.45, 0.9200, 1.9165, [[0, -0.2027], [0, 0.2027], [0.2950, 0.0324], [0.2950, -0.0324]]]],
["M2.5-int", [0.45, -1.3187, 2.5800, [[0, 0.2228], [0, -0.2228], [0.2810, -0.0605], [0.2810, 0.0605]]]],
["M2.5x0.45-int", [0.45, -1.3187, 2.5800, [[0, 0.2228], [0, -0.2228], [0.2810, -0.0605], [0.2810, 0.0605]]]],
["M2.5x0.35-ext", [0.35, 0.9875, 2.0385, [[0, -0.1589], [0, 0.1589], [0.2317, 0.0251], [0.2317, -0.0251]]]],
["M2.5x0.35-int", [0.35, -1.3063, 2.5680, [[0, 0.1732], [0, -0.1732], [0.2208, -0.0458], [0.2208, 0.0458]]]],
["M2.6x0.45-ext", [0.45, 0.9700, 2.0165, [[0, -0.2027], [0, 0.2027], [0.2950, 0.0324], [0.2950, -0.0324]]]],
["M2.6x0.45-int", [0.45, -1.3662, 2.6750, [[0, 0.2228], [0, -0.2228], [0.2785, -0.0620], [0.2785, 0.0620]]]],
["M3-ext", [0.5, 1.1360, 2.3555, [[0, -0.2247], [0, 0.2247], [0.3275, 0.0357], [0.3275, -0.0357]]]],
["M3x0.5-ext", [0.5, 1.1360, 2.3555, [[0, -0.2247], [0, 0.2247], [0.3275, 0.0357], [0.3275, -0.0357]]]],
["M3-int", [0.5, -1.5747, 3.0860, [[0, 0.2475], [0, -0.2475], [0.3102, -0.0684], [0.3102, 0.0684]]]],
["M3x0.5-int", [0.5, -1.5747, 3.0860, [[0, 0.2475], [0, -0.2475], [0.3102, -0.0684], [0.3102, 0.0684]]]],
["M3x0.35-ext", [0.35, 1.2355, 2.5365, [[0, -0.1595], [0, 0.1595], [0.2337, 0.0246], [0.2337, -0.0246]]]],
["M3x0.35-int", [0.35, -1.5575, 3.0705, [[0, 0.1732], [0, -0.1732], [0.2220, -0.0451], [0.2220, 0.0451]]]],
["M3.5-ext", [0.6, 1.3175, 2.7320, [[0, -0.2688], [0, 0.2688], [0.3908, 0.0432], [0.3908, -0.0432]]]],
["M3.5x0.6-ext", [0.6, 1.3175, 2.7320, [[0, -0.2688], [0, 0.2688], [0.3908, 0.0432], [0.3908, -0.0432]]]],
["M3.5-int", [0.6, -1.8376, 3.5995, [[0, 0.2970], [0, -0.2970], [0.3726, -0.0819], [0.3726, 0.0819]]]],
["M3.5x0.6-int", [0.6, -1.8376, 3.5995, [[0, 0.2970], [0, -0.2970], [0.3726, -0.0819], [0.3726, 0.0819]]]],
["M3.5x0.35-ext", [0.35, 1.4855, 3.0365, [[0, -0.1595], [0, 0.1595], [0.2337, 0.0246], [0.2337, -0.0246]]]],
["M3.5x0.35-int", [0.35, -1.8075, 3.5705, [[0, 0.1732], [0, -0.1732], [0.2220, -0.0451], [0.2220, 0.0451]]]],
["M4-ext", [0.7, 1.5010, 3.1110, [[0, -0.3124], [0, 0.3124], [0.4530, 0.0509], [0.4530, -0.0509]]]],
["M4x0.7-ext", [0.7, 1.5010, 3.1110, [[0, -0.3124], [0, 0.3124], [0.4530, 0.0509], [0.4530, -0.0509]]]],
["M4-int", [0.7, -2.0990, 4.1095, [[0, 0.3465], [0, -0.3465], [0.4330, -0.0965], [0.4330, 0.0965]]]],
["M4x0.7-int", [0.7, -2.0990, 4.1095, [[0, 0.3465], [0, -0.3465], [0.4330, -0.0965], [0.4330, 0.0965]]]],
["M4x0.5-ext", [0.5, 1.6360, 3.3555, [[0, -0.2247], [0, 0.2247], [0.3275, 0.0357], [0.3275, -0.0357]]]],
["M4x0.5-int", [0.5, -2.0747, 4.0860, [[0, 0.2475], [0, -0.2475], [0.3102, -0.0684], [0.3102, 0.0684]]]],
["M4.5x0.75-ext", [0.75, 1.7195, 3.5525, [[0, -0.3339], [0, 0.3339], [0.4845, 0.0541], [0.4845, -0.0541]]]],
@@ -136,13 +158,17 @@ THREAD_TABLE = [["G1/16-ext", [0.907, 3.1631, 6.3625, [[0, -0.4252], [0, 0.4252]
["M4.5x0.5-ext", [0.5, 1.8860, 3.8555, [[0, -0.2247], [0, 0.2247], [0.3275, 0.0357], [0.3275, -0.0357]]]],
["M4.5x0.5-int", [0.5, -2.3247, 4.5860, [[0, 0.2475], [0, -0.2475], [0.3102, -0.0684], [0.3102, 0.0684]]]],
["M5-ext", [0.8, 1.9345, 3.9895, [[0, -0.3557], [0, 0.3557], [0.5160, 0.0578], [0.5160, -0.0578]]]],
["M5x0.8-ext", [0.8, 1.9345, 3.9895, [[0, -0.3557], [0, 0.3557], [0.5160, 0.0578], [0.5160, -0.0578]]]],
["M5-int", [0.8, -2.6107, 5.1200, [[0, 0.3960], [0, -0.3960], [0.4937, -0.1109], [0.4937, 0.1109]]]],
["M5x0.8-int", [0.8, -2.6107, 5.1200, [[0, 0.3960], [0, -0.3960], [0.4937, -0.1109], [0.4937, 0.1109]]]],
["M5x0.5-ext", [0.5, 2.1360, 4.3555, [[0, -0.2247], [0, 0.2247], [0.3275, 0.0357], [0.3275, -0.0357]]]],
["M5x0.5-int", [0.5, -2.5747, 5.0860, [[0, 0.2475], [0, -0.2475], [0.3102, -0.0684], [0.3102, 0.0684]]]],
["M5.5x0.5-ext", [0.5, 2.3785, 4.8480, [[0, -0.2269], [0, 0.2269], [0.3350, 0.0335], [0.3350, -0.0335]]]],
["M5.5x0.5-int", [0.5, -2.8297, 5.5960, [[0, 0.2475], [0, -0.2475], [0.3152, -0.0655], [0.3152, 0.0655]]]],
["M6-ext", [1, 2.2980, 4.7435, [[0, -0.4440], [0, 0.4440], [0.6440, 0.0722], [0.6440, -0.0722]]]],
["M6x1-ext", [1, 2.2980, 4.7435, [[0, -0.4440], [0, 0.4440], [0.6440, 0.0722], [0.6440, -0.0722]]]],
["M6-int", [1, -3.1369, 6.1470, [[0, 0.4950], [0, -0.4950], [0.6194, -0.1374], [0.6194, 0.1374]]]],
["M6x1-int", [1, -3.1369, 6.1470, [[0, 0.4950], [0, -0.4950], [0.6194, -0.1374], [0.6194, 0.1374]]]],
["M6x0.8-ext", [0.8, 2.4420, 4.9970, [[0, -0.3536], [0, 0.3536], [0.5085, 0.0600], [0.5085, -0.0600]]]],
["M6x0.8-int", [0.8, -3.1060, 6.1105, [[0, 0.3960], [0, -0.3960], [0.4890, -0.1137], [0.4890, 0.1137]]]],
["M6x0.75-ext", [0.75, 2.4645, 5.0475, [[0, -0.3353], [0, 0.3353], [0.4895, 0.0527], [0.4895, -0.0527]]]],
@@ -152,13 +178,17 @@ THREAD_TABLE = [["G1/16-ext", [0.907, 3.1631, 6.3625, [[0, -0.4252], [0, 0.4252]
["M6x0.5-ext", [0.5, 2.6310, 5.3505, [[0, -0.2262], [0, 0.2262], [0.3325, 0.0342], [0.3325, -0.0342]]]],
["M6x0.5-int", [0.5, -3.0777, 6.0920, [[0, 0.2475], [0, -0.2475], [0.3132, -0.0667], [0.3132, 0.0667]]]],
["M7-ext", [1, 2.7980, 5.7435, [[0, -0.4440], [0, 0.4440], [0.6440, 0.0722], [0.6440, -0.0722]]]],
["M7x1-ext", [1, 2.7980, 5.7435, [[0, -0.4440], [0, 0.4440], [0.6440, 0.0722], [0.6440, -0.0722]]]],
["M7-int", [1, -3.6369, 7.1470, [[0, 0.4950], [0, -0.4950], [0.6194, -0.1374], [0.6194, 0.1374]]]],
["M7x1-int", [1, -3.6369, 7.1470, [[0, 0.4950], [0, -0.4950], [0.6194, -0.1374], [0.6194, 0.1374]]]],
["M7x0.75-ext", [0.75, 2.9645, 6.0475, [[0, -0.3353], [0, 0.3353], [0.4895, 0.0527], [0.4895, -0.0527]]]],
["M7x0.75-int", [0.75, -3.6078, 7.1200, [[0, 0.3712], [0, -0.3712], [0.4663, -0.1021], [0.4663, 0.1021]]]],
["M7x0.5-ext", [0.5, 3.1310, 6.3505, [[0, -0.2262], [0, 0.2262], [0.3325, 0.0342], [0.3325, -0.0342]]]],
["M7x0.5-int", [0.5, -3.5777, 7.0920, [[0, 0.2475], [0, -0.2475], [0.3132, -0.0667], [0.3132, 0.0667]]]],
["M8-ext", [1.25, 3.1360, 6.4455, [[0, -0.5518], [0, 0.5518], [0.7970, 0.0917], [0.7970, -0.0917]]]],
["M8x1.25-ext", [1.25, 3.1360, 6.4455, [[0, -0.5518], [0, 0.5518], [0.7970, 0.0917], [0.7970, -0.0917]]]],
["M8-int", [1.25, -4.1644, 8.1700, [[0, 0.6188], [0, -0.6188], [0.7747, -0.1715], [0.7747, 0.1715]]]],
["M8x1.25-int", [1.25, -4.1644, 8.1700, [[0, 0.6188], [0, -0.6188], [0.7747, -0.1715], [0.7747, 0.1715]]]],
["M8x1-ext", [1, 3.2980, 6.7435, [[0, -0.4440], [0, 0.4440], [0.6440, 0.0722], [0.6440, -0.0722]]]],
["M8x1-int", [1, -4.1369, 8.1470, [[0, 0.4950], [0, -0.4950], [0.6194, -0.1374], [0.6194, 0.1374]]]],
["M8x0.8-ext", [0.8, 3.4290, 6.9840, [[0, -0.3573], [0, 0.3573], [0.5215, 0.0562], [0.5215, -0.0562]]]],
@@ -176,7 +206,9 @@ THREAD_TABLE = [["G1/16-ext", [0.907, 3.1631, 6.3625, [[0, -0.4252], [0, 0.4252]
["M9x0.5-ext", [0.5, 4.1310, 8.3505, [[0, -0.2262], [0, 0.2262], [0.3325, 0.0342], [0.3325, -0.0342]]]],
["M9x0.5-int", [0.5, -4.5777, 9.0920, [[0, 0.2475], [0, -0.2475], [0.3132, -0.0667], [0.3132, 0.0667]]]],
["M10-ext", [1.5, 3.9690, 8.1410, [[0, -0.6608], [0, 0.6608], [0.9560, 0.1088], [0.9560, -0.1088]]]],
["M10x1.5-ext", [1.5, 3.9690, 8.1410, [[0, -0.6608], [0, 0.6608], [0.9560, 0.1088], [0.9560, -0.1088]]]],
["M10-int", [1.5, -5.1945, 10.1980, [[0, 0.7425], [0, -0.7425], [0.9315, -0.2047], [0.9315, 0.2047]]]],
["M10x1.5-int", [1.5, -5.1945, 10.1980, [[0, 0.7425], [0, -0.7425], [0.9315, -0.2047], [0.9315, 0.2047]]]],
["M10x1.25-ext", [1.25, 4.1360, 8.4455, [[0, -0.5518], [0, 0.5518], [0.7970, 0.0917], [0.7970, -0.0917]]]],
["M10x1.25-int", [1.25, -5.1644, 10.1700, [[0, 0.6188], [0, -0.6188], [0.7747, -0.1715], [0.7747, 0.1715]]]],
["M10x1.12-ext", [1.12, 4.2190, 8.5995, [[0, -0.4962], [0, 0.4962], [0.7200, 0.0805], [0.7200, -0.0805]]]],
@@ -196,7 +228,9 @@ THREAD_TABLE = [["G1/16-ext", [0.907, 3.1631, 6.3625, [[0, -0.4252], [0, 0.4252]
["M11x0.5-ext", [0.5, 5.1310, 10.3505, [[0, -0.2269], [0, 0.2269], [0.3315, 0.0355], [0.3315, -0.0355]]]],
["M11x0.5-int", [0.5, -5.5777, 11.0920, [[0, 0.2475], [0, -0.2475], [0.3132, -0.0667], [0.3132, 0.0667]]]],
["M12-ext", [1.75, 4.8005, 9.8365, [[0, -0.7706], [0, 0.7706], [1.1170, 0.1257], [1.1170, -0.1257]]]],
["M12x1.75-ext", [1.75, 4.8005, 9.8365, [[0, -0.7706], [0, 0.7706], [1.1170, 0.1257], [1.1170, -0.1257]]]],
["M12-int", [1.75, -6.2241, 12.2265, [[0, 0.8663], [0, -0.8663], [1.0874, -0.2385], [1.0874, 0.2385]]]],
["M12x1.75-int", [1.75, -6.2241, 12.2265, [[0, 0.8663], [0, -0.8663], [1.0874, -0.2385], [1.0874, 0.2385]]]],
["M12x1.5-ext", [1.5, 4.9650, 10.1370, [[0, -0.6608], [0, 0.6608], [0.9600, 0.1065], [0.9600, -0.1065]]]],
["M12x1.5-int", [1.5, -6.1970, 12.2030, [[0, 0.7425], [0, -0.7425], [0.9340, -0.2032], [0.9340, 0.2032]]]],
["M12x1.25-ext", [1.25, 5.1290, 10.4385, [[0, -0.5541], [0, 0.5541], [0.8035, 0.0902], [0.8035, -0.0902]]]],
@@ -208,7 +242,9 @@ THREAD_TABLE = [["G1/16-ext", [0.907, 3.1631, 6.3625, [[0, -0.4252], [0, 0.4252]
["M12x0.5-ext", [0.5, 5.6285, 11.3480, [[0, -0.2283], [0, 0.2283], [0.3340, 0.0355], [0.3340, -0.0355]]]],
["M12x0.5-int", [0.5, -6.0797, 12.0960, [[0, 0.2475], [0, -0.2475], [0.3152, -0.0655], [0.3152, 0.0655]]]],
["M14-ext", [2, 5.6355, 11.5340, [[0, -0.8779], [0, 0.8779], [1.2745, 0.1420], [1.2745, -0.1420]]]],
["M14x2-ext", [2, 5.6355, 11.5340, [[0, -0.8779], [0, 0.8779], [1.2745, 0.1420], [1.2745, -0.1420]]]],
["M14-int", [2, -7.2505, 14.2505, [[0, 0.9890], [0, -0.9890], [1.2393, -0.2735], [1.2393, 0.2735]]]],
["M14x2-int", [2, -7.2505, 14.2505, [[0, 0.9890], [0, -0.9890], [1.2393, -0.2735], [1.2393, 0.2735]]]],
["M14x1.5-ext", [1.5, 5.9650, 12.1370, [[0, -0.6608], [0, 0.6608], [0.9600, 0.1065], [0.9600, -0.1065]]]],
["M14x1.5-int", [1.5, -7.1970, 14.2030, [[0, 0.7425], [0, -0.7425], [0.9340, -0.2032], [0.9340, 0.2032]]]],
["M14x1.25-ext", [1.25, 6.1290, 12.4385, [[0, -0.5541], [0, 0.5541], [0.8035, 0.0902], [0.8035, -0.0902]]]],
@@ -224,7 +260,9 @@ THREAD_TABLE = [["G1/16-ext", [0.907, 3.1631, 6.3625, [[0, -0.4252], [0, 0.4252]
["M15x1-ext", [1, 6.7950, 13.7405, [[0, -0.4449], [0, 0.4449], [0.6450, 0.0725], [0.6450, -0.0725]]]],
["M15x1-int", [1, -7.6394, 15.1520, [[0, 0.4950], [0, -0.4950], [0.6219, -0.1360], [0.6219, 0.1360]]]],
["M16-ext", [2, 6.6355, 13.5340, [[0, -0.8779], [0, 0.8779], [1.2745, 0.1420], [1.2745, -0.1420]]]],
["M16x2-ext", [2, 6.6355, 13.5340, [[0, -0.8779], [0, 0.8779], [1.2745, 0.1420], [1.2745, -0.1420]]]],
["M16-int", [2, -8.2505, 16.2505, [[0, 0.9890], [0, -0.9890], [1.2393, -0.2735], [1.2393, 0.2735]]]],
["M16x2-int", [2, -8.2505, 16.2505, [[0, 0.9890], [0, -0.9890], [1.2393, -0.2735], [1.2393, 0.2735]]]],
["M16x1.6-ext", [1.6, 6.9190, 14.0370, [[0, -0.6994], [0, 0.6994], [1.0135, 0.1142], [1.0135, -0.1142]]]],
["M16x1.6-int", [1.6, -8.1855, 16.1855, [[0, 0.7868], [0, -0.7868], [0.9765, -0.2230], [0.9765, 0.2230]]]],
["M16x1.5-ext", [1.5, 6.9650, 14.1370, [[0, -0.6608], [0, 0.6608], [0.9600, 0.1065], [0.9600, -0.1065]]]],
@@ -242,7 +280,9 @@ THREAD_TABLE = [["G1/16-ext", [0.907, 3.1631, 6.3625, [[0, -0.4252], [0, 0.4252]
["M17x1-ext", [1, 7.7950, 15.7405, [[0, -0.4449], [0, 0.4449], [0.6450, 0.0725], [0.6450, -0.0725]]]],
["M17x1-int", [1, -8.6394, 17.1520, [[0, 0.4950], [0, -0.4950], [0.6219, -0.1360], [0.6219, 0.1360]]]],
["M18-ext", [2.5, 7.3120, 14.9380, [[0, -1.0929], [0, 1.0929], [1.5830, 0.1790], [1.5830, -0.1790]]]],
["M18x2.5-ext", [2.5, 7.3120, 14.9380, [[0, -1.0929], [0, 1.0929], [1.5830, 0.1790], [1.5830, -0.1790]]]],
["M18-int", [2.5, -9.2925, 18.2925, [[0, 1.2302], [0, -1.2302], [1.5330, -0.3451], [1.5330, 0.3451]]]],
["M18x2.5-int", [2.5, -9.2925, 18.2925, [[0, 1.2302], [0, -1.2302], [1.5330, -0.3451], [1.5330, 0.3451]]]],
["M18x2-ext", [2, 7.6355, 15.5340, [[0, -0.8779], [0, 0.8779], [1.2745, 0.1420], [1.2745, -0.1420]]]],
["M18x2-int", [2, -9.2505, 18.2505, [[0, 0.9890], [0, -0.9890], [1.2393, -0.2735], [1.2393, 0.2735]]]],
["M18x1.5-ext", [1.5, 7.9650, 16.1370, [[0, -0.6608], [0, 0.6608], [0.9600, 0.1065], [0.9600, -0.1065]]]],
@@ -256,7 +296,9 @@ THREAD_TABLE = [["G1/16-ext", [0.907, 3.1631, 6.3625, [[0, -0.4252], [0, 0.4252]
["M18x0.5-ext", [0.5, 8.6285, 17.3480, [[0, -0.2283], [0, 0.2283], [0.3340, 0.0355], [0.3340, -0.0355]]]],
["M18x0.5-int", [0.5, -9.0797, 18.0960, [[0, 0.2475], [0, -0.2475], [0.3152, -0.0655], [0.3152, 0.0655]]]],
["M20-ext", [2.5, 8.3120, 16.9380, [[0, -1.0929], [0, 1.0929], [1.5830, 0.1790], [1.5830, -0.1790]]]],
["M20x2.5-ext", [2.5, 8.3120, 16.9380, [[0, -1.0929], [0, 1.0929], [1.5830, 0.1790], [1.5830, -0.1790]]]],
["M20-int", [2.5, -10.2925, 20.2925, [[0, 1.2304], [0, -1.2304], [1.5330, -0.3453], [1.5330, 0.3453]]]],
["M20x2.5-int", [2.5, -10.2925, 20.2925, [[0, 1.2304], [0, -1.2304], [1.5330, -0.3453], [1.5330, 0.3453]]]],
["M20x2-ext", [2, 8.6355, 17.5340, [[0, -0.8779], [0, 0.8779], [1.2745, 0.1420], [1.2745, -0.1420]]]],
["M20x2-int", [2, -10.2505, 20.2505, [[0, 0.9890], [0, -0.9890], [1.2393, -0.2735], [1.2393, 0.2735]]]],
["M20x1.5-ext", [1.5, 8.9650, 18.1370, [[0, -0.6608], [0, 0.6608], [0.9600, 0.1065], [0.9600, -0.1065]]]],
@@ -270,7 +312,9 @@ THREAD_TABLE = [["G1/16-ext", [0.907, 3.1631, 6.3625, [[0, -0.4252], [0, 0.4252]
["M22x3-ext", [3, 8.9850, 18.3370, [[0, -1.3100], [0, 1.3100], [1.8975, 0.2145], [1.8975, -0.2145]]]],
["M22x3-int", [3, -11.3385, 22.3385, [[0, 1.4727], [0, -1.4727], [1.8375, -0.4118], [1.8375, 0.4118]]]],
["M22-ext", [2.5, 9.3120, 18.9380, [[0, -1.0929], [0, 1.0929], [1.5830, 0.1790], [1.5830, -0.1790]]]],
["M22x2.5-ext", [2.5, 9.3120, 18.9380, [[0, -1.0929], [0, 1.0929], [1.5830, 0.1790], [1.5830, -0.1790]]]],
["M22-int", [2.5, -11.2925, 22.2925, [[0, 1.2304], [0, -1.2304], [1.5330, -0.3453], [1.5330, 0.3453]]]],
["M22x2.5-int", [2.5, -11.2925, 22.2925, [[0, 1.2304], [0, -1.2304], [1.5330, -0.3453], [1.5330, 0.3453]]]],
["M22x2-ext", [2, 9.6355, 19.5340, [[0, -0.8779], [0, 0.8779], [1.2745, 0.1420], [1.2745, -0.1420]]]],
["M22x2-int", [2, -11.2505, 22.2505, [[0, 0.9890], [0, -0.9890], [1.2393, -0.2735], [1.2393, 0.2735]]]],
["M22x1.5-ext", [1.5, 9.9650, 20.1370, [[0, -0.6608], [0, 0.6608], [0.9600, 0.1065], [0.9600, -0.1065]]]],
@@ -282,7 +326,9 @@ THREAD_TABLE = [["G1/16-ext", [0.907, 3.1631, 6.3625, [[0, -0.4252], [0, 0.4252]
["M22x0.5-ext", [0.5, 10.6285, 21.3480, [[0, -0.2283], [0, 0.2283], [0.3340, 0.0355], [0.3340, -0.0355]]]],
["M22x0.5-int", [0.5, -11.0797, 22.0960, [[0, 0.2475], [0, -0.2475], [0.3152, -0.0655], [0.3152, 0.0655]]]],
["M24-ext", [3, 9.9775, 20.3295, [[0, -1.3115], [0, 1.3115], [1.9050, 0.2116], [1.9050, -0.2116]]]],
["M24x3-ext", [3, 9.9775, 20.3295, [[0, -1.3115], [0, 1.3115], [1.9050, 0.2116], [1.9050, -0.2116]]]],
["M24-int", [3, -12.3490, 24.3490, [[0, 1.4759], [0, -1.4759], [1.8480, -0.4089], [1.8480, 0.4089]]]],
["M24x3-int", [3, -12.3490, 24.3490, [[0, 1.4759], [0, -1.4759], [1.8480, -0.4089], [1.8480, 0.4089]]]],
["M24x2.5-ext", [2.5, 10.3020, 20.9280, [[0, -1.0958], [0, 1.0958], [1.5930, 0.1761], [1.5930, -0.1761]]]],
["M24x2.5-int", [2.5, -12.3055, 24.3055, [[0, 1.2341], [0, -1.2341], [1.5460, -0.3415], [1.5460, 0.3415]]]],
["M24x2-ext", [2, 10.6305, 21.5290, [[0, -0.8793], [0, 0.8793], [1.2795, 0.1406], [1.2795, -0.1406]]]],
@@ -302,7 +348,9 @@ THREAD_TABLE = [["G1/16-ext", [0.907, 3.1631, 6.3625, [[0, -0.4252], [0, 0.4252]
["M26x1.5-ext", [1.5, 11.9600, 24.1320, [[0, -0.6622], [0, 0.6622], [0.9650, 0.1051], [0.9650, -0.1051]]]],
["M26x1.5-int", [1.5, -13.1995, 26.2085, [[0, 0.7425], [0, -0.7425], [0.9365, -0.2018], [0.9365, 0.2018]]]],
["M27-ext", [3, 11.4775, 23.3295, [[0, -1.3115], [0, 1.3115], [1.9050, 0.2116], [1.9050, -0.2116]]]],
["M27x3-ext", [3, 11.4775, 23.3295, [[0, -1.3115], [0, 1.3115], [1.9050, 0.2116], [1.9050, -0.2116]]]],
["M27-int", [3, -13.8490, 27.3490, [[0, 1.4759], [0, -1.4759], [1.8480, -0.4089], [1.8480, 0.4089]]]],
["M27x3-int", [3, -13.8490, 27.3490, [[0, 1.4759], [0, -1.4759], [1.8480, -0.4089], [1.8480, 0.4089]]]],
["M27x2-ext", [2, 12.1305, 24.5290, [[0, -0.8793], [0, 0.8793], [1.2795, 0.1406], [1.2795, -0.1406]]]],
["M27x2-int", [2, -13.7552, 27.2565, [[0, 0.9900], [0, -0.9900], [1.2440, -0.2718], [1.2440, 0.2718]]]],
["M27x1.5-ext", [1.5, 12.4600, 25.1320, [[0, -0.6622], [0, 0.6622], [0.9650, 0.1051], [0.9650, -0.1051]]]],
@@ -318,7 +366,9 @@ THREAD_TABLE = [["G1/16-ext", [0.907, 3.1631, 6.3625, [[0, -0.4252], [0, 0.4252]
["M28x1-ext", [1, 13.2915, 26.7370, [[0, -0.4454], [0, 0.4454], [0.6485, 0.0710], [0.6485, -0.0710]]]],
["M28x1-int", [1, -14.1419, 28.1570, [[0, 0.4950], [0, -0.4950], [0.6244, -0.1345], [0.6244, 0.1345]]]],
["M30-ext", [3.5, 12.6530, 25.7320, [[0, -1.5271], [0, 1.5271], [2.2145, 0.2486], [2.2145, -0.2486]]]],
["M30x3.5-ext", [3.5, 12.6530, 25.7320, [[0, -1.5271], [0, 1.5271], [2.2145, 0.2486], [2.2145, -0.2486]]]],
["M30-int", [3.5, -15.3925, 30.3925, [[0, 1.7174], [0, -1.7174], [2.1470, -0.4778], [2.1470, 0.4778]]]],
["M30x3.5-int", [3.5, -15.3925, 30.3925, [[0, 1.7174], [0, -1.7174], [2.1470, -0.4778], [2.1470, 0.4778]]]],
["M30x3-ext", [3, 12.9775, 26.3295, [[0, -1.3115], [0, 1.3115], [1.9050, 0.2116], [1.9050, -0.2116]]]],
["M30x3-int", [3, -15.3490, 30.3490, [[0, 1.4759], [0, -1.4759], [1.8480, -0.4089], [1.8480, 0.4089]]]],
["M30x2.5-ext", [2.5, 13.3020, 26.9280, [[0, -1.0958], [0, 1.0958], [1.5930, 0.1761], [1.5930, -0.1761]]]],
@@ -336,7 +386,9 @@ THREAD_TABLE = [["G1/16-ext", [0.907, 3.1631, 6.3625, [[0, -0.4252], [0, 0.4252]
["M32x1.5-ext", [1.5, 14.9600, 30.1320, [[0, -0.6622], [0, 0.6622], [0.9650, 0.1051], [0.9650, -0.1051]]]],
["M32x1.5-int", [1.5, -16.1995, 32.2085, [[0, 0.7425], [0, -0.7425], [0.9365, -0.2018], [0.9365, 0.2018]]]],
["M33-ext", [3.5, 14.1635, 28.7530, [[0, -1.5283], [0, 1.5283], [2.2140, 0.2500], [2.2140, -0.2500]]]],
["M33x3.5-ext", [3.5, 14.1635, 28.7530, [[0, -1.5283], [0, 1.5283], [2.2140, 0.2500], [2.2140, -0.2500]]]],
["M33-int", [3.5, -16.8925, 33.3925, [[0, 1.7174], [0, -1.7174], [2.1470, -0.4778], [2.1470, 0.4778]]]],
["M33x3.5-int", [3.5, -16.8925, 33.3925, [[0, 1.7174], [0, -1.7174], [2.1470, -0.4778], [2.1470, 0.4778]]]],
["M33x3-ext", [3, 14.4775, 29.3295, [[0, -1.3115], [0, 1.3115], [1.9050, 0.2116], [1.9050, -0.2116]]]],
["M33x3-int", [3, -16.8490, 33.3490, [[0, 1.4759], [0, -1.4759], [1.8480, -0.4089], [1.8480, 0.4089]]]],
["M33x2-ext", [2, 15.1305, 30.5290, [[0, -0.8793], [0, 0.8793], [1.2795, 0.1406], [1.2795, -0.1406]]]],
@@ -350,7 +402,9 @@ THREAD_TABLE = [["G1/16-ext", [0.907, 3.1631, 6.3625, [[0, -0.4252], [0, 0.4252]
["M35x1.5-ext", [1.5, 16.4600, 33.1320, [[0, -0.6622], [0, 0.6622], [0.9650, 0.1051], [0.9650, -0.1051]]]],
["M35x1.5-int", [1.5, -17.6995, 35.2080, [[0, 0.7425], [0, -0.7425], [0.9365, -0.2018], [0.9365, 0.2018]]]],
["M36-ext", [4, 15.3270, 31.1320, [[0, -1.7436], [0, 1.7436], [2.5255, 0.2855], [2.5255, -0.2855]]]],
["M36x4-ext", [4, 15.3270, 31.1320, [[0, -1.7436], [0, 1.7436], [2.5255, 0.2855], [2.5255, -0.2855]]]],
["M36-int", [4, -18.4385, 36.4385, [[0, 1.9598], [0, -1.9598], [2.4535, -0.5433], [2.4535, 0.5433]]]],
["M36x4-int", [4, -18.4385, 36.4385, [[0, 1.9598], [0, -1.9598], [2.4535, -0.5433], [2.4535, 0.5433]]]],
["M36x3-ext", [3, 15.9775, 32.3295, [[0, -1.3115], [0, 1.3115], [1.9050, 0.2116], [1.9050, -0.2116]]]],
["M36x3-int", [3, -18.3490, 36.3490, [[0, 1.4759], [0, -1.4759], [1.8480, -0.4089], [1.8480, 0.4089]]]],
["M36x2-ext", [2, 16.6305, 33.5290, [[0, -0.8793], [0, 0.8793], [1.2795, 0.1406], [1.2795, -0.1406]]]],
@@ -362,7 +416,9 @@ THREAD_TABLE = [["G1/16-ext", [0.907, 3.1631, 6.3625, [[0, -0.4252], [0, 0.4252]
["M38x1.5-ext", [1.5, 17.9600, 36.1320, [[0, -0.6622], [0, 0.6622], [0.9650, 0.1051], [0.9650, -0.1051]]]],
["M38x1.5-int", [1.5, -19.1995, 38.2085, [[0, 0.7425], [0, -0.7425], [0.9365, -0.2018], [0.9365, 0.2018]]]],
["M39-ext", [4, 16.8270, 34.1320, [[0, -1.7436], [0, 1.7436], [2.5255, 0.2855], [2.5255, -0.2855]]]],
["M39x4-ext", [4, 16.8270, 34.1320, [[0, -1.7436], [0, 1.7436], [2.5255, 0.2855], [2.5255, -0.2855]]]],
["M39-int", [4, -19.9385, 39.4385, [[0, 1.9598], [0, -1.9598], [2.4535, -0.5433], [2.4535, 0.5433]]]],
["M39x4-int", [4, -19.9385, 39.4385, [[0, 1.9598], [0, -1.9598], [2.4535, -0.5433], [2.4535, 0.5433]]]],
["M39x3-ext", [3, 17.4775, 35.3295, [[0, -1.3115], [0, 1.3115], [1.9050, 0.2116], [1.9050, -0.2116]]]],
["M39x3-int", [3, -19.8490, 39.3490, [[0, 1.4759], [0, -1.4759], [1.8480, -0.4089], [1.8480, 0.4089]]]],
["M39x2-ext", [2, 18.1305, 36.5290, [[0, -0.8793], [0, 0.8793], [1.2795, 0.1406], [1.2795, -0.1406]]]],
@@ -380,7 +436,9 @@ THREAD_TABLE = [["G1/16-ext", [0.907, 3.1631, 6.3625, [[0, -0.4252], [0, 0.4252]
["M40x1.5-ext", [1.5, 18.9600, 38.1320, [[0, -0.6622], [0, 0.6622], [0.9650, 0.1051], [0.9650, -0.1051]]]],
["M40x1.5-int", [1.5, -20.1995, 40.2080, [[0, 0.7425], [0, -0.7425], [0.9365, -0.2018], [0.9365, 0.2018]]]],
["M42-ext", [4.5, 18.0030, 36.5360, [[0, -1.9590], [0, 1.9590], [2.8420, 0.3182], [2.8420, -0.3182]]]],
["M42x4.5-ext", [4.5, 18.0030, 36.5360, [[0, -1.9590], [0, 1.9590], [2.8420, 0.3182], [2.8420, -0.3182]]]],
["M42-int", [4.5, -21.4825, 42.4825, [[0, 2.2019], [0, -2.2019], [2.7505, -0.6139], [2.7505, 0.6139]]]],
["M42x4.5-int", [4.5, -21.4825, 42.4825, [[0, 2.2019], [0, -2.2019], [2.7505, -0.6139], [2.7505, 0.6139]]]],
["M42x4-ext", [4, 18.3270, 37.1320, [[0, -1.7436], [0, 1.7436], [2.5255, 0.2855], [2.5255, -0.2855]]]],
["M42x4-int", [4, -21.4385, 42.4385, [[0, 1.9598], [0, -1.9598], [2.4535, -0.5433], [2.4535, 0.5433]]]],
["M42x3-ext", [3, 18.9775, 38.3295, [[0, -1.3115], [0, 1.3115], [1.9050, 0.2116], [1.9050, -0.2116]]]],
@@ -392,7 +450,9 @@ THREAD_TABLE = [["G1/16-ext", [0.907, 3.1631, 6.3625, [[0, -0.4252], [0, 0.4252]
["M42x1-ext", [1, 20.2915, 40.7370, [[0, -0.4454], [0, 0.4454], [0.6485, 0.0710], [0.6485, -0.0710]]]],
["M42x1-int", [1, -21.1419, 42.1570, [[0, 0.4950], [0, -0.4950], [0.6244, -0.1345], [0.6244, 0.1345]]]],
["M45-ext", [4.5, 19.5030, 39.5360, [[0, -1.9590], [0, 1.9590], [2.8420, 0.3182], [2.8420, -0.3182]]]],
["M45x4.5-ext", [4.5, 19.5030, 39.5360, [[0, -1.9590], [0, 1.9590], [2.8420, 0.3182], [2.8420, -0.3182]]]],
["M45-int", [4.5, -22.9825, 45.4825, [[0, 2.2019], [0, -2.2019], [2.7505, -0.6139], [2.7505, 0.6139]]]],
["M45x4.5-int", [4.5, -22.9825, 45.4825, [[0, 2.2019], [0, -2.2019], [2.7505, -0.6139], [2.7505, 0.6139]]]],
["M45x4-ext", [4, 19.8270, 40.1320, [[0, -1.7436], [0, 1.7436], [2.5255, 0.2855], [2.5255, -0.2855]]]],
["M45x4-int", [4, -22.9385, 45.4385, [[0, 1.9598], [0, -1.9598], [2.4535, -0.5433], [2.4535, 0.5433]]]],
["M45x3-ext", [3, 20.4775, 41.3295, [[0, -1.3115], [0, 1.3115], [1.9050, 0.2116], [1.9050, -0.2116]]]],
@@ -404,7 +464,9 @@ THREAD_TABLE = [["G1/16-ext", [0.907, 3.1631, 6.3625, [[0, -0.4252], [0, 0.4252]
["M45x1-ext", [1, 21.7915, 43.7370, [[0, -0.4454], [0, 0.4454], [0.6485, 0.0710], [0.6485, -0.0710]]]],
["M45x1-int", [1, -22.6419, 45.1570, [[0, 0.4950], [0, -0.4950], [0.6244, -0.1345], [0.6244, 0.1345]]]],
["M48-ext", [5, 20.6755, 41.9335, [[0, -2.1749], [0, 2.1749], [3.1570, 0.3522], [3.1570, -0.3522]]]],
["M48x5-ext", [5, 20.6755, 41.9335, [[0, -2.1749], [0, 2.1749], [3.1570, 0.3522], [3.1570, -0.3522]]]],
["M48-int", [5, -24.5285, 48.5285, [[0, 2.4444], [0, -2.4444], [3.0575, -0.6791], [3.0575, 0.6791]]]],
["M48x5-int", [5, -24.5285, 48.5285, [[0, 2.4444], [0, -2.4444], [3.0575, -0.6791], [3.0575, 0.6791]]]],
["M48x4-ext", [4, 21.3210, 43.1260, [[0, -1.7456], [0, 1.7456], [2.5315, 0.2841], [2.5315, -0.2841]]]],
["M48x4-int", [4, -24.4460, 48.4460, [[0, 1.9620], [0, -1.9620], [2.4610, -0.5412], [2.4610, 0.5412]]]],
["M48x3-ext", [3, 21.9715, 44.3235, [[0, -1.3135], [0, 1.3135], [1.9110, 0.2102], [1.9110, -0.2102]]]],
@@ -422,7 +484,9 @@ THREAD_TABLE = [["G1/16-ext", [0.907, 3.1631, 6.3625, [[0, -0.4252], [0, 0.4252]
["M50x1.5-ext", [1.5, 23.9550, 48.1270, [[0, -0.6637], [0, 0.6637], [0.9700, 0.1036], [0.9700, -0.1036]]]],
["M50x1.5-int", [1.5, -25.2025, 50.2140, [[0, 0.7425], [0, -0.7425], [0.9395, -0.2001], [0.9395, 0.2001]]]],
["M52-ext", [5, 22.6825, 45.9405, [[0, -2.1738], [0, 2.1738], [3.1500, 0.3551], [3.1500, -0.3551]]]],
["M52x5-ext", [5, 22.6825, 45.9405, [[0, -2.1738], [0, 2.1738], [3.1500, 0.3551], [3.1500, -0.3551]]]],
["M52-int", [5, -26.5185, 52.5185, [[0, 2.4415], [0, -2.4415], [3.0475, -0.6820], [3.0475, 0.6820]]]],
["M52x5-int", [5, -26.5185, 52.5185, [[0, 2.4415], [0, -2.4415], [3.0475, -0.6820], [3.0475, 0.6820]]]],
["M52x4-ext", [4, 23.3210, 47.1260, [[0, -1.7456], [0, 1.7456], [2.5315, 0.2841], [2.5315, -0.2841]]]],
["M52x4-int", [4, -26.4460, 52.4460, [[0, 1.9620], [0, -1.9620], [2.4610, -0.5412], [2.4610, 0.5412]]]],
["M52x3-ext", [3, 23.9715, 48.3235, [[0, -1.3135], [0, 1.3135], [1.9110, 0.2102], [1.9110, -0.2102]]]],
@@ -440,7 +504,9 @@ THREAD_TABLE = [["G1/16-ext", [0.907, 3.1631, 6.3625, [[0, -0.4252], [0, 0.4252]
["M55x1.5-ext", [1.5, 26.4550, 53.1270, [[0, -0.6637], [0, 0.6637], [0.9700, 0.1036], [0.9700, -0.1036]]]],
["M55x1.5-int", [1.5, -27.7025, 55.2140, [[0, 0.7425], [0, -0.7425], [0.9395, -0.2001], [0.9395, 0.2001]]]],
["M56-ext", [5.5, 24.3500, 49.3355, [[0, -2.3911], [0, 2.3911], [3.4750, 0.3848], [3.4750, -0.3848]]]],
["M56x5.5-ext", [5.5, 24.3500, 49.3355, [[0, -2.3911], [0, 2.3911], [3.4750, 0.3848], [3.4750, -0.3848]]]],
["M56-int", [5.5, -28.5745, 56.5745, [[0, 2.6866], [0, -2.6866], [3.3640, -0.7444], [3.3640, 0.7444]]]],
["M56x5.5-int", [5.5, -28.5745, 56.5745, [[0, 2.6866], [0, -2.6866], [3.3640, -0.7444], [3.3640, 0.7444]]]],
["M56x4-ext", [4, 25.3210, 51.1260, [[0, -1.7456], [0, 1.7456], [2.5315, 0.2841], [2.5315, -0.2841]]]],
["M56x4-int", [4, -28.4460, 56.4460, [[0, 1.9620], [0, -1.9620], [2.4610, -0.5412], [2.4610, 0.5412]]]],
["M56x3-ext", [3, 25.9715, 52.3235, [[0, -1.3135], [0, 1.3135], [1.9110, 0.2102], [1.9110, -0.2102]]]],
@@ -460,7 +526,9 @@ THREAD_TABLE = [["G1/16-ext", [0.907, 3.1631, 6.3625, [[0, -0.4252], [0, 0.4252]
["M58x1.5-ext", [1.5, 27.9550, 56.1270, [[0, -0.6637], [0, 0.6637], [0.9700, 0.1036], [0.9700, -0.1036]]]],
["M58x1.5-int", [1.5, -29.2025, 58.2145, [[0, 0.7425], [0, -0.7425], [0.9395, -0.2001], [0.9395, 0.2001]]]],
["M60-ext", [5.5, 26.3500, 53.3355, [[0, -2.3911], [0, 2.3911], [3.4750, 0.3848], [3.4750, -0.3848]]]],
["M60x5.5-ext", [5.5, 26.3500, 53.3355, [[0, -2.3911], [0, 2.3911], [3.4750, 0.3848], [3.4750, -0.3848]]]],
["M60-int", [5.5, -30.5745, 60.5745, [[0, 2.6866], [0, -2.6866], [3.3640, -0.7444], [3.3640, 0.7444]]]],
["M60x5.5-int", [5.5, -30.5745, 60.5745, [[0, 2.6866], [0, -2.6866], [3.3640, -0.7444], [3.3640, 0.7444]]]],
["M60x4-ext", [4, 27.3210, 55.1260, [[0, -1.7456], [0, 1.7456], [2.5315, 0.2841], [2.5315, -0.2841]]]],
["M60x4-int", [4, -30.4460, 60.4460, [[0, 1.9620], [0, -1.9620], [2.4610, -0.5412], [2.4610, 0.5412]]]],
["M60x3-ext", [3, 27.9715, 56.3235, [[0, -1.3135], [0, 1.3135], [1.9110, 0.2102], [1.9110, -0.2102]]]],
@@ -482,7 +550,9 @@ THREAD_TABLE = [["G1/16-ext", [0.907, 3.1631, 6.3625, [[0, -0.4252], [0, 0.4252]
["M63x1.5-ext", [1.5, 30.4550, 61.1270, [[0, -0.6637], [0, 0.6637], [0.9700, 0.1036], [0.9700, -0.1036]]]],
["M63x1.5-int", [1.5, -31.7025, 63.2145, [[0, 0.7425], [0, -0.7425], [0.9395, -0.2001], [0.9395, 0.2001]]]],
["M64-ext", [6, 28.0235, 56.7360, [[0, -2.6065], [0, 2.6065], [3.7865, 0.4204], [3.7865, -0.4204]]]],
["M64x6-ext", [6, 28.0235, 56.7360, [[0, -2.6065], [0, 2.6065], [3.7865, 0.4204], [3.7865, -0.4204]]]],
["M64-int", [6, -32.6205, 64.6205, [[0, 2.9291], [0, -2.9291], [3.6680, -0.8114], [3.6680, 0.8114]]]],
["M64x6-int", [6, -32.6205, 64.6205, [[0, 2.9291], [0, -2.9291], [3.6680, -0.8114], [3.6680, 0.8114]]]],
["M64x5.5-ext", [5.5, 28.3500, 57.3355, [[0, -2.3911], [0, 2.3911], [3.4750, 0.3848], [3.4750, -0.3848]]]],
["M64x5.5-int", [5.5, -32.5745, 64.5745, [[0, 2.6866], [0, -2.6866], [3.3640, -0.7444], [3.3640, 0.7444]]]],
["M64x4-ext", [4, 29.3210, 59.1260, [[0, -1.7456], [0, 1.7456], [2.5315, 0.2841], [2.5315, -0.2841]]]],
@@ -1043,6 +1113,8 @@ THREAD_TABLE = [["G1/16-ext", [0.907, 3.1631, 6.3625, [[0, -0.4252], [0, 0.4252]
["M590x6-int", [6, -295.6700, 590.6700, [[0, 2.9434], [0, -2.9434], [3.7150, -0.7985], [3.7150, 0.7985]]]],
["M600x6-ext", [6, 295.9850, 592.7000, [[0, -2.6201], [0, 2.6201], [3.8150, 0.4175], [3.8150, -0.4175]]]],
["M600x6-int", [6, -300.6700, 600.6700, [[0, 2.9434], [0, -2.9434], [3.7150, -0.7985], [3.7150, 0.7985]]]],
["PCO-1810-ext", [3.18, 12.055, 24.51, [[0, -1.13], [0, 1.13], [1.66, 0.5258], [1.66, -0.5258]]]],
["PCO-1810-int", [3.18, -14.045, 27.69, [[0, 1.0423], [0, -1.0423], [1.38, -0.54], [1.38, 0.54]]]],
["PCO-1881-ext", [2.7, 11.52381, 24.2, [[0, -0.987894698], [0, 0.987894698], [2.17619, 0.604173686], [2.17619, -0.195826314]]]],
["PCO-1881-int", [2.7, -14.406, 27.66, [[0, 1.212894698], [0, -0.762894698], [1.656, -0.470897218], [1.656, 0.610159990]]]],
["UNC-#1-ext", [0.396875, 0.6907, 1.3848, [[0, -0.1488], [0, 0.1488], [0.2148, 0.0248], [0.2148, -0.0248]]]],

View File

@@ -1,3 +1,5 @@
# Designator,Pitch,Rrot,Dsupport,r0,z0,r1,z1,r2,z2,r3,z3
PCO-1810-ext,3.18,12.055,24.51,0,-1.13,0,1.13,1.66,0.5258,1.66,-0.5258
PCO-1810-int,3.18,-14.045,27.69,0,1.0423,0,-1.0423,1.38,-0.54,1.38,0.54
PCO-1881-ext,2.7,11.52381,24.2,0,-0.987894698,0,0.987894698,2.17619,0.604173686,2.17619,-0.195826314
PCO-1881-int,2.7,-14.406,27.66,0,1.212894698,0,-0.762894698,1.656,-0.470897218,1.656,0.610159990
1 # Designator Pitch Rrot Dsupport r0 z0 r1 z1 r2 z2 r3 z3
2 PCO-1810-ext 3.18 12.055 24.51 0 -1.13 0 1.13 1.66 0.5258 1.66 -0.5258
3 PCO-1810-int 3.18 -14.045 27.69 0 1.0423 0 -1.0423 1.38 -0.54 1.38 0.54
4 PCO-1881-ext 2.7 11.52381 24.2 0 -0.987894698 0 0.987894698 2.17619 0.604173686 2.17619 -0.195826314
5 PCO-1881-int 2.7 -14.406 27.66 0 1.212894698 0 -0.762894698 1.656 -0.470897218 1.656 0.610159990

View File

@@ -8,6 +8,9 @@ function min(x, y) {
}
function calculateThreadlibSpecs() {
# Calculates threadlib specs for UIS threads assuming class 2
# threads (class 1 and class 3 threads are not supported)
Designator = $1;
TPI = $2;
D = $3;

View File

@@ -9,6 +9,7 @@ function min(x, y) {
function calculateThreadlibSpecs() {
Designator = $3;
DesignatorLong = $2;
P = $4;
H = P / 2 / tan(phi / 2);
DPitchExt = ($8 + $9) / 2;
@@ -30,6 +31,34 @@ function calculateThreadlibSpecs() {
ZCrestInt = (DCrestInt - DPitchInt + H) / 2 * tan(phi / 2);
}
function printExternalThreadSpecs() {
printf P "," # pitch
printf "%.4f,", DValleyExt / 2 # Rrot
printf "%.4f,", DSupportExt # Dsupport
printf 0 "," # r0
printf "%.4f,", -ZValleyExt # z0
printf 0 "," # r1
printf "%.4f,", +ZValleyExt # z1
printf "%.4f,", (DCrestExt - DValleyExt) / 2 # r2
printf "%.4f,", +ZCrestExt # z2
printf "%.4f,", (DCrestExt - DValleyExt) / 2 # r3
printf "%.4f\n", -ZCrestExt; # z3
}
function printInternalThreadSpecs() {
printf P "," # pitch
printf "%.4f,", -DValleyInt / 2 # Rrot
printf "%.4f,", DSupportInt # Dsupport
printf 0 "," # r0
printf "%.4f,", +ZValleyInt # z0
printf 0 "," # r1
printf "%.4f,", -ZValleyInt # z1
printf "%.4f,", -(DCrestInt - DValleyInt) / 2 # r2
printf "%.4f,", -ZCrestInt # z2
printf "%.4f,", -(DCrestInt - DValleyInt) / 2 # r3
printf "%.4f\n", +ZCrestInt; # z3
}
BEGIN {
FS = "\t";
pi = atan2(0, -1);
@@ -41,31 +70,20 @@ BEGIN {
calculateThreadlibSpecs();
# External thread:
printf Designator "-ext," # designator
printf P "," # pitch
printf "%.4f,", DValleyExt / 2 # Rrot
printf "%.4f,", DSupportExt # Dsupport
printf 0 "," # r0
printf "%.4f,", -ZValleyExt # z0
printf 0 "," # r1
printf "%.4f,", +ZValleyExt # z1
printf "%.4f,", (DCrestExt - DValleyExt) / 2 # r2
printf "%.4f,", +ZCrestExt # z2
printf "%.4f,", (DCrestExt - DValleyExt) / 2 # r3
printf "%.4f\n", -ZCrestExt; # z3
printf Designator "-ext," # designator such as "M4-ext"
printExternalThreadSpecs();
if (DesignatorLong != Designator) {
printf DesignatorLong "-ext," # designator such as "M4x0.7-ext"
printExternalThreadSpecs();
}
# Internal thread:
printf Designator "-int," # designator
printf P "," # pitch
printf "%.4f,", -DValleyInt / 2 # Rrot
printf "%.4f,", DSupportInt # Dsupport
printf 0 "," # r0
printf "%.4f,", +ZValleyInt # z0
printf 0 "," # r1
printf "%.4f,", -ZValleyInt # z1
printf "%.4f,", -(DCrestInt - DValleyInt) / 2 # r2
printf "%.4f,", -ZCrestInt # z2
printf "%.4f,", -(DCrestInt - DValleyInt) / 2 # r3
printf "%.4f\n", +ZCrestInt; # z3
}
printf Designator "-int," # designator such as "M4-int"
printInternalThreadSpecs();
if (DesignatorLong != Designator) {
printf DesignatorLong "-int," # designator such as "M4x0.7-int"
printInternalThreadSpecs();
}
}

View File

@@ -2,7 +2,7 @@
The general approach is described in [Creating Thread Specs](./CreatingThreadSpecs.md). We explain the math here. The following figure is of great help to understand what is going on. Black profile: theoretical parting line. The profiles we are going to create are red (internal thread) and blue (external thread). Note that the red and blue profiles are drawn assuming identical pitch diameters for both to clarify the figure. However, in reality external and internal threads do not have the same pitch diameter (see below).
![Parting line of BSP-parallel thread with simplified external and internal thread profiles overlayed](imgs/BSPthread.jpg)
![Parting line of BSP-parallel thread with simplified external and internal thread profiles overlaid](imgs/BSPthread.jpg)
The relevant translation in done in the function calculateThreadlibSpecs() in BSPP_thread.awk.
@@ -11,13 +11,11 @@ Steps:
- Pitch (P): Taken from table BSPP_thread.csv
- Pitch diameter: external threads aim for a somewhat smaller pitch diameter (DPitchExt), internal threads for a larger one (DPitchInt). threadlib aims at the center of the acceptable range given in BSPP_thread.csv. For external thread, we have to choose between class A and class B. We decided for class A.
- Major diameter (for external thread, think minor diameter for internal thread) is chosen in the center of the acceptable range given in BSPP_thread.csv => DMaxExt, DMinInt
- Support diameter (DSupportExt, DSupportInt): Must be on the right side of the parting line. Otherwise no requirements from the norm. We choose the pitch diameter +/- 2 * 5/12 * H, where H is the full heigt of the fundamental triangle and +/- depends on external / internal thread. This is the middle between intended major / minor diameter and the corner of the fundamental triangle.
- Support diameter (DSupportExt, DSupportInt): Must be on the right side of the parting line. Otherwise no requirements from the norm. We choose the pitch diameter +/- 2 * 5/12 * H, where H is the full height of the fundamental triangle and +/- depends on external / internal thread. This is the middle between intended major / minor diameter and the corner of the fundamental triangle.
- The valleys of the actual part will be defined by the support (see above). The valleys of the profile are chosen to overlap somewhat with the support => DValleyExt, DValleyInt (these correspond to Rrot).
However, this is not yet what we need. As we do not want the rounding in the profile, we have to adjust the "crest" diameters of the straightened profile accordingly. Again, the criterion is to define create a profile that strictly remains on its own side of the parting line.
![Formula to calculate r_crest](https://quicklatex.com/cache3/38/ql_000121f710d4df1820cd5937b27b7838_l3.png)
However, this is not yet what we need. As we do not want the rounding in the profile, we have to adjust the "crest" diameters of the straightened profile accordingly. Again, the criterion is to create a profile that strictly remains on its own side of the parting line.
![The 4 points of the thread profile in OpenSCADs x-y plane](imgs/ThreadProfile.png)

View File

@@ -1,20 +1,19 @@
# Creating Thread Specs
In the following, we explain how a thread spec (i.e., an entry in THREAD_TABLE) is created. First, we will explain the basics of threads and how they are specified in the norms. Then, we will ellaborate on the specifics to translate those into threadlib thread specs.
In the following, we explain how a thread spec (i.e., an entry in THREAD_TABLE.scad) is created. First, we will explain the basics of threads and how they are specified in the norms. Then, we will elaborate on how to translate those into threadlib thread specs.
## Thread Basics
As an example, we use British Standard Pipe parallel (BSPP) thread (see drawing below). The black curve shows the parting line between internal and external thread. In an ideal world, both threads are created according to the parting line. For BSP thread it is based on a fundamental triangle with a 55-degree angle rounded to a radius r.
To do this, we use British Standard Pipe parallel (BSPP) thread as an example (see drawing below). The bold curve shows the parting line between internal and external thread. In an ideal world, both threads are created according to the parting line. The parting line of BSP thread is based on a fundamental triangle with a 55-degree angle rounded to a radius r.
![BSPP thread drawing](http://mdmetric.com/tech/55deg228.gif)
![BSPP thread drawing](imgs/BSPthread.jpg)
BSPP thread drawing. Source: Maryland Metrics.
Reality is a bit more complicated: If one of the threads deviates only a little in the wrong direction, the threads collide. Therefore, the pitch radius r_pitch (radius where distance between falling and rising edges is exactly P/2) of the external thread has to be reduced a little bit (and vice versa for the internal thread). Also, major and minor radii are adjusted so that the real thread is guaranteed to remain on its own side of the theoretical parting line.
Reality is a bit more complicated: If one of the threads deviates only a little in the wrong direction, the threads collide. Therefore, the pitch radius r_pitch (radius where distance between falling and rising edges is exactly P/2) of the external thread has to be reduced a little bit (and vice versa for the internal thread). Also, major- and minor radii are adjusted so that the real thread is guaranteed to remain on its own side of the theoretical parting line.
Of course, it is not ok to introduce arbitrarily large allowances: The norm (BS EN ISO 228-1: 2003 in this case) gives the necessary constraints. Quoting [Maryland Metrics thread data charts for BSP thread](http://mdmetric.com/tech/thddat7.htm):
Of course, it is not ok to introduce arbitrarily large allowances: The norm (BS EN ISO 228-1: 2003 in this case) gives the necessary constraints. Quoting Maryland Metrics thread data charts for BSP thread (which used to be [here](http://mdmetric.com/tech/thddat7.htm)):
<table>
<tr>
@@ -108,30 +107,39 @@ Of course, it is not ok to introduce arbitrarily large allowances: The norm (BS
## Deriving threadlib Specs
To simplify the thread profile, we want to avoid the rounding and replace it by a trapezoidal edge as shown in here (red: internal, blue external thread):
We want to approximate the thread profile by straight-line segments as shown in the sketch in red and blue (internal and external thread, respectively).
![threadlib profile compared to BSP parting line](imgs/BSPthread.jpg)
It is clear that we have to match the pitch as accurately as possible. Therefore, threadlibs P is equal to the pitch in the norm (for G1/16: 0.907 mm).
It is clear that we have to match the pitch exactly. Therefore, threadlib's P is equal to the pitch in the norm (for G1/16: 0.907 mm).
Then, we choose the pitch diameter to be in the center of the given tolerance range. For G1/16 this is (7.723 + 0.107/2) mm.
To explain the choice of r_major and r_minor for both external and internal threads simultaneously, we use the terms r_crest and r_valley. r_crest is the major/minor radius (external/internal) and r_valley is the minor/major radius (external/internal). The norm does not give limits for r_valley. But threadlib requires that the threadprofile covers *less* than 1 pitch of thread. Therefore, we arbitrarily choose a small but finite width of "valley floor" that leaves ample clearance to the parting line. For r_crest, we to take into account
To explain the choice of r_major and r_minor for both external and internal threads simultaneously, we use the terms r_crest and r_valley. r_crest is the major/minor radius (external/internal) and r_valley is the minor/major radius (external/internal). The norm does not give limits for r_valley. But threadlib requires that the thread profile covers *less* than 1 pitch of thread. Therefore, we arbitrarily choose a small but finite width of "valley floor" that leaves ample clearance to the parting line. For r_crest, we to take into account
a) the allowed deviations given in the norm
b) the rounding (that we want to leave away)
1) the allowed deviations given in the norm
2) the rounding
The former is simple: We aim for the center. The latter requires a little math: We want our piecewise linear profile to remain on one side of the (true) BSP profile. Therefore, our crest radius has to be equal to the radius where the straight rising edge of the BSP profile touches the circle of the rounding.
The former is simple: We aim for the center. The latter requires a little math: We want our piecewise linear profile to remain on one side of the (true) BSP profile. Therefore, our crest radius has to be equal to the radius where the straight rising edge of the BSP profile touches the circle of the rounding (see sketch at the top of this page).
## Adding Specs to threadlib
To get the threads into threadlib, we currently do the following:
To get the threads into threadlib, we do the following:
- Add csv-file with original thread specs in design (e.g., "newthreads.csv")
- Write an awk script (e.g., design/newthreads.awk) that translates this .csv file to tabular threadlib specs
- Modify Makefile: Add a line like "cat design/newthreads.csv | awk -f design/newthreads.awk >> design/THREAD_TABLE.csv")
- design/autogenerate.awk will translate the resulting THREAD_TABLE.csv into the final THREAD_TABLE.scad (same as the .csv but with added quoting and bracketing).
- Tabulate specs as given in norm => design/newthreads.csv
- Write design/newthreads.awk => translates design/newthreads.csv to tabular threadlib specs (see next step).
- Add instructions to Makefile:
`cat design/newthreads.csv | awk -f design/newthreads.awk >> design/THREAD_TABLE.csv` Now, `make` will automatically run the script.
- design/autogenerate.awk will translate the resulting THREAD_TABLE.csv into the final THREAD_TABLE.scad (same as the .csv but with added quoting and bracketing). This script is already there, you should not need to modify it.
Furthermore, we should extend tests/test_table.awk to test our newly created threads. The very minimum is to add a test for the thread angles. Perform the tests by running 'make test' in the top-level directory or 'make' inside the tests subdirectory. If it prints "TESTS SUCCESSFUL" you are probably fine. Note: If you have a thread spec that is not tested at all, the tests will fail, too.
The format of THREAD_TABLE.csv is:
`DESIGNATOR, P, Rrot, Dsup, dr_0, z0, dr_1, z_1, dr_2, z_2, dr_3, z_3`
The meaning of these values is explained in [Design of Threadlib](DesignOfThreadlib.md).
## Adding Tests
Furthermore, we should extend tests/test_table.awk to test our newly created threads. The very minimum is to add a test for the thread angles. Perform the tests by running `make test` in the top-level directory or `make` inside the tests subdirectory. If it prints "TESTS SUCCESSFUL" you are probably fine. Note: If you have a thread spec that is not tested at all, the tests will fail, too.
For more information on testing, see [Unit Tests](UnitTests.md).

View File

@@ -46,7 +46,7 @@ Why do we need P, Rrot, Dsup, *and* profile? Can we not include everything in pr
*lilo-tapers*: To make the tapers, the profile is scaled-down at the ends. We need to know where the profile is scaled to (center of scaling). We solve this by specifying the radius of rotation for extrusion Rrot explicitly and subtract it from profile (profile holds [dr, z] instead of [r, z]). lilo-tapers are then created by scaling towards dr=0.
*Overlap 1*: We could include P in profile by requiring that profile extends over exactly one period (i.e., P). However, this would result in a helix where neighbouring periods would exactly touch each other. This leads to rendering artifacts => P is stored seperately and profile is *required* to cover *less* than a period.
*Overlap 1*: We could include P in profile by requiring that profile extends over exactly one period (i.e., P). However, this would result in a helix where neighboring periods would exactly touch each other. This leads to rendering artifacts => P is stored separately and profile is *required* to cover *less* than a period.
*Overlap 2*: But hey! Dsup = 2 * Rrot, no? In principle yes, but in that case thread and bolt would *just* touch => rendering problems. But we could implicitly assume that Rrot is simply 1% smaller than Dsup / 2 for external threads (and 1% larger for internal threads)! Yes, we could. But we decided to make that choice explicit rather than implicit.

View File

@@ -1,6 +1,6 @@
os = /usr/local/bin/openscad
opts =
imgs = bolt-M4.png nut-M12x0.5.png nutNbolt.png thread-G1o2-ext.png thread-G1o2-ext-10turns.png flexible.png
imgs = bolt-M4.png nut-M12x0.5.png nutNbolt.png thread-G1o2-ext.png thread-G1o2-ext-10turns.png flexible.png tap.png
.PHONY: all
all: $(imgs)
@@ -21,7 +21,11 @@ thread-G1o2-ext.png: thread.scad
$(os) $(opts) --D 'type="G1/2-ext"' --D 'turns=5' --D 'higbee_arc=20' --camera=-0.7,-0.6,3.4,75,0,110,57 --imgsize=2048,2048 --projection=ortho -o $@ $<
flexible.png: flexible.scad
$(os) $(opts) --D 'type="G1/2-ext"' --D 'turns=5' --D 'higbee_arc=20' --camera=-0.7,-0.6,3.4,75,0,110,57 --imgsize=2048,2048 --projection=ortho -o $@ $<$
$(os) $(opts) --D 'type="G1/2-ext"' --D 'turns=5' --D 'higbee_arc=20' --camera=-0.7,-0.6,3.4,75,0,110,57 --imgsize=2048,2048 --projection=ortho -o $@ $<
tap.png: tap.scad
$(os) $(opts) --D 'type="G1/2"' --D 'turns=5' --D 'higbee_arc=20' --camera=7,15.3,3.45,87,0,333,65 --imgsize=2048,2048 --projection=ortho -o $@ $<
.PHONY: clean
clean:

View File

@@ -1,6 +1,6 @@
# Metric Thread
![Metric thread specs](http://mdmetric.com/tech/din13pix.jpg)
![Metric thread specs](https://upload.wikimedia.org/wikipedia/commons/thumb/4/4b/ISO_and_UTS_Thread_Dimensions.svg/2560px-ISO_and_UTS_Thread_Dimensions.svg.png)
metric_thread.csv provides the numbers given in the norm (no thinking done there, just copying). metric_thread.awk - as usual - calculates the threadlib specs.

View File

@@ -5,9 +5,11 @@ We use unit tests as a means of quality assurance for threadlib.
## THREAD_TABLE.scad
The thread table is tested using an awk script. See [The GNU Awk User's Guide](https://www.gnu.org/software/gawk/manual/gawk.html) for (more than) an introduction to awk. Note that development of threadlib is based not on GNU awk but on MacOSs version of awk, which is mostly - but not completely - compatible.
The thread table is tested using an awk script. See [The GNU Awk User's Guide](https://www.gnu.org/software/gawk/manual/gawk.html) for (more than) an introduction to awk. Note that development of threadlib is based not on GNU awk but on MacOS's version of awk, which is mostly - but not completely - compatible.
Every line of THREAD_TABLE.scad is fed to [tests/test_table.awk](../tests/test_table.awk). test_table.awk then runs appropriate tests for every line. Which tests are appropriate are determined by looking at the thread designator. For example:
Every line of THREAD_TABLE.scad is fed to [tests/test_table.awk](../tests/test_table.awk). test_table.awk then runs appropriate tests for every line. Which tests are appropriate is determined by looking at the thread designator.
Example:
/"[^,]+-ext/ {
# external threads have positive Rrot
@@ -16,14 +18,14 @@ Every line of THREAD_TABLE.scad is fed to [tests/test_table.awk](../tests/test_t
print designator " FAIL: negative radius of rotation";
PASS = 0;
}
# test overlapp between thread and support
# test overlap between thread and support
if (Rrot > Dsupport / 2) {
print designator " FAIL: Rsupport < Rrot";
PASS = 0;
}
}
The pattern /"[^,]+-ext/ means: Run this code for every line that contains double quotes followed by a non-zero (+) number of non-comma characters ([^,]) followed by the string "-ext". I.e, the code is run for every external thread. The code (everything between {}) tests the following assumptions: 1. every external thread must have positive Rrot 2. there must be some overlap between thread and support (i.e. Rrot > Dsupport / 2).
The pattern `/"[^,]+-ext/` means: Run this code for every line that contains double quotes followed by a non-zero (`+`) number of non-comma characters (`[^,]`) followed by the string "-ext". I.e, the code is run for every external thread. The code (everything between `{}`) tests the following assumptions: 1. every external thread must have positive Rrot 2. there must be some overlap between thread and support (i.e. Rrot > Dsupport / 2).
More specific tests verify, e.g., that the thread angles are correct. Not all threads have the same thread angles, therefore we have to distinguish, e.g., between metric threads (designator "M...") and BSPP threads (designator "G..."). Example:
@@ -48,10 +50,10 @@ Note that:
Furthermore, we track whether tests fail. This is done in 2 ways:
- If a test fails it prints an error to the screen
- If a test fails the variable PASS is set to zero
- If a test fails, it prints an error to the screen
- If a test fails, the variable PASS is set to zero
At the very end (END {...}), the awk script tests the value of PASS. If all tests were successfull, it still has its initial value of 1 (set in the BEGIN {...} block). Otherwise, it is 0.
At the very end (`END {...}`), the awk script tests the value of PASS. If all tests were successful, it still has its initial value of 1 (set in the `BEGIN {...}` block). Otherwise, it is 0.
Finally, we have assured that every thread is tested. A thread that is not tested at all is considered a FAIL. This is done via two match-all rules: The first initialized the variable 'tested' to 0. The last verifies that it has been set to 1 by one of the test. If it is still zero, this particular thread has not been tested at all.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 48 KiB

BIN
docs/imgs/tap-G1o2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

3
docs/tap.scad Normal file
View File

@@ -0,0 +1,3 @@
use <threadlib/threadlib.scad>;
tap("G1/2", 5);

12
tests/taptest.scad Normal file
View File

@@ -0,0 +1,12 @@
use <threadlib/threadlib.scad>;
intersection() {
union() {
difference() {
cylinder(r = 15, h = 20);
tap("G1/2", 8);
}
bolt("G1/2", 8);
}
cube([20, 20, 20]);
}

View File

@@ -18,7 +18,7 @@ echo(thread_specs(str(type, "-ext")));
intersection() {
color("Green")
translate([-1000, 0, -1000])
cube(2000, 2000, 2000);
cube(2000);
union() {
bolt(type, turns);
nut(type, turns, Douter);

View File

@@ -137,7 +137,37 @@ BEGIN {
NR_OF_TESTS += 2;
}
/PCO.+-ext/ {
/PCO-1810-ext/ {
# PCO-1810 threads have +/-70 deg slopes, horizontal crest / valley
parse();
m1 = slope(v0, v3) / deg;
m2 = slope(v2, v1) / deg;
if (m1 > 70 + dphi || m1 < 70 - dphi \
|| m2 < -70 - dphi || m2 > -70 + dphi) {
print designator " FAIL: " m1 ", " m2 " deg";
PASS = 0;
}
test_horizontal();
tested = 1;
NR_OF_TESTS += 2;
}
/PCO-1810-int/ {
# PCO-1810 threads have +/-70 deg slopes, horizontal crest / valley
parse();
m1 = slope(v3, v0) / deg;
m2 = slope(v1, v2) / deg;
if (m1 > -70 + dphi || m1 < -70 - dphi \
|| m2 < 70 - dphi || m2 > 70 + dphi) {
print designator " FAIL: " m1 ", " m2 " deg";
PASS = 0;
}
test_horizontal();
tested = 1;
NR_OF_TESTS += 2;
}
/PCO-1881-ext/ {
# PCO-1881 threads have slopes of -80 deg (on the load side) and 70 deg
# (on the other side) + horizontal crest / valley
parse();
@@ -153,7 +183,7 @@ BEGIN {
NR_OF_TESTS += 2;
}
/PCO.+-int/ {
/PCO-1881-int/ {
# PCO-1881 threads have slopes of 80 deg (on the load side) and -70 deg
# (on the other side) + horizontal crest / valley
parse();

View File

@@ -4,7 +4,7 @@ threadlib
Create threads easily.
:Author: Adrian Schlatter
:Author: Adrian Schlatter and contributors
:Date: 2019-11-11
:License: 3-Clause BSD. See LICENSE.
*/
@@ -17,9 +17,12 @@ include <THREAD_TABLE.scad>
function thread_specs(designator, table=THREAD_TABLE) =
/* Returns thread specs of thread-type 'designator' as a vector of
[pitch, Rrotation, Dsupport, section_profile] */
table[search([designator], table, num_returns_per_match=1,
index_col_num=0)[0]][1];
// first lookup designator in table inside a let() statement:
let (specs = table[search([designator], table, num_returns_per_match=1,
index_col_num=0)[0]][1])
// verify that we found something and return it:
assert(!is_undef(specs), str("Designator: '", designator, "' not found")) specs;
module thread(designator, turns, higbee_arc=20, fn=120, table=THREAD_TABLE)
{
@@ -30,6 +33,7 @@ module thread(designator, turns, higbee_arc=20, fn=120, table=THREAD_TABLE)
higbee_arc=higbee_arc,
r=Rrotation,
turns=turns,
fn=fn,
pitch=P);
}
@@ -59,3 +63,17 @@ module nut(designator, turns, Douter, higbee_arc=20, fn=120, table=THREAD_TABLE)
};
};
};
module tap(designator, turns, higbee_arc=20, fn=120, table=THREAD_TABLE) {
difference() {
specs = thread_specs(str(designator, "-int"), table=table);
P = specs[0]; Dsupport = specs[2];
H = (turns + 1) * P;
translate([0, 0, -P / 2]) {
cylinder(h=H, d=Dsupport, $fn=fn);
};
thread(str(designator, "-int"), turns=turns, higbee_arc=higbee_arc, fn=fn, table=table);
};
}