Compare commits
91 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
2afc00cfa9 | ||
|
84b5686af6 | ||
|
71af8f98ed | ||
|
6cecb4d466 | ||
|
4ef926a18f | ||
|
5afc4f816c | ||
|
5be14f5e89 | ||
|
efff17dfc7 | ||
|
ac4a5500a9 | ||
|
6b90a7aac8 | ||
|
3c3d72f366 | ||
|
dbcab8377f | ||
|
11d96d37e1 | ||
|
40843b421f | ||
|
cc8f4d3bd3 | ||
|
69d6fc8bf0 | ||
|
01b1e2e84d | ||
|
cb64cadb92 | ||
|
b57b50d2b0 | ||
|
8f282775a4 | ||
|
bf833b0452 | ||
|
52011fd6f7 | ||
|
9da8634769 | ||
|
147ff9b24f | ||
|
b4379907a2 | ||
|
3be88f6517 | ||
|
d42f99e437 | ||
|
65455930f8 | ||
|
7e0c5fdb6e | ||
|
bc4e18d788 | ||
|
f5980b4703 | ||
|
7b3d7fab55 | ||
|
654571a70e | ||
|
e8abcde52f | ||
|
390957fdd0 | ||
|
bde8cbe7a6 | ||
|
fbe8533a42 | ||
|
a9c2f854c6 | ||
|
6187d90c57 | ||
|
65f320141d | ||
|
d367e743da | ||
|
3a4305f5ca | ||
|
a7dde2d4e2 | ||
|
56390bf8dd | ||
|
53f0bbcd6e | ||
|
f2ec3e71f4 | ||
|
c1b5bd1b87 | ||
|
268c066965 | ||
|
fd8712d6bf | ||
|
b6a32b6b41 | ||
|
0738893510 | ||
|
849bc479cc | ||
|
86d7e0f124 | ||
|
c897060726 | ||
|
b2c2fc668b | ||
|
4914f90994 | ||
|
2210396234 | ||
|
2eef050f60 | ||
|
23a64f238d | ||
|
a8422a6aa6 | ||
|
b56ddea1e3 | ||
|
c16a1c3804 | ||
|
245b158f1d | ||
|
60628dfec0 | ||
|
f7db793c74 | ||
|
53292c9f89 | ||
|
bd60b50b09 | ||
|
4d51cb73f3 | ||
|
3b77c97532 | ||
|
4442042197 | ||
|
4e233e5e9d | ||
|
675953d334 | ||
|
9527fa1c1f | ||
|
3f209cbdd3 | ||
|
7b76aceaad | ||
|
4edd08977f | ||
|
a1d385f9ec | ||
|
fc17b52518 | ||
|
9fbdb82991 | ||
|
7706716fa2 | ||
|
c815c1592d | ||
|
e32ef88c90 | ||
|
702c450a27 | ||
|
343351155c | ||
|
c41b1fa115 | ||
|
1a197ac823 | ||
|
ab592e049c | ||
|
9b104e4fe7 | ||
|
f0b4d767e9 | ||
|
82baed4c8f | ||
|
acb2cb2a48 |
20
core.scad
@@ -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>
|
include <vitamins/screws.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"));
|
|
||||||
}
|
|
||||||
|
@@ -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.
|
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.
|
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.
|
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.
|
||||||
One can copy the include or use line from [NopSCADlib/lib.scad](../lib.scad).
|
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.
|
### 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
|
module handle_assembly() pose([225, 0, 150], [0, 0, 14]) //! Printed part with inserts in place
|
||||||
assembly("handle") {
|
assembly("handle") {
|
||||||
translate_z(handle_height())
|
translate_z(handle_height())
|
||||||
color(pp1_colour) vflip() handle_stl();
|
stl_colour(pp1_colour) vflip() handle_stl();
|
||||||
|
|
||||||
handle_screw_positions()
|
handle_screw_positions()
|
||||||
vflip()
|
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
|
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
|
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.
|
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.
|
||||||
|
Before Width: | Height: | Size: 137 KiB After Width: | Height: | Size: 137 KiB |
Before Width: | Height: | Size: 187 KiB After Width: | Height: | Size: 200 KiB |
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 33 KiB |
@@ -1,67 +1,119 @@
|
|||||||
[
|
[
|
||||||
{
|
{
|
||||||
"name": "base_assembly",
|
"name": "base_assembly",
|
||||||
|
"big": null,
|
||||||
"count": 1,
|
"count": 1,
|
||||||
"assemblies": {},
|
"assemblies": {},
|
||||||
"vitamins": {
|
"vitamins": {
|
||||||
"insert(F1BM3): Heatfit insert M3": 2
|
"insert(F1BM3): Heatfit insert M3": {
|
||||||
|
"count": 2
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"printed": {
|
"printed": {
|
||||||
"socket_box.stl": 1
|
"socket_box.stl": {
|
||||||
|
"count": 1,
|
||||||
|
"colour": "dimgrey"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"routed": {}
|
"routed": {}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "feet_assembly",
|
"name": "feet_assembly",
|
||||||
|
"big": null,
|
||||||
"count": 1,
|
"count": 1,
|
||||||
"assemblies": {
|
"assemblies": {
|
||||||
"base_assembly": 1
|
"base_assembly": 1
|
||||||
},
|
},
|
||||||
"vitamins": {
|
"vitamins": {
|
||||||
"washer(M3_washer): Washer M3 x 7mm x 0.5mm": 8,
|
"washer(M3_washer): Washer M3 x 7mm x 0.5mm": {
|
||||||
"screw(M3_dome_screw, 10): Screw M3 dome x 10mm": 4,
|
"count": 8
|
||||||
"nut(M3_nut, nyloc = true): Nut M3 x 2.4mm nyloc": 4
|
},
|
||||||
|
"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": {
|
"printed": {
|
||||||
"foot.stl": 4
|
"foot.stl": {
|
||||||
|
"count": 4,
|
||||||
|
"colour": "darkorange"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"routed": {}
|
"routed": {}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "mains_in_assembly",
|
"name": "mains_in_assembly",
|
||||||
|
"big": null,
|
||||||
"count": 1,
|
"count": 1,
|
||||||
"assemblies": {
|
"assemblies": {
|
||||||
"feet_assembly": 1
|
"feet_assembly": 1
|
||||||
},
|
},
|
||||||
"vitamins": {
|
"vitamins": {
|
||||||
": Wire green & yellow 30/0.25mm strands, length 150mm - not shown": 1,
|
": Wire green & yellow 30/0.25mm strands, length 150mm - not shown": {
|
||||||
": Wire blue 30/0.25mm strands, length 150mm - not shown": 1,
|
"count": 1
|
||||||
": Wire brown 30/0.25mm strands, length 150mm - not shown": 2,
|
},
|
||||||
"tubing(HSHRNK32): Heatshrink sleeving ID 3.2mm x 15mm - not shown": 3,
|
": Wire blue 30/0.25mm strands, length 150mm - not shown": {
|
||||||
"iec(IEC_inlet_atx): IEC inlet for ATX": 1,
|
"count": 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,
|
": Wire brown 30/0.25mm strands, length 150mm - not shown": {
|
||||||
"nut(M3_nut, nyloc = true): Nut M3 x 2.4mm nyloc": 2
|
"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": {},
|
"printed": {},
|
||||||
"routed": {}
|
"routed": {}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "main_assembly",
|
"name": "main_assembly",
|
||||||
|
"big": null,
|
||||||
"count": 1,
|
"count": 1,
|
||||||
"assemblies": {
|
"assemblies": {
|
||||||
"mains_in_assembly": 1
|
"mains_in_assembly": 1
|
||||||
},
|
},
|
||||||
"vitamins": {
|
"vitamins": {
|
||||||
": Wire green & yellow 30/0.25mm strands, length 150mm - not shown": 1,
|
": Wire green & yellow 30/0.25mm strands, length 150mm - not shown": {
|
||||||
": Wire blue 30/0.25mm strands, length 150mm - not shown": 1,
|
"count": 1
|
||||||
"tubing(HSHRNK32): Heatshrink sleeving ID 3.2mm x 15mm - not shown": 5,
|
},
|
||||||
": Ferrule for 1.5mm^2 wire - not shown": 3,
|
": Wire blue 30/0.25mm strands, length 150mm - not shown": {
|
||||||
"mains_socket(Contactum): Mains socket 13A": 1,
|
"count": 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,
|
"tubing(HSHRNK32): Heatshrink sleeving ID 3.2mm x 15mm - not shown": {
|
||||||
"jack_4mm_shielded(\"brown\", 3, \"sienna\"): 4mm shielded jack socket brown": 1,
|
"count": 5
|
||||||
"jack_4mm_shielded(\"green\", 3): 4mm shielded jack socket green": 2
|
},
|
||||||
|
": 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": {},
|
"printed": {},
|
||||||
"routed": {}
|
"routed": {}
|
||||||
|
@@ -35,7 +35,14 @@ $extrusion_width = 0.5;
|
|||||||
$pp1_colour = "dimgrey";
|
$pp1_colour = "dimgrey";
|
||||||
$pp2_colour = [0.9, 0.9, 0.9];
|
$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>
|
use <NopSCADlib/printed/foot.scad>
|
||||||
|
|
||||||
echo(extrusion_width = extrusion_width, layer_height = layer_height);
|
echo(extrusion_width = extrusion_width, layer_height = layer_height);
|
||||||
@@ -166,7 +173,7 @@ module socket_box_stl() {
|
|||||||
//
|
//
|
||||||
module base_assembly()
|
module base_assembly()
|
||||||
assembly("base") {
|
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)
|
mains_socket_hole_positions(socket)
|
||||||
translate_z(height)
|
translate_z(height)
|
||||||
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 23 KiB |
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 8.6 KiB |
Before Width: | Height: | Size: 108 KiB After Width: | Height: | Size: 107 KiB |
BIN
gallery/EnviroPlus.png
Normal file
After Width: | Height: | Size: 121 KiB |
Before Width: | Height: | Size: 124 KiB After Width: | Height: | Size: 179 KiB |
Before Width: | Height: | Size: 169 KiB After Width: | Height: | Size: 169 KiB |
Before Width: | Height: | Size: 280 KiB After Width: | Height: | Size: 280 KiB |
Before Width: | Height: | Size: 291 KiB After Width: | Height: | Size: 291 KiB |
Before Width: | Height: | Size: 286 KiB After Width: | Height: | Size: 286 KiB |
Before Width: | Height: | Size: 230 KiB After Width: | Height: | Size: 230 KiB |
Before Width: | Height: | Size: 206 KiB After Width: | Height: | Size: 242 KiB |
Before Width: | Height: | Size: 207 KiB After Width: | Height: | Size: 215 KiB |
Before Width: | Height: | Size: 198 KiB After Width: | Height: | Size: 199 KiB |
@@ -6,6 +6,13 @@ Arduino thermostat to control a beer fridge to use it as an environmental chambe
|
|||||||

|

|
||||||
|
|
||||||
|
|
||||||
|
<a name="TOP"></a>
|
||||||
|
## EnviroPlus
|
||||||
|
Environmental monitor using Enviro+ sensor board and a Raspberry Pi Zero.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
<a name="TOP"></a>
|
<a name="TOP"></a>
|
||||||
## FilamentDryBox
|
## FilamentDryBox
|
||||||
A small fan oven with a spool holder to keep the filament warm and dry.
|
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>
|
<a name="TOP"></a>
|
||||||
## SunBot
|
## SunBot
|
||||||
A solar tracker to keep solar powerbanks pointing at the sun.
|
A solar tracker to keep a solar panel pointing at the sun.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
@@ -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
|
extrusion_width = is_undef($extrusion_width) ? 0.5 : $extrusion_width; // filament width when printing
|
||||||
nozzle = is_undef($nozzle) ? 0.45 : $nozzle; // 3D printer nozzle
|
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
|
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
|
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
|
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
|
pp4_colour = is_undef($pp4_colour) ? "darkorange" : $pp4_colour;// printed part colour 4
|
||||||
@@ -51,7 +51,7 @@ $fa = 6;
|
|||||||
$fs = extrusion_width / 2;
|
$fs = extrusion_width / 2;
|
||||||
|
|
||||||
function round_to_layer(z) = ceil(z / layer_height) * layer_height;
|
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];
|
grey20 = [0.2, 0.2, 0.2];
|
||||||
grey30 = [0.3, 0.3, 0.3];
|
grey30 = [0.3, 0.3, 0.3];
|
||||||
grey40 = [0.4, 0.4, 0.4];
|
grey40 = [0.4, 0.4, 0.4];
|
||||||
|
59
lib.scad
@@ -23,43 +23,44 @@
|
|||||||
include <core.scad>
|
include <core.scad>
|
||||||
|
|
||||||
include <vitamins/psus.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/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/ring_terminals.scad>
|
||||||
include <vitamins/rails.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/rod.scad>
|
||||||
include <vitamins/leadnuts.scad>
|
include <vitamins/scs_bearing_blocks.scad>
|
||||||
include <vitamins/bulldogs.scad>
|
include <vitamins/sheets.scad>
|
||||||
include <vitamins/pillars.scad>
|
include <vitamins/sk_brackets.scad>
|
||||||
|
include <vitamins/spools.scad>
|
||||||
include <vitamins/ssrs.scad>
|
include <vitamins/ssrs.scad>
|
||||||
include <vitamins/d_connectors.scad>
|
include <vitamins/stepper_motors.scad>
|
||||||
include <vitamins/buttons.scad>
|
include <vitamins/swiss_clips.scad>
|
||||||
include <vitamins/pcbs.scad>
|
|
||||||
include <vitamins/modules.scad>
|
|
||||||
include <vitamins/displays.scad>
|
|
||||||
include <vitamins/blowers.scad>
|
|
||||||
include <vitamins/leds.scad>
|
|
||||||
include <vitamins/toggles.scad>
|
include <vitamins/toggles.scad>
|
||||||
include <vitamins/transformers.scad>
|
include <vitamins/transformers.scad>
|
||||||
|
include <vitamins/tubings.scad>
|
||||||
include <vitamins/variacs.scad>
|
include <vitamins/variacs.scad>
|
||||||
include <vitamins/springs.scad>
|
include <vitamins/zipties.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>
|
|
||||||
|
|
||||||
use <vitamins/jack.scad>
|
use <vitamins/jack.scad>
|
||||||
use <vitamins/meter.scad>
|
use <vitamins/meter.scad>
|
||||||
|
BIN
libtest.png
Before Width: | Height: | Size: 786 KiB After Width: | Height: | Size: 787 KiB |
78
libtest.scad
@@ -29,6 +29,7 @@ use <tests/blowers.scad>
|
|||||||
use <tests/bulldogs.scad>
|
use <tests/bulldogs.scad>
|
||||||
use <tests/buttons.scad>
|
use <tests/buttons.scad>
|
||||||
use <tests/cable_strips.scad>
|
use <tests/cable_strips.scad>
|
||||||
|
use <tests/circlips.scad>
|
||||||
use <tests/components.scad>
|
use <tests/components.scad>
|
||||||
use <tests/d_connectors.scad>
|
use <tests/d_connectors.scad>
|
||||||
use <tests/displays.scad>
|
use <tests/displays.scad>
|
||||||
@@ -38,13 +39,13 @@ use <tests/fans.scad>
|
|||||||
use <tests/fuseholder.scad>
|
use <tests/fuseholder.scad>
|
||||||
use <tests/geared_steppers.scad>
|
use <tests/geared_steppers.scad>
|
||||||
use <tests/hot_ends.scad>
|
use <tests/hot_ends.scad>
|
||||||
use <tests/iecs.scad>
|
use <tests/IECs.scad>
|
||||||
use <tests/inserts.scad>
|
use <tests/inserts.scad>
|
||||||
use <tests/jack.scad>
|
use <tests/jack.scad>
|
||||||
use <tests/kp_pillow_blocks.scad>
|
use <tests/KP_pillow_blocks.scad>
|
||||||
use <tests/leadnuts.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/light_strips.scad>
|
||||||
use <tests/linear_bearings.scad>
|
use <tests/linear_bearings.scad>
|
||||||
use <tests/meter.scad>
|
use <tests/meter.scad>
|
||||||
@@ -53,23 +54,24 @@ use <tests/modules.scad>
|
|||||||
use <tests/nuts.scad>
|
use <tests/nuts.scad>
|
||||||
use <tests/o_ring.scad>
|
use <tests/o_ring.scad>
|
||||||
use <tests/opengrab.scad>
|
use <tests/opengrab.scad>
|
||||||
use <tests/pcbs.scad>
|
use <tests/PCBs.scad>
|
||||||
use <tests/pillars.scad>
|
use <tests/pillars.scad>
|
||||||
use <tests/psus.scad>
|
use <tests/PSUs.scad>
|
||||||
use <tests/pulleys.scad>
|
use <tests/pulleys.scad>
|
||||||
use <tests/rails.scad>
|
use <tests/rails.scad>
|
||||||
use <tests/ring_terminals.scad>
|
use <tests/ring_terminals.scad>
|
||||||
use <tests/rockers.scad>
|
use <tests/rockers.scad>
|
||||||
use <tests/rod.scad>
|
use <tests/rod.scad>
|
||||||
use <tests/screws.scad>
|
use <tests/screws.scad>
|
||||||
use <tests/scs_bearing_blocks.scad>
|
use <tests/SCS_bearing_blocks.scad>
|
||||||
use <tests/sealing_strip.scad>
|
use <tests/sealing_strip.scad>
|
||||||
use <tests/sheets.scad>
|
use <tests/sheets.scad>
|
||||||
use <tests/sk_brackets.scad>
|
use <tests/SK_brackets.scad>
|
||||||
use <tests/spades.scad>
|
use <tests/spades.scad>
|
||||||
use <tests/springs.scad>
|
use <tests/springs.scad>
|
||||||
use <tests/ssrs.scad>
|
use <tests/SSRs.scad>
|
||||||
use <tests/stepper_motors.scad>
|
use <tests/stepper_motors.scad>
|
||||||
|
use <tests/swiss_clips.scad>
|
||||||
use <tests/toggles.scad>
|
use <tests/toggles.scad>
|
||||||
use <tests/transformers.scad>
|
use <tests/transformers.scad>
|
||||||
use <tests/tubings.scad>
|
use <tests/tubings.scad>
|
||||||
@@ -90,17 +92,17 @@ use <tests/fixing_block.scad>
|
|||||||
use <tests/flat_hinge.scad>
|
use <tests/flat_hinge.scad>
|
||||||
use <tests/foot.scad>
|
use <tests/foot.scad>
|
||||||
use <tests/handle.scad>
|
use <tests/handle.scad>
|
||||||
use <tests/pcb_mount.scad>
|
use <tests/PCB_mount.scad>
|
||||||
use <tests/printed_box.scad>
|
use <tests/printed_box.scad>
|
||||||
use <tests/ribbon_clamp.scad>
|
use <tests/ribbon_clamp.scad>
|
||||||
use <tests/screw_knob.scad>
|
use <tests/screw_knob.scad>
|
||||||
use <tests/socket_box.scad>
|
use <tests/socket_box.scad>
|
||||||
use <tests/strap_handle.scad>
|
use <tests/strap_handle.scad>
|
||||||
use <tests/ssr_shroud.scad>
|
use <tests/SSR_shroud.scad>
|
||||||
use <tests/psu_shroud.scad>
|
use <tests/PSU_shroud.scad>
|
||||||
|
|
||||||
x0 = 0;
|
x0 = 0;
|
||||||
x1 = x0 + 100;
|
x1 = x0 + 110;
|
||||||
x2 = x1 + 90;
|
x2 = x1 + 90;
|
||||||
x3 = x2 + 130;
|
x3 = x2 + 130;
|
||||||
x4 = x3 + 200;
|
x4 = x3 + 200;
|
||||||
@@ -147,35 +149,35 @@ translate([x5, cable_grommets_y + 250])
|
|||||||
translate([950, 600])
|
translate([950, 600])
|
||||||
box_test();
|
box_test();
|
||||||
|
|
||||||
translate([890, 730])
|
translate([890, 750])
|
||||||
printed_boxes();
|
printed_boxes();
|
||||||
|
|
||||||
|
translate([850, 1330])
|
||||||
translate([850, 1260])
|
|
||||||
bbox_test();
|
bbox_test();
|
||||||
|
|
||||||
|
|
||||||
inserts_y = 0;
|
inserts_y = 0;
|
||||||
nuts_y = inserts_y + 20;
|
nuts_y = inserts_y + 20;
|
||||||
washers_y = nuts_y + 100;
|
washers_y = nuts_y + 120;
|
||||||
screws_y = washers_y + 120;
|
screws_y = washers_y + 120;
|
||||||
o_rings_y = screws_y + 130;
|
circlips_y = screws_y + 160;
|
||||||
springs_y = o_rings_y + 20;
|
springs_y = circlips_y + 20;
|
||||||
|
o_rings_y = springs_y;
|
||||||
sealing_strip_y = springs_y + 20;
|
sealing_strip_y = springs_y + 20;
|
||||||
tubings_y = sealing_strip_y + 20;
|
tubings_y = sealing_strip_y + 20;
|
||||||
pillars_y = tubings_y + 20;
|
pillars_y = tubings_y + 20;
|
||||||
leadnuts_y = pillars_y + 40;
|
ball_bearings_y = pillars_y + 40;
|
||||||
pulleys_y = leadnuts_y +40;
|
pulleys_y = ball_bearings_y +40;
|
||||||
hot_ends_y = pulleys_y + 60;
|
hot_ends_y = pulleys_y + 60;
|
||||||
linear_bearings_y = hot_ends_y + 50;
|
linear_bearings_y = hot_ends_y + 50;
|
||||||
sheets_y = linear_bearings_y + 100;
|
sheets_y = linear_bearings_y + 100;
|
||||||
pcbs_y = sheets_y + 40;
|
pcbs_y = sheets_y + 40;
|
||||||
displays_y = pcbs_y + 150;
|
displays_y = pcbs_y + 170;
|
||||||
fans_y = displays_y + 100;
|
fans_y = displays_y + 80;
|
||||||
transformers_y = fans_y + 120;
|
transformers_y = fans_y + 120;
|
||||||
psus_y = transformers_y + 190;
|
psus_y = transformers_y + 190;
|
||||||
|
|
||||||
translate([x0 + 30, inserts_y])
|
translate([x0 + 35, inserts_y])
|
||||||
inserts();
|
inserts();
|
||||||
|
|
||||||
translate([x0, inserts_y])
|
translate([x0, inserts_y])
|
||||||
@@ -190,10 +192,13 @@ translate([x0, washers_y])
|
|||||||
translate([x0, screws_y])
|
translate([x0, screws_y])
|
||||||
screws();
|
screws();
|
||||||
|
|
||||||
|
translate([x0, circlips_y])
|
||||||
|
circlips();
|
||||||
|
|
||||||
translate([x0, o_rings_y])
|
translate([x0, o_rings_y])
|
||||||
o_rings();
|
o_rings();
|
||||||
|
|
||||||
translate([x0, springs_y])
|
translate([x0 + 20, springs_y])
|
||||||
springs();
|
springs();
|
||||||
|
|
||||||
translate([x0 + 50, sealing_strip_y])
|
translate([x0 + 50, sealing_strip_y])
|
||||||
@@ -205,10 +210,7 @@ translate([x0, tubings_y])
|
|||||||
translate([x0, pillars_y])
|
translate([x0, pillars_y])
|
||||||
pillars();
|
pillars();
|
||||||
|
|
||||||
translate([x0, leadnuts_y ])
|
translate([x0, ball_bearings_y])
|
||||||
leadnuts();
|
|
||||||
|
|
||||||
translate([x0 + 80, leadnuts_y])
|
|
||||||
ball_bearings();
|
ball_bearings();
|
||||||
|
|
||||||
translate([x0, pulleys_y])
|
translate([x0, pulleys_y])
|
||||||
@@ -248,7 +250,9 @@ translate([x0, psus_y]) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
zipties_y = 0;
|
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])
|
translate([x1, zipties_y])
|
||||||
zipties();
|
zipties();
|
||||||
@@ -256,6 +260,13 @@ translate([x1, zipties_y])
|
|||||||
translate([x1, bulldogs_y])
|
translate([x1, bulldogs_y])
|
||||||
bulldogs();
|
bulldogs();
|
||||||
|
|
||||||
|
translate([x1, swiss_clips_y])
|
||||||
|
swiss_clips();
|
||||||
|
|
||||||
|
translate([x1, leadnuts_y])
|
||||||
|
leadnuts();
|
||||||
|
|
||||||
|
|
||||||
leds_y = 0;
|
leds_y = 0;
|
||||||
carriers_y = leds_y + 40;
|
carriers_y = leds_y + 40;
|
||||||
spades_y = carriers_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;
|
kp_pillow_blocks_y = sk_brackets_y + 50;
|
||||||
scs_bearing_blocks_y = kp_pillow_blocks_y + 60;
|
scs_bearing_blocks_y = kp_pillow_blocks_y + 60;
|
||||||
|
|
||||||
translate([x4 + 130, belts_y + 58]) {
|
translate([x4 + 150, belts_y + 58]) {
|
||||||
belt_test();
|
belt_test();
|
||||||
|
|
||||||
translate([0, 60])
|
translate([0, 60])
|
||||||
@@ -376,9 +387,8 @@ translate([x4 + 130, belts_y + 58]) {
|
|||||||
translate([x4, rails_y + 130])
|
translate([x4, rails_y + 130])
|
||||||
rails();
|
rails();
|
||||||
|
|
||||||
translate([780, 0])
|
translate([800, fans_y + 50])
|
||||||
rotate(90)
|
cable_strips();
|
||||||
cable_strips();
|
|
||||||
|
|
||||||
translate([x4, kp_pillow_blocks_y])
|
translate([x4, kp_pillow_blocks_y])
|
||||||
kp_pillow_blocks();
|
kp_pillow_blocks();
|
||||||
|
@@ -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.
|
//! 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/sheet.scad>
|
||||||
use <../vitamins/screw.scad>
|
use <../vitamins/screw.scad>
|
||||||
use <../vitamins/washer.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);
|
length = box_height(type) - 2 * box_margin(type);
|
||||||
difference() {
|
difference() {
|
||||||
linear_extrude(height = length, center = true, convexity = 5)
|
linear_extrude(length, center = true, convexity = 5)
|
||||||
box_corner_profile_2D(type);
|
box_corner_profile_2D(type);
|
||||||
|
|
||||||
for(z = [-1, 1])
|
for(z = [-1, 1])
|
||||||
@@ -148,24 +148,24 @@ module box_corner_profile_section(type, section, sections) { //! Generates inter
|
|||||||
|
|
||||||
difference() {
|
difference() {
|
||||||
union() {
|
union() {
|
||||||
linear_extrude(height = h, convexity = 5)
|
linear_extrude(h, convexity = 5)
|
||||||
box_corner_profile_2D(type);
|
box_corner_profile_2D(type);
|
||||||
|
|
||||||
if(!last_section) // male end always at the top
|
if(!last_section) // male end always at the top
|
||||||
translate_z(section_length - 1)
|
translate_z(section_length - 1)
|
||||||
for(i = [0 : 1], offset = i * layer_height)
|
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(1 + offset - layer_height)
|
||||||
offset(-overlap_wall - 1)
|
offset(-overlap_wall - 1)
|
||||||
box_corner_profile_2D(type);
|
box_corner_profile_2D(type);
|
||||||
}
|
}
|
||||||
if(section > 0)
|
if(section > 0)
|
||||||
translate_z(last_section ? h : 0) { // female at bottom unless last section
|
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)
|
offset(-overlap_wall)
|
||||||
box_corner_profile_2D(type);
|
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)
|
offset(-overlap_wall + layer_height)
|
||||||
box_corner_profile_2D(type);
|
box_corner_profile_2D(type);
|
||||||
}
|
}
|
||||||
@@ -223,7 +223,7 @@ module box_bezel(type, bottom) { //! Generates top and bottom bezel STLs
|
|||||||
// slots for side panels
|
// slots for side panels
|
||||||
//
|
//
|
||||||
translate_z(-box_profile_overlap(type))
|
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]) {
|
for(i = [-1, 1]) {
|
||||||
translate([i * (box_width(type) / 2 + t / 2 - sheet_slot_clearance / 2), 0])
|
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);
|
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
|
// leave plastic over the corner profiles
|
||||||
//
|
//
|
||||||
translate_z(-box_profile_overlap(type) - 1)
|
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() {
|
union() {
|
||||||
difference() {
|
difference() {
|
||||||
square([box_width(type) - 2 * box_inset(type),
|
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;
|
end_clearance = 0.5;
|
||||||
module male() {
|
module male() {
|
||||||
rotate([90, 0, 90])
|
rotate([90, 0, 90])
|
||||||
linear_extrude(height = dowel_length - 2 * end_clearance, center = true)
|
linear_extrude(dowel_length - 2 * end_clearance, center = true)
|
||||||
difference() {
|
difference() {
|
||||||
union() {
|
union() {
|
||||||
h = dh - layer_height;
|
h = dh - layer_height;
|
||||||
|
@@ -33,7 +33,7 @@ assembly("box") {
|
|||||||
y = [-1,-1,1,1][corner];
|
y = [-1,-1,1,1][corner];
|
||||||
translate([x * (box_width(type) / 2 + 25 * exploded()), y * (box_depth(type) / 2 + 25 * exploded())])
|
translate([x * (box_width(type) / 2 + 25 * exploded()), y * (box_depth(type) / 2 + 25 * exploded())])
|
||||||
rotate(corner * 90) {
|
rotate(corner * 90) {
|
||||||
color(pp2_colour) render()
|
stl_colour(pp2_colour) render()
|
||||||
box_corner_profile(type);
|
box_corner_profile(type);
|
||||||
|
|
||||||
translate([box_hole_inset(type), box_hole_inset(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()))
|
translate_z(z * (box_height(type) / 2 - box_corner_gap(type) + 50 * exploded()))
|
||||||
rotate([z * 90 - 90, 0, 0])
|
rotate([z * 90 - 90, 0, 0])
|
||||||
if(bezels && (z > 0 ? top : base))
|
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()))
|
translate_z(z * (box_height(type) / 2 + sheet_thickness + 50 * exploded()))
|
||||||
box_screw_hole_positions(type)
|
box_screw_hole_positions(type)
|
||||||
|
@@ -21,7 +21,7 @@
|
|||||||
//! Printed cable grommets for passing cables through panels avoiding sharp edges and in the case
|
//! Printed cable grommets for passing cables through panels avoiding sharp edges and in the case
|
||||||
//! of conductive panels, an extra layer of insulation.
|
//! of conductive panels, an extra layer of insulation.
|
||||||
//
|
//
|
||||||
include <../core.scad>
|
include <../utils/core/core.scad>
|
||||||
use <../vitamins/cable_strip.scad>
|
use <../vitamins/cable_strip.scad>
|
||||||
|
|
||||||
base = 1.25;
|
base = 1.25;
|
||||||
@@ -59,7 +59,7 @@ module ribbon_grommet(ways, thickness) { //! Generate the STL for a printed ribb
|
|||||||
union() {
|
union() {
|
||||||
for(side = [-1, 1])
|
for(side = [-1, 1])
|
||||||
translate_z(side * (width - wall) / 2)
|
translate_z(side * (width - wall) / 2)
|
||||||
linear_extrude(height = wall, center = true, convexity = 5)
|
linear_extrude(wall, center = true, convexity = 5)
|
||||||
difference() {
|
difference() {
|
||||||
hull() {
|
hull() {
|
||||||
translate([-length / 2, 0])
|
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]);
|
square([slot_length, slot_height]);
|
||||||
}
|
}
|
||||||
|
|
||||||
linear_extrude(height = width -1, center = true)
|
linear_extrude(width -1, center = true)
|
||||||
difference() {
|
difference() {
|
||||||
ribbon_grommet_hole(ways, expand = false, h = 0);
|
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);
|
drill(corrected_radius(diameter / 2) + wall + clearance, h);
|
||||||
|
|
||||||
module round_grommet_assembly(diameter, thickness, od = undef) {
|
module round_grommet_assembly(diameter, thickness, od = undef) {
|
||||||
color(pp1_colour)
|
stl_colour(pp1_colour)
|
||||||
translate_z(wall)
|
translate_z(wall)
|
||||||
vflip()
|
vflip()
|
||||||
round_grommet_top(diameter, thickness, od);
|
round_grommet_top(diameter, thickness, od);
|
||||||
|
|
||||||
color(pp2_colour)
|
stl_colour(pp2_colour)
|
||||||
translate_z(-thickness)
|
translate_z(-thickness)
|
||||||
vflip()
|
vflip()
|
||||||
round_grommet_bottom(diameter, od);
|
round_grommet_bottom(diameter, od);
|
||||||
@@ -170,14 +170,14 @@ module mouse_grommet(r, thickness) { //! Make the STL for a mouse grommet
|
|||||||
union() {
|
union() {
|
||||||
for(side = [-1, 1])
|
for(side = [-1, 1])
|
||||||
translate_z(side * (width - wall) / 2)
|
translate_z(side * (width - wall) / 2)
|
||||||
linear_extrude(height = wall, center = true)
|
linear_extrude(wall, center = true)
|
||||||
difference() {
|
difference() {
|
||||||
mouse_grommet_hole(r, z = r + wall, h = 0, expand = wall + overlap);
|
mouse_grommet_hole(r, z = r + wall, h = 0, expand = wall + overlap);
|
||||||
|
|
||||||
translate([0, wall])
|
translate([0, wall])
|
||||||
mouse_grommet_hole(r, h = 0, expand = 0);
|
mouse_grommet_hole(r, h = 0, expand = 0);
|
||||||
}
|
}
|
||||||
linear_extrude(height = width - 1, center = true)
|
linear_extrude(width - 1, center = true)
|
||||||
difference() {
|
difference() {
|
||||||
mouse_grommet_hole(r, h = 0, z = r + wall, expand = wall);
|
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)
|
module mouse_grommet_assembly(r, thickness)
|
||||||
color(pp1_colour)
|
stl_colour(pp1_colour)
|
||||||
rotate([-90, 0, 0])
|
rotate([-90, 0, 0])
|
||||||
mouse_grommet(r, thickness);
|
mouse_grommet(r, thickness);
|
||||||
|
|
||||||
|
@@ -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;
|
$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
|
module ESP12F_carrier_stl() { //! Generate the STL for an ESP12 carrier
|
||||||
stl("ESP12F_carrier");
|
stl("ESP12F_carrier");
|
||||||
@@ -33,7 +35,7 @@ module ESP12F_carrier_stl() { //! Generate the STL for an ESP12 carrier
|
|||||||
hole2 = pitch2 - 3 * extrusion_width;
|
hole2 = pitch2 - 3 * extrusion_width;
|
||||||
length1 = (pins - 1) * pitch1 + hole + squeezed_wall * 2;
|
length1 = (pins - 1) * pitch1 + hole + squeezed_wall * 2;
|
||||||
length2 = (pins - 1) * pitch2 + hole + squeezed_wall * 2;
|
length2 = (pins - 1) * pitch2 + hole + squeezed_wall * 2;
|
||||||
height = 3;
|
height = carrier_height();
|
||||||
|
|
||||||
wpitch1 = (pins - 1) * pitch1;
|
wpitch1 = (pins - 1) * pitch1;
|
||||||
wpitch2 = ceil(wpitch1 / 2.54) * 2.54;
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -31,7 +31,6 @@
|
|||||||
//! Star washers can be omitted by setting ```star_washers``` to false.
|
//! Star washers can be omitted by setting ```star_washers``` to false.
|
||||||
//
|
//
|
||||||
include <../core.scad>
|
include <../core.scad>
|
||||||
include <../vitamins/screws.scad>
|
|
||||||
use <../vitamins/insert.scad>
|
use <../vitamins/insert.scad>
|
||||||
use <../utils/rounded_cylinder.scad>
|
use <../utils/rounded_cylinder.scad>
|
||||||
use <../utils/maths.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))) {
|
assembly(str("corner_block_M", 20 * screw_radius(screw))) {
|
||||||
insert = screw_insert(screw);
|
insert = screw_insert(screw);
|
||||||
|
|
||||||
color(name ? pp2_colour : pp1_colour)
|
stl_colour(name ? pp2_colour : pp1_colour)
|
||||||
render() corner_block(screw, name) children();
|
render() corner_block(screw, name) children();
|
||||||
|
|
||||||
corner_block_h_holes(screw)
|
corner_block_h_holes(screw)
|
||||||
|
@@ -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.
|
//! 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 <../core.scad>
|
||||||
include <../vitamins/screws.scad>
|
|
||||||
|
|
||||||
width = 18;
|
width = 18;
|
||||||
thickness = 4;
|
thickness = 4;
|
||||||
@@ -61,7 +60,7 @@ module door_hinge(door_thickness) { //! Generates STL fo
|
|||||||
|
|
||||||
union() {
|
union() {
|
||||||
rotate([90, 0, 0])
|
rotate([90, 0, 0])
|
||||||
linear_extrude(height = width, center = true)
|
linear_extrude(width, center = true)
|
||||||
difference() {
|
difference() {
|
||||||
hull() {
|
hull() {
|
||||||
translate([dia / 2, thickness + door_thickness / 2])
|
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])
|
translate([dia / 2, thickness + door_thickness / 2])
|
||||||
teardrop(r = screw_clearance_radius(pin_screw), h = 0);
|
teardrop(r = screw_clearance_radius(pin_screw), h = 0);
|
||||||
}
|
}
|
||||||
linear_extrude(height = thickness)
|
linear_extrude(thickness)
|
||||||
difference() {
|
difference() {
|
||||||
hull() {
|
hull() {
|
||||||
translate([0, -width / 2])
|
translate([0, -width / 2])
|
||||||
@@ -109,7 +108,7 @@ module door_hinge_stat_stl() { //! Generates the STL for the stationary part
|
|||||||
stl("door_hinge_stat");
|
stl("door_hinge_stat");
|
||||||
|
|
||||||
union() {
|
union() {
|
||||||
linear_extrude(height = thickness)
|
linear_extrude(thickness)
|
||||||
difference() {
|
difference() {
|
||||||
rounded_square([stat_length, stat_width], rad);
|
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])
|
rotate([90, 0, 0])
|
||||||
linear_extrude(height = stat_width, center = true)
|
linear_extrude(stat_width, center = true)
|
||||||
difference() {
|
difference() {
|
||||||
hull() {
|
hull() {
|
||||||
translate([0, dia / 2 + stat_clearance])
|
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]) {
|
translate([0, pin_y - (thickness + door_thickness / 2), dir * width / 2]) {
|
||||||
rotate([90, 0, 180])
|
rotate([90, 0, 180])
|
||||||
color("red") door_hinge(door_thickness);
|
stl_colour(pp2_colour) door_hinge(door_thickness);
|
||||||
|
|
||||||
rotate([90, 0, 0])
|
rotate([90, 0, 0])
|
||||||
door_hinge_hole_positions()
|
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)))])
|
translate([pin_x, 0, -dir * (stat_width / 2 + washer_thickness(screw_washer(pin_screw)))])
|
||||||
rotate([90, 0, 0]) {
|
rotate([90, 0, 0]) {
|
||||||
color("lime") door_hinge_stat_stl();
|
stl_colour(pp1_colour) door_hinge_stat_stl();
|
||||||
|
|
||||||
door_hinge_stat_hole_positions() {
|
door_hinge_stat_hole_positions() {
|
||||||
screw_and_washer(stat_screw, stat_screw_length);
|
screw_and_washer(stat_screw, stat_screw_length);
|
||||||
|
@@ -22,7 +22,6 @@
|
|||||||
//
|
//
|
||||||
include <../core.scad>
|
include <../core.scad>
|
||||||
use <../utils/hanging_hole.scad>
|
use <../utils/hanging_hole.scad>
|
||||||
include <../vitamins/screws.scad>
|
|
||||||
|
|
||||||
length = 35;
|
length = 35;
|
||||||
width = 12;
|
width = 12;
|
||||||
@@ -66,7 +65,7 @@ module door_latch_assembly(sheet_thickness = 3) { //! The assembly for a specifi
|
|||||||
|
|
||||||
translate([0, -height - washer_thickness(washer)])
|
translate([0, -height - washer_thickness(washer)])
|
||||||
rotate([-90, 0, 0]) {
|
rotate([-90, 0, 0]) {
|
||||||
color("lime") render() door_latch_stl();
|
stl_colour(pp1_colour) render() door_latch_stl();
|
||||||
|
|
||||||
translate_z(nut_trap_depth)
|
translate_z(nut_trap_depth)
|
||||||
vflip()
|
vflip()
|
||||||
|
@@ -31,7 +31,6 @@
|
|||||||
//! Star washers can be omitted by setting ```star_washers``` to false.
|
//! Star washers can be omitted by setting ```star_washers``` to false.
|
||||||
//
|
//
|
||||||
include <../core.scad>
|
include <../core.scad>
|
||||||
include <../vitamins/screws.scad>
|
|
||||||
use <../vitamins/insert.scad>
|
use <../vitamins/insert.scad>
|
||||||
use <../utils/maths.scad>
|
use <../utils/maths.scad>
|
||||||
|
|
||||||
@@ -82,7 +81,7 @@ module fixing_block(screw = def_screw) { //! Generate the STL
|
|||||||
|
|
||||||
difference() {
|
difference() {
|
||||||
union() {
|
union() {
|
||||||
linear_extrude(height = fb_height, convexity = 5)
|
linear_extrude(fb_height, convexity = 5)
|
||||||
difference() {
|
difference() {
|
||||||
hull() {
|
hull() {
|
||||||
for(side = [-1, 1]) {
|
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))) {
|
assembly(str("fixing_block_M", 20 * screw_radius(screw))) {
|
||||||
translate_z(fixing_block_height(screw))
|
translate_z(fixing_block_height(screw))
|
||||||
rotate([0, 180, 0])
|
rotate([0, 180, 0])
|
||||||
color(pp1_colour) render() fixing_block(screw);
|
stl_colour(pp1_colour) render() fixing_block(screw);
|
||||||
|
|
||||||
insert = screw_insert(screw);
|
insert = screw_insert(screw);
|
||||||
|
|
||||||
|
@@ -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.
|
//! 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 <../core.scad>
|
||||||
include <../vitamins/screws.scad>
|
|
||||||
|
|
||||||
function hinge_width(type) = type[1]; //! Width
|
function hinge_width(type) = type[1]; //! Width
|
||||||
function hinge_depth(type) = type[2]; //! Depth of each leaf
|
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
|
teardrop_r = kr / cos(22.5); // The corner on the teardrop
|
||||||
inset = sqrt(sqr(teardrop_r + gap) - sqr(kr - t)) - kr;
|
inset = sqrt(sqr(teardrop_r + gap) - sqr(kr - t)) - kr;
|
||||||
|
|
||||||
linear_extrude(height =t)
|
linear_extrude(t)
|
||||||
difference() {
|
difference() {
|
||||||
hull() {
|
hull() {
|
||||||
for(side = [-1, 1])
|
for(side = [-1, 1])
|
||||||
@@ -103,7 +102,7 @@ module hinge_male(type, female = false) { //! The half with the stationary
|
|||||||
rotate([90, 0, -90])
|
rotate([90, 0, -90])
|
||||||
for(z = [0 : (female ? fn : mn) - 1])
|
for(z = [0 : (female ? fn : mn) - 1])
|
||||||
translate_z(-dir * w / 2 + z * dir * pitch + (female ? -fw - mw - gap : 0))
|
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() {
|
difference() {
|
||||||
hull() {
|
hull() {
|
||||||
rotate(180)
|
rotate(180)
|
||||||
@@ -134,17 +133,17 @@ assembly(str("hinge_", type[0])) { //! Assembled hinge
|
|||||||
|
|
||||||
vitamin(str(": Hinge pin ", w, " x ", 2 * hr, "mm"));
|
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]) {
|
translate([0, -kr, kr]) {
|
||||||
rotate([0, 90, 0])
|
rotate([0, 90, 0])
|
||||||
explode(w + 10)
|
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])
|
rotate([-angle, 0, 0])
|
||||||
translate([0, -kr, -kr])
|
translate([0, -kr, -kr])
|
||||||
rotate(180)
|
rotate(180)
|
||||||
color(pp2_colour) hinge_female(type);
|
stl_colour(pp2_colour) hinge_female(type);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -22,7 +22,6 @@
|
|||||||
//! inserts don't grip well in rubber.
|
//! inserts don't grip well in rubber.
|
||||||
//
|
//
|
||||||
include <../core.scad>
|
include <../core.scad>
|
||||||
include <../vitamins/screws.scad>
|
|
||||||
use <../vitamins/insert.scad>
|
use <../vitamins/insert.scad>
|
||||||
|
|
||||||
foot = [25, 12, 3, 2, M4_cap_screw, 10];
|
foot = [25, 12, 3, 2, M4_cap_screw, 10];
|
||||||
@@ -57,7 +56,7 @@ module foot(type = foot) { //! Generate STL
|
|||||||
circle4n(r);
|
circle4n(r);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
linear_extrude(height = t)
|
linear_extrude(t)
|
||||||
difference() {
|
difference() {
|
||||||
circle(r1 + eps);
|
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);
|
screw_length = screw_longer_than(foot_thickness(type) + t + 2 * washer_thickness(washer) + nut_thickness(nut, true) - squeeze);
|
||||||
|
|
||||||
vflip() explode(15, true) {
|
vflip() explode(15, true) {
|
||||||
color(pp4_colour) foot(type);
|
stl_colour(pp4_colour) foot(type);
|
||||||
|
|
||||||
if(t)
|
if(t)
|
||||||
explode(15, true)
|
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() {
|
difference() {
|
||||||
circle(r5 + eps);
|
circle(r5 + eps);
|
||||||
|
|
||||||
@@ -137,7 +136,7 @@ assembly("insert_foot") {
|
|||||||
insert = screw_insert(screw);
|
insert = screw_insert(screw);
|
||||||
|
|
||||||
vflip()
|
vflip()
|
||||||
color(pp1_colour) insert_foot(type);
|
stl_colour(pp4_colour) insert_foot(type);
|
||||||
|
|
||||||
translate_z(-foot_thickness(type))
|
translate_z(-foot_thickness(type))
|
||||||
insert(insert);
|
insert(insert);
|
||||||
|
@@ -21,7 +21,6 @@
|
|||||||
//! Printed handle that can be printed without needing support material due to its truncated teardrop profile.
|
//! Printed handle that can be printed without needing support material due to its truncated teardrop profile.
|
||||||
//
|
//
|
||||||
include <../core.scad>
|
include <../core.scad>
|
||||||
include <../vitamins/screws.scad>
|
|
||||||
use <../vitamins/insert.scad>
|
use <../vitamins/insert.scad>
|
||||||
|
|
||||||
dia = 18;
|
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
|
module handle_assembly() pose([225, 0, 150], [0, 0, 14]) //! Printed part with inserts in place
|
||||||
assembly("handle") {
|
assembly("handle") {
|
||||||
translate_z(handle_height())
|
translate_z(handle_height())
|
||||||
color(pp1_colour) vflip() handle_stl();
|
stl_colour(pp1_colour) vflip() handle_stl();
|
||||||
|
|
||||||
handle_screw_positions()
|
handle_screw_positions()
|
||||||
vflip()
|
vflip()
|
||||||
|
@@ -22,7 +22,6 @@
|
|||||||
//! The stl must be given a parameterless wrapper in the project that uses it.
|
//! The stl must be given a parameterless wrapper in the project that uses it.
|
||||||
//
|
//
|
||||||
include <../core.scad>
|
include <../core.scad>
|
||||||
include <../vitamins/screws.scad>
|
|
||||||
use <../vitamins/pcb.scad>
|
use <../vitamins/pcb.scad>
|
||||||
|
|
||||||
clearance = 0.2;
|
clearance = 0.2;
|
||||||
@@ -63,7 +62,7 @@ module pcb_mount_ring()
|
|||||||
}
|
}
|
||||||
|
|
||||||
module pcb_mount_washer_stl() //! A plastic washer to clamp a PCB
|
module pcb_mount_washer_stl() //! A plastic washer to clamp a PCB
|
||||||
linear_extrude(height = washer_thickness)
|
linear_extrude(washer_thickness)
|
||||||
pcb_mount_ring();
|
pcb_mount_ring();
|
||||||
|
|
||||||
module pcb_mount(pcb, height = 5, washers = true) { //! Make the STL of a pcb mount for the specified PCB.
|
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);
|
cube([pillar_x_pitch(pcb) - 2 * wall, frame_w, frame_t], center = true);
|
||||||
|
|
||||||
pcb_mount_screw_positions(pcb)
|
pcb_mount_screw_positions(pcb)
|
||||||
linear_extrude(height = height)
|
linear_extrude(height)
|
||||||
pcb_mount_ring();
|
pcb_mount_ring();
|
||||||
|
|
||||||
linear_extrude(height = height + pcb_thickness(pcb) - layer_height)
|
linear_extrude(height + pcb_thickness(pcb) - layer_height)
|
||||||
difference() {
|
difference() {
|
||||||
pcb_mount_screw_positions(pcb)
|
pcb_mount_screw_positions(pcb)
|
||||||
pcb_mount_ring();
|
pcb_mount_ring();
|
||||||
@@ -102,7 +101,7 @@ module pcb_mount_assembly(pcb, thickness, height = 5) { //! A PCB mount assembly
|
|||||||
translate_z(height)
|
translate_z(height)
|
||||||
pcb(pcb);
|
pcb(pcb);
|
||||||
|
|
||||||
color(pp1_colour) pcb_mount(pcb, washers = false);
|
stl_colour(pp1_colour) pcb_mount(pcb, washers = false);
|
||||||
|
|
||||||
washer = screw_washer(screw);
|
washer = screw_washer(screw);
|
||||||
nut = screw_nut(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) {
|
pcb_mount_screw_positions(pcb) {
|
||||||
translate_z(height + t) {
|
translate_z(height + t) {
|
||||||
color(pp2_colour) pcb_mount_washer_stl();
|
stl_colour(pp2_colour) pcb_mount_washer_stl();
|
||||||
|
|
||||||
translate_z(washer_thickness)
|
translate_z(washer_thickness)
|
||||||
screw(screw, screw_length);
|
screw(screw, screw_length);
|
||||||
|
@@ -27,7 +27,6 @@
|
|||||||
//! It can also have printed feet on the base with the screws doubling up to hold the base on.
|
//! It can also have printed feet on the base with the screws doubling up to hold the base on.
|
||||||
//
|
//
|
||||||
include <../core.scad>
|
include <../core.scad>
|
||||||
include <../vitamins/screws.scad>
|
|
||||||
use <../vitamins/insert.scad>
|
use <../vitamins/insert.scad>
|
||||||
use <foot.scad>
|
use <foot.scad>
|
||||||
|
|
||||||
@@ -130,7 +129,7 @@ module pbox_base(type) { //! Generate the STL for the base
|
|||||||
t = pbox_base(type);
|
t = pbox_base(type);
|
||||||
difference() {
|
difference() {
|
||||||
union() {
|
union() {
|
||||||
linear_extrude(height = t)
|
linear_extrude(t)
|
||||||
offset(base_outset - 0.2)
|
offset(base_outset - 0.2)
|
||||||
pbox_inner_shape(type);
|
pbox_inner_shape(type);
|
||||||
|
|
||||||
@@ -158,7 +157,7 @@ module pbox(type) { //! Generate the STL for the main case
|
|||||||
|
|
||||||
difference() {
|
difference() {
|
||||||
union() {
|
union() {
|
||||||
linear_extrude(height = total_height)
|
linear_extrude(total_height)
|
||||||
offset(wall / 2) pbox_mid_shape(type);
|
offset(wall / 2) pbox_mid_shape(type);
|
||||||
|
|
||||||
if($children > 2)
|
if($children > 2)
|
||||||
@@ -167,11 +166,11 @@ module pbox(type) { //! Generate the STL for the main case
|
|||||||
difference() {
|
difference() {
|
||||||
translate_z(top_thickness)
|
translate_z(top_thickness)
|
||||||
union() {
|
union() {
|
||||||
linear_extrude(height = height + eps)
|
linear_extrude(height + eps)
|
||||||
offset(-wall / 2) pbox_mid_shape(type);
|
offset(-wall / 2) pbox_mid_shape(type);
|
||||||
|
|
||||||
translate_z(height) // Recess for the base
|
translate_z(height) // Recess for the base
|
||||||
linear_extrude(height = total_height - height)
|
linear_extrude(total_height - height)
|
||||||
offset(base_outset)
|
offset(base_outset)
|
||||||
pbox_inner_shape(type);
|
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);
|
rounded_rectangle([pbox_width(type) + 2 * outset, pbox_depth(type) + 2 * outset, ledge_h], 1, center = false);
|
||||||
|
|
||||||
hull() {
|
hull() {
|
||||||
linear_extrude(height = ledge_h + eps)
|
linear_extrude(ledge_h + eps)
|
||||||
offset(ledge_inset)
|
offset(ledge_inset)
|
||||||
pbox_inner_shape(type);
|
pbox_inner_shape(type);
|
||||||
|
|
||||||
linear_extrude(height = eps)
|
linear_extrude(eps)
|
||||||
offset(ledge_outset)
|
offset(ledge_outset)
|
||||||
pbox_inner_shape(type);
|
pbox_inner_shape(type);
|
||||||
}
|
}
|
||||||
@@ -222,7 +221,7 @@ module pbox_base_screws(type, thickness = 0) //! Place the screws and
|
|||||||
pbox_screw_positions(type) {
|
pbox_screw_positions(type) {
|
||||||
foot = pbox_foot(type);
|
foot = pbox_foot(type);
|
||||||
if(foot)
|
if(foot)
|
||||||
color(pp4_colour)
|
stl_colour(pp4_colour)
|
||||||
foot(foot);
|
foot(foot);
|
||||||
|
|
||||||
translate_z(foot ? foot_thickness(foot) : thickness)
|
translate_z(foot ? foot_thickness(foot) : thickness)
|
||||||
|
@@ -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.
|
//! 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 <../core.scad>
|
||||||
include <../vitamins/screws.scad>
|
|
||||||
use <../vitamins/insert.scad>
|
use <../vitamins/insert.scad>
|
||||||
|
|
||||||
use <../vitamins/wire.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]) {
|
translate([centre_x, -centre_y]) {
|
||||||
rounded_rectangle([depth - eps, width - eps, top], rad, center = false);
|
rounded_rectangle([depth - eps, width - eps, top], rad, center = false);
|
||||||
|
|
||||||
linear_extrude(height = height)
|
linear_extrude(height)
|
||||||
difference() {
|
difference() {
|
||||||
shape();
|
shape();
|
||||||
|
|
||||||
translate([depth / 2, width / 2 - 5])
|
translate([depth / 2, width / 2 - 5])
|
||||||
square([2 * (depth - extent + terminal_clearance), 10], center = true);
|
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();
|
shape();
|
||||||
}
|
}
|
||||||
// cable slots
|
// cable slots
|
||||||
for(i = [0 : 1 : cables - 1])
|
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])
|
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])
|
rotate([90, 0, 90])
|
||||||
linear_extrude(height = wall, center = true)
|
linear_extrude(wall, center = true)
|
||||||
difference() {
|
difference() {
|
||||||
square([cable_d + eps, height], center = true);
|
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
|
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))
|
translate_z(psu_shroud_height(type))
|
||||||
vflip()
|
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)
|
psu_shroud_hole_positions(type)
|
||||||
vflip()
|
vflip()
|
||||||
|
@@ -21,7 +21,6 @@
|
|||||||
//! Clamp for ribbon cable and polypropylene strip.
|
//! Clamp for ribbon cable and polypropylene strip.
|
||||||
//
|
//
|
||||||
include <../core.scad>
|
include <../core.scad>
|
||||||
include <../vitamins/screws.scad>
|
|
||||||
use <../vitamins/insert.scad>
|
use <../vitamins/insert.scad>
|
||||||
use <../vitamins/cable_strip.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)) {
|
assembly(str("ribbon_clamp_", ways)) {
|
||||||
h = ribbon_clamp_height();
|
h = ribbon_clamp_height();
|
||||||
|
|
||||||
color(pp1_colour) render()
|
stl_colour(pp1_colour) render()
|
||||||
translate_z(h) vflip() ribbon_clamp(ways);
|
translate_z(h) vflip() ribbon_clamp(ways);
|
||||||
|
|
||||||
ribbon_clamp_hole_positions(ways)
|
ribbon_clamp_hole_positions(ways)
|
||||||
|
@@ -21,7 +21,6 @@
|
|||||||
//! Knob with embedded hex head screw.
|
//! Knob with embedded hex head screw.
|
||||||
//
|
//
|
||||||
include <../core.scad>
|
include <../core.scad>
|
||||||
include <../vitamins/screws.scad>
|
|
||||||
use <../utils/hanging_hole.scad>
|
use <../utils/hanging_hole.scad>
|
||||||
|
|
||||||
knob_wall = 2;
|
knob_wall = 2;
|
||||||
@@ -49,7 +48,7 @@ module screw_knob(screw) { //! Generate the STL for a knob to fit the specified
|
|||||||
rotate(45)
|
rotate(45)
|
||||||
circle(r = nut_trap_radius(screw_nut(screw)), $fn = 6);
|
circle(r = nut_trap_radius(screw_nut(screw)), $fn = 6);
|
||||||
}
|
}
|
||||||
linear_extrude(height = knob_thickness, convexity = 3)
|
linear_extrude(knob_thickness, convexity = 3)
|
||||||
difference() {
|
difference() {
|
||||||
polygon(points = [for(a = [0 : 359]) [wave(a) * sin(a), wave(a) * cos(a)]]);
|
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)) {
|
assembly(str("screw_knob_M", 20 * screw_radius(screw), "_", length)) {
|
||||||
translate_z(knob_height)
|
translate_z(knob_height)
|
||||||
vflip()
|
vflip()
|
||||||
color(pp1_colour) screw_knob(screw);
|
stl_colour(pp1_colour) screw_knob(screw);
|
||||||
|
|
||||||
translate_z(knob_height - knob_nut_trap_depth(screw))
|
translate_z(knob_height - knob_nut_trap_depth(screw))
|
||||||
rotate(-45)
|
rotate(-45)
|
||||||
|
@@ -22,9 +22,8 @@
|
|||||||
//
|
//
|
||||||
include <../core.scad>
|
include <../core.scad>
|
||||||
include <../vitamins/mains_sockets.scad>
|
include <../vitamins/mains_sockets.scad>
|
||||||
include <../vitamins/screws.scad>
|
|
||||||
use <../vitamins/insert.scad>
|
|
||||||
include <../vitamins/ring_terminals.scad>
|
include <../vitamins/ring_terminals.scad>
|
||||||
|
use <../vitamins/insert.scad>
|
||||||
|
|
||||||
box_height = 19;
|
box_height = 19;
|
||||||
base_thickness = 2;
|
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);
|
insert_hole_radius = insert_hole_radius(insert);
|
||||||
|
|
||||||
difference() {
|
difference() {
|
||||||
linear_extrude(height = height, convexity = 5)
|
linear_extrude(height, convexity = 5)
|
||||||
face_plate(type);
|
face_plate(type);
|
||||||
|
|
||||||
difference() {
|
difference() {
|
||||||
translate_z(base_thickness)
|
translate_z(base_thickness)
|
||||||
linear_extrude(height = height, convexity = 5)
|
linear_extrude(height, convexity = 5)
|
||||||
offset(-wall) offset(1) face_plate(type);
|
offset(-wall) offset(1) face_plate(type);
|
||||||
|
|
||||||
for(side = [-1, 1])
|
for(side = [-1, 1])
|
||||||
@@ -93,7 +92,7 @@ assembly(str("socket_box_", type[0])) {
|
|||||||
screw = mains_socket_screw(type);
|
screw = mains_socket_screw(type);
|
||||||
insert = screw_insert(screw);
|
insert = screw_insert(screw);
|
||||||
|
|
||||||
color("lime") render() socket_box(type);
|
stl_colour(pp1_colour) render() socket_box(type);
|
||||||
|
|
||||||
mains_socket_hole_positions(type)
|
mains_socket_hole_positions(type)
|
||||||
translate_z(height)
|
translate_z(height)
|
||||||
|
@@ -19,10 +19,9 @@
|
|||||||
|
|
||||||
//
|
//
|
||||||
//! A cover to go over the mains end of an SSR to make it safe to be touched.
|
//! 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 <../core.scad>
|
||||||
include <../vitamins/screws.scad>
|
|
||||||
use <../vitamins/insert.scad>
|
use <../vitamins/insert.scad>
|
||||||
|
|
||||||
use <../vitamins/wire.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]) {
|
translate([center_x, 0]) {
|
||||||
rounded_rectangle([depth - eps, width - eps, top], rad, center = false);
|
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() {
|
round(or = wall / 2 - eps, ir = 0) difference() {
|
||||||
rounded_square([depth, width], rad);
|
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])
|
for(side = [-1, 1])
|
||||||
translate([cable_x, side * (width / 2 - wall / 2), height / 2])
|
translate([cable_x, side * (width / 2 - wall / 2), height / 2])
|
||||||
rotate([90, 0, 0])
|
rotate([90, 0, 0])
|
||||||
linear_extrude(height = wall, center = true)
|
linear_extrude(wall, center = true)
|
||||||
difference() {
|
difference() {
|
||||||
square([cable_d + eps, height], center = true);
|
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
|
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))
|
translate_z(ssr_shroud_height(type))
|
||||||
vflip()
|
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)
|
ssr_shroud_hole_positions(type)
|
||||||
insert(insert);
|
insert(insert);
|
||||||
@@ -136,7 +135,7 @@ module ssr_shroud_fastened_assembly(type, cable_d, thickness, name) //! Assembly
|
|||||||
|
|
||||||
*translate_z(cable_d / 2)
|
*translate_z(cable_d / 2)
|
||||||
rotate([90, 0, 0])
|
rotate([90, 0, 0])
|
||||||
color(grey20)
|
stl_colour(grey20)
|
||||||
cylinder(d = cable_d, h = 20, center = true);
|
cylinder(d = cable_d, h = 20, center = true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -22,7 +22,6 @@
|
|||||||
//! be fully customised by passing a list of properties.
|
//! be fully customised by passing a list of properties.
|
||||||
//
|
//
|
||||||
include <../core.scad>
|
include <../core.scad>
|
||||||
include <../vitamins/screws.scad>
|
|
||||||
use <../vitamins/insert.scad>
|
use <../vitamins/insert.scad>
|
||||||
|
|
||||||
strap = [18, 2, M3_pan_screw, 3, 25];
|
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);
|
len = length - 2 * (wall + clearance);
|
||||||
w = strap_width(type);
|
w = strap_width(type);
|
||||||
|
|
||||||
linear_extrude(height = strap_thickness(type), convexity = 3)
|
linear_extrude(strap_thickness(type), convexity = 3)
|
||||||
difference() {
|
difference() {
|
||||||
rounded_square([len, w], w / 2 - eps);
|
rounded_square([len, w], w / 2 - eps);
|
||||||
|
|
||||||
@@ -120,12 +119,12 @@ module strap_end(type = strap) { //! Generate the STL for end piece
|
|||||||
}
|
}
|
||||||
|
|
||||||
union() {
|
union() {
|
||||||
linear_extrude(height = z1)
|
linear_extrude(z1)
|
||||||
with_hole()
|
with_hole()
|
||||||
outer();
|
outer();
|
||||||
|
|
||||||
translate_z(z1)
|
translate_z(z1)
|
||||||
linear_extrude(height = strap_height(type) - z1)
|
linear_extrude(strap_height(type) - z1)
|
||||||
difference() {
|
difference() {
|
||||||
outer();
|
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()
|
with_hole()
|
||||||
strap_boss_shape(type);
|
strap_boss_shape(type);
|
||||||
|
|
||||||
linear_extrude(height = z2)
|
linear_extrude(z2)
|
||||||
with_hole()
|
with_hole()
|
||||||
offset(cnc_bit_r)
|
offset(cnc_bit_r)
|
||||||
offset(-step - 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)
|
module strap_end_assembly(type = strap)
|
||||||
assembly("strap_end") {
|
assembly("strap_end") {
|
||||||
color(pp1_colour)
|
stl_colour(pp1_colour)
|
||||||
strap_end(type);
|
strap_end(type);
|
||||||
|
|
||||||
translate_z(strap_height(type) + strap_key(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);
|
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)
|
strap_screw_positions(length, type)
|
||||||
translate_z(strap_height(type))
|
translate_z(strap_height(type))
|
||||||
|
517
readme.md
@@ -17,41 +17,77 @@ See [usage](docs/usage.md) for requirements, installation instructions and a usa
|
|||||||
|
|
||||||
## Table of Contents<a name="top"/>
|
## Table of Contents<a name="top"/>
|
||||||
<table><tr>
|
<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>
|
<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 = "#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 = "#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 = "#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 = "#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 = "#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 = "#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 = "#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 = "#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 = "#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 = "#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 = "#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 = "#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 = "#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 = "#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 = "#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 = "#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 = "#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 = "#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 = "#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 = "#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 = "#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 = "#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 = "#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 = "#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 = "#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 = "#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 = "#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 = "#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 = "#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 = "#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 = "#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 = "#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 = "#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 = "#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 = "#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 = "#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 = "#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 = "#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 = "#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 = "#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 = "#Jack">Jack</a> </td><td> <a href = "#Springs">Springs</a> </td><td></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 = "#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 = "#IECs">IECs</a> </td><td></td><td> <a href = "#Wire">Wire</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 = "#Inserts">Inserts</a> </td><td></td><td> <a href = "#Zipties">Zipties</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>
|
|
||||||
</table>
|
</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. |
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### 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>
|
<a name="Ball_bearings"></a>
|
||||||
## Ball_bearings
|
## 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_bore(type)``` | Internal diameter |
|
||||||
| ```bb_colour(type)``` | Shield colour, "silver" for metal |
|
| ```bb_colour(type)``` | Shield colour, "silver" for metal |
|
||||||
| ```bb_diameter(type)``` | External diameter |
|
| ```bb_diameter(type)``` | External diameter |
|
||||||
|
| ```bb_hub(type)``` | Inner rim thickness guesstimate |
|
||||||
| ```bb_name(type)``` | Part code without shield type suffix |
|
| ```bb_name(type)``` | Part code without shield type suffix |
|
||||||
|
| ```bb_rim(type)``` | Outer rim thickness guesstimate |
|
||||||
| ```bb_width(type)``` | Width |
|
| ```bb_width(type)``` | Width |
|
||||||
|
|
||||||
### Functions
|
|
||||||
| Function | Description |
|
|
||||||
|:--- |:--- |
|
|
||||||
| ```bb_rim(type)``` | Inner and outer rim thickness |
|
|
||||||
|
|
||||||
### Modules
|
### Modules
|
||||||
| Module | Description |
|
| 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(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(BB6201)``` | Ball bearing 6201-2RS 12mm x 32mm x 10mm |
|
||||||
| 1 | ```ball_bearing(BB624)``` | Ball bearing 624-2RS 4mm x 13mm x 5mm |
|
| 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>
|
<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 |
|
| 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 |
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### 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>
|
<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 |
|
| 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 |
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### 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>
|
<a href="#top">Top</a>
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -676,14 +796,15 @@ Aluminium extrusion.
|
|||||||
### Vitamins
|
### Vitamins
|
||||||
| Qty | Module call | BOM entry |
|
| Qty | Module call | BOM entry |
|
||||||
| ---:|:--- |:---|
|
| ---:|:--- |:---|
|
||||||
|
| 1 | ```extrusion(E1515, 80)``` | Extrusion E1515 x 80mm |
|
||||||
| 1 | ```extrusion(E2020, 80)``` | Extrusion E2020 x 80mm |
|
| 1 | ```extrusion(E2020, 80)``` | Extrusion E2020 x 80mm |
|
||||||
| 1 | ```extrusion(E2040, 80)``` | Extrusion E2040 x 80mm |
|
| 1 | ```extrusion(E2040, 80)``` | Extrusion E2040 x 80mm |
|
||||||
| 1 | ```extrusion(E2060, 80)``` | Extrusion E2060 x 80mm |
|
| 1 | ```extrusion(E2060, 80)``` | Extrusion E2060 x 80mm |
|
||||||
| 1 | ```extrusion(E2080, 80)``` | Extrusion E2080 x 80mm |
|
| 1 | ```extrusion(E2080, 80)``` | Extrusion E2080 x 80mm |
|
||||||
| 1 | ```extrusion(E3030, 80)``` | Extrusion E3030 x 80mm |
|
| 1 | ```extrusion(E3030, 80, cornerHole = true)``` | Extrusion E3030 x 80mm |
|
||||||
| 1 | ```extrusion(E3060, 80)``` | Extrusion E3060 x 80mm |
|
| 1 | ```extrusion(E3060, 80, cornerHole = true)``` | Extrusion E3060 x 80mm |
|
||||||
| 1 | ```extrusion(E4040, 80)``` | Extrusion E4040 x 80mm |
|
| 1 | ```extrusion(E4040, 80, cornerHole = true)``` | Extrusion E4040 x 80mm |
|
||||||
| 1 | ```extrusion(E4080, 80)``` | Extrusion E4080 x 80mm |
|
| 1 | ```extrusion(E4080, 80, cornerHole = true)``` | Extrusion E4080 x 80mm |
|
||||||
|
|
||||||
|
|
||||||
<a href="#top">Top</a>
|
<a href="#top">Top</a>
|
||||||
@@ -859,6 +980,7 @@ Parametric green terminal blocks
|
|||||||
| ```gt_back_depth(type)``` | Back ledge depth |
|
| ```gt_back_depth(type)``` | Back ledge depth |
|
||||||
| ```gt_back_height(type)``` | Height at the back |
|
| ```gt_back_height(type)``` | Height at the back |
|
||||||
| ```gt_box_h(type)``` | Height of the cable entry box |
|
| ```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_box_w(type)``` | Width inside the cable entry box |
|
||||||
| ```gt_depth(type)``` | Total front to back depth |
|
| ```gt_depth(type)``` | Total front to back depth |
|
||||||
| ```gt_front_depth(type)``` | Front ledge depth |
|
| ```gt_front_depth(type)``` | Front ledge depth |
|
||||||
@@ -870,13 +992,12 @@ Parametric green terminal blocks
|
|||||||
| ```gt_top(type)``` | Depth at the top |
|
| ```gt_top(type)``` | Depth at the top |
|
||||||
| ```gt_tube_h(type)``` | Height of optional tubes around the screws |
|
| ```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_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
|
### Modules
|
||||||
| Module | Description |
|
| Module | Description |
|
||||||
|:--- |:--- |
|
|:--- |:--- |
|
||||||
| ```green_terminal(type, ways, skip = [], colour = "lime")``` | Draw green terminal blocks, skip can be used to remove pins. |
|
| ```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 |
|
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
@@ -884,8 +1005,9 @@ Parametric green terminal blocks
|
|||||||
| Qty | Module call | BOM entry |
|
| Qty | Module call | BOM entry |
|
||||||
| ---:|:--- |:---|
|
| ---:|:--- |:---|
|
||||||
| 1 | ```green_terminal(gt_6p35, 2)``` | Terminal block 2 way 0.25" |
|
| 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_5p08, 3)``` | Terminal block 3 way 0.2" |
|
||||||
| 1 | ```green_terminal(gt_2p54, 4)``` | Terminal block 4 way 0.1" |
|
| 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>
|
<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 href="#top">Top</a>
|
||||||
|
|
||||||
---
|
---
|
||||||
<a name="Iecs"></a>
|
<a name="IECs"></a>
|
||||||
## Iecs
|
## IECs
|
||||||
IEC mains inlets and outlet.
|
IEC mains inlets and outlet.
|
||||||
|
|
||||||
|
|
||||||
@@ -995,7 +1117,7 @@ IEC mains inlets and outlet.
|
|||||||
|
|
||||||
[vitamins/iec.scad](vitamins/iec.scad) Implementation.
|
[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
|
### Properties
|
||||||
| Function | Description |
|
| 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 href="#top">Top</a>
|
||||||
|
|
||||||
---
|
---
|
||||||
<a name="Kp_pillow_blocks"></a>
|
<a name="KP_pillow_blocks"></a>
|
||||||
## Kp_pillow_blocks
|
## KP_pillow_blocks
|
||||||
KP pillow block bearings
|
KP pillow block bearings
|
||||||
|
|
||||||
|
|
||||||
@@ -1151,7 +1273,7 @@ KP pillow block bearings
|
|||||||
|
|
||||||
[vitamins/kp_pillow_block.scad](vitamins/kp_pillow_block.scad) Implementation.
|
[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
|
### Properties
|
||||||
| Function | Description |
|
| Function | Description |
|
||||||
@@ -1195,8 +1317,8 @@ KP pillow block bearings
|
|||||||
<a href="#top">Top</a>
|
<a href="#top">Top</a>
|
||||||
|
|
||||||
---
|
---
|
||||||
<a name="Ldrs"></a>
|
<a name="LDRs"></a>
|
||||||
## Ldrs
|
## LDRs
|
||||||
Light dependent resistors.
|
Light dependent resistors.
|
||||||
|
|
||||||
Larger ones seem to have both a higher dark resistance and a lower bright light resistance.
|
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.
|
[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
|
### Properties
|
||||||
| Function | Description |
|
| Function | Description |
|
||||||
@@ -1286,8 +1408,8 @@ Nuts for leadscrews.
|
|||||||
<a href="#top">Top</a>
|
<a href="#top">Top</a>
|
||||||
|
|
||||||
---
|
---
|
||||||
<a name="Leds"></a>
|
<a name="LEDs"></a>
|
||||||
## Leds
|
## LEDs
|
||||||
Standard domed through hole LEDs. Can specify colour and lead length.
|
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.
|
[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
|
### Properties
|
||||||
| Function | Description |
|
| Function | Description |
|
||||||
@@ -1697,8 +1819,12 @@ If a nut is given a child then it gets placed on its top surface.
|
|||||||
### Properties
|
### Properties
|
||||||
| Function | Description |
|
| Function | Description |
|
||||||
|:--- |:--- |
|
|:--- |:--- |
|
||||||
|
| ```nut_pitch(type)``` | Pitch if not standard metric course thread |
|
||||||
| ```nut_radius(type)``` | Radius across the corners |
|
| ```nut_radius(type)``` | Radius across the corners |
|
||||||
| ```nut_size(type)``` | Diameter of the corresponding screw |
|
| ```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_trap_depth(type)``` | Depth of nut trap |
|
||||||
| ```nut_washer(type)``` | Corresponding washer |
|
| ```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(type, nyloc = false, brass = false, nylon = false)``` | Draw specified nut |
|
||||||
| ```nut_and_washer(type, nyloc)``` | Draw nut with corresponding washer |
|
| ```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 |
|
| ```nut_trap(screw, nut, depth = 0, horizontal = false, supported = false, h = 200)``` | Make a nut trap |
|
||||||
| ```wingnut(type)``` | Draw a wingnut |
|
| ```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)``` | Nut M3 x 2.4mm |
|
||||||
| 1 | ```nut(M3_nut, brass = true)``` | Nut M3 x 2.4mm brass |
|
| 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(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_hammer_nut)``` | Nut M4 hammer |
|
||||||
| 1 | ```sliding_t_nut(M4_sliding_t_nut)``` | Nut M4 sliding T |
|
| 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)``` | Nut M4 x 3.2mm |
|
||||||
| 1 | ```nut(M4_nut, nyloc = true)``` | Nut M4 x 3.2mm nyloc |
|
| 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 | ```sliding_t_nut(M5_sliding_t_nut)``` | Nut M5 sliding T |
|
||||||
| 1 | ```nut(M5_nut)``` | Nut M5 x 4mm |
|
| 1 | ```nut(M5_nut)``` | Nut M5 x 4mm |
|
||||||
| 1 | ```nut(M5_nut, nyloc = true)``` | Nut M5 x 4mm nyloc |
|
| 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_half_nut)``` | Nut M6 x 3mm |
|
||||||
| 1 | ```nut(M6_nut)``` | Nut M6 x 5mm |
|
| 1 | ```nut(M6_nut)``` | Nut M6 x 5mm |
|
||||||
| 1 | ```nut(M6_nut, nyloc = true)``` | Nut M6 x 5mm nyloc |
|
| 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)``` | Nut M8 x 6.5mm |
|
||||||
| 1 | ```nut(M8_nut, nyloc = true)``` | Nut M8 x 6.5mm nyloc |
|
| 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 | ```washer(M6_washer)``` | Washer M6 x 12.5mm x 1.5mm |
|
||||||
| 1 | ```wingnut(M4_wingnut)``` | Wingnut M4 |
|
| 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 href="#top">Top</a>
|
||||||
|
|
||||||
---
|
---
|
||||||
<a name="Pcb"></a>
|
<a name="PCB"></a>
|
||||||
## Pcb
|
## 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.
|
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.
|
[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
|
### Properties
|
||||||
| Function | Description |
|
| Function | Description |
|
||||||
@@ -1863,7 +1995,7 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
|
|||||||
| Module | Description |
|
| Module | Description |
|
||||||
|:--- |:--- |
|
|:--- |:--- |
|
||||||
| ```barrel_jack(cutout = false)``` | Draw barrel power jack |
|
| ```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 |
|
| ```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 |
|
| ```flat_flex(cutout = false)``` | Draw flat flexistrip connector as used on RPI0 |
|
||||||
| ```flex(cutout = false)``` | Draw flexistrip connector |
|
| ```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_screw_positions(type)``` | Positions children at the mounting hole positions |
|
||||||
| ```pcb_spacer(screw, height, wall = 1.8, taper = 0)``` | Generate STL for PCB spacer |
|
| ```pcb_spacer(screw, height, wall = 1.8, taper = 0)``` | Generate STL for PCB spacer |
|
||||||
| ```rj45(cutout = false)``` | Draw RJ45 Ethernet connector |
|
| ```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 |
|
| ```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 |
|
| ```uSD(size, cutout = false)``` | Draw uSD socket |
|
||||||
| ```usb_Ax1(cutout = false)``` | Draw USB type A single socket |
|
| ```usb_Ax1(cutout = false)``` | Draw USB type A single socket |
|
||||||
| ```usb_Ax2(cutout = false)``` | Draw USB type A dual 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
|
### Vitamins
|
||||||
| Qty | Module call | BOM entry |
|
| 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 |
|
| 1 | ```pcb(TestPCB)``` | Test PCB |
|
||||||
|
|
||||||
|
|
||||||
<a href="#top">Top</a>
|
<a href="#top">Top</a>
|
||||||
|
|
||||||
---
|
---
|
||||||
<a name="Pcbs"></a>
|
<a name="PCBs"></a>
|
||||||
## Pcbs
|
## 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.
|
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.
|
[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
|
### Properties
|
||||||
| Function | Description |
|
| Function | Description |
|
||||||
@@ -1947,7 +2117,7 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
|
|||||||
| Module | Description |
|
| Module | Description |
|
||||||
|:--- |:--- |
|
|:--- |:--- |
|
||||||
| ```barrel_jack(cutout = false)``` | Draw barrel power jack |
|
| ```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 |
|
| ```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 |
|
| ```flat_flex(cutout = false)``` | Draw flat flexistrip connector as used on RPI0 |
|
||||||
| ```flex(cutout = false)``` | Draw flexistrip connector |
|
| ```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_screw_positions(type)``` | Positions children at the mounting hole positions |
|
||||||
| ```pcb_spacer(screw, height, wall = 1.8, taper = 0)``` | Generate STL for PCB spacer |
|
| ```pcb_spacer(screw, height, wall = 1.8, taper = 0)``` | Generate STL for PCB spacer |
|
||||||
| ```rj45(cutout = false)``` | Draw RJ45 Ethernet connector |
|
| ```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 |
|
| ```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 |
|
| ```uSD(size, cutout = false)``` | Draw uSD socket |
|
||||||
| ```usb_Ax1(cutout = false)``` | Draw USB type A single socket |
|
| ```usb_Ax1(cutout = false)``` | Draw USB type A single socket |
|
||||||
| ```usb_Ax2(cutout = false)``` | Draw USB type A dual 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 | ```d_plug(DCONN15, pcb = true)``` | D-type 15 way PCB mount plug |
|
||||||
| 1 | ```pcb(DuetE)``` | Duet 2 Ethernet electronics |
|
| 1 | ```pcb(DuetE)``` | Duet 2 Ethernet electronics |
|
||||||
| 1 | ```pcb(Duex2)``` | Duex2 expansion board |
|
| 1 | ```pcb(Duex2)``` | Duex2 expansion board |
|
||||||
| 1 | ```pcb(Duex5)``` | Duex5 expasnion board |
|
| 1 | ```pcb(Duex5)``` | Duex5 expansion board |
|
||||||
| 1 | ```pcb(EnviroPlus)``` | Enviro+ |
|
| 1 | ```pcb(EnviroPlus)``` | Enviro+ |
|
||||||
| 1 | ```pcb(ExtruderPCB)``` | Extruder connection PCB |
|
| 1 | ```pcb(ExtruderPCB)``` | Extruder connection PCB |
|
||||||
| 1 | ```pcb(Keyes5p1)``` | Keyes5.1 Arduino Uno expansion board |
|
| 1 | ```pcb(Keyes5p1)``` | Keyes5.1 Arduino Uno expansion board |
|
||||||
|
| 1 | ```pcb(MT3608)``` | MT3608 boost converter module |
|
||||||
| 1 | ```pcb(Melzi)``` | Melzi electronics |
|
| 1 | ```pcb(Melzi)``` | Melzi electronics |
|
||||||
| 4 | | Micro SD card |
|
| 4 | | Micro SD card |
|
||||||
| 1 | ```molex_254(2)``` | Molex KK header 2 way |
|
| 1 | ```molex_254(2)``` | Molex KK header 2 way |
|
||||||
| 1 | ```molex_254(3)``` | Molex KK header 3 way |
|
| 1 | ```molex_254(3)``` | Molex KK header 3 way |
|
||||||
| 16 | ```nut(M2_nut, nyloc = true)``` | Nut M2 x 1.6mm nyloc |
|
| 16 | ```nut(M2_nut, nyloc = true)``` | Nut M2 x 1.6mm nyloc |
|
||||||
| 32 | ```nut(M2p5_nut, nyloc = true)``` | Nut M2.5 x 2.2mm nyloc |
|
| 30 | ```nut(M2p5_nut, nyloc = true)``` | Nut M2.5 x 2.2mm nyloc |
|
||||||
| 12 | ```nut(M3_nut, nyloc = true)``` | Nut M3 x 2.4mm nyloc |
|
| 16 | ```nut(M3_nut, nyloc = true)``` | Nut M3 x 2.4mm nyloc |
|
||||||
| 12 | ```nut(M4_nut, nyloc = true)``` | Nut M4 x 3.2mm nyloc |
|
| 12 | ```nut(M4_nut, nyloc = true)``` | Nut M4 x 3.2mm nyloc |
|
||||||
| 1 | ```pcb(PI_IO)``` | PI_IO V2 |
|
| 1 | ```pcb(PI_IO)``` | PI_IO V2 |
|
||||||
| 1 | ```pcb(PSU12V1A)``` | PSU 12V 1A |
|
| 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(RAMPSEndstop)``` | RAMPS Endstop Switch |
|
||||||
| 1 | ```pcb(RPI3)``` | Raspberry Pi 3 |
|
| 1 | ```pcb(RPI3)``` | Raspberry Pi 3 |
|
||||||
| 1 | ```pcb(RPI0)``` | Raspberry Pi Zero |
|
| 1 | ```pcb(RPI0)``` | Raspberry Pi Zero |
|
||||||
| 16 | ```screw(M2_cap_screw, 25)``` | Screw M2 cap x 25mm |
|
| 12 | ```screw(M2_cap_screw, 16)``` | Screw M2 cap x 16mm |
|
||||||
| 4 | ```screw(M2p5_cap_screw, 16)``` | Screw M2.5 cap x 16mm |
|
| 4 | ```screw(M2_cap_screw, 20)``` | Screw M2 cap x 20mm |
|
||||||
| 12 | ```screw(M2p5_cap_screw, 20)``` | Screw M2.5 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 |
|
| 4 | ```screw(M2p5_pan_screw, 20)``` | Screw M2.5 pan x 20mm |
|
||||||
| 8 | ```screw(M2p5_pan_screw, 25)``` | Screw M2.5 pan x 25mm |
|
| 12 | ```screw(M2p5_pan_screw, 25)``` | Screw M2.5 pan x 25mm |
|
||||||
| 4 | ```screw(M2p5_pan_screw, 35)``` | Screw M2.5 pan x 35mm |
|
| 4 | ```screw(M3_cap_screw, 16)``` | Screw M3 cap x 16mm |
|
||||||
| 8 | ```screw(M3_cap_screw, 30)``` | Screw M3 cap x 30mm |
|
| 8 | ```screw(M3_cap_screw, 30)``` | Screw M3 cap x 30mm |
|
||||||
| 4 | ```screw(M3_cap_screw, 35)``` | Screw M3 cap x 35mm |
|
| 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 |
|
| 3 | ```terminal_35(2)``` | Terminal block 2 way 3.5mm |
|
||||||
| 2 | ```green_terminal(gt_2p54, 4)``` | Terminal block 4 way 0.1" |
|
| 2 | ```green_terminal(gt_2p54, 4)``` | Terminal block 4 way 0.1" |
|
||||||
| 1 | | USB A to Mini B lead |
|
| 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 |
|
| 16 | ```washer(M2_washer)``` | Washer M2 x 5mm x 0.3mm |
|
||||||
| 32 | ```washer(M2p5_washer)``` | Washer M2.5 x 5.9mm x 0.5mm |
|
| 30 | ```washer(M2p5_washer)``` | Washer M2.5 x 5.9mm x 0.5mm |
|
||||||
| 12 | ```washer(M3_washer)``` | Washer M3 x 7mm x 0.5mm |
|
| 16 | ```washer(M3_washer)``` | Washer M3 x 7mm x 0.5mm |
|
||||||
| 12 | ```washer(M4_washer)``` | Washer M4 x 9mm x 0.8mm |
|
| 12 | ```washer(M4_washer)``` | Washer M4 x 9mm x 0.8mm |
|
||||||
| 1 | ```pcb(ZC_A0591)``` | ZC-A0591 ULN2003 driver PCB |
|
| 1 | ```pcb(ZC_A0591)``` | ZC-A0591 ULN2003 driver PCB |
|
||||||
|
|
||||||
### Printed
|
### Printed
|
||||||
| Qty | Filename |
|
| Qty | Filename |
|
||||||
| ---:|:--- |
|
| ---:|:--- |
|
||||||
| 4 | pcb_spacer20140.stl |
|
| 4 | pcb_spacer2060.stl |
|
||||||
| 4 | pcb_spacer20150.stl |
|
| 4 | pcb_spacer2070.stl |
|
||||||
| 4 | pcb_spacer20160.stl |
|
| 4 | pcb_spacer2080.stl |
|
||||||
| 4 | pcb_spacer20170.stl |
|
| 4 | pcb_spacer2090.stl |
|
||||||
| 4 | pcb_spacer25100.stl |
|
| 4 | pcb_spacer25100.stl |
|
||||||
| 4 | pcb_spacer25110_2.stl |
|
| 4 | pcb_spacer25110.stl |
|
||||||
| 4 | pcb_spacer25120_2.stl |
|
| 4 | pcb_spacer25120.stl |
|
||||||
| 4 | pcb_spacer25130_2.stl |
|
| 4 | pcb_spacer25130_2.stl |
|
||||||
| 4 | pcb_spacer25240.stl |
|
| 4 | pcb_spacer25140_2.stl |
|
||||||
| 4 | pcb_spacer2550.stl |
|
| 4 | pcb_spacer25150_2.stl |
|
||||||
| 4 | pcb_spacer2580.stl |
|
| 4 | pcb_spacer25180.stl |
|
||||||
| 4 | pcb_spacer2590.stl |
|
| 2 | pcb_spacer2570.stl |
|
||||||
| 4 | pcb_spacer30180.stl |
|
| 4 | pcb_spacer30160.stl |
|
||||||
| 4 | pcb_spacer30190.stl |
|
| 4 | pcb_spacer30170.stl |
|
||||||
| 4 | pcb_spacer30230.stl |
|
| 4 | pcb_spacer30220.stl |
|
||||||
|
| 4 | pcb_spacer3050.stl |
|
||||||
|
| 4 | pcb_spacer40190.stl |
|
||||||
| 4 | pcb_spacer40200.stl |
|
| 4 | pcb_spacer40200.stl |
|
||||||
| 4 | pcb_spacer40210.stl |
|
| 4 | pcb_spacer40210.stl |
|
||||||
| 4 | pcb_spacer40220.stl |
|
|
||||||
|
|
||||||
|
|
||||||
<a href="#top">Top</a>
|
<a href="#top">Top</a>
|
||||||
@@ -2146,8 +2326,8 @@ Pin headers and sockets, etc.
|
|||||||
<a href="#top">Top</a>
|
<a href="#top">Top</a>
|
||||||
|
|
||||||
---
|
---
|
||||||
<a name="Psus"></a>
|
<a name="PSUs"></a>
|
||||||
## Psus
|
## PSUs
|
||||||
Powersupplies. Can be a simple cube or can be defined by a list of six faces, each with thickness, holes, cutouts, etc.
|
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.
|
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.
|
[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
|
### Properties
|
||||||
| Function | Description |
|
| 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_iec(type)``` | IEC connector x,y, rotation and type |
|
||||||
| ```psu_face_switch(type)``` | Rocker switch x,y, rotation and type |
|
| ```psu_face_switch(type)``` | Rocker switch x,y, rotation and type |
|
||||||
| ```psu_face_thickness(type)``` | The thickness |
|
| ```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_faces(type)``` | List of face descriptions |
|
||||||
| ```psu_height(type)``` | Height |
|
| ```psu_height(type)``` | Height |
|
||||||
| ```psu_left_bay(type)``` | Bay for terminals |
|
| ```psu_left_bay(type)``` | Bay for terminals |
|
||||||
@@ -2334,10 +2515,10 @@ Linear rails with carriages.
|
|||||||
### Modules
|
### Modules
|
||||||
| Module | Description |
|
| 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 |
|
| ```carriage_hole_positions(type)``` | Position children over screw holes |
|
||||||
| ```rail(type, length)``` | Draw the specified rail |
|
| ```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_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 |
|
| ```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 href="#top">Top</a>
|
||||||
|
|
||||||
---
|
---
|
||||||
<a name="Scs_bearing_blocks"></a>
|
<a name="SCS_bearing_blocks"></a>
|
||||||
## Scs_bearing_blocks
|
## SCS_bearing_blocks
|
||||||
SCSnUU and SCSnLUU 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.
|
[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
|
### Properties
|
||||||
| Function | Description |
|
| Function | Description |
|
||||||
@@ -2616,10 +2797,12 @@ SCSnUU and SCSnLUU bearing blocks
|
|||||||
| ```scs_bearing(type)``` | Linear bearing used |
|
| ```scs_bearing(type)``` | Linear bearing used |
|
||||||
| ```scs_block_center_height(type)``` | Height of the center of the block |
|
| ```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_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_hole_offset(type)``` | Offset of bearing hole from base of block |
|
||||||
| ```scs_screw(type)``` | Screw type |
|
| ```scs_screw(type)``` | Screw type |
|
||||||
| ```scs_screw_separation_x(type)``` | Screw separation in X direction |
|
| ```scs_screw_separation_x(type)``` | Screw separation in X direction |
|
||||||
| ```scs_screw_separation_z(type)``` | Screw separation in Z direction |
|
| ```scs_screw_separation_z(type)``` | Screw separation in Z direction |
|
||||||
|
| ```scs_spacer(type)``` | Spacer used in long bearings |
|
||||||
|
|
||||||
### Functions
|
### Functions
|
||||||
| Function | Description |
|
| 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 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.
|
* 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()```.
|
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.
|
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
|
### Modules
|
||||||
| Module | Description |
|
| Module | Description |
|
||||||
|:--- |:--- |
|
|:--- |:--- |
|
||||||
| ```render_2D_sheet(type, color = false)``` | Extrude a 2D sheet template and give it the correct colour |
|
| ```render_2D_sheet(type, colour = 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_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(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 |
|
| ```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 href="#top">Top</a>
|
||||||
|
|
||||||
---
|
---
|
||||||
<a name="Sk_brackets"></a>
|
<a name="SK_brackets"></a>
|
||||||
## Sk_brackets
|
## SK_brackets
|
||||||
SK shaft support brackets
|
SK shaft support brackets
|
||||||
|
|
||||||
|
|
||||||
@@ -2758,7 +2941,7 @@ SK shaft support brackets
|
|||||||
|
|
||||||
[vitamins/sk_bracket.scad](vitamins/sk_bracket.scad) Implementation.
|
[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
|
### Properties
|
||||||
| Function | Description |
|
| 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 href="#top">Top</a>
|
||||||
|
|
||||||
---
|
---
|
||||||
<a name="Ssrs"></a>
|
<a name="SSRs"></a>
|
||||||
## Ssrs
|
## SSRs
|
||||||
Solid state relays.
|
Solid state relays.
|
||||||
|
|
||||||
|
|
||||||
@@ -2941,7 +3124,7 @@ Solid state relays.
|
|||||||
|
|
||||||
[vitamins/ssr.scad](vitamins/ssr.scad) Implementation.
|
[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
|
### Properties
|
||||||
| Function | Description |
|
| Function | Description |
|
||||||
@@ -3032,6 +3215,55 @@ NEMA stepper motor model.
|
|||||||
| 15 | ```star_washer(M3_washer)``` | Washer star M3 x 0.5mm |
|
| 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 |
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### 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>
|
<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. |
|
| ```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. |
|
| ```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 |
|
| ```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 |
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
@@ -3744,17 +3976,24 @@ of conductive panels, an extra layer of insulation.
|
|||||||
---
|
---
|
||||||
<a name="Carriers"></a>
|
<a name="Carriers"></a>
|
||||||
## Carriers
|
## 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.
|
[printed/carriers.scad](printed/carriers.scad) Implementation.
|
||||||
|
|
||||||
[tests/carriers.scad](tests/carriers.scad) Code for this example.
|
[tests/carriers.scad](tests/carriers.scad) Code for this example.
|
||||||
|
|
||||||
|
### Functions
|
||||||
|
| Function | Description |
|
||||||
|
|:--- |:--- |
|
||||||
|
| ```carrier_height()``` | Height of PCB carrier |
|
||||||
|
|
||||||
### Modules
|
### Modules
|
||||||
| Module | Description |
|
| Module | Description |
|
||||||
|:--- |:--- |
|
|:--- |:--- |
|
||||||
| ```ESP12F_carrier_stl()``` | Generate the STL for an ESP12 carrier |
|
| ```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 |
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
@@ -3762,6 +4001,8 @@ Adapts ESP12 module to 0.1" grid. See <https://hydraraptor.blogspot.com/2018/04/
|
|||||||
| Qty | Filename |
|
| Qty | Filename |
|
||||||
| ---:|:--- |
|
| ---:|:--- |
|
||||||
| 1 | ESP12F_carrier.stl |
|
| 1 | ESP12F_carrier.stl |
|
||||||
|
| 1 | MT3608_carrier.stl |
|
||||||
|
| 1 | TP4056_carrier.stl |
|
||||||
|
|
||||||
|
|
||||||
<a href="#top">Top</a>
|
<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 href="#top">Top</a>
|
||||||
|
|
||||||
---
|
---
|
||||||
<a name="Pcb_mount"></a>
|
<a name="PCB_mount"></a>
|
||||||
## Pcb_mount
|
## PCB_mount
|
||||||
A frame to mount a PCB by its corners when it has no mounting holes.
|
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.
|
The stl must be given a parameterless wrapper in the project that uses it.
|
||||||
|
|
||||||
|
|
||||||
[printed/pcb_mount.scad](printed/pcb_mount.scad) Implementation.
|
[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
|
### Functions
|
||||||
| Function | Description |
|
| 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 href="#top">Top</a>
|
||||||
|
|
||||||
---
|
---
|
||||||
<a name="Psu_shroud"></a>
|
<a name="PSU_shroud"></a>
|
||||||
## Psu_shroud
|
## PSU_shroud
|
||||||
A cover to go over the mains end of a PSU terminal strip to make it safe.
|
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.
|
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.
|
[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
|
### Functions
|
||||||
| Function | Description |
|
| Function | Description |
|
||||||
@@ -4431,9 +4672,9 @@ The stl and assembly must be given a name and parameterless wrappers for the stl
|
|||||||
### Assemblies
|
### Assemblies
|
||||||
| Qty | Name |
|
| Qty | Name |
|
||||||
| ---:|:--- |
|
| ---:|:--- |
|
||||||
| 1 | psu_shroud_PD_150_12_assembly |
|
| 1 | PSU_shroud_PD_150_12_assembly |
|
||||||
| 1 | psu_shroud_S_250_48_assembly |
|
| 1 | PSU_shroud_S_250_48_assembly |
|
||||||
| 1 | psu_shroud_S_300_12_assembly |
|
| 1 | PSU_shroud_S_300_12_assembly |
|
||||||
|
|
||||||
|
|
||||||
<a href="#top">Top</a>
|
<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 href="#top">Top</a>
|
||||||
|
|
||||||
---
|
---
|
||||||
<a name="Ssr_shroud"></a>
|
<a name="SSR_shroud"></a>
|
||||||
## Ssr_shroud
|
## SSR_shroud
|
||||||
A cover to go over the mains end of an SSR to make it safe to be touched.
|
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.
|
[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
|
### Functions
|
||||||
| Function | Description |
|
| Function | Description |
|
||||||
@@ -4629,8 +4870,8 @@ The stl and assembly must be given a name and parameterless wrappers for the stl
|
|||||||
### Assemblies
|
### Assemblies
|
||||||
| Qty | Name |
|
| Qty | Name |
|
||||||
| ---:|:--- |
|
| ---:|:--- |
|
||||||
| 1 | ssr_shroud_SSR10DA_assembly |
|
| 1 | SSR_shroud_SSR10DA_assembly |
|
||||||
| 1 | ssr_shroud_SSR25DA_assembly |
|
| 1 | SSR_shroud_SSR25DA_assembly |
|
||||||
|
|
||||||
|
|
||||||
<a href="#top">Top</a>
|
<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. |
|
| ```euler(R)``` | Convert a rotation matrix to a Euler rotation vector. |
|
||||||
| ```identity(n, x = 1)``` | Construct an arbitrary size identity matrix |
|
| ```identity(n, x = 1)``` | Construct an arbitrary size identity matrix |
|
||||||
| ```reverse(v)``` | Reverse a vector |
|
| ```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``` |
|
| ```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 |
|
| ```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 |
|
| ```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
|
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.
|
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.
|
The same variable also affects the generation of assembly diagrams.
|
||||||
|
|
||||||
Threads obey the $fn, $fa, $fs variables.
|
Threads obey the $fn, $fa, $fs variables.
|
||||||
@@ -5104,18 +5346,22 @@ Simple tube or ring
|
|||||||
<a href="#top">Top</a>
|
<a href="#top">Top</a>
|
||||||
|
|
||||||
---
|
---
|
||||||
<a name="Bom"></a>
|
<a name="BOM"></a>
|
||||||
## Bom
|
## 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
|
Bill Of Materials generation via echo and the ```bom.py``` script. Also handles exploded assembly views and posing.
|
||||||
definition that makes the assembly.
|
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
|
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
|
||||||
heirachical BOMs are also generated for real projects.
|
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.
|
[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
|
### Functions
|
||||||
| Function | Description |
|
| Function | Description |
|
||||||
@@ -5129,7 +5375,7 @@ heirachical BOMs are also generated for real projects.
|
|||||||
### Modules
|
### Modules
|
||||||
| Module | Description |
|
| 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 |
|
| ```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 |
|
| ```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 |
|
| ```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_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. |
|
| ```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(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" |
|
| ```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" |
|
||||||
|
|
||||||

|

|
||||||
|
@@ -29,6 +29,7 @@ import openscad
|
|||||||
from time import *
|
from time import *
|
||||||
from set_config import *
|
from set_config import *
|
||||||
import json
|
import json
|
||||||
|
import re
|
||||||
|
|
||||||
def find_scad_file(mname):
|
def find_scad_file(mname):
|
||||||
for filename in os.listdir(source_dir):
|
for filename in os.listdir(source_dir):
|
||||||
@@ -45,9 +46,20 @@ def find_scad_file(mname):
|
|||||||
return filename
|
return filename
|
||||||
return None
|
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:
|
class BOM:
|
||||||
def __init__(self, name):
|
def __init__(self, name):
|
||||||
self.name = name
|
self.name = name
|
||||||
|
self.big = None
|
||||||
self.count = 1
|
self.count = 1
|
||||||
self.vitamins = {}
|
self.vitamins = {}
|
||||||
self.printed = {}
|
self.printed = {}
|
||||||
@@ -60,14 +72,20 @@ class BOM:
|
|||||||
assemblies[ass] = self.assemblies[ass].count
|
assemblies[ass] = self.assemblies[ass].count
|
||||||
return {
|
return {
|
||||||
"name" : self.name,
|
"name" : self.name,
|
||||||
|
"big" : self.big,
|
||||||
"count" : self.count,
|
"count" : self.count,
|
||||||
"assemblies" : assemblies,
|
"assemblies" : assemblies,
|
||||||
"vitamins" : self.vitamins,
|
"vitamins" : {v : self.vitamins[v].data() for v in self.vitamins},
|
||||||
"printed" : self.printed,
|
"printed" : {p : self.printed[p].data() for p in self.printed},
|
||||||
"routed" : self.routed
|
"routed" : {r : self.routed[r].data() for r in self.routed}
|
||||||
}
|
}
|
||||||
|
|
||||||
def add_part(self, s):
|
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":
|
if s[-4:] == ".stl":
|
||||||
parts = self.printed
|
parts = self.printed
|
||||||
else:
|
else:
|
||||||
@@ -76,15 +94,19 @@ class BOM:
|
|||||||
else:
|
else:
|
||||||
parts = self.vitamins
|
parts = self.vitamins
|
||||||
if s in parts:
|
if s in parts:
|
||||||
parts[s] += 1
|
parts[s].count += 1
|
||||||
else:
|
else:
|
||||||
parts[s] = 1
|
parts[s] = Part(args)
|
||||||
|
|
||||||
def add_assembly(self, ass):
|
def add_assembly(self, ass, args = []):
|
||||||
if ass in self.assemblies:
|
if ass in self.assemblies:
|
||||||
self.assemblies[ass].count += 1
|
self.assemblies[ass].count += 1
|
||||||
else:
|
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):
|
def make_name(self, ass):
|
||||||
if self.count == 1:
|
if self.count == 1:
|
||||||
@@ -119,10 +141,10 @@ class BOM:
|
|||||||
for ass in sorted(self.assemblies):
|
for ass in sorted(self.assemblies):
|
||||||
bom = self.assemblies[ass]
|
bom = self.assemblies[ass]
|
||||||
if part in bom.vitamins:
|
if part in bom.vitamins:
|
||||||
file.write("%2d|" % bom.vitamins[part])
|
file.write("%2d|" % bom.vitamins[part].count)
|
||||||
else:
|
else:
|
||||||
file.write(" |")
|
file.write(" |")
|
||||||
print("%3d" % self.vitamins[part], description, file=file)
|
print("%3d" % self.vitamins[part].count, description, file=file)
|
||||||
|
|
||||||
if self.printed:
|
if self.printed:
|
||||||
if self.vitamins:
|
if self.vitamins:
|
||||||
@@ -133,10 +155,10 @@ class BOM:
|
|||||||
for ass in sorted(self.assemblies):
|
for ass in sorted(self.assemblies):
|
||||||
bom = self.assemblies[ass]
|
bom = self.assemblies[ass]
|
||||||
if part in bom.printed:
|
if part in bom.printed:
|
||||||
file.write("%2d|" % bom.printed[part])
|
file.write("%2d|" % bom.printed[part].count)
|
||||||
else:
|
else:
|
||||||
file.write(" |")
|
file.write(" |")
|
||||||
print("%3d" % self.printed[part], part, file=file)
|
print("%3d" % self.printed[part].count, part, file=file)
|
||||||
|
|
||||||
if self.routed:
|
if self.routed:
|
||||||
print(file=file)
|
print(file=file)
|
||||||
@@ -146,10 +168,10 @@ class BOM:
|
|||||||
for ass in sorted(self.assemblies):
|
for ass in sorted(self.assemblies):
|
||||||
bom = self.assemblies[ass]
|
bom = self.assemblies[ass]
|
||||||
if part in bom.routed:
|
if part in bom.routed:
|
||||||
file.write("%2d|" % bom.routed[part])
|
file.write("%2d|" % bom.routed[part].count)
|
||||||
else:
|
else:
|
||||||
file.write(" |")
|
file.write(" |")
|
||||||
print("%3d" % self.routed[part], part, file=file)
|
print("%3d" % self.routed[part].count, part, file=file)
|
||||||
|
|
||||||
if self.assemblies:
|
if self.assemblies:
|
||||||
print(file=file)
|
print(file=file)
|
||||||
@@ -161,17 +183,22 @@ def parse_bom(file = "openscad.log", name = None):
|
|||||||
main = BOM(name)
|
main = BOM(name)
|
||||||
main.ordered_assemblies = []
|
main.ordered_assemblies = []
|
||||||
stack = []
|
stack = []
|
||||||
|
prog = re.compile(r'^(.*)\((.*)\)$')
|
||||||
for line in open(file):
|
for line in open(file):
|
||||||
pos = line.find('ECHO: "~')
|
pos = line.find('ECHO: "~')
|
||||||
if pos > -1:
|
if pos > -1:
|
||||||
s = line[pos + 8 : line.rfind('"')]
|
s = line[pos + 8 : line.rfind('"')]
|
||||||
if s[-1] == '{':
|
if s[-1] == '{':
|
||||||
ass = 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:
|
if stack:
|
||||||
main.assemblies[stack[-1]].add_assembly(ass) #add to nested BOM
|
main.assemblies[stack[-1]].add_assembly(ass) #add to nested BOM
|
||||||
stack.append(ass)
|
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:
|
if ass in main.ordered_assemblies:
|
||||||
main.ordered_assemblies.remove(ass)
|
main.ordered_assemblies.remove(ass)
|
||||||
main.ordered_assemblies.insert(0, ass)
|
main.ordered_assemblies.insert(0, ass)
|
||||||
@@ -184,10 +211,17 @@ def parse_bom(file = "openscad.log", name = None):
|
|||||||
main.add_part(s)
|
main.add_part(s)
|
||||||
if stack:
|
if stack:
|
||||||
main.assemblies[stack[-1]].add_part(s)
|
main.assemblies[stack[-1]].add_part(s)
|
||||||
|
else:
|
||||||
|
if 'ERROR:' in line or 'WARNING:' in line:
|
||||||
|
print(line[:-1])
|
||||||
return main
|
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):
|
def boms(target = None, assembly = None):
|
||||||
bom_dir = set_config(target) + "bom"
|
bom_dir = set_config(target, usage) + "bom"
|
||||||
if assembly:
|
if assembly:
|
||||||
bom_dir += "/accessories"
|
bom_dir += "/accessories"
|
||||||
if not os.path.isdir(bom_dir):
|
if not os.path.isdir(bom_dir):
|
||||||
@@ -214,7 +248,7 @@ def boms(target = None, assembly = None):
|
|||||||
#
|
#
|
||||||
# Run openscad
|
# 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)
|
os.remove(bom_maker_name)
|
||||||
print("Generating bom ...", end=" ")
|
print("Generating bom ...", end=" ")
|
||||||
|
|
||||||
@@ -236,11 +270,24 @@ def boms(target = None, assembly = None):
|
|||||||
print("done")
|
print("done")
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
args = len(sys.argv)
|
if len(sys.argv) > 3: usage()
|
||||||
if args > 1:
|
|
||||||
if args > 2:
|
if len(sys.argv) == 3:
|
||||||
boms(sys.argv[1], sys.argv[2])
|
target, assembly = sys.argv[1], sys.argv[2]
|
||||||
else:
|
|
||||||
boms(sys.argv[1])
|
|
||||||
else:
|
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)
|
||||||
|
@@ -113,5 +113,5 @@ if __name__ == '__main__':
|
|||||||
if len(sys.argv) == 2:
|
if len(sys.argv) == 2:
|
||||||
canonicalise(sys.argv[1])
|
canonicalise(sys.argv[1])
|
||||||
else:
|
else:
|
||||||
print("usage: c14n_stl file")
|
print("\nusage:\n\t c14n_stl file - Canonicalise an STL file created by OpenSCAD.")
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
@@ -17,6 +17,7 @@
|
|||||||
# If not, see <https://www.gnu.org/licenses/>.
|
# If not, see <https://www.gnu.org/licenses/>.
|
||||||
#
|
#
|
||||||
import os
|
import os
|
||||||
|
from set_config import source_dir
|
||||||
|
|
||||||
def mtime(file):
|
def mtime(file):
|
||||||
if os.path.isfile(file):
|
if os.path.isfile(file):
|
||||||
@@ -32,7 +33,7 @@ def read_deps(dname):
|
|||||||
deps = []
|
deps = []
|
||||||
for line in lines:
|
for line in lines:
|
||||||
if line.startswith('\t'):
|
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']:
|
if not os.path.basename(dep) in ['stl.scad', 'dxf.scad', 'svf.scad', 'png.scad', 'target.scad']:
|
||||||
deps.append(dep)
|
deps.append(dep)
|
||||||
return deps
|
return deps
|
||||||
@@ -48,3 +49,18 @@ def check_deps(target, dname):
|
|||||||
if mtime(dep) > target_mtime:
|
if mtime(dep) > target_mtime:
|
||||||
return dep + ' changed'
|
return dep + ' changed'
|
||||||
return None
|
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)
|
||||||
|
@@ -26,6 +26,7 @@ from __future__ import print_function
|
|||||||
|
|
||||||
import os
|
import os
|
||||||
from tests import do_cmd
|
from tests import do_cmd
|
||||||
|
import argparse
|
||||||
|
|
||||||
dir = 'scripts'
|
dir = 'scripts'
|
||||||
|
|
||||||
@@ -74,4 +75,5 @@ They should work with both Python 2 and Python 3.
|
|||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
argparse.ArgumentParser(description='Generate scripts/readme.md and make html versions of that and doc/usage.md').parse_args()
|
||||||
doc_scripts()
|
doc_scripts()
|
||||||
|
@@ -30,14 +30,14 @@ import times
|
|||||||
from deps import *
|
from deps import *
|
||||||
import json
|
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
|
# Make a list of all the parts in the BOM
|
||||||
#
|
#
|
||||||
part_files = []
|
part_files = []
|
||||||
bom = assembly + '.txt' if assembly else "bom.txt"
|
bom = assembly + '.txt' if assembly else "bom.txt"
|
||||||
suffix = ".dxf" if part_type == 'svg' else '.' + part_type
|
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():
|
for line in f.readlines():
|
||||||
words = line.split()
|
words = line.split()
|
||||||
if words:
|
if words:
|
||||||
@@ -46,13 +46,24 @@ def bom_to_parts(target_dir, part_type, assembly = None):
|
|||||||
part_files.append(last_word[:-4] + '.' + part_type)
|
part_files.append(last_word[:-4] + '.' + part_type)
|
||||||
return part_files
|
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):
|
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
|
# 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'
|
target_dir = top_dir + part_type + 's'
|
||||||
deps_dir = top_dir + "deps"
|
deps_dir = top_dir + "deps"
|
||||||
|
bom_dir = top_dir + "bom"
|
||||||
if not os.path.isdir(target_dir):
|
if not os.path.isdir(target_dir):
|
||||||
os.makedirs(target_dir)
|
os.makedirs(target_dir)
|
||||||
if not os.path.isdir(deps_dir):
|
if not os.path.isdir(deps_dir):
|
||||||
@@ -64,7 +75,7 @@ def make_parts(target, part_type, parts = None):
|
|||||||
if parts:
|
if parts:
|
||||||
targets = list(parts) #copy the list so we dont modify the list passed in
|
targets = list(parts) #copy the list so we dont modify the list passed in
|
||||||
else:
|
else:
|
||||||
targets = bom_to_parts(target_dir, part_type)
|
targets = bom_to_parts(bom_dir, part_type)
|
||||||
for file in os.listdir(target_dir):
|
for file in os.listdir(target_dir):
|
||||||
if file.endswith('.' + part_type):
|
if file.endswith('.' + part_type):
|
||||||
if not file in targets:
|
if not file in targets:
|
||||||
@@ -83,12 +94,11 @@ def make_parts(target, part_type, parts = None):
|
|||||||
#
|
#
|
||||||
# Find all the scad files
|
# Find all the scad files
|
||||||
#
|
#
|
||||||
lib_dir = os.environ['OPENSCADPATH'] + '/NopSCADlib/printed'
|
|
||||||
module_suffix = '_dxf' if part_type == 'svg' else '_' + part_type
|
module_suffix = '_dxf' if part_type == 'svg' else '_' + part_type
|
||||||
for dir in [source_dir, source_dir + '/printed', lib_dir]:
|
for dir in source_dirs(bom_dir):
|
||||||
if os.path.isdir(dir):
|
if targets and os.path.isdir(dir):
|
||||||
for filename in os.listdir(dir):
|
for filename in os.listdir(dir):
|
||||||
if filename[-5:] == ".scad":
|
if targets and filename[-5:] == ".scad":
|
||||||
#
|
#
|
||||||
# find any modules ending in _<part_type>
|
# find any modules ending in _<part_type>
|
||||||
#
|
#
|
||||||
@@ -102,13 +112,6 @@ def make_parts(target, part_type, parts = None):
|
|||||||
part = base_name + '.' + part_type
|
part = base_name + '.' + part_type
|
||||||
if part in targets:
|
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
|
# Run openscad on the created file
|
||||||
#
|
#
|
||||||
part_file = target_dir + "/" + part
|
part_file = target_dir + "/" + part
|
||||||
@@ -119,15 +122,21 @@ def make_parts(target, part_type, parts = None):
|
|||||||
changed = "No bounds"
|
changed = "No bounds"
|
||||||
if changed:
|
if changed:
|
||||||
print(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()
|
t = time.time()
|
||||||
openscad.run("-D$bom=1", "-d", dname, "-o", part_file, part_maker_name)
|
openscad.run("-D$bom=1", "-d", dname, "-o", part_file, part_maker_name)
|
||||||
times.add_time(part, t)
|
times.add_time(part, t)
|
||||||
if part_type == 'stl':
|
if part_type == 'stl':
|
||||||
bounds = c14n_stl.canonicalise(part_file)
|
bounds = c14n_stl.canonicalise(part_file)
|
||||||
bounds_map[part] = bounds
|
bounds_map[part] = bounds
|
||||||
|
os.remove(part_maker_name)
|
||||||
targets.remove(part)
|
targets.remove(part)
|
||||||
os.remove(part_maker_name)
|
|
||||||
#
|
#
|
||||||
# Write new bounds file
|
# Write new bounds file
|
||||||
#
|
#
|
||||||
@@ -139,9 +148,6 @@ def make_parts(target, part_type, parts = None):
|
|||||||
#
|
#
|
||||||
if targets:
|
if targets:
|
||||||
for part in targets:
|
for part in targets:
|
||||||
if part[-4:] != '.' + part_type:
|
print("Could not find a module called", part[:-4] + module_suffix, "to make", part)
|
||||||
print(part, "is not a", part_type, "file")
|
usage(part_type)
|
||||||
else:
|
|
||||||
print("Could not find a module called", part[:-4] + module_suffix, "to make", part)
|
|
||||||
sys.exit(1)
|
|
||||||
times.print_times()
|
times.print_times()
|
||||||
|
@@ -30,6 +30,7 @@ import re
|
|||||||
from shutil import copyfile
|
from shutil import copyfile
|
||||||
from tests import update_image
|
from tests import update_image
|
||||||
import sys
|
import sys
|
||||||
|
import argparse
|
||||||
|
|
||||||
project_dirs = ['../..', 'examples']
|
project_dirs = ['../..', 'examples']
|
||||||
target_dir = 'gallery'
|
target_dir = 'gallery'
|
||||||
@@ -39,7 +40,6 @@ def gallery(force):
|
|||||||
if not os.path.isdir(target_dir):
|
if not os.path.isdir(target_dir):
|
||||||
os.makedirs(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))
|
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:
|
with open(output_name, 'wt') as output_file:
|
||||||
print("# A gallery of projects made with NopSCADlib", file = output_file)
|
print("# A gallery of projects made with NopSCADlib", file = output_file)
|
||||||
@@ -78,4 +78,8 @@ def gallery(force):
|
|||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
init()
|
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)
|
||||||
|
@@ -27,9 +27,17 @@ from bom import boms
|
|||||||
from render import render
|
from render import render
|
||||||
from views import views
|
from views import views
|
||||||
from plateup import plateup
|
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 __name__ == '__main__':
|
||||||
|
if len(sys.argv) > 2: usage()
|
||||||
target = None if len(sys.argv) == 1 else sys.argv[1]
|
target = None if len(sys.argv) == 1 else sys.argv[1]
|
||||||
|
set_config(target, usage)
|
||||||
boms(target)
|
boms(target)
|
||||||
for part in ['stl', 'dxf']:
|
for part in ['stl', 'dxf']:
|
||||||
make_parts(target, part)
|
make_parts(target, part)
|
||||||
|
@@ -23,7 +23,7 @@ import json, os, deps
|
|||||||
|
|
||||||
def check_options(dir = '.'):
|
def check_options(dir = '.'):
|
||||||
global options, options_mtime
|
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'
|
options_fname = dir + '/options.json'
|
||||||
try:
|
try:
|
||||||
with open(options_fname) as json_file:
|
with open(options_fname) as json_file:
|
||||||
|
@@ -25,9 +25,15 @@ import sys
|
|||||||
|
|
||||||
from plateup import plateup
|
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 __name__ == '__main__':
|
||||||
|
if len(sys.argv) > 2: usage()
|
||||||
|
|
||||||
if len(sys.argv) > 1:
|
if len(sys.argv) > 1:
|
||||||
target = sys.argv[1]
|
target = sys.argv[1]
|
||||||
else:
|
else:
|
||||||
target = None
|
target = None
|
||||||
plateup(target, 'dxf')
|
plateup(target, 'dxf', usage)
|
||||||
|
@@ -31,11 +31,11 @@ from shutil import copyfile
|
|||||||
source_dirs = { "stl" : "platters", "dxf" : "panels" }
|
source_dirs = { "stl" : "platters", "dxf" : "panels" }
|
||||||
target_dirs = { "stl" : "printed", "dxf" : "routed" }
|
target_dirs = { "stl" : "printed", "dxf" : "routed" }
|
||||||
|
|
||||||
def plateup(target, part_type):
|
def plateup(target, part_type, usage = None):
|
||||||
#
|
#
|
||||||
# Make the target directory
|
# Make the target directory
|
||||||
#
|
#
|
||||||
top_dir = set_config(target)
|
top_dir = set_config(target, usage)
|
||||||
parts_dir = top_dir + part_type + 's'
|
parts_dir = top_dir + part_type + 's'
|
||||||
target_dir = parts_dir + '/' + target_dirs[part_type]
|
target_dir = parts_dir + '/' + target_dirs[part_type]
|
||||||
source_dir = top_dir + source_dirs[part_type]
|
source_dir = top_dir + source_dirs[part_type]
|
||||||
|
@@ -25,9 +25,15 @@ import sys
|
|||||||
|
|
||||||
from plateup import plateup
|
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 __name__ == '__main__':
|
||||||
|
if len(sys.argv) > 2: usage()
|
||||||
|
|
||||||
if len(sys.argv) > 1:
|
if len(sys.argv) > 1:
|
||||||
target = sys.argv[1]
|
target = sys.argv[1]
|
||||||
else:
|
else:
|
||||||
target = None
|
target = None
|
||||||
plateup(target, 'stl')
|
plateup(target, 'stl', usage)
|
||||||
|
@@ -29,18 +29,39 @@ import openscad
|
|||||||
from tests import do_cmd, update_image, colour_scheme, background
|
from tests import do_cmd, update_image, colour_scheme, background
|
||||||
from deps import mtime
|
from deps import mtime
|
||||||
from colorama import init
|
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):
|
def render(target, type):
|
||||||
#
|
#
|
||||||
# Make the target directory
|
# 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):
|
if not os.path.isdir(target_dir):
|
||||||
os.makedirs(target_dir)
|
os.makedirs(target_dir)
|
||||||
#
|
#
|
||||||
# Find all the parts
|
# 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
|
# Remove unused png files
|
||||||
#
|
#
|
||||||
@@ -49,7 +70,9 @@ def render(target, type):
|
|||||||
if not file[:-4] + '.' + type in parts:
|
if not file[:-4] + '.' + type in parts:
|
||||||
print("Removing %s" % file)
|
print("Removing %s" % file)
|
||||||
os.remove(target_dir + '/' + file)
|
os.remove(target_dir + '/' + file)
|
||||||
|
#
|
||||||
|
# Render the parts
|
||||||
|
#
|
||||||
for part in parts:
|
for part in parts:
|
||||||
part_file = target_dir + '/' + part
|
part_file = target_dir + '/' + part
|
||||||
png_name = target_dir + '/' + part[:-4] + '.png'
|
png_name = target_dir + '/' + part[:-4] + '.png'
|
||||||
@@ -58,10 +81,16 @@ def render(target, type):
|
|||||||
#
|
#
|
||||||
if mtime(part_file) > mtime(png_name):
|
if mtime(part_file) > mtime(png_name):
|
||||||
png_maker_name = "png.scad"
|
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:
|
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"
|
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'
|
tmp_name = 'tmp.png'
|
||||||
openscad.run(colour_scheme, "--projection=p", "--imgsize=4096,4096", cam, render, "--autocenter", "--viewall", "-o", tmp_name, png_maker_name);
|
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"
|
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__':
|
if __name__ == '__main__':
|
||||||
init()
|
init()
|
||||||
|
if len(sys.argv) > 2: usage()
|
||||||
target = sys.argv[1] if len(sys.argv) > 1 else None
|
target = sys.argv[1] if len(sys.argv) > 1 else None
|
||||||
render(target, 'stl')
|
render(target, 'stl')
|
||||||
render(target, 'dxf')
|
render(target, 'dxf')
|
||||||
|
@@ -45,20 +45,27 @@ def valid_targets_string():
|
|||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
||||||
def set_config(target):
|
def set_config(target, usage = None):
|
||||||
|
if target and target[:1] == '-' and usage: usage()
|
||||||
targets = valid_targets()
|
targets = valid_targets()
|
||||||
if not target:
|
if not target:
|
||||||
if not targets:
|
if not targets:
|
||||||
return ""
|
return ""
|
||||||
print("Must specify a configuration: " + valid_targets_string())
|
print("Must specify a configuration: " + valid_targets_string())
|
||||||
|
if usage:
|
||||||
|
usage()
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
if not targets:
|
if not targets:
|
||||||
print("Not a muli-configuration project (no config_<target>.scad files found)")
|
print("Not a muli-configuration project (no config_<target>.scad files found)")
|
||||||
|
if usage:
|
||||||
|
usage()
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
if not target in targets:
|
if not target in targets:
|
||||||
print(target + " is not a configuration, avaliable configurations are: " + valid_targets_string())
|
print(target + " is not a configuration, avaliable configurations are: " + valid_targets_string())
|
||||||
|
if usage:
|
||||||
|
usage()
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
fname = source_dir + "/target.scad"
|
fname = source_dir + "/target.scad"
|
||||||
@@ -75,10 +82,13 @@ def set_config(target):
|
|||||||
f. write(text);
|
f. write(text);
|
||||||
return target + "/"
|
return target + "/"
|
||||||
|
|
||||||
|
def usage():
|
||||||
|
print("\nusage:\n\tset_config config_name")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
args = len(sys.argv)
|
args = len(sys.argv)
|
||||||
if args == 2:
|
if args == 2:
|
||||||
set_config(sys.argv[1])
|
set_config(sys.argv[1], usage)
|
||||||
else:
|
else:
|
||||||
print("usage: set_config config_name")
|
usage()
|
||||||
sys.exit(1)
|
|
||||||
|
@@ -85,6 +85,10 @@ def depluralise(name):
|
|||||||
def is_plural(name):
|
def is_plural(name):
|
||||||
return name != depluralise(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):
|
def tests(tests):
|
||||||
scad_dir = "tests"
|
scad_dir = "tests"
|
||||||
deps_dir = scad_dir + "/deps"
|
deps_dir = scad_dir + "/deps"
|
||||||
@@ -96,6 +100,7 @@ def tests(tests):
|
|||||||
doc_name = "readme.md"
|
doc_name = "readme.md"
|
||||||
index = {}
|
index = {}
|
||||||
bodies = {}
|
bodies = {}
|
||||||
|
done = []
|
||||||
times.read_times()
|
times.read_times()
|
||||||
options.check_options(deps_dir)
|
options.check_options(deps_dir)
|
||||||
#
|
#
|
||||||
@@ -109,13 +114,15 @@ def tests(tests):
|
|||||||
#
|
#
|
||||||
# List of individual part files
|
# 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:
|
for scad in scads:
|
||||||
base_name = scad[:-5]
|
base_name = scad[:-5]
|
||||||
if not tests or base_name in tests:
|
if not tests or base_name in tests:
|
||||||
|
done.append(base_name)
|
||||||
print(base_name)
|
print(base_name)
|
||||||
cap_name = base_name[0].capitalize() + base_name[1:]
|
cap_name = base_name[0].capitalize() + base_name[1:]
|
||||||
|
base_name = base_name.lower()
|
||||||
scad_name = scad_dir + '/' + scad
|
scad_name = scad_dir + '/' + scad
|
||||||
png_name = png_dir + '/' + base_name + '.png'
|
png_name = png_dir + '/' + base_name + '.png'
|
||||||
bom_name = bom_dir + '/' + base_name + '.json'
|
bom_name = bom_dir + '/' + base_name + '.json'
|
||||||
@@ -140,11 +147,14 @@ def tests(tests):
|
|||||||
print("Can't find implementation!")
|
print("Can't find implementation!")
|
||||||
continue
|
continue
|
||||||
|
|
||||||
vsplit = "M"
|
vsplit = "AJR" + chr(ord('Z') + 1)
|
||||||
vtype = locations[0][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:
|
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:
|
for t in types:
|
||||||
if not t in bodies:
|
if not t in bodies:
|
||||||
@@ -188,7 +198,7 @@ def tests(tests):
|
|||||||
|
|
||||||
body += ["\n" %(base_name, png_name)]
|
body += ["\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
|
oldest = png_name if mtime(png_name) < mtime(bom_name) else bom_name
|
||||||
changed = check_deps(oldest, dname)
|
changed = check_deps(oldest, dname)
|
||||||
changed = times.check_have_time(changed, scad_name)
|
changed = times.check_have_time(changed, scad_name)
|
||||||
@@ -222,14 +232,23 @@ def tests(tests):
|
|||||||
j = name.find(']]') + 2
|
j = name.find(']]') + 2
|
||||||
name = name.replace(name[i : j], '[ ... ]')
|
name = name.replace(name[i : j], '[ ... ]')
|
||||||
desc = vit[1]
|
desc = vit[1]
|
||||||
body += ['| %3d | %s | %s |' % (things[item], name, desc)]
|
body += ['| %3d | %s | %s |' % (things[item]["count"], name, desc)]
|
||||||
else:
|
else:
|
||||||
body += ['| %3d | %s |' % (things[item], name)]
|
count = things[item] if thing == 'assemblies' else things[item]["count"]
|
||||||
|
body += ['| %3d | %s |' % (count, name)]
|
||||||
body += ['']
|
body += ['']
|
||||||
|
|
||||||
body += ['\n<a href="#top">Top</a>']
|
body += ['\n<a href="#top">Top</a>']
|
||||||
body += ["\n---"]
|
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:
|
with open(doc_name, "wt") as doc_file:
|
||||||
print('# NopSCADlib', file = doc_file)
|
print('# NopSCADlib', file = doc_file)
|
||||||
print('''\
|
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())
|
do_cmd('codespell -L od readme.md'.split())
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
for arg in sys.argv[1:]:
|
||||||
|
if arg[:1] == '-': usage()
|
||||||
tests(sys.argv[1:])
|
tests(sys.argv[1:])
|
||||||
|
@@ -48,6 +48,8 @@ def check_have_time(changed, name):
|
|||||||
return changed
|
return changed
|
||||||
|
|
||||||
def add_time(name, start):
|
def add_time(name, start):
|
||||||
|
if name.lower() in times:
|
||||||
|
del times[name.lower()]
|
||||||
times[name] = round(time.time() - start, 3)
|
times[name] = round(time.time() - start, 3)
|
||||||
|
|
||||||
def print_times():
|
def print_times():
|
||||||
|
100
scripts/views.py
@@ -52,22 +52,23 @@ def bom_to_assemblies(bom_dir, bounds_map):
|
|||||||
# Decide if we need big or small assembly pictures
|
# Decide if we need big or small assembly pictures
|
||||||
#
|
#
|
||||||
for bom in flat_bom:
|
for bom in flat_bom:
|
||||||
big = False
|
if bom["big"] == None:
|
||||||
for ass in bom["assemblies"]:
|
big = False
|
||||||
for b in flat_bom:
|
for ass in bom["assemblies"]:
|
||||||
if b["name"] == ass:
|
for b in flat_bom:
|
||||||
if b["big"]:
|
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
|
big = True
|
||||||
break
|
break
|
||||||
if not big:
|
bom["big"] = big or bom["routed"]
|
||||||
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"]
|
|
||||||
#
|
#
|
||||||
# Remove the main assembly if it is a shell
|
# 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):
|
def pad(s, before, after = 0):
|
||||||
return ' ' * before + str(s) + ' ' * after
|
return ' ' * before + str(s) + ' ' * 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):
|
def views(target, do_assemblies = None):
|
||||||
done_assemblies = []
|
done_assemblies = []
|
||||||
#
|
#
|
||||||
# Make the target directory
|
# Make the target directory
|
||||||
#
|
#
|
||||||
top_dir = set_config(target)
|
top_dir = set_config(target, usage)
|
||||||
target_dir = top_dir + 'assemblies'
|
target_dir = top_dir + 'assemblies'
|
||||||
deps_dir = top_dir + "deps"
|
deps_dir = top_dir + "deps"
|
||||||
bom_dir = top_dir + "bom"
|
bom_dir = top_dir + "bom"
|
||||||
@@ -109,9 +122,10 @@ def views(target, do_assemblies = None):
|
|||||||
with open(bounds_fname) as json_file:
|
with open(bounds_fname) as json_file:
|
||||||
bounds_map = json.load(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)
|
assemblies = bom_to_assemblies(bom_dir, bounds_map)
|
||||||
|
lc_assemblies = [ass.lower() for ass in assemblies]
|
||||||
for file in os.listdir(target_dir):
|
for file in os.listdir(target_dir):
|
||||||
if file.endswith('.png'):
|
if file.endswith('.png'):
|
||||||
assembly = file[:-4].replace('_assembled', '_assembly')
|
assembly = file[:-4].replace('_assembled', '_assembly')
|
||||||
@@ -124,8 +138,7 @@ def views(target, do_assemblies = None):
|
|||||||
# Find all the scad files
|
# Find all the scad files
|
||||||
#
|
#
|
||||||
main_blurb = None
|
main_blurb = None
|
||||||
lib_dir = os.environ['OPENSCADPATH'] + '/NopSCADlib/printed'
|
for dir in source_dirs(bom_dir):
|
||||||
for dir in [source_dir, source_dir + '/printed', lib_dir]:
|
|
||||||
if os.path.isdir(dir):
|
if os.path.isdir(dir):
|
||||||
for filename in os.listdir(dir):
|
for filename in os.listdir(dir):
|
||||||
if filename.endswith('.scad'):
|
if filename.endswith('.scad'):
|
||||||
@@ -140,29 +153,24 @@ def views(target, do_assemblies = None):
|
|||||||
if len(words) and words[0] == "module":
|
if len(words) and words[0] == "module":
|
||||||
module = words[1].split('(')[0]
|
module = words[1].split('(')[0]
|
||||||
if is_assembly(module):
|
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
|
# Scrape the assembly instructions
|
||||||
#
|
#
|
||||||
for ass in flat_bom:
|
for ass in flat_bom:
|
||||||
if ass["name"] == module:
|
if ass["name"] == real_name:
|
||||||
if not "blurb" in ass:
|
if not "blurb" in ass:
|
||||||
ass["blurb"] = blurb.scrape_module_blurb(lines[:line_no])
|
ass["blurb"] = blurb.scrape_module_blurb(lines[:line_no])
|
||||||
break
|
break
|
||||||
if not do_assemblies or module in do_assemblies:
|
if not do_assemblies or real_name 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);
|
|
||||||
#
|
#
|
||||||
# Run openscad on the created file
|
# Run openscad on the created file
|
||||||
#
|
#
|
||||||
dname = deps_name(deps_dir, filename)
|
dname = deps_name(deps_dir, filename)
|
||||||
for explode in [0, 1]:
|
for explode in [0, 1]:
|
||||||
png_name = target_dir + '/' + module + '.png'
|
png_name = target_dir + '/' + real_name + '.png'
|
||||||
if not explode:
|
if not explode:
|
||||||
png_name = png_name.replace('_assembly', '_assembled')
|
png_name = png_name.replace('_assembly', '_assembled')
|
||||||
changed = check_deps(png_name, dname)
|
changed = check_deps(png_name, dname)
|
||||||
@@ -171,17 +179,24 @@ def views(target, do_assemblies = None):
|
|||||||
tmp_name = 'tmp.png'
|
tmp_name = 'tmp.png'
|
||||||
if changed:
|
if changed:
|
||||||
print(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()
|
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]);
|
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)
|
times.add_time(png_name, t)
|
||||||
do_cmd(["magick", tmp_name, "-trim", "-resize", "1004x1004", "-bordercolor", background, "-border", "10", tmp_name])
|
do_cmd(["magick", tmp_name, "-trim", "-resize", "1004x1004", "-bordercolor", background, "-border", "10", tmp_name])
|
||||||
update_image(tmp_name, png_name)
|
update_image(tmp_name, png_name)
|
||||||
|
os.remove(png_maker_name)
|
||||||
tn_name = png_name.replace('.png', '_tn.png')
|
tn_name = png_name.replace('.png', '_tn.png')
|
||||||
if mtime(png_name) > mtime(tn_name):
|
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())
|
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)
|
update_image(tmp_name, tn_name)
|
||||||
os.remove(png_maker_name)
|
done_assemblies.append(real_name)
|
||||||
done_assemblies.append(module)
|
|
||||||
else:
|
else:
|
||||||
if module == 'main_assembly':
|
if module == 'main_assembly':
|
||||||
main_blurb = blurb.scrape_module_blurb(lines[:line_no])
|
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)
|
print('1. [Parts list](#Parts_list)', file = doc_file)
|
||||||
for ass in flat_bom:
|
for ass in flat_bom:
|
||||||
name = ass["name"]
|
name = ass["name"]
|
||||||
cap_name = name.replace('_', ' ').title()
|
cap_name = titalise(name)
|
||||||
print('1. [%s](#%s)' % (cap_name, name), file = doc_file)
|
print('1. [%s](#%s)' % (cap_name, name), file = doc_file)
|
||||||
print(file = doc_file)
|
print(file = doc_file)
|
||||||
eop(print_mode, doc_file)
|
eop(print_mode, doc_file)
|
||||||
@@ -233,11 +248,11 @@ def views(target, do_assemblies = None):
|
|||||||
for t in types:
|
for t in types:
|
||||||
for thing in ass[t]:
|
for thing in ass[t]:
|
||||||
if thing in things[t]:
|
if thing in things[t]:
|
||||||
things[t][thing] += ass[t][thing]
|
things[t][thing] += ass[t][thing]["count"]
|
||||||
else:
|
else:
|
||||||
things[t][thing] = ass[t][thing]
|
things[t][thing] = ass[t][thing]["count"]
|
||||||
for ass in flat_bom:
|
for ass in flat_bom:
|
||||||
name = ass["name"][:-9].replace('_', ' ').title().replace(' ',' ')
|
name = titalise(ass["name"][:-9]).replace(' ',' ')
|
||||||
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;">%s</span> ' % name, file = doc_file, end = '')
|
||||||
print('| <span style="writing-mode: vertical-rl; text-orientation: mixed;">TOTALS</span> | |', file = doc_file)
|
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)
|
print(('| ' * len(flat_bom) + '| | **%s** |') % heading, file = doc_file)
|
||||||
for thing in sorted(things[t], key = lambda s: s.split(":")[-1]):
|
for thing in sorted(things[t], key = lambda s: s.split(":")[-1]):
|
||||||
for ass in flat_bom:
|
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 = '')
|
print('| %s ' % pad(count if count else '.', 2, 1), file = doc_file, end = '')
|
||||||
name = ass["name"]
|
name = ass["name"]
|
||||||
if name in totals:
|
if name in totals:
|
||||||
@@ -274,7 +289,7 @@ def views(target, do_assemblies = None):
|
|||||||
#
|
#
|
||||||
for ass in flat_bom:
|
for ass in flat_bom:
|
||||||
name = ass["name"]
|
name = ass["name"]
|
||||||
cap_name = name.replace('_', ' ').title()
|
cap_name = titalise(name)
|
||||||
|
|
||||||
if ass["count"] > 1:
|
if ass["count"] > 1:
|
||||||
print('<a name="%s"></a>\n## %d x %s' % (name, ass["count"], cap_name), file = doc_file)
|
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("|Qty|Description|", file = doc_file)
|
||||||
print("|---:|:----------|", file = doc_file)
|
print("|---:|:----------|", file = doc_file)
|
||||||
for v in sorted(vitamins, key = lambda s: s.split(":")[-1]):
|
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)
|
print("\n", file = doc_file)
|
||||||
|
|
||||||
printed = ass["printed"]
|
printed = ass["printed"]
|
||||||
@@ -295,7 +310,7 @@ def views(target, do_assemblies = None):
|
|||||||
keys = sorted(list(printed.keys()))
|
keys = sorted(list(printed.keys()))
|
||||||
for i in range(len(keys)):
|
for i in range(len(keys)):
|
||||||
p = keys[i]
|
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:
|
if (i % 3) == 2 or i == len(printed) - 1:
|
||||||
n = (i % 3) + 1
|
n = (i % 3) + 1
|
||||||
print('\n|%s' % ('---|' * n), file = doc_file)
|
print('\n|%s' % ('---|' * n), file = doc_file)
|
||||||
@@ -311,7 +326,7 @@ def views(target, do_assemblies = None):
|
|||||||
keys = sorted(list(routed.keys()))
|
keys = sorted(list(routed.keys()))
|
||||||
for i in range(len(keys)):
|
for i in range(len(keys)):
|
||||||
r = keys[i]
|
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:
|
if (i % 3) == 2 or i == len(routed) - 1:
|
||||||
n = (i % 3) + 1
|
n = (i % 3) + 1
|
||||||
print('\n|%s' % ('---|' * n), file = doc_file)
|
print('\n|%s' % ('---|' * n), file = doc_file)
|
||||||
@@ -385,4 +400,7 @@ if __name__ == '__main__':
|
|||||||
else:
|
else:
|
||||||
target, assemblies = None, sys.argv[1:]
|
target, assemblies = None, sys.argv[1:]
|
||||||
|
|
||||||
|
for a in assemblies:
|
||||||
|
if a[-9:] != "_assembly": usage()
|
||||||
|
|
||||||
views(target, assemblies)
|
views(target, assemblies)
|
||||||
|
@@ -21,7 +21,6 @@
|
|||||||
//! BOM and assembly demonstration
|
//! BOM and assembly demonstration
|
||||||
//
|
//
|
||||||
include <../core.scad>
|
include <../core.scad>
|
||||||
include <../vitamins/screws.scad>
|
|
||||||
include <../vitamins/sheets.scad>
|
include <../vitamins/sheets.scad>
|
||||||
use <../vitamins/insert.scad>
|
use <../vitamins/insert.scad>
|
||||||
$explode = 1; // Normally set on the command line when generating assembly views with views.py
|
$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°C
|
//! * Push the insert into the base with a soldering iron heated to 200°C
|
||||||
module widgit_base_assembly()
|
module widgit_base_assembly()
|
||||||
assembly("widgit_base") {
|
assembly("widgit_base") {
|
||||||
color(pp1_colour)
|
stl_colour(pp1_colour)
|
||||||
widgit_stl();
|
widgit_stl();
|
||||||
|
|
||||||
translate_z(height)
|
translate_z(height)
|
30
tests/DIP.scad
Normal 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();
|
@@ -17,10 +17,10 @@
|
|||||||
// If not, see <https://www.gnu.org/licenses/>.
|
// If not, see <https://www.gnu.org/licenses/>.
|
||||||
//
|
//
|
||||||
include <../core.scad>
|
include <../core.scad>
|
||||||
use <../utils/layout.scad>
|
|
||||||
|
|
||||||
include <../vitamins/iecs.scad>
|
include <../vitamins/iecs.scad>
|
||||||
|
|
||||||
|
use <../utils/layout.scad>
|
||||||
|
|
||||||
module iecs()
|
module iecs()
|
||||||
layout([for(i = iecs) iec_flange_h(i)], 10)
|
layout([for(i = iecs) iec_flange_h(i)], 10)
|
||||||
rotate(90)
|
rotate(90)
|
@@ -17,10 +17,9 @@
|
|||||||
// If not, see <https://www.gnu.org/licenses/>.
|
// If not, see <https://www.gnu.org/licenses/>.
|
||||||
//
|
//
|
||||||
include <../core.scad>
|
include <../core.scad>
|
||||||
use <../utils/layout.scad>
|
|
||||||
|
|
||||||
include <../vitamins/kp_pillow_blocks.scad>
|
include <../vitamins/kp_pillow_blocks.scad>
|
||||||
include <../vitamins/nuts.scad>
|
|
||||||
|
use <../utils/layout.scad>
|
||||||
|
|
||||||
module kp_pillow_blocks() {
|
module kp_pillow_blocks() {
|
||||||
screws = [M4_cap_screw, M4_cap_screw, M5_cap_screw, M5_cap_screw];
|
screws = [M4_cap_screw, M4_cap_screw, M5_cap_screw, M5_cap_screw];
|
@@ -16,7 +16,7 @@
|
|||||||
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
||||||
// If not, see <https://www.gnu.org/licenses/>.
|
// If not, see <https://www.gnu.org/licenses/>.
|
||||||
//
|
//
|
||||||
include <../core.scad>
|
include <../utils/core/core.scad>
|
||||||
use <../utils/layout.scad>
|
use <../utils/layout.scad>
|
||||||
|
|
||||||
include <../vitamins/leds.scad>
|
include <../vitamins/leds.scad>
|
132
tests/PCB.scad
Normal 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);
|
@@ -16,7 +16,7 @@
|
|||||||
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
||||||
// If not, see <https://www.gnu.org/licenses/>.
|
// If not, see <https://www.gnu.org/licenses/>.
|
||||||
//
|
//
|
||||||
include <../core.scad>
|
include <../utils/core/core.scad>
|
||||||
use <../printed/pcb_mount.scad>
|
use <../printed/pcb_mount.scad>
|
||||||
|
|
||||||
PI_IO = ["PI_IO", "PI_IO V2", 35.56, 25.4, 1.6, 0, 0, 0, "green", true, [],
|
PI_IO = ["PI_IO", "PI_IO V2", 35.56, 25.4, 1.6, 0, 0, 0, "green", true, [],
|
@@ -17,16 +17,20 @@
|
|||||||
// If not, see <https://www.gnu.org/licenses/>.
|
// If not, see <https://www.gnu.org/licenses/>.
|
||||||
//
|
//
|
||||||
include <../core.scad>
|
include <../core.scad>
|
||||||
use <../utils/layout.scad>
|
|
||||||
|
|
||||||
include <../vitamins/d_connectors.scad>
|
|
||||||
include <../vitamins/pcbs.scad>
|
include <../vitamins/pcbs.scad>
|
||||||
|
|
||||||
module pcbs()
|
use <../utils/layout.scad>
|
||||||
|
|
||||||
|
module pcbs() {
|
||||||
layout([for(p = pcbs) pcb_width(p)], 10)
|
layout([for(p = pcbs) pcb_width(p)], 10)
|
||||||
translate([0, pcb_length(pcbs[$i]) / 2])
|
translate([0, pcb_length(pcbs[$i]) / 2])
|
||||||
rotate(90)
|
rotate(90)
|
||||||
pcb_assembly(pcbs[$i], 5 + $i, 3);
|
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)
|
if($preview)
|
||||||
pcbs();
|
pcbs();
|
@@ -17,10 +17,9 @@
|
|||||||
// If not, see <https://www.gnu.org/licenses/>.
|
// If not, see <https://www.gnu.org/licenses/>.
|
||||||
//
|
//
|
||||||
include <../core.scad>
|
include <../core.scad>
|
||||||
use <../utils/layout.scad>
|
|
||||||
|
|
||||||
include <../vitamins/screws.scad>
|
|
||||||
include <../vitamins/psus.scad>
|
include <../vitamins/psus.scad>
|
||||||
|
|
||||||
|
use <../utils/layout.scad>
|
||||||
use <../printed/psu_shroud.scad>
|
use <../printed/psu_shroud.scad>
|
||||||
|
|
||||||
thickness = 3;
|
thickness = 3;
|
@@ -17,11 +17,10 @@
|
|||||||
// If not, see <https://www.gnu.org/licenses/>.
|
// If not, see <https://www.gnu.org/licenses/>.
|
||||||
//
|
//
|
||||||
include <../core.scad>
|
include <../core.scad>
|
||||||
use <../utils/layout.scad>
|
|
||||||
|
|
||||||
include <../vitamins/screws.scad>
|
|
||||||
include <../vitamins/psus.scad>
|
include <../vitamins/psus.scad>
|
||||||
|
|
||||||
|
use <../utils/layout.scad>
|
||||||
|
|
||||||
module psus()
|
module psus()
|
||||||
layout([for(p = psus) psu_width(p)], 10) let(p = psus[$i])
|
layout([for(p = psus) psu_width(p)], 10) let(p = psus[$i])
|
||||||
rotate(atx_psu(p) ? 0 : 90) {
|
rotate(atx_psu(p) ? 0 : 90) {
|
@@ -17,10 +17,10 @@
|
|||||||
// If not, see <https://www.gnu.org/licenses/>.
|
// If not, see <https://www.gnu.org/licenses/>.
|
||||||
//
|
//
|
||||||
include <../core.scad>
|
include <../core.scad>
|
||||||
use <../utils/layout.scad>
|
|
||||||
|
|
||||||
include <../vitamins/scs_bearing_blocks.scad>
|
include <../vitamins/scs_bearing_blocks.scad>
|
||||||
|
|
||||||
|
use <../utils/layout.scad>
|
||||||
|
|
||||||
module scs_bearing_blocks()
|
module scs_bearing_blocks()
|
||||||
layout([for(s = scs_bearing_blocks) scs_size(s).x], 10) {
|
layout([for(s = scs_bearing_blocks) scs_size(s).x], 10) {
|
||||||
part_thickness = 5;
|
part_thickness = 5;
|
@@ -17,11 +17,11 @@
|
|||||||
// If not, see <https://www.gnu.org/licenses/>.
|
// If not, see <https://www.gnu.org/licenses/>.
|
||||||
//
|
//
|
||||||
include <../core.scad>
|
include <../core.scad>
|
||||||
use <../utils/layout.scad>
|
|
||||||
|
|
||||||
include <../vitamins/sk_brackets.scad>
|
include <../vitamins/sk_brackets.scad>
|
||||||
include <../vitamins/extrusions.scad>
|
include <../vitamins/extrusions.scad>
|
||||||
|
|
||||||
|
use <../utils/layout.scad>
|
||||||
|
|
||||||
module sk_brackets() {
|
module sk_brackets() {
|
||||||
screws = [M4_dome_screw, M4_cap_screw, M5_cap_screw, M5_cap_screw];
|
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];
|
nuts = [M4_hammer_nut, M4_sliding_t_nut, M5_sliding_t_nut, undef];
|
@@ -17,10 +17,9 @@
|
|||||||
// If not, see <https://www.gnu.org/licenses/>.
|
// If not, see <https://www.gnu.org/licenses/>.
|
||||||
//
|
//
|
||||||
include <../core.scad>
|
include <../core.scad>
|
||||||
use <../utils/layout.scad>
|
|
||||||
|
|
||||||
include <../vitamins/screws.scad>
|
|
||||||
include <../vitamins/ssrs.scad>
|
include <../vitamins/ssrs.scad>
|
||||||
|
|
||||||
|
use <../utils/layout.scad>
|
||||||
use <../printed/ssr_shroud.scad>
|
use <../printed/ssr_shroud.scad>
|
||||||
|
|
||||||
thickness = 3;
|
thickness = 3;
|
@@ -17,11 +17,10 @@
|
|||||||
// If not, see <https://www.gnu.org/licenses/>.
|
// If not, see <https://www.gnu.org/licenses/>.
|
||||||
//
|
//
|
||||||
include <../core.scad>
|
include <../core.scad>
|
||||||
use <../utils/layout.scad>
|
|
||||||
|
|
||||||
include <../vitamins/screws.scad>
|
|
||||||
include <../vitamins/ssrs.scad>
|
include <../vitamins/ssrs.scad>
|
||||||
|
|
||||||
|
use <../utils/layout.scad>
|
||||||
|
|
||||||
module ssrs()
|
module ssrs()
|
||||||
layout([for(s = ssrs) ssr_width(s)], 15)
|
layout([for(s = ssrs) ssr_width(s)], 15)
|
||||||
rotate(90)
|
rotate(90)
|
52
tests/Swiss_clips.scad
Normal 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();
|
@@ -16,7 +16,7 @@
|
|||||||
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
||||||
// If not, see <https://www.gnu.org/licenses/>.
|
// If not, see <https://www.gnu.org/licenses/>.
|
||||||
//
|
//
|
||||||
include <../core.scad>
|
include <../utils/core/core.scad>
|
||||||
use <../utils/annotation.scad>
|
use <../utils/annotation.scad>
|
||||||
|
|
||||||
module annotations() {
|
module annotations() {
|
||||||
|
43
tests/axials.scad
Normal 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();
|
@@ -16,10 +16,9 @@
|
|||||||
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
||||||
// If not, see <https://www.gnu.org/licenses/>.
|
// If not, see <https://www.gnu.org/licenses/>.
|
||||||
//
|
//
|
||||||
include <../core.scad>
|
include <../utils/core/core.scad>
|
||||||
use <../utils/layout.scad>
|
use <../utils/layout.scad>
|
||||||
|
|
||||||
include <../vitamins/springs.scad>
|
|
||||||
include <../vitamins/batteries.scad>
|
include <../vitamins/batteries.scad>
|
||||||
|
|
||||||
module batteries()
|
module batteries()
|
||||||
|
@@ -18,8 +18,6 @@
|
|||||||
//
|
//
|
||||||
include <../core.scad>
|
include <../core.scad>
|
||||||
|
|
||||||
include <../vitamins/belts.scad>
|
|
||||||
include <../vitamins/screws.scad>
|
|
||||||
include <../vitamins/pulleys.scad>
|
include <../vitamins/pulleys.scad>
|
||||||
use <../vitamins/insert.scad>
|
use <../vitamins/insert.scad>
|
||||||
use <../utils/layout.scad>
|
use <../utils/layout.scad>
|
||||||
|
@@ -16,7 +16,7 @@
|
|||||||
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
||||||
// If not, see <https://www.gnu.org/licenses/>.
|
// If not, see <https://www.gnu.org/licenses/>.
|
||||||
//
|
//
|
||||||
include <../core.scad>
|
include <../utils/core/core.scad>
|
||||||
use <../utils/bezier.scad>
|
use <../utils/bezier.scad>
|
||||||
use <../utils/sweep.scad>
|
use <../utils/sweep.scad>
|
||||||
use <../utils/annotation.scad>
|
use <../utils/annotation.scad>
|
||||||
|
@@ -19,7 +19,6 @@
|
|||||||
include <../core.scad>
|
include <../core.scad>
|
||||||
use <../utils/layout.scad>
|
use <../utils/layout.scad>
|
||||||
|
|
||||||
include <../vitamins/screws.scad>
|
|
||||||
include <../vitamins/blowers.scad>
|
include <../vitamins/blowers.scad>
|
||||||
|
|
||||||
module blowers()
|
module blowers()
|
||||||
|
@@ -18,7 +18,6 @@
|
|||||||
//
|
//
|
||||||
include <../core.scad>
|
include <../core.scad>
|
||||||
|
|
||||||
include <../vitamins/screws.scad>
|
|
||||||
include <../vitamins/sheets.scad>
|
include <../vitamins/sheets.scad>
|
||||||
use <../vitamins/insert.scad>
|
use <../vitamins/insert.scad>
|
||||||
|
|
||||||
|
@@ -16,7 +16,7 @@
|
|||||||
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
||||||
// If not, see <https://www.gnu.org/licenses/>.
|
// If not, see <https://www.gnu.org/licenses/>.
|
||||||
//
|
//
|
||||||
include <../core.scad>
|
include <../utils/core/core.scad>
|
||||||
use <../utils/layout.scad>
|
use <../utils/layout.scad>
|
||||||
|
|
||||||
include <../vitamins/bulldogs.scad>
|
include <../vitamins/bulldogs.scad>
|
||||||
|
@@ -18,7 +18,6 @@
|
|||||||
//
|
//
|
||||||
include <../core.scad>
|
include <../core.scad>
|
||||||
|
|
||||||
include <../vitamins/screws.scad>
|
|
||||||
include <../vitamins/sheets.scad>
|
include <../vitamins/sheets.scad>
|
||||||
use <../vitamins/insert.scad>
|
use <../vitamins/insert.scad>
|
||||||
|
|
||||||
|
@@ -16,7 +16,7 @@
|
|||||||
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
||||||
// If not, see <https://www.gnu.org/licenses/>.
|
// If not, see <https://www.gnu.org/licenses/>.
|
||||||
//
|
//
|
||||||
include <../core.scad>
|
include <../utils/core/core.scad>
|
||||||
use <../utils/layout.scad>
|
use <../utils/layout.scad>
|
||||||
|
|
||||||
include <../vitamins/buttons.scad>
|
include <../vitamins/buttons.scad>
|
||||||
|
@@ -16,20 +16,20 @@
|
|||||||
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
||||||
// If not, see <https://www.gnu.org/licenses/>.
|
// If not, see <https://www.gnu.org/licenses/>.
|
||||||
//
|
//
|
||||||
include <../core.scad>
|
include <../utils/core/core.scad>
|
||||||
|
|
||||||
use <../printed/cable_grommets.scad>
|
use <../printed/cable_grommets.scad>
|
||||||
|
|
||||||
module cable_grommets() {
|
module cable_grommets() {
|
||||||
rotate(90)
|
rotate(90)
|
||||||
color(pp1_colour) ribbon_grommet(20, 3);
|
stl_colour(pp1_colour) ribbon_grommet(20, 3);
|
||||||
|
|
||||||
translate([20, 0])
|
translate([20, 0])
|
||||||
round_grommet_assembly(6, 3);
|
round_grommet_assembly(6, 3);
|
||||||
|
|
||||||
translate([40, 0])
|
translate([40, 0])
|
||||||
rotate(90)
|
rotate(90)
|
||||||
color(pp1_colour) mouse_grommet(5, 3);
|
stl_colour(pp1_colour) mouse_grommet(5, 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
if($preview)
|
if($preview)
|
||||||
|
@@ -16,7 +16,7 @@
|
|||||||
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
||||||
// If not, see <https://www.gnu.org/licenses/>.
|
// If not, see <https://www.gnu.org/licenses/>.
|
||||||
//
|
//
|
||||||
include <../core.scad>
|
include <../utils/core/core.scad>
|
||||||
|
|
||||||
use <../vitamins/cable_strip.scad>
|
use <../vitamins/cable_strip.scad>
|
||||||
|
|
||||||
|
@@ -16,10 +16,19 @@
|
|||||||
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
||||||
// If not, see <https://www.gnu.org/licenses/>.
|
// If not, see <https://www.gnu.org/licenses/>.
|
||||||
//
|
//
|
||||||
include <../core.scad>
|
include <../utils/core/core.scad>
|
||||||
use <../printed/carriers.scad>
|
use <../printed/carriers.scad>
|
||||||
|
|
||||||
module carriers()
|
module carriers() {
|
||||||
color(pp1_colour) ESP12F_carrier_stl();
|
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();
|
carriers();
|
||||||
|
40
tests/circlips.scad
Normal 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);
|
@@ -17,7 +17,7 @@
|
|||||||
// If not, see <https://www.gnu.org/licenses/>.
|
// If not, see <https://www.gnu.org/licenses/>.
|
||||||
//
|
//
|
||||||
|
|
||||||
include <../core.scad>
|
include <../utils/core/core.scad>
|
||||||
|
|
||||||
module clips() {
|
module clips() {
|
||||||
clip(xmin = 0, ymin = 0, zmin = 0, zmax = 40) sphere(50);
|
clip(xmin = 0, ymin = 0, zmin = 0, zmax = 40) sphere(50);
|
||||||
|
@@ -19,7 +19,6 @@
|
|||||||
include <../core.scad>
|
include <../core.scad>
|
||||||
use <../utils/layout.scad>
|
use <../utils/layout.scad>
|
||||||
|
|
||||||
include <../vitamins/screws.scad>
|
|
||||||
include <../vitamins/components.scad>
|
include <../vitamins/components.scad>
|
||||||
|
|
||||||
module resistors()
|
module resistors()
|
||||||
@@ -27,14 +26,13 @@ module resistors()
|
|||||||
resistor(resistors[$i]);
|
resistor(resistors[$i]);
|
||||||
|
|
||||||
module al_clad_resistors()
|
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)
|
rotate(90)
|
||||||
al_clad_resistor_assembly(al_clad_resistors[$i], 4.7)
|
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);
|
screw(al_clad_hole(al_clad_resistors[$i]) > 3 ? M3_pan_screw : M2p5_pan_screw, 16);
|
||||||
|
|
||||||
|
|
||||||
module thermal_cutouts()
|
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]);
|
thermal_cutout(thermal_cutouts[$i]);
|
||||||
|
|
||||||
module components() {
|
module components() {
|
||||||
@@ -43,7 +41,7 @@ module components() {
|
|||||||
translate([0, 50])
|
translate([0, 50])
|
||||||
TO220("Generic TO220 package");
|
TO220("Generic TO220 package");
|
||||||
|
|
||||||
translate([30, 50])
|
translate([50, 50])
|
||||||
panel_USBA();
|
panel_USBA();
|
||||||
|
|
||||||
translate([0,80])
|
translate([0,80])
|
||||||
|
@@ -19,8 +19,6 @@
|
|||||||
include <../core.scad>
|
include <../core.scad>
|
||||||
use <../printed/corner_block.scad>
|
use <../printed/corner_block.scad>
|
||||||
|
|
||||||
include <../vitamins/screws.scad>
|
|
||||||
|
|
||||||
screws = [M2_cap_screw, M2p5_pan_screw, M3_dome_screw, M4_dome_screw];
|
screws = [M2_cap_screw, M2p5_pan_screw, M3_dome_screw, M4_dome_screw];
|
||||||
|
|
||||||
module do_corner_block(screw)
|
module do_corner_block(screw)
|
||||||
|
@@ -16,7 +16,7 @@
|
|||||||
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
||||||
// If not, see <https://www.gnu.org/licenses/>.
|
// If not, see <https://www.gnu.org/licenses/>.
|
||||||
//
|
//
|
||||||
include <../core.scad>
|
include <../utils/core/core.scad>
|
||||||
use <../utils/layout.scad>
|
use <../utils/layout.scad>
|
||||||
|
|
||||||
include <../vitamins/d_connectors.scad>
|
include <../vitamins/d_connectors.scad>
|
||||||
|
@@ -20,7 +20,7 @@ include <../global_defs.scad>
|
|||||||
use <../utils/dogbones.scad>
|
use <../utils/dogbones.scad>
|
||||||
|
|
||||||
module dogbones() {
|
module dogbones() {
|
||||||
#linear_extrude(height = eps)
|
#linear_extrude(eps)
|
||||||
dogbone_square([10, 20]);
|
dogbone_square([10, 20]);
|
||||||
|
|
||||||
#translate([15, 0])
|
#translate([15, 0])
|
||||||
|
@@ -16,7 +16,7 @@
|
|||||||
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
||||||
// If not, see <https://www.gnu.org/licenses/>.
|
// If not, see <https://www.gnu.org/licenses/>.
|
||||||
//
|
//
|
||||||
include <../core.scad>
|
include <../utils/core/core.scad>
|
||||||
use <../printed/door_hinge.scad>
|
use <../printed/door_hinge.scad>
|
||||||
|
|
||||||
include <../vitamins/sheets.scad>
|
include <../vitamins/sheets.scad>
|
||||||
|
@@ -16,7 +16,7 @@
|
|||||||
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
||||||
// If not, see <https://www.gnu.org/licenses/>.
|
// If not, see <https://www.gnu.org/licenses/>.
|
||||||
//
|
//
|
||||||
include <../core.scad>
|
include <../utils/core/core.scad>
|
||||||
use <../printed/door_latch.scad>
|
use <../printed/door_latch.scad>
|
||||||
|
|
||||||
module door_latches()
|
module door_latches()
|
||||||
|
@@ -16,7 +16,7 @@
|
|||||||
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
||||||
// If not, see <https://www.gnu.org/licenses/>.
|
// If not, see <https://www.gnu.org/licenses/>.
|
||||||
//
|
//
|
||||||
include <../core.scad>
|
include <../utils/core/core.scad>
|
||||||
|
|
||||||
include <../vitamins/extrusion_brackets.scad>
|
include <../vitamins/extrusion_brackets.scad>
|
||||||
include <../vitamins/extrusions.scad>
|
include <../vitamins/extrusions.scad>
|
||||||
|
@@ -16,15 +16,14 @@
|
|||||||
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
||||||
// If not, see <https://www.gnu.org/licenses/>.
|
// If not, see <https://www.gnu.org/licenses/>.
|
||||||
//
|
//
|
||||||
include <../core.scad>
|
include <../utils/core/core.scad>
|
||||||
use <../utils/layout.scad>
|
use <../utils/layout.scad>
|
||||||
|
|
||||||
include <../vitamins/extrusions.scad>
|
include <../vitamins/extrusions.scad>
|
||||||
|
|
||||||
module extrusions()
|
module extrusions()
|
||||||
layout([for(e = extrusions) extrusion_width(e)], 10)
|
layout([for(e = extrusions) extrusion_width(e)], 10)
|
||||||
extrusion(extrusions[$i], 80);
|
extrusion(extrusions[$i], 80, cornerHole = extrusion_width(extrusions[$i]) > 20);
|
||||||
|
|
||||||
if ($preview)
|
if ($preview)
|
||||||
extrusions();
|
extrusions();
|
||||||
|
|
||||||
|