From bb860b61a2007d998669bc399ce2855cc2fefb64 Mon Sep 17 00:00:00 2001 From: Adrian Schlatter <10478149+adrianschlatter@users.noreply.github.com> Date: Tue, 4 Aug 2020 22:36:37 +0200 Subject: [PATCH] Fix docs (#44) Docs * Fixed broken links (to mdmetrics.com) in docs/* and README.rst * Removed externally rendered formula (broken link) in BSPPthread.md * Added explanation for tap module to README.rst which also required a new image and a line in the docs/Makefile CONTRIBUTING * Added CONTRIBUTING (closes #3) --- CONTRIBUTING.md | 65 ++++++++++++++++++++++++++++++++++++ README.rst | 43 ++++++++++++++++++++---- docs/BSPPthread.md | 4 +-- docs/CreatingThreadSpecs.md | 10 +++--- docs/Makefile | 8 +++-- docs/MetricThread.md | 2 +- docs/imgs/tap-G1o2.png | Bin 0 -> 24246 bytes docs/tap.scad | 3 ++ 8 files changed, 117 insertions(+), 18 deletions(-) create mode 100644 CONTRIBUTING.md create mode 100644 docs/imgs/tap-G1o2.png create mode 100644 docs/tap.scad diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..14d2186 --- /dev/null +++ b/CONTRIBUTING.md @@ -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. diff --git a/README.rst b/README.rst index 2368285..520b49c 100644 --- a/README.rst +++ b/README.rst @@ -98,6 +98,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 @@ -107,8 +133,9 @@ 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 @@ -131,11 +158,15 @@ List of supported threads Currently, threadlib knows these threads: -- `Metric threads `__ (coarse, fine, and super-fine pitches) M0.25 to M600 +- 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 `__ G1/16 to G6 -- `PCO-1881 `__ (PET-bottle thread) +- `BSP parallel thread + `__ + G1/16 to G6. All threads are class A threads. +- `PCO-1881 + `__ + (PET-bottle thread) Extensibility @@ -166,6 +197,6 @@ Change Log - 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 `__, `PCO-1881 `__ +- 0.2: Metric threads, `PCO-1881 `__ - 0.1: Initial release supporting `BSP parallel thread `__ diff --git a/docs/BSPPthread.md b/docs/BSPPthread.md index 3b05618..c986fb1 100644 --- a/docs/BSPPthread.md +++ b/docs/BSPPthread.md @@ -15,9 +15,7 @@ Steps: - 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) diff --git a/docs/CreatingThreadSpecs.md b/docs/CreatingThreadSpecs.md index d2344c2..4f2ba28 100644 --- a/docs/CreatingThreadSpecs.md +++ b/docs/CreatingThreadSpecs.md @@ -6,15 +6,15 @@ In the following, we explain how a thread spec (i.e., an entry in THREAD_TABLE) ## Thread Basics -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. +To do this, we use British Standard Pipe parallel (BSPP) thread as an example (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. 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. -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)): @@ -108,10 +108,8 @@ 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): +To simplify the thread profile, we want to avoid the rounding and replace it by a trapezoidal edge as shown in the image above 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). 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. diff --git a/docs/Makefile b/docs/Makefile index 6e803f2..0125d80 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -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: diff --git a/docs/MetricThread.md b/docs/MetricThread.md index 48feaea..2a1d83c 100644 --- a/docs/MetricThread.md +++ b/docs/MetricThread.md @@ -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. diff --git a/docs/imgs/tap-G1o2.png b/docs/imgs/tap-G1o2.png new file mode 100644 index 0000000000000000000000000000000000000000..a82dbf417f388794e3ecddcb1d686c3f137567ad GIT binary patch literal 24246 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 d(Ar?ar57e8m6&002ovPDHLkV1hXzIjaBw literal 0 HcmV?d00001 diff --git a/docs/tap.scad b/docs/tap.scad new file mode 100644 index 0000000..b370d3a --- /dev/null +++ b/docs/tap.scad @@ -0,0 +1,3 @@ +use ; + +tap("G1/2", 5);