1
0
mirror of https://github.com/nophead/NopSCADlib.git synced 2025-09-03 12:22:46 +02:00

Compare commits

...

119 Commits

Author SHA1 Message Date
Chris Palmer
fd8712d6bf Updated images and readme. 2020-03-15 17:35:21 +00:00
Chris Palmer
b6a32b6b41 Fixed square nut threads. 2020-03-15 17:16:28 +00:00
Chris Palmer
0738893510 Merge branch 'square-nuts' of https://github.com/FLamparski/NopSCADlib into FLamparski-square-nuts 2020-03-15 17:06:15 +00:00
Filip Wieland
849bc479cc Adds DIN 562 square nuts 2020-03-15 17:01:48 +00:00
Chris
86d7e0f124 Merge pull request #66 from FLamparski/fix-windows-paths-with-spaces
Fix handling of (Windows) paths with spaces
2020-03-15 16:34:58 +00:00
Filip Wieland
c897060726 Fix handling of Windows paths with spaces 2020-03-15 16:25:18 +00:00
Chris Palmer
b2c2fc668b Added descriptions to doc_scripts.py and gallery.py. 2020-03-15 16:11:27 +00:00
Chris Palmer
4914f90994 Now ensures project scad dir searched first. 2020-03-12 22:56:56 +00:00
Chris Palmer
2210396234 Now uses the dependencies to locate modules for printed parts and assemblies. 2020-03-12 22:47:27 +00:00
Chris Palmer
2eef050f60 Missing bracket. 2020-03-11 23:11:34 +00:00
Chris Palmer
23a64f238d Added usage messages to all the scripts and documented multiple configuration
projects.
2020-03-11 23:09:03 +00:00
Chris Palmer
a8422a6aa6 Updated main image 2020-03-07 22:16:53 +00:00
Chris Palmer
b56ddea1e3 Can now have PCB screw holes without screws for RAMPS endstop. 2020-03-07 22:11:09 +00:00
Chris Palmer
c16a1c3804 Moved cable strips nearer the back of the libtest picture. 2020-03-05 20:55:57 +00:00
Chris Palmer
245b158f1d Added threads to fuseholder. 2020-03-05 10:15:42 +00:00
Chris Palmer
60628dfec0 Added threads to 4mm jack sockets. 2020-03-04 17:42:03 +00:00
Chris Palmer
f7db793c74 Assembly module search in views.py now case insensitive
allowing the module name string to specify the capitalisaing used in the
build instructions.
2020-03-04 12:15:48 +00:00
Chris Palmer
53292c9f89 Filenames of tests can now be capitalised to get the correct titles.
The implementation files are still lower case for backwards compatibility.
2020-03-03 20:33:53 +00:00
Chris Palmer
bd60b50b09 Removed lower case tests 2020-03-03 20:28:18 +00:00
Chris Palmer
4d51cb73f3 Table of contents now has three vitamin coloumns 2020-03-03 09:32:08 +00:00
Chris Palmer
3b77c97532 Example now include core.scad instead of lib.scad. 2020-03-02 21:04:19 +00:00
Chris Palmer
4442042197 Include of wire.scad changed to use. 2020-03-02 21:03:41 +00:00
Chris Palmer
4e233e5e9d Updated readme and images 2020-03-02 19:45:28 +00:00
Martin Budden
675953d334 Allow no center hole in extrusion. 2020-03-02 19:06:53 +00:00
Martin Budden
9527fa1c1f Added E1515 extrusion. 2020-03-02 18:51:27 +00:00
Chris
3f209cbdd3 Merge pull request #60 from nophead/issue_57
Fix for issue #57, now searches multiple directories.
2020-03-02 18:38:36 +00:00
Chris Palmer
7b76aceaad Changed microswitch include to a use. 2020-03-02 14:15:51 +00:00
Chris Palmer
4edd08977f Added green_terminals and pin_headers to lib.scad.
Removed terminal_254() because it can't work.
2020-03-02 13:51:59 +00:00
Chris Palmer
a1d385f9ec Updated gallery images 2020-03-02 13:49:41 +00:00
Chris Palmer
fc17b52518 Added missing includes in lib.scad: extrusion_brackets and kp_pillow_blocks.
Since kp_pillow_blocks includes ball bearings, they were also missing.
2020-03-02 09:52:31 +00:00
Chris Palmer
9fbdb82991 bom.py now shows errors and warnings. 2020-03-02 09:38:37 +00:00
Chris Palmer
7706716fa2 Updated readme for threads. 2020-03-01 20:08:19 +00:00
Chris Palmer
c815c1592d SHOW_THREADS renamed NOPSCADLIB_SHOW_THREADS for #61 2020-03-01 19:10:40 +00:00
Chris Palmer
e32ef88c90 Small optimisation to views.py 2020-03-01 19:09:18 +00:00
Chris Palmer
702c450a27 Small optimisation to exports.py 2020-03-01 18:35:53 +00:00
Chris Palmer
343351155c Made library search order deterministic by sorting the result of os.listdir() 2020-03-01 17:53:20 +00:00
Chris Palmer
c41b1fa115 Fix for issue #57, now searches multiple directories. 2020-03-01 10:55:52 +00:00
Chris Palmer
1a197ac823 Fixed missing screw holes in blowers. 2020-02-29 20:34:05 +00:00
Chris Palmer
ab592e049c Screws.scad is now included in core.scad, so doesn't need to be included
anywhere else. utils/core/core.scad is the old version without fasteners to
be used internally in the library.
2020-02-29 17:52:36 +00:00
Chris Palmer
9b104e4fe7 Changed the default printed part colour, pp1_colour to RepRap logo green. 2020-02-29 10:30:15 +00:00
Chris Palmer
f0b4d767e9 Replaced "lime" with pp1_colour. 2020-02-29 10:26:25 +00:00
Chris Palmer
82baed4c8f Updated images and readme. 2020-02-29 09:00:20 +00:00
Chris Palmer
acb2cb2a48 Changed PSU list order to get all the shrouds together. 2020-02-29 08:55:40 +00:00
Chris Palmer
cf94972b18 Merge branch 'psu_vents' of https://github.com/martinbudden/NopSCADlib into martinbudden-psu_vents 2020-02-29 08:48:33 +00:00
Chris Palmer
7c0a48d0c1 Added parametric printed box 2020-02-29 01:27:17 +00:00
Martin Budden
a5a640e273 Added facility to add vents to PSU. Added vents to S_300_12. 2020-02-28 21:21:11 +00:00
Chris Palmer
95c4359421 Better test coverage of stepper earth tag position. 2020-02-28 14:27:35 +00:00
Chris Palmer
bcff26a27b Added threads to stepper motors and made the test show them. 2020-02-28 12:02:24 +00:00
Chris Palmer
07b00fabe0 Added a guard against and empty BOM in views.py. 2020-02-28 09:22:50 +00:00
Chris Palmer
8ed0f3c1af Updated readme and images. 2020-02-28 09:05:59 +00:00
Martin Budden
0e8e387d35 Improved S_300_12 PSU. 2020-02-28 03:05:45 +00:00
Chris Palmer
0c17620adb Removed echo from extrusion_bracket.scad 2020-02-28 01:59:00 +00:00
Chris Palmer
6470f1b004 Extrusions now default to centered. New parts added to the libtest picture.
Extrusion bracket examples rotated for clearer view and made optional.
Added missing description for scs_bearing_blocks.
Extrusion no longer shows centre parameter but does show no default cornerHole.
2020-02-27 17:55:03 +00:00
Chris Palmer
29ba402530 Updated image 2020-02-27 11:22:02 +00:00
Chris Palmer
aed4a699f2 Merge branch 'kp_pillow_block_fix' of https://github.com/martinbudden/NopSCADlib into martinbudden-kp_pillow_block_fix 2020-02-27 11:18:54 +00:00
Chris Palmer
10b846c0d5 Updated images 2020-02-27 11:17:07 +00:00
Martin Budden
2de479d691 Fixed incomplete webbing on side of kp_pillow_block. 2020-02-27 10:44:00 +00:00
Chris Palmer
054dab5025 Merge branch 'linear_rail_groove' of https://github.com/martinbudden/NopSCADlib into martinbudden-linear_rail_groove 2020-02-27 10:35:09 +00:00
Chris Palmer
b559319b03 Ensured all Markdown table heading markers have at least three dashes. 2020-02-27 10:15:37 +00:00
Martin Budden
a487ca0f20 Added groove to linear_rail. 2020-02-27 09:47:36 +00:00
Chris Palmer
a2ce3f1278 Updated readme 2020-02-27 09:44:54 +00:00
Chris Palmer
01eb6931d9 Merge branch 'extrusion_center' of https://github.com/martinbudden/NopSCADlib into martinbudden-extrusion_center 2020-02-27 09:41:01 +00:00
Chris Palmer
c09a74b4c9 Added center option to spring and documented the origin of rods, etc. 2020-02-27 09:39:05 +00:00
Martin Budden
aab7f3d683 Added center parameter. Added cornerhole dimensions to E20. 2020-02-27 09:03:23 +00:00
Chris Palmer
ad719dad5a Added copyright boiler plate and description.
Updated images and readme.
2020-02-26 19:43:02 +00:00
Chris Palmer
00690b61d2 Merge branch 'extrusion_corner_brackets' of https://github.com/martinbudden/NopSCADlib into martinbudden-extrusion_corner_brackets 2020-02-26 19:23:39 +00:00
Chris Palmer
1a24e0d87e Added image and updated readme. 2020-02-26 15:55:22 +00:00
Chris Palmer
171c9a6a34 Merge branch 'pcb_additions' of https://github.com/martinbudden/NopSCADlib into martinbudden-pcb_additions 2020-02-26 15:39:12 +00:00
Chris Palmer
8bb4b3881e Fixed test, image and readme updated. 2020-02-26 15:24:33 +00:00
Chris Palmer
79f8bc66e1 Merge branch 'Drachenkaetzchen-patch-1' of https://github.com/Drachenkaetzchen/NopSCADlib into Drachenkaetzchen-Drachenkaetzchen-patch-1 2020-02-26 14:58:27 +00:00
Chris Palmer
33c9d158ef REmoved fans.scad from lib.scad as already included from psus.scad. 2020-02-26 14:03:46 +00:00
Chris Palmer
d2874a0531 Moved washers.scad from screws.scad to nuts.scad.
Moved screw_insert() from inserts.scad to screw.scad.
Changed most includes of inserts.scad to use insert.scad.
Removed linear_bearings, iecs, rockers and microswitches from lib.scad as
already included by other vitamins.
2020-02-26 13:46:11 +00:00
Felicia Hummel
b6fd795a25 Updated readme to reflect the pillow block changes 2020-02-26 13:02:17 +01:00
Felicia Hummel
ad0882db40 Added 15mm and 18mm variants for the KP08 blocks 2020-02-26 12:57:53 +01:00
Chris Palmer
8afb08aaa4 Updated image 2020-02-26 10:23:05 +00:00
Martin Budden
e87dffd92c More pcb component examples. Allowed more colour setting. 2020-02-26 07:19:55 +00:00
Martin Budden
c364bf06b2 Code tidy. 2020-02-25 22:34:13 +00:00
Martin Budden
1668f9c54c Naming update. 2020-02-25 22:23:44 +00:00
Martin Budden
e0dd174010 Parameterisation of extrusion brackets. 2020-02-25 22:19:20 +00:00
Martin Budden
f104bd42e5 Added back jst_xh connector to ramps endstop. 2020-02-25 21:38:53 +00:00
Martin Budden
8342ba87e9 Update as per code review. 2020-02-25 21:07:29 +00:00
Martin Budden
0e58e92fbc Allowed parameterised green terminals on PCBs. 2020-02-25 21:01:04 +00:00
Martin Budden
1af2e18594 Added usb_Ax1 and potentiometer. 2020-02-25 20:39:37 +00:00
Martin Budden
598527edbe Added a test pcb. 2020-02-25 20:13:15 +00:00
Martin Budden
9c666f8f47 Merge branch 'pin_header_color' into pcb_additions 2020-02-25 19:07:58 +00:00
Martin Budden
bc1f135e40 Added ability to set socket color. 2020-02-25 17:06:16 +00:00
Martin Budden
ce36729e50 Allow pin header base colour to be set on PCB. 2020-02-25 17:05:48 +00:00
Martin Budden
1dca024e64 Internal and external corner brackets for 20nn extrusion. 2020-02-25 16:53:51 +00:00
Chris Palmer
c1833f0820 Updated image and readme. 2020-02-25 13:42:31 +00:00
Chris Palmer
6a7f7dcbbf Merge branch 'sk_bracket_screw_length' of https://github.com/martinbudden/NopSCADlib into martinbudden-sk_bracket_screw_length 2020-02-25 12:34:19 +00:00
Chris Palmer
5d3f1115bb Updated readme and images 2020-02-25 11:11:05 +00:00
Chris Palmer
9f9adeb6ca Merge branch 'teardrop_chamfer' of https://github.com/martinbudden/NopSCADlib into martinbudden-teardrop_chamfer 2020-02-25 09:44:38 +00:00
Chris Palmer
f9b06c855c Merge branch 'martinbudden-kp_pillow_block' 2020-02-25 09:32:55 +00:00
Chris Palmer
05bfe9b159 Updated and images. 2020-02-25 09:32:40 +00:00
Martin Budden
f961874ce3 Added kp_pillow_blocks. 2020-02-25 07:55:47 +00:00
Martin Budden
7a6210f442 Add optional chamfer to teardrops. Defaults to no chamfer. 2020-02-25 07:46:57 +00:00
Martin Budden
5bae0aaa51 Better sk_bracket screw length calculation. 2020-02-25 07:33:07 +00:00
Chris Palmer
8649d59e8a Merge branch 'martinbudden-print_search_path' 2020-02-25 00:05:12 +00:00
Chris Palmer
e9bc300b8d Fix for printed directory not present. 2020-02-24 23:58:22 +00:00
Chris Palmer
dcb1e74894 Merge branch 'print_search_path' of https://github.com/martinbudden/NopSCADlib into martinbudden-print_search_path 2020-02-24 19:02:50 +00:00
Chris Palmer
42b9479094 Merge branch 'martinbudden-tnuts_and_hammer_nuts' 2020-02-24 18:37:40 +00:00
Chris Palmer
f46f35e909 Updated readme 2020-02-24 18:37:25 +00:00
Chris Palmer
0513b151b2 Merge branch 'tnuts_and_hammer_nuts' of https://github.com/martinbudden/NopSCADlib into martinbudden-tnuts_and_hammer_nuts 2020-02-24 18:22:05 +00:00
Chris Palmer
dcf258f11a Brass colour now distinct from gold. 2020-02-24 18:15:20 +00:00
Martin Budden
4ff6c7d0a8 Unified tnuts and hammer nuts. 2020-02-24 17:40:39 +00:00
Chris Palmer
2edb6d4df2 Shorter screws when using T-nut but mignt not be a suitable standard size. 2020-02-24 12:01:40 +00:00
Chris Palmer
26e8497018 Merge branch 'martinbudden-sk_brackets_tidy' 2020-02-24 11:42:07 +00:00
Chris Palmer
bfde879ce2 Updated readme and images. 2020-02-24 11:41:39 +00:00
Chris Palmer
4641e3a642 More nut and screw types 2020-02-24 11:40:30 +00:00
Chris Palmer
42cfed8846 Set default part thickness to 2. 2020-02-24 11:38:31 +00:00
Chris Palmer
8c339a18c4 Removed washers from T-nuts and used the lack to detect them. 2020-02-24 11:23:10 +00:00
Chris Palmer
065ec0a430 Corrected nut placement 2020-02-24 11:18:34 +00:00
Chris Palmer
e7eea0520c T nut thickness no longer includes the stem to simplyfy placement and screw
length calculations.
2020-02-24 11:14:30 +00:00
Chris Palmer
5cb994b58b Retabulated nut table 2020-02-24 10:21:37 +00:00
Chris Palmer
573425055a Fixed origin of T-nuts to be consistent with others.
I.e the mating face is at Z = 0.
2020-02-24 09:11:59 +00:00
Chris Palmer
66a7a9bfe0 Used named elements of size. 2020-02-24 08:57:22 +00:00
Chris Palmer
0335545334 Merge branch 'sk_brackets_tidy' of https://github.com/martinbudden/NopSCADlib into martinbudden-sk_brackets_tidy 2020-02-24 08:38:16 +00:00
Martin Budden
66a8d1d583 Tidy of sk_brackets as per scs_bearing_blocks code review. 2020-02-23 22:56:47 +00:00
Martin Budden
ad3e8d85af Added scad/printed to stl search path. 2020-02-23 17:54:28 +00:00
304 changed files with 2621 additions and 936 deletions

View File

@@ -18,22 +18,10 @@
//
//
// Include this file to use the miniumum library
// Include this file to use the miniumum library plus screws, nuts and washers
//
include <global_defs.scad>
include <utils/core/core.scad>
//
// Global functions and modules
// Fasteners used by a lot of other vitamins
//
use <utils/core/global.scad>
module use_stl(name) { //! Import an STL to make a build platter
stl(name);
import(str("../stls/", name, ".stl"));
}
module use_dxf(name) { //! Import a DXF to make a build panel
dxf(name);
import(str("../dxfs/", name, ".dxf"));
}
include <vitamins/screws.scad>

View File

@@ -116,8 +116,8 @@ get shared if other files in the project include ```lib.scad``` as well, or if y
One downside is that any change to the library will mean all the project files need regenerating.
A more optimised approach for large projects is to include [NopSCADlib/core.scad](../core.scad) instead.
That only has the a small set of utilities and the global settings in [global_defs.scad](../global_defs.scad). Any vitamins used need to be included explicitly.
One can copy the include or use line from [NopSCADlib/lib.scad](../lib.scad).
That only has the a small set of utilities and the global settings in [global_defs.scad](../global_defs.scad) plus screws, nuts and washers that are required by a lot of other vitamins.
Any other vitamins used need to be included explicitly. One can copy the includes or use a line from [NopSCADlib/lib.scad](../lib.scad).
### Parametric parts.
@@ -233,3 +233,20 @@ Vitamins are only ever previewed, so they are optimised to draw quickly in F5 an
In OpenCSG 3D difference and intersection are relatively slow and the negative volumes interfere with nearby objects when they are composed into assemblies. For this reason as much
as possible is done by unioning primitives and extruded 2D shapes. Any 3D differences or intersections are wrapped in ```render()``` so that CGAL will compute a polyhedron
that is cached and reused. This will be very slow the first time it renders but very fast afterwards.
### Multiple configurations
Some parametric designs might have several configurations, for example a 3D printer with different size options. If several configurations need to be supported at the
same time multiple sets of BOMS, STLS and DXFs need to be generated in separate diectories. NopSCADlib supports this by having multiple configuration files named
```config_<target_name>.scad```. All the scripts take an optional first parameter that selects one of these config files by specifying ```target_name```.
The target config file is selected by generating ```target.scad``` that includes ```config_<target_name>.scad```.
The rest of the project includes ```target.scad``` to use the configuration.
Additionally all the generated file directories (assemblies, bom, stls, dxfs, etc.) are placed in a sub-directory called ```<target_name>```.
### Other libraries
The build scripts need to be able to locate the source files where the modules to generate the STL files and assemblies reside. They will search all the scad files
in the project plus any ```printed``` directories outside the project. This covers the printed parts in NopSCADlib but also allows other libraries of printed parts.
Other libraries of vitamins and utilities can be used provided they follow the same convensions of NopSCADlib. The build scripts don't need to search those.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 96 KiB

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 107 KiB

After

Width:  |  Height:  |  Size: 108 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 104 KiB

After

Width:  |  Height:  |  Size: 105 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 130 KiB

After

Width:  |  Height:  |  Size: 137 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 179 KiB

After

Width:  |  Height:  |  Size: 200 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 121 KiB

After

Width:  |  Height:  |  Size: 124 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 130 KiB

After

Width:  |  Height:  |  Size: 134 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 26 KiB

View File

@@ -30,7 +30,7 @@ Earth leakage can be measured Canadian CSA style by disconnected the neutral lin
<a name="Parts_list"></a>
## Parts list
| <span style="writing-mode: vertical-rl; text-orientation: mixed;">Base</span> | <span style="writing-mode: vertical-rl; text-orientation: mixed;">Feet</span> | <span style="writing-mode: vertical-rl; text-orientation: mixed;">Mains&nbsp;In</span> | <span style="writing-mode: vertical-rl; text-orientation: mixed;">Main</span> | <span style="writing-mode: vertical-rl; text-orientation: mixed;">TOTALS</span> | |
|--:|--:|--:|--:|--:|:--|
|---:|---:|---:|---:|---:|:---|
| | | | | | **Vitamins** |
| &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;2&nbsp; | &nbsp;&nbsp;2&nbsp; | &nbsp;&nbsp; 4mm shielded jack socket blue |
| &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;.&nbsp; | &nbsp;&nbsp;1&nbsp; | &nbsp;&nbsp;1&nbsp; | &nbsp;&nbsp; 4mm shielded jack socket brown |
@@ -61,14 +61,14 @@ Earth leakage can be measured Canadian CSA style by disconnected the neutral lin
## Base Assembly
### Vitamins
|Qty|Description|
|--:|:----------|
|---:|:----------|
|2| Heatfit insert M3|
### 3D Printed parts
| 1 x socket_box.stl |
|--|
|---|
| ![socket_box.stl](stls/socket_box.png)
@@ -88,7 +88,7 @@ Earth leakage can be measured Canadian CSA style by disconnected the neutral lin
## Feet Assembly
### Vitamins
|Qty|Description|
|--:|:----------|
|---:|:----------|
|4| Nut M3 x 2.4mm nyloc|
|4| Screw M3 dome x 10mm|
|8| Washer M3 x 7mm x 0.5mm|
@@ -97,7 +97,7 @@ Earth leakage can be measured Canadian CSA style by disconnected the neutral lin
### 3D Printed parts
| 4 x foot.stl |
|--|
|---|
| ![foot.stl](stls/foot.png)
@@ -105,7 +105,7 @@ Earth leakage can be measured Canadian CSA style by disconnected the neutral lin
### Sub-assemblies
| 1 x base_assembly |
|--|
|---|
| ![base_assembled](assemblies/base_assembled_tn.png)
@@ -124,7 +124,7 @@ Earth leakage can be measured Canadian CSA style by disconnected the neutral lin
## Mains In Assembly
### Vitamins
|Qty|Description|
|--:|:----------|
|---:|:----------|
|3| Heatshrink sleeving ID 3.2mm x 15mm - not shown|
|1| IEC inlet for ATX|
|2| Nut M3 x 2.4mm nyloc|
@@ -138,7 +138,7 @@ Earth leakage can be measured Canadian CSA style by disconnected the neutral lin
### Sub-assemblies
| 1 x feet_assembly |
|--|
|---|
| ![feet_assembled](assemblies/feet_assembled_tn.png)
@@ -163,7 +163,7 @@ Earth leakage can be measured Canadian CSA style by disconnected the neutral lin
## Main Assembly
### Vitamins
|Qty|Description|
|--:|:----------|
|---:|:----------|
|2| 4mm shielded jack socket blue|
|1| 4mm shielded jack socket brown|
|2| 4mm shielded jack socket green|
@@ -178,7 +178,7 @@ Earth leakage can be measured Canadian CSA style by disconnected the neutral lin
### Sub-assemblies
| 1 x mains_in_assembly |
|--|
|---|
| ![mains_in_assembled](assemblies/mains_in_assembled_tn.png)

View File

@@ -35,7 +35,14 @@ $extrusion_width = 0.5;
$pp1_colour = "dimgrey";
$pp2_colour = [0.9, 0.9, 0.9];
include <NopSCADlib/lib.scad>
include <NopSCADlib/core.scad>
include <NopSCADlib/vitamins/iecs.scad>
include <NopSCADlib/vitamins/mains_sockets.scad>
include <NopSCADlib/vitamins/tubings.scad>
use <NopSCADlib/vitamins/insert.scad>
use <NopSCADlib/vitamins/wire.scad>
use <NopSCADlib/vitamins/jack.scad>
use <NopSCADlib/printed/foot.scad>
echo(extrusion_width = extrusion_width, layer_height = layer_height);

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 108 KiB

After

Width:  |  Height:  |  Size: 107 KiB

BIN
gallery/EnviroPlus.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 121 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 124 KiB

After

Width:  |  Height:  |  Size: 179 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 169 KiB

After

Width:  |  Height:  |  Size: 169 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 280 KiB

After

Width:  |  Height:  |  Size: 280 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 291 KiB

After

Width:  |  Height:  |  Size: 291 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 286 KiB

After

Width:  |  Height:  |  Size: 287 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 230 KiB

After

Width:  |  Height:  |  Size: 230 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 206 KiB

After

Width:  |  Height:  |  Size: 205 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 207 KiB

After

Width:  |  Height:  |  Size: 207 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 198 KiB

After

Width:  |  Height:  |  Size: 198 KiB

View File

@@ -6,6 +6,13 @@ Arduino thermostat to control a beer fridge to use it as an environmental chambe
![](ArduinoThermostat.png)
<a name="TOP"></a>
## EnviroPlus
Environmental monitor using Enviro+ sensor board and a Raspberry Pi Zero.
![](EnviroPlus.png)
<a name="TOP"></a>
## FilamentDryBox
A small fan oven with a spool holder to keep the filament warm and dry.

View File

@@ -34,7 +34,7 @@ layer_height = is_undef($layer_height) ? 0.25 : $layer_height; // lay
extrusion_width = is_undef($extrusion_width) ? 0.5 : $extrusion_width; // filament width when printing
nozzle = is_undef($nozzle) ? 0.45 : $nozzle; // 3D printer nozzle
cnc_bit_r = is_undef($cnc_bit_r) ? 1.2 : $cnc_bit_r; // miniumum tool radius when milling 2D objects
pp1_colour = is_undef($pp1_colour) ? "lime" : $pp1_colour; // printed part colour 1
pp1_colour = is_undef($pp1_colour) ? [0, 146/255, 0] : $pp1_colour; // printed part colour 1, RepRap logo colour
pp2_colour = is_undef($pp2_colour) ? "red" : $pp2_colour; // printed part colour 2
pp3_colour = is_undef($pp3_colour) ? "blue" : $pp3_colour; // printed part colour 3
pp4_colour = is_undef($pp4_colour) ? "darkorange" : $pp4_colour;// printed part colour 4
@@ -60,7 +60,8 @@ grey60 = [0.6, 0.6, 0.6];
grey70 = [0.7, 0.7, 0.7];
grey80 = [0.8, 0.8, 0.8];
grey90 = [0.9, 0.9, 0.9];
brass = [255/255, 215/255, 0/255];
gold = [255/255, 215/255, 0/255];
brass = [255/255, 220/255, 100/255];
silver = [0.75, 0.75, 0.75];
/*

View File

@@ -22,49 +22,45 @@
//
include <core.scad>
include <vitamins/fans.scad>
include <vitamins/psus.scad>
include <vitamins/pcbs.scad>
include <vitamins/batteries.scad>
include <vitamins/blowers.scad>
include <vitamins/bulldogs.scad>
include <vitamins/buttons.scad>
include <vitamins/components.scad>
include <vitamins/displays.scad>
include <vitamins/extrusions.scad>
include <vitamins/extrusion_brackets.scad>
include <vitamins/geared_steppers.scad>
include <vitamins/green_terminals.scad>
include <vitamins/hot_ends.scad>
include <vitamins/inserts.scad>
include <vitamins/kp_pillow_blocks.scad>
include <vitamins/ldrs.scad>
include <vitamins/leadnuts.scad>
include <vitamins/leds.scad>
include <vitamins/light_strips.scad>
include <vitamins/mains_sockets.scad>
include <vitamins/modules.scad>
include <vitamins/pillars.scad>
include <vitamins/pin_headers.scad>
include <vitamins/pulleys.scad>
include <vitamins/ring_terminals.scad>
include <vitamins/rails.scad>
include <vitamins/belts.scad>
include <vitamins/pulleys.scad>
include <vitamins/sheets.scad>
include <vitamins/stepper_motors.scad>
include <vitamins/components.scad>
include <vitamins/hot_ends.scad>
include <vitamins/tubings.scad>
include <vitamins/zipties.scad>
include <vitamins/linear_bearings.scad>
include <vitamins/rod.scad>
include <vitamins/leadnuts.scad>
include <vitamins/bulldogs.scad>
include <vitamins/pillars.scad>
include <vitamins/psus.scad>
include <vitamins/iecs.scad>
include <vitamins/rockers.scad>
include <vitamins/scs_bearing_blocks.scad>
include <vitamins/sheets.scad>
include <vitamins/sk_brackets.scad>
include <vitamins/spools.scad>
include <vitamins/ssrs.scad>
include <vitamins/d_connectors.scad>
include <vitamins/buttons.scad>
include <vitamins/pcbs.scad>
include <vitamins/modules.scad>
include <vitamins/displays.scad>
include <vitamins/blowers.scad>
include <vitamins/leds.scad>
include <vitamins/stepper_motors.scad>
include <vitamins/toggles.scad>
include <vitamins/transformers.scad>
include <vitamins/tubings.scad>
include <vitamins/variacs.scad>
include <vitamins/springs.scad>
include <vitamins/batteries.scad>
include <vitamins/microswitches.scad>
include <vitamins/ball_bearings.scad>
include <vitamins/light_strips.scad>
include <vitamins/spools.scad>
include <vitamins/mains_sockets.scad>
include <vitamins/ldrs.scad>
include <vitamins/geared_steppers.scad>
include <vitamins/extrusions.scad>
include <vitamins/sk_brackets.scad>
include <vitamins/scs_bearing_blocks.scad>
include <vitamins/zipties.scad>
use <vitamins/jack.scad>
use <vitamins/meter.scad>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 766 KiB

After

Width:  |  Height:  |  Size: 786 KiB

View File

@@ -33,16 +33,18 @@ use <tests/components.scad>
use <tests/d_connectors.scad>
use <tests/displays.scad>
use <tests/extrusions.scad>
use <tests/extrusion_brackets.scad>
use <tests/fans.scad>
use <tests/fuseholder.scad>
use <tests/geared_steppers.scad>
use <tests/hot_ends.scad>
use <tests/iecs.scad>
use <tests/IECs.scad>
use <tests/inserts.scad>
use <tests/jack.scad>
use <tests/KP_pillow_blocks.scad>
use <tests/leadnuts.scad>
use <tests/leds.scad>
use <tests/ldrs.scad>
use <tests/LDRs.scad>
use <tests/LEDs.scad>
use <tests/light_strips.scad>
use <tests/linear_bearings.scad>
use <tests/meter.scad>
@@ -51,20 +53,22 @@ use <tests/modules.scad>
use <tests/nuts.scad>
use <tests/o_ring.scad>
use <tests/opengrab.scad>
use <tests/pcbs.scad>
use <tests/PCBs.scad>
use <tests/pillars.scad>
use <tests/psus.scad>
use <tests/PSUs.scad>
use <tests/pulleys.scad>
use <tests/rails.scad>
use <tests/ring_terminals.scad>
use <tests/rockers.scad>
use <tests/rod.scad>
use <tests/screws.scad>
use <tests/SCS_bearing_blocks.scad>
use <tests/sealing_strip.scad>
use <tests/sheets.scad>
use <tests/SK_brackets.scad>
use <tests/spades.scad>
use <tests/springs.scad>
use <tests/ssrs.scad>
use <tests/SSRs.scad>
use <tests/stepper_motors.scad>
use <tests/toggles.scad>
use <tests/transformers.scad>
@@ -83,18 +87,25 @@ use <tests/door_hinge.scad>
use <tests/door_latch.scad>
use <tests/fan_guard.scad>
use <tests/fixing_block.scad>
use <tests/flat_hinge.scad>
use <tests/foot.scad>
use <tests/handle.scad>
use <tests/PCB_mount.scad>
use <tests/printed_box.scad>
use <tests/ribbon_clamp.scad>
use <tests/screw_knob.scad>
use <tests/socket_box.scad>
use <tests/strap_handle.scad>
use <tests/ssr_shroud.scad>
use <tests/psu_shroud.scad>
use <tests/flat_hinge.scad>
use <tests/pcb_mount.scad>
use <tests/SSR_shroud.scad>
use <tests/PSU_shroud.scad>
x5 = 800;
x0 = 0;
x1 = x0 + 100;
x2 = x1 + 90;
x3 = x2 + 130;
x4 = x3 + 200;
x5 = 850;
x6 = x5 + 150;
cable_grommets_y = 0;
@@ -133,16 +144,20 @@ translate([x5 + 60, cable_grommets_y + 200])
translate([x5, cable_grommets_y + 250])
handle();
translate([900, 600])
translate([950, 600])
box_test();
translate([850, 1260])
translate([890, 730])
printed_boxes();
translate([850, 1300])
bbox_test();
x0 = 0;
inserts_y = 0;
nuts_y = inserts_y + 20;
washers_y = nuts_y + 100;
washers_y = nuts_y + 120;
screws_y = washers_y + 120;
o_rings_y = screws_y + 130;
springs_y = o_rings_y + 20;
@@ -204,10 +219,6 @@ translate([x0, linear_bearings_y]) {
rods();
}
translate([x0+150, linear_bearings_y+30]) {
extrusions();
}
translate([x0 + 10, hot_ends_y])
hot_ends();
@@ -236,7 +247,6 @@ translate([x0, psus_y]) {
psu_shrouds();
}
x1 = x0 + 100;
zipties_y = 0;
bulldogs_y = zipties_y + 40;
@@ -246,7 +256,6 @@ translate([x1, zipties_y])
translate([x1, bulldogs_y])
bulldogs();
x2 = x1 + 90;
leds_y = 0;
carriers_y = leds_y + 40;
spades_y = carriers_y + 40;
@@ -293,8 +302,6 @@ translate([x2, toggles_y])
translate([x2, components_y])
components();
x3 = x2 + 150;
veroboard_y = 0;
d_connectors_y = veroboard_y + 110;
iecs_y = d_connectors_y + 80;
@@ -303,6 +310,7 @@ ssrs_y = modules_y + 80;
blowers_y = ssrs_y + 60;
batteries_y = blowers_y + 100;
steppers_y = batteries_y + 70;
extrusions_y = steppers_y + 100;
translate([x3, veroboard_y])
veroboard_test();
@@ -343,16 +351,22 @@ translate([x3, batteries_y])
translate([x2, steppers_y]) // interloper
stepper_motors();
translate([x2, extrusions_y]) {
extrusions();
}
translate([x3, transformers_y])
transformers();
x4 = x3 + 220;
belts_y = 0;
rails_y = belts_y + 200;
cable_strips_y = rails_y + 300;
extrusion_brackets_y = rails_y + 250;
sk_brackets_y = extrusion_brackets_y + 80;
kp_pillow_blocks_y = sk_brackets_y + 50;
scs_bearing_blocks_y = kp_pillow_blocks_y + 60;
translate([x4 + 112, belts_y + 58]) {
translate([x4 + 150, belts_y + 58]) {
belt_test();
translate([0, 60])
@@ -362,9 +376,21 @@ translate([x4 + 112, belts_y + 58]) {
translate([x4, rails_y + 130])
rails();
translate([x4, cable_strips_y])
translate([900, fans_y + 50])
cable_strips();
x6 = x5 + 150;
translate([x4, kp_pillow_blocks_y])
kp_pillow_blocks();
translate([x4, sk_brackets_y])
sk_brackets();
translate([x4, extrusion_brackets_y])
extrusion_brackets();
translate([x4, scs_bearing_blocks_y])
scs_bearing_blocks();
translate([x6, 125])
light_strips();

View File

@@ -31,12 +31,11 @@
//!
//! Normally the side sheets are the same type but they can be overridden individually as long as the substitute has the same thickness.
//
include <../core.scad>
include <../utils/core/core.scad>
use <../vitamins/sheet.scad>
use <../vitamins/screw.scad>
use <../vitamins/washer.scad>
include <../vitamins/inserts.scad>
use <../vitamins/insert.scad>
use <../utils/quadrant.scad>
bezel_clearance = 0.2;

View File

@@ -21,7 +21,7 @@
//! Printed cable grommets for passing cables through panels avoiding sharp edges and in the case
//! of conductive panels, an extra layer of insulation.
//
include <../core.scad>
include <../utils/core/core.scad>
use <../vitamins/cable_strip.scad>
base = 1.25;

View File

@@ -22,7 +22,7 @@
//
$extrusion_width = 0.5;
include <../core.scad>
include <../utils/core/core.scad>
module ESP12F_carrier_stl() { //! Generate the STL for an ESP12 carrier
stl("ESP12F_carrier");

View File

@@ -31,8 +31,7 @@
//! Star washers can be omitted by setting ```star_washers``` to false.
//
include <../core.scad>
include <../vitamins/screws.scad>
include <../vitamins/inserts.scad>
use <../vitamins/insert.scad>
use <../utils/rounded_cylinder.scad>
use <../utils/maths.scad>

View File

@@ -24,7 +24,6 @@
//! Rubber door [sealing strip](#sealing_strip) is used to make it airtight and a [door_latch](#door_latch) holds it closed.
//
include <../core.scad>
include <../vitamins/screws.scad>
width = 18;
thickness = 4;
@@ -142,7 +141,7 @@ module door_hinge_assembly(top, door_thickness = 6) { //! The moving assembly th
translate([0, pin_y - (thickness + door_thickness / 2), dir * width / 2]) {
rotate([90, 0, 180])
color("red") door_hinge(door_thickness);
color(pp2_colour) door_hinge(door_thickness);
rotate([90, 0, 0])
door_hinge_hole_positions()
@@ -166,7 +165,7 @@ module door_hinge_static_assembly(top, sheet_thickness = 3) { //! The stationary
translate([pin_x, 0, -dir * (stat_width / 2 + washer_thickness(screw_washer(pin_screw)))])
rotate([90, 0, 0]) {
color("lime") door_hinge_stat_stl();
color(pp1_colour) door_hinge_stat_stl();
door_hinge_stat_hole_positions() {
screw_and_washer(stat_screw, stat_screw_length);

View File

@@ -22,7 +22,6 @@
//
include <../core.scad>
use <../utils/hanging_hole.scad>
include <../vitamins/screws.scad>
length = 35;
width = 12;
@@ -66,7 +65,7 @@ module door_latch_assembly(sheet_thickness = 3) { //! The assembly for a specifi
translate([0, -height - washer_thickness(washer)])
rotate([-90, 0, 0]) {
color("lime") render() door_latch_stl();
color(pp1_colour) render() door_latch_stl();
translate_z(nut_trap_depth)
vflip()

View File

@@ -31,8 +31,7 @@
//! Star washers can be omitted by setting ```star_washers``` to false.
//
include <../core.scad>
include <../vitamins/screws.scad>
include <../vitamins/inserts.scad>
use <../vitamins/insert.scad>
use <../utils/maths.scad>
def_screw = M3_cap_screw;

View File

@@ -30,7 +30,6 @@
//! This allows the hinges and one set of screws to belong to one assembly and the other set of screws to another assembly.
//
include <../core.scad>
include <../vitamins/screws.scad>
function hinge_width(type) = type[1]; //! Width
function hinge_depth(type) = type[2]; //! Depth of each leaf

View File

@@ -22,8 +22,7 @@
//! inserts don't grip well in rubber.
//
include <../core.scad>
include <../vitamins/screws.scad>
include <../vitamins/inserts.scad>
use <../vitamins/insert.scad>
foot = [25, 12, 3, 2, M4_cap_screw, 10];
insert_foot = [20, 10, 0, 2, M3_cap_screw, 10];

View File

@@ -21,8 +21,7 @@
//! Printed handle that can be printed without needing support material due to its truncated teardrop profile.
//
include <../core.scad>
include <../vitamins/screws.scad>
include <../vitamins/inserts.scad>
use <../vitamins/insert.scad>
dia = 18;
length = 90; // inside length

View File

@@ -22,7 +22,6 @@
//! The stl must be given a parameterless wrapper in the project that uses it.
//
include <../core.scad>
include <../vitamins/screws.scad>
use <../vitamins/pcb.scad>
clearance = 0.2;

229
printed/printed_box.scad Normal file
View File

@@ -0,0 +1,229 @@
//
// NopSCADlib Copyright Chris Palmer 2020
// nop.head@gmail.com
// hydraraptor.blogspot.com
//
// This file is part of NopSCADlib.
//
// NopSCADlib is free software: you can redistribute it and/or modify it under the terms of the
// GNU General Public License as published by the Free Software Foundation, either version 3 of
// the License, or (at your option) any later version.
//
// NopSCADlib is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
// without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
// See the GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License along with NopSCADlib.
// If not, see <https://www.gnu.org/licenses/>.
//
//
//! A fully parametric 3D printed case that can be customised with cutouts and additions specified by children.
//!
//! The walls can be made wavy, which possibly reduces warping when printing and looks nice, however if holes need to be made
//! in the sides you can't print a wavy bridge. Any holes need to be surrounded by a 45&deg; chamfer to make the bridges straight.
//! See the mounting points for the feet in the first example.
//!
//! It can also have printed feet on the base with the screws doubling up to hold the base on.
//
include <../core.scad>
use <../vitamins/insert.scad>
use <foot.scad>
function pbox_name(type) = type[0]; //! Name to allow more than one box in a project
function pbox_wall(type) = type[1]; //! Wall thickness
function pbox_top(type) = type[2]; //! Top thickness
function pbox_base(type) = type[3]; //! Base thickness, can be zero for no base
function pbox_foot(type) = type[4]; //! Printed foot, can be false to suppress feet
function pbox_base_screw(type) = type[5]; //! Screw type if no feet
function pbox_radius(type) = type[6]; //! Internal corner radius
function pbox_ridges(type) = type[7]; //! Ridge wavelength and amplitude
function pbox_width(type) = type[8]; //! Internal width
function pbox_depth(type) = type[9]; //! Internal depth
function pbox_height(type) = type[10]; //! Internal height
base_outset = 1; // How much the base overlaps the inner dimensions
base_overlap = 2; // The width of ledge the base sits on
height_overlap = 1; // How far the edges sit below the base
function pbox_inclusion(type) = pbox_base(type) ? base_overlap - base_outset : 0; //! How far the ledge for the base extends inwards
function pbox_total_height(type) = //! Total height including base overlap
let(base = pbox_base(type),
foot = pbox_foot(type),
washer = pbox_washer(type),
screw = pbox_screw(type))
pbox_height(type) + pbox_top(type) + base + (base ? height_overlap : 0) + (foot || !base ? 0 : washer_thickness(washer) + screw_head_height(screw));
function pbox_screw(type) = //! Foot screw if got feet else base_screw
let(foot = pbox_foot(type)) foot ? foot_screw(foot) : pbox_base_screw(type);
function pbox_insert(type) = screw_insert(pbox_screw(type)); //! The insert for the base screws
function pbox_washer(type) = screw_washer(pbox_screw(type)); //! The washer for the base screws
function pbox_screw_length(type, panel_thickness = 0) = //! Length of the base screw
let(foot = pbox_foot(type))
screw_shorter_than(pbox_base(type) + washer_thickness(pbox_washer(type))
+ insert_length(pbox_insert(type))
+ (foot ? foot_thickness(foot) : panel_thickness));
function pbox_mid_offset(type) = pbox_ridges(type).y + pbox_wall(type) / 2; // Offset to wall midpoint
function pbox_screw_inset(type) = //! How far the base screws are inset
let(foot = pbox_foot(type),
r = foot ? foot_diameter(foot) / 2 : washer_radius(pbox_washer(type)),
R = pbox_radius(type)
) max(r, R - (R - r) / sqrt(2));
module pbox_screw_positions(type) {
foot = pbox_foot(type);
inset = pbox_screw_inset(type);
for(x = [-1, 1], y = [-1, 1])
translate([x * (pbox_width(type) / 2 - inset), y * (pbox_depth(type) / 2 - inset)])
rotate((y > 0 ? -x * 45 : -x * 135) + 90)
children();
}
module pbox_mid_shape(type) {
ridges = pbox_ridges(type);
offset = ridges.y + pbox_wall(type) / 2;
rad = pbox_radius(type) + offset;
w = pbox_width(type) + 2 * offset;
d = pbox_depth(type) + 2 * offset;
module waves(length) {
l = length - 2 * rad;
waves = round(l / ridges.x);
points = 16;
translate([-l / 2, ridges.y / 2])
polygon(concat([[0, -10]], [for(i = [0 : waves * points], a = 360 * i / points) [i * l / waves / points, -cos(a) * ridges.y / 2] ], [[l, -10]]));
}
difference() {
rounded_square([w, d], rad, center = true);
if(ridges.y)
for(side = [-1, 1]) {
translate([0, side * d / 2])
rotate(90 + side * 90)
waves(w);
translate([side * w / 2, 0])
rotate(side * 90)
waves(d);
}
}
}
module pbox_inner_shape(type) {
rad = pbox_radius(type);
w = pbox_width(type);
d = pbox_depth(type);
rounded_square([w, d], rad, center = true);
}
module pbox_base(type) { //! Generate the STL for the base
stl(str(pbox_name(type),"_base"));
t = pbox_base(type);
difference() {
union() {
linear_extrude(height = t)
offset(base_outset - 0.2)
pbox_inner_shape(type);
if($children > 0)
children(0);
}
pbox_screw_positions(type)
poly_cylinder(r = screw_clearance_radius(pbox_screw(type)), h = 2 * t + eps, center = true);
if($children > 1)
children(1);
}
}
module pbox(type) { //! Generate the STL for the main case
stl(pbox_name(type));
height = pbox_height(type);
total_height = pbox_total_height(type);
top_thickness = pbox_top(type);
wall = pbox_wall(type);
ledge_outset = pbox_ridges(type).y;
ledge_inset = base_outset - base_overlap;
ledge_h = pbox_base(type) ? (ledge_outset - ledge_inset) * 2 : 0;
difference() {
union() {
linear_extrude(height = total_height)
offset(wall / 2) pbox_mid_shape(type);
if($children > 2)
children(2);
}
difference() {
translate_z(top_thickness)
union() {
linear_extrude(height = height + eps)
offset(-wall / 2) pbox_mid_shape(type);
translate_z(height) // Recess for the base
linear_extrude(height = total_height - height)
offset(base_outset)
pbox_inner_shape(type);
}
// Ledge to support the lid
if(ledge_h)
translate_z(top_thickness + height - ledge_h)
difference() {
rounded_rectangle([pbox_width(type) + 2 * outset, pbox_depth(type) + 2 * outset, ledge_h], 1, center = false);
hull() {
linear_extrude(height = ledge_h + eps)
offset(ledge_inset)
pbox_inner_shape(type);
linear_extrude(height = eps)
offset(ledge_outset)
pbox_inner_shape(type);
}
pbox_screw_positions(type)
insert_hole(pbox_insert(type));
}
// Corner lugs for inserts
outset = wall + pbox_ridges(type).y;
or = pbox_radius(type) + outset;
inset = pbox_screw_inset(type) + outset;
br = insert_boss_radius(pbox_insert(type), wall);
ext = sqrt(2) * inset - or * (sqrt(2) - 1) - br;
translate_z(height + top_thickness)
pbox_screw_positions(type)
insert_lug(pbox_insert(type), wall, counter_bore = 0, extension = ext, corner_r = or);
if($children > 0)
children(0);
}
if($children > 1)
children(1);
}
}
module pbox_inserts(type) //! Place the inserts for the base screws
translate_z(pbox_height(type) + pbox_top(type))
pbox_screw_positions(type)
insert(pbox_insert(type));
module pbox_base_screws(type, thickness = 0) //! Place the screws and feet
translate_z(pbox_height(type) + pbox_top(type) + pbox_base(type))
pbox_screw_positions(type) {
foot = pbox_foot(type);
if(foot)
color(pp4_colour)
foot(foot);
translate_z(foot ? foot_thickness(foot) : thickness)
screw_and_washer(pbox_screw(type), pbox_screw_length(type, thickness));
}

View File

@@ -22,8 +22,7 @@
//! The stl and assembly must be given a name and parameterless wrappers for the stl and assembly added to the project.
//
include <../core.scad>
include <../vitamins/screws.scad>
include <../vitamins/inserts.scad>
use <../vitamins/insert.scad>
use <../vitamins/wire.scad>
use <../vitamins/psu.scad>
@@ -144,7 +143,7 @@ module psu_shroud(type, cable_d, name, cables = 1) { //! Generate the STL file f
}
module psu_shroud_assembly(type, cable_d, name, cables = 1) //! The printed parts with inserts fitted
assembly(str("psu_shroud_", name)) {
assembly(str("PSU_shroud_", name)) {
translate_z(psu_shroud_height(type))
vflip()

View File

@@ -21,8 +21,7 @@
//! Clamp for ribbon cable and polypropylene strip.
//
include <../core.scad>
include <../vitamins/screws.scad>
include <../vitamins/inserts.scad>
use <../vitamins/insert.scad>
use <../vitamins/cable_strip.scad>
wall = 2;

View File

@@ -21,7 +21,6 @@
//! Knob with embedded hex head screw.
//
include <../core.scad>
include <../vitamins/screws.scad>
use <../utils/hanging_hole.scad>
knob_wall = 2;

View File

@@ -22,9 +22,8 @@
//
include <../core.scad>
include <../vitamins/mains_sockets.scad>
include <../vitamins/screws.scad>
include <../vitamins/inserts.scad>
include <../vitamins/ring_terminals.scad>
use <../vitamins/insert.scad>
box_height = 19;
base_thickness = 2;
@@ -93,7 +92,7 @@ assembly(str("socket_box_", type[0])) {
screw = mains_socket_screw(type);
insert = screw_insert(screw);
color("lime") render() socket_box(type);
color(pp1_colour) render() socket_box(type);
mains_socket_hole_positions(type)
translate_z(height)

View File

@@ -19,11 +19,10 @@
//
//! A cover to go over the mains end of an SSR to make it safe to be touched.
//! The stl and assembly must be given a name and parameterless wrappers for the stl and assembly added to the project.
//! The STL and assembly must be given a name and parameterless wrappers for the stl and assembly added to the project.
//
include <../core.scad>
include <../vitamins/screws.scad>
include <../vitamins/inserts.scad>
use <../vitamins/insert.scad>
use <../vitamins/wire.scad>
use <../vitamins/ssr.scad>
@@ -108,7 +107,7 @@ module ssr_shroud(type, cable_d, name) { //! Generate the STL file for a spec
}
module ssr_shroud_assembly(type, cable_d, name) //! The printed parts with inserts fitted
assembly(str("ssr_shroud_", name)) {
assembly(str("SSR_shroud_", name)) {
translate_z(ssr_shroud_height(type))
vflip()

View File

@@ -22,8 +22,7 @@
//! be fully customised by passing a list of properties.
//
include <../core.scad>
include <../vitamins/screws.scad>
include <../vitamins/inserts.scad>
use <../vitamins/insert.scad>
strap = [18, 2, M3_pan_screw, 3, 25];
function strap() = strap;

530
readme.md
View File

@@ -17,37 +17,29 @@ See [usage](docs/usage.md) for requirements, installation instructions and a usa
## Table of Contents<a name="top"/>
<table><tr>
<th align="left"> Vitamins A-M </th><th align="left"> Vitamins N-Z </th><th align="left"> Printed </th><th align="left"> Utilities </th><th align="left"> Core Utilities </th></tr>
<tr><td> <a href = "#Ball_bearings">Ball_bearings</a> </td><td> <a href = "#Nuts">Nuts</a> </td><td> <a href = "#Box">Box</a> </td><td> <a href = "#Annotation">Annotation</a> </td><td> <a href = "#Bom">Bom</a> </td></tr>
<tr><td> <a href = "#Batteries">Batteries</a> </td><td> <a href = "#O_ring">O_ring</a> </td><td> <a href = "#Butt_box">Butt_box</a> </td><td> <a href = "#Bezier">Bezier</a> </td><td> <a href = "#Clip">Clip</a> </td></tr>
<tr><td> <a href = "#Belts">Belts</a> </td><td> <a href = "#Opengrab">Opengrab</a> </td><td> <a href = "#Cable_grommets">Cable_grommets</a> </td><td> <a href = "#Dogbones">Dogbones</a> </td><td> <a href = "#Global">Global</a> </td></tr>
<tr><td> <a href = "#Blowers">Blowers</a> </td><td> <a href = "#Pcbs">Pcbs</a> </td><td> <a href = "#Carriers">Carriers</a> </td><td> <a href = "#Fillet">Fillet</a> </td><td> <a href = "#Polyholes">Polyholes</a> </td></tr>
<tr><td> <a href = "#Bulldogs">Bulldogs</a> </td><td> <a href = "#Pillars">Pillars</a> </td><td> <a href = "#Corner_block">Corner_block</a> </td><td> <a href = "#Hanging_hole">Hanging_hole</a> </td><td> <a href = "#Rounded_rectangle">Rounded_rectangle</a> </td></tr>
<tr><td> <a href = "#Buttons">Buttons</a> </td><td> <a href = "#Pin_headers">Pin_headers</a> </td><td> <a href = "#Door_hinge">Door_hinge</a> </td><td> <a href = "#Layout">Layout</a> </td><td> <a href = "#Sphere">Sphere</a> </td></tr>
<tr><td> <a href = "#Cable_strips">Cable_strips</a> </td><td> <a href = "#Psus">Psus</a> </td><td> <a href = "#Door_latch">Door_latch</a> </td><td> <a href = "#Maths">Maths</a> </td><td> <a href = "#Teardrops">Teardrops</a> </td></tr>
<tr><td> <a href = "#Components">Components</a> </td><td> <a href = "#Pulleys">Pulleys</a> </td><td> <a href = "#Fan_guard">Fan_guard</a> </td><td> <a href = "#Offset">Offset</a> </td><td></td></tr>
<tr><td> <a href = "#D_connectors">D_connectors</a> </td><td> <a href = "#Rails">Rails</a> </td><td> <a href = "#Fixing_block">Fixing_block</a> </td><td> <a href = "#Quadrant">Quadrant</a> </td><td></td></tr>
<tr><td> <a href = "#Displays">Displays</a> </td><td> <a href = "#Ring_terminals">Ring_terminals</a> </td><td> <a href = "#Flat_hinge">Flat_hinge</a> </td><td> <a href = "#Round">Round</a> </td><td></td></tr>
<tr><td> <a href = "#Extrusions">Extrusions</a> </td><td> <a href = "#Rockers">Rockers</a> </td><td> <a href = "#Foot">Foot</a> </td><td> <a href = "#Rounded_cylinder">Rounded_cylinder</a> </td><td></td></tr>
<tr><td> <a href = "#Fans">Fans</a> </td><td> <a href = "#Rod">Rod</a> </td><td> <a href = "#Handle">Handle</a> </td><td> <a href = "#Rounded_polygon">Rounded_polygon</a> </td><td></td></tr>
<tr><td> <a href = "#Fuseholder">Fuseholder</a> </td><td> <a href = "#Screws">Screws</a> </td><td> <a href = "#Pcb_mount">Pcb_mount</a> </td><td> <a href = "#Sector">Sector</a> </td><td></td></tr>
<tr><td> <a href = "#Geared_steppers">Geared_steppers</a> </td><td> <a href = "#Scs_bearing_blocks">Scs_bearing_blocks</a> </td><td> <a href = "#Psu_shroud">Psu_shroud</a> </td><td> <a href = "#Sweep">Sweep</a> </td><td></td></tr>
<tr><td> <a href = "#Green_terminals">Green_terminals</a> </td><td> <a href = "#Sealing_strip">Sealing_strip</a> </td><td> <a href = "#Ribbon_clamp">Ribbon_clamp</a> </td><td> <a href = "#Thread">Thread</a> </td><td></td></tr>
<tr><td> <a href = "#Hot_ends">Hot_ends</a> </td><td> <a href = "#Sheets">Sheets</a> </td><td> <a href = "#Screw_knob">Screw_knob</a> </td><td> <a href = "#Tube">Tube</a> </td><td></td></tr>
<tr><td> <a href = "#Hygrometer">Hygrometer</a> </td><td> <a href = "#Sk_brackets">Sk_brackets</a> </td><td> <a href = "#Socket_box">Socket_box</a> </td><td></td><td></td></tr>
<tr><td> <a href = "#Iecs">Iecs</a> </td><td> <a href = "#Spades">Spades</a> </td><td> <a href = "#Ssr_shroud">Ssr_shroud</a> </td><td></td><td></td></tr>
<tr><td> <a href = "#Inserts">Inserts</a> </td><td> <a href = "#Spools">Spools</a> </td><td> <a href = "#Strap_handle">Strap_handle</a> </td><td></td><td></td></tr>
<tr><td> <a href = "#Jack">Jack</a> </td><td> <a href = "#Springs">Springs</a> </td><td></td><td></td><td></td></tr>
<tr><td> <a href = "#Ldrs">Ldrs</a> </td><td> <a href = "#Ssrs">Ssrs</a> </td><td></td><td></td><td></td></tr>
<tr><td> <a href = "#Leadnuts">Leadnuts</a> </td><td> <a href = "#Stepper_motors">Stepper_motors</a> </td><td></td><td></td><td></td></tr>
<tr><td> <a href = "#Leds">Leds</a> </td><td> <a href = "#Toggles">Toggles</a> </td><td></td><td></td><td></td></tr>
<tr><td> <a href = "#Light_strips">Light_strips</a> </td><td> <a href = "#Transformers">Transformers</a> </td><td></td><td></td><td></td></tr>
<tr><td> <a href = "#Linear_bearings">Linear_bearings</a> </td><td> <a href = "#Tubings">Tubings</a> </td><td></td><td></td><td></td></tr>
<tr><td> <a href = "#Mains_sockets">Mains_sockets</a> </td><td> <a href = "#Variacs">Variacs</a> </td><td></td><td></td><td></td></tr>
<tr><td> <a href = "#Meter">Meter</a> </td><td> <a href = "#Veroboard">Veroboard</a> </td><td></td><td></td><td></td></tr>
<tr><td> <a href = "#Microswitches">Microswitches</a> </td><td> <a href = "#Washers">Washers</a> </td><td></td><td></td><td></td></tr>
<tr><td> <a href = "#Microview">Microview</a> </td><td> <a href = "#Wire">Wire</a> </td><td></td><td></td><td></td></tr>
<tr><td> <a href = "#Modules">Modules</a> </td><td> <a href = "#Zipties">Zipties</a> </td><td></td><td></td><td></td></tr>
<th align="left"> Vitamins A-J </th><th align="left"> Vitamins K-Q </th><th align="left"> Vitamins R-Z </th><th align="left"> Printed </th><th align="left"> Utilities </th><th align="left"> Core Utilities </th></tr>
<tr><td> <a href = "#Ball_bearings">Ball_bearings</a> </td><td> <a href = "#KP_pillow_blocks">KP_pillow_blocks</a> </td><td> <a href = "#Rails">Rails</a> </td><td> <a href = "#Box">Box</a> </td><td> <a href = "#Annotation">Annotation</a> </td><td> <a href = "#BOM">BOM</a> </td></tr>
<tr><td> <a href = "#Batteries">Batteries</a> </td><td> <a href = "#LDRs">LDRs</a> </td><td> <a href = "#Ring_terminals">Ring_terminals</a> </td><td> <a href = "#Butt_box">Butt_box</a> </td><td> <a href = "#Bezier">Bezier</a> </td><td> <a href = "#Clip">Clip</a> </td></tr>
<tr><td> <a href = "#Belts">Belts</a> </td><td> <a href = "#LEDs">LEDs</a> </td><td> <a href = "#Rockers">Rockers</a> </td><td> <a href = "#Cable_grommets">Cable_grommets</a> </td><td> <a href = "#Dogbones">Dogbones</a> </td><td> <a href = "#Global">Global</a> </td></tr>
<tr><td> <a href = "#Blowers">Blowers</a> </td><td> <a href = "#Leadnuts">Leadnuts</a> </td><td> <a href = "#Rod">Rod</a> </td><td> <a href = "#Carriers">Carriers</a> </td><td> <a href = "#Fillet">Fillet</a> </td><td> <a href = "#Polyholes">Polyholes</a> </td></tr>
<tr><td> <a href = "#Bulldogs">Bulldogs</a> </td><td> <a href = "#Light_strips">Light_strips</a> </td><td> <a href = "#SCS_bearing_blocks">SCS_bearing_blocks</a> </td><td> <a href = "#Corner_block">Corner_block</a> </td><td> <a href = "#Hanging_hole">Hanging_hole</a> </td><td> <a href = "#Rounded_rectangle">Rounded_rectangle</a> </td></tr>
<tr><td> <a href = "#Buttons">Buttons</a> </td><td> <a href = "#Linear_bearings">Linear_bearings</a> </td><td> <a href = "#SK_brackets">SK_brackets</a> </td><td> <a href = "#Door_hinge">Door_hinge</a> </td><td> <a href = "#Layout">Layout</a> </td><td> <a href = "#Sphere">Sphere</a> </td></tr>
<tr><td> <a href = "#Cable_strips">Cable_strips</a> </td><td> <a href = "#Mains_sockets">Mains_sockets</a> </td><td> <a href = "#SSRs">SSRs</a> </td><td> <a href = "#Door_latch">Door_latch</a> </td><td> <a href = "#Maths">Maths</a> </td><td> <a href = "#Teardrops">Teardrops</a> </td></tr>
<tr><td> <a href = "#Components">Components</a> </td><td> <a href = "#Meter">Meter</a> </td><td> <a href = "#Screws">Screws</a> </td><td> <a href = "#Fan_guard">Fan_guard</a> </td><td> <a href = "#Offset">Offset</a> </td><td></td></tr>
<tr><td> <a href = "#D_connectors">D_connectors</a> </td><td> <a href = "#Microswitches">Microswitches</a> </td><td> <a href = "#Sealing_strip">Sealing_strip</a> </td><td> <a href = "#Fixing_block">Fixing_block</a> </td><td> <a href = "#Quadrant">Quadrant</a> </td><td></td></tr>
<tr><td> <a href = "#Displays">Displays</a> </td><td> <a href = "#Microview">Microview</a> </td><td> <a href = "#Sheets">Sheets</a> </td><td> <a href = "#Flat_hinge">Flat_hinge</a> </td><td> <a href = "#Round">Round</a> </td><td></td></tr>
<tr><td> <a href = "#Extrusion_brackets">Extrusion_brackets</a> </td><td> <a href = "#Modules">Modules</a> </td><td> <a href = "#Spades">Spades</a> </td><td> <a href = "#Foot">Foot</a> </td><td> <a href = "#Rounded_cylinder">Rounded_cylinder</a> </td><td></td></tr>
<tr><td> <a href = "#Extrusions">Extrusions</a> </td><td> <a href = "#Nuts">Nuts</a> </td><td> <a href = "#Spools">Spools</a> </td><td> <a href = "#Handle">Handle</a> </td><td> <a href = "#Rounded_polygon">Rounded_polygon</a> </td><td></td></tr>
<tr><td> <a href = "#Fans">Fans</a> </td><td> <a href = "#O_ring">O_ring</a> </td><td> <a href = "#Springs">Springs</a> </td><td> <a href = "#PCB_mount">PCB_mount</a> </td><td> <a href = "#Sector">Sector</a> </td><td></td></tr>
<tr><td> <a href = "#Fuseholder">Fuseholder</a> </td><td> <a href = "#Opengrab">Opengrab</a> </td><td> <a href = "#Stepper_motors">Stepper_motors</a> </td><td> <a href = "#PSU_shroud">PSU_shroud</a> </td><td> <a href = "#Sweep">Sweep</a> </td><td></td></tr>
<tr><td> <a href = "#Geared_steppers">Geared_steppers</a> </td><td> <a href = "#PCB">PCB</a> </td><td> <a href = "#Toggles">Toggles</a> </td><td> <a href = "#Printed_box">Printed_box</a> </td><td> <a href = "#Thread">Thread</a> </td><td></td></tr>
<tr><td> <a href = "#Green_terminals">Green_terminals</a> </td><td> <a href = "#PCBs">PCBs</a> </td><td> <a href = "#Transformers">Transformers</a> </td><td> <a href = "#Ribbon_clamp">Ribbon_clamp</a> </td><td> <a href = "#Tube">Tube</a> </td><td></td></tr>
<tr><td> <a href = "#Hot_ends">Hot_ends</a> </td><td> <a href = "#PSUs">PSUs</a> </td><td> <a href = "#Tubings">Tubings</a> </td><td> <a href = "#SSR_shroud">SSR_shroud</a> </td><td></td><td></td></tr>
<tr><td> <a href = "#Hygrometer">Hygrometer</a> </td><td> <a href = "#Pillars">Pillars</a> </td><td> <a href = "#Variacs">Variacs</a> </td><td> <a href = "#Screw_knob">Screw_knob</a> </td><td></td><td></td></tr>
<tr><td> <a href = "#IECs">IECs</a> </td><td> <a href = "#Pin_headers">Pin_headers</a> </td><td> <a href = "#Veroboard">Veroboard</a> </td><td> <a href = "#Socket_box">Socket_box</a> </td><td></td><td></td></tr>
<tr><td> <a href = "#Inserts">Inserts</a> </td><td> <a href = "#Pulleys">Pulleys</a> </td><td> <a href = "#Washers">Washers</a> </td><td> <a href = "#Strap_handle">Strap_handle</a> </td><td></td><td></td></tr>
<tr><td> <a href = "#Jack">Jack</a> </td><td></td><td> <a href = "#Wire">Wire</a> </td><td></td><td></td><td></td></tr>
<tr><td></td><td></td><td> <a href = "#Zipties">Zipties</a> </td><td></td><td></td><td></td></tr>
</table>
---
@@ -93,8 +85,10 @@ Also single bearing balls are modelled as just a silver sphere and a BOM entry.
| Qty | Module call | BOM entry |
| ---:|:--- |:---|
| 1 | ```ball_bearing(BB608)``` | Ball bearing 608-2RS 8mm x 22mm x 7mm |
| 1 | ```ball_bearing(BB6200)``` | Ball bearing 6200-2RS 10mm x 30mm x 9mm |
| 1 | ```ball_bearing(BB6201)``` | Ball bearing 6201-2RS 12mm x 32mm x 10mm |
| 1 | ```ball_bearing(BB624)``` | Ball bearing 624-2RS 4mm x 13mm x 5mm |
| 2 | ``` bearing_ball(3)``` | Steel ball 3mm |
| 4 | ``` bearing_ball(3)``` | Steel ball 3mm |
<a href="#top">Top</a>
@@ -586,6 +580,54 @@ LCD dispays.
| 1 | ```display(SSD1963_4p3)``` | LCD display SSD1963 4.3" |
<a href="#top">Top</a>
---
<a name="Extrusion_brackets"></a>
## Extrusion_brackets
Brackets for joining extrusions at a corner.
[vitamins/extrusion_brackets.scad](vitamins/extrusion_brackets.scad) Object definitions.
[vitamins/extrusion_bracket.scad](vitamins/extrusion_bracket.scad) Implementation.
[tests/extrusion_brackets.scad](tests/extrusion_brackets.scad) Code for this example.
### Properties
| Function | Description |
|:--- |:--- |
| ```extrusion_corner_bracket_base_thickness(type)``` | Thickness of base of bracket |
| ```extrusion_corner_bracket_hole_offset(type)``` | Hole offset from corner |
| ```extrusion_corner_bracket_side_thickness(type)``` | Thickness of side of bracket |
| ```extrusion_corner_bracket_size(type)``` | Size of bracket |
| ```extrusion_inner_corner_bracket_size(type)``` | Size of inner bracket |
### Modules
| Module | Description |
|:--- |:--- |
| ```extrusion_corner_bracket(type)``` | Corner bracket for extrusion |
| ```extrusion_corner_bracket_assembly(type, part_thickness = 2, screw_type = M4_cap_screw, nut_type = M4_sliding_t_nut, max_screw_depth = 6)``` | Assembly with fasteners in place |
| ```extrusion_corner_bracket_hole_positions(type)``` | Place children at hole positions |
| ```extrusion_inner_corner_bracket(type, grub_screws = true)``` | Inner corner bracket for extrusion |
![extrusion_brackets](tests/png/extrusion_brackets.png)
### Vitamins
| Qty | Module call | BOM entry |
| ---:|:--- |:---|
| 1 | ```extrusion(E2020, 20)``` | Extrusion E2020 x 20mm |
| 1 | ```extrusion(E2020, 30)``` | Extrusion E2020 x 30mm |
| 1 | ```extrusion(E2020, 40)``` | Extrusion E2020 x 40mm |
| 1 | ```extrusion(E2020, 50)``` | Extrusion E2020 x 50mm |
| 2 | ```extrusion_corner_bracket(E20_corner_bracket)``` | Extrusion corner bracket 20 |
| 2 | ```extrusion_inner_corner_bracket(E20_inner_corner_bracket, true)``` | Extrusion inner corner bracket 4.5 |
| 1 | ```extrusion_inner_corner_bracket(E20_inner_corner_bracket, false)``` | Extrusion inner corner bracket 4.5 |
| 4 | ```sliding_t_nut(M4_sliding_t_nut)``` | Nut M4 sliding T |
| 4 | ```screw(M4_cap_screw, 8)``` | Screw M4 cap x 8mm |
| 4 | ```washer(M4_washer)``` | Washer M4 x 9mm x 0.8mm |
<a href="#top">Top</a>
---
@@ -617,21 +659,22 @@ Aluminium extrusion.
### Modules
| Module | Description |
|:--- |:--- |
| ```extrusion(type, length, cornerHole = false)``` | Draw the specified extrusion |
| ```extrusion(type, length, center = true, cornerHole = false)``` | Draw the specified extrusion |
![extrusions](tests/png/extrusions.png)
### Vitamins
| Qty | Module call | BOM entry |
| ---:|:--- |:---|
| 1 | ```extrusion(E1515, 80)``` | Extrusion E1515 x 80mm |
| 1 | ```extrusion(E2020, 80)``` | Extrusion E2020 x 80mm |
| 1 | ```extrusion(E2040, 80)``` | Extrusion E2040 x 80mm |
| 1 | ```extrusion(E2060, 80)``` | Extrusion E2060 x 80mm |
| 1 | ```extrusion(E2080, 80)``` | Extrusion E2080 x 80mm |
| 1 | ```extrusion(E3030, 80)``` | Extrusion E3030 x 80mm |
| 1 | ```extrusion(E3060, 80)``` | Extrusion E3060 x 80mm |
| 1 | ```extrusion(E4040, 80)``` | Extrusion E4040 x 80mm |
| 1 | ```extrusion(E4080, 80)``` | Extrusion E4080 x 80mm |
| 1 | ```extrusion(E3030, 80, cornerHole = true)``` | Extrusion E3030 x 80mm |
| 1 | ```extrusion(E3060, 80, cornerHole = true)``` | Extrusion E3060 x 80mm |
| 1 | ```extrusion(E4040, 80, cornerHole = true)``` | Extrusion E4040 x 80mm |
| 1 | ```extrusion(E4080, 80, cornerHole = true)``` | Extrusion E4080 x 80mm |
<a href="#top">Top</a>
@@ -824,7 +867,6 @@ Parametric green terminal blocks
| Module | Description |
|:--- |:--- |
| ```green_terminal(type, ways, skip = [], colour = "lime")``` | Draw green terminal blocks, skip can be used to remove pins. |
| ```terminal_254(ways, skip = [])``` | Draw 0.1" terminal block |
![green_terminals](tests/png/green_terminals.png)
@@ -934,8 +976,8 @@ Mini LCD Celsius Digital Thermometer Hygrometer Temperature Humidity Meter Gauge
<a href="#top">Top</a>
---
<a name="Iecs"></a>
## Iecs
<a name="IECs"></a>
## IECs
IEC mains inlets and outlet.
@@ -943,7 +985,7 @@ IEC mains inlets and outlet.
[vitamins/iec.scad](vitamins/iec.scad) Implementation.
[tests/iecs.scad](tests/iecs.scad) Code for this example.
[tests/IECs.scad](tests/IECs.scad) Code for this example.
### Properties
| Function | Description |
@@ -1090,8 +1132,61 @@ E.g. a "brown" socket for mains live needs to be displayed as "sienna" to look r
<a href="#top">Top</a>
---
<a name="Ldrs"></a>
## Ldrs
<a name="KP_pillow_blocks"></a>
## KP_pillow_blocks
KP pillow block bearings
[vitamins/kp_pillow_blocks.scad](vitamins/kp_pillow_blocks.scad) Object definitions.
[vitamins/kp_pillow_block.scad](vitamins/kp_pillow_block.scad) Implementation.
[tests/KP_pillow_blocks.scad](tests/KP_pillow_blocks.scad) Code for this example.
### Properties
| Function | Description |
|:--- |:--- |
| ```kp_base_height(type)``` | Height of base containing the bolts |
| ```kp_diameter(type)``` | Rod hole diameter |
| ```kp_hole_offset(type)``` | Rod hole offset |
| ```kp_screw_separation(type)``` | Separation of bolts in the base |
### Functions
| Function | Description |
|:--- |:--- |
| ```kp_size(type)``` | Size of bracket |
### Modules
| Module | Description |
|:--- |:--- |
| ```kp_pillow_block(type)``` | Draw the KP pillow block |
| ```kp_pillow_block_assembly(type, part_thickness = 2, screw_type = M5_cap_screw, nut_type = undef)``` | Assembly with fasteners in place |
| ```kp_pillow_block_hole_positions(type)``` | Place children at hole positions |
![kp_pillow_blocks](tests/png/kp_pillow_blocks.png)
### Vitamins
| Qty | Module call | BOM entry |
| ---:|:--- |:---|
| 1 | ```kp_pillow_block(KP000)``` | KP000 pillow block |
| 1 | ```kp_pillow_block(KP001)``` | KP001 pillow block |
| 1 | ```kp_pillow_block(KP08_15)``` | KP08_15 pillow block |
| 1 | ```kp_pillow_block(KP08_18)``` | KP08_18 pillow block |
| 2 | ```sliding_t_nut(M4_hammer_nut)``` | Nut M4 hammer |
| 2 | ```sliding_t_nut(M4_sliding_t_nut)``` | Nut M4 sliding T |
| 2 | ```sliding_t_nut(M5_sliding_t_nut)``` | Nut M5 sliding T |
| 2 | ```nut(M5_nut, nyloc = undef)``` | Nut M5 x 4mm |
| 4 | ```screw(M4_cap_screw, 10)``` | Screw M4 cap x 10mm |
| 4 | ```screw(M5_cap_screw, 12)``` | Screw M5 cap x 12mm |
| 4 | ```washer(M4_washer)``` | Washer M4 x 9mm x 0.8mm |
| 6 | ```washer(M5_washer)``` | Washer M5 x 10mm x 1mm |
<a href="#top">Top</a>
---
<a name="LDRs"></a>
## LDRs
Light dependent resistors.
Larger ones seem to have both a higher dark resistance and a lower bright light resistance.
@@ -1101,7 +1196,7 @@ Larger ones seem to have both a higher dark resistance and a lower bright light
[vitamins/ldr.scad](vitamins/ldr.scad) Implementation.
[tests/ldrs.scad](tests/ldrs.scad) Code for this example.
[tests/LDRs.scad](tests/LDRs.scad) Code for this example.
### Properties
| Function | Description |
@@ -1181,8 +1276,8 @@ Nuts for leadscrews.
<a href="#top">Top</a>
---
<a name="Leds"></a>
## Leds
<a name="LEDs"></a>
## LEDs
Standard domed through hole LEDs. Can specify colour and lead length.
@@ -1190,7 +1285,7 @@ Standard domed through hole LEDs. Can specify colour and lead length.
[vitamins/led.scad](vitamins/led.scad) Implementation.
[tests/leds.scad](tests/leds.scad) Code for this example.
[tests/LEDs.scad](tests/LEDs.scad) Code for this example.
### Properties
| Function | Description |
@@ -1594,6 +1689,9 @@ If a nut is given a child then it gets placed on its top surface.
|:--- |:--- |
| ```nut_radius(type)``` | Radius across the corners |
| ```nut_size(type)``` | Diameter of the corresponding screw |
| ```nut_square_size(type)``` | Diameter of the corresponding screw |
| ```nut_square_thickness(type)``` | Thickness of the square nut |
| ```nut_square_width(type)``` | Width of the square nut |
| ```nut_trap_depth(type)``` | Depth of nut trap |
| ```nut_washer(type)``` | Corresponding washer |
@@ -1610,6 +1708,7 @@ If a nut is given a child then it gets placed on its top surface.
|:--- |:--- |
| ```nut(type, nyloc = false, brass = false, nylon = false)``` | Draw specified nut |
| ```nut_and_washer(type, nyloc)``` | Draw nut with corresponding washer |
| ```nut_square(type, brass = false, nylon = false)``` | Draw specified square nut |
| ```nut_trap(screw, nut, depth = 0, horizontal = false, supported = false, h = 200)``` | Make a nut trap |
| ```wingnut(type)``` | Draw a wingnut |
@@ -1623,23 +1722,28 @@ If a nut is given a child then it gets placed on its top surface.
| 1 | ```nut(M2p5_nut)``` | Nut M2.5 x 2.2mm |
| 1 | ```nut(M2p5_nut, nyloc = true)``` | Nut M2.5 x 2.2mm nyloc |
| 1 | ```nut(M2p5_nut, nylon = true)``` | Nut M2.5 x 2.2mm nylon |
| 1 | ```hammer_nut(M3_hammer_nut)``` | Nut M3 hammer |
| 1 | ```sliding_t_nut(M3_hammer_nut)``` | Nut M3 hammer |
| 1 | ```sliding_t_nut(M3_sliding_t_nut)``` | Nut M3 sliding T |
| 1 | ```nut(M3_nut)``` | Nut M3 x 2.4mm |
| 1 | ```nut(M3_nut, brass = true)``` | Nut M3 x 2.4mm brass |
| 1 | ```nut(M3_nut, nyloc = true)``` | Nut M3 x 2.4mm nyloc |
| 1 | ```hammer_nut(M4_hammer_nut)``` | Nut M4 hammer |
| 1 | ```nut(M3nS_thin_nut)``` | Nut M3nS 5.5 x 1.8mm |
| 1 | ```sliding_t_nut(M4_hammer_nut)``` | Nut M4 hammer |
| 1 | ```sliding_t_nut(M4_sliding_t_nut)``` | Nut M4 sliding T |
| 1 | ```nut(M4_nut)``` | Nut M4 x 3.2mm |
| 1 | ```nut(M4_nut, nyloc = true)``` | Nut M4 x 3.2mm nyloc |
| 1 | ```nut(M4nS_thin_nut)``` | Nut M4nS 7 x 2.2mm |
| 1 | ```sliding_t_nut(M5_sliding_t_nut)``` | Nut M5 sliding T |
| 1 | ```nut(M5_nut)``` | Nut M5 x 4mm |
| 1 | ```nut(M5_nut, nyloc = true)``` | Nut M5 x 4mm nyloc |
| 1 | ```nut(M5nS_thin_nut)``` | Nut M5nS 8 x 2.7mm |
| 1 | ```nut(M6_half_nut)``` | Nut M6 x 3mm |
| 1 | ```nut(M6_nut)``` | Nut M6 x 5mm |
| 1 | ```nut(M6_nut, nyloc = true)``` | Nut M6 x 5mm nyloc |
| 1 | ```nut(M6nS_thin_nut)``` | Nut M6nS 10 x 3.2mm |
| 1 | ```nut(M8_nut)``` | Nut M8 x 6.5mm |
| 1 | ```nut(M8_nut, nyloc = true)``` | Nut M8 x 6.5mm nyloc |
| 1 | ```nut(M8nS_thin_nut)``` | Nut M8nS 13 x 4mm |
| 1 | ```washer(M6_washer)``` | Washer M6 x 12.5mm x 1.5mm |
| 1 | ```wingnut(M4_wingnut)``` | Wingnut M4 |
@@ -1712,16 +1816,14 @@ A permanent magnet that can be magnatized and de-magnatized electronically.
<a href="#top">Top</a>
---
<a name="Pcbs"></a>
## Pcbs
<a name="PCB"></a>
## PCB
PCBs and perfboard with optional components. The shape can be a rectangle with optionally rounded corners or a polygon for odd shapes like Arduino.
[vitamins/pcbs.scad](vitamins/pcbs.scad) Object definitions.
[vitamins/pcb.scad](vitamins/pcb.scad) Implementation.
[tests/pcbs.scad](tests/pcbs.scad) Code for this example.
[tests/PCB.scad](tests/PCB.scad) Code for this example.
### Properties
| Function | Description |
@@ -1778,8 +1880,93 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
| ```pcb_screw_positions(type)``` | Positions children at the mounting hole positions |
| ```pcb_spacer(screw, height, wall = 1.8, taper = 0)``` | Generate STL for PCB spacer |
| ```rj45(cutout = false)``` | Draw RJ45 Ethernet connector |
| ```terminal_35(ways)``` | Draw 3.5mm terminal block |
| ```terminal_35(ways, colour = "blue")``` | Draw 3.5mm terminal block |
| ```uSD(size, cutout = false)``` | Draw uSD socket |
| ```usb_Ax1(cutout = false)``` | Draw USB type A single socket |
| ```usb_Ax2(cutout = false)``` | Draw USB type A dual socket |
| ```usb_B(cutout = false)``` | Draw USB B connector |
| ```usb_uA(cutout = false)``` | Draw USB micro A connector |
![pcb](tests/png/pcb.png)
### Vitamins
| Qty | Module call | BOM entry |
| ---:|:--- |:---|
| 1 | ```pcb(TestPCB)``` | Test PCB |
<a href="#top">Top</a>
---
<a name="PCBs"></a>
## PCBs
PCBs and perfboard with optional components. The shape can be a rectangle with optionally rounded corners or a polygon for odd shapes like Arduino.
[vitamins/pcbs.scad](vitamins/pcbs.scad) Object definitions.
[vitamins/pcb.scad](vitamins/pcb.scad) Implementation.
[tests/PCBs.scad](tests/PCBs.scad) Code for this example.
### Properties
| Function | Description |
|:--- |:--- |
| ```hdmi_depth(type)``` | Front to back depth |
| ```hdmi_height(type)``` | Outside height above the PCB |
| ```hdmi_height1(type)``` | Inside height at the sides |
| ```hdmi_height2(type)``` | Inside height in the middle |
| ```hdmi_thickness(type)``` | Wall thickness of the metal |
| ```hdmi_width1(type)``` | Inside width at the top |
| ```hdmi_width2(type)``` | Inside width at the bottom |
| ```pcb_accessories(type)``` | List of accessories to go on the BOM, SD cards, USB cables, etc. |
| ```pcb_colour(type)``` | Colour of the subtrate |
| ```pcb_components(type)``` | List of components |
| ```pcb_grid(type)``` | Grid if a perfboard |
| ```pcb_hole_d(type)``` | Mounting hole diameter |
| ```pcb_holes(type)``` | List of hole positions |
| ```pcb_land_d(type)``` | Pad around mounting hole |
| ```pcb_length(type)``` | Length |
| ```pcb_name(type)``` | Description |
| ```pcb_parts_on_bom(type)``` | True if the parts should be separate BOM items |
| ```pcb_polygon(type)``` | Optional outline polygon for odd shaped boards |
| ```pcb_radius(type)``` | Corner radius |
| ```pcb_thickness(type)``` | Thickness |
| ```pcb_width(type)``` | Width |
### Functions
| Function | Description |
|:--- |:--- |
| ```pcb_component_position(type, name, index = 0)``` | Return x y position of specified component |
| ```pcb_coord(type, p)``` | Convert offsets from the edge to coordinates relative to the centre |
| ```pcb_grid_pos(type, x, y, z = 0)``` | Returns a pcb grid position |
| ```pcb_screw(type, cap = hs_cap)``` | Mounting screw type |
### Modules
| Module | Description |
|:--- |:--- |
| ```barrel_jack(cutout = false)``` | Draw barrel power jack |
| ```buzzer(height, diameter, colour)``` | Draw PCB buzzer with specified height, diameter and color |
| ```chip(length, width, thickness, colour, cutout = false)``` | Draw a coloured cube to represent a chip, or other rectangular component |
| ```flat_flex(cutout = false)``` | Draw flat flexistrip connector as used on RPI0 |
| ```flex(cutout = false)``` | Draw flexistrip connector |
| ```hdmi(type, cutout = false)``` | Draw HDMI socket |
| ```jack(cutout = false)``` | Draw 3.5mm jack |
| ```molex_254(ways)``` | Draw molex header |
| ```pcb(type)``` | Draw specified PCB |
| ```pcb_assembly(type, height, thickness)``` | Draw PCB assembly with spaces and fasteners in place |
| ```pcb_base(type, height, thickness, wall = 2)``` | Generate STL for a base with PCB spacers |
| ```pcb_component(comp, cutouts = false, angle = undef)``` | Draw pcb component from description |
| ```pcb_component_position(type, name)``` | Position child at the specified component position |
| ```pcb_components(type, cutouts = false, angle = undef)``` | Draw list of PCB components on the PCB |
| ```pcb_cutouts(type, angle = undef)``` | Make cut outs to clear components on a PCB |
| ```pcb_grid(type, x, y, z = 0)``` | Positions children at specified grid position |
| ```pcb_screw_positions(type)``` | Positions children at the mounting hole positions |
| ```pcb_spacer(screw, height, wall = 1.8, taper = 0)``` | Generate STL for PCB spacer |
| ```rj45(cutout = false)``` | Draw RJ45 Ethernet connector |
| ```terminal_35(ways, colour = "blue")``` | Draw 3.5mm terminal block |
| ```uSD(size, cutout = false)``` | Draw uSD socket |
| ```usb_Ax1(cutout = false)``` | Draw USB type A single socket |
| ```usb_Ax2(cutout = false)``` | Draw USB type A dual socket |
| ```usb_B(cutout = false)``` | Draw USB B connector |
| ```usb_uA(cutout = false)``` | Draw USB micro A connector |
@@ -1804,7 +1991,7 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
| 1 | ```molex_254(2)``` | Molex KK header 2 way |
| 1 | ```molex_254(3)``` | Molex KK header 3 way |
| 16 | ```nut(M2_nut, nyloc = true)``` | Nut M2 x 1.6mm nyloc |
| 32 | ```nut(M2p5_nut, nyloc = true)``` | Nut M2.5 x 2.2mm nyloc |
| 30 | ```nut(M2p5_nut, nyloc = true)``` | Nut M2.5 x 2.2mm nyloc |
| 12 | ```nut(M3_nut, nyloc = true)``` | Nut M3 x 2.4mm nyloc |
| 12 | ```nut(M4_nut, nyloc = true)``` | Nut M4 x 3.2mm nyloc |
| 1 | ```pcb(PI_IO)``` | PI_IO V2 |
@@ -1819,21 +2006,19 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
| 1 | ```pcb(RPI3)``` | Raspberry Pi 3 |
| 1 | ```pcb(RPI0)``` | Raspberry Pi Zero |
| 16 | ```screw(M2_cap_screw, 25)``` | Screw M2 cap x 25mm |
| 4 | ```screw(M2p5_cap_screw, 16)``` | Screw M2.5 cap x 16mm |
| 8 | ```screw(M2p5_cap_screw, 20)``` | Screw M2.5 cap x 20mm |
| 4 | ```screw(M2p5_cap_screw, 35)``` | Screw M2.5 cap x 35mm |
| 8 | ```screw(M2p5_pan_screw, 20)``` | Screw M2.5 pan x 20mm |
| 4 | ```screw(M2p5_pan_screw, 25)``` | Screw M2.5 pan x 25mm |
| 2 | ```screw(M2p5_cap_screw, 16)``` | Screw M2.5 cap x 16mm |
| 12 | ```screw(M2p5_cap_screw, 20)``` | Screw M2.5 cap x 20mm |
| 4 | ```screw(M2p5_pan_screw, 20)``` | Screw M2.5 pan x 20mm |
| 8 | ```screw(M2p5_pan_screw, 25)``` | Screw M2.5 pan x 25mm |
| 4 | ```screw(M2p5_pan_screw, 35)``` | Screw M2.5 pan x 35mm |
| 8 | ```screw(M3_cap_screw, 30)``` | Screw M3 cap x 30mm |
| 4 | ```screw(M3_cap_screw, 35)``` | Screw M3 cap x 35mm |
| 4 | ```screw(M4_cap_screw, 30)``` | Screw M4 cap x 30mm |
| 8 | ```screw(M4_cap_screw, 35)``` | Screw M4 cap x 35mm |
| 12 | ```screw(M4_cap_screw, 35)``` | Screw M4 cap x 35mm |
| 3 | ```terminal_35(2)``` | Terminal block 2 way 3.5mm |
| 2 | ```green_terminal(gt_2p54, 4)``` | Terminal block 4 way 0.1" |
| 1 | | USB A to Mini B lead |
| 16 | ```washer(M2_washer)``` | Washer M2 x 5mm x 0.3mm |
| 32 | ```washer(M2p5_washer)``` | Washer M2.5 x 5.9mm x 0.5mm |
| 30 | ```washer(M2p5_washer)``` | Washer M2.5 x 5.9mm x 0.5mm |
| 12 | ```washer(M3_washer)``` | Washer M3 x 7mm x 0.5mm |
| 12 | ```washer(M4_washer)``` | Washer M4 x 9mm x 0.8mm |
| 1 | ```pcb(ZC_A0591)``` | ZC-A0591 ULN2003 driver PCB |
@@ -1841,24 +2026,24 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
### Printed
| Qty | Filename |
| ---:|:--- |
| 4 | pcb_spacer20130.stl |
| 4 | pcb_spacer20140.stl |
| 4 | pcb_spacer20150.stl |
| 4 | pcb_spacer20160.stl |
| 4 | pcb_spacer25100_2.stl |
| 4 | pcb_spacer20170.stl |
| 4 | pcb_spacer25100.stl |
| 4 | pcb_spacer25110_2.stl |
| 4 | pcb_spacer25120_2.stl |
| 4 | pcb_spacer25230.stl |
| 4 | pcb_spacer25130_2.stl |
| 4 | pcb_spacer25240.stl |
| 4 | pcb_spacer2570.stl |
| 2 | pcb_spacer2550.stl |
| 4 | pcb_spacer2580.stl |
| 4 | pcb_spacer2590.stl |
| 4 | pcb_spacer30170.stl |
| 4 | pcb_spacer30180.stl |
| 4 | pcb_spacer30220.stl |
| 4 | pcb_spacer40190.stl |
| 4 | pcb_spacer30190.stl |
| 4 | pcb_spacer30230.stl |
| 4 | pcb_spacer40200.stl |
| 4 | pcb_spacer40210.stl |
| 4 | pcb_spacer40220.stl |
<a href="#top">Top</a>
@@ -1941,8 +2126,8 @@ Pin headers and sockets, etc.
| ```idc_transition(type, cols = 5, skip = [], cutout = false)``` | Draw IDC transition header |
| ```jst_xh_header(type, pin_count, right_angle=false, colour, pin_colour)``` | Draw JST XH connector |
| ```pin(type, length = undef)``` | Draw a header pin |
| ```pin_header(type, cols = 1, rows = 1, smt = false, right_angle = false, cutout = false)``` | Draw pin header |
| ```pin_socket(type, cols = 1, rows = 1, right_angle = false, height = 0, smt = false, cutout = false)``` | Draw pin socket |
| ```pin_header(type, cols = 1, rows = 1, smt = false, right_angle = false, cutout = false, colour)``` | Draw pin header |
| ```pin_socket(type, cols = 1, rows = 1, right_angle = false, height = 0, smt = false, cutout = false, colour)``` | Draw pin socket |
![pin_headers](tests/png/pin_headers.png)
@@ -1960,8 +2145,8 @@ Pin headers and sockets, etc.
<a href="#top">Top</a>
---
<a name="Psus"></a>
## Psus
<a name="PSUs"></a>
## PSUs
Powersupplies. Can be a simple cube or can be defined by a list of six faces, each with thickness, holes, cutouts, etc.
Face order is bottom, top, left, right, front, back.
@@ -1971,7 +2156,7 @@ Face order is bottom, top, left, right, front, back.
[vitamins/psu.scad](vitamins/psu.scad) Implementation.
[tests/psus.scad](tests/psus.scad) Code for this example.
[tests/PSUs.scad](tests/PSUs.scad) Code for this example.
### Properties
| Function | Description |
@@ -1985,6 +2170,7 @@ Face order is bottom, top, left, right, front, back.
| ```psu_face_iec(type)``` | IEC connector x,y, rotation and type |
| ```psu_face_switch(type)``` | Rocker switch x,y, rotation and type |
| ```psu_face_thickness(type)``` | The thickness |
| ```psu_face_vents(type)``` | Vents array position x,y, rotation, size and corner radius |
| ```psu_faces(type)``` | List of face descriptions |
| ```psu_height(type)``` | Height |
| ```psu_left_bay(type)``` | Bay for terminals |
@@ -2286,6 +2472,8 @@ Rocker switch. Also used for neon indicator in the same form factor.
## Rod
Steel rods and studding with chamfered ends.
These items are sysmtrical, so by default the origin is in the centre but it can be changed to the bottom.
[vitamins/rod.scad](vitamins/rod.scad) Implementation.
@@ -2411,13 +2599,16 @@ Machine screws and wood screws with various head styles.
<a href="#top">Top</a>
---
<a name="Scs_bearing_blocks"></a>
## Scs_bearing_blocks
<a name="SCS_bearing_blocks"></a>
## SCS_bearing_blocks
SCSnUU and SCSnLUU bearing blocks
[vitamins/scs_bearing_blocks.scad](vitamins/scs_bearing_blocks.scad) Object definitions.
[vitamins/scs_bearing_block.scad](vitamins/scs_bearing_block.scad) Implementation.
[tests/scs_bearing_blocks.scad](tests/scs_bearing_blocks.scad) Code for this example.
[tests/SCS_bearing_blocks.scad](tests/SCS_bearing_blocks.scad) Code for this example.
### Properties
| Function | Description |
@@ -2558,8 +2749,8 @@ Note that modules that drill holes will return a 2D object if ```h``` is set to
<a href="#top">Top</a>
---
<a name="Sk_brackets"></a>
## Sk_brackets
<a name="SK_brackets"></a>
## SK_brackets
SK shaft support brackets
@@ -2567,7 +2758,7 @@ SK shaft support brackets
[vitamins/sk_bracket.scad](vitamins/sk_bracket.scad) Implementation.
[tests/sk_brackets.scad](tests/sk_brackets.scad) Code for this example.
[tests/SK_brackets.scad](tests/SK_brackets.scad) Code for this example.
### Properties
| Function | Description |
@@ -2586,21 +2777,29 @@ SK shaft support brackets
| Module | Description |
|:--- |:--- |
| ```sk_bracket(type)``` | SK shaft support bracket |
| ```sk_bracket_assembly(type, screw_length = 16, screw_type = M5_cap_screw, nut_type = undef)``` | Assembly with fasteners in place |
| ```sk_bracket_assembly(type, part_thickness = 2, screw_type = M5_cap_screw, nut_type = undef, max_screw_depth = 6)``` | Assembly with fasteners in place |
| ```sk_bracket_hole_positions(type)``` | Place children at hole positions |
![sk_brackets](tests/png/sk_brackets.png)
### Vitamins
| Qty | Module call | BOM entry |
| ---:|:--- |:---|
| 4 | ```sliding_t_nut(M5_sliding_t_nut)``` | Nut M5 sliding T |
| 4 | ```nut(M5_nut)``` | Nut M5 x 4mm |
| 2 | ```extrusion(E2020, 20)``` | Extrusion E2020 x 20mm |
| 2 | ```extrusion(E3030, 20)``` | Extrusion E3030 x 20mm |
| 2 | ```sliding_t_nut(M4_hammer_nut)``` | Nut M4 hammer |
| 2 | ```sliding_t_nut(M4_sliding_t_nut)``` | Nut M4 sliding T |
| 2 | ```sliding_t_nut(M5_sliding_t_nut)``` | Nut M5 sliding T |
| 2 | ```nut(M5_nut, nyloc = undef)``` | Nut M5 x 4mm |
| 1 | ```sk_bracket(SK10)``` | SK10 shaft support bracket |
| 1 | ```sk_bracket(SK12)``` | SK12 shaft support bracket |
| 1 | ```sk_bracket(SK16)``` | SK16 shaft support bracket |
| 1 | ```sk_bracket(SK8)``` | SK8 shaft support bracket |
| 8 | ```screw(M5_cap_screw, 16)``` | Screw M5 cap x 16mm |
| 12 | ```washer(M5_washer)``` | Washer M5 x 10mm x 1mm |
| 2 | ```screw(M4_cap_screw, 12)``` | Screw M4 cap x 12mm |
| 2 | ```screw(M4_dome_screw, 12)``` | Screw M4 dome x 12mm |
| 4 | ```screw(M5_cap_screw, 16)``` | Screw M5 cap x 16mm |
| 4 | ```washer(M4_washer)``` | Washer M4 x 9mm x 0.8mm |
| 6 | ```washer(M5_washer)``` | Washer M5 x 10mm x 1mm |
<a href="#top">Top</a>
@@ -2689,6 +2888,8 @@ Filament spool models
## Springs
Compression springs. Can be tapered, have open, closed or ground ends. Ground ends will render a lot slower.
By default springs have their origin at the bottom but can be centered.
[vitamins/springs.scad](vitamins/springs.scad) Object definitions.
@@ -2717,7 +2918,7 @@ Compression springs. Can be tapered, have open, closed or ground ends. Ground en
### Modules
| Module | Description |
|:--- |:--- |
| ```comp_spring(type, l = 0)``` | Draw specified spring, l can be set to specify the compressed length. |
| ```comp_spring(type, l = 0, center = false)``` | Draw specified spring, l can be set to specify the compressed length. |
![springs](tests/png/springs.png)
@@ -2731,8 +2932,8 @@ Compression springs. Can be tapered, have open, closed or ground ends. Ground en
<a href="#top">Top</a>
---
<a name="Ssrs"></a>
## Ssrs
<a name="SSRs"></a>
## SSRs
Solid state relays.
@@ -2740,7 +2941,7 @@ Solid state relays.
[vitamins/ssr.scad](vitamins/ssr.scad) Implementation.
[tests/ssrs.scad](tests/ssrs.scad) Code for this example.
[tests/SSRs.scad](tests/SSRs.scad) Code for this example.
### Properties
| Function | Description |
@@ -2819,15 +3020,16 @@ NEMA stepper motor model.
### Vitamins
| Qty | Module call | BOM entry |
| ---:|:--- |:---|
| 24 | ```screw(M3_pan_screw, 8)``` | Screw M3 pan x 8mm |
| 4 | ```ring_terminal(M3_ringterm)``` | Ring terminal 3mm |
| 15 | ```screw(M3_pan_screw, 8)``` | Screw M3 pan x 8mm |
| 1 | ```NEMA(NEMA14)``` | Stepper motor NEMA14 x 36mm |
| 1 | ```NEMA(NEMA16)``` | Stepper motor NEMA16 x 19.2mm |
| 1 | ```NEMA(NEMA17S)``` | Stepper motor NEMA17 x 34mm |
| 1 | ```NEMA(NEMA17M)``` | Stepper motor NEMA17 x 40mm |
| 1 | ```NEMA(NEMA17)``` | Stepper motor NEMA17 x 47mm |
| 1 | ```NEMA(NEMA23)``` | Stepper motor NEMA22 x 51.2mm |
| 24 | ```washer(M3_washer)``` | Washer M3 x 7mm x 0.5mm |
| 24 | ```star_washer(M3_washer)``` | Washer star M3 x 0.5mm |
| 11 | ```washer(M3_washer)``` | Washer M3 x 7mm x 0.5mm |
| 15 | ```star_washer(M3_washer)``` | Washer star M3 x 0.5mm |
<a href="#top">Top</a>
@@ -4048,15 +4250,15 @@ Printed handle that can be printed without needing support material due to its t
<a href="#top">Top</a>
---
<a name="Pcb_mount"></a>
## Pcb_mount
<a name="PCB_mount"></a>
## PCB_mount
A frame to mount a PCB by its corners when it has no mounting holes.
The stl must be given a parameterless wrapper in the project that uses it.
[printed/pcb_mount.scad](printed/pcb_mount.scad) Implementation.
[tests/pcb_mount.scad](tests/pcb_mount.scad) Code for this example.
[tests/PCB_mount.scad](tests/PCB_mount.scad) Code for this example.
### Functions
| Function | Description |
@@ -4096,15 +4298,96 @@ The stl must be given a parameterless wrapper in the project that uses it.
<a href="#top">Top</a>
---
<a name="Psu_shroud"></a>
## Psu_shroud
<a name="Printed_box"></a>
## Printed_box
A fully parametric 3D printed case that can be customised with cutouts and additions specified by children.
The walls can be made wavy, which possibly reduces warping when printing and looks nice, however if holes need to be made
in the sides you can't print a wavy bridge. Any holes need to be surrounded by a 45&deg; chamfer to make the bridges straight.
See the mounting points for the feet in the first example.
It can also have printed feet on the base with the screws doubling up to hold the base on.
[printed/printed_box.scad](printed/printed_box.scad) Implementation.
[tests/printed_box.scad](tests/printed_box.scad) Code for this example.
### Properties
| Function | Description |
|:--- |:--- |
| ```pbox_base(type)``` | Base thickness, can be zero for no base |
| ```pbox_base_screw(type)``` | Screw type if no feet |
| ```pbox_depth(type)``` | Internal depth |
| ```pbox_foot(type)``` | Printed foot, can be false to suppress feet |
| ```pbox_height(type)``` | Internal height |
| ```pbox_name(type)``` | Name to allow more than one box in a project |
| ```pbox_radius(type)``` | Internal corner radius |
| ```pbox_ridges(type)``` | Ridge wavelength and amplitude |
| ```pbox_top(type)``` | Top thickness |
| ```pbox_wall(type)``` | Wall thickness |
| ```pbox_width(type)``` | Internal width |
### Functions
| Function | Description |
|:--- |:--- |
| ```pbox_inclusion(type)``` | How far the ledge for the base extends inwards |
| ```pbox_insert(type)``` | The insert for the base screws |
| ```pbox_screw(type)``` | Foot screw if got feet else base_screw |
| ```pbox_screw_inset(type)``` | How far the base screws are inset |
| ```pbox_screw_length(type, panel_thickness = 0)``` | Length of the base screw |
| ```pbox_total_height(type)``` | Total height including base overlap |
| ```pbox_washer(type)``` | The washer for the base screws |
### Modules
| Module | Description |
|:--- |:--- |
| ```pbox(type)``` | Generate the STL for the main case |
| ```pbox_base(type)``` | Generate the STL for the base |
| ```pbox_base_screws(type, thickness = 0)``` | Place the screws and feet |
| ```pbox_inserts(type)``` | Place the inserts for the base screws |
![printed_box](tests/png/printed_box.png)
### Vitamins
| Qty | Module call | BOM entry |
| ---:|:--- |:---|
| 4 | ```insert(F1BM)``` | Heatfit insert M2 |
| 4 | ```insert(F1BM3)``` | Heatfit insert M3 |
| 4 | ```screw(M2_cap_screw, 6)``` | Screw M2 cap x 6mm |
| 3 | ```screw(M3_pan_screw, 6)``` | Screw M3 pan x 6mm |
| 4 | ```screw(M3_pan_screw, 10)``` | Screw M3 pan x 10mm |
| 4 | ```washer(M2_washer)``` | Washer M2 x 5mm x 0.3mm |
| 7 | ```washer(M3_washer)``` | Washer M3 x 7mm x 0.5mm |
### Printed
| Qty | Filename |
| ---:|:--- |
| 1 | box1.stl |
| 1 | box1_base.stl |
| 7 | foot.stl |
| 1 | smooth_box.stl |
| 1 | smooth_box_base.stl |
### Assemblies
| Qty | Name |
| ---:|:--- |
| 1 | box1_assembly |
| 1 | box2_assembly |
<a href="#top">Top</a>
---
<a name="PSU_shroud"></a>
## PSU_shroud
A cover to go over the mains end of a PSU terminal strip to make it safe.
The stl and assembly must be given a name and parameterless wrappers for the stl and assembly added to the project.
[printed/psu_shroud.scad](printed/psu_shroud.scad) Implementation.
[tests/psu_shroud.scad](tests/psu_shroud.scad) Code for this example.
[tests/PSU_shroud.scad](tests/PSU_shroud.scad) Code for this example.
### Functions
| Function | Description |
@@ -4132,23 +4415,25 @@ The stl and assembly must be given a name and parameterless wrappers for the stl
### Vitamins
| Qty | Module call | BOM entry |
| ---:|:--- |:---|
| 4 | ```insert(F1BM3)``` | Heatfit insert M3 |
| 4 | ```screw(M3_cap_screw, 10)``` | Screw M3 cap x 10mm |
| 4 | ```washer(M3_washer)``` | Washer M3 x 7mm x 0.5mm |
| 4 | ```star_washer(M3_washer)``` | Washer star M3 x 0.5mm |
| 2 | ```ziptie(small_ziptie, 3)``` | Ziptie 2.5mm x 100mm min length |
| 6 | ```insert(F1BM3)``` | Heatfit insert M3 |
| 6 | ```screw(M3_cap_screw, 10)``` | Screw M3 cap x 10mm |
| 6 | ```washer(M3_washer)``` | Washer M3 x 7mm x 0.5mm |
| 6 | ```star_washer(M3_washer)``` | Washer star M3 x 0.5mm |
| 3 | ```ziptie(small_ziptie, 3)``` | Ziptie 2.5mm x 100mm min length |
### Printed
| Qty | Filename |
| ---:|:--- |
| 1 | psu_shroud_PD_150_12.stl |
| 1 | psu_shroud_S_250_48.stl |
| 1 | psu_shroud_S_300_12.stl |
### Assemblies
| Qty | Name |
| ---:|:--- |
| 1 | psu_shroud_PD_150_12_assembly |
| 1 | psu_shroud_S_250_48_assembly |
| 1 | PSU_shroud_PD_150_12_assembly |
| 1 | PSU_shroud_S_250_48_assembly |
| 1 | PSU_shroud_S_300_12_assembly |
<a href="#top">Top</a>
@@ -4296,15 +4581,15 @@ UK 13A socket and printed backbox with earth terminal for the panel it is mounte
<a href="#top">Top</a>
---
<a name="Ssr_shroud"></a>
## Ssr_shroud
<a name="SSR_shroud"></a>
## SSR_shroud
A cover to go over the mains end of an SSR to make it safe to be touched.
The stl and assembly must be given a name and parameterless wrappers for the stl and assembly added to the project.
The STL and assembly must be given a name and parameterless wrappers for the stl and assembly added to the project.
[printed/ssr_shroud.scad](printed/ssr_shroud.scad) Implementation.
[tests/ssr_shroud.scad](tests/ssr_shroud.scad) Code for this example.
[tests/SSR_shroud.scad](tests/SSR_shroud.scad) Code for this example.
### Functions
| Function | Description |
@@ -4344,8 +4629,8 @@ The stl and assembly must be given a name and parameterless wrappers for the stl
### Assemblies
| Qty | Name |
| ---:|:--- |
| 1 | ssr_shroud_SSR10DA_assembly |
| 1 | ssr_shroud_SSR25DA_assembly |
| 1 | SSR_shroud_SSR10DA_assembly |
| 1 | SSR_shroud_SSR25DA_assembly |
<a href="#top">Top</a>
@@ -4769,7 +5054,7 @@ a cylinder. To get around this a colour can be passed to thread that is used to
Making the ends requires a CGAL intersection, which make threads relatively slow. For this reason they are generally disabled when using the GUI but can
be enabled by setting ```$show_threads``` to ```true```. When the tests are run, by default, threads are enabled only for things that feature them like screws.
This behaviour can be changed by setting a ```SHOW_THREADS``` environment variable to ```false``` to disable all threads and ```true``` to enable all threads.
This behaviour can be changed by setting a ```NOPSCADLIB_SHOW_THREADS``` environment variable to ```false``` to disable all threads and ```true``` to enable all threads.
The same variable also affects the generation of assembly diagrams.
Threads obey the $fn, $fa, $fs variables.
@@ -4819,8 +5104,8 @@ Simple tube or ring
<a href="#top">Top</a>
---
<a name="Bom"></a>
## Bom
<a name="BOM"></a>
## BOM
Bill Of Materials generation via echo and the ```bom.py``` script. Also handles exploded assembly views and posing. Assembly instructions can precede the module
definition that makes the assembly.
@@ -4830,7 +5115,7 @@ heirachical BOMs are also generated for real projects.
[utils/core/bom.scad](utils/core/bom.scad) Implementation.
[tests/bom.scad](tests/bom.scad) Code for this example.
[tests/BOM.scad](tests/BOM.scad) Code for this example.
### Functions
| Function | Description |
@@ -5072,11 +5357,12 @@ Small holes can get away without it, but they print better with truncated teardr
### Modules
| Module | Description |
|:--- |:--- |
| ```semi_teardrop(h, r, d = undef, center = true)``` | A semi teardrop in the positive Y domain |
| ```teardrop(h, r, center = true, truncate = true)``` | For making horizontal holes that don't need support material, set ```truncate = false``` to make traditional RepRap teardrops that don't even need bridging |
| ```teardrop_plus(h, r, center = true, truncate = true)``` | Slightly bigger teardrop to allow for the 3D printing staircase effect |
| ```tearslot(h, r, w, center = true)``` | A horizontal slot that doesn't need support material |
| ```vertical_tearslot(h, r, l, center = true)``` | A vertical slot that doesn't need support material |
| ```semi_teardrop(h, r, d = undef, center = true, chamfer = 0)``` | A semi teardrop in the positive Y domain |
| ```teardrop(h, r, center = true, truncate = true, chamfer = 0)``` | For making horizontal holes that don't need support material, set ```truncate = false``` to make traditional RepRap teardrops that don't even need bridging |
| ```teardrop_chamfer(h, center, chamfer)``` | Helper module for adding chamfer to a teardrop |
| ```teardrop_plus(h, r, center = true, truncate = true, chamfer = 0)``` | Slightly bigger teardrop to allow for the 3D printing staircase effect |
| ```tearslot(h, r, w, center = true, chamfer = 0)``` | A horizontal slot that doesn't need support material |
| ```vertical_tearslot(h, r, l, center = true, chamfer = 0)``` | A vertical slot that doesn't need support material |
![teardrops](tests/png/teardrops.png)

View File

@@ -184,10 +184,17 @@ def parse_bom(file = "openscad.log", name = None):
main.add_part(s)
if stack:
main.assemblies[stack[-1]].add_part(s)
else:
if 'ERROR:' in line or 'WARNING:' in line:
print(line[:-1])
return main
def usage():
print("\nusage:\n\tbom [target_config] [<accessory_name>_assembly] - Generate BOMs for a project or an accessory to a project.")
sys.exit(1)
def boms(target = None, assembly = None):
bom_dir = set_config(target) + "bom"
bom_dir = set_config(target, usage) + "bom"
if assembly:
bom_dir += "/accessories"
if not os.path.isdir(bom_dir):
@@ -214,7 +221,7 @@ def boms(target = None, assembly = None):
#
# Run openscad
#
openscad.run("-D","$bom=2","-D","$preview=true","-o", "openscad.echo", bom_maker_name)
openscad.run("-D","$bom=2","-D","$preview=true","-o", "openscad.echo", "-d", bom_dir + "/bom.deps", bom_maker_name)
os.remove(bom_maker_name)
print("Generating bom ...", end=" ")
@@ -236,11 +243,24 @@ def boms(target = None, assembly = None):
print("done")
if __name__ == '__main__':
args = len(sys.argv)
if args > 1:
if args > 2:
boms(sys.argv[1], sys.argv[2])
else:
boms(sys.argv[1])
if len(sys.argv) > 3: usage()
if len(sys.argv) == 3:
target, assembly = sys.argv[1], sys.argv[2]
else:
boms();
if len(sys.argv) == 2:
if sys.argv[1][-9:] == "_assembly":
target, assembly = None, sys.argv[1]
else:
target, assembly = sys.argv[1], None
else:
target, assembly = None, None
if assembly:
if assembly[-9:] != "_assembly": usage()
try:
boms(target, assembly)
except Exception as e:
print(str(e))
sys.exit(1)

View File

@@ -113,5 +113,5 @@ if __name__ == '__main__':
if len(sys.argv) == 2:
canonicalise(sys.argv[1])
else:
print("usage: c14n_stl file")
print("\nusage:\n\t c14n_stl file - Canonicalise an STL file created by OpenSCAD.")
sys.exit(1)

View File

@@ -17,6 +17,7 @@
# If not, see <https://www.gnu.org/licenses/>.
#
import os
from set_config import source_dir
def mtime(file):
if os.path.isfile(file):
@@ -32,7 +33,7 @@ def read_deps(dname):
deps = []
for line in lines:
if line.startswith('\t'):
dep = line[1 : -1].rstrip(' \\')
dep = line[1 : -1].rstrip(' \\').replace('\\ ', ' ')
if not os.path.basename(dep) in ['stl.scad', 'dxf.scad', 'svf.scad', 'png.scad', 'target.scad']:
deps.append(dep)
return deps
@@ -48,3 +49,18 @@ def check_deps(target, dname):
if mtime(dep) > target_mtime:
return dep + ' changed'
return None
def source_dirs(bom_dir):
dirs = set()
lib_dirs = set()
deps = read_deps(bom_dir + '/bom.deps')
cwd = os.getcwd().replace('\\', '/')
for dep in deps:
dir = os.path.dirname(dep)
if dir.startswith(cwd):
dirs.add(dir[len(cwd) + 1:])
else:
if dir.endswith('/printed'):
lib_dirs.add(dir)
dirs.remove(source_dir)
return [source_dir] + sorted(dirs) + sorted(lib_dirs)

View File

@@ -26,6 +26,7 @@ from __future__ import print_function
import os
from tests import do_cmd
import argparse
dir = 'scripts'
@@ -40,7 +41,7 @@ These are located in the ```scripts``` subdirectory, which needs to be added to
They should work with both Python 2 and Python 3.
| Script | Function |
|:--|:--|''', file = doc_file)
|:---|:---|''', file = doc_file)
for file in os.listdir('scripts'):
if file.endswith('.py'):
blurb = ''
@@ -74,4 +75,5 @@ They should work with both Python 2 and Python 3.
if __name__ == '__main__':
argparse.ArgumentParser(description='Generate scripts/readme.md and make html versions of that and doc/usage.md').parse_args()
doc_scripts()

View File

@@ -30,14 +30,14 @@ import times
from deps import *
import json
def bom_to_parts(target_dir, part_type, assembly = None):
def bom_to_parts(bom_dir, part_type, assembly = None):
#
# Make a list of all the parts in the BOM
#
part_files = []
bom = assembly + '.txt' if assembly else "bom.txt"
suffix = ".dxf" if part_type == 'svg' else '.' + part_type
with open(target_dir + "/../bom/" + bom, "rt") as f:
with open(bom_dir + '/' + bom, "rt") as f:
for line in f.readlines():
words = line.split()
if words:
@@ -46,13 +46,24 @@ def bom_to_parts(target_dir, part_type, assembly = None):
part_files.append(last_word[:-4] + '.' + part_type)
return part_files
def usage(t):
print("\nusage:\n\t%ss [target_config] [<name1>.%s] ... [<nameN>.%s] - Generate specified %s files or all if none specified." % ( t, t, t, t.upper()))
sys.exit(1)
def make_parts(target, part_type, parts = None):
#
# Check list of parts is the correct type
#
if parts:
for p in parts:
if not p.endswith('.' + part_type): usage(part_type)
#
# Make the target directory
#
top_dir = set_config(target)
top_dir = set_config(target, lambda: usage(part_type))
target_dir = top_dir + part_type + 's'
deps_dir = top_dir + "deps"
bom_dir = top_dir + "bom"
if not os.path.isdir(target_dir):
os.makedirs(target_dir)
if not os.path.isdir(deps_dir):
@@ -64,7 +75,7 @@ def make_parts(target, part_type, parts = None):
if parts:
targets = list(parts) #copy the list so we dont modify the list passed in
else:
targets = bom_to_parts(target_dir, part_type)
targets = bom_to_parts(bom_dir, part_type)
for file in os.listdir(target_dir):
if file.endswith('.' + part_type):
if not file in targets:
@@ -83,50 +94,49 @@ def make_parts(target, part_type, parts = None):
#
# Find all the scad files
#
lib_dir = os.environ['OPENSCADPATH'] + '/NopSCADlib/printed'
module_suffix = '_dxf' if part_type == 'svg' else '_' + part_type
for dir in [source_dir, lib_dir]:
for filename in os.listdir(dir):
if filename[-5:] == ".scad":
#
# find any modules ending in _<part_type>
#
with open(dir + "/" + filename, "r") as f:
for line in f.readlines():
words = line.split()
if(len(words) and words[0] == "module"):
module = words[1].split('(')[0]
if module.endswith(module_suffix):
base_name = module[:-4]
part = base_name + '.' + part_type
if part in targets:
#
# make a file to use the module
#
part_maker_name = part_type + ".scad"
with open(part_maker_name, "w") as f:
f.write("use <%s/%s>\n" % (dir, filename))
f.write("%s();\n" % module);
#
# Run openscad on the created file
#
part_file = target_dir + "/" + part
dname = deps_name(deps_dir, filename)
changed = check_deps(part_file, dname)
changed = times.check_have_time(changed, part)
if part_type == 'stl' and not changed and not part in bounds_map:
changed = "No bounds"
if changed:
print(changed)
t = time.time()
openscad.run("-D$bom=1", "-d", dname, "-o", part_file, part_maker_name)
times.add_time(part, t)
if part_type == 'stl':
bounds = c14n_stl.canonicalise(part_file)
bounds_map[part] = bounds
targets.remove(part)
os.remove(part_maker_name)
for dir in source_dirs(bom_dir):
if targets and os.path.isdir(dir):
for filename in os.listdir(dir):
if targets and filename[-5:] == ".scad":
#
# find any modules ending in _<part_type>
#
with open(dir + "/" + filename, "r") as f:
for line in f.readlines():
words = line.split()
if(len(words) and words[0] == "module"):
module = words[1].split('(')[0]
if module.endswith(module_suffix):
base_name = module[:-4]
part = base_name + '.' + part_type
if part in targets:
#
# Run openscad on the created file
#
part_file = target_dir + "/" + part
dname = deps_name(deps_dir, filename)
changed = check_deps(part_file, dname)
changed = times.check_have_time(changed, part)
if part_type == 'stl' and not changed and not part in bounds_map:
changed = "No bounds"
if changed:
print(changed)
#
# make a file to use the module
#
part_maker_name = part_type + ".scad"
with open(part_maker_name, "w") as f:
f.write("use <%s/%s>\n" % (dir, filename))
f.write("%s();\n" % module);
t = time.time()
openscad.run("-D$bom=1", "-d", dname, "-o", part_file, part_maker_name)
times.add_time(part, t)
if part_type == 'stl':
bounds = c14n_stl.canonicalise(part_file)
bounds_map[part] = bounds
os.remove(part_maker_name)
targets.remove(part)
#
# Write new bounds file
#
@@ -138,9 +148,6 @@ def make_parts(target, part_type, parts = None):
#
if targets:
for part in targets:
if part[-4:] != '.' + part_type:
print(part, "is not a", part_type, "file")
else:
print("Could not find a module called", part[:-4] + module_suffix, "to make", part)
sys.exit(1)
print("Could not find a module called", part[:-4] + module_suffix, "to make", part)
usage(part_type)
times.print_times()

View File

@@ -30,6 +30,7 @@ import re
from shutil import copyfile
from tests import update_image
import sys
import argparse
project_dirs = ['../..', 'examples']
target_dir = 'gallery'
@@ -39,7 +40,6 @@ def gallery(force):
if not os.path.isdir(target_dir):
os.makedirs(target_dir)
paths = sorted([pdir + '/' + i for pdir in project_dirs for i in os.listdir(pdir) if os.path.isdir(pdir + '/' + i + '/assemblies')], key = lambda s: os.path.basename(s))
with open(output_name, 'wt') as output_file:
print("# A gallery of projects made with NopSCADlib", file = output_file)
@@ -78,4 +78,8 @@ def gallery(force):
if __name__ == '__main__':
init()
gallery(force = len(sys.argv) > 1 and sys.argv[1] == '-f')
parser = argparse.ArgumentParser(description='Creates a galley of projects by copying the top level image and description to gallery/readme.md.')
parser.add_argument("-f", help = "run make_all in each project to force update", action="store_true")
args = parser.parse_args()
gallery(force = args.f)

View File

@@ -27,9 +27,17 @@ from bom import boms
from render import render
from views import views
from plateup import plateup
from set_config import set_config
def usage():
print("\nusage:\n\tmake_all [target_config] - Make all the manufacturing files and readme for a project.")
sys.exit(1)
if __name__ == '__main__':
if len(sys.argv) > 2: usage()
target = None if len(sys.argv) == 1 else sys.argv[1]
set_config(target, usage)
boms(target)
for part in ['stl', 'dxf']:
make_parts(target, part)

View File

@@ -23,7 +23,7 @@ import json, os, deps
def check_options(dir = '.'):
global options, options_mtime
options = { "show_threads": str(os.getenv("SHOW_THREADS")) }
options = { "show_threads": str(os.getenv("NOPSCADLIB_SHOW_THREADS")) }
options_fname = dir + '/options.json'
try:
with open(options_fname) as json_file:

View File

@@ -25,9 +25,15 @@ import sys
from plateup import plateup
def usage():
print("\nusage:\n\tpanels [target_config] - Aggregate DXF files for routing together.")
sys.exit(1)
if __name__ == '__main__':
if len(sys.argv) > 2: usage()
if len(sys.argv) > 1:
target = sys.argv[1]
else:
target = None
plateup(target, 'dxf')
plateup(target, 'dxf', usage)

View File

@@ -31,11 +31,11 @@ from shutil import copyfile
source_dirs = { "stl" : "platters", "dxf" : "panels" }
target_dirs = { "stl" : "printed", "dxf" : "routed" }
def plateup(target, part_type):
def plateup(target, part_type, usage = None):
#
# Make the target directory
#
top_dir = set_config(target)
top_dir = set_config(target, usage)
parts_dir = top_dir + part_type + 's'
target_dir = parts_dir + '/' + target_dirs[part_type]
source_dir = top_dir + source_dirs[part_type]

View File

@@ -25,9 +25,15 @@ import sys
from plateup import plateup
def usage():
print("\nusage:\n\tplatters [target_config] - Aggregate STL files for printing together.")
sys.exit(1)
if __name__ == '__main__':
if len(sys.argv) > 2: usage()
if len(sys.argv) > 1:
target = sys.argv[1]
else:
target = None
plateup(target, 'stl')
plateup(target, 'stl', usage)

View File

@@ -5,7 +5,7 @@ These are located in the ```scripts``` subdirectory, which needs to be added to
They should work with both Python 2 and Python 3.
| Script | Function |
|:--|:--|
|:---|:---|
| ```bom.py``` | Generates BOM files for the project. |
| ```c14n_stl.py``` | OpenSCAD produces randomly ordered STL files. This script re-orders them consistently so that GIT can tell if they have changed or not. |
| ```doc_scripts.py``` | Makes this document and doc/usage.md. |

View File

@@ -30,17 +30,23 @@ from tests import do_cmd, update_image, colour_scheme, background
from deps import mtime
from colorama import init
def usage():
print("\nusage:\n\trender [target_config] - Render images of the stl and dxf files.");
sys.exit(1)
def render(target, type):
#
# Make the target directory
#
target_dir = set_config(target) + type + 's'
top_dir = set_config(target, usage)
target_dir = top_dir + type + 's'
bom_dir = top_dir + 'bom'
if not os.path.isdir(target_dir):
os.makedirs(target_dir)
#
# Find all the parts
#
parts = bom_to_parts(target_dir, type)
parts = bom_to_parts(bom_dir, type)
#
# Remove unused png files
#
@@ -59,7 +65,7 @@ def render(target, type):
if mtime(part_file) > mtime(png_name):
png_maker_name = "png.scad"
with open(png_maker_name, "w") as f:
f.write('color("lime") import("%s");\n' % part_file)
f.write('color([0, 146/255, 0]) import("%s");\n' % part_file)
cam = "--camera=0,0,0,70,0,315,500" if type == 'stl' else "--camera=0,0,0,0,0,0,500"
render = "--preview" if type == 'stl' else "--render"
tmp_name = 'tmp.png'
@@ -71,6 +77,7 @@ def render(target, type):
if __name__ == '__main__':
init()
if len(sys.argv) > 2: usage()
target = sys.argv[1] if len(sys.argv) > 1 else None
render(target, 'stl')
render(target, 'dxf')

View File

@@ -45,20 +45,27 @@ def valid_targets_string():
return result
def set_config(target):
def set_config(target, usage = None):
if target and target[:1] == '-' and usage: usage()
targets = valid_targets()
if not target:
if not targets:
return ""
print("Must specify a configuration: " + valid_targets_string())
if usage:
usage()
sys.exit(1)
if not targets:
print("Not a muli-configuration project (no config_<target>.scad files found)")
if usage:
usage()
sys.exit(1)
if not target in targets:
print(target + " is not a configuration, avaliable configurations are: " + valid_targets_string())
if usage:
usage()
sys.exit(1)
fname = source_dir + "/target.scad"
@@ -75,10 +82,13 @@ def set_config(target):
f. write(text);
return target + "/"
def usage():
print("\nusage:\n\tset_config config_name")
sys.exit(1)
if __name__ == '__main__':
args = len(sys.argv)
if args == 2:
set_config(sys.argv[1])
set_config(sys.argv[1], usage)
else:
print("usage: set_config config_name")
sys.exit(1)
usage()

View File

@@ -85,6 +85,10 @@ def depluralise(name):
def is_plural(name):
return name != depluralise(name)
def usage():
print("\nusage:\n\ttests [test_name1] ... [test_nameN] - Run specified tests or all tests in none specified.");
sys.exit(1)
def tests(tests):
scad_dir = "tests"
deps_dir = scad_dir + "/deps"
@@ -96,6 +100,7 @@ def tests(tests):
doc_name = "readme.md"
index = {}
bodies = {}
done = []
times.read_times()
options.check_options(deps_dir)
#
@@ -109,13 +114,15 @@ def tests(tests):
#
# List of individual part files
#
scads = [i for i in sorted(os.listdir(scad_dir)) if i[-5:] == ".scad"]
scads = [i for i in sorted(os.listdir(scad_dir), key = lambda s: s.lower()) if i[-5:] == ".scad"]
for scad in scads:
base_name = scad[:-5]
if not tests or base_name in tests:
done.append(base_name)
print(base_name)
cap_name = base_name[0].capitalize() + base_name[1:]
base_name = base_name.lower()
scad_name = scad_dir + '/' + scad
png_name = png_dir + '/' + base_name + '.png'
bom_name = bom_dir + '/' + base_name + '.json'
@@ -140,11 +147,14 @@ def tests(tests):
print("Can't find implementation!")
continue
vsplit = "M"
vsplit = "AKR" + chr(ord('Z') + 1)
vtype = locations[0][1]
types = [vtype + ' A-' + vsplit[0], vtype + ' ' + chr(ord(vsplit) + 1) + '-Z'] + [loc[1] for loc in locations[1 :]]
types = [vtype + ' ' + vsplit[i] + '-' + chr(ord(vsplit[i + 1]) - 1) for i in range(len(vsplit) - 1)] + [loc[1] for loc in locations[1 :]]
if type == vtype:
type = types[0] if cap_name[0] <= vsplit else types[1]
for i in range(1, len(vsplit)):
if cap_name[0] < vsplit[i]:
type = types[i - 1]
break
for t in types:
if not t in bodies:
@@ -188,10 +198,10 @@ def tests(tests):
body += ["![%s](%s)\n" %(base_name, png_name)]
dname = deps_name(deps_dir, scad)
dname = deps_name(deps_dir, scad.lower())
oldest = png_name if mtime(png_name) < mtime(bom_name) else bom_name
changed = check_deps(oldest, dname)
changed = times.check_have_time(changed, scad_name)
changed = times.check_have_time(changed, scad_name.lower())
changed = options.have_changed(changed, oldest)
if changed:
print(changed)
@@ -230,6 +240,14 @@ def tests(tests):
body += ['\n<a href="#top">Top</a>']
body += ["\n---"]
for test in done:
if test in tests:
tests.remove(test)
if tests:
for test in tests:
print(Fore.MAGENTA + "Could not find a test called", test, Fore.WHITE)
usage()
with open(doc_name, "wt") as doc_file:
print('# NopSCADlib', file = doc_file)
print('''\
@@ -275,4 +293,6 @@ See [usage](docs/usage.md) for requirements, installation instructions and a usa
do_cmd('codespell -L od readme.md'.split())
if __name__ == '__main__':
for arg in sys.argv[1:]:
if arg[:1] == '-': usage()
tests(sys.argv[1:])

View File

@@ -71,9 +71,10 @@ def bom_to_assemblies(bom_dir, bounds_map):
#
# Remove the main assembly if it is a shell
#
ass = flat_bom[-1]
if len(ass["assemblies"]) < 2 and not ass["vitamins"] and not ass["printed"] and not ass["routed"]:
flat_bom = flat_bom[:-1]
if flat_bom:
ass = flat_bom[-1]
if len(ass["assemblies"]) < 2 and not ass["vitamins"] and not ass["printed"] and not ass["routed"]:
flat_bom = flat_bom[:-1]
return [assembly["name"] for assembly in flat_bom]
def eop(print_mode, doc_file, last = False, first = False):
@@ -88,12 +89,24 @@ def eop(print_mode, doc_file, last = False, first = False):
def pad(s, before, after = 0):
return '&nbsp;' * before + str(s) + '&nbsp;' * after
def titalise(name):
cap_next = True
result = ''
for c in name.replace('_', ' '):
result = result + (c.upper() if cap_next else c);
cap_next = c == ' '
return result
def usage():
print("\nusage:\n\t views [target_config] [<name1>_assembly] ... [<nameN>_assembly] - Create assembly images and readme.")
sys.exit(1)
def views(target, do_assemblies = None):
done_assemblies = []
#
# Make the target directory
#
top_dir = set_config(target)
top_dir = set_config(target, usage)
target_dir = top_dir + 'assemblies'
deps_dir = top_dir + "deps"
bom_dir = top_dir + "bom"
@@ -108,9 +121,10 @@ def views(target, do_assemblies = None):
with open(bounds_fname) as json_file:
bounds_map = json.load(json_file)
#
# Find all the assemblies
# Find all the assemblies and remove any old views
#
assemblies = bom_to_assemblies(bom_dir, bounds_map)
lc_assemblies = [ass.lower() for ass in assemblies]
for file in os.listdir(target_dir):
if file.endswith('.png'):
assembly = file[:-4].replace('_assembled', '_assembly')
@@ -123,67 +137,69 @@ def views(target, do_assemblies = None):
# Find all the scad files
#
main_blurb = None
lib_dir = os.environ['OPENSCADPATH'] + '/NopSCADlib/printed'
for dir in [source_dir, lib_dir]:
for filename in os.listdir(dir):
if filename.endswith('.scad'):
#
# find any modules with names ending in _assembly
#
with open(dir + "/" + filename, "r") as f:
lines = f.readlines()
line_no = 0
for line in lines:
words = line.split()
if len(words) and words[0] == "module":
module = words[1].split('(')[0]
if is_assembly(module):
if module in assemblies:
#
# Scrape the assembly instructions
#
for ass in flat_bom:
if ass["name"] == module:
if not "blurb" in ass:
ass["blurb"] = blurb.scrape_module_blurb(lines[:line_no])
break
if not do_assemblies or module in do_assemblies:
for dir in source_dirs(bom_dir):
if os.path.isdir(dir):
for filename in os.listdir(dir):
if filename.endswith('.scad'):
#
# find any modules with names ending in _assembly
#
with open(dir + "/" + filename, "r") as f:
lines = f.readlines()
line_no = 0
for line in lines:
words = line.split()
if len(words) and words[0] == "module":
module = words[1].split('(')[0]
if is_assembly(module):
lc_module = module.lower()
if lc_module in lc_assemblies:
real_name = assemblies[lc_assemblies.index(lc_module)]
#
# make a file to use the module
# Scrape the assembly instructions
#
png_maker_name = 'png.scad'
with open(png_maker_name, "w") as f:
f.write("use <%s/%s>\n" % (dir, filename))
f.write("%s();\n" % module);
#
# Run openscad on the created file
#
dname = deps_name(deps_dir, filename)
for explode in [0, 1]:
png_name = target_dir + '/' + module + '.png'
if not explode:
png_name = png_name.replace('_assembly', '_assembled')
changed = check_deps(png_name, dname)
changed = times.check_have_time(changed, png_name)
changed = options.have_changed(changed, png_name)
tmp_name = 'tmp.png'
if changed:
print(changed)
t = time.time()
openscad.run_list(options.list() + ["-D$pose=1", "-D$explode=%d" % explode, colour_scheme, "--projection=p", "--imgsize=4096,4096", "--autocenter", "--viewall", "-d", dname, "-o", tmp_name, png_maker_name]);
times.add_time(png_name, t)
do_cmd(["magick", tmp_name, "-trim", "-resize", "1004x1004", "-bordercolor", background, "-border", "10", tmp_name])
update_image(tmp_name, png_name)
tn_name = png_name.replace('.png', '_tn.png')
if mtime(png_name) > mtime(tn_name):
do_cmd(("magick "+ png_name + " -trim -resize 280x280 -background " + background + " -gravity Center -extent 280x280 -bordercolor " + background + " -border 10 " + tmp_name).split())
update_image(tmp_name, tn_name)
os.remove(png_maker_name)
done_assemblies.append(module)
else:
if module == 'main_assembly':
main_blurb = blurb.scrape_module_blurb(lines[:line_no])
line_no += 1
for ass in flat_bom:
if ass["name"] == real_name:
if not "blurb" in ass:
ass["blurb"] = blurb.scrape_module_blurb(lines[:line_no])
break
if not do_assemblies or real_name in do_assemblies:
#
# Run openscad on the created file
#
dname = deps_name(deps_dir, filename)
for explode in [0, 1]:
png_name = target_dir + '/' + real_name + '.png'
if not explode:
png_name = png_name.replace('_assembly', '_assembled')
changed = check_deps(png_name, dname)
changed = times.check_have_time(changed, png_name)
changed = options.have_changed(changed, png_name)
tmp_name = 'tmp.png'
if changed:
print(changed)
#
# make a file to use the module
#
png_maker_name = 'png.scad'
with open(png_maker_name, "w") as f:
f.write("use <%s/%s>\n" % (dir, filename))
f.write("%s();\n" % module);
t = time.time()
openscad.run_list(options.list() + ["-D$pose=1", "-D$explode=%d" % explode, colour_scheme, "--projection=p", "--imgsize=4096,4096", "--autocenter", "--viewall", "-d", dname, "-o", tmp_name, png_maker_name]);
times.add_time(png_name, t)
do_cmd(["magick", tmp_name, "-trim", "-resize", "1004x1004", "-bordercolor", background, "-border", "10", tmp_name])
update_image(tmp_name, png_name)
os.remove(png_maker_name)
tn_name = png_name.replace('.png', '_tn.png')
if mtime(png_name) > mtime(tn_name):
do_cmd(("magick "+ png_name + " -trim -resize 280x280 -background " + background + " -gravity Center -extent 280x280 -bordercolor " + background + " -border 10 " + tmp_name).split())
update_image(tmp_name, tn_name)
done_assemblies.append(real_name)
else:
if module == 'main_assembly':
main_blurb = blurb.scrape_module_blurb(lines[:line_no])
line_no += 1
times.print_times()
#
# Build the document
@@ -214,7 +230,7 @@ def views(target, do_assemblies = None):
print('1. [Parts list](#Parts_list)', file = doc_file)
for ass in flat_bom:
name = ass["name"]
cap_name = name.replace('_', ' ').title()
cap_name = titalise(name)
print('1. [%s](#%s)' % (cap_name, name), file = doc_file)
print(file = doc_file)
eop(print_mode, doc_file)
@@ -235,11 +251,11 @@ def views(target, do_assemblies = None):
else:
things[t][thing] = ass[t][thing]
for ass in flat_bom:
name = ass["name"][:-9].replace('_', ' ').title().replace(' ','&nbsp;')
name = titalise(ass["name"][:-9]).replace(' ','&nbsp;')
print('| <span style="writing-mode: vertical-rl; text-orientation: mixed;">%s</span> ' % name, file = doc_file, end = '')
print('| <span style="writing-mode: vertical-rl; text-orientation: mixed;">TOTALS</span> | |', file = doc_file)
print(('|--:' * len(flat_bom) + '|--:|:--|'), file = doc_file)
print(('|---:' * len(flat_bom) + '|---:|:---|'), file = doc_file)
for t in types:
if things[t]:
@@ -272,7 +288,7 @@ def views(target, do_assemblies = None):
#
for ass in flat_bom:
name = ass["name"]
cap_name = name.replace('_', ' ').title()
cap_name = titalise(name)
if ass["count"] > 1:
print('<a name="%s"></a>\n## %d x %s' % (name, ass["count"], cap_name), file = doc_file)
@@ -282,7 +298,7 @@ def views(target, do_assemblies = None):
if vitamins:
print("### Vitamins", file = doc_file)
print("|Qty|Description|", file = doc_file)
print("|--:|:----------|", file = doc_file)
print("|---:|:----------|", file = doc_file)
for v in sorted(vitamins, key = lambda s: s.split(":")[-1]):
print("|%d|%s|" % (vitamins[v], v.split(":")[1]), file = doc_file)
print("\n", file = doc_file)
@@ -296,7 +312,7 @@ def views(target, do_assemblies = None):
print('%s %d x %s |' % ('\n|' if not (i % 3) else '', printed[p], p), file = doc_file, end = '')
if (i % 3) == 2 or i == len(printed) - 1:
n = (i % 3) + 1
print('\n|%s' % ('--|' * n), file = doc_file)
print('\n|%s' % ('---|' * n), file = doc_file)
for j in range(n):
part = keys[i - n + j + 1]
print('| ![%s](stls/%s) %s' % (part, part.replace('.stl','.png'), '|\n' if j == j - 1 else ''), end = '', file = doc_file)
@@ -312,7 +328,7 @@ def views(target, do_assemblies = None):
print('%s %d x %s |' % ('\n|' if not (i % 3) else '', routed[r], r), file = doc_file, end = '')
if (i % 3) == 2 or i == len(routed) - 1:
n = (i % 3) + 1
print('\n|%s' % ('--|' * n), file = doc_file)
print('\n|%s' % ('---|' * n), file = doc_file)
for j in range(n):
part = keys[i - n + j + 1]
print('| ![%s](dxfs/%s) %s' % (part, part.replace('.dxf','.png'), '|\n' if j == j - 1 else ''), end = '', file = doc_file)
@@ -328,7 +344,7 @@ def views(target, do_assemblies = None):
print('%s %d x %s |' % ('\n|' if not (i % 3) else '', sub_assemblies[a], a), file = doc_file, end = '')
if (i % 3) == 2 or i == len(keys) - 1:
n = (i % 3) + 1
print('\n|%s' % ('--|' * n), file = doc_file)
print('\n|%s' % ('---|' * n), file = doc_file)
for j in range(n):
a = keys[i - n + j + 1].replace('_assembly', '_assembled')
print('| ![%s](assemblies/%s) %s' % (a, a + '_tn.png', '|\n' if j == j - 1 else ''), end = '', file = doc_file)
@@ -383,4 +399,7 @@ if __name__ == '__main__':
else:
target, assemblies = None, sys.argv[1:]
for a in assemblies:
if a[-9:] != "_assembly": usage()
views(target, assemblies)

View File

@@ -21,9 +21,8 @@
//! BOM and assembly demonstration
//
include <../core.scad>
include <../vitamins/screws.scad>
include <../vitamins/inserts.scad>
include <../vitamins/sheets.scad>
use <../vitamins/insert.scad>
$explode = 1; // Normally set on the command line when generating assembly views with views.py
screw = M3_cap_screw;

View File

@@ -17,10 +17,10 @@
// If not, see <https://www.gnu.org/licenses/>.
//
include <../core.scad>
use <../utils/layout.scad>
include <../vitamins/iecs.scad>
use <../utils/layout.scad>
module iecs()
layout([for(i = iecs) iec_flange_h(i)], 10)
rotate(90)

View File

@@ -0,0 +1,33 @@
//
// NopSCADlib Copyright Chris Palmer 2018
// nop.head@gmail.com
// hydraraptor.blogspot.com
//
// This file is part of NopSCADlib.
//
// NopSCADlib is free software: you can redistribute it and/or modify it under the terms of the
// GNU General Public License as published by the Free Software Foundation, either version 3 of
// the License, or (at your option) any later version.
//
// NopSCADlib is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
// without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
// See the GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License along with NopSCADlib.
// If not, see <https://www.gnu.org/licenses/>.
//
include <../core.scad>
include <../vitamins/kp_pillow_blocks.scad>
use <../utils/layout.scad>
module kp_pillow_blocks() {
screws = [M4_cap_screw, M4_cap_screw, M5_cap_screw, M5_cap_screw];
nuts = [M4_sliding_t_nut, M4_hammer_nut, M5_sliding_t_nut, M5_nut];
assert(len(screws) == len(kp_pillow_blocks) && len(nuts) == len(kp_pillow_blocks));
layout([for(k = kp_pillow_blocks) 2 * kp_size(k)[1]])
kp_pillow_block_assembly(kp_pillow_blocks[$i], screw_type = screws[$i], nut_type = nuts[$i]);
}
if($preview)
kp_pillow_blocks();

View File

@@ -16,7 +16,7 @@
// You should have received a copy of the GNU General Public License along with NopSCADlib.
// If not, see <https://www.gnu.org/licenses/>.
//
include <../core.scad>
include <../utils/core/core.scad>
use <../utils/layout.scad>
include <../vitamins/leds.scad>

109
tests/PCB.scad Normal file
View File

@@ -0,0 +1,109 @@
//
// NopSCADlib Copyright Chris Palmer 2020
// nop.head@gmail.com
// hydraraptor.blogspot.com
//
// This file is part of NopSCADlib.
//
// NopSCADlib is free software: you can redistribute it and/or modify it under the terms of the
// GNU General Public License as published by the Free Software Foundation, either version 3 of
// the License, or (at your option) any later version.
//
// NopSCADlib is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
// without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
// See the GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License along with NopSCADlib.
// If not, see <https://www.gnu.org/licenses/>.
//
include <../core.scad>
include <../vitamins/microswitches.scad>
include <../vitamins/d_connectors.scad>
use <../vitamins/pcb.scad>
gt_5x17 = ["gt_5x17", 5, 10, 17, 5, 11, 0.4, 9, 2,1.5, 1, 3, 6, 0, 0, 0];
gt_5x11 = ["gt_5x11", 5, 8, 11, 5, 7, 0.4, 7, 1.5,1.5, 1,2.5, 6, 0, 0, 0];
TMC2130HeatSinkColor = "DeepSkyBlue";
TMC2130 = ["TMC2130", "TMC2130",
20, 14, 1.6, 0, 3, 0, "white", false, [],
[
[ 10, 1, 0, "-2p54header", 8, 1 ,undef, "blue" ],
[ 10, 13, 0, "-2p54header", 8, 1],
[ 12, 7, 0, "-chip", 6, 4, 1, grey20 ],
// mock up a heat sink
[ 10, 7, 0, "block", 9, 9, 2, TMC2130HeatSinkColor ],
[ 10, 11, 0, "block", 9, 1, 11, TMC2130HeatSinkColor ],
[ 10, 9, 0, "block", 9, 1, 11, TMC2130HeatSinkColor ],
[ 10, 7, 0, "block", 9, 1, 11, TMC2130HeatSinkColor ],
[ 10, 5, 0, "block", 9, 1, 11, TMC2130HeatSinkColor ],
[ 10, 3, 0, "block", 9, 1, 11, TMC2130HeatSinkColor ],
],
[]
];
test_pcb = ["TestPCB", "Test PCB",
50, 500, 1.6, // length, width, thickness
3, // Corner radius
2.75, // Mounting hole diameter
6, // Pad around mounting hole
"green",// Color
false, // True if the parts should be separate BOM items
// hole offsets
[ [3, 3], [3, -3], [-3, 3], [-3, -3] ],
// components
[
[ 10, 10, 0, "2p54header", 4, 1],
[ 25, 10, 0, "2p54header", 5, 1, undef, "blue" ],
[ 10, 20, 0, "2p54boxhdr", 4, 2],
[ 10, 30, 0, "2p54socket", 6, 1],
[ 25, 30, 0, "2p54socket", 4, 1, undef, undef, undef, "red" ],
[ 10, 40, 0, "chip", 10, 5, 1, grey20],
[ 10, 60, 180, "rj45"],
[ 8, 80, 180, "usb_A"],
[ 8, 100, 180, "usb_Ax2"],
[ 3, 120, 180, "usb_uA"],
[ 8, 140, 180, "usb_B"],
[ 10, 160, 0, "buzzer"],
[ 25, 160, 0, "buzzer", 4.5, 8.5],
[ 10, 175, 0, "potentiometer"],
[ 30, 175, 0, "potentiometer", 7, 8],
[ 8, 190, 180, "jack"],
[ 6, 200, 180, "barrel_jack"],
[ 5, 220, 180, "hdmi"],
[ 3, 240, 180, "mini_hdmi"],
[ 10, 250, 0, "flex"],
[ 10, 265, 0, "flat_flex"],
[ 10, 280, 0, "D_plug", DCONN9],
[ 10, 300, 0, "molex_hdr", 2],
[ 10, 310, 0, "jst_xh", 2],
[ 10, 320, 180, "term254", 3],
[ 20, 320, 180, "term254", 3, undef, grey20],
[ 10, 340, 180, "gterm35", 4, [1,2]],
[ 20, 340, 180, "gterm35", 4, [1,2], "red"],
[ 30, 340, 180, "gterm", gt_5x11, 3],
[ 10, 360, 180, "gterm635", 2],
[ 25, 360, 180, "gterm635", 2, undef, "blue"],
[ 40, 360, 180, "gterm", gt_5x17, 2, undef, grey20],
[ 40, 340, 180, "gterm", gt_5x17, 3, [1], "red"],
[ 10, 380, 180, "term35", 4],
[ 20, 380, 180, "term35", 3, "lime"],
[ 10, 400, 0, "transition", 5],
[ 10, 410, 0, "block", 10, 5, 8, "orange"],
[ 10, 420, 0, "button_6mm"],
[ 10, 435, 0, "microswitch", small_microswitch],
[ 12, 450, 0, "pcb", 11, TMC2130 ],
[ 12, 456, 0, "2p54socket", 8, 1 ],
[ 12, 444, 0, "2p54socket", 8, 1, undef, undef, undef, "red" ],
[ 10, 470, 0, "standoff", 5, 4.5, 12.5, 2.54],
[ 6, 480, 180, "uSD", [12, 11.5, 1.4]],
],
// accessories
[]
];
if($preview)
let($show_threads = true)
pcb(test_pcb);

View File

@@ -16,7 +16,7 @@
// You should have received a copy of the GNU General Public License along with NopSCADlib.
// If not, see <https://www.gnu.org/licenses/>.
//
include <../core.scad>
include <../utils/core/core.scad>
use <../printed/pcb_mount.scad>
PI_IO = ["PI_IO", "PI_IO V2", 35.56, 25.4, 1.6, 0, 0, 0, "green", true, [],

View File

@@ -17,11 +17,10 @@
// If not, see <https://www.gnu.org/licenses/>.
//
include <../core.scad>
use <../utils/layout.scad>
include <../vitamins/d_connectors.scad>
include <../vitamins/pcbs.scad>
use <../utils/layout.scad>
module pcbs()
layout([for(p = pcbs) pcb_width(p)], 10)
translate([0, pcb_length(pcbs[$i]) / 2])

View File

@@ -17,10 +17,9 @@
// If not, see <https://www.gnu.org/licenses/>.
//
include <../core.scad>
use <../utils/layout.scad>
include <../vitamins/screws.scad>
include <../vitamins/psus.scad>
use <../utils/layout.scad>
use <../printed/psu_shroud.scad>
thickness = 3;

View File

@@ -17,11 +17,10 @@
// If not, see <https://www.gnu.org/licenses/>.
//
include <../core.scad>
use <../utils/layout.scad>
include <../vitamins/screws.scad>
include <../vitamins/psus.scad>
use <../utils/layout.scad>
module psus()
layout([for(p = psus) psu_width(p)], 10) let(p = psus[$i])
rotate(atx_psu(p) ? 0 : 90) {

View File

@@ -17,12 +17,12 @@
// If not, see <https://www.gnu.org/licenses/>.
//
include <../core.scad>
use <../utils/layout.scad>
include <../vitamins/scs_bearing_blocks.scad>
use <../utils/layout.scad>
module scs_bearing_blocks()
layout([for(s = scs_bearing_blocks) 2 * scs_size(s)[0]]) {
layout([for(s = scs_bearing_blocks) scs_size(s).x], 10) {
part_thickness = 5;
scs_bearing_block_assembly(scs_bearing_blocks[$i], part_thickness);

39
tests/SK_brackets.scad Normal file
View File

@@ -0,0 +1,39 @@
//
// NopSCADlib Copyright Chris Palmer 2018
// nop.head@gmail.com
// hydraraptor.blogspot.com
//
// This file is part of NopSCADlib.
//
// NopSCADlib is free software: you can redistribute it and/or modify it under the terms of the
// GNU General Public License as published by the Free Software Foundation, either version 3 of
// the License, or (at your option) any later version.
//
// NopSCADlib is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
// without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
// See the GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License along with NopSCADlib.
// If not, see <https://www.gnu.org/licenses/>.
//
include <../core.scad>
include <../vitamins/sk_brackets.scad>
include <../vitamins/extrusions.scad>
use <../utils/layout.scad>
module sk_brackets() {
screws = [M4_dome_screw, M4_cap_screw, M5_cap_screw, M5_cap_screw];
nuts = [M4_hammer_nut, M4_sliding_t_nut, M5_sliding_t_nut, undef];
// channel depth = 6 for 2020 extrusion, 9 for 3030 extrusion
depths = [6, 6, 9, 0];
layout([for(s = sk_brackets) 1.5 * sk_size(s)[1]]) {
sk_bracket_assembly(sk_brackets[$i], screw_type = screws[$i], nut_type = nuts[$i], max_screw_depth = depths[$i]);
translate([0, -sk_hole_offset(sk_brackets[$i]) - extrusion_width($i < 2 ? E2020 : E3030) / 2, 0])
rotate([0, 90, 0])
extrusion($i < 2 ? E2020 : E3030, 20, false);
}
}
if($preview)
sk_brackets();

View File

@@ -17,10 +17,9 @@
// If not, see <https://www.gnu.org/licenses/>.
//
include <../core.scad>
use <../utils/layout.scad>
include <../vitamins/screws.scad>
include <../vitamins/ssrs.scad>
use <../utils/layout.scad>
use <../printed/ssr_shroud.scad>
thickness = 3;

View File

@@ -17,11 +17,10 @@
// If not, see <https://www.gnu.org/licenses/>.
//
include <../core.scad>
use <../utils/layout.scad>
include <../vitamins/screws.scad>
include <../vitamins/ssrs.scad>
use <../utils/layout.scad>
module ssrs()
layout([for(s = ssrs) ssr_width(s)], 15)
rotate(90)

View File

@@ -16,7 +16,7 @@
// You should have received a copy of the GNU General Public License along with NopSCADlib.
// If not, see <https://www.gnu.org/licenses/>.
//
include <../core.scad>
include <../utils/core/core.scad>
use <../utils/annotation.scad>
module annotations() {

View File

@@ -16,10 +16,9 @@
// You should have received a copy of the GNU General Public License along with NopSCADlib.
// If not, see <https://www.gnu.org/licenses/>.
//
include <../core.scad>
include <../utils/core/core.scad>
use <../utils/layout.scad>
include <../vitamins/springs.scad>
include <../vitamins/batteries.scad>
module batteries()

View File

@@ -18,10 +18,8 @@
//
include <../core.scad>
include <../vitamins/belts.scad>
include <../vitamins/screws.scad>
include <../vitamins/inserts.scad>
include <../vitamins/pulleys.scad>
use <../vitamins/insert.scad>
use <../utils/layout.scad>
module belt_test() {

View File

@@ -16,7 +16,7 @@
// You should have received a copy of the GNU General Public License along with NopSCADlib.
// If not, see <https://www.gnu.org/licenses/>.
//
include <../core.scad>
include <../utils/core/core.scad>
use <../utils/bezier.scad>
use <../utils/sweep.scad>
use <../utils/annotation.scad>

View File

@@ -19,7 +19,6 @@
include <../core.scad>
use <../utils/layout.scad>
include <../vitamins/screws.scad>
include <../vitamins/blowers.scad>
module blowers()

View File

@@ -18,9 +18,8 @@
//
include <../core.scad>
include <../vitamins/screws.scad>
include <../vitamins/sheets.scad>
include <../vitamins/inserts.scad>
use <../vitamins/insert.scad>
use <../printed/box.scad>

View File

@@ -16,7 +16,7 @@
// You should have received a copy of the GNU General Public License along with NopSCADlib.
// If not, see <https://www.gnu.org/licenses/>.
//
include <../core.scad>
include <../utils/core/core.scad>
use <../utils/layout.scad>
include <../vitamins/bulldogs.scad>

View File

@@ -18,9 +18,8 @@
//
include <../core.scad>
include <../vitamins/screws.scad>
include <../vitamins/sheets.scad>
include <../vitamins/inserts.scad>
use <../vitamins/insert.scad>
include <../printed/butt_box.scad>

View File

@@ -16,7 +16,7 @@
// You should have received a copy of the GNU General Public License along with NopSCADlib.
// If not, see <https://www.gnu.org/licenses/>.
//
include <../core.scad>
include <../utils/core/core.scad>
use <../utils/layout.scad>
include <../vitamins/buttons.scad>

View File

@@ -16,7 +16,7 @@
// You should have received a copy of the GNU General Public License along with NopSCADlib.
// If not, see <https://www.gnu.org/licenses/>.
//
include <../core.scad>
include <../utils/core/core.scad>
use <../printed/cable_grommets.scad>

View File

@@ -16,7 +16,7 @@
// You should have received a copy of the GNU General Public License along with NopSCADlib.
// If not, see <https://www.gnu.org/licenses/>.
//
include <../core.scad>
include <../utils/core/core.scad>
use <../vitamins/cable_strip.scad>

View File

@@ -16,7 +16,7 @@
// You should have received a copy of the GNU General Public License along with NopSCADlib.
// If not, see <https://www.gnu.org/licenses/>.
//
include <../core.scad>
include <../utils/core/core.scad>
use <../printed/carriers.scad>
module carriers()

View File

@@ -17,7 +17,7 @@
// If not, see <https://www.gnu.org/licenses/>.
//
include <../core.scad>
include <../utils/core/core.scad>
module clips() {
clip(xmin = 0, ymin = 0, zmin = 0, zmax = 40) sphere(50);

View File

@@ -19,7 +19,6 @@
include <../core.scad>
use <../utils/layout.scad>
include <../vitamins/screws.scad>
include <../vitamins/components.scad>
module resistors()

View File

@@ -19,8 +19,6 @@
include <../core.scad>
use <../printed/corner_block.scad>
include <../vitamins/screws.scad>
screws = [M2_cap_screw, M2p5_pan_screw, M3_dome_screw, M4_dome_screw];
module do_corner_block(screw)

Some files were not shown because too many files have changed in this diff Show More