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

Compare commits

...

91 Commits

Author SHA1 Message Date
Chris Palmer
2afc00cfa9 Added tongues to USB A connectors 2020-04-20 17:51:02 +01:00
Chris Palmer
84b5686af6 Corrected WD2002SJ heatsink thickness 2020-04-20 17:47:37 +01:00
Chris Palmer
71af8f98ed Added Swiss clip. 2020-04-16 00:59:27 +01:00
Chris Palmer
6cecb4d466 Added missing comment 2020-04-14 18:21:42 +01:00
Chris Palmer
4ef926a18f Added axial PCB mounted resistors. 2020-04-14 18:09:58 +01:00
Chris Palmer
5afc4f816c Added PDIP ICS and sockets. 2020-04-13 18:06:09 +01:00
Chris Palmer
5be14f5e89 Fixed bug updating the times file when case changes.
First column split of vitamins now at J.
2020-04-13 18:02:03 +01:00
Chris Palmer
efff17dfc7 Ball bearing chamfer less and 6808 hub corrected. 2020-04-11 23:46:37 +01:00
Chris Palmer
ac4a5500a9 Added chamfers and made hub and rim properties of ball_bearings. 2020-04-11 17:29:02 +01:00
Chris
6b90a7aac8 Merge pull request #72 from ledvinap/patch-1
nut_radius is needed for screw_boss_diameter
2020-04-10 12:51:39 +01:00
Chris Palmer
3c3d72f366 Merge branch 'master' of https://github.com/nophead/NopSCADlib 2020-04-10 12:41:41 +01:00
Chris Palmer
dbcab8377f LEDs can now be placed on PCBs. 2020-04-10 12:41:05 +01:00
Chris Palmer
11d96d37e1 LEDs can not be placed on PCBs. 2020-04-10 12:39:46 +01:00
Petr Ledvina
40843b421f nut_radius is needed for screw_boss_diameter
using `include <NopSCADlib/lib.scad>` in main file fails in `screw_boss_diameter`:
`WARNING: Ignoring unknown function 'nut_radius', in file ../../../sw/OpenSCAD/libraries/NopSCADlib/vitamins/screw.scad, line 41.`

Maybe my library usage is wrong, I did not investigate further ...
2020-04-09 20:33:59 +02:00
Chris Palmer
cc8f4d3bd3 Tweaked test PCB layout 2020-04-09 18:33:59 +01:00
Chris Palmer
69d6fc8bf0 PCB test now shorter and wider for better view. 2020-04-09 17:35:49 +01:00
Chris Palmer
01b1e2e84d Added WD2002SJ Buck Boost DC-DC converter PCB 2020-04-08 20:53:19 +01:00
Chris Palmer
cb64cadb92 Added gterm508. 2020-04-08 19:52:35 +01:00
Chris Palmer
b57b50d2b0 Added yet another type of green terminal that is blue. 2020-04-08 19:38:52 +01:00
Chris Palmer
8f282775a4 Fixed green terminal pin centering. 2020-04-08 19:15:38 +01:00
Chris Palmer
bf833b0452 Fixed some typos 2020-04-08 19:13:06 +01:00
Chris Palmer
52011fd6f7 Renders of dxfs now use the sheet colour. 2020-04-07 22:07:28 +01:00
Chris Palmer
9da8634769 Bom generation now calls openscad with --hardwarnings to stop ASAP. 2020-04-07 19:36:38 +01:00
Chris Palmer
147ff9b24f Added alpha parameter to stl_colour() 2020-04-07 17:02:10 +01:00
Chris Palmer
b4379907a2 Updated gallery 2020-04-06 16:21:58 +01:00
Chris Palmer
3be88f6517 Some more stl_colours. 2020-04-06 15:02:50 +01:00
Chris Palmer
d42f99e437 stl_colour() now used in tests and examples. 2020-04-06 10:27:17 +01:00
Chris Palmer
65455930f8 Reverted incorrect use of stl_colour(). 2020-04-05 18:51:21 +01:00
Chris Palmer
7e0c5fdb6e Renders of STLs are now the correct colour. Fixes #71 2020-04-05 16:18:24 +01:00
Chris Palmer
bc4e18d788 The assembly module now has a big parameter to force large or small views. 2020-04-04 12:06:14 +01:00
Chris Palmer
f5980b4703 Made the ground surfaces of steppers lighter. 2020-04-02 19:54:30 +01:00
Chris Palmer
7b3d7fab55 Fixed some more colour spellings 2020-03-29 21:36:11 +01:00
Chris Palmer
654571a70e Colour now always spelt colour except the call to color(). 2020-03-29 20:39:17 +01:00
Chris Palmer
e8abcde52f Removed the height parameter from linear_extrude 2020-03-29 20:18:57 +01:00
Chris Palmer
390957fdd0 Added MT3608 and TP4065 PCBs.
Perfboards now have their own row in the test to shorten the picture.
2020-03-28 10:54:06 +00:00
Chris Palmer
bde8cbe7a6 Added cutout for trimpot10. 2020-03-28 10:51:43 +00:00
Chris Palmer
fbe8533a42 Added function to get the height of pcb carriers. 2020-03-27 17:30:35 +00:00
Chris Palmer
a9c2f854c6 Can now have rectangular lands on PCB holes. 2020-03-27 17:29:50 +00:00
Chris Palmer
6187d90c57 Added 10 turn trimpots 2020-03-27 17:28:20 +00:00
Chris Palmer
65f320141d Added printed carriers for MT3608 and TP4056 modules. 2020-03-26 22:33:05 +00:00
Chris Palmer
d367e743da Image churn due to change of computer. 2020-03-24 17:30:10 +00:00
Chris Palmer
3a4305f5ca Nuts can now have non-standard pitch, toggle switch nut pitch fixed. 2020-03-24 17:29:29 +00:00
Chris Palmer
a7dde2d4e2 Fixed short thread bug although threads should not be that short. 2020-03-24 17:28:10 +00:00
Chris Palmer
56390bf8dd Updated big picture 2020-03-24 17:27:33 +00:00
Chris Palmer
53f0bbcd6e Fixed long SCS_bearing blocks to use two short bearings and added circlips. 2020-03-24 17:24:08 +00:00
Chris Palmer
f2ec3e71f4 Added circlips. 2020-03-24 17:22:32 +00:00
Chris Palmer
c1b5bd1b87 Added seal lip to linear_bearings. 2020-03-24 17:20:59 +00:00
Chris Palmer
268c066965 Added documentation for platters and panels in usage.md. 2020-03-15 21:11:15 +00:00
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
314 changed files with 2964 additions and 1268 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.
@@ -164,7 +164,7 @@ This is achieved by having a pair of modules: -
module handle_assembly() pose([225, 0, 150], [0, 0, 14]) //! Printed part with inserts in place
assembly("handle") {
translate_z(handle_height())
color(pp1_colour) vflip() handle_stl();
stl_colour(pp1_colour) vflip() handle_stl();
handle_screw_positions()
vflip()
@@ -233,3 +233,33 @@ 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.
### Panels and Platters
The ```stls``` and ```dxfs``` scripts produce a file for each part but often it is desirable to print or route collections of parts laid out together.
This can be done by adding scad files to folders called ```platters``` for STL files and ```panels``` for DXF files.
These can aggregate and lay out parts by including ```NopSCADlib/core.scad``` and using modules ```use_stl(name)``` and ```use_dxf(name)```.
These modules import the already generated singular STL and DXF files, so they are relatively fast. The name does not include the suffix.
The scad files typically also need to include other files from the project to get the dimensions of the parts to calculate their positions.
The composite part files have the same name as the scad file that generates them, with the suffix changed to ```.stl``` or ```.dxf```.
The generated files are placed in ```stls/printed``` and ```dxfs/routed```.
Any parts that are not covered by the platters / panels are copied into the ```printed``` / ```routed``` directories, so that they contain everything to be made.
### 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: 137 KiB

After

Width:  |  Height:  |  Size: 137 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 187 KiB

After

Width:  |  Height:  |  Size: 200 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 33 KiB

View File

@@ -1,67 +1,119 @@
[
{
"name": "base_assembly",
"big": null,
"count": 1,
"assemblies": {},
"vitamins": {
"insert(F1BM3): Heatfit insert M3": 2
"insert(F1BM3): Heatfit insert M3": {
"count": 2
}
},
"printed": {
"socket_box.stl": 1
"socket_box.stl": {
"count": 1,
"colour": "dimgrey"
}
},
"routed": {}
},
{
"name": "feet_assembly",
"big": null,
"count": 1,
"assemblies": {
"base_assembly": 1
},
"vitamins": {
"washer(M3_washer): Washer M3 x 7mm x 0.5mm": 8,
"screw(M3_dome_screw, 10): Screw M3 dome x 10mm": 4,
"nut(M3_nut, nyloc = true): Nut M3 x 2.4mm nyloc": 4
"washer(M3_washer): Washer M3 x 7mm x 0.5mm": {
"count": 8
},
"screw(M3_dome_screw, 10): Screw M3 dome x 10mm": {
"count": 4
},
"nut(M3_nut, nyloc = true): Nut M3 x 2.4mm nyloc": {
"count": 4
}
},
"printed": {
"foot.stl": 4
"foot.stl": {
"count": 4,
"colour": "darkorange"
}
},
"routed": {}
},
{
"name": "mains_in_assembly",
"big": null,
"count": 1,
"assemblies": {
"feet_assembly": 1
},
"vitamins": {
": Wire green & yellow 30/0.25mm strands, length 150mm - not shown": 1,
": Wire blue 30/0.25mm strands, length 150mm - not shown": 1,
": Wire brown 30/0.25mm strands, length 150mm - not shown": 2,
"tubing(HSHRNK32): Heatshrink sleeving ID 3.2mm x 15mm - not shown": 3,
"iec(IEC_inlet_atx): IEC inlet for ATX": 1,
"screw(M3_cs_cap_screw, 12): Screw M3 cs cap x 12mm": 2,
"washer(M3_washer): Washer M3 x 7mm x 0.5mm": 2,
"nut(M3_nut, nyloc = true): Nut M3 x 2.4mm nyloc": 2
": Wire green & yellow 30/0.25mm strands, length 150mm - not shown": {
"count": 1
},
": Wire blue 30/0.25mm strands, length 150mm - not shown": {
"count": 1
},
": Wire brown 30/0.25mm strands, length 150mm - not shown": {
"count": 2
},
"tubing(HSHRNK32): Heatshrink sleeving ID 3.2mm x 15mm - not shown": {
"count": 3
},
"iec(IEC_inlet_atx): IEC inlet for ATX": {
"count": 1
},
"screw(M3_cs_cap_screw, 12): Screw M3 cs cap x 12mm": {
"count": 2
},
"washer(M3_washer): Washer M3 x 7mm x 0.5mm": {
"count": 2
},
"nut(M3_nut, nyloc = true): Nut M3 x 2.4mm nyloc": {
"count": 2
}
},
"printed": {},
"routed": {}
},
{
"name": "main_assembly",
"big": null,
"count": 1,
"assemblies": {
"mains_in_assembly": 1
},
"vitamins": {
": Wire green & yellow 30/0.25mm strands, length 150mm - not shown": 1,
": Wire blue 30/0.25mm strands, length 150mm - not shown": 1,
"tubing(HSHRNK32): Heatshrink sleeving ID 3.2mm x 15mm - not shown": 5,
": Ferrule for 1.5mm^2 wire - not shown": 3,
"mains_socket(Contactum): Mains socket 13A": 1,
"screw(M3_cs_cap_screw, 20): Screw M3 cs cap x 20mm": 2,
"jack_4mm_shielded(\"blue\", 3, \"royalblue\"): 4mm shielded jack socket blue": 2,
"jack_4mm_shielded(\"brown\", 3, \"sienna\"): 4mm shielded jack socket brown": 1,
"jack_4mm_shielded(\"green\", 3): 4mm shielded jack socket green": 2
": Wire green & yellow 30/0.25mm strands, length 150mm - not shown": {
"count": 1
},
": Wire blue 30/0.25mm strands, length 150mm - not shown": {
"count": 1
},
"tubing(HSHRNK32): Heatshrink sleeving ID 3.2mm x 15mm - not shown": {
"count": 5
},
": Ferrule for 1.5mm^2 wire - not shown": {
"count": 3
},
"mains_socket(Contactum): Mains socket 13A": {
"count": 1
},
"screw(M3_cs_cap_screw, 20): Screw M3 cs cap x 20mm": {
"count": 2
},
"jack_4mm_shielded(\"blue\", 3, \"royalblue\"): 4mm shielded jack socket blue": {
"count": 2
},
"jack_4mm_shielded(\"brown\", 3, \"sienna\"): 4mm shielded jack socket brown": {
"count": 1
},
"jack_4mm_shielded(\"green\", 3): 4mm shielded jack socket green": {
"count": 2
}
},
"printed": {},
"routed": {}

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);
@@ -166,7 +173,7 @@ module socket_box_stl() {
//
module base_assembly()
assembly("base") {
color(pp1_colour) render() /*clip(ymax = 0)*/ socket_box_stl();
stl_colour(pp1_colour) render() /*clip(ymax = 0)*/ socket_box_stl();
mains_socket_hole_positions(socket)
translate_z(height)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 8.6 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: 286 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: 242 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 207 KiB

After

Width:  |  Height:  |  Size: 215 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 198 KiB

After

Width:  |  Height:  |  Size: 199 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.
@@ -77,7 +84,7 @@ Mains isolated and variable supply with metering.
<a name="TOP"></a>
## SunBot
A solar tracker to keep solar powerbanks pointing at the sun.
A solar tracker to keep a solar panel pointing at the sun.
![](SunBot.png)

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
@@ -51,7 +51,7 @@ $fa = 6;
$fs = extrusion_width / 2;
function round_to_layer(z) = ceil(z / layer_height) * layer_height;
// Some additional named colors
// Some additional named colours
grey20 = [0.2, 0.2, 0.2];
grey30 = [0.3, 0.3, 0.3];
grey40 = [0.4, 0.4, 0.4];

View File

@@ -23,43 +23,44 @@
include <core.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/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/scs_bearing_blocks.scad>
include <vitamins/rod.scad>
include <vitamins/leadnuts.scad>
include <vitamins/bulldogs.scad>
include <vitamins/pillars.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/swiss_clips.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/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/zipties.scad>
use <vitamins/jack.scad>
use <vitamins/meter.scad>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 786 KiB

After

Width:  |  Height:  |  Size: 787 KiB

View File

@@ -29,6 +29,7 @@ use <tests/blowers.scad>
use <tests/bulldogs.scad>
use <tests/buttons.scad>
use <tests/cable_strips.scad>
use <tests/circlips.scad>
use <tests/components.scad>
use <tests/d_connectors.scad>
use <tests/displays.scad>
@@ -38,13 +39,13 @@ 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/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>
@@ -53,23 +54,24 @@ 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/SCS_bearing_blocks.scad>
use <tests/sealing_strip.scad>
use <tests/sheets.scad>
use <tests/sk_brackets.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/swiss_clips.scad>
use <tests/toggles.scad>
use <tests/transformers.scad>
use <tests/tubings.scad>
@@ -90,17 +92,17 @@ 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/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/SSR_shroud.scad>
use <tests/PSU_shroud.scad>
x0 = 0;
x1 = x0 + 100;
x1 = x0 + 110;
x2 = x1 + 90;
x3 = x2 + 130;
x4 = x3 + 200;
@@ -147,35 +149,35 @@ translate([x5, cable_grommets_y + 250])
translate([950, 600])
box_test();
translate([890, 730])
translate([890, 750])
printed_boxes();
translate([850, 1260])
translate([850, 1330])
bbox_test();
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;
circlips_y = screws_y + 160;
springs_y = circlips_y + 20;
o_rings_y = springs_y;
sealing_strip_y = springs_y + 20;
tubings_y = sealing_strip_y + 20;
pillars_y = tubings_y + 20;
leadnuts_y = pillars_y + 40;
pulleys_y = leadnuts_y +40;
ball_bearings_y = pillars_y + 40;
pulleys_y = ball_bearings_y +40;
hot_ends_y = pulleys_y + 60;
linear_bearings_y = hot_ends_y + 50;
sheets_y = linear_bearings_y + 100;
pcbs_y = sheets_y + 40;
displays_y = pcbs_y + 150;
fans_y = displays_y + 100;
displays_y = pcbs_y + 170;
fans_y = displays_y + 80;
transformers_y = fans_y + 120;
psus_y = transformers_y + 190;
translate([x0 + 30, inserts_y])
translate([x0 + 35, inserts_y])
inserts();
translate([x0, inserts_y])
@@ -190,10 +192,13 @@ translate([x0, washers_y])
translate([x0, screws_y])
screws();
translate([x0, circlips_y])
circlips();
translate([x0, o_rings_y])
o_rings();
translate([x0, springs_y])
translate([x0 + 20, springs_y])
springs();
translate([x0 + 50, sealing_strip_y])
@@ -205,10 +210,7 @@ translate([x0, tubings_y])
translate([x0, pillars_y])
pillars();
translate([x0, leadnuts_y ])
leadnuts();
translate([x0 + 80, leadnuts_y])
translate([x0, ball_bearings_y])
ball_bearings();
translate([x0, pulleys_y])
@@ -248,7 +250,9 @@ translate([x0, psus_y]) {
}
zipties_y = 0;
bulldogs_y = zipties_y + 40;
bulldogs_y = zipties_y + 30;
swiss_clips_y = bulldogs_y + 35;
leadnuts_y = swiss_clips_y + 50;
translate([x1, zipties_y])
zipties();
@@ -256,6 +260,13 @@ translate([x1, zipties_y])
translate([x1, bulldogs_y])
bulldogs();
translate([x1, swiss_clips_y])
swiss_clips();
translate([x1, leadnuts_y])
leadnuts();
leds_y = 0;
carriers_y = leds_y + 40;
spades_y = carriers_y + 40;
@@ -366,7 +377,7 @@ 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 + 130, belts_y + 58]) {
translate([x4 + 150, belts_y + 58]) {
belt_test();
translate([0, 60])
@@ -376,9 +387,8 @@ translate([x4 + 130, belts_y + 58]) {
translate([x4, rails_y + 130])
rails();
translate([780, 0])
rotate(90)
cable_strips();
translate([800, fans_y + 50])
cable_strips();
translate([x4, kp_pillow_blocks_y])
kp_pillow_blocks();

View File

@@ -31,7 +31,7 @@
//!
//! 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>
@@ -129,7 +129,7 @@ module box_corner_profile(type) { //! Generates the corner profile STL for 3D pr
length = box_height(type) - 2 * box_margin(type);
difference() {
linear_extrude(height = length, center = true, convexity = 5)
linear_extrude(length, center = true, convexity = 5)
box_corner_profile_2D(type);
for(z = [-1, 1])
@@ -148,24 +148,24 @@ module box_corner_profile_section(type, section, sections) { //! Generates inter
difference() {
union() {
linear_extrude(height = h, convexity = 5)
linear_extrude(h, convexity = 5)
box_corner_profile_2D(type);
if(!last_section) // male end always at the top
translate_z(section_length - 1)
for(i = [0 : 1], offset = i * layer_height)
linear_extrude(height = overlap + 1 - offset)
linear_extrude(overlap + 1 - offset)
offset(1 + offset - layer_height)
offset(-overlap_wall - 1)
box_corner_profile_2D(type);
}
if(section > 0)
translate_z(last_section ? h : 0) { // female at bottom unless last section
linear_extrude(height = 2 * (overlap + layer_height), center = true, convexity = 5)
linear_extrude(2 * (overlap + layer_height), center = true, convexity = 5)
offset(-overlap_wall)
box_corner_profile_2D(type);
linear_extrude(height = 2 * layer_height, center = true, convexity = 5)
linear_extrude(2 * layer_height, center = true, convexity = 5)
offset(-overlap_wall + layer_height)
box_corner_profile_2D(type);
}
@@ -223,7 +223,7 @@ module box_bezel(type, bottom) { //! Generates top and bottom bezel STLs
// slots for side panels
//
translate_z(-box_profile_overlap(type))
linear_extrude(height = 2 * box_profile_overlap(type), center = true)
linear_extrude(2 * box_profile_overlap(type), center = true)
for(i = [-1, 1]) {
translate([i * (box_width(type) / 2 + t / 2 - sheet_slot_clearance / 2), 0])
square([t, box_depth(type) - 2 * box_corner_gap(type)], center = true);
@@ -240,7 +240,7 @@ module box_bezel(type, bottom) { //! Generates top and bottom bezel STLs
// leave plastic over the corner profiles
//
translate_z(-box_profile_overlap(type) - 1)
linear_extrude(height = box_profile_overlap(type) + box_corner_gap(type) + 2)
linear_extrude(box_profile_overlap(type) + box_corner_gap(type) + 2)
union() {
difference() {
square([box_width(type) - 2 * box_inset(type),
@@ -273,7 +273,7 @@ module box_bezel_section(type, bottom, rows, cols, x, y) { //! Generates interlo
end_clearance = 0.5;
module male() {
rotate([90, 0, 90])
linear_extrude(height = dowel_length - 2 * end_clearance, center = true)
linear_extrude(dowel_length - 2 * end_clearance, center = true)
difference() {
union() {
h = dh - layer_height;

View File

@@ -33,7 +33,7 @@ assembly("box") {
y = [-1,-1,1,1][corner];
translate([x * (box_width(type) / 2 + 25 * exploded()), y * (box_depth(type) / 2 + 25 * exploded())])
rotate(corner * 90) {
color(pp2_colour) render()
stl_colour(pp2_colour) render()
box_corner_profile(type);
translate([box_hole_inset(type), box_hole_inset(type)])
@@ -50,7 +50,7 @@ assembly("box") {
translate_z(z * (box_height(type) / 2 - box_corner_gap(type) + 50 * exploded()))
rotate([z * 90 - 90, 0, 0])
if(bezels && (z > 0 ? top : base))
color(pp1_colour) render() box_bezel(type, z < 0);
stl_colour(pp1_colour) render() box_bezel(type, z < 0);
translate_z(z * (box_height(type) / 2 + sheet_thickness + 50 * exploded()))
box_screw_hole_positions(type)

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;
@@ -59,7 +59,7 @@ module ribbon_grommet(ways, thickness) { //! Generate the STL for a printed ribb
union() {
for(side = [-1, 1])
translate_z(side * (width - wall) / 2)
linear_extrude(height = wall, center = true, convexity = 5)
linear_extrude(wall, center = true, convexity = 5)
difference() {
hull() {
translate([-length / 2, 0])
@@ -73,7 +73,7 @@ module ribbon_grommet(ways, thickness) { //! Generate the STL for a printed ribb
square([slot_length, slot_height]);
}
linear_extrude(height = width -1, center = true)
linear_extrude(width -1, center = true)
difference() {
ribbon_grommet_hole(ways, expand = false, h = 0);
@@ -133,12 +133,12 @@ module round_grommet_hole(diameter, h = 100) //! Make a hole for a round grommet
drill(corrected_radius(diameter / 2) + wall + clearance, h);
module round_grommet_assembly(diameter, thickness, od = undef) {
color(pp1_colour)
stl_colour(pp1_colour)
translate_z(wall)
vflip()
round_grommet_top(diameter, thickness, od);
color(pp2_colour)
stl_colour(pp2_colour)
translate_z(-thickness)
vflip()
round_grommet_bottom(diameter, od);
@@ -170,14 +170,14 @@ module mouse_grommet(r, thickness) { //! Make the STL for a mouse grommet
union() {
for(side = [-1, 1])
translate_z(side * (width - wall) / 2)
linear_extrude(height = wall, center = true)
linear_extrude(wall, center = true)
difference() {
mouse_grommet_hole(r, z = r + wall, h = 0, expand = wall + overlap);
translate([0, wall])
mouse_grommet_hole(r, h = 0, expand = 0);
}
linear_extrude(height = width - 1, center = true)
linear_extrude(width - 1, center = true)
difference() {
mouse_grommet_hole(r, h = 0, z = r + wall, expand = wall);
@@ -188,7 +188,7 @@ module mouse_grommet(r, thickness) { //! Make the STL for a mouse grommet
}
module mouse_grommet_assembly(r, thickness)
color(pp1_colour)
stl_colour(pp1_colour)
rotate([-90, 0, 0])
mouse_grommet(r, thickness);

View File

@@ -18,11 +18,13 @@
//
//
//! Adapts ESP12 module to 0.1" grid. See <https://hydraraptor.blogspot.com/2018/04/esp-12-module-breakout-adaptor.html>.
//! Adapts ESP12 modules and various small PCBs to 0.1" grid. See <https://hydraraptor.blogspot.com/2018/04/esp-12-module-breakout-adaptor.html>.
//
$extrusion_width = 0.5;
include <../core.scad>
include <../utils/core/core.scad>
function carrier_height() = 3; //! Height of PCB carrier
module ESP12F_carrier_stl() { //! Generate the STL for an ESP12 carrier
stl("ESP12F_carrier");
@@ -33,7 +35,7 @@ module ESP12F_carrier_stl() { //! Generate the STL for an ESP12 carrier
hole2 = pitch2 - 3 * extrusion_width;
length1 = (pins - 1) * pitch1 + hole + squeezed_wall * 2;
length2 = (pins - 1) * pitch2 + hole + squeezed_wall * 2;
height = 3;
height = carrier_height();
wpitch1 = (pins - 1) * pitch1;
wpitch2 = ceil(wpitch1 / 2.54) * 2.54;
@@ -61,3 +63,71 @@ module ESP12F_carrier_stl() { //! Generate the STL for an ESP12 carrier
}
}
}
module TP4056_carrier_stl() { //! Generate the STL for an TP4056 carrier, two required
stl("TP4056_carrier");
pitch = 2.54;
outer_pitch = 13.9;
inner_pitch = 7.54;
hole = pitch - 3 * extrusion_width;
pins = 6;
length1 = outer_pitch + hole + squeezed_wall * 2;
length2 = (pins - 1) * pitch + hole + squeezed_wall * 2;
height = carrier_height();
width = hole + squeezed_wall * 2;
spacing = inch(0.9);
difference() {
hull() {
translate_z(height - eps / 2)
cube([width, length1, eps], center = true);
translate_z(eps / 2)
cube([width, length2, eps], center = true);
}
for(i = [0 : pins - 1])
let(x = [-outer_pitch / 2, - inner_pitch / 2, 0, 0, inner_pitch / 2, outer_pitch / 2][i])
if(x)
hull() {
translate([0, x, height])
cube([hole, hole, eps], center = true);
translate([0, i * pitch - (pins - 1) * pitch / 2])
cube([hole, hole, eps], center = true);
}
}
}
module MT3608_carrier_stl() { //! Generate the STL for an MT3608 carrier, two required
stl("MT3608_carrier");
pcb_width = 17;
w_pitch_top = 6.81;
w_pitch_bot = inch(0.3);
l_pitch_top = 30.855;
l_pitch_bot = inch(1.2);
hole = 1;
height = carrier_height();
wall = 2 * extrusion_width;
width = hole + 2 * wall;
offset = (l_pitch_top - l_pitch_bot) / 2;
difference() {
hull() {
translate([offset, 0, height - eps / 2])
rounded_rectangle([width, pcb_width - 2, eps], 1);
translate_z(eps / 2)
rounded_rectangle([width, pcb_width - 2, eps], 1);
}
for(side = [-1, 1])
hull() {
translate([offset, side * w_pitch_top / 2, height])
cube([hole, hole, eps], center = true);
translate([0, side * w_pitch_bot / 2])
cube([hole, hole, eps], center = true);
}
}
}

View File

@@ -31,7 +31,6 @@
//! Star washers can be omitted by setting ```star_washers``` to false.
//
include <../core.scad>
include <../vitamins/screws.scad>
use <../vitamins/insert.scad>
use <../utils/rounded_cylinder.scad>
use <../utils/maths.scad>
@@ -121,7 +120,7 @@ module corner_block_assembly(screw = def_screw, name = false) //! The printed bl
assembly(str("corner_block_M", 20 * screw_radius(screw))) {
insert = screw_insert(screw);
color(name ? pp2_colour : pp1_colour)
stl_colour(name ? pp2_colour : pp1_colour)
render() corner_block(screw, name) children();
corner_block_h_holes(screw)

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;
@@ -61,7 +60,7 @@ module door_hinge(door_thickness) { //! Generates STL fo
union() {
rotate([90, 0, 0])
linear_extrude(height = width, center = true)
linear_extrude(width, center = true)
difference() {
hull() {
translate([dia / 2, thickness + door_thickness / 2])
@@ -77,7 +76,7 @@ module door_hinge(door_thickness) { //! Generates STL fo
translate([dia / 2, thickness + door_thickness / 2])
teardrop(r = screw_clearance_radius(pin_screw), h = 0);
}
linear_extrude(height = thickness)
linear_extrude(thickness)
difference() {
hull() {
translate([0, -width / 2])
@@ -109,7 +108,7 @@ module door_hinge_stat_stl() { //! Generates the STL for the stationary part
stl("door_hinge_stat");
union() {
linear_extrude(height = thickness)
linear_extrude(thickness)
difference() {
rounded_square([stat_length, stat_width], rad);
@@ -118,7 +117,7 @@ module door_hinge_stat_stl() { //! Generates the STL for the stationary part
}
rotate([90, 0, 0])
linear_extrude(height = stat_width, center = true)
linear_extrude(stat_width, center = true)
difference() {
hull() {
translate([0, dia / 2 + stat_clearance])
@@ -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);
stl_colour(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();
stl_colour(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();
stl_colour(pp1_colour) render() door_latch_stl();
translate_z(nut_trap_depth)
vflip()

View File

@@ -31,7 +31,6 @@
//! Star washers can be omitted by setting ```star_washers``` to false.
//
include <../core.scad>
include <../vitamins/screws.scad>
use <../vitamins/insert.scad>
use <../utils/maths.scad>
@@ -82,7 +81,7 @@ module fixing_block(screw = def_screw) { //! Generate the STL
difference() {
union() {
linear_extrude(height = fb_height, convexity = 5)
linear_extrude(fb_height, convexity = 5)
difference() {
hull() {
for(side = [-1, 1]) {
@@ -110,7 +109,7 @@ module fixing_block_assembly(screw = def_screw) pose([55, 180, 25], [0, 4.8, 4.8
assembly(str("fixing_block_M", 20 * screw_radius(screw))) {
translate_z(fixing_block_height(screw))
rotate([0, 180, 0])
color(pp1_colour) render() fixing_block(screw);
stl_colour(pp1_colour) render() fixing_block(screw);
insert = screw_insert(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
@@ -83,7 +82,7 @@ module hinge_male(type, female = false) { //! The half with the stationary
teardrop_r = kr / cos(22.5); // The corner on the teardrop
inset = sqrt(sqr(teardrop_r + gap) - sqr(kr - t)) - kr;
linear_extrude(height =t)
linear_extrude(t)
difference() {
hull() {
for(side = [-1, 1])
@@ -103,7 +102,7 @@ module hinge_male(type, female = false) { //! The half with the stationary
rotate([90, 0, -90])
for(z = [0 : (female ? fn : mn) - 1])
translate_z(-dir * w / 2 + z * dir * pitch + (female ? -fw - mw - gap : 0))
linear_extrude(height = female ? fw : mw)
linear_extrude(female ? fw : mw)
difference() {
hull() {
rotate(180)
@@ -134,17 +133,17 @@ assembly(str("hinge_", type[0])) { //! Assembled hinge
vitamin(str(": Hinge pin ", w, " x ", 2 * hr, "mm"));
color(pp1_colour) hinge_male(type);
stl_colour(pp1_colour) hinge_male(type);
translate([0, -kr, kr]) {
rotate([0, 90, 0])
explode(w + 10)
color("silver") cylinder(r = hr , h = w, center = true);
stl_colour("silver") cylinder(r = hr , h = w, center = true);
rotate([-angle, 0, 0])
translate([0, -kr, -kr])
rotate(180)
color(pp2_colour) hinge_female(type);
stl_colour(pp2_colour) hinge_female(type);
}
}

View File

@@ -22,7 +22,6 @@
//! inserts don't grip well in rubber.
//
include <../core.scad>
include <../vitamins/screws.scad>
use <../vitamins/insert.scad>
foot = [25, 12, 3, 2, M4_cap_screw, 10];
@@ -57,7 +56,7 @@ module foot(type = foot) { //! Generate STL
circle4n(r);
}
}
linear_extrude(height = t)
linear_extrude(t)
difference() {
circle(r1 + eps);
@@ -74,7 +73,7 @@ module foot_assembly(t = 0, type = foot, flip = false) { //! Assembly with faste
screw_length = screw_longer_than(foot_thickness(type) + t + 2 * washer_thickness(washer) + nut_thickness(nut, true) - squeeze);
vflip() explode(15, true) {
color(pp4_colour) foot(type);
stl_colour(pp4_colour) foot(type);
if(t)
explode(15, true)
@@ -117,7 +116,7 @@ module insert_foot(type = insert_foot) { //! Generate STL for foot with insert
}
}
}
linear_extrude(height = h2 + eps)
linear_extrude(h2 + eps)
difference() {
circle(r5 + eps);
@@ -137,7 +136,7 @@ assembly("insert_foot") {
insert = screw_insert(screw);
vflip()
color(pp1_colour) insert_foot(type);
stl_colour(pp4_colour) insert_foot(type);
translate_z(-foot_thickness(type))
insert(insert);

View File

@@ -21,7 +21,6 @@
//! Printed handle that can be printed without needing support material due to its truncated teardrop profile.
//
include <../core.scad>
include <../vitamins/screws.scad>
use <../vitamins/insert.scad>
dia = 18;
@@ -84,7 +83,7 @@ module handle_stl() { //! generate the STL
module handle_assembly() pose([225, 0, 150], [0, 0, 14]) //! Printed part with inserts in place
assembly("handle") {
translate_z(handle_height())
color(pp1_colour) vflip() handle_stl();
stl_colour(pp1_colour) vflip() handle_stl();
handle_screw_positions()
vflip()

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;
@@ -63,7 +62,7 @@ module pcb_mount_ring()
}
module pcb_mount_washer_stl() //! A plastic washer to clamp a PCB
linear_extrude(height = washer_thickness)
linear_extrude(washer_thickness)
pcb_mount_ring();
module pcb_mount(pcb, height = 5, washers = true) { //! Make the STL of a pcb mount for the specified PCB.
@@ -86,10 +85,10 @@ module pcb_mount(pcb, height = 5, washers = true) { //! Make the STL of a pcb mo
cube([pillar_x_pitch(pcb) - 2 * wall, frame_w, frame_t], center = true);
pcb_mount_screw_positions(pcb)
linear_extrude(height = height)
linear_extrude(height)
pcb_mount_ring();
linear_extrude(height = height + pcb_thickness(pcb) - layer_height)
linear_extrude(height + pcb_thickness(pcb) - layer_height)
difference() {
pcb_mount_screw_positions(pcb)
pcb_mount_ring();
@@ -102,7 +101,7 @@ module pcb_mount_assembly(pcb, thickness, height = 5) { //! A PCB mount assembly
translate_z(height)
pcb(pcb);
color(pp1_colour) pcb_mount(pcb, washers = false);
stl_colour(pp1_colour) pcb_mount(pcb, washers = false);
washer = screw_washer(screw);
nut = screw_nut(screw);
@@ -111,7 +110,7 @@ module pcb_mount_assembly(pcb, thickness, height = 5) { //! A PCB mount assembly
pcb_mount_screw_positions(pcb) {
translate_z(height + t) {
color(pp2_colour) pcb_mount_washer_stl();
stl_colour(pp2_colour) pcb_mount_washer_stl();
translate_z(washer_thickness)
screw(screw, screw_length);

View File

@@ -27,7 +27,6 @@
//! It can also have printed feet on the base with the screws doubling up to hold the base on.
//
include <../core.scad>
include <../vitamins/screws.scad>
use <../vitamins/insert.scad>
use <foot.scad>
@@ -130,7 +129,7 @@ module pbox_base(type) { //! Generate the STL for the base
t = pbox_base(type);
difference() {
union() {
linear_extrude(height = t)
linear_extrude(t)
offset(base_outset - 0.2)
pbox_inner_shape(type);
@@ -158,7 +157,7 @@ module pbox(type) { //! Generate the STL for the main case
difference() {
union() {
linear_extrude(height = total_height)
linear_extrude(total_height)
offset(wall / 2) pbox_mid_shape(type);
if($children > 2)
@@ -167,11 +166,11 @@ module pbox(type) { //! Generate the STL for the main case
difference() {
translate_z(top_thickness)
union() {
linear_extrude(height = height + eps)
linear_extrude(height + eps)
offset(-wall / 2) pbox_mid_shape(type);
translate_z(height) // Recess for the base
linear_extrude(height = total_height - height)
linear_extrude(total_height - height)
offset(base_outset)
pbox_inner_shape(type);
}
@@ -182,11 +181,11 @@ module pbox(type) { //! Generate the STL for the main case
rounded_rectangle([pbox_width(type) + 2 * outset, pbox_depth(type) + 2 * outset, ledge_h], 1, center = false);
hull() {
linear_extrude(height = ledge_h + eps)
linear_extrude(ledge_h + eps)
offset(ledge_inset)
pbox_inner_shape(type);
linear_extrude(height = eps)
linear_extrude(eps)
offset(ledge_outset)
pbox_inner_shape(type);
}
@@ -222,7 +221,7 @@ module pbox_base_screws(type, thickness = 0) //! Place the screws and
pbox_screw_positions(type) {
foot = pbox_foot(type);
if(foot)
color(pp4_colour)
stl_colour(pp4_colour)
foot(foot);
translate_z(foot ? foot_thickness(foot) : thickness)

View File

@@ -22,7 +22,6 @@
//! 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>
use <../vitamins/insert.scad>
use <../vitamins/wire.scad>
@@ -114,21 +113,21 @@ module psu_shroud(type, cable_d, name, cables = 1) { //! Generate the STL file f
translate([centre_x, -centre_y]) {
rounded_rectangle([depth - eps, width - eps, top], rad, center = false);
linear_extrude(height = height)
linear_extrude(height)
difference() {
shape();
translate([depth / 2, width / 2 - 5])
square([2 * (depth - extent + terminal_clearance), 10], center = true);
}
linear_extrude(height = height - terminal_block_height(tb) - psu_terminal_block_z(type) - terminal_clearance)
linear_extrude(height - terminal_block_height(tb) - psu_terminal_block_z(type) - terminal_clearance)
shape();
}
// cable slots
for(i = [0 : 1 : cables - 1])
translate([centre_x - depth / 2 + wall / 2, -centre_y + (i - cables / 2 + 0.5) * psu_shroud_cable_pitch(cable_d), height / 2])
rotate([90, 0, 90])
linear_extrude(height = wall, center = true)
linear_extrude(wall, center = true)
difference() {
square([cable_d + eps, height], center = true);
@@ -144,11 +143,11 @@ 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()
color(pp1_colour) psu_shroud(type, cable_d, name, cables);
stl_colour(pp1_colour) psu_shroud(type, cable_d, name, cables);
psu_shroud_hole_positions(type)
vflip()

View File

@@ -21,7 +21,6 @@
//! Clamp for ribbon cable and polypropylene strip.
//
include <../core.scad>
include <../vitamins/screws.scad>
use <../vitamins/insert.scad>
use <../vitamins/cable_strip.scad>
@@ -84,7 +83,7 @@ module ribbon_clamp_assembly(ways) pose([55, 180, 25]) //! Printed part with in
assembly(str("ribbon_clamp_", ways)) {
h = ribbon_clamp_height();
color(pp1_colour) render()
stl_colour(pp1_colour) render()
translate_z(h) vflip() ribbon_clamp(ways);
ribbon_clamp_hole_positions(ways)

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;
@@ -49,7 +48,7 @@ module screw_knob(screw) { //! Generate the STL for a knob to fit the specified
rotate(45)
circle(r = nut_trap_radius(screw_nut(screw)), $fn = 6);
}
linear_extrude(height = knob_thickness, convexity = 3)
linear_extrude(knob_thickness, convexity = 3)
difference() {
polygon(points = [for(a = [0 : 359]) [wave(a) * sin(a), wave(a) * cos(a)]]);
@@ -63,7 +62,7 @@ module screw_knob_assembly(screw, length) //! Assembly with the screw in place
assembly(str("screw_knob_M", 20 * screw_radius(screw), "_", length)) {
translate_z(knob_height)
vflip()
color(pp1_colour) screw_knob(screw);
stl_colour(pp1_colour) screw_knob(screw);
translate_z(knob_height - knob_nut_trap_depth(screw))
rotate(-45)

View File

@@ -22,9 +22,8 @@
//
include <../core.scad>
include <../vitamins/mains_sockets.scad>
include <../vitamins/screws.scad>
use <../vitamins/insert.scad>
include <../vitamins/ring_terminals.scad>
use <../vitamins/insert.scad>
box_height = 19;
base_thickness = 2;
@@ -53,12 +52,12 @@ module socket_box(type) { //! Generate STL of the backbox for the specified sock
insert_hole_radius = insert_hole_radius(insert);
difference() {
linear_extrude(height = height, convexity = 5)
linear_extrude(height, convexity = 5)
face_plate(type);
difference() {
translate_z(base_thickness)
linear_extrude(height = height, convexity = 5)
linear_extrude(height, convexity = 5)
offset(-wall) offset(1) face_plate(type);
for(side = [-1, 1])
@@ -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);
stl_colour(pp1_colour) render() socket_box(type);
mains_socket_hole_positions(type)
translate_z(height)

View File

@@ -19,10 +19,9 @@
//
//! 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>
use <../vitamins/insert.scad>
use <../vitamins/wire.scad>
@@ -74,7 +73,7 @@ module ssr_shroud(type, cable_d, name) { //! Generate the STL file for a spec
translate([center_x, 0]) {
rounded_rectangle([depth - eps, width - eps, top], rad, center = false);
linear_extrude(height = height) difference() {
linear_extrude(height) difference() {
round(or = wall / 2 - eps, ir = 0) difference() {
rounded_square([depth, width], rad);
@@ -92,7 +91,7 @@ module ssr_shroud(type, cable_d, name) { //! Generate the STL file for a spec
for(side = [-1, 1])
translate([cable_x, side * (width / 2 - wall / 2), height / 2])
rotate([90, 0, 0])
linear_extrude(height = wall, center = true)
linear_extrude(wall, center = true)
difference() {
square([cable_d + eps, height], center = true);
@@ -108,11 +107,11 @@ 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()
color(pp1_colour) ssr_shroud(type, cable_d, name);
stl_colour(pp1_colour) ssr_shroud(type, cable_d, name);
ssr_shroud_hole_positions(type)
insert(insert);
@@ -136,7 +135,7 @@ module ssr_shroud_fastened_assembly(type, cable_d, thickness, name) //! Assembly
*translate_z(cable_d / 2)
rotate([90, 0, 0])
color(grey20)
stl_colour(grey20)
cylinder(d = cable_d, h = 20, center = true);
}
}

View File

@@ -22,7 +22,6 @@
//! be fully customised by passing a list of properties.
//
include <../core.scad>
include <../vitamins/screws.scad>
use <../vitamins/insert.scad>
strap = [18, 2, M3_pan_screw, 3, 25];
@@ -78,7 +77,7 @@ module strap(length, type = strap) { //! Generate the STL for the rubber strap
len = length - 2 * (wall + clearance);
w = strap_width(type);
linear_extrude(height = strap_thickness(type), convexity = 3)
linear_extrude(strap_thickness(type), convexity = 3)
difference() {
rounded_square([len, w], w / 2 - eps);
@@ -120,12 +119,12 @@ module strap_end(type = strap) { //! Generate the STL for end piece
}
union() {
linear_extrude(height = z1)
linear_extrude(z1)
with_hole()
outer();
translate_z(z1)
linear_extrude(height = strap_height(type) - z1)
linear_extrude(strap_height(type) - z1)
difference() {
outer();
@@ -138,11 +137,11 @@ module strap_end(type = strap) { //! Generate the STL for end piece
}
}
linear_extrude(height = strap_height(type) - layer_height)
linear_extrude(strap_height(type) - layer_height)
with_hole()
strap_boss_shape(type);
linear_extrude(height = z2)
linear_extrude(z2)
with_hole()
offset(cnc_bit_r)
offset(-step - cnc_bit_r)
@@ -161,7 +160,7 @@ module strap_end(type = strap) { //! Generate the STL for end piece
//
module strap_end_assembly(type = strap)
assembly("strap_end") {
color(pp1_colour)
stl_colour(pp1_colour)
strap_end(type);
translate_z(strap_height(type) + strap_key(type))
@@ -176,7 +175,7 @@ module strap_assembly(length, type = strap) { //! Assembly with screws in place
screw_length = screw_shorter_than(washer_thickness(washer) + washer_thickness(penny) + insert_length(insert) + panel_clearance + counterbore);
color(pp4_colour) strap(length, type);
stl_colour(pp4_colour) strap(length, type);
strap_screw_positions(length, type)
translate_z(strap_height(type))

517
readme.md
View File

@@ -17,41 +17,77 @@ 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 = "#Pcb">Pcb</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 = "#Pcbs">Pcbs</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 = "#Pillars">Pillars</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 = "#Pin_headers">Pin_headers</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 = "#Psus">Psus</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 = "#Pulleys">Pulleys</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 = "#Rails">Rails</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 = "#Ring_terminals">Ring_terminals</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 = "#Rockers">Rockers</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 = "#Rod">Rod</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 = "#Screws">Screws</a> </td><td> <a href = "#Printed_box">Printed_box</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 = "#Scs_bearing_blocks">Scs_bearing_blocks</a> </td><td> <a href = "#Psu_shroud">Psu_shroud</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 = "#Sealing_strip">Sealing_strip</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 = "#Sheets">Sheets</a> </td><td> <a href = "#Screw_knob">Screw_knob</a> </td><td></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 = "#Kp_pillow_blocks">Kp_pillow_blocks</a> </td><td> <a href = "#Ssrs">Ssrs</a> </td><td></td><td></td><td></td></tr>
<tr><td> <a href = "#Ldrs">Ldrs</a> </td><td> <a href = "#Stepper_motors">Stepper_motors</a> </td><td></td><td></td><td></td></tr>
<tr><td> <a href = "#Leadnuts">Leadnuts</a> </td><td> <a href = "#Toggles">Toggles</a> </td><td></td><td></td><td></td></tr>
<tr><td> <a href = "#Leds">Leds</a> </td><td> <a href = "#Transformers">Transformers</a> </td><td></td><td></td><td></td></tr>
<tr><td> <a href = "#Light_strips">Light_strips</a> </td><td> <a href = "#Tubings">Tubings</a> </td><td></td><td></td><td></td></tr>
<tr><td> <a href = "#Linear_bearings">Linear_bearings</a> </td><td> <a href = "#Variacs">Variacs</a> </td><td></td><td></td><td></td></tr>
<tr><td> <a href = "#Mains_sockets">Mains_sockets</a> </td><td> <a href = "#Veroboard">Veroboard</a> </td><td></td><td></td><td></td></tr>
<tr><td> <a href = "#Meter">Meter</a> </td><td> <a href = "#Washers">Washers</a> </td><td></td><td></td><td></td></tr>
<tr><td> <a href = "#Microswitches">Microswitches</a> </td><td> <a href = "#Wire">Wire</a> </td><td></td><td></td><td></td></tr>
<tr><td> <a href = "#Microview">Microview</a> </td><td> <a href = "#Zipties">Zipties</a> </td><td></td><td></td><td></td></tr>
<tr><td> <a href = "#Modules">Modules</a> </td><td></td><td></td><td></td><td></td></tr>
<th align="left"> Vitamins A-I </th><th align="left"> Vitamins J-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 = "#Axials">Axials</a> </td><td> <a href = "#Jack">Jack</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 = "#Ball_bearings">Ball_bearings</a> </td><td> <a href = "#KP_pillow_blocks">KP_pillow_blocks</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 = "#Batteries">Batteries</a> </td><td> <a href = "#LDRs">LDRs</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 = "#Belts">Belts</a> </td><td> <a href = "#LEDs">LEDs</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 = "#Blowers">Blowers</a> </td><td> <a href = "#Leadnuts">Leadnuts</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 = "#Bulldogs">Bulldogs</a> </td><td> <a href = "#Light_strips">Light_strips</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 = "#Buttons">Buttons</a> </td><td> <a href = "#Linear_bearings">Linear_bearings</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 = "#Cable_strips">Cable_strips</a> </td><td> <a href = "#Mains_sockets">Mains_sockets</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 = "#Circlips">Circlips</a> </td><td> <a href = "#Meter">Meter</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 = "#Components">Components</a> </td><td> <a href = "#Microswitches">Microswitches</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 = "#DIP">DIP</a> </td><td> <a href = "#Microview">Microview</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 = "#D_connectors">D_connectors</a> </td><td> <a href = "#Modules">Modules</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 = "#Displays">Displays</a> </td><td> <a href = "#Nuts">Nuts</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 = "#Extrusion_brackets">Extrusion_brackets</a> </td><td> <a href = "#O_ring">O_ring</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 = "#Extrusions">Extrusions</a> </td><td> <a href = "#Opengrab">Opengrab</a> </td><td> <a href = "#Swiss_clips">Swiss_clips</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 = "#Fans">Fans</a> </td><td> <a href = "#PCB">PCB</a> </td><td> <a href = "#Toggles">Toggles</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 = "#Fuseholder">Fuseholder</a> </td><td> <a href = "#PCBs">PCBs</a> </td><td> <a href = "#Transformers">Transformers</a> </td><td> <a href = "#SSR_shroud">SSR_shroud</a> </td><td></td><td></td></tr>
<tr><td> <a href = "#Geared_steppers">Geared_steppers</a> </td><td> <a href = "#PSUs">PSUs</a> </td><td> <a href = "#Tubings">Tubings</a> </td><td> <a href = "#Screw_knob">Screw_knob</a> </td><td></td><td></td></tr>
<tr><td> <a href = "#Green_terminals">Green_terminals</a> </td><td> <a href = "#Pillars">Pillars</a> </td><td> <a href = "#Variacs">Variacs</a> </td><td> <a href = "#Socket_box">Socket_box</a> </td><td></td><td></td></tr>
<tr><td> <a href = "#Hot_ends">Hot_ends</a> </td><td> <a href = "#Pin_headers">Pin_headers</a> </td><td> <a href = "#Veroboard">Veroboard</a> </td><td> <a href = "#Strap_handle">Strap_handle</a> </td><td></td><td></td></tr>
<tr><td> <a href = "#Hygrometer">Hygrometer</a> </td><td> <a href = "#Pulleys">Pulleys</a> </td><td> <a href = "#Washers">Washers</a> </td><td></td><td></td><td></td></tr>
<tr><td> <a href = "#IECs">IECs</a> </td><td></td><td> <a href = "#Wire">Wire</a> </td><td></td><td></td><td></td></tr>
<tr><td> <a href = "#Inserts">Inserts</a> </td><td></td><td> <a href = "#Zipties">Zipties</a> </td><td></td><td></td><td></td></tr>
</table>
---
<a name="Axials"></a>
## Axials
Axial components for PCBs.
[vitamins/axials.scad](vitamins/axials.scad) Object definitions.
[vitamins/axial.scad](vitamins/axial.scad) Implementation.
[tests/axials.scad](tests/axials.scad) Code for this example.
### Properties
| Function | Description |
|:--- |:--- |
| ```ax_res_colour(type)``` | Body colour |
| ```ax_res_diameter(type)``` | Body diameter |
| ```ax_res_end_d(type)``` | End cap diameter |
| ```ax_res_end_l(type)``` | End cap length |
| ```ax_res_length(type)``` | Body length |
| ```ax_res_wattage(type)``` | Power rating |
| ```ax_res_wire(type)``` | Wire diameter |
### Modules
| Module | Description |
|:--- |:--- |
| ```ax_res(type, value, tol = 5, pitch = 0)``` | Through hole axial resistor. If ```pitch``` is zero the minimum is used. If below the minimum the resistor is placed vertical. |
| ```wire_link(d, l, h = 1)``` | Draw a wire jumper link. |
![axials](tests/png/axials.png)
### Vitamins
| Qty | Module call | BOM entry |
| ---:|:--- |:---|
| 1 | ```pcb(PERF60x40)``` | Perfboard 60 x 40mm |
| 1 | ```ax_res(res1_8, 1000)``` | Resistor 1000 Ohms 5% 0.125W |
| 1 | ```ax_res(res1_8, 2200, tol = 1)``` | Resistor 2200 Ohms 1% 0.125W |
| 1 | ```ax_res(res1_4, 39000, tol = 1)``` | Resistor 39000 Ohms 1% 0.25W |
| 1 | ```ax_res(res1_4, 47000)``` | Resistor 47000 Ohms 5% 0.25W |
| 1 | ```ax_res(res1_2, 8200)``` | Resistor 8200 Ohms 5% 0.5W |
| 1 | ```ax_res(res1_2, 8250, tol = 1)``` | Resistor 8250 Ohms 1% 0.5W |
<a href="#top">Top</a>
---
<a name="Ball_bearings"></a>
## Ball_bearings
@@ -75,14 +111,11 @@ Also single bearing balls are modelled as just a silver sphere and a BOM entry.
| ```bb_bore(type)``` | Internal diameter |
| ```bb_colour(type)``` | Shield colour, "silver" for metal |
| ```bb_diameter(type)``` | External diameter |
| ```bb_hub(type)``` | Inner rim thickness guesstimate |
| ```bb_name(type)``` | Part code without shield type suffix |
| ```bb_rim(type)``` | Outer rim thickness guesstimate |
| ```bb_width(type)``` | Width |
### Functions
| Function | Description |
|:--- |:--- |
| ```bb_rim(type)``` | Inner and outer rim thickness |
### Modules
| Module | Description |
|:--- |:--- |
@@ -98,7 +131,8 @@ Also single bearing balls are modelled as just a silver sphere and a BOM entry.
| 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 |
| 4 | ``` bearing_ball(3)``` | Steel ball 3mm |
| 1 | ```ball_bearing(BB6808)``` | Ball bearing 6808-2RS 40mm x 52mm x 7mm |
| 5 | ``` bearing_ball(3)``` | Steel ball 3mm |
<a href="#top">Top</a>
@@ -395,6 +429,48 @@ When the sides are constrained then a circular model is more accurate.
| 3 | ```cable_strip(20, 25, 100, 30)``` | Polypropylene strip 189mm x 24mm x 0.8mm |
<a href="#top">Top</a>
---
<a name="Circlips"></a>
## Circlips
Circlips aka tapered retaining rings.
[vitamins/circlips.scad](vitamins/circlips.scad) Object definitions.
[vitamins/circlip.scad](vitamins/circlip.scad) Implementation.
[tests/circlips.scad](tests/circlips.scad) Code for this example.
### Properties
| Function | Description |
|:--- |:--- |
| ```circlip_a(type)``` | Size of the lugs |
| ```circlip_b(type)``` | Widest part of the taper |
| ```circlip_d1(type)``` | Nominal OD, i.e. diameter of tube |
| ```circlip_d2(type)``` | Groove diameter, i.e. OD when installed |
| ```circlip_d3(type)``` | Relaxed OD when not installed |
| ```circlip_d5(type)``` | Plier hole diameter |
| ```circlip_thickness(type)``` | Thickness |
### Modules
| Module | Description |
|:--- |:--- |
| ```internal_circlip(type, open = 0)``` | Draw specified internal circlip, open = 0, for nominal size installed, 1 for relaxed uninstalled, -1 for squeezed to install |
![circlips](tests/png/circlips.png)
### Vitamins
| Qty | Module call | BOM entry |
| ---:|:--- |:---|
| 3 | ```circlip(circlip_12i)``` | Circlip internal 12mm |
| 3 | ```circlip(circlip_15i)``` | Circlip internal 15mm |
| 3 | ```circlip(circlip_19i)``` | Circlip internal 19mm |
| 3 | ```circlip(circlip_21i)``` | Circlip internal 21mm |
| 3 | ```circlip(circlip_28i)``` | Circlip internal 28mm |
<a href="#top">Top</a>
---
@@ -540,6 +616,50 @@ D-connectors. Can be any number of ways, male or female, solder buckets, PCB mou
| 6 | ```d_pillar()``` | D-type connector pillar |
<a href="#top">Top</a>
---
<a name="DIP"></a>
## DIP
Dual inline IC packages and sockets
[vitamins/dip.scad](vitamins/dip.scad) Implementation.
[tests/DIP.scad](tests/DIP.scad) Code for this example.
### Properties
| Function | Description |
|:--- |:--- |
| ```pdip_pin_W(type)``` | Pin shoulder width |
| ```pdip_pin_h(type)``` | Pin height |
| ```pdip_pin_n(type)``` | Pin neck |
| ```pdip_pin_s(type)``` | Height above seating plane |
| ```pdip_pin_t(type)``` | Pin thickness |
| ```pdip_pin_w(type)``` | Pin width |
### Modules
| Module | Description |
|:--- |:--- |
| ```dip(n, part, size, w, pitch, pin)``` | Draw DIP package |
| ```pdip(pins, part, socketed, w = inch(0.3)``` | Draw standard 0.1" PDIP IC package |
| ```pdip_pin(type, l, end)``` | Draw a pin |
![dip](tests/png/dip.png)
### Vitamins
| Qty | Module call | BOM entry |
| ---:|:--- |:---|
| 1 | ```dil_socket(14, 7.62)``` | DIL socket 28 x 0.3" |
| 1 | ```pdip(14, 74HC00)``` | IC 74HC00 PDIP14 |
| 1 | ```pdip(20, 74HC245)``` | IC 74HC245 PDIP20 |
| 1 | ```pdip(28, ATMEGA328)``` | IC ATMEGA328 PDIP28 |
| 1 | ```pdip(8, NE555)``` | IC NE555 PDIP8 |
| 1 | ```pdip(6, OPTO)``` | IC OPTO PDIP6 |
| 1 | ```pdip(16, ULN2003)``` | IC ULN2003 PDIP16 |
| 1 | ```pdip(18, ULN2803)``` | IC ULN2803 PDIP18 |
<a href="#top">Top</a>
---
@@ -676,14 +796,15 @@ Aluminium extrusion.
### 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>
@@ -859,6 +980,7 @@ Parametric green terminal blocks
| ```gt_back_depth(type)``` | Back ledge depth |
| ```gt_back_height(type)``` | Height at the back |
| ```gt_box_h(type)``` | Height of the cable entry box |
| ```gt_box_setback(type)``` | How far the contact box is set back from the front |
| ```gt_box_w(type)``` | Width inside the cable entry box |
| ```gt_depth(type)``` | Total front to back depth |
| ```gt_front_depth(type)``` | Front ledge depth |
@@ -870,13 +992,12 @@ Parametric green terminal blocks
| ```gt_top(type)``` | Depth at the top |
| ```gt_tube_h(type)``` | Height of optional tubes around the screws |
| ```gt_y_offset(type)``` | Offset of the pins from centre of the depth |
| ```gt_y_offset2(type)``` | Offset of the pins screws from the screws |
| ```gt_y_offset2(type)``` | Offset of the pins from the screws |
### Modules
| 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)
@@ -884,8 +1005,9 @@ Parametric green terminal blocks
| Qty | Module call | BOM entry |
| ---:|:--- |:---|
| 1 | ```green_terminal(gt_6p35, 2)``` | Terminal block 2 way 0.25" |
| 1 | ```green_terminal(gt_3p5, 3)``` | Terminal block 3 way 3.5mm |
| 1 | ```green_terminal(gt_2p54, 4)``` | Terminal block 4 way 0.1" |
| 1 | ```green_terminal(gt_5p08, 3)``` | Terminal block 3 way 0.2" |
| 1 | ```green_terminal(gt_3p5, 4)``` | Terminal block 4 way 3.5mm |
| 1 | ```green_terminal(gt_2p54, 5)``` | Terminal block 5 way 0.1" |
<a href="#top">Top</a>
@@ -986,8 +1108,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.
@@ -995,7 +1117,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 |
@@ -1142,8 +1264,8 @@ E.g. a "brown" socket for mains live needs to be displayed as "sienna" to look r
<a href="#top">Top</a>
---
<a name="Kp_pillow_blocks"></a>
## Kp_pillow_blocks
<a name="KP_pillow_blocks"></a>
## KP_pillow_blocks
KP pillow block bearings
@@ -1151,7 +1273,7 @@ KP pillow block bearings
[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.
[tests/KP_pillow_blocks.scad](tests/KP_pillow_blocks.scad) Code for this example.
### Properties
| Function | Description |
@@ -1195,8 +1317,8 @@ KP pillow block bearings
<a href="#top">Top</a>
---
<a name="Ldrs"></a>
## Ldrs
<a name="LDRs"></a>
## LDRs
Light dependent resistors.
Larger ones seem to have both a higher dark resistance and a lower bright light resistance.
@@ -1206,7 +1328,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 |
@@ -1286,8 +1408,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.
@@ -1295,7 +1417,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 |
@@ -1697,8 +1819,12 @@ If a nut is given a child then it gets placed on its top surface.
### Properties
| Function | Description |
|:--- |:--- |
| ```nut_pitch(type)``` | Pitch if not standard metric course thread |
| ```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 |
@@ -1715,6 +1841,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 |
@@ -1733,18 +1860,23 @@ If a nut is given a child then it gets placed on its top surface.
| 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 | ```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 |
@@ -1817,14 +1949,14 @@ A permanent magnet that can be magnatized and de-magnatized electronically.
<a href="#top">Top</a>
---
<a name="Pcb"></a>
## Pcb
<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/pcb.scad](vitamins/pcb.scad) Implementation.
[tests/pcb.scad](tests/pcb.scad) Code for this example.
[tests/PCB.scad](tests/PCB.scad) Code for this example.
### Properties
| Function | Description |
@@ -1863,7 +1995,7 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
| Module | Description |
|:--- |:--- |
| ```barrel_jack(cutout = false)``` | Draw barrel power jack |
| ```buzzer(height, diameter, colour)``` | Draw PCB buzzer with specified height, diameter and color |
| ```buzzer(height, diameter, colour)``` | Draw PCB buzzer with specified height, diameter and colour |
| ```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 |
@@ -1881,7 +2013,9 @@ 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 |
| ```standoff(h, d, h2, d2)``` | Draw a standoff |
| ```terminal_35(ways, colour = "blue")``` | Draw 3.5mm terminal block |
| ```trimpot10(vertical, cutout = false)``` | Draw a ten turn trimpot |
| ```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 |
@@ -1893,14 +2027,50 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
### Vitamins
| Qty | Module call | BOM entry |
| ---:|:--- |:---|
| 1 | ```box_header(2p54header, 4, 2, smt = 0)``` | Box header 4 x 2 |
| 1 | ```d_plug(DCONN9, pcb = true)``` | D-type 9 way PCB mount plug |
| 1 | ```dil_socket(12, 15.24)``` | DIL socket 24 x 0.6" |
| 1 | ```hdmi(hdmi_full)``` | HDMI socket |
| 1 | ```pdip(24, 27C32, w = 15.24)``` | IC 27C32 PDIP24 |
| 1 | ```pdip(8, NE555)``` | IC NE555 PDIP8 |
| 1 | ```idc_transition(2p54header, 5)``` | IDC transition header 5 x 2 |
| 1 | ```led(LED10mm, "yellow")``` | LED 10 mm yellow |
| 1 | ```led(LED3mm)``` | LED 3 mm red |
| 1 | ```led(LED5mm, "orange")``` | LED 5 mm orange |
| 1 | ```microswitch(small_microswitch)``` | Microswitch DM1-00P-110-3 |
| 1 | ```hdmi(hdmi_mini)``` | Mini HDMI socket |
| 1 | ```molex_254(2)``` | Molex KK header 2 way |
| 1 | ```pin_header(2p54header, 4, 1, smt = 0)``` | Pin header 4 x 1 |
| 1 | ```pin_header(2p54header, 5, 1, smt = undef)``` | Pin header 5 x 1 |
| 1 | ```pin_socket(2p54header, 4, 1, right_angle = undef, height = undef, smt = undef)``` | Pin socket 4 x 1 |
| 1 | ```pin_socket(2p54header, 6, 1)``` | Pin socket 6 x 1 |
| 1 | ```pin_socket(2p54header, 8, 1)``` | Pin socket 8 x 1 |
| 1 | ```pin_socket(2p54header, 8, 1, right_angle = undef, height = undef, smt = undef)``` | Pin socket 8 x 1 |
| 1 | ```ax_res(res1_2, 10, tol = 10)``` | Resistor 10 Ohms 10% 0.5W |
| 1 | ```ax_res(res1_4, 100, tol = 2)``` | Resistor 100 Ohms 2% 0.25W |
| 1 | ```ax_res(res1_8, 1000)``` | Resistor 1000 Ohms 5% 0.125W |
| 1 | ```ax_res(res1_4, 10000)``` | Resistor 10000 Ohms 5% 0.25W |
| 1 | ```ax_res(res1_2, 100000)``` | Resistor 100000 Ohms 5% 0.5W |
| 1 | ```ax_res(res1_8, 1e+6, tol = 1)``` | Resistor 1e+6 Ohms 1% 0.125W |
| 1 | ```square_button(button_6mm)``` | Square button 6mm |
| 1 | ```pcb(TMC2130)``` | TMC2130 |
| 1 | ```green_terminal(gt_5p08, 2)``` | Terminal block 2 way 0.2" |
| 2 | ```green_terminal(gt_6p35, 2)``` | Terminal block 2 way 0.25" |
| 1 | ```green_terminal(gt_5x17, 2)``` | Terminal block 2 way 5mm |
| 2 | ```green_terminal(gt_2p54, 3)``` | Terminal block 3 way 0.1" |
| 1 | ```terminal_35(3)``` | Terminal block 3 way 3.5mm |
| 1 | ```green_terminal(gt_5x11, 3)``` | Terminal block 3 way 5mm |
| 1 | ```green_terminal(gt_5x17, 3)``` | Terminal block 3 way 5mm |
| 2 | ```green_terminal(gt_3p5, 4)``` | Terminal block 4 way 3.5mm |
| 1 | ```terminal_35(4)``` | Terminal block 4 way 3.5mm |
| 1 | ```pcb(TestPCB)``` | Test PCB |
<a href="#top">Top</a>
---
<a name="Pcbs"></a>
## Pcbs
<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.
@@ -1908,7 +2078,7 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
[vitamins/pcb.scad](vitamins/pcb.scad) Implementation.
[tests/pcbs.scad](tests/pcbs.scad) Code for this example.
[tests/PCBs.scad](tests/PCBs.scad) Code for this example.
### Properties
| Function | Description |
@@ -1947,7 +2117,7 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
| Module | Description |
|:--- |:--- |
| ```barrel_jack(cutout = false)``` | Draw barrel power jack |
| ```buzzer(height, diameter, colour)``` | Draw PCB buzzer with specified height, diameter and color |
| ```buzzer(height, diameter, colour)``` | Draw PCB buzzer with specified height, diameter and colour |
| ```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 |
@@ -1965,7 +2135,9 @@ 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 |
| ```standoff(h, d, h2, d2)``` | Draw a standoff |
| ```terminal_35(ways, colour = "blue")``` | Draw 3.5mm terminal block |
| ```trimpot10(vertical, cutout = false)``` | Draw a ten turn trimpot |
| ```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 |
@@ -1983,17 +2155,18 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
| 1 | ```d_plug(DCONN15, pcb = true)``` | D-type 15 way PCB mount plug |
| 1 | ```pcb(DuetE)``` | Duet 2 Ethernet electronics |
| 1 | ```pcb(Duex2)``` | Duex2 expansion board |
| 1 | ```pcb(Duex5)``` | Duex5 expasnion board |
| 1 | ```pcb(Duex5)``` | Duex5 expansion board |
| 1 | ```pcb(EnviroPlus)``` | Enviro+ |
| 1 | ```pcb(ExtruderPCB)``` | Extruder connection PCB |
| 1 | ```pcb(Keyes5p1)``` | Keyes5.1 Arduino Uno expansion board |
| 1 | ```pcb(MT3608)``` | MT3608 boost converter module |
| 1 | ```pcb(Melzi)``` | Melzi electronics |
| 4 | | Micro SD card |
| 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 |
| 12 | ```nut(M3_nut, nyloc = true)``` | Nut M3 x 2.4mm nyloc |
| 30 | ```nut(M2p5_nut, nyloc = true)``` | Nut M2.5 x 2.2mm nyloc |
| 16 | ```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 |
| 1 | ```pcb(PSU12V1A)``` | PSU 12V 1A |
@@ -2006,45 +2179,52 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
| 1 | ```pcb(RAMPSEndstop)``` | RAMPS Endstop Switch |
| 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 |
| 12 | ```screw(M2p5_cap_screw, 20)``` | Screw M2.5 cap x 20mm |
| 12 | ```screw(M2_cap_screw, 16)``` | Screw M2 cap x 16mm |
| 4 | ```screw(M2_cap_screw, 20)``` | Screw M2 cap x 20mm |
| 2 | ```screw(M2p5_cap_screw, 16)``` | Screw M2.5 cap x 16mm |
| 4 | ```screw(M2p5_cap_screw, 20)``` | Screw M2.5 cap x 20mm |
| 4 | ```screw(M2p5_cap_screw, 25)``` | Screw M2.5 cap x 25mm |
| 4 | ```screw(M2p5_cap_screw, 30)``` | Screw M2.5 cap x 30mm |
| 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 |
| 12 | ```screw(M2p5_pan_screw, 25)``` | Screw M2.5 pan x 25mm |
| 4 | ```screw(M3_cap_screw, 16)``` | Screw M3 cap x 16mm |
| 8 | ```screw(M3_cap_screw, 30)``` | Screw M3 cap x 30mm |
| 4 | ```screw(M3_cap_screw, 35)``` | Screw M3 cap x 35mm |
| 12 | ```screw(M4_cap_screw, 35)``` | Screw M4 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 |
| 1 | ```pcb(TP4056)``` | TP4056 Li-lon Battery charger module |
| 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 |
| 1 | ```pcb(WD2002SJ)``` | WD2002SJ Buck Boost DC-DC converter |
| 16 | ```washer(M2_washer)``` | Washer M2 x 5mm x 0.3mm |
| 32 | ```washer(M2p5_washer)``` | Washer M2.5 x 5.9mm x 0.5mm |
| 12 | ```washer(M3_washer)``` | Washer M3 x 7mm x 0.5mm |
| 30 | ```washer(M2p5_washer)``` | Washer M2.5 x 5.9mm x 0.5mm |
| 16 | ```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 |
### Printed
| Qty | Filename |
| ---:|:--- |
| 4 | pcb_spacer20140.stl |
| 4 | pcb_spacer20150.stl |
| 4 | pcb_spacer20160.stl |
| 4 | pcb_spacer20170.stl |
| 4 | pcb_spacer2060.stl |
| 4 | pcb_spacer2070.stl |
| 4 | pcb_spacer2080.stl |
| 4 | pcb_spacer2090.stl |
| 4 | pcb_spacer25100.stl |
| 4 | pcb_spacer25110_2.stl |
| 4 | pcb_spacer25120_2.stl |
| 4 | pcb_spacer25110.stl |
| 4 | pcb_spacer25120.stl |
| 4 | pcb_spacer25130_2.stl |
| 4 | pcb_spacer25240.stl |
| 4 | pcb_spacer2550.stl |
| 4 | pcb_spacer2580.stl |
| 4 | pcb_spacer2590.stl |
| 4 | pcb_spacer30180.stl |
| 4 | pcb_spacer30190.stl |
| 4 | pcb_spacer30230.stl |
| 4 | pcb_spacer25140_2.stl |
| 4 | pcb_spacer25150_2.stl |
| 4 | pcb_spacer25180.stl |
| 2 | pcb_spacer2570.stl |
| 4 | pcb_spacer30160.stl |
| 4 | pcb_spacer30170.stl |
| 4 | pcb_spacer30220.stl |
| 4 | pcb_spacer3050.stl |
| 4 | pcb_spacer40190.stl |
| 4 | pcb_spacer40200.stl |
| 4 | pcb_spacer40210.stl |
| 4 | pcb_spacer40220.stl |
<a href="#top">Top</a>
@@ -2146,8 +2326,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.
@@ -2157,7 +2337,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 |
@@ -2171,6 +2351,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 |
@@ -2334,10 +2515,10 @@ Linear rails with carriages.
### Modules
| Module | Description |
|:--- |:--- |
| ```carriage(type, rail, end_color = grey20, wiper_color = grey20)``` | Draw the specified carriage |
| ```carriage(type, rail, end_colour = grey20, wiper_colour = grey20)``` | Draw the specified carriage |
| ```carriage_hole_positions(type)``` | Position children over screw holes |
| ```rail(type, length)``` | Draw the specified rail |
| ```rail_assembly(type, length, pos, carriage_end_color = grey20, carriage_wiper_color = grey20)``` | Rail and carriage assembly |
| ```rail_assembly(type, length, pos, carriage_end_colour = grey20, carriage_wiper_colour = grey20)``` | Rail and carriage assembly |
| ```rail_hole_positions(type, length, first = 0, screws = 100, both_ends = true)``` | Position children over screw holes |
| ```rail_screws(type, length, thickness, screws = 100)``` | Place screws in the rail |
@@ -2599,8 +2780,8 @@ 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
@@ -2608,7 +2789,7 @@ SCSnUU and SCSnLUU bearing blocks
[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 |
@@ -2616,10 +2797,12 @@ SCSnUU and SCSnLUU bearing blocks
| ```scs_bearing(type)``` | Linear bearing used |
| ```scs_block_center_height(type)``` | Height of the center of the block |
| ```scs_block_side_height(type)``` | Height of the side of the block, this determines the minimum screw length |
| ```scs_circlip(type)``` | Circlip used |
| ```scs_hole_offset(type)``` | Offset of bearing hole from base of block |
| ```scs_screw(type)``` | Screw type |
| ```scs_screw_separation_x(type)``` | Screw separation in X direction |
| ```scs_screw_separation_z(type)``` | Screw separation in Z direction |
| ```scs_spacer(type)``` | Spacer used in long bearings |
### Functions
| Function | Description |
@@ -2694,7 +2877,7 @@ The "Soft" parameter can be used to determinesif the sheet material needs machin
* If soft, wood screws will be used, with a pilot hole.
* If not soft, either tapped holes or a clearance hole and nuts will be used to retain screws.
The "Color" parameter is a quad-array: [R, G, B, Alpha], or can be a named color, see [OpenSCAD_User_Manual](https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/The_OpenSCAD_Language#color).
The "Colour" parameter is a quad-array: [R, G, B, Alpha], or can be a named colour, see [OpenSCAD_User_Manual](https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/The_OpenSCAD_Language#color).
For speed sheets should be modelled in 2D by subtracting holes from 2D templates made by ```sheet_2D()``` and then extruded to 3D with ```render_2D_sheet()```.
Note that modules that drill holes will return a 2D object if ```h``` is set to 0 to facilitate this.
@@ -2716,8 +2899,8 @@ Note that modules that drill holes will return a 2D object if ```h``` is set to
### Modules
| Module | Description |
|:--- |:--- |
| ```render_2D_sheet(type, color = false)``` | Extrude a 2D sheet template and give it the correct colour |
| ```render_sheet(type, color = false)``` | Render a sheet in the correct colour after holes have been subtracted |
| ```render_2D_sheet(type, colour = false)``` | Extrude a 2D sheet template and give it the correct colour |
| ```render_sheet(type, colour = false)``` | Render a sheet in the correct colour after holes have been subtracted |
| ```sheet(type, w, d, corners = [0, 0, 0, 0])``` | Draw specified sheet |
| ```sheet_2D(type, w, d, corners = [0, 0, 0, 0])``` | 2D sheet template with specified size and optionally rounded corners |
@@ -2749,8 +2932,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
@@ -2758,7 +2941,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 |
@@ -2932,8 +3115,8 @@ By default springs have their origin at the bottom but can be centered.
<a href="#top">Top</a>
---
<a name="Ssrs"></a>
## Ssrs
<a name="SSRs"></a>
## SSRs
Solid state relays.
@@ -2941,7 +3124,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 |
@@ -3032,6 +3215,55 @@ NEMA stepper motor model.
| 15 | ```star_washer(M3_washer)``` | Washer star M3 x 0.5mm |
<a href="#top">Top</a>
---
<a name="Swiss_clips"></a>
## Swiss_clips
Swiss picture clip.
Used for holding glass on 3D printer beds.
The bending model is an approximation because in real life the arms bend.
Should be reasonably accurate if not close to fully open.
[vitamins/swiss_clips.scad](vitamins/swiss_clips.scad) Object definitions.
[vitamins/swiss_clip.scad](vitamins/swiss_clip.scad) Implementation.
[tests/Swiss_clips.scad](tests/Swiss_clips.scad) Code for this example.
### Properties
| Function | Description |
|:--- |:--- |
| ```sclip_arm_length(type)``` | Length of arms |
| ```sclip_arm_width(type)``` | Width of spring arms |
| ```sclip_height(type)``` | External height |
| ```sclip_hinge_offset(type)``` | Offset of hinge |
| ```sclip_hook(type)``` | hook, length, width |
| ```sclip_length(type)``` | Total external length |
| ```sclip_max_gap(type)``` | Maximum opening |
| ```sclip_radius(type)``` | Bend radius |
| ```sclip_spigot(type)``` | Spigot length, width, height |
| ```sclip_thickness(type)``` | Thickness of the metal |
| ```sclip_width(type)``` | Width |
### Modules
| Module | Description |
|:--- |:--- |
| ```swiss_clip(type, open = 0.9)``` | Draw a Swiss clip open by specified amount |
| ```swiss_clip_hole(type, open, h = 0)``` | Drill hole for spigot |
![swiss_clips](tests/png/swiss_clips.png)
### Vitamins
| Qty | Module call | BOM entry |
| ---:|:--- |:---|
| 1 | ```sheet(AL6, 40, 20, 1)``` | Aluminium tooling plate 40mm x 20mm x 6mm |
| 1 | ```sheet(glass2, 40, 20, 1)``` | Sheet glass 40mm x 20mm x 2mm |
| 2 | ```swiss_clip(UKPFS1008_10)``` | Swiss picture clip UKPFS1008_10 11mm |
<a href="#top">Top</a>
---
@@ -3437,7 +3669,7 @@ Just a BOM entry at the moment and cable bundle size functions for holes, plus c
| ```cable_tie_holes(cable_r, h = 100)``` | Holes to thread a ziptie through a panel to make a cable tie. |
| ```mouse_hole(cable, h = 100, teardrop = false)``` | A mouse hole to allow a panel to go over a wire bundle. |
| ```ribbon_cable(ways, length)``` | Add ribbon cable to the BOM |
| ```wire(color, strands, length, strand = 0.2)``` | Add stranded wire to the BOM |
| ```wire(colour, strands, length, strand = 0.2)``` | Add stranded wire to the BOM |
![wire](tests/png/wire.png)
@@ -3744,17 +3976,24 @@ of conductive panels, an extra layer of insulation.
---
<a name="Carriers"></a>
## Carriers
Adapts ESP12 module to 0.1" grid. See <https://hydraraptor.blogspot.com/2018/04/esp-12-module-breakout-adaptor.html>.
Adapts ESP12 modules and various small PCBs to 0.1" grid. See <https://hydraraptor.blogspot.com/2018/04/esp-12-module-breakout-adaptor.html>.
[printed/carriers.scad](printed/carriers.scad) Implementation.
[tests/carriers.scad](tests/carriers.scad) Code for this example.
### Functions
| Function | Description |
|:--- |:--- |
| ```carrier_height()``` | Height of PCB carrier |
### Modules
| Module | Description |
|:--- |:--- |
| ```ESP12F_carrier_stl()``` | Generate the STL for an ESP12 carrier |
| ```MT3608_carrier_stl()``` | Generate the STL for an MT3608 carrier, two required |
| ```TP4056_carrier_stl()``` | Generate the STL for an TP4056 carrier, two required |
![carriers](tests/png/carriers.png)
@@ -3762,6 +4001,8 @@ Adapts ESP12 module to 0.1" grid. See <https://hydraraptor.blogspot.com/2018/04/
| Qty | Filename |
| ---:|:--- |
| 1 | ESP12F_carrier.stl |
| 1 | MT3608_carrier.stl |
| 1 | TP4056_carrier.stl |
<a href="#top">Top</a>
@@ -4250,15 +4491,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 |
@@ -4379,15 +4620,15 @@ It can also have printed feet on the base with the screws doubling up to hold th
<a href="#top">Top</a>
---
<a name="Psu_shroud"></a>
## Psu_shroud
<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 |
@@ -4431,9 +4672,9 @@ The stl and assembly must be given a name and parameterless wrappers for the stl
### Assemblies
| Qty | Name |
| ---:|:--- |
| 1 | psu_shroud_PD_150_12_assembly |
| 1 | psu_shroud_S_250_48_assembly |
| 1 | psu_shroud_S_300_12_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>
@@ -4581,15 +4822,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 |
@@ -4629,8 +4870,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>
@@ -4845,6 +5086,7 @@ Maths utilities for manipulating vectors and matrices.
| ```euler(R)``` | Convert a rotation matrix to a Euler rotation vector. |
| ```identity(n, x = 1)``` | Construct an arbitrary size identity matrix |
| ```reverse(v)``` | Reverse a vector |
| ```rot3_z(a)``` | Generate a 3x3 matrix to rotate around z |
| ```rotate(a, v)``` | Generate a 4x4 rotation matrix, ```a``` can be a vector of three angles or a single angle around ```z```, or around axis ```v``` |
| ```scale(v)``` | Generate a 4x4 matrix that scales by ```v```, which can be a vector of xyz factors or a scalar to scale all axes equally |
| ```transform(v, m)``` | Apply 4x4 transform to a 3 vector by extending it and cropping it again |
@@ -5054,7 +5296,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.
@@ -5104,18 +5346,22 @@ Simple tube or ring
<a href="#top">Top</a>
---
<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.
<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.
The example below shows how to define a vitamin and incorporate it into an assembly with sub-assemblies and make an exploded view. The resulting flat BOM is shown but
heirachical BOMs are also generated for real projects.
Assembly views shown in the instructions can be large or small and this is deduced by looking at the size of the printed parts involved and if any routed
parts are used.
This heuristic isn't always correct, so the default can be overridden by setting the ```big``` parameter of ```assembly``` to ```true``` or ```false```.
The example below shows how to define a vitamin and incorporate it into an assembly with sub-assemblies and make an exploded view.
The resulting flat BOM is shown but 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 |
@@ -5129,7 +5375,7 @@ heirachical BOMs are also generated for real projects.
### Modules
| Module | Description |
|:--- |:--- |
| ```assembly(name)``` | Name an assembly that will appear on the BOM, there needs to a module named ```<name>_assembly``` to make it |
| ```assembly(name, big = undef)``` | Name an assembly that will appear on the BOM, there needs to a module named ```<name>_assembly``` to make it. ```big``` can force big or small assembly diagrams. |
| ```dxf(name)``` | Name a dxf that will appear on the BOM, there needs to a module named ```<name>_dxf``` to make it |
| ```explode(d, explode_children = false, offset = [0,0,0])``` | Explode children by specified Z distance or vector ```d```, option to explode grand children |
| ```hidden()``` | Make item invisible, except on the BOM |
@@ -5140,6 +5386,7 @@ heirachical BOMs are also generated for real projects.
| ```pose_hflip(exploded = undef)``` | Pose an STL or assembly for rendering to png by flipping around the Y axis, ```exploded = true for``` just the exploded view or ```false``` for unexploded only. |
| ```pose_vflip(exploded = undef)``` | Pose an STL or assembly for rendering to png by flipping around the X axis, ```exploded = true for``` just the exploded view or ```false``` for unexploded only. |
| ```stl(name)``` | Name an stl that will appear on the BOM, there needs to a module named ```<name>_stl``` to make it |
| ```stl_colour(colour = pp1_colour, alpha = 1)``` | Colour an stl where it is placed in an assembly. ```alpha``` can be used to make it appear transparent. |
| ```vitamin(description)``` | Describe a vitamin for the BOM entry and precede it with a module call that creates it, eg. "wigit(42): Type 42 widget" |
![bom](tests/png/bom.png)

View File

@@ -29,6 +29,7 @@ import openscad
from time import *
from set_config import *
import json
import re
def find_scad_file(mname):
for filename in os.listdir(source_dir):
@@ -45,9 +46,20 @@ def find_scad_file(mname):
return filename
return None
class Part:
def __init__(self, args):
self.count = 1
for arg in args:
arg = arg.replace('true', 'True').replace('false', 'False').replace('undef', 'None')
exec('self.' + arg)
def data(self):
return self.__dict__
class BOM:
def __init__(self, name):
self.name = name
self.big = None
self.count = 1
self.vitamins = {}
self.printed = {}
@@ -60,14 +72,20 @@ class BOM:
assemblies[ass] = self.assemblies[ass].count
return {
"name" : self.name,
"big" : self.big,
"count" : self.count,
"assemblies" : assemblies,
"vitamins" : self.vitamins,
"printed" : self.printed,
"routed" : self.routed
"vitamins" : {v : self.vitamins[v].data() for v in self.vitamins},
"printed" : {p : self.printed[p].data() for p in self.printed},
"routed" : {r : self.routed[r].data() for r in self.routed}
}
def add_part(self, s):
args = []
match = re.match(r'^(.*?\.stl|.*?\.dxf)\((.*)\)$', s) #look for name.stl(...) or name.dxf(...)
if match:
s = match.group(1)
args = [match.group(2)]
if s[-4:] == ".stl":
parts = self.printed
else:
@@ -76,15 +94,19 @@ class BOM:
else:
parts = self.vitamins
if s in parts:
parts[s] += 1
parts[s].count += 1
else:
parts[s] = 1
parts[s] = Part(args)
def add_assembly(self, ass):
def add_assembly(self, ass, args = []):
if ass in self.assemblies:
self.assemblies[ass].count += 1
else:
self.assemblies[ass] = BOM(ass)
bom = BOM(ass)
for arg in args:
arg = arg.replace('true', 'True').replace('false', 'False').replace('undef', 'None')
exec('bom.' + arg, locals())
self.assemblies[ass] = bom
def make_name(self, ass):
if self.count == 1:
@@ -119,10 +141,10 @@ class BOM:
for ass in sorted(self.assemblies):
bom = self.assemblies[ass]
if part in bom.vitamins:
file.write("%2d|" % bom.vitamins[part])
file.write("%2d|" % bom.vitamins[part].count)
else:
file.write(" |")
print("%3d" % self.vitamins[part], description, file=file)
print("%3d" % self.vitamins[part].count, description, file=file)
if self.printed:
if self.vitamins:
@@ -133,10 +155,10 @@ class BOM:
for ass in sorted(self.assemblies):
bom = self.assemblies[ass]
if part in bom.printed:
file.write("%2d|" % bom.printed[part])
file.write("%2d|" % bom.printed[part].count)
else:
file.write(" |")
print("%3d" % self.printed[part], part, file=file)
print("%3d" % self.printed[part].count, part, file=file)
if self.routed:
print(file=file)
@@ -146,10 +168,10 @@ class BOM:
for ass in sorted(self.assemblies):
bom = self.assemblies[ass]
if part in bom.routed:
file.write("%2d|" % bom.routed[part])
file.write("%2d|" % bom.routed[part].count)
else:
file.write(" |")
print("%3d" % self.routed[part], part, file=file)
print("%3d" % self.routed[part].count, part, file=file)
if self.assemblies:
print(file=file)
@@ -161,17 +183,22 @@ def parse_bom(file = "openscad.log", name = None):
main = BOM(name)
main.ordered_assemblies = []
stack = []
prog = re.compile(r'^(.*)\((.*)\)$')
for line in open(file):
pos = line.find('ECHO: "~')
if pos > -1:
s = line[pos + 8 : line.rfind('"')]
if s[-1] == '{':
ass = s[:-1]
args = []
match = prog.match(ass) #look for (...)
if match:
ass = match.group(1)
args = match.group(2).split(',')
if stack:
main.assemblies[stack[-1]].add_assembly(ass) #add to nested BOM
stack.append(ass)
main.add_assembly(ass) #add to flat BOM
main.add_assembly(ass, args) #add to flat BOM
if ass in main.ordered_assemblies:
main.ordered_assemblies.remove(ass)
main.ordered_assemblies.insert(0, ass)
@@ -184,10 +211,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 +248,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", "--hardwarnings", "-o", "openscad.echo", "-d", bom_dir + "/bom.deps", bom_maker_name)
os.remove(bom_maker_name)
print("Generating bom ...", end=" ")
@@ -236,11 +270,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'
@@ -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,12 +94,11 @@ 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, source_dir + '/printed', lib_dir]:
if os.path.isdir(dir):
for dir in source_dirs(bom_dir):
if targets and os.path.isdir(dir):
for filename in os.listdir(dir):
if filename[-5:] == ".scad":
if targets and filename[-5:] == ".scad":
#
# find any modules ending in _<part_type>
#
@@ -102,13 +112,6 @@ def make_parts(target, part_type, parts = None):
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
@@ -119,15 +122,21 @@ def make_parts(target, part_type, parts = None):
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)
os.remove(part_maker_name)
#
# Write new bounds file
#
@@ -139,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

@@ -29,18 +29,39 @@ import openscad
from tests import do_cmd, update_image, colour_scheme, background
from deps import mtime
from colorama import init
import json
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)
#
# Read the json bom to get the colours
#
bom_file = bom_dir + "/bom.json"
with open(bom_file) as json_file:
flat_bom = json.load(json_file)
things = { 'stl' : 'printed', 'dxf' : 'routed' }[type]
colours = {}
for ass in flat_bom:
for part in ass[things]:
obj = ass[things][part]
if "colour" in obj:
colours[part] = obj["colour"]
#
# Remove unused png files
#
@@ -49,7 +70,9 @@ def render(target, type):
if not file[:-4] + '.' + type in parts:
print("Removing %s" % file)
os.remove(target_dir + '/' + file)
#
# Render the parts
#
for part in parts:
part_file = target_dir + '/' + part
png_name = target_dir + '/' + part[:-4] + '.png'
@@ -58,10 +81,16 @@ def render(target, type):
#
if mtime(part_file) > mtime(png_name):
png_maker_name = "png.scad"
pp1 = [0, 146/255, 0]
colour = pp1
if part in colours:
colour = colours[part]
if not '[' in colour:
colour = '"' + colour + '"'
with open(png_maker_name, "w") as f:
f.write('color("lime") import("%s");\n' % part_file)
f.write('color(%s) import("%s");\n' % (colour, 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"
render = "--preview" if type == 'stl' or colour != pp1 else "--render"
tmp_name = 'tmp.png'
openscad.run(colour_scheme, "--projection=p", "--imgsize=4096,4096", cam, render, "--autocenter", "--viewall", "-o", tmp_name, png_maker_name);
do_cmd(("magick "+ tmp_name + " -trim -resize 280x280 -background %s -gravity Center -extent 280x280 -bordercolor %s -border 10 %s"
@@ -71,6 +100,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 = "AJR" + 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,7 +198,7 @@ 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)
@@ -222,14 +232,23 @@ def tests(tests):
j = name.find(']]') + 2
name = name.replace(name[i : j], '[ ... ]')
desc = vit[1]
body += ['| %3d | %s | %s |' % (things[item], name, desc)]
body += ['| %3d | %s | %s |' % (things[item]["count"], name, desc)]
else:
body += ['| %3d | %s |' % (things[item], name)]
count = things[item] if thing == 'assemblies' else things[item]["count"]
body += ['| %3d | %s |' % (count, name)]
body += ['']
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 +294,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

@@ -48,6 +48,8 @@ def check_have_time(changed, name):
return changed
def add_time(name, start):
if name.lower() in times:
del times[name.lower()]
times[name] = round(time.time() - start, 3)
def print_times():

View File

@@ -52,22 +52,23 @@ def bom_to_assemblies(bom_dir, bounds_map):
# Decide if we need big or small assembly pictures
#
for bom in flat_bom:
big = False
for ass in bom["assemblies"]:
for b in flat_bom:
if b["name"] == ass:
if b["big"]:
if bom["big"] == None:
big = False
for ass in bom["assemblies"]:
for b in flat_bom:
if b["name"] == ass:
if b["big"]:
big = True
break
if not big:
for stl in bom["printed"]:
bounds = bounds_map[stl]
width = bounds[1][0] - bounds[0][0]
depth = bounds[1][1] - bounds[0][1]
if max(width, depth) > 80:
big = True
break
if not big:
for stl in bom["printed"]:
bounds = bounds_map[stl]
width = bounds[1][0] - bounds[0][0]
depth = bounds[1][1] - bounds[0][1]
if max(width, depth) > 80:
big = True
break
bom["big"] = big or bom["routed"]
break
bom["big"] = big or bom["routed"]
#
# Remove the main assembly if it is a shell
#
@@ -89,12 +90,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"
@@ -109,9 +122,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')
@@ -124,8 +138,7 @@ 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, source_dir + '/printed', lib_dir]:
for dir in source_dirs(bom_dir):
if os.path.isdir(dir):
for filename in os.listdir(dir):
if filename.endswith('.scad'):
@@ -140,29 +153,24 @@ def views(target, do_assemblies = None):
if len(words) and words[0] == "module":
module = words[1].split('(')[0]
if is_assembly(module):
if module in assemblies:
lc_module = module.lower()
if lc_module in lc_assemblies:
real_name = assemblies[lc_assemblies.index(lc_module)]
#
# Scrape the assembly instructions
#
for ass in flat_bom:
if ass["name"] == module:
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 module in do_assemblies:
#
# 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);
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 + '/' + module + '.png'
png_name = target_dir + '/' + real_name + '.png'
if not explode:
png_name = png_name.replace('_assembly', '_assembled')
changed = check_deps(png_name, dname)
@@ -171,17 +179,24 @@ def views(target, do_assemblies = None):
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)
os.remove(png_maker_name)
done_assemblies.append(module)
done_assemblies.append(real_name)
else:
if module == 'main_assembly':
main_blurb = blurb.scrape_module_blurb(lines[:line_no])
@@ -216,7 +231,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)
@@ -233,11 +248,11 @@ def views(target, do_assemblies = None):
for t in types:
for thing in ass[t]:
if thing in things[t]:
things[t][thing] += ass[t][thing]
things[t][thing] += ass[t][thing]["count"]
else:
things[t][thing] = ass[t][thing]
things[t][thing] = ass[t][thing]["count"]
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)
@@ -250,7 +265,7 @@ def views(target, do_assemblies = None):
print(('| ' * len(flat_bom) + '| | **%s** |') % heading, file = doc_file)
for thing in sorted(things[t], key = lambda s: s.split(":")[-1]):
for ass in flat_bom:
count = ass[t][thing] if thing in ass[t] else 0
count = ass[t][thing]["count"] if thing in ass[t] else 0
print('| %s ' % pad(count if count else '.', 2, 1), file = doc_file, end = '')
name = ass["name"]
if name in totals:
@@ -274,7 +289,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)
@@ -286,7 +301,7 @@ def views(target, do_assemblies = None):
print("|Qty|Description|", 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("|%d|%s|" % (vitamins[v]["count"], v.split(":")[1]), file = doc_file)
print("\n", file = doc_file)
printed = ass["printed"]
@@ -295,7 +310,7 @@ def views(target, do_assemblies = None):
keys = sorted(list(printed.keys()))
for i in range(len(keys)):
p = keys[i]
print('%s %d x %s |' % ('\n|' if not (i % 3) else '', printed[p], p), file = doc_file, end = '')
print('%s %d x %s |' % ('\n|' if not (i % 3) else '', printed[p]["count"], 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)
@@ -311,7 +326,7 @@ def views(target, do_assemblies = None):
keys = sorted(list(routed.keys()))
for i in range(len(keys)):
r = keys[i]
print('%s %d x %s |' % ('\n|' if not (i % 3) else '', routed[r], r), file = doc_file, end = '')
print('%s %d x %s |' % ('\n|' if not (i % 3) else '', routed[r]["count"], 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)
@@ -385,4 +400,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,7 +21,6 @@
//! BOM and assembly demonstration
//
include <../core.scad>
include <../vitamins/screws.scad>
include <../vitamins/sheets.scad>
use <../vitamins/insert.scad>
$explode = 1; // Normally set on the command line when generating assembly views with views.py
@@ -68,7 +67,7 @@ module widgit_dxf() {
//! * Push the insert into the base with a soldering iron heated to 200&deg;C
module widgit_base_assembly()
assembly("widgit_base") {
color(pp1_colour)
stl_colour(pp1_colour)
widgit_stl();
translate_z(height)

30
tests/DIP.scad Normal file
View File

@@ -0,0 +1,30 @@
//
// 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>
use <../vitamins/dip.scad>
dips = [[6, "OPTO"], [8, "NE555"], [14, "74HC00"], [16, "ULN2003"], [18, "ULN2803"], [20, "74HC245"], [28, "ATMEGA328"]];
module dips()
for(i = [0 : len(dips) - 1]) let(dip = dips[i])
translate([i * inch(0.5), 0])
pdip(dip[0], dip[1], dip[0] > 20);
if($preview)
dips();

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

@@ -17,10 +17,9 @@
// If not, see <https://www.gnu.org/licenses/>.
//
include <../core.scad>
use <../utils/layout.scad>
include <../vitamins/kp_pillow_blocks.scad>
include <../vitamins/nuts.scad>
use <../utils/layout.scad>
module kp_pillow_blocks() {
screws = [M4_cap_screw, M4_cap_screw, M5_cap_screw, M5_cap_screw];

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>

132
tests/PCB.scad Normal file
View File

@@ -0,0 +1,132 @@
//
// 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>
include <../vitamins/leds.scad>
include <../vitamins/axials.scad>
use <../vitamins/pcb.scad>
gt_5x17 = ["gt_5x17", 5, 10, 17, 5, 11, 0.4, 9, 2,1.5, 1, 3, 6, 0.5, 0, 0, 0];
gt_5x11 = ["gt_5x11", 5, 8, 11, 5, 7, 0.4, 7, 1.5,1.5, 1,2.5, 6, 0.5, 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",
100, 250, 1.6, // length, width, thickness
3, // Corner radius
2.75, // Mounting hole diameter
5.5, // Pad around mounting hole
"green",// Color
true, // True if the parts should be separate BOM items
// hole offsets
[ [3, 3], [3, -3], [-3, 3], [-3, -3] ],
// components
[
[ 20, -5, 180, "trimpot10"],
[ 20, -15, 0, "trimpot10", true],
[ 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],
[ 5, 50, 0, "led", LED3mm, "red"],
[ 12, 50, 0, "led", LED5mm, "orange"],
[ 25, 50, 0, "led", LED10mm, "yellow"],
[ 10, 65, 180, "rj45"],
[ 8, 85, 180, "usb_A"],
[ 8, 105, 180, "usb_Ax2"],
[ 3, 125, 180, "usb_uA"],
[ 8, 140, 180, "usb_B"],
[ 5, 160, 0, "buzzer", 4.5, 8.5],
[ 20, 160, 0, "buzzer"],
[ 8, 190, 180, "jack"],
[ 6, 200, 180, "barrel_jack"],
[ 5, 218, 180, "hdmi"],
[ 3, 235, 180, "mini_hdmi"],
[ 6, 175, 180, "uSD", [12, 11.5, 1.4]],
[ 65, 12, 0, "ax_res", res1_8, 1000],
[ 65, 17, 0, "ax_res", res1_4, 10000],
[ 65, 22, 0, "ax_res", res1_2, 100000],
[ 80, 12, 0, "ax_res", res1_8, 1000000, 1, inch(0.1)],
[ 80, 17, 0, "ax_res", res1_4, 100, 2, inch(0.1)],
[ 80, 22, 0, "ax_res", res1_2, 10, 10, inch(0.2)],
[ 60, 3, 0, "flex"],
[ 50, 15, 0, "flat_flex"],
[ 60, 35, 0, "D_plug", DCONN9],
[ 50, 50, 0, "molex_hdr", 2],
[ 50, 60, 0, "jst_xh", 2],
[ 50, 70, 180, "term254", 3],
[ 63, 70, 180, "term254", 3, undef, grey20],
[ 75, 70, 180, "gterm508",2, undef, "blue"],
[ 50, 90, 180, "gterm35", 4, [1,2]],
[ 63, 90, 180, "gterm35", 4, [1,2], "red"],
[ 75, 90, 180, "gterm", gt_5x11, 3],
[ 90, 90, 180, "gterm", gt_5x17, 3, [1], "red"],
[ 55, 110, 180, "gterm635", 2],
[ 75, 110, 180, "gterm635", 2, undef, "blue"],
[ 90, 110, 180, "gterm", gt_5x17, 2, undef, grey20],
[ 50, 130, 180, "term35", 4],
[ 70, 130, 180, "term35", 3, "lime"],
[ 50, 150, 0, "transition", 5],
[ 50, 160, 0, "block", 10, 5, 8, "orange"],
[ 50, 170, 0, "button_6mm"],
[ 50, 185, 0, "microswitch", small_microswitch],
[ 52, 200, 0, "pcb", 11, TMC2130 ],
[ 80, 200, 0, "pdip", 24, "27C32", true, inch(0.6) ],
[ 80, 170, 0, "pdip", 8, "NE555" ],
[ 52, 206, 0, "2p54socket", 8, 1 ],
[ 52, 194, 0, "2p54socket", 8, 1, undef, undef, undef, "red" ],
[ 50, 220, 0, "standoff", 5, 4.5, 12.5, 2.54],
[ 50, 240, 0, "potentiometer"],
[ 75, 240, 0, "potentiometer", 7, 8],
],
// 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,16 +17,20 @@
// If not, see <https://www.gnu.org/licenses/>.
//
include <../core.scad>
use <../utils/layout.scad>
include <../vitamins/d_connectors.scad>
include <../vitamins/pcbs.scad>
module pcbs()
use <../utils/layout.scad>
module pcbs() {
layout([for(p = pcbs) pcb_width(p)], 10)
translate([0, pcb_length(pcbs[$i]) / 2])
rotate(90)
pcb_assembly(pcbs[$i], 5 + $i, 3);
translate([0, 120])
layout([for(p = perfboards) pcb_length(p)], 10)
translate([0, -pcb_width(perfboards[$i]) / 2])
pcb_assembly(perfboards[$i], 5 + $i, 3);
}
if($preview)
pcbs();

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,10 +17,10 @@
// 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) scs_size(s).x], 10) {
part_thickness = 5;

View File

@@ -17,11 +17,11 @@
// If not, see <https://www.gnu.org/licenses/>.
//
include <../core.scad>
use <../utils/layout.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];

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)

52
tests/Swiss_clips.scad Normal file
View File

@@ -0,0 +1,52 @@
//
// 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 <../utils/core/core.scad>
use <../utils/layout.scad>
include <../vitamins/swiss_clips.scad>
include <../vitamins/sheets.scad>
glass = glass2;
bed = AL6;
gap = sheet_thickness(bed) + sheet_thickness(glass);
module swiss_clips()
layout([for(s = swiss_clips) sclip_length(s)], 5, true)
let(s = swiss_clips[$i]) {
swiss_clip(s);
translate([0, 20]) {
swiss_clip(s, gap);
translate([20, 0, -5])
render_2D_sheet(bed)
difference() {
sheet_2D(bed, 40, 20, 1);
translate([-20, 0])
swiss_clip_hole(s, gap);
}
translate([20, 0, -1 + eps])
render_sheet(glass) sheet(glass, 40, 20, 1);
}
}
if($preview)
swiss_clips();

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() {

43
tests/axials.scad Normal file
View File

@@ -0,0 +1,43 @@
//
// 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/pcbs.scad>
module axials() {
pcb = PERF60x40;
pcb(pcb);
pcb_grid(pcb, 0, 2)
rotate(90)
wire_link(0.8, inch(0.4));
for(i = [0 : len(ax_resistors) - 1]) {
pcb_grid(pcb, 2 * i + 2, 1 + [0, 0.5, 1.5][i])
rotate(90)
ax_res(ax_resistors[i], [1000, 47000, 8200][i], 5);
pcb_grid(pcb, 2 * i + 2, 6.5)
rotate(-90)
ax_res(ax_resistors[i], [2200, 39000, 8250][i], 1, inch(0.1));
}
}
if($preview)
axials();

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,8 +18,6 @@
//
include <../core.scad>
include <../vitamins/belts.scad>
include <../vitamins/screws.scad>
include <../vitamins/pulleys.scad>
use <../vitamins/insert.scad>
use <../utils/layout.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/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,7 +18,6 @@
//
include <../core.scad>
include <../vitamins/screws.scad>
include <../vitamins/sheets.scad>
use <../vitamins/insert.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,7 +18,6 @@
//
include <../core.scad>
include <../vitamins/screws.scad>
include <../vitamins/sheets.scad>
use <../vitamins/insert.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,20 +16,20 @@
// 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>
module cable_grommets() {
rotate(90)
color(pp1_colour) ribbon_grommet(20, 3);
stl_colour(pp1_colour) ribbon_grommet(20, 3);
translate([20, 0])
round_grommet_assembly(6, 3);
translate([40, 0])
rotate(90)
color(pp1_colour) mouse_grommet(5, 3);
stl_colour(pp1_colour) mouse_grommet(5, 3);
}
if($preview)

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,10 +16,19 @@
// 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()
color(pp1_colour) ESP12F_carrier_stl();
module carriers() {
stl_colour(pp1_colour) ESP12F_carrier_stl();
translate([0, 15])
rotate(90)
stl_colour(pp1_colour) TP4056_carrier_stl();
translate([0, 25])
rotate(90)
stl_colour(pp1_colour) MT3608_carrier_stl();
}
carriers();

40
tests/circlips.scad Normal file
View File

@@ -0,0 +1,40 @@
//
// 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>
use <../utils/layout.scad>
include <../vitamins/circlips.scad>
module circlips(all = false)
layout([for(c = circlips) circlip_d3(c)], 10, false) let(c = circlips[$i]) {
gap = circlip_d3(c) + 2;
internal_circlip(c, 1);
if(all) {
translate([0, gap])
internal_circlip(c, 0);
translate([0, 2 * gap])
internal_circlip(c, -1);
}
}
if($preview)
circlips(true);

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()
@@ -27,14 +26,13 @@ module resistors()
resistor(resistors[$i]);
module al_clad_resistors()
layout([for(a = al_clad_resistors) al_clad_width(a)])
layout([for(a = al_clad_resistors) al_clad_width(a)], 5, true)
rotate(90)
al_clad_resistor_assembly(al_clad_resistors[$i], 4.7)
screw(al_clad_hole(al_clad_resistors[$i]) > 3 ? M3_pan_screw : M2p5_pan_screw, 16);
module thermal_cutouts()
layout([for(t = thermal_cutouts) tc_length(t)])
layout([for(t = thermal_cutouts) tc_length(t)], 5, true)
thermal_cutout(thermal_cutouts[$i]);
module components() {
@@ -43,7 +41,7 @@ module components() {
translate([0, 50])
TO220("Generic TO220 package");
translate([30, 50])
translate([50, 50])
panel_USBA();
translate([0,80])

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)

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/d_connectors.scad>

View File

@@ -20,7 +20,7 @@ include <../global_defs.scad>
use <../utils/dogbones.scad>
module dogbones() {
#linear_extrude(height = eps)
#linear_extrude(eps)
dogbone_square([10, 20]);
#translate([15, 0])

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/door_hinge.scad>
include <../vitamins/sheets.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/door_latch.scad>
module door_latches()

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>
include <../vitamins/extrusion_brackets.scad>
include <../vitamins/extrusions.scad>

View File

@@ -16,15 +16,14 @@
// 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/extrusions.scad>
module extrusions()
layout([for(e = extrusions) extrusion_width(e)], 10)
extrusion(extrusions[$i], 80);
extrusion(extrusions[$i], 80, cornerHole = extrusion_width(extrusions[$i]) > 20);
if ($preview)
extrusions();

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