Compare commits
71 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
026b9daf59 | ||
|
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 |
@@ -164,7 +164,7 @@ This is achieved by having a pair of modules: -
|
||||
module handle_assembly() pose([225, 0, 150], [0, 0, 14]) //! Printed part with inserts in place
|
||||
assembly("handle") {
|
||||
translate_z(handle_height())
|
||||
color(pp1_colour) vflip() handle_stl();
|
||||
stl_colour(pp1_colour) vflip() handle_stl();
|
||||
|
||||
handle_screw_positions()
|
||||
vflip()
|
||||
@@ -233,3 +233,33 @@ Vitamins are only ever previewed, so they are optimised to draw quickly in F5 an
|
||||
In OpenCSG 3D difference and intersection are relatively slow and the negative volumes interfere with nearby objects when they are composed into assemblies. For this reason as much
|
||||
as possible is done by unioning primitives and extruded 2D shapes. Any 3D differences or intersections are wrapped in ```render()``` so that CGAL will compute a polyhedron
|
||||
that is cached and reused. This will be very slow the first time it renders but very fast afterwards.
|
||||
|
||||
### Panels and Platters
|
||||
|
||||
The ```stls``` and ```dxfs``` scripts produce a file for each part but often it is desirable to print or route collections of parts laid out together.
|
||||
This can be done by adding scad files to folders called ```platters``` for STL files and ```panels``` for DXF files.
|
||||
These can aggregate and lay out parts by including ```NopSCADlib/core.scad``` and using modules ```use_stl(name)``` and ```use_dxf(name)```.
|
||||
These modules import the already generated singular STL and DXF files, so they are relatively fast. The name does not include the suffix.
|
||||
The scad files typically also need to include other files from the project to get the dimensions of the parts to calculate their positions.
|
||||
|
||||
The composite part files have the same name as the scad file that generates them, with the suffix changed to ```.stl``` or ```.dxf```.
|
||||
|
||||
The generated files are placed in ```stls/printed``` and ```dxfs/routed```.
|
||||
Any parts that are not covered by the platters / panels are copied into the ```printed``` / ```routed``` directories, so that they contain everything to be made.
|
||||
|
||||
### Multiple configurations
|
||||
|
||||
Some parametric designs might have several configurations, for example a 3D printer with different size options. If several configurations need to be supported at the
|
||||
same time multiple sets of BOMS, STLS and DXFs need to be generated in separate diectories. NopSCADlib supports this by having multiple configuration files named
|
||||
```config_<target_name>.scad```. All the scripts take an optional first parameter that selects one of these config files by specifying ```target_name```.
|
||||
|
||||
The target config file is selected by generating ```target.scad``` that includes ```config_<target_name>.scad```.
|
||||
The rest of the project includes ```target.scad``` to use the configuration.
|
||||
Additionally all the generated file directories (assemblies, bom, stls, dxfs, etc.) are placed in a sub-directory called ```<target_name>```.
|
||||
|
||||
### Other libraries
|
||||
|
||||
The build scripts need to be able to locate the source files where the modules to generate the STL files and assemblies reside. They will search all the scad files
|
||||
in the project plus any ```printed``` directories outside the project. This covers the printed parts in NopSCADlib but also allows other libraries of printed parts.
|
||||
|
||||
Other libraries of vitamins and utilities can be used provided they follow the same convensions of NopSCADlib. The build scripts don't need to search those.
|
||||
|
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",
|
||||
"big": null,
|
||||
"count": 1,
|
||||
"assemblies": {},
|
||||
"vitamins": {
|
||||
"insert(F1BM3): Heatfit insert M3": 2
|
||||
"insert(F1BM3): Heatfit insert M3": {
|
||||
"count": 2
|
||||
}
|
||||
},
|
||||
"printed": {
|
||||
"socket_box.stl": 1
|
||||
"socket_box.stl": {
|
||||
"count": 1,
|
||||
"colour": "dimgrey"
|
||||
}
|
||||
},
|
||||
"routed": {}
|
||||
},
|
||||
{
|
||||
"name": "feet_assembly",
|
||||
"big": null,
|
||||
"count": 1,
|
||||
"assemblies": {
|
||||
"base_assembly": 1
|
||||
},
|
||||
"vitamins": {
|
||||
"washer(M3_washer): Washer M3 x 7mm x 0.5mm": 8,
|
||||
"screw(M3_dome_screw, 10): Screw M3 dome x 10mm": 4,
|
||||
"nut(M3_nut, nyloc = true): Nut M3 x 2.4mm nyloc": 4
|
||||
"washer(M3_washer): Washer M3 x 7mm x 0.5mm": {
|
||||
"count": 8
|
||||
},
|
||||
"screw(M3_dome_screw, 10): Screw M3 dome x 10mm": {
|
||||
"count": 4
|
||||
},
|
||||
"nut(M3_nut, nyloc = true): Nut M3 x 2.4mm nyloc": {
|
||||
"count": 4
|
||||
}
|
||||
},
|
||||
"printed": {
|
||||
"foot.stl": 4
|
||||
"foot.stl": {
|
||||
"count": 4,
|
||||
"colour": "darkorange"
|
||||
}
|
||||
},
|
||||
"routed": {}
|
||||
},
|
||||
{
|
||||
"name": "mains_in_assembly",
|
||||
"big": null,
|
||||
"count": 1,
|
||||
"assemblies": {
|
||||
"feet_assembly": 1
|
||||
},
|
||||
"vitamins": {
|
||||
": Wire green & yellow 30/0.25mm strands, length 150mm - not shown": 1,
|
||||
": Wire blue 30/0.25mm strands, length 150mm - not shown": 1,
|
||||
": Wire brown 30/0.25mm strands, length 150mm - not shown": 2,
|
||||
"tubing(HSHRNK32): Heatshrink sleeving ID 3.2mm x 15mm - not shown": 3,
|
||||
"iec(IEC_inlet_atx): IEC inlet for ATX": 1,
|
||||
"screw(M3_cs_cap_screw, 12): Screw M3 cs cap x 12mm": 2,
|
||||
"washer(M3_washer): Washer M3 x 7mm x 0.5mm": 2,
|
||||
"nut(M3_nut, nyloc = true): Nut M3 x 2.4mm nyloc": 2
|
||||
": Wire green & yellow 30/0.25mm strands, length 150mm - not shown": {
|
||||
"count": 1
|
||||
},
|
||||
": Wire blue 30/0.25mm strands, length 150mm - not shown": {
|
||||
"count": 1
|
||||
},
|
||||
": Wire brown 30/0.25mm strands, length 150mm - not shown": {
|
||||
"count": 2
|
||||
},
|
||||
"tubing(HSHRNK32): Heatshrink sleeving ID 3.2mm x 15mm - not shown": {
|
||||
"count": 3
|
||||
},
|
||||
"iec(IEC_inlet_atx): IEC inlet for ATX": {
|
||||
"count": 1
|
||||
},
|
||||
"screw(M3_cs_cap_screw, 12): Screw M3 cs cap x 12mm": {
|
||||
"count": 2
|
||||
},
|
||||
"washer(M3_washer): Washer M3 x 7mm x 0.5mm": {
|
||||
"count": 2
|
||||
},
|
||||
"nut(M3_nut, nyloc = true): Nut M3 x 2.4mm nyloc": {
|
||||
"count": 2
|
||||
}
|
||||
},
|
||||
"printed": {},
|
||||
"routed": {}
|
||||
},
|
||||
{
|
||||
"name": "main_assembly",
|
||||
"big": null,
|
||||
"count": 1,
|
||||
"assemblies": {
|
||||
"mains_in_assembly": 1
|
||||
},
|
||||
"vitamins": {
|
||||
": Wire green & yellow 30/0.25mm strands, length 150mm - not shown": 1,
|
||||
": Wire blue 30/0.25mm strands, length 150mm - not shown": 1,
|
||||
"tubing(HSHRNK32): Heatshrink sleeving ID 3.2mm x 15mm - not shown": 5,
|
||||
": Ferrule for 1.5mm^2 wire - not shown": 3,
|
||||
"mains_socket(Contactum): Mains socket 13A": 1,
|
||||
"screw(M3_cs_cap_screw, 20): Screw M3 cs cap x 20mm": 2,
|
||||
"jack_4mm_shielded(\"blue\", 3, \"royalblue\"): 4mm shielded jack socket blue": 2,
|
||||
"jack_4mm_shielded(\"brown\", 3, \"sienna\"): 4mm shielded jack socket brown": 1,
|
||||
"jack_4mm_shielded(\"green\", 3): 4mm shielded jack socket green": 2
|
||||
": Wire green & yellow 30/0.25mm strands, length 150mm - not shown": {
|
||||
"count": 1
|
||||
},
|
||||
": Wire blue 30/0.25mm strands, length 150mm - not shown": {
|
||||
"count": 1
|
||||
},
|
||||
"tubing(HSHRNK32): Heatshrink sleeving ID 3.2mm x 15mm - not shown": {
|
||||
"count": 5
|
||||
},
|
||||
": Ferrule for 1.5mm^2 wire - not shown": {
|
||||
"count": 3
|
||||
},
|
||||
"mains_socket(Contactum): Mains socket 13A": {
|
||||
"count": 1
|
||||
},
|
||||
"screw(M3_cs_cap_screw, 20): Screw M3 cs cap x 20mm": {
|
||||
"count": 2
|
||||
},
|
||||
"jack_4mm_shielded(\"blue\", 3, \"royalblue\"): 4mm shielded jack socket blue": {
|
||||
"count": 2
|
||||
},
|
||||
"jack_4mm_shielded(\"brown\", 3, \"sienna\"): 4mm shielded jack socket brown": {
|
||||
"count": 1
|
||||
},
|
||||
"jack_4mm_shielded(\"green\", 3): 4mm shielded jack socket green": {
|
||||
"count": 2
|
||||
}
|
||||
},
|
||||
"printed": {},
|
||||
"routed": {}
|
||||
|
@@ -35,7 +35,14 @@ $extrusion_width = 0.5;
|
||||
$pp1_colour = "dimgrey";
|
||||
$pp2_colour = [0.9, 0.9, 0.9];
|
||||
|
||||
include <NopSCADlib/lib.scad>
|
||||
include <NopSCADlib/core.scad>
|
||||
include <NopSCADlib/vitamins/iecs.scad>
|
||||
include <NopSCADlib/vitamins/mains_sockets.scad>
|
||||
include <NopSCADlib/vitamins/tubings.scad>
|
||||
|
||||
use <NopSCADlib/vitamins/insert.scad>
|
||||
use <NopSCADlib/vitamins/wire.scad>
|
||||
use <NopSCADlib/vitamins/jack.scad>
|
||||
use <NopSCADlib/printed/foot.scad>
|
||||
|
||||
echo(extrusion_width = extrusion_width, layer_height = layer_height);
|
||||
@@ -166,7 +173,7 @@ module socket_box_stl() {
|
||||
//
|
||||
module base_assembly()
|
||||
assembly("base") {
|
||||
color(pp1_colour) render() /*clip(ymax = 0)*/ socket_box_stl();
|
||||
stl_colour(pp1_colour) render() /*clip(ymax = 0)*/ socket_box_stl();
|
||||
|
||||
mains_socket_hole_positions(socket)
|
||||
translate_z(height)
|
||||
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 23 KiB |
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 8.6 KiB |
Before Width: | Height: | Size: 179 KiB After Width: | Height: | Size: 179 KiB |
Before Width: | Height: | Size: 280 KiB After Width: | Height: | Size: 280 KiB |
Before Width: | Height: | Size: 287 KiB After Width: | Height: | Size: 286 KiB |
Before Width: | Height: | Size: 205 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 |
@@ -84,7 +84,7 @@ Mains isolated and variable supply with metering.
|
||||
|
||||
<a name="TOP"></a>
|
||||
## SunBot
|
||||
A solar tracker to keep solar powerbanks pointing at the sun.
|
||||
A solar tracker to keep a solar panel pointing at the sun.
|
||||
|
||||

|
||||
|
||||
|
@@ -51,7 +51,7 @@ $fa = 6;
|
||||
$fs = extrusion_width / 2;
|
||||
|
||||
function round_to_layer(z) = ceil(z / layer_height) * layer_height;
|
||||
// Some additional named colors
|
||||
// Some additional named colours
|
||||
grey20 = [0.2, 0.2, 0.2];
|
||||
grey30 = [0.3, 0.3, 0.3];
|
||||
grey40 = [0.4, 0.4, 0.4];
|
||||
|
2
lib.scad
@@ -40,7 +40,6 @@ include <vitamins/inserts.scad>
|
||||
include <vitamins/kp_pillow_blocks.scad>
|
||||
include <vitamins/ldrs.scad>
|
||||
include <vitamins/leadnuts.scad>
|
||||
include <vitamins/leds.scad>
|
||||
include <vitamins/light_strips.scad>
|
||||
include <vitamins/mains_sockets.scad>
|
||||
include <vitamins/modules.scad>
|
||||
@@ -56,6 +55,7 @@ include <vitamins/sk_brackets.scad>
|
||||
include <vitamins/spools.scad>
|
||||
include <vitamins/ssrs.scad>
|
||||
include <vitamins/stepper_motors.scad>
|
||||
include <vitamins/swiss_clips.scad>
|
||||
include <vitamins/toggles.scad>
|
||||
include <vitamins/transformers.scad>
|
||||
include <vitamins/tubings.scad>
|
||||
|
BIN
libtest.png
Before Width: | Height: | Size: 783 KiB After Width: | Height: | Size: 787 KiB |
78
libtest.scad
@@ -29,6 +29,7 @@ use <tests/blowers.scad>
|
||||
use <tests/bulldogs.scad>
|
||||
use <tests/buttons.scad>
|
||||
use <tests/cable_strips.scad>
|
||||
use <tests/circlips.scad>
|
||||
use <tests/components.scad>
|
||||
use <tests/d_connectors.scad>
|
||||
use <tests/displays.scad>
|
||||
@@ -38,13 +39,13 @@ use <tests/fans.scad>
|
||||
use <tests/fuseholder.scad>
|
||||
use <tests/geared_steppers.scad>
|
||||
use <tests/hot_ends.scad>
|
||||
use <tests/iecs.scad>
|
||||
use <tests/IECs.scad>
|
||||
use <tests/inserts.scad>
|
||||
use <tests/jack.scad>
|
||||
use <tests/kp_pillow_blocks.scad>
|
||||
use <tests/KP_pillow_blocks.scad>
|
||||
use <tests/leadnuts.scad>
|
||||
use <tests/leds.scad>
|
||||
use <tests/ldrs.scad>
|
||||
use <tests/LDRs.scad>
|
||||
use <tests/LEDs.scad>
|
||||
use <tests/light_strips.scad>
|
||||
use <tests/linear_bearings.scad>
|
||||
use <tests/meter.scad>
|
||||
@@ -53,23 +54,24 @@ use <tests/modules.scad>
|
||||
use <tests/nuts.scad>
|
||||
use <tests/o_ring.scad>
|
||||
use <tests/opengrab.scad>
|
||||
use <tests/pcbs.scad>
|
||||
use <tests/PCBs.scad>
|
||||
use <tests/pillars.scad>
|
||||
use <tests/psus.scad>
|
||||
use <tests/PSUs.scad>
|
||||
use <tests/pulleys.scad>
|
||||
use <tests/rails.scad>
|
||||
use <tests/ring_terminals.scad>
|
||||
use <tests/rockers.scad>
|
||||
use <tests/rod.scad>
|
||||
use <tests/screws.scad>
|
||||
use <tests/scs_bearing_blocks.scad>
|
||||
use <tests/SCS_bearing_blocks.scad>
|
||||
use <tests/sealing_strip.scad>
|
||||
use <tests/sheets.scad>
|
||||
use <tests/sk_brackets.scad>
|
||||
use <tests/SK_brackets.scad>
|
||||
use <tests/spades.scad>
|
||||
use <tests/springs.scad>
|
||||
use <tests/ssrs.scad>
|
||||
use <tests/SSRs.scad>
|
||||
use <tests/stepper_motors.scad>
|
||||
use <tests/swiss_clips.scad>
|
||||
use <tests/toggles.scad>
|
||||
use <tests/transformers.scad>
|
||||
use <tests/tubings.scad>
|
||||
@@ -90,17 +92,17 @@ use <tests/fixing_block.scad>
|
||||
use <tests/flat_hinge.scad>
|
||||
use <tests/foot.scad>
|
||||
use <tests/handle.scad>
|
||||
use <tests/pcb_mount.scad>
|
||||
use <tests/PCB_mount.scad>
|
||||
use <tests/printed_box.scad>
|
||||
use <tests/ribbon_clamp.scad>
|
||||
use <tests/screw_knob.scad>
|
||||
use <tests/socket_box.scad>
|
||||
use <tests/strap_handle.scad>
|
||||
use <tests/ssr_shroud.scad>
|
||||
use <tests/psu_shroud.scad>
|
||||
use <tests/SSR_shroud.scad>
|
||||
use <tests/PSU_shroud.scad>
|
||||
|
||||
x0 = 0;
|
||||
x1 = x0 + 100;
|
||||
x1 = x0 + 110;
|
||||
x2 = x1 + 90;
|
||||
x3 = x2 + 130;
|
||||
x4 = x3 + 200;
|
||||
@@ -147,35 +149,35 @@ translate([x5, cable_grommets_y + 250])
|
||||
translate([950, 600])
|
||||
box_test();
|
||||
|
||||
translate([890, 730])
|
||||
translate([890, 750])
|
||||
printed_boxes();
|
||||
|
||||
|
||||
translate([850, 1260])
|
||||
translate([850, 1330])
|
||||
bbox_test();
|
||||
|
||||
|
||||
inserts_y = 0;
|
||||
nuts_y = inserts_y + 20;
|
||||
washers_y = nuts_y + 100;
|
||||
washers_y = nuts_y + 120;
|
||||
screws_y = washers_y + 120;
|
||||
o_rings_y = screws_y + 130;
|
||||
springs_y = o_rings_y + 20;
|
||||
circlips_y = screws_y + 160;
|
||||
springs_y = circlips_y + 20;
|
||||
o_rings_y = springs_y;
|
||||
sealing_strip_y = springs_y + 20;
|
||||
tubings_y = sealing_strip_y + 20;
|
||||
pillars_y = tubings_y + 20;
|
||||
leadnuts_y = pillars_y + 40;
|
||||
pulleys_y = leadnuts_y +40;
|
||||
ball_bearings_y = pillars_y + 40;
|
||||
pulleys_y = ball_bearings_y +40;
|
||||
hot_ends_y = pulleys_y + 60;
|
||||
linear_bearings_y = hot_ends_y + 50;
|
||||
sheets_y = linear_bearings_y + 100;
|
||||
pcbs_y = sheets_y + 40;
|
||||
displays_y = pcbs_y + 150;
|
||||
fans_y = displays_y + 100;
|
||||
displays_y = pcbs_y + 170;
|
||||
fans_y = displays_y + 80;
|
||||
transformers_y = fans_y + 120;
|
||||
psus_y = transformers_y + 190;
|
||||
|
||||
translate([x0 + 30, inserts_y])
|
||||
translate([x0 + 35, inserts_y])
|
||||
inserts();
|
||||
|
||||
translate([x0, inserts_y])
|
||||
@@ -190,10 +192,13 @@ translate([x0, washers_y])
|
||||
translate([x0, screws_y])
|
||||
screws();
|
||||
|
||||
translate([x0, circlips_y])
|
||||
circlips();
|
||||
|
||||
translate([x0, o_rings_y])
|
||||
o_rings();
|
||||
|
||||
translate([x0, springs_y])
|
||||
translate([x0 + 20, springs_y])
|
||||
springs();
|
||||
|
||||
translate([x0 + 50, sealing_strip_y])
|
||||
@@ -205,10 +210,7 @@ translate([x0, tubings_y])
|
||||
translate([x0, pillars_y])
|
||||
pillars();
|
||||
|
||||
translate([x0, leadnuts_y ])
|
||||
leadnuts();
|
||||
|
||||
translate([x0 + 80, leadnuts_y])
|
||||
translate([x0, ball_bearings_y])
|
||||
ball_bearings();
|
||||
|
||||
translate([x0, pulleys_y])
|
||||
@@ -248,7 +250,9 @@ translate([x0, psus_y]) {
|
||||
}
|
||||
|
||||
zipties_y = 0;
|
||||
bulldogs_y = zipties_y + 40;
|
||||
bulldogs_y = zipties_y + 30;
|
||||
swiss_clips_y = bulldogs_y + 35;
|
||||
leadnuts_y = swiss_clips_y + 50;
|
||||
|
||||
translate([x1, zipties_y])
|
||||
zipties();
|
||||
@@ -256,6 +260,13 @@ translate([x1, zipties_y])
|
||||
translate([x1, bulldogs_y])
|
||||
bulldogs();
|
||||
|
||||
translate([x1, swiss_clips_y])
|
||||
swiss_clips();
|
||||
|
||||
translate([x1, leadnuts_y])
|
||||
leadnuts();
|
||||
|
||||
|
||||
leds_y = 0;
|
||||
carriers_y = leds_y + 40;
|
||||
spades_y = carriers_y + 40;
|
||||
@@ -366,7 +377,7 @@ sk_brackets_y = extrusion_brackets_y + 80;
|
||||
kp_pillow_blocks_y = sk_brackets_y + 50;
|
||||
scs_bearing_blocks_y = kp_pillow_blocks_y + 60;
|
||||
|
||||
translate([x4 + 130, belts_y + 58]) {
|
||||
translate([x4 + 150, belts_y + 58]) {
|
||||
belt_test();
|
||||
|
||||
translate([0, 60])
|
||||
@@ -376,9 +387,8 @@ translate([x4 + 130, belts_y + 58]) {
|
||||
translate([x4, rails_y + 130])
|
||||
rails();
|
||||
|
||||
translate([780, 0])
|
||||
rotate(90)
|
||||
cable_strips();
|
||||
translate([800, fans_y + 50])
|
||||
cable_strips();
|
||||
|
||||
translate([x4, kp_pillow_blocks_y])
|
||||
kp_pillow_blocks();
|
||||
|
@@ -129,7 +129,7 @@ module box_corner_profile(type) { //! Generates the corner profile STL for 3D pr
|
||||
|
||||
length = box_height(type) - 2 * box_margin(type);
|
||||
difference() {
|
||||
linear_extrude(height = length, center = true, convexity = 5)
|
||||
linear_extrude(length, center = true, convexity = 5)
|
||||
box_corner_profile_2D(type);
|
||||
|
||||
for(z = [-1, 1])
|
||||
@@ -148,24 +148,24 @@ module box_corner_profile_section(type, section, sections) { //! Generates inter
|
||||
|
||||
difference() {
|
||||
union() {
|
||||
linear_extrude(height = h, convexity = 5)
|
||||
linear_extrude(h, convexity = 5)
|
||||
box_corner_profile_2D(type);
|
||||
|
||||
if(!last_section) // male end always at the top
|
||||
translate_z(section_length - 1)
|
||||
for(i = [0 : 1], offset = i * layer_height)
|
||||
linear_extrude(height = overlap + 1 - offset)
|
||||
linear_extrude(overlap + 1 - offset)
|
||||
offset(1 + offset - layer_height)
|
||||
offset(-overlap_wall - 1)
|
||||
box_corner_profile_2D(type);
|
||||
}
|
||||
if(section > 0)
|
||||
translate_z(last_section ? h : 0) { // female at bottom unless last section
|
||||
linear_extrude(height = 2 * (overlap + layer_height), center = true, convexity = 5)
|
||||
linear_extrude(2 * (overlap + layer_height), center = true, convexity = 5)
|
||||
offset(-overlap_wall)
|
||||
box_corner_profile_2D(type);
|
||||
|
||||
linear_extrude(height = 2 * layer_height, center = true, convexity = 5)
|
||||
linear_extrude(2 * layer_height, center = true, convexity = 5)
|
||||
offset(-overlap_wall + layer_height)
|
||||
box_corner_profile_2D(type);
|
||||
}
|
||||
@@ -223,7 +223,7 @@ module box_bezel(type, bottom) { //! Generates top and bottom bezel STLs
|
||||
// slots for side panels
|
||||
//
|
||||
translate_z(-box_profile_overlap(type))
|
||||
linear_extrude(height = 2 * box_profile_overlap(type), center = true)
|
||||
linear_extrude(2 * box_profile_overlap(type), center = true)
|
||||
for(i = [-1, 1]) {
|
||||
translate([i * (box_width(type) / 2 + t / 2 - sheet_slot_clearance / 2), 0])
|
||||
square([t, box_depth(type) - 2 * box_corner_gap(type)], center = true);
|
||||
@@ -240,7 +240,7 @@ module box_bezel(type, bottom) { //! Generates top and bottom bezel STLs
|
||||
// leave plastic over the corner profiles
|
||||
//
|
||||
translate_z(-box_profile_overlap(type) - 1)
|
||||
linear_extrude(height = box_profile_overlap(type) + box_corner_gap(type) + 2)
|
||||
linear_extrude(box_profile_overlap(type) + box_corner_gap(type) + 2)
|
||||
union() {
|
||||
difference() {
|
||||
square([box_width(type) - 2 * box_inset(type),
|
||||
@@ -273,7 +273,7 @@ module box_bezel_section(type, bottom, rows, cols, x, y) { //! Generates interlo
|
||||
end_clearance = 0.5;
|
||||
module male() {
|
||||
rotate([90, 0, 90])
|
||||
linear_extrude(height = dowel_length - 2 * end_clearance, center = true)
|
||||
linear_extrude(dowel_length - 2 * end_clearance, center = true)
|
||||
difference() {
|
||||
union() {
|
||||
h = dh - layer_height;
|
||||
|
@@ -33,7 +33,7 @@ assembly("box") {
|
||||
y = [-1,-1,1,1][corner];
|
||||
translate([x * (box_width(type) / 2 + 25 * exploded()), y * (box_depth(type) / 2 + 25 * exploded())])
|
||||
rotate(corner * 90) {
|
||||
color(pp2_colour) render()
|
||||
stl_colour(pp2_colour) render()
|
||||
box_corner_profile(type);
|
||||
|
||||
translate([box_hole_inset(type), box_hole_inset(type)])
|
||||
@@ -50,7 +50,7 @@ assembly("box") {
|
||||
translate_z(z * (box_height(type) / 2 - box_corner_gap(type) + 50 * exploded()))
|
||||
rotate([z * 90 - 90, 0, 0])
|
||||
if(bezels && (z > 0 ? top : base))
|
||||
color(pp1_colour) render() box_bezel(type, z < 0);
|
||||
stl_colour(pp1_colour) render() box_bezel(type, z < 0);
|
||||
|
||||
translate_z(z * (box_height(type) / 2 + sheet_thickness + 50 * exploded()))
|
||||
box_screw_hole_positions(type)
|
||||
|
@@ -59,7 +59,7 @@ module ribbon_grommet(ways, thickness) { //! Generate the STL for a printed ribb
|
||||
union() {
|
||||
for(side = [-1, 1])
|
||||
translate_z(side * (width - wall) / 2)
|
||||
linear_extrude(height = wall, center = true, convexity = 5)
|
||||
linear_extrude(wall, center = true, convexity = 5)
|
||||
difference() {
|
||||
hull() {
|
||||
translate([-length / 2, 0])
|
||||
@@ -73,7 +73,7 @@ module ribbon_grommet(ways, thickness) { //! Generate the STL for a printed ribb
|
||||
square([slot_length, slot_height]);
|
||||
}
|
||||
|
||||
linear_extrude(height = width -1, center = true)
|
||||
linear_extrude(width -1, center = true)
|
||||
difference() {
|
||||
ribbon_grommet_hole(ways, expand = false, h = 0);
|
||||
|
||||
@@ -133,12 +133,12 @@ module round_grommet_hole(diameter, h = 100) //! Make a hole for a round grommet
|
||||
drill(corrected_radius(diameter / 2) + wall + clearance, h);
|
||||
|
||||
module round_grommet_assembly(diameter, thickness, od = undef) {
|
||||
color(pp1_colour)
|
||||
stl_colour(pp1_colour)
|
||||
translate_z(wall)
|
||||
vflip()
|
||||
round_grommet_top(diameter, thickness, od);
|
||||
|
||||
color(pp2_colour)
|
||||
stl_colour(pp2_colour)
|
||||
translate_z(-thickness)
|
||||
vflip()
|
||||
round_grommet_bottom(diameter, od);
|
||||
@@ -170,14 +170,14 @@ module mouse_grommet(r, thickness) { //! Make the STL for a mouse grommet
|
||||
union() {
|
||||
for(side = [-1, 1])
|
||||
translate_z(side * (width - wall) / 2)
|
||||
linear_extrude(height = wall, center = true)
|
||||
linear_extrude(wall, center = true)
|
||||
difference() {
|
||||
mouse_grommet_hole(r, z = r + wall, h = 0, expand = wall + overlap);
|
||||
|
||||
translate([0, wall])
|
||||
mouse_grommet_hole(r, h = 0, expand = 0);
|
||||
}
|
||||
linear_extrude(height = width - 1, center = true)
|
||||
linear_extrude(width - 1, center = true)
|
||||
difference() {
|
||||
mouse_grommet_hole(r, h = 0, z = r + wall, expand = wall);
|
||||
|
||||
@@ -188,7 +188,7 @@ module mouse_grommet(r, thickness) { //! Make the STL for a mouse grommet
|
||||
}
|
||||
|
||||
module mouse_grommet_assembly(r, thickness)
|
||||
color(pp1_colour)
|
||||
stl_colour(pp1_colour)
|
||||
rotate([-90, 0, 0])
|
||||
mouse_grommet(r, thickness);
|
||||
|
||||
|
@@ -18,12 +18,14 @@
|
||||
//
|
||||
|
||||
//
|
||||
//! Adapts ESP12 module to 0.1" grid. See <https://hydraraptor.blogspot.com/2018/04/esp-12-module-breakout-adaptor.html>.
|
||||
//! Adapts ESP12 modules and various small PCBs to 0.1" grid. See <https://hydraraptor.blogspot.com/2018/04/esp-12-module-breakout-adaptor.html>.
|
||||
//
|
||||
$extrusion_width = 0.5;
|
||||
|
||||
include <../utils/core/core.scad>
|
||||
|
||||
function carrier_height() = 3; //! Height of PCB carrier
|
||||
|
||||
module ESP12F_carrier_stl() { //! Generate the STL for an ESP12 carrier
|
||||
stl("ESP12F_carrier");
|
||||
pins = 8;
|
||||
@@ -33,7 +35,7 @@ module ESP12F_carrier_stl() { //! Generate the STL for an ESP12 carrier
|
||||
hole2 = pitch2 - 3 * extrusion_width;
|
||||
length1 = (pins - 1) * pitch1 + hole + squeezed_wall * 2;
|
||||
length2 = (pins - 1) * pitch2 + hole + squeezed_wall * 2;
|
||||
height = 3;
|
||||
height = carrier_height();
|
||||
|
||||
wpitch1 = (pins - 1) * pitch1;
|
||||
wpitch2 = ceil(wpitch1 / 2.54) * 2.54;
|
||||
@@ -61,3 +63,71 @@ module ESP12F_carrier_stl() { //! Generate the STL for an ESP12 carrier
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module TP4056_carrier_stl() { //! Generate the STL for an TP4056 carrier, two required
|
||||
stl("TP4056_carrier");
|
||||
pitch = 2.54;
|
||||
outer_pitch = 13.9;
|
||||
inner_pitch = 7.54;
|
||||
hole = pitch - 3 * extrusion_width;
|
||||
pins = 6;
|
||||
length1 = outer_pitch + hole + squeezed_wall * 2;
|
||||
length2 = (pins - 1) * pitch + hole + squeezed_wall * 2;
|
||||
height = carrier_height();
|
||||
|
||||
width = hole + squeezed_wall * 2;
|
||||
spacing = inch(0.9);
|
||||
|
||||
difference() {
|
||||
hull() {
|
||||
translate_z(height - eps / 2)
|
||||
cube([width, length1, eps], center = true);
|
||||
|
||||
translate_z(eps / 2)
|
||||
cube([width, length2, eps], center = true);
|
||||
}
|
||||
|
||||
for(i = [0 : pins - 1])
|
||||
let(x = [-outer_pitch / 2, - inner_pitch / 2, 0, 0, inner_pitch / 2, outer_pitch / 2][i])
|
||||
if(x)
|
||||
hull() {
|
||||
translate([0, x, height])
|
||||
cube([hole, hole, eps], center = true);
|
||||
|
||||
translate([0, i * pitch - (pins - 1) * pitch / 2])
|
||||
cube([hole, hole, eps], center = true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module MT3608_carrier_stl() { //! Generate the STL for an MT3608 carrier, two required
|
||||
stl("MT3608_carrier");
|
||||
pcb_width = 17;
|
||||
w_pitch_top = 6.81;
|
||||
w_pitch_bot = inch(0.3);
|
||||
l_pitch_top = 30.855;
|
||||
l_pitch_bot = inch(1.2);
|
||||
hole = 1;
|
||||
height = carrier_height();
|
||||
wall = 2 * extrusion_width;
|
||||
width = hole + 2 * wall;
|
||||
offset = (l_pitch_top - l_pitch_bot) / 2;
|
||||
|
||||
difference() {
|
||||
hull() {
|
||||
translate([offset, 0, height - eps / 2])
|
||||
rounded_rectangle([width, pcb_width - 2, eps], 1);
|
||||
|
||||
translate_z(eps / 2)
|
||||
rounded_rectangle([width, pcb_width - 2, eps], 1);
|
||||
}
|
||||
for(side = [-1, 1])
|
||||
hull() {
|
||||
translate([offset, side * w_pitch_top / 2, height])
|
||||
cube([hole, hole, eps], center = true);
|
||||
|
||||
translate([0, side * w_pitch_bot / 2])
|
||||
cube([hole, hole, eps], center = true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -120,7 +120,7 @@ module corner_block_assembly(screw = def_screw, name = false) //! The printed bl
|
||||
assembly(str("corner_block_M", 20 * screw_radius(screw))) {
|
||||
insert = screw_insert(screw);
|
||||
|
||||
color(name ? pp2_colour : pp1_colour)
|
||||
stl_colour(name ? pp2_colour : pp1_colour)
|
||||
render() corner_block(screw, name) children();
|
||||
|
||||
corner_block_h_holes(screw)
|
||||
|
@@ -60,7 +60,7 @@ module door_hinge(door_thickness) { //! Generates STL fo
|
||||
|
||||
union() {
|
||||
rotate([90, 0, 0])
|
||||
linear_extrude(height = width, center = true)
|
||||
linear_extrude(width, center = true)
|
||||
difference() {
|
||||
hull() {
|
||||
translate([dia / 2, thickness + door_thickness / 2])
|
||||
@@ -76,7 +76,7 @@ module door_hinge(door_thickness) { //! Generates STL fo
|
||||
translate([dia / 2, thickness + door_thickness / 2])
|
||||
teardrop(r = screw_clearance_radius(pin_screw), h = 0);
|
||||
}
|
||||
linear_extrude(height = thickness)
|
||||
linear_extrude(thickness)
|
||||
difference() {
|
||||
hull() {
|
||||
translate([0, -width / 2])
|
||||
@@ -108,7 +108,7 @@ module door_hinge_stat_stl() { //! Generates the STL for the stationary part
|
||||
stl("door_hinge_stat");
|
||||
|
||||
union() {
|
||||
linear_extrude(height = thickness)
|
||||
linear_extrude(thickness)
|
||||
difference() {
|
||||
rounded_square([stat_length, stat_width], rad);
|
||||
|
||||
@@ -117,7 +117,7 @@ module door_hinge_stat_stl() { //! Generates the STL for the stationary part
|
||||
}
|
||||
|
||||
rotate([90, 0, 0])
|
||||
linear_extrude(height = stat_width, center = true)
|
||||
linear_extrude(stat_width, center = true)
|
||||
difference() {
|
||||
hull() {
|
||||
translate([0, dia / 2 + stat_clearance])
|
||||
@@ -141,7 +141,7 @@ module door_hinge_assembly(top, door_thickness = 6) { //! The moving assembly th
|
||||
|
||||
translate([0, pin_y - (thickness + door_thickness / 2), dir * width / 2]) {
|
||||
rotate([90, 0, 180])
|
||||
color(pp2_colour) door_hinge(door_thickness);
|
||||
stl_colour(pp2_colour) door_hinge(door_thickness);
|
||||
|
||||
rotate([90, 0, 0])
|
||||
door_hinge_hole_positions()
|
||||
@@ -165,7 +165,7 @@ module door_hinge_static_assembly(top, sheet_thickness = 3) { //! The stationary
|
||||
|
||||
translate([pin_x, 0, -dir * (stat_width / 2 + washer_thickness(screw_washer(pin_screw)))])
|
||||
rotate([90, 0, 0]) {
|
||||
color(pp1_colour) door_hinge_stat_stl();
|
||||
stl_colour(pp1_colour) door_hinge_stat_stl();
|
||||
|
||||
door_hinge_stat_hole_positions() {
|
||||
screw_and_washer(stat_screw, stat_screw_length);
|
||||
|
@@ -65,7 +65,7 @@ module door_latch_assembly(sheet_thickness = 3) { //! The assembly for a specifi
|
||||
|
||||
translate([0, -height - washer_thickness(washer)])
|
||||
rotate([-90, 0, 0]) {
|
||||
color(pp1_colour) render() door_latch_stl();
|
||||
stl_colour(pp1_colour) render() door_latch_stl();
|
||||
|
||||
translate_z(nut_trap_depth)
|
||||
vflip()
|
||||
|
@@ -81,7 +81,7 @@ module fixing_block(screw = def_screw) { //! Generate the STL
|
||||
|
||||
difference() {
|
||||
union() {
|
||||
linear_extrude(height = fb_height, convexity = 5)
|
||||
linear_extrude(fb_height, convexity = 5)
|
||||
difference() {
|
||||
hull() {
|
||||
for(side = [-1, 1]) {
|
||||
@@ -109,7 +109,7 @@ module fixing_block_assembly(screw = def_screw) pose([55, 180, 25], [0, 4.8, 4.8
|
||||
assembly(str("fixing_block_M", 20 * screw_radius(screw))) {
|
||||
translate_z(fixing_block_height(screw))
|
||||
rotate([0, 180, 0])
|
||||
color(pp1_colour) render() fixing_block(screw);
|
||||
stl_colour(pp1_colour) render() fixing_block(screw);
|
||||
|
||||
insert = screw_insert(screw);
|
||||
|
||||
|
@@ -82,7 +82,7 @@ module hinge_male(type, female = false) { //! The half with the stationary
|
||||
teardrop_r = kr / cos(22.5); // The corner on the teardrop
|
||||
inset = sqrt(sqr(teardrop_r + gap) - sqr(kr - t)) - kr;
|
||||
|
||||
linear_extrude(height =t)
|
||||
linear_extrude(t)
|
||||
difference() {
|
||||
hull() {
|
||||
for(side = [-1, 1])
|
||||
@@ -102,7 +102,7 @@ module hinge_male(type, female = false) { //! The half with the stationary
|
||||
rotate([90, 0, -90])
|
||||
for(z = [0 : (female ? fn : mn) - 1])
|
||||
translate_z(-dir * w / 2 + z * dir * pitch + (female ? -fw - mw - gap : 0))
|
||||
linear_extrude(height = female ? fw : mw)
|
||||
linear_extrude(female ? fw : mw)
|
||||
difference() {
|
||||
hull() {
|
||||
rotate(180)
|
||||
@@ -133,17 +133,17 @@ assembly(str("hinge_", type[0])) { //! Assembled hinge
|
||||
|
||||
vitamin(str(": Hinge pin ", w, " x ", 2 * hr, "mm"));
|
||||
|
||||
color(pp1_colour) hinge_male(type);
|
||||
stl_colour(pp1_colour) hinge_male(type);
|
||||
|
||||
translate([0, -kr, kr]) {
|
||||
rotate([0, 90, 0])
|
||||
explode(w + 10)
|
||||
color("silver") cylinder(r = hr , h = w, center = true);
|
||||
stl_colour("silver") cylinder(r = hr , h = w, center = true);
|
||||
|
||||
rotate([-angle, 0, 0])
|
||||
translate([0, -kr, -kr])
|
||||
rotate(180)
|
||||
color(pp2_colour) hinge_female(type);
|
||||
stl_colour(pp2_colour) hinge_female(type);
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -56,7 +56,7 @@ module foot(type = foot) { //! Generate STL
|
||||
circle4n(r);
|
||||
}
|
||||
}
|
||||
linear_extrude(height = t)
|
||||
linear_extrude(t)
|
||||
difference() {
|
||||
circle(r1 + eps);
|
||||
|
||||
@@ -73,7 +73,7 @@ module foot_assembly(t = 0, type = foot, flip = false) { //! Assembly with faste
|
||||
screw_length = screw_longer_than(foot_thickness(type) + t + 2 * washer_thickness(washer) + nut_thickness(nut, true) - squeeze);
|
||||
|
||||
vflip() explode(15, true) {
|
||||
color(pp4_colour) foot(type);
|
||||
stl_colour(pp4_colour) foot(type);
|
||||
|
||||
if(t)
|
||||
explode(15, true)
|
||||
@@ -116,7 +116,7 @@ module insert_foot(type = insert_foot) { //! Generate STL for foot with insert
|
||||
}
|
||||
}
|
||||
}
|
||||
linear_extrude(height = h2 + eps)
|
||||
linear_extrude(h2 + eps)
|
||||
difference() {
|
||||
circle(r5 + eps);
|
||||
|
||||
@@ -136,7 +136,7 @@ assembly("insert_foot") {
|
||||
insert = screw_insert(screw);
|
||||
|
||||
vflip()
|
||||
color(pp1_colour) insert_foot(type);
|
||||
stl_colour(pp4_colour) insert_foot(type);
|
||||
|
||||
translate_z(-foot_thickness(type))
|
||||
insert(insert);
|
||||
|
@@ -83,7 +83,7 @@ module handle_stl() { //! generate the STL
|
||||
module handle_assembly() pose([225, 0, 150], [0, 0, 14]) //! Printed part with inserts in place
|
||||
assembly("handle") {
|
||||
translate_z(handle_height())
|
||||
color(pp1_colour) vflip() handle_stl();
|
||||
stl_colour(pp1_colour) vflip() handle_stl();
|
||||
|
||||
handle_screw_positions()
|
||||
vflip()
|
||||
|
@@ -62,7 +62,7 @@ module pcb_mount_ring()
|
||||
}
|
||||
|
||||
module pcb_mount_washer_stl() //! A plastic washer to clamp a PCB
|
||||
linear_extrude(height = washer_thickness)
|
||||
linear_extrude(washer_thickness)
|
||||
pcb_mount_ring();
|
||||
|
||||
module pcb_mount(pcb, height = 5, washers = true) { //! Make the STL of a pcb mount for the specified PCB.
|
||||
@@ -85,10 +85,10 @@ module pcb_mount(pcb, height = 5, washers = true) { //! Make the STL of a pcb mo
|
||||
cube([pillar_x_pitch(pcb) - 2 * wall, frame_w, frame_t], center = true);
|
||||
|
||||
pcb_mount_screw_positions(pcb)
|
||||
linear_extrude(height = height)
|
||||
linear_extrude(height)
|
||||
pcb_mount_ring();
|
||||
|
||||
linear_extrude(height = height + pcb_thickness(pcb) - layer_height)
|
||||
linear_extrude(height + pcb_thickness(pcb) - layer_height)
|
||||
difference() {
|
||||
pcb_mount_screw_positions(pcb)
|
||||
pcb_mount_ring();
|
||||
@@ -101,7 +101,7 @@ module pcb_mount_assembly(pcb, thickness, height = 5) { //! A PCB mount assembly
|
||||
translate_z(height)
|
||||
pcb(pcb);
|
||||
|
||||
color(pp1_colour) pcb_mount(pcb, washers = false);
|
||||
stl_colour(pp1_colour) pcb_mount(pcb, washers = false);
|
||||
|
||||
washer = screw_washer(screw);
|
||||
nut = screw_nut(screw);
|
||||
@@ -110,7 +110,7 @@ module pcb_mount_assembly(pcb, thickness, height = 5) { //! A PCB mount assembly
|
||||
|
||||
pcb_mount_screw_positions(pcb) {
|
||||
translate_z(height + t) {
|
||||
color(pp2_colour) pcb_mount_washer_stl();
|
||||
stl_colour(pp2_colour) pcb_mount_washer_stl();
|
||||
|
||||
translate_z(washer_thickness)
|
||||
screw(screw, screw_length);
|
||||
|
@@ -129,7 +129,7 @@ module pbox_base(type) { //! Generate the STL for the base
|
||||
t = pbox_base(type);
|
||||
difference() {
|
||||
union() {
|
||||
linear_extrude(height = t)
|
||||
linear_extrude(t)
|
||||
offset(base_outset - 0.2)
|
||||
pbox_inner_shape(type);
|
||||
|
||||
@@ -157,7 +157,7 @@ module pbox(type) { //! Generate the STL for the main case
|
||||
|
||||
difference() {
|
||||
union() {
|
||||
linear_extrude(height = total_height)
|
||||
linear_extrude(total_height)
|
||||
offset(wall / 2) pbox_mid_shape(type);
|
||||
|
||||
if($children > 2)
|
||||
@@ -166,11 +166,11 @@ module pbox(type) { //! Generate the STL for the main case
|
||||
difference() {
|
||||
translate_z(top_thickness)
|
||||
union() {
|
||||
linear_extrude(height = height + eps)
|
||||
linear_extrude(height + eps)
|
||||
offset(-wall / 2) pbox_mid_shape(type);
|
||||
|
||||
translate_z(height) // Recess for the base
|
||||
linear_extrude(height = total_height - height)
|
||||
linear_extrude(total_height - height)
|
||||
offset(base_outset)
|
||||
pbox_inner_shape(type);
|
||||
}
|
||||
@@ -181,11 +181,11 @@ module pbox(type) { //! Generate the STL for the main case
|
||||
rounded_rectangle([pbox_width(type) + 2 * outset, pbox_depth(type) + 2 * outset, ledge_h], 1, center = false);
|
||||
|
||||
hull() {
|
||||
linear_extrude(height = ledge_h + eps)
|
||||
linear_extrude(ledge_h + eps)
|
||||
offset(ledge_inset)
|
||||
pbox_inner_shape(type);
|
||||
|
||||
linear_extrude(height = eps)
|
||||
linear_extrude(eps)
|
||||
offset(ledge_outset)
|
||||
pbox_inner_shape(type);
|
||||
}
|
||||
@@ -221,7 +221,7 @@ module pbox_base_screws(type, thickness = 0) //! Place the screws and
|
||||
pbox_screw_positions(type) {
|
||||
foot = pbox_foot(type);
|
||||
if(foot)
|
||||
color(pp4_colour)
|
||||
stl_colour(pp4_colour)
|
||||
foot(foot);
|
||||
|
||||
translate_z(foot ? foot_thickness(foot) : thickness)
|
||||
|
@@ -113,21 +113,21 @@ module psu_shroud(type, cable_d, name, cables = 1) { //! Generate the STL file f
|
||||
translate([centre_x, -centre_y]) {
|
||||
rounded_rectangle([depth - eps, width - eps, top], rad, center = false);
|
||||
|
||||
linear_extrude(height = height)
|
||||
linear_extrude(height)
|
||||
difference() {
|
||||
shape();
|
||||
|
||||
translate([depth / 2, width / 2 - 5])
|
||||
square([2 * (depth - extent + terminal_clearance), 10], center = true);
|
||||
}
|
||||
linear_extrude(height = height - terminal_block_height(tb) - psu_terminal_block_z(type) - terminal_clearance)
|
||||
linear_extrude(height - terminal_block_height(tb) - psu_terminal_block_z(type) - terminal_clearance)
|
||||
shape();
|
||||
}
|
||||
// cable slots
|
||||
for(i = [0 : 1 : cables - 1])
|
||||
translate([centre_x - depth / 2 + wall / 2, -centre_y + (i - cables / 2 + 0.5) * psu_shroud_cable_pitch(cable_d), height / 2])
|
||||
rotate([90, 0, 90])
|
||||
linear_extrude(height = wall, center = true)
|
||||
linear_extrude(wall, center = true)
|
||||
difference() {
|
||||
square([cable_d + eps, height], center = true);
|
||||
|
||||
@@ -143,11 +143,11 @@ module psu_shroud(type, cable_d, name, cables = 1) { //! Generate the STL file f
|
||||
}
|
||||
|
||||
module psu_shroud_assembly(type, cable_d, name, cables = 1) //! The printed parts with inserts fitted
|
||||
assembly(str("psu_shroud_", name)) {
|
||||
assembly(str("PSU_shroud_", name)) {
|
||||
|
||||
translate_z(psu_shroud_height(type))
|
||||
vflip()
|
||||
color(pp1_colour) psu_shroud(type, cable_d, name, cables);
|
||||
stl_colour(pp1_colour) psu_shroud(type, cable_d, name, cables);
|
||||
|
||||
psu_shroud_hole_positions(type)
|
||||
vflip()
|
||||
|
@@ -83,7 +83,7 @@ module ribbon_clamp_assembly(ways) pose([55, 180, 25]) //! Printed part with in
|
||||
assembly(str("ribbon_clamp_", ways)) {
|
||||
h = ribbon_clamp_height();
|
||||
|
||||
color(pp1_colour) render()
|
||||
stl_colour(pp1_colour) render()
|
||||
translate_z(h) vflip() ribbon_clamp(ways);
|
||||
|
||||
ribbon_clamp_hole_positions(ways)
|
||||
|
@@ -48,7 +48,7 @@ module screw_knob(screw) { //! Generate the STL for a knob to fit the specified
|
||||
rotate(45)
|
||||
circle(r = nut_trap_radius(screw_nut(screw)), $fn = 6);
|
||||
}
|
||||
linear_extrude(height = knob_thickness, convexity = 3)
|
||||
linear_extrude(knob_thickness, convexity = 3)
|
||||
difference() {
|
||||
polygon(points = [for(a = [0 : 359]) [wave(a) * sin(a), wave(a) * cos(a)]]);
|
||||
|
||||
@@ -62,7 +62,7 @@ module screw_knob_assembly(screw, length) //! Assembly with the screw in place
|
||||
assembly(str("screw_knob_M", 20 * screw_radius(screw), "_", length)) {
|
||||
translate_z(knob_height)
|
||||
vflip()
|
||||
color(pp1_colour) screw_knob(screw);
|
||||
stl_colour(pp1_colour) screw_knob(screw);
|
||||
|
||||
translate_z(knob_height - knob_nut_trap_depth(screw))
|
||||
rotate(-45)
|
||||
|
@@ -52,12 +52,12 @@ module socket_box(type) { //! Generate STL of the backbox for the specified sock
|
||||
insert_hole_radius = insert_hole_radius(insert);
|
||||
|
||||
difference() {
|
||||
linear_extrude(height = height, convexity = 5)
|
||||
linear_extrude(height, convexity = 5)
|
||||
face_plate(type);
|
||||
|
||||
difference() {
|
||||
translate_z(base_thickness)
|
||||
linear_extrude(height = height, convexity = 5)
|
||||
linear_extrude(height, convexity = 5)
|
||||
offset(-wall) offset(1) face_plate(type);
|
||||
|
||||
for(side = [-1, 1])
|
||||
@@ -92,7 +92,7 @@ assembly(str("socket_box_", type[0])) {
|
||||
screw = mains_socket_screw(type);
|
||||
insert = screw_insert(screw);
|
||||
|
||||
color(pp1_colour) render() socket_box(type);
|
||||
stl_colour(pp1_colour) render() socket_box(type);
|
||||
|
||||
mains_socket_hole_positions(type)
|
||||
translate_z(height)
|
||||
|
@@ -73,7 +73,7 @@ module ssr_shroud(type, cable_d, name) { //! Generate the STL file for a spec
|
||||
translate([center_x, 0]) {
|
||||
rounded_rectangle([depth - eps, width - eps, top], rad, center = false);
|
||||
|
||||
linear_extrude(height = height) difference() {
|
||||
linear_extrude(height) difference() {
|
||||
round(or = wall / 2 - eps, ir = 0) difference() {
|
||||
rounded_square([depth, width], rad);
|
||||
|
||||
@@ -91,7 +91,7 @@ module ssr_shroud(type, cable_d, name) { //! Generate the STL file for a spec
|
||||
for(side = [-1, 1])
|
||||
translate([cable_x, side * (width / 2 - wall / 2), height / 2])
|
||||
rotate([90, 0, 0])
|
||||
linear_extrude(height = wall, center = true)
|
||||
linear_extrude(wall, center = true)
|
||||
difference() {
|
||||
square([cable_d + eps, height], center = true);
|
||||
|
||||
@@ -107,11 +107,11 @@ module ssr_shroud(type, cable_d, name) { //! Generate the STL file for a spec
|
||||
}
|
||||
|
||||
module ssr_shroud_assembly(type, cable_d, name) //! The printed parts with inserts fitted
|
||||
assembly(str("ssr_shroud_", name)) {
|
||||
assembly(str("SSR_shroud_", name)) {
|
||||
|
||||
translate_z(ssr_shroud_height(type))
|
||||
vflip()
|
||||
color(pp1_colour) ssr_shroud(type, cable_d, name);
|
||||
stl_colour(pp1_colour) ssr_shroud(type, cable_d, name);
|
||||
|
||||
ssr_shroud_hole_positions(type)
|
||||
insert(insert);
|
||||
@@ -135,7 +135,7 @@ module ssr_shroud_fastened_assembly(type, cable_d, thickness, name) //! Assembly
|
||||
|
||||
*translate_z(cable_d / 2)
|
||||
rotate([90, 0, 0])
|
||||
color(grey20)
|
||||
stl_colour(grey20)
|
||||
cylinder(d = cable_d, h = 20, center = true);
|
||||
}
|
||||
}
|
||||
|
@@ -77,7 +77,7 @@ module strap(length, type = strap) { //! Generate the STL for the rubber strap
|
||||
len = length - 2 * (wall + clearance);
|
||||
w = strap_width(type);
|
||||
|
||||
linear_extrude(height = strap_thickness(type), convexity = 3)
|
||||
linear_extrude(strap_thickness(type), convexity = 3)
|
||||
difference() {
|
||||
rounded_square([len, w], w / 2 - eps);
|
||||
|
||||
@@ -119,12 +119,12 @@ module strap_end(type = strap) { //! Generate the STL for end piece
|
||||
}
|
||||
|
||||
union() {
|
||||
linear_extrude(height = z1)
|
||||
linear_extrude(z1)
|
||||
with_hole()
|
||||
outer();
|
||||
|
||||
translate_z(z1)
|
||||
linear_extrude(height = strap_height(type) - z1)
|
||||
linear_extrude(strap_height(type) - z1)
|
||||
difference() {
|
||||
outer();
|
||||
|
||||
@@ -137,11 +137,11 @@ module strap_end(type = strap) { //! Generate the STL for end piece
|
||||
}
|
||||
}
|
||||
|
||||
linear_extrude(height = strap_height(type) - layer_height)
|
||||
linear_extrude(strap_height(type) - layer_height)
|
||||
with_hole()
|
||||
strap_boss_shape(type);
|
||||
|
||||
linear_extrude(height = z2)
|
||||
linear_extrude(z2)
|
||||
with_hole()
|
||||
offset(cnc_bit_r)
|
||||
offset(-step - cnc_bit_r)
|
||||
@@ -160,7 +160,7 @@ module strap_end(type = strap) { //! Generate the STL for end piece
|
||||
//
|
||||
module strap_end_assembly(type = strap)
|
||||
assembly("strap_end") {
|
||||
color(pp1_colour)
|
||||
stl_colour(pp1_colour)
|
||||
strap_end(type);
|
||||
|
||||
translate_z(strap_height(type) + strap_key(type))
|
||||
@@ -175,7 +175,7 @@ module strap_assembly(length, type = strap) { //! Assembly with screws in place
|
||||
|
||||
screw_length = screw_shorter_than(washer_thickness(washer) + washer_thickness(penny) + insert_length(insert) + panel_clearance + counterbore);
|
||||
|
||||
color(pp4_colour) strap(length, type);
|
||||
stl_colour(pp4_colour) strap(length, type);
|
||||
|
||||
strap_screw_positions(length, type)
|
||||
translate_z(strap_height(type))
|
||||
|
504
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><tr>
|
||||
<th align="left"> Vitamins A-M </th><th align="left"> Vitamins N-Z </th><th align="left"> Printed </th><th align="left"> Utilities </th><th align="left"> Core Utilities </th></tr>
|
||||
<tr><td> <a href = "#Ball_bearings">Ball_bearings</a> </td><td> <a href = "#Nuts">Nuts</a> </td><td> <a href = "#Box">Box</a> </td><td> <a href = "#Annotation">Annotation</a> </td><td> <a href = "#Bom">Bom</a> </td></tr>
|
||||
<tr><td> <a href = "#Batteries">Batteries</a> </td><td> <a href = "#O_ring">O_ring</a> </td><td> <a href = "#Butt_box">Butt_box</a> </td><td> <a href = "#Bezier">Bezier</a> </td><td> <a href = "#Clip">Clip</a> </td></tr>
|
||||
<tr><td> <a href = "#Belts">Belts</a> </td><td> <a href = "#Opengrab">Opengrab</a> </td><td> <a href = "#Cable_grommets">Cable_grommets</a> </td><td> <a href = "#Dogbones">Dogbones</a> </td><td> <a href = "#Global">Global</a> </td></tr>
|
||||
<tr><td> <a href = "#Blowers">Blowers</a> </td><td> <a href = "#Pcb">Pcb</a> </td><td> <a href = "#Carriers">Carriers</a> </td><td> <a href = "#Fillet">Fillet</a> </td><td> <a href = "#Polyholes">Polyholes</a> </td></tr>
|
||||
<tr><td> <a href = "#Bulldogs">Bulldogs</a> </td><td> <a href = "#Pcbs">Pcbs</a> </td><td> <a href = "#Corner_block">Corner_block</a> </td><td> <a href = "#Hanging_hole">Hanging_hole</a> </td><td> <a href = "#Rounded_rectangle">Rounded_rectangle</a> </td></tr>
|
||||
<tr><td> <a href = "#Buttons">Buttons</a> </td><td> <a href = "#Pillars">Pillars</a> </td><td> <a href = "#Door_hinge">Door_hinge</a> </td><td> <a href = "#Layout">Layout</a> </td><td> <a href = "#Sphere">Sphere</a> </td></tr>
|
||||
<tr><td> <a href = "#Cable_strips">Cable_strips</a> </td><td> <a href = "#Pin_headers">Pin_headers</a> </td><td> <a href = "#Door_latch">Door_latch</a> </td><td> <a href = "#Maths">Maths</a> </td><td> <a href = "#Teardrops">Teardrops</a> </td></tr>
|
||||
<tr><td> <a href = "#Components">Components</a> </td><td> <a href = "#Psus">Psus</a> </td><td> <a href = "#Fan_guard">Fan_guard</a> </td><td> <a href = "#Offset">Offset</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#D_connectors">D_connectors</a> </td><td> <a href = "#Pulleys">Pulleys</a> </td><td> <a href = "#Fixing_block">Fixing_block</a> </td><td> <a href = "#Quadrant">Quadrant</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Displays">Displays</a> </td><td> <a href = "#Rails">Rails</a> </td><td> <a href = "#Flat_hinge">Flat_hinge</a> </td><td> <a href = "#Round">Round</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Extrusion_brackets">Extrusion_brackets</a> </td><td> <a href = "#Ring_terminals">Ring_terminals</a> </td><td> <a href = "#Foot">Foot</a> </td><td> <a href = "#Rounded_cylinder">Rounded_cylinder</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Extrusions">Extrusions</a> </td><td> <a href = "#Rockers">Rockers</a> </td><td> <a href = "#Handle">Handle</a> </td><td> <a href = "#Rounded_polygon">Rounded_polygon</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Fans">Fans</a> </td><td> <a href = "#Rod">Rod</a> </td><td> <a href = "#Pcb_mount">Pcb_mount</a> </td><td> <a href = "#Sector">Sector</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Fuseholder">Fuseholder</a> </td><td> <a href = "#Screws">Screws</a> </td><td> <a href = "#Printed_box">Printed_box</a> </td><td> <a href = "#Sweep">Sweep</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Geared_steppers">Geared_steppers</a> </td><td> <a href = "#Scs_bearing_blocks">Scs_bearing_blocks</a> </td><td> <a href = "#Psu_shroud">Psu_shroud</a> </td><td> <a href = "#Thread">Thread</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Green_terminals">Green_terminals</a> </td><td> <a href = "#Sealing_strip">Sealing_strip</a> </td><td> <a href = "#Ribbon_clamp">Ribbon_clamp</a> </td><td> <a href = "#Tube">Tube</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Hot_ends">Hot_ends</a> </td><td> <a href = "#Sheets">Sheets</a> </td><td> <a href = "#Screw_knob">Screw_knob</a> </td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Hygrometer">Hygrometer</a> </td><td> <a href = "#Sk_brackets">Sk_brackets</a> </td><td> <a href = "#Socket_box">Socket_box</a> </td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Iecs">Iecs</a> </td><td> <a href = "#Spades">Spades</a> </td><td> <a href = "#Ssr_shroud">Ssr_shroud</a> </td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Inserts">Inserts</a> </td><td> <a href = "#Spools">Spools</a> </td><td> <a href = "#Strap_handle">Strap_handle</a> </td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Jack">Jack</a> </td><td> <a href = "#Springs">Springs</a> </td><td></td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Kp_pillow_blocks">Kp_pillow_blocks</a> </td><td> <a href = "#Ssrs">Ssrs</a> </td><td></td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Ldrs">Ldrs</a> </td><td> <a href = "#Stepper_motors">Stepper_motors</a> </td><td></td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Leadnuts">Leadnuts</a> </td><td> <a href = "#Toggles">Toggles</a> </td><td></td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Leds">Leds</a> </td><td> <a href = "#Transformers">Transformers</a> </td><td></td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Light_strips">Light_strips</a> </td><td> <a href = "#Tubings">Tubings</a> </td><td></td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Linear_bearings">Linear_bearings</a> </td><td> <a href = "#Variacs">Variacs</a> </td><td></td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Mains_sockets">Mains_sockets</a> </td><td> <a href = "#Veroboard">Veroboard</a> </td><td></td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Meter">Meter</a> </td><td> <a href = "#Washers">Washers</a> </td><td></td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Microswitches">Microswitches</a> </td><td> <a href = "#Wire">Wire</a> </td><td></td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Microview">Microview</a> </td><td> <a href = "#Zipties">Zipties</a> </td><td></td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Modules">Modules</a> </td><td></td><td></td><td></td><td></td></tr>
|
||||
<th align="left"> Vitamins A-I </th><th align="left"> Vitamins J-Q </th><th align="left"> Vitamins R-Z </th><th align="left"> Printed </th><th align="left"> Utilities </th><th align="left"> Core Utilities </th></tr>
|
||||
<tr><td> <a href = "#Axials">Axials</a> </td><td> <a href = "#Jack">Jack</a> </td><td> <a href = "#Rails">Rails</a> </td><td> <a href = "#Box">Box</a> </td><td> <a href = "#Annotation">Annotation</a> </td><td> <a href = "#BOM">BOM</a> </td></tr>
|
||||
<tr><td> <a href = "#Ball_bearings">Ball_bearings</a> </td><td> <a href = "#KP_pillow_blocks">KP_pillow_blocks</a> </td><td> <a href = "#Ring_terminals">Ring_terminals</a> </td><td> <a href = "#Butt_box">Butt_box</a> </td><td> <a href = "#Bezier">Bezier</a> </td><td> <a href = "#Clip">Clip</a> </td></tr>
|
||||
<tr><td> <a href = "#Batteries">Batteries</a> </td><td> <a href = "#LDRs">LDRs</a> </td><td> <a href = "#Rockers">Rockers</a> </td><td> <a href = "#Cable_grommets">Cable_grommets</a> </td><td> <a href = "#Dogbones">Dogbones</a> </td><td> <a href = "#Global">Global</a> </td></tr>
|
||||
<tr><td> <a href = "#Belts">Belts</a> </td><td> <a href = "#LEDs">LEDs</a> </td><td> <a href = "#Rod">Rod</a> </td><td> <a href = "#Carriers">Carriers</a> </td><td> <a href = "#Fillet">Fillet</a> </td><td> <a href = "#Polyholes">Polyholes</a> </td></tr>
|
||||
<tr><td> <a href = "#Blowers">Blowers</a> </td><td> <a href = "#Leadnuts">Leadnuts</a> </td><td> <a href = "#SCS_bearing_blocks">SCS_bearing_blocks</a> </td><td> <a href = "#Corner_block">Corner_block</a> </td><td> <a href = "#Hanging_hole">Hanging_hole</a> </td><td> <a href = "#Rounded_rectangle">Rounded_rectangle</a> </td></tr>
|
||||
<tr><td> <a href = "#Bulldogs">Bulldogs</a> </td><td> <a href = "#Light_strips">Light_strips</a> </td><td> <a href = "#SK_brackets">SK_brackets</a> </td><td> <a href = "#Door_hinge">Door_hinge</a> </td><td> <a href = "#Layout">Layout</a> </td><td> <a href = "#Sphere">Sphere</a> </td></tr>
|
||||
<tr><td> <a href = "#Buttons">Buttons</a> </td><td> <a href = "#Linear_bearings">Linear_bearings</a> </td><td> <a href = "#SSRs">SSRs</a> </td><td> <a href = "#Door_latch">Door_latch</a> </td><td> <a href = "#Maths">Maths</a> </td><td> <a href = "#Teardrops">Teardrops</a> </td></tr>
|
||||
<tr><td> <a href = "#Cable_strips">Cable_strips</a> </td><td> <a href = "#Mains_sockets">Mains_sockets</a> </td><td> <a href = "#Screws">Screws</a> </td><td> <a href = "#Fan_guard">Fan_guard</a> </td><td> <a href = "#Offset">Offset</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Circlips">Circlips</a> </td><td> <a href = "#Meter">Meter</a> </td><td> <a href = "#Sealing_strip">Sealing_strip</a> </td><td> <a href = "#Fixing_block">Fixing_block</a> </td><td> <a href = "#Quadrant">Quadrant</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Components">Components</a> </td><td> <a href = "#Microswitches">Microswitches</a> </td><td> <a href = "#Sheets">Sheets</a> </td><td> <a href = "#Flat_hinge">Flat_hinge</a> </td><td> <a href = "#Round">Round</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#DIP">DIP</a> </td><td> <a href = "#Microview">Microview</a> </td><td> <a href = "#Spades">Spades</a> </td><td> <a href = "#Foot">Foot</a> </td><td> <a href = "#Rounded_cylinder">Rounded_cylinder</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#D_connectors">D_connectors</a> </td><td> <a href = "#Modules">Modules</a> </td><td> <a href = "#Spools">Spools</a> </td><td> <a href = "#Handle">Handle</a> </td><td> <a href = "#Rounded_polygon">Rounded_polygon</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Displays">Displays</a> </td><td> <a href = "#Nuts">Nuts</a> </td><td> <a href = "#Springs">Springs</a> </td><td> <a href = "#PCB_mount">PCB_mount</a> </td><td> <a href = "#Sector">Sector</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Extrusion_brackets">Extrusion_brackets</a> </td><td> <a href = "#O_ring">O_ring</a> </td><td> <a href = "#Stepper_motors">Stepper_motors</a> </td><td> <a href = "#PSU_shroud">PSU_shroud</a> </td><td> <a href = "#Sweep">Sweep</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Extrusions">Extrusions</a> </td><td> <a href = "#Opengrab">Opengrab</a> </td><td> <a href = "#Swiss_clips">Swiss_clips</a> </td><td> <a href = "#Printed_box">Printed_box</a> </td><td> <a href = "#Thread">Thread</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Fans">Fans</a> </td><td> <a href = "#PCB">PCB</a> </td><td> <a href = "#Toggles">Toggles</a> </td><td> <a href = "#Ribbon_clamp">Ribbon_clamp</a> </td><td> <a href = "#Tube">Tube</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Fuseholder">Fuseholder</a> </td><td> <a href = "#PCBs">PCBs</a> </td><td> <a href = "#Transformers">Transformers</a> </td><td> <a href = "#SSR_shroud">SSR_shroud</a> </td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Geared_steppers">Geared_steppers</a> </td><td> <a href = "#PSUs">PSUs</a> </td><td> <a href = "#Tubings">Tubings</a> </td><td> <a href = "#Screw_knob">Screw_knob</a> </td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Green_terminals">Green_terminals</a> </td><td> <a href = "#Pillars">Pillars</a> </td><td> <a href = "#Variacs">Variacs</a> </td><td> <a href = "#Socket_box">Socket_box</a> </td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Hot_ends">Hot_ends</a> </td><td> <a href = "#Pin_headers">Pin_headers</a> </td><td> <a href = "#Veroboard">Veroboard</a> </td><td> <a href = "#Strap_handle">Strap_handle</a> </td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Hygrometer">Hygrometer</a> </td><td> <a href = "#Pulleys">Pulleys</a> </td><td> <a href = "#Washers">Washers</a> </td><td></td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#IECs">IECs</a> </td><td></td><td> <a href = "#Wire">Wire</a> </td><td></td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Inserts">Inserts</a> </td><td></td><td> <a href = "#Zipties">Zipties</a> </td><td></td><td></td><td></td></tr>
|
||||
</table>
|
||||
|
||||
---
|
||||
<a name="Axials"></a>
|
||||
## Axials
|
||||
Axial components for PCBs.
|
||||
|
||||
|
||||
[vitamins/axials.scad](vitamins/axials.scad) Object definitions.
|
||||
|
||||
[vitamins/axial.scad](vitamins/axial.scad) Implementation.
|
||||
|
||||
[tests/axials.scad](tests/axials.scad) Code for this example.
|
||||
|
||||
### Properties
|
||||
| Function | Description |
|
||||
|:--- |:--- |
|
||||
| ```ax_res_colour(type)``` | Body colour |
|
||||
| ```ax_res_diameter(type)``` | Body diameter |
|
||||
| ```ax_res_end_d(type)``` | End cap diameter |
|
||||
| ```ax_res_end_l(type)``` | End cap length |
|
||||
| ```ax_res_length(type)``` | Body length |
|
||||
| ```ax_res_wattage(type)``` | Power rating |
|
||||
| ```ax_res_wire(type)``` | Wire diameter |
|
||||
|
||||
### Modules
|
||||
| Module | Description |
|
||||
|:--- |:--- |
|
||||
| ```ax_res(type, value, tol = 5, pitch = 0)``` | Through hole axial resistor. If ```pitch``` is zero the minimum is used. If below the minimum the resistor is placed vertical. |
|
||||
| ```wire_link(d, l, h = 1)``` | Draw a wire jumper link. |
|
||||
|
||||

|
||||
|
||||
### Vitamins
|
||||
| Qty | Module call | BOM entry |
|
||||
| ---:|:--- |:---|
|
||||
| 1 | ```pcb(PERF60x40)``` | Perfboard 60 x 40mm |
|
||||
| 1 | ```ax_res(res1_8, 1000)``` | Resistor 1000 Ohms 5% 0.125W |
|
||||
| 1 | ```ax_res(res1_8, 2200, tol = 1)``` | Resistor 2200 Ohms 1% 0.125W |
|
||||
| 1 | ```ax_res(res1_4, 39000, tol = 1)``` | Resistor 39000 Ohms 1% 0.25W |
|
||||
| 1 | ```ax_res(res1_4, 47000)``` | Resistor 47000 Ohms 5% 0.25W |
|
||||
| 1 | ```ax_res(res1_2, 8200)``` | Resistor 8200 Ohms 5% 0.5W |
|
||||
| 1 | ```ax_res(res1_2, 8250, tol = 1)``` | Resistor 8250 Ohms 1% 0.5W |
|
||||
|
||||
|
||||
<a href="#top">Top</a>
|
||||
|
||||
---
|
||||
<a name="Ball_bearings"></a>
|
||||
## Ball_bearings
|
||||
@@ -75,14 +111,11 @@ Also single bearing balls are modelled as just a silver sphere and a BOM entry.
|
||||
| ```bb_bore(type)``` | Internal diameter |
|
||||
| ```bb_colour(type)``` | Shield colour, "silver" for metal |
|
||||
| ```bb_diameter(type)``` | External diameter |
|
||||
| ```bb_hub(type)``` | Inner rim thickness guesstimate |
|
||||
| ```bb_name(type)``` | Part code without shield type suffix |
|
||||
| ```bb_rim(type)``` | Outer rim thickness guesstimate |
|
||||
| ```bb_width(type)``` | Width |
|
||||
|
||||
### Functions
|
||||
| Function | Description |
|
||||
|:--- |:--- |
|
||||
| ```bb_rim(type)``` | Inner and outer rim thickness |
|
||||
|
||||
### Modules
|
||||
| Module | Description |
|
||||
|:--- |:--- |
|
||||
@@ -98,7 +131,8 @@ Also single bearing balls are modelled as just a silver sphere and a BOM entry.
|
||||
| 1 | ```ball_bearing(BB6200)``` | Ball bearing 6200-2RS 10mm x 30mm x 9mm |
|
||||
| 1 | ```ball_bearing(BB6201)``` | Ball bearing 6201-2RS 12mm x 32mm x 10mm |
|
||||
| 1 | ```ball_bearing(BB624)``` | Ball bearing 624-2RS 4mm x 13mm x 5mm |
|
||||
| 4 | ``` bearing_ball(3)``` | Steel ball 3mm |
|
||||
| 1 | ```ball_bearing(BB6808)``` | Ball bearing 6808-2RS 40mm x 52mm x 7mm |
|
||||
| 5 | ``` bearing_ball(3)``` | Steel ball 3mm |
|
||||
|
||||
|
||||
<a href="#top">Top</a>
|
||||
@@ -395,6 +429,48 @@ When the sides are constrained then a circular model is more accurate.
|
||||
| 3 | ```cable_strip(20, 25, 100, 30)``` | Polypropylene strip 189mm x 24mm x 0.8mm |
|
||||
|
||||
|
||||
<a href="#top">Top</a>
|
||||
|
||||
---
|
||||
<a name="Circlips"></a>
|
||||
## Circlips
|
||||
Circlips aka tapered retaining rings.
|
||||
|
||||
|
||||
[vitamins/circlips.scad](vitamins/circlips.scad) Object definitions.
|
||||
|
||||
[vitamins/circlip.scad](vitamins/circlip.scad) Implementation.
|
||||
|
||||
[tests/circlips.scad](tests/circlips.scad) Code for this example.
|
||||
|
||||
### Properties
|
||||
| Function | Description |
|
||||
|:--- |:--- |
|
||||
| ```circlip_a(type)``` | Size of the lugs |
|
||||
| ```circlip_b(type)``` | Widest part of the taper |
|
||||
| ```circlip_d1(type)``` | Nominal OD, i.e. diameter of tube |
|
||||
| ```circlip_d2(type)``` | Groove diameter, i.e. OD when installed |
|
||||
| ```circlip_d3(type)``` | Relaxed OD when not installed |
|
||||
| ```circlip_d5(type)``` | Plier hole diameter |
|
||||
| ```circlip_thickness(type)``` | Thickness |
|
||||
|
||||
### Modules
|
||||
| Module | Description |
|
||||
|:--- |:--- |
|
||||
| ```internal_circlip(type, open = 0)``` | Draw specified internal circlip, open = 0, for nominal size installed, 1 for relaxed uninstalled, -1 for squeezed to install |
|
||||
|
||||

|
||||
|
||||
### Vitamins
|
||||
| Qty | Module call | BOM entry |
|
||||
| ---:|:--- |:---|
|
||||
| 3 | ```circlip(circlip_12i)``` | Circlip internal 12mm |
|
||||
| 3 | ```circlip(circlip_15i)``` | Circlip internal 15mm |
|
||||
| 3 | ```circlip(circlip_19i)``` | Circlip internal 19mm |
|
||||
| 3 | ```circlip(circlip_21i)``` | Circlip internal 21mm |
|
||||
| 3 | ```circlip(circlip_28i)``` | Circlip internal 28mm |
|
||||
|
||||
|
||||
<a href="#top">Top</a>
|
||||
|
||||
---
|
||||
@@ -540,6 +616,50 @@ D-connectors. Can be any number of ways, male or female, solder buckets, PCB mou
|
||||
| 6 | ```d_pillar()``` | D-type connector pillar |
|
||||
|
||||
|
||||
<a href="#top">Top</a>
|
||||
|
||||
---
|
||||
<a name="DIP"></a>
|
||||
## DIP
|
||||
Dual inline IC packages and sockets
|
||||
|
||||
|
||||
[vitamins/dip.scad](vitamins/dip.scad) Implementation.
|
||||
|
||||
[tests/DIP.scad](tests/DIP.scad) Code for this example.
|
||||
|
||||
### Properties
|
||||
| Function | Description |
|
||||
|:--- |:--- |
|
||||
| ```pdip_pin_W(type)``` | Pin shoulder width |
|
||||
| ```pdip_pin_h(type)``` | Pin height |
|
||||
| ```pdip_pin_n(type)``` | Pin neck |
|
||||
| ```pdip_pin_s(type)``` | Height above seating plane |
|
||||
| ```pdip_pin_t(type)``` | Pin thickness |
|
||||
| ```pdip_pin_w(type)``` | Pin width |
|
||||
|
||||
### Modules
|
||||
| Module | Description |
|
||||
|:--- |:--- |
|
||||
| ```dip(n, part, size, w, pitch, pin)``` | Draw DIP package |
|
||||
| ```pdip(pins, part, socketed, w = inch(0.3)``` | Draw standard 0.1" PDIP IC package |
|
||||
| ```pdip_pin(type, l, end)``` | Draw a pin |
|
||||
|
||||

|
||||
|
||||
### 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>
|
||||
|
||||
---
|
||||
@@ -860,6 +980,7 @@ Parametric green terminal blocks
|
||||
| ```gt_back_depth(type)``` | Back ledge depth |
|
||||
| ```gt_back_height(type)``` | Height at the back |
|
||||
| ```gt_box_h(type)``` | Height of the cable entry box |
|
||||
| ```gt_box_setback(type)``` | How far the contact box is set back from the front |
|
||||
| ```gt_box_w(type)``` | Width inside the cable entry box |
|
||||
| ```gt_depth(type)``` | Total front to back depth |
|
||||
| ```gt_front_depth(type)``` | Front ledge depth |
|
||||
@@ -871,7 +992,7 @@ Parametric green terminal blocks
|
||||
| ```gt_top(type)``` | Depth at the top |
|
||||
| ```gt_tube_h(type)``` | Height of optional tubes around the screws |
|
||||
| ```gt_y_offset(type)``` | Offset of the pins from centre of the depth |
|
||||
| ```gt_y_offset2(type)``` | Offset of the pins screws from the screws |
|
||||
| ```gt_y_offset2(type)``` | Offset of the pins from the screws |
|
||||
|
||||
### Modules
|
||||
| Module | Description |
|
||||
@@ -884,8 +1005,9 @@ Parametric green terminal blocks
|
||||
| Qty | Module call | BOM entry |
|
||||
| ---:|:--- |:---|
|
||||
| 1 | ```green_terminal(gt_6p35, 2)``` | Terminal block 2 way 0.25" |
|
||||
| 1 | ```green_terminal(gt_3p5, 3)``` | Terminal block 3 way 3.5mm |
|
||||
| 1 | ```green_terminal(gt_2p54, 4)``` | Terminal block 4 way 0.1" |
|
||||
| 1 | ```green_terminal(gt_5p08, 3)``` | Terminal block 3 way 0.2" |
|
||||
| 1 | ```green_terminal(gt_3p5, 4)``` | Terminal block 4 way 3.5mm |
|
||||
| 1 | ```green_terminal(gt_2p54, 5)``` | Terminal block 5 way 0.1" |
|
||||
|
||||
|
||||
<a href="#top">Top</a>
|
||||
@@ -986,8 +1108,8 @@ Mini LCD Celsius Digital Thermometer Hygrometer Temperature Humidity Meter Gauge
|
||||
<a href="#top">Top</a>
|
||||
|
||||
---
|
||||
<a name="Iecs"></a>
|
||||
## Iecs
|
||||
<a name="IECs"></a>
|
||||
## IECs
|
||||
IEC mains inlets and outlet.
|
||||
|
||||
|
||||
@@ -995,7 +1117,7 @@ IEC mains inlets and outlet.
|
||||
|
||||
[vitamins/iec.scad](vitamins/iec.scad) Implementation.
|
||||
|
||||
[tests/iecs.scad](tests/iecs.scad) Code for this example.
|
||||
[tests/IECs.scad](tests/IECs.scad) Code for this example.
|
||||
|
||||
### Properties
|
||||
| Function | Description |
|
||||
@@ -1142,8 +1264,8 @@ E.g. a "brown" socket for mains live needs to be displayed as "sienna" to look r
|
||||
<a href="#top">Top</a>
|
||||
|
||||
---
|
||||
<a name="Kp_pillow_blocks"></a>
|
||||
## Kp_pillow_blocks
|
||||
<a name="KP_pillow_blocks"></a>
|
||||
## KP_pillow_blocks
|
||||
KP pillow block bearings
|
||||
|
||||
|
||||
@@ -1151,7 +1273,7 @@ KP pillow block bearings
|
||||
|
||||
[vitamins/kp_pillow_block.scad](vitamins/kp_pillow_block.scad) Implementation.
|
||||
|
||||
[tests/kp_pillow_blocks.scad](tests/kp_pillow_blocks.scad) Code for this example.
|
||||
[tests/KP_pillow_blocks.scad](tests/KP_pillow_blocks.scad) Code for this example.
|
||||
|
||||
### Properties
|
||||
| Function | Description |
|
||||
@@ -1195,8 +1317,8 @@ KP pillow block bearings
|
||||
<a href="#top">Top</a>
|
||||
|
||||
---
|
||||
<a name="Ldrs"></a>
|
||||
## Ldrs
|
||||
<a name="LDRs"></a>
|
||||
## LDRs
|
||||
Light dependent resistors.
|
||||
|
||||
Larger ones seem to have both a higher dark resistance and a lower bright light resistance.
|
||||
@@ -1206,7 +1328,7 @@ Larger ones seem to have both a higher dark resistance and a lower bright light
|
||||
|
||||
[vitamins/ldr.scad](vitamins/ldr.scad) Implementation.
|
||||
|
||||
[tests/ldrs.scad](tests/ldrs.scad) Code for this example.
|
||||
[tests/LDRs.scad](tests/LDRs.scad) Code for this example.
|
||||
|
||||
### Properties
|
||||
| Function | Description |
|
||||
@@ -1286,8 +1408,8 @@ Nuts for leadscrews.
|
||||
<a href="#top">Top</a>
|
||||
|
||||
---
|
||||
<a name="Leds"></a>
|
||||
## Leds
|
||||
<a name="LEDs"></a>
|
||||
## LEDs
|
||||
Standard domed through hole LEDs. Can specify colour and lead length.
|
||||
|
||||
|
||||
@@ -1295,7 +1417,7 @@ Standard domed through hole LEDs. Can specify colour and lead length.
|
||||
|
||||
[vitamins/led.scad](vitamins/led.scad) Implementation.
|
||||
|
||||
[tests/leds.scad](tests/leds.scad) Code for this example.
|
||||
[tests/LEDs.scad](tests/LEDs.scad) Code for this example.
|
||||
|
||||
### Properties
|
||||
| Function | Description |
|
||||
@@ -1697,8 +1819,12 @@ If a nut is given a child then it gets placed on its top surface.
|
||||
### Properties
|
||||
| Function | Description |
|
||||
|:--- |:--- |
|
||||
| ```nut_pitch(type)``` | Pitch if not standard metric course thread |
|
||||
| ```nut_radius(type)``` | Radius across the corners |
|
||||
| ```nut_size(type)``` | Diameter of the corresponding screw |
|
||||
| ```nut_square_size(type)``` | Diameter of the corresponding screw |
|
||||
| ```nut_square_thickness(type)``` | Thickness of the square nut |
|
||||
| ```nut_square_width(type)``` | Width of the square nut |
|
||||
| ```nut_trap_depth(type)``` | Depth of nut trap |
|
||||
| ```nut_washer(type)``` | Corresponding washer |
|
||||
|
||||
@@ -1715,6 +1841,7 @@ If a nut is given a child then it gets placed on its top surface.
|
||||
|:--- |:--- |
|
||||
| ```nut(type, nyloc = false, brass = false, nylon = false)``` | Draw specified nut |
|
||||
| ```nut_and_washer(type, nyloc)``` | Draw nut with corresponding washer |
|
||||
| ```nut_square(type, brass = false, nylon = false)``` | Draw specified square nut |
|
||||
| ```nut_trap(screw, nut, depth = 0, horizontal = false, supported = false, h = 200)``` | Make a nut trap |
|
||||
| ```wingnut(type)``` | Draw a wingnut |
|
||||
|
||||
@@ -1733,18 +1860,23 @@ If a nut is given a child then it gets placed on its top surface.
|
||||
| 1 | ```nut(M3_nut)``` | Nut M3 x 2.4mm |
|
||||
| 1 | ```nut(M3_nut, brass = true)``` | Nut M3 x 2.4mm brass |
|
||||
| 1 | ```nut(M3_nut, nyloc = true)``` | Nut M3 x 2.4mm nyloc |
|
||||
| 1 | ```nut(M3nS_thin_nut)``` | Nut M3nS 5.5 x 1.8mm |
|
||||
| 1 | ```sliding_t_nut(M4_hammer_nut)``` | Nut M4 hammer |
|
||||
| 1 | ```sliding_t_nut(M4_sliding_t_nut)``` | Nut M4 sliding T |
|
||||
| 1 | ```nut(M4_nut)``` | Nut M4 x 3.2mm |
|
||||
| 1 | ```nut(M4_nut, nyloc = true)``` | Nut M4 x 3.2mm nyloc |
|
||||
| 1 | ```nut(M4nS_thin_nut)``` | Nut M4nS 7 x 2.2mm |
|
||||
| 1 | ```sliding_t_nut(M5_sliding_t_nut)``` | Nut M5 sliding T |
|
||||
| 1 | ```nut(M5_nut)``` | Nut M5 x 4mm |
|
||||
| 1 | ```nut(M5_nut, nyloc = true)``` | Nut M5 x 4mm nyloc |
|
||||
| 1 | ```nut(M5nS_thin_nut)``` | Nut M5nS 8 x 2.7mm |
|
||||
| 1 | ```nut(M6_half_nut)``` | Nut M6 x 3mm |
|
||||
| 1 | ```nut(M6_nut)``` | Nut M6 x 5mm |
|
||||
| 1 | ```nut(M6_nut, nyloc = true)``` | Nut M6 x 5mm nyloc |
|
||||
| 1 | ```nut(M6nS_thin_nut)``` | Nut M6nS 10 x 3.2mm |
|
||||
| 1 | ```nut(M8_nut)``` | Nut M8 x 6.5mm |
|
||||
| 1 | ```nut(M8_nut, nyloc = true)``` | Nut M8 x 6.5mm nyloc |
|
||||
| 1 | ```nut(M8nS_thin_nut)``` | Nut M8nS 13 x 4mm |
|
||||
| 1 | ```washer(M6_washer)``` | Washer M6 x 12.5mm x 1.5mm |
|
||||
| 1 | ```wingnut(M4_wingnut)``` | Wingnut M4 |
|
||||
|
||||
@@ -1817,14 +1949,14 @@ A permanent magnet that can be magnatized and de-magnatized electronically.
|
||||
<a href="#top">Top</a>
|
||||
|
||||
---
|
||||
<a name="Pcb"></a>
|
||||
## Pcb
|
||||
<a name="PCB"></a>
|
||||
## PCB
|
||||
PCBs and perfboard with optional components. The shape can be a rectangle with optionally rounded corners or a polygon for odd shapes like Arduino.
|
||||
|
||||
|
||||
[vitamins/pcb.scad](vitamins/pcb.scad) Implementation.
|
||||
|
||||
[tests/pcb.scad](tests/pcb.scad) Code for this example.
|
||||
[tests/PCB.scad](tests/PCB.scad) Code for this example.
|
||||
|
||||
### Properties
|
||||
| Function | Description |
|
||||
@@ -1863,13 +1995,14 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
|
||||
| Module | Description |
|
||||
|:--- |:--- |
|
||||
| ```barrel_jack(cutout = false)``` | Draw barrel power jack |
|
||||
| ```buzzer(height, diameter, colour)``` | Draw PCB buzzer with specified height, diameter and color |
|
||||
| ```buzzer(height, diameter, colour)``` | Draw PCB buzzer with specified height, diameter and colour |
|
||||
| ```chip(length, width, thickness, colour, cutout = false)``` | Draw a coloured cube to represent a chip, or other rectangular component |
|
||||
| ```flat_flex(cutout = false)``` | Draw flat flexistrip connector as used on RPI0 |
|
||||
| ```flex(cutout = false)``` | Draw flexistrip connector |
|
||||
| ```hdmi(type, cutout = false)``` | Draw HDMI socket |
|
||||
| ```jack(cutout = false)``` | Draw 3.5mm jack |
|
||||
| ```molex_254(ways)``` | Draw molex header |
|
||||
| ```molex_usb_Ax2(cutout)``` | Draw Molex USB connector suitable for perf board |
|
||||
| ```pcb(type)``` | Draw specified PCB |
|
||||
| ```pcb_assembly(type, height, thickness)``` | Draw PCB assembly with spaces and fasteners in place |
|
||||
| ```pcb_base(type, height, thickness, wall = 2)``` | Generate STL for a base with PCB spacers |
|
||||
@@ -1881,7 +2014,9 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
|
||||
| ```pcb_screw_positions(type)``` | Positions children at the mounting hole positions |
|
||||
| ```pcb_spacer(screw, height, wall = 1.8, taper = 0)``` | Generate STL for PCB spacer |
|
||||
| ```rj45(cutout = false)``` | Draw RJ45 Ethernet connector |
|
||||
| ```standoff(h, d, h2, d2)``` | Draw a standoff |
|
||||
| ```terminal_35(ways, colour = "blue")``` | Draw 3.5mm terminal block |
|
||||
| ```trimpot10(vertical, cutout = false)``` | Draw a ten turn trimpot |
|
||||
| ```uSD(size, cutout = false)``` | Draw uSD socket |
|
||||
| ```usb_Ax1(cutout = false)``` | Draw USB type A single socket |
|
||||
| ```usb_Ax2(cutout = false)``` | Draw USB type A dual socket |
|
||||
@@ -1893,14 +2028,50 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
|
||||
### Vitamins
|
||||
| Qty | Module call | BOM entry |
|
||||
| ---:|:--- |:---|
|
||||
| 1 | ```box_header(2p54header, 4, 2, smt = 0)``` | Box header 4 x 2 |
|
||||
| 1 | ```d_plug(DCONN9, pcb = true)``` | D-type 9 way PCB mount plug |
|
||||
| 1 | ```dil_socket(12, 15.24)``` | DIL socket 24 x 0.6" |
|
||||
| 1 | ```hdmi(hdmi_full)``` | HDMI socket |
|
||||
| 1 | ```pdip(24, 27C32, w = 15.24)``` | IC 27C32 PDIP24 |
|
||||
| 1 | ```pdip(8, NE555)``` | IC NE555 PDIP8 |
|
||||
| 1 | ```idc_transition(2p54header, 5)``` | IDC transition header 5 x 2 |
|
||||
| 1 | ```led(LED10mm, "yellow")``` | LED 10 mm yellow |
|
||||
| 1 | ```led(LED3mm)``` | LED 3 mm red |
|
||||
| 1 | ```led(LED5mm, "orange")``` | LED 5 mm orange |
|
||||
| 1 | ```microswitch(small_microswitch)``` | Microswitch DM1-00P-110-3 |
|
||||
| 1 | ```hdmi(hdmi_mini)``` | Mini HDMI socket |
|
||||
| 1 | ```molex_254(2)``` | Molex KK header 2 way |
|
||||
| 1 | ```pin_header(2p54header, 4, 1, smt = 0)``` | Pin header 4 x 1 |
|
||||
| 1 | ```pin_header(2p54header, 5, 1, smt = undef)``` | Pin header 5 x 1 |
|
||||
| 1 | ```pin_socket(2p54header, 4, 1, right_angle = undef, height = undef, smt = undef)``` | Pin socket 4 x 1 |
|
||||
| 1 | ```pin_socket(2p54header, 6, 1)``` | Pin socket 6 x 1 |
|
||||
| 1 | ```pin_socket(2p54header, 8, 1)``` | Pin socket 8 x 1 |
|
||||
| 1 | ```pin_socket(2p54header, 8, 1, right_angle = undef, height = undef, smt = undef)``` | Pin socket 8 x 1 |
|
||||
| 1 | ```ax_res(res1_2, 10, tol = 10)``` | Resistor 10 Ohms 10% 0.5W |
|
||||
| 1 | ```ax_res(res1_4, 100, tol = 2)``` | Resistor 100 Ohms 2% 0.25W |
|
||||
| 1 | ```ax_res(res1_8, 1000)``` | Resistor 1000 Ohms 5% 0.125W |
|
||||
| 1 | ```ax_res(res1_4, 10000)``` | Resistor 10000 Ohms 5% 0.25W |
|
||||
| 1 | ```ax_res(res1_2, 100000)``` | Resistor 100000 Ohms 5% 0.5W |
|
||||
| 1 | ```ax_res(res1_8, 1e+6, tol = 1)``` | Resistor 1e+6 Ohms 1% 0.125W |
|
||||
| 1 | ```square_button(button_6mm)``` | Square button 6mm |
|
||||
| 1 | ```pcb(TMC2130)``` | TMC2130 |
|
||||
| 1 | ```green_terminal(gt_5p08, 2)``` | Terminal block 2 way 0.2" |
|
||||
| 2 | ```green_terminal(gt_6p35, 2)``` | Terminal block 2 way 0.25" |
|
||||
| 1 | ```green_terminal(gt_5x17, 2)``` | Terminal block 2 way 5mm |
|
||||
| 2 | ```green_terminal(gt_2p54, 3)``` | Terminal block 3 way 0.1" |
|
||||
| 1 | ```terminal_35(3)``` | Terminal block 3 way 3.5mm |
|
||||
| 1 | ```green_terminal(gt_5x11, 3)``` | Terminal block 3 way 5mm |
|
||||
| 1 | ```green_terminal(gt_5x17, 3)``` | Terminal block 3 way 5mm |
|
||||
| 2 | ```green_terminal(gt_3p5, 4)``` | Terminal block 4 way 3.5mm |
|
||||
| 1 | ```terminal_35(4)``` | Terminal block 4 way 3.5mm |
|
||||
| 1 | ```pcb(TestPCB)``` | Test PCB |
|
||||
|
||||
|
||||
<a href="#top">Top</a>
|
||||
|
||||
---
|
||||
<a name="Pcbs"></a>
|
||||
## Pcbs
|
||||
<a name="PCBs"></a>
|
||||
## PCBs
|
||||
PCBs and perfboard with optional components. The shape can be a rectangle with optionally rounded corners or a polygon for odd shapes like Arduino.
|
||||
|
||||
|
||||
@@ -1908,7 +2079,7 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
|
||||
|
||||
[vitamins/pcb.scad](vitamins/pcb.scad) Implementation.
|
||||
|
||||
[tests/pcbs.scad](tests/pcbs.scad) Code for this example.
|
||||
[tests/PCBs.scad](tests/PCBs.scad) Code for this example.
|
||||
|
||||
### Properties
|
||||
| Function | Description |
|
||||
@@ -1947,13 +2118,14 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
|
||||
| Module | Description |
|
||||
|:--- |:--- |
|
||||
| ```barrel_jack(cutout = false)``` | Draw barrel power jack |
|
||||
| ```buzzer(height, diameter, colour)``` | Draw PCB buzzer with specified height, diameter and color |
|
||||
| ```buzzer(height, diameter, colour)``` | Draw PCB buzzer with specified height, diameter and colour |
|
||||
| ```chip(length, width, thickness, colour, cutout = false)``` | Draw a coloured cube to represent a chip, or other rectangular component |
|
||||
| ```flat_flex(cutout = false)``` | Draw flat flexistrip connector as used on RPI0 |
|
||||
| ```flex(cutout = false)``` | Draw flexistrip connector |
|
||||
| ```hdmi(type, cutout = false)``` | Draw HDMI socket |
|
||||
| ```jack(cutout = false)``` | Draw 3.5mm jack |
|
||||
| ```molex_254(ways)``` | Draw molex header |
|
||||
| ```molex_usb_Ax2(cutout)``` | Draw Molex USB connector suitable for perf board |
|
||||
| ```pcb(type)``` | Draw specified PCB |
|
||||
| ```pcb_assembly(type, height, thickness)``` | Draw PCB assembly with spaces and fasteners in place |
|
||||
| ```pcb_base(type, height, thickness, wall = 2)``` | Generate STL for a base with PCB spacers |
|
||||
@@ -1965,7 +2137,9 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
|
||||
| ```pcb_screw_positions(type)``` | Positions children at the mounting hole positions |
|
||||
| ```pcb_spacer(screw, height, wall = 1.8, taper = 0)``` | Generate STL for PCB spacer |
|
||||
| ```rj45(cutout = false)``` | Draw RJ45 Ethernet connector |
|
||||
| ```standoff(h, d, h2, d2)``` | Draw a standoff |
|
||||
| ```terminal_35(ways, colour = "blue")``` | Draw 3.5mm terminal block |
|
||||
| ```trimpot10(vertical, cutout = false)``` | Draw a ten turn trimpot |
|
||||
| ```uSD(size, cutout = false)``` | Draw uSD socket |
|
||||
| ```usb_Ax1(cutout = false)``` | Draw USB type A single socket |
|
||||
| ```usb_Ax2(cutout = false)``` | Draw USB type A dual socket |
|
||||
@@ -1983,17 +2157,18 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
|
||||
| 1 | ```d_plug(DCONN15, pcb = true)``` | D-type 15 way PCB mount plug |
|
||||
| 1 | ```pcb(DuetE)``` | Duet 2 Ethernet electronics |
|
||||
| 1 | ```pcb(Duex2)``` | Duex2 expansion board |
|
||||
| 1 | ```pcb(Duex5)``` | Duex5 expasnion board |
|
||||
| 1 | ```pcb(Duex5)``` | Duex5 expansion board |
|
||||
| 1 | ```pcb(EnviroPlus)``` | Enviro+ |
|
||||
| 1 | ```pcb(ExtruderPCB)``` | Extruder connection PCB |
|
||||
| 1 | ```pcb(Keyes5p1)``` | Keyes5.1 Arduino Uno expansion board |
|
||||
| 1 | ```pcb(MT3608)``` | MT3608 boost converter module |
|
||||
| 1 | ```pcb(Melzi)``` | Melzi electronics |
|
||||
| 4 | | Micro SD card |
|
||||
| 1 | ```molex_254(2)``` | Molex KK header 2 way |
|
||||
| 1 | ```molex_254(3)``` | Molex KK header 3 way |
|
||||
| 16 | ```nut(M2_nut, nyloc = true)``` | Nut M2 x 1.6mm nyloc |
|
||||
| 32 | ```nut(M2p5_nut, nyloc = true)``` | Nut M2.5 x 2.2mm nyloc |
|
||||
| 12 | ```nut(M3_nut, nyloc = true)``` | Nut M3 x 2.4mm nyloc |
|
||||
| 30 | ```nut(M2p5_nut, nyloc = true)``` | Nut M2.5 x 2.2mm nyloc |
|
||||
| 16 | ```nut(M3_nut, nyloc = true)``` | Nut M3 x 2.4mm nyloc |
|
||||
| 12 | ```nut(M4_nut, nyloc = true)``` | Nut M4 x 3.2mm nyloc |
|
||||
| 1 | ```pcb(PI_IO)``` | PI_IO V2 |
|
||||
| 1 | ```pcb(PSU12V1A)``` | PSU 12V 1A |
|
||||
@@ -2006,45 +2181,52 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
|
||||
| 1 | ```pcb(RAMPSEndstop)``` | RAMPS Endstop Switch |
|
||||
| 1 | ```pcb(RPI3)``` | Raspberry Pi 3 |
|
||||
| 1 | ```pcb(RPI0)``` | Raspberry Pi Zero |
|
||||
| 16 | ```screw(M2_cap_screw, 25)``` | Screw M2 cap x 25mm |
|
||||
| 4 | ```screw(M2p5_cap_screw, 16)``` | Screw M2.5 cap x 16mm |
|
||||
| 12 | ```screw(M2p5_cap_screw, 20)``` | Screw M2.5 cap x 20mm |
|
||||
| 12 | ```screw(M2_cap_screw, 16)``` | Screw M2 cap x 16mm |
|
||||
| 4 | ```screw(M2_cap_screw, 20)``` | Screw M2 cap x 20mm |
|
||||
| 2 | ```screw(M2p5_cap_screw, 16)``` | Screw M2.5 cap x 16mm |
|
||||
| 4 | ```screw(M2p5_cap_screw, 20)``` | Screw M2.5 cap x 20mm |
|
||||
| 4 | ```screw(M2p5_cap_screw, 25)``` | Screw M2.5 cap x 25mm |
|
||||
| 4 | ```screw(M2p5_cap_screw, 30)``` | Screw M2.5 cap x 30mm |
|
||||
| 4 | ```screw(M2p5_pan_screw, 20)``` | Screw M2.5 pan x 20mm |
|
||||
| 8 | ```screw(M2p5_pan_screw, 25)``` | Screw M2.5 pan x 25mm |
|
||||
| 4 | ```screw(M2p5_pan_screw, 35)``` | Screw M2.5 pan x 35mm |
|
||||
| 12 | ```screw(M2p5_pan_screw, 25)``` | Screw M2.5 pan x 25mm |
|
||||
| 4 | ```screw(M3_cap_screw, 16)``` | Screw M3 cap x 16mm |
|
||||
| 8 | ```screw(M3_cap_screw, 30)``` | Screw M3 cap x 30mm |
|
||||
| 4 | ```screw(M3_cap_screw, 35)``` | Screw M3 cap x 35mm |
|
||||
| 12 | ```screw(M4_cap_screw, 35)``` | Screw M4 cap x 35mm |
|
||||
| 4 | ```screw(M4_cap_screw, 30)``` | Screw M4 cap x 30mm |
|
||||
| 8 | ```screw(M4_cap_screw, 35)``` | Screw M4 cap x 35mm |
|
||||
| 1 | ```pcb(TP4056)``` | TP4056 Li-lon Battery charger module |
|
||||
| 3 | ```terminal_35(2)``` | Terminal block 2 way 3.5mm |
|
||||
| 2 | ```green_terminal(gt_2p54, 4)``` | Terminal block 4 way 0.1" |
|
||||
| 1 | | USB A to Mini B lead |
|
||||
| 1 | ```pcb(WD2002SJ)``` | WD2002SJ Buck Boost DC-DC converter |
|
||||
| 16 | ```washer(M2_washer)``` | Washer M2 x 5mm x 0.3mm |
|
||||
| 32 | ```washer(M2p5_washer)``` | Washer M2.5 x 5.9mm x 0.5mm |
|
||||
| 12 | ```washer(M3_washer)``` | Washer M3 x 7mm x 0.5mm |
|
||||
| 30 | ```washer(M2p5_washer)``` | Washer M2.5 x 5.9mm x 0.5mm |
|
||||
| 16 | ```washer(M3_washer)``` | Washer M3 x 7mm x 0.5mm |
|
||||
| 12 | ```washer(M4_washer)``` | Washer M4 x 9mm x 0.8mm |
|
||||
| 1 | ```pcb(ZC_A0591)``` | ZC-A0591 ULN2003 driver PCB |
|
||||
|
||||
### Printed
|
||||
| Qty | Filename |
|
||||
| ---:|:--- |
|
||||
| 4 | pcb_spacer20140.stl |
|
||||
| 4 | pcb_spacer20150.stl |
|
||||
| 4 | pcb_spacer20160.stl |
|
||||
| 4 | pcb_spacer20170.stl |
|
||||
| 4 | pcb_spacer2060.stl |
|
||||
| 4 | pcb_spacer2070.stl |
|
||||
| 4 | pcb_spacer2080.stl |
|
||||
| 4 | pcb_spacer2090.stl |
|
||||
| 4 | pcb_spacer25100.stl |
|
||||
| 4 | pcb_spacer25110_2.stl |
|
||||
| 4 | pcb_spacer25120_2.stl |
|
||||
| 4 | pcb_spacer25110.stl |
|
||||
| 4 | pcb_spacer25120.stl |
|
||||
| 4 | pcb_spacer25130_2.stl |
|
||||
| 4 | pcb_spacer25240.stl |
|
||||
| 4 | pcb_spacer2550.stl |
|
||||
| 4 | pcb_spacer2580.stl |
|
||||
| 4 | pcb_spacer2590.stl |
|
||||
| 4 | pcb_spacer30180.stl |
|
||||
| 4 | pcb_spacer30190.stl |
|
||||
| 4 | pcb_spacer30230.stl |
|
||||
| 4 | pcb_spacer25140_2.stl |
|
||||
| 4 | pcb_spacer25150_2.stl |
|
||||
| 4 | pcb_spacer25180.stl |
|
||||
| 2 | pcb_spacer2570.stl |
|
||||
| 4 | pcb_spacer30160.stl |
|
||||
| 4 | pcb_spacer30170.stl |
|
||||
| 4 | pcb_spacer30220.stl |
|
||||
| 4 | pcb_spacer3050.stl |
|
||||
| 4 | pcb_spacer40190.stl |
|
||||
| 4 | pcb_spacer40200.stl |
|
||||
| 4 | pcb_spacer40210.stl |
|
||||
| 4 | pcb_spacer40220.stl |
|
||||
|
||||
|
||||
<a href="#top">Top</a>
|
||||
@@ -2146,8 +2328,8 @@ Pin headers and sockets, etc.
|
||||
<a href="#top">Top</a>
|
||||
|
||||
---
|
||||
<a name="Psus"></a>
|
||||
## Psus
|
||||
<a name="PSUs"></a>
|
||||
## PSUs
|
||||
Powersupplies. Can be a simple cube or can be defined by a list of six faces, each with thickness, holes, cutouts, etc.
|
||||
|
||||
Face order is bottom, top, left, right, front, back.
|
||||
@@ -2157,7 +2339,7 @@ Face order is bottom, top, left, right, front, back.
|
||||
|
||||
[vitamins/psu.scad](vitamins/psu.scad) Implementation.
|
||||
|
||||
[tests/psus.scad](tests/psus.scad) Code for this example.
|
||||
[tests/PSUs.scad](tests/PSUs.scad) Code for this example.
|
||||
|
||||
### Properties
|
||||
| Function | Description |
|
||||
@@ -2335,10 +2517,10 @@ Linear rails with carriages.
|
||||
### Modules
|
||||
| Module | Description |
|
||||
|:--- |:--- |
|
||||
| ```carriage(type, rail, end_color = grey20, wiper_color = grey20)``` | Draw the specified carriage |
|
||||
| ```carriage(type, rail, end_colour = grey20, wiper_colour = grey20)``` | Draw the specified carriage |
|
||||
| ```carriage_hole_positions(type)``` | Position children over screw holes |
|
||||
| ```rail(type, length)``` | Draw the specified rail |
|
||||
| ```rail_assembly(type, length, pos, carriage_end_color = grey20, carriage_wiper_color = grey20)``` | Rail and carriage assembly |
|
||||
| ```rail_assembly(type, length, pos, carriage_end_colour = grey20, carriage_wiper_colour = grey20)``` | Rail and carriage assembly |
|
||||
| ```rail_hole_positions(type, length, first = 0, screws = 100, both_ends = true)``` | Position children over screw holes |
|
||||
| ```rail_screws(type, length, thickness, screws = 100)``` | Place screws in the rail |
|
||||
|
||||
@@ -2600,8 +2782,8 @@ Machine screws and wood screws with various head styles.
|
||||
<a href="#top">Top</a>
|
||||
|
||||
---
|
||||
<a name="Scs_bearing_blocks"></a>
|
||||
## Scs_bearing_blocks
|
||||
<a name="SCS_bearing_blocks"></a>
|
||||
## SCS_bearing_blocks
|
||||
SCSnUU and SCSnLUU bearing blocks
|
||||
|
||||
|
||||
@@ -2609,7 +2791,7 @@ SCSnUU and SCSnLUU bearing blocks
|
||||
|
||||
[vitamins/scs_bearing_block.scad](vitamins/scs_bearing_block.scad) Implementation.
|
||||
|
||||
[tests/scs_bearing_blocks.scad](tests/scs_bearing_blocks.scad) Code for this example.
|
||||
[tests/SCS_bearing_blocks.scad](tests/SCS_bearing_blocks.scad) Code for this example.
|
||||
|
||||
### Properties
|
||||
| Function | Description |
|
||||
@@ -2617,10 +2799,12 @@ SCSnUU and SCSnLUU bearing blocks
|
||||
| ```scs_bearing(type)``` | Linear bearing used |
|
||||
| ```scs_block_center_height(type)``` | Height of the center of the block |
|
||||
| ```scs_block_side_height(type)``` | Height of the side of the block, this determines the minimum screw length |
|
||||
| ```scs_circlip(type)``` | Circlip used |
|
||||
| ```scs_hole_offset(type)``` | Offset of bearing hole from base of block |
|
||||
| ```scs_screw(type)``` | Screw type |
|
||||
| ```scs_screw_separation_x(type)``` | Screw separation in X direction |
|
||||
| ```scs_screw_separation_z(type)``` | Screw separation in Z direction |
|
||||
| ```scs_spacer(type)``` | Spacer used in long bearings |
|
||||
|
||||
### Functions
|
||||
| Function | Description |
|
||||
@@ -2695,7 +2879,7 @@ The "Soft" parameter can be used to determinesif the sheet material needs machin
|
||||
* If soft, wood screws will be used, with a pilot hole.
|
||||
* If not soft, either tapped holes or a clearance hole and nuts will be used to retain screws.
|
||||
|
||||
The "Color" parameter is a quad-array: [R, G, B, Alpha], or can be a named color, see [OpenSCAD_User_Manual](https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/The_OpenSCAD_Language#color).
|
||||
The "Colour" parameter is a quad-array: [R, G, B, Alpha], or can be a named colour, see [OpenSCAD_User_Manual](https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/The_OpenSCAD_Language#color).
|
||||
|
||||
For speed sheets should be modelled in 2D by subtracting holes from 2D templates made by ```sheet_2D()``` and then extruded to 3D with ```render_2D_sheet()```.
|
||||
Note that modules that drill holes will return a 2D object if ```h``` is set to 0 to facilitate this.
|
||||
@@ -2717,8 +2901,8 @@ Note that modules that drill holes will return a 2D object if ```h``` is set to
|
||||
### Modules
|
||||
| Module | Description |
|
||||
|:--- |:--- |
|
||||
| ```render_2D_sheet(type, color = false)``` | Extrude a 2D sheet template and give it the correct colour |
|
||||
| ```render_sheet(type, color = false)``` | Render a sheet in the correct colour after holes have been subtracted |
|
||||
| ```render_2D_sheet(type, colour = false)``` | Extrude a 2D sheet template and give it the correct colour |
|
||||
| ```render_sheet(type, colour = false)``` | Render a sheet in the correct colour after holes have been subtracted |
|
||||
| ```sheet(type, w, d, corners = [0, 0, 0, 0])``` | Draw specified sheet |
|
||||
| ```sheet_2D(type, w, d, corners = [0, 0, 0, 0])``` | 2D sheet template with specified size and optionally rounded corners |
|
||||
|
||||
@@ -2750,8 +2934,8 @@ Note that modules that drill holes will return a 2D object if ```h``` is set to
|
||||
<a href="#top">Top</a>
|
||||
|
||||
---
|
||||
<a name="Sk_brackets"></a>
|
||||
## Sk_brackets
|
||||
<a name="SK_brackets"></a>
|
||||
## SK_brackets
|
||||
SK shaft support brackets
|
||||
|
||||
|
||||
@@ -2759,7 +2943,7 @@ SK shaft support brackets
|
||||
|
||||
[vitamins/sk_bracket.scad](vitamins/sk_bracket.scad) Implementation.
|
||||
|
||||
[tests/sk_brackets.scad](tests/sk_brackets.scad) Code for this example.
|
||||
[tests/SK_brackets.scad](tests/SK_brackets.scad) Code for this example.
|
||||
|
||||
### Properties
|
||||
| Function | Description |
|
||||
@@ -2933,8 +3117,8 @@ By default springs have their origin at the bottom but can be centered.
|
||||
<a href="#top">Top</a>
|
||||
|
||||
---
|
||||
<a name="Ssrs"></a>
|
||||
## Ssrs
|
||||
<a name="SSRs"></a>
|
||||
## SSRs
|
||||
Solid state relays.
|
||||
|
||||
|
||||
@@ -2942,7 +3126,7 @@ Solid state relays.
|
||||
|
||||
[vitamins/ssr.scad](vitamins/ssr.scad) Implementation.
|
||||
|
||||
[tests/ssrs.scad](tests/ssrs.scad) Code for this example.
|
||||
[tests/SSRs.scad](tests/SSRs.scad) Code for this example.
|
||||
|
||||
### Properties
|
||||
| Function | Description |
|
||||
@@ -3033,6 +3217,55 @@ NEMA stepper motor model.
|
||||
| 15 | ```star_washer(M3_washer)``` | Washer star M3 x 0.5mm |
|
||||
|
||||
|
||||
<a href="#top">Top</a>
|
||||
|
||||
---
|
||||
<a name="Swiss_clips"></a>
|
||||
## Swiss_clips
|
||||
Swiss picture clip.
|
||||
Used for holding glass on 3D printer beds.
|
||||
|
||||
The bending model is an approximation because in real life the arms bend.
|
||||
Should be reasonably accurate if not close to fully open.
|
||||
|
||||
|
||||
[vitamins/swiss_clips.scad](vitamins/swiss_clips.scad) Object definitions.
|
||||
|
||||
[vitamins/swiss_clip.scad](vitamins/swiss_clip.scad) Implementation.
|
||||
|
||||
[tests/Swiss_clips.scad](tests/Swiss_clips.scad) Code for this example.
|
||||
|
||||
### Properties
|
||||
| Function | Description |
|
||||
|:--- |:--- |
|
||||
| ```sclip_arm_length(type)``` | Length of arms |
|
||||
| ```sclip_arm_width(type)``` | Width of spring arms |
|
||||
| ```sclip_height(type)``` | External height |
|
||||
| ```sclip_hinge_offset(type)``` | Offset of hinge |
|
||||
| ```sclip_hook(type)``` | hook, length, width |
|
||||
| ```sclip_length(type)``` | Total external length |
|
||||
| ```sclip_max_gap(type)``` | Maximum opening |
|
||||
| ```sclip_radius(type)``` | Bend radius |
|
||||
| ```sclip_spigot(type)``` | Spigot length, width, height |
|
||||
| ```sclip_thickness(type)``` | Thickness of the metal |
|
||||
| ```sclip_width(type)``` | Width |
|
||||
|
||||
### Modules
|
||||
| Module | Description |
|
||||
|:--- |:--- |
|
||||
| ```swiss_clip(type, open = 0.9)``` | Draw a Swiss clip open by specified amount |
|
||||
| ```swiss_clip_hole(type, open, h = 0)``` | Drill hole for spigot |
|
||||
|
||||

|
||||
|
||||
### 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>
|
||||
|
||||
---
|
||||
@@ -3438,7 +3671,7 @@ Just a BOM entry at the moment and cable bundle size functions for holes, plus c
|
||||
| ```cable_tie_holes(cable_r, h = 100)``` | Holes to thread a ziptie through a panel to make a cable tie. |
|
||||
| ```mouse_hole(cable, h = 100, teardrop = false)``` | A mouse hole to allow a panel to go over a wire bundle. |
|
||||
| ```ribbon_cable(ways, length)``` | Add ribbon cable to the BOM |
|
||||
| ```wire(color, strands, length, strand = 0.2)``` | Add stranded wire to the BOM |
|
||||
| ```wire(colour, strands, length, strand = 0.2)``` | Add stranded wire to the BOM |
|
||||
|
||||

|
||||
|
||||
@@ -3745,17 +3978,24 @@ of conductive panels, an extra layer of insulation.
|
||||
---
|
||||
<a name="Carriers"></a>
|
||||
## Carriers
|
||||
Adapts ESP12 module to 0.1" grid. See <https://hydraraptor.blogspot.com/2018/04/esp-12-module-breakout-adaptor.html>.
|
||||
Adapts ESP12 modules and various small PCBs to 0.1" grid. See <https://hydraraptor.blogspot.com/2018/04/esp-12-module-breakout-adaptor.html>.
|
||||
|
||||
|
||||
[printed/carriers.scad](printed/carriers.scad) Implementation.
|
||||
|
||||
[tests/carriers.scad](tests/carriers.scad) Code for this example.
|
||||
|
||||
### Functions
|
||||
| Function | Description |
|
||||
|:--- |:--- |
|
||||
| ```carrier_height()``` | Height of PCB carrier |
|
||||
|
||||
### Modules
|
||||
| Module | Description |
|
||||
|:--- |:--- |
|
||||
| ```ESP12F_carrier_stl()``` | Generate the STL for an ESP12 carrier |
|
||||
| ```MT3608_carrier_stl()``` | Generate the STL for an MT3608 carrier, two required |
|
||||
| ```TP4056_carrier_stl()``` | Generate the STL for an TP4056 carrier, two required |
|
||||
|
||||

|
||||
|
||||
@@ -3763,6 +4003,8 @@ Adapts ESP12 module to 0.1" grid. See <https://hydraraptor.blogspot.com/2018/04/
|
||||
| Qty | Filename |
|
||||
| ---:|:--- |
|
||||
| 1 | ESP12F_carrier.stl |
|
||||
| 1 | MT3608_carrier.stl |
|
||||
| 1 | TP4056_carrier.stl |
|
||||
|
||||
|
||||
<a href="#top">Top</a>
|
||||
@@ -4251,15 +4493,15 @@ Printed handle that can be printed without needing support material due to its t
|
||||
<a href="#top">Top</a>
|
||||
|
||||
---
|
||||
<a name="Pcb_mount"></a>
|
||||
## Pcb_mount
|
||||
<a name="PCB_mount"></a>
|
||||
## PCB_mount
|
||||
A frame to mount a PCB by its corners when it has no mounting holes.
|
||||
The stl must be given a parameterless wrapper in the project that uses it.
|
||||
|
||||
|
||||
[printed/pcb_mount.scad](printed/pcb_mount.scad) Implementation.
|
||||
|
||||
[tests/pcb_mount.scad](tests/pcb_mount.scad) Code for this example.
|
||||
[tests/PCB_mount.scad](tests/PCB_mount.scad) Code for this example.
|
||||
|
||||
### Functions
|
||||
| Function | Description |
|
||||
@@ -4380,15 +4622,15 @@ It can also have printed feet on the base with the screws doubling up to hold th
|
||||
<a href="#top">Top</a>
|
||||
|
||||
---
|
||||
<a name="Psu_shroud"></a>
|
||||
## Psu_shroud
|
||||
<a name="PSU_shroud"></a>
|
||||
## PSU_shroud
|
||||
A cover to go over the mains end of a PSU terminal strip to make it safe.
|
||||
The stl and assembly must be given a name and parameterless wrappers for the stl and assembly added to the project.
|
||||
|
||||
|
||||
[printed/psu_shroud.scad](printed/psu_shroud.scad) Implementation.
|
||||
|
||||
[tests/psu_shroud.scad](tests/psu_shroud.scad) Code for this example.
|
||||
[tests/PSU_shroud.scad](tests/PSU_shroud.scad) Code for this example.
|
||||
|
||||
### Functions
|
||||
| Function | Description |
|
||||
@@ -4432,9 +4674,9 @@ The stl and assembly must be given a name and parameterless wrappers for the stl
|
||||
### Assemblies
|
||||
| Qty | Name |
|
||||
| ---:|:--- |
|
||||
| 1 | psu_shroud_PD_150_12_assembly |
|
||||
| 1 | psu_shroud_S_250_48_assembly |
|
||||
| 1 | psu_shroud_S_300_12_assembly |
|
||||
| 1 | PSU_shroud_PD_150_12_assembly |
|
||||
| 1 | PSU_shroud_S_250_48_assembly |
|
||||
| 1 | PSU_shroud_S_300_12_assembly |
|
||||
|
||||
|
||||
<a href="#top">Top</a>
|
||||
@@ -4582,15 +4824,15 @@ UK 13A socket and printed backbox with earth terminal for the panel it is mounte
|
||||
<a href="#top">Top</a>
|
||||
|
||||
---
|
||||
<a name="Ssr_shroud"></a>
|
||||
## Ssr_shroud
|
||||
<a name="SSR_shroud"></a>
|
||||
## SSR_shroud
|
||||
A cover to go over the mains end of an SSR to make it safe to be touched.
|
||||
The STL and assembly must be given a name and parameterless wrappers for the stl and assembly added to the project.
|
||||
|
||||
|
||||
[printed/ssr_shroud.scad](printed/ssr_shroud.scad) Implementation.
|
||||
|
||||
[tests/ssr_shroud.scad](tests/ssr_shroud.scad) Code for this example.
|
||||
[tests/SSR_shroud.scad](tests/SSR_shroud.scad) Code for this example.
|
||||
|
||||
### Functions
|
||||
| Function | Description |
|
||||
@@ -4630,8 +4872,8 @@ The STL and assembly must be given a name and parameterless wrappers for the stl
|
||||
### Assemblies
|
||||
| Qty | Name |
|
||||
| ---:|:--- |
|
||||
| 1 | ssr_shroud_SSR10DA_assembly |
|
||||
| 1 | ssr_shroud_SSR25DA_assembly |
|
||||
| 1 | SSR_shroud_SSR10DA_assembly |
|
||||
| 1 | SSR_shroud_SSR25DA_assembly |
|
||||
|
||||
|
||||
<a href="#top">Top</a>
|
||||
@@ -4846,6 +5088,7 @@ Maths utilities for manipulating vectors and matrices.
|
||||
| ```euler(R)``` | Convert a rotation matrix to a Euler rotation vector. |
|
||||
| ```identity(n, x = 1)``` | Construct an arbitrary size identity matrix |
|
||||
| ```reverse(v)``` | Reverse a vector |
|
||||
| ```rot3_z(a)``` | Generate a 3x3 matrix to rotate around z |
|
||||
| ```rotate(a, v)``` | Generate a 4x4 rotation matrix, ```a``` can be a vector of three angles or a single angle around ```z```, or around axis ```v``` |
|
||||
| ```scale(v)``` | Generate a 4x4 matrix that scales by ```v```, which can be a vector of xyz factors or a scalar to scale all axes equally |
|
||||
| ```transform(v, m)``` | Apply 4x4 transform to a 3 vector by extending it and cropping it again |
|
||||
@@ -5105,18 +5348,22 @@ Simple tube or ring
|
||||
<a href="#top">Top</a>
|
||||
|
||||
---
|
||||
<a name="Bom"></a>
|
||||
## Bom
|
||||
Bill Of Materials generation via echo and the ```bom.py``` script. Also handles exploded assembly views and posing. Assembly instructions can precede the module
|
||||
definition that makes the assembly.
|
||||
<a name="BOM"></a>
|
||||
## BOM
|
||||
Bill Of Materials generation via echo and the ```bom.py``` script. Also handles exploded assembly views and posing.
|
||||
Assembly instructions can precede the module definition that makes the assembly.
|
||||
|
||||
The example below shows how to define a vitamin and incorporate it into an assembly with sub-assemblies and make an exploded view. The resulting flat BOM is shown but
|
||||
heirachical BOMs are also generated for real projects.
|
||||
Assembly views shown in the instructions can be large or small and this is deduced by looking at the size of the printed parts involved and if any routed
|
||||
parts are used.
|
||||
This heuristic isn't always correct, so the default can be overridden by setting the ```big``` parameter of ```assembly``` to ```true``` or ```false```.
|
||||
|
||||
The example below shows how to define a vitamin and incorporate it into an assembly with sub-assemblies and make an exploded view.
|
||||
The resulting flat BOM is shown but heirachical BOMs are also generated for real projects.
|
||||
|
||||
|
||||
[utils/core/bom.scad](utils/core/bom.scad) Implementation.
|
||||
|
||||
[tests/bom.scad](tests/bom.scad) Code for this example.
|
||||
[tests/BOM.scad](tests/BOM.scad) Code for this example.
|
||||
|
||||
### Functions
|
||||
| Function | Description |
|
||||
@@ -5130,7 +5377,7 @@ heirachical BOMs are also generated for real projects.
|
||||
### Modules
|
||||
| Module | Description |
|
||||
|:--- |:--- |
|
||||
| ```assembly(name)``` | Name an assembly that will appear on the BOM, there needs to a module named ```<name>_assembly``` to make it |
|
||||
| ```assembly(name, big = undef)``` | Name an assembly that will appear on the BOM, there needs to a module named ```<name>_assembly``` to make it. ```big``` can force big or small assembly diagrams. |
|
||||
| ```dxf(name)``` | Name a dxf that will appear on the BOM, there needs to a module named ```<name>_dxf``` to make it |
|
||||
| ```explode(d, explode_children = false, offset = [0,0,0])``` | Explode children by specified Z distance or vector ```d```, option to explode grand children |
|
||||
| ```hidden()``` | Make item invisible, except on the BOM |
|
||||
@@ -5141,6 +5388,7 @@ heirachical BOMs are also generated for real projects.
|
||||
| ```pose_hflip(exploded = undef)``` | Pose an STL or assembly for rendering to png by flipping around the Y axis, ```exploded = true for``` just the exploded view or ```false``` for unexploded only. |
|
||||
| ```pose_vflip(exploded = undef)``` | Pose an STL or assembly for rendering to png by flipping around the X axis, ```exploded = true for``` just the exploded view or ```false``` for unexploded only. |
|
||||
| ```stl(name)``` | Name an stl that will appear on the BOM, there needs to a module named ```<name>_stl``` to make it |
|
||||
| ```stl_colour(colour = pp1_colour, alpha = 1)``` | Colour an stl where it is placed in an assembly. ```alpha``` can be used to make it appear transparent. |
|
||||
| ```vitamin(description)``` | Describe a vitamin for the BOM entry and precede it with a module call that creates it, eg. "wigit(42): Type 42 widget" |
|
||||
|
||||

|
||||
|
@@ -29,6 +29,7 @@ import openscad
|
||||
from time import *
|
||||
from set_config import *
|
||||
import json
|
||||
import re
|
||||
|
||||
def find_scad_file(mname):
|
||||
for filename in os.listdir(source_dir):
|
||||
@@ -45,9 +46,20 @@ def find_scad_file(mname):
|
||||
return filename
|
||||
return None
|
||||
|
||||
class Part:
|
||||
def __init__(self, args):
|
||||
self.count = 1
|
||||
for arg in args:
|
||||
arg = arg.replace('true', 'True').replace('false', 'False').replace('undef', 'None')
|
||||
exec('self.' + arg)
|
||||
|
||||
def data(self):
|
||||
return self.__dict__
|
||||
|
||||
class BOM:
|
||||
def __init__(self, name):
|
||||
self.name = name
|
||||
self.big = None
|
||||
self.count = 1
|
||||
self.vitamins = {}
|
||||
self.printed = {}
|
||||
@@ -60,14 +72,20 @@ class BOM:
|
||||
assemblies[ass] = self.assemblies[ass].count
|
||||
return {
|
||||
"name" : self.name,
|
||||
"big" : self.big,
|
||||
"count" : self.count,
|
||||
"assemblies" : assemblies,
|
||||
"vitamins" : self.vitamins,
|
||||
"printed" : self.printed,
|
||||
"routed" : self.routed
|
||||
"vitamins" : {v : self.vitamins[v].data() for v in self.vitamins},
|
||||
"printed" : {p : self.printed[p].data() for p in self.printed},
|
||||
"routed" : {r : self.routed[r].data() for r in self.routed}
|
||||
}
|
||||
|
||||
def add_part(self, s):
|
||||
args = []
|
||||
match = re.match(r'^(.*?\.stl|.*?\.dxf)\((.*)\)$', s) #look for name.stl(...) or name.dxf(...)
|
||||
if match:
|
||||
s = match.group(1)
|
||||
args = [match.group(2)]
|
||||
if s[-4:] == ".stl":
|
||||
parts = self.printed
|
||||
else:
|
||||
@@ -76,15 +94,19 @@ class BOM:
|
||||
else:
|
||||
parts = self.vitamins
|
||||
if s in parts:
|
||||
parts[s] += 1
|
||||
parts[s].count += 1
|
||||
else:
|
||||
parts[s] = 1
|
||||
parts[s] = Part(args)
|
||||
|
||||
def add_assembly(self, ass):
|
||||
def add_assembly(self, ass, args = []):
|
||||
if ass in self.assemblies:
|
||||
self.assemblies[ass].count += 1
|
||||
else:
|
||||
self.assemblies[ass] = BOM(ass)
|
||||
bom = BOM(ass)
|
||||
for arg in args:
|
||||
arg = arg.replace('true', 'True').replace('false', 'False').replace('undef', 'None')
|
||||
exec('bom.' + arg, locals())
|
||||
self.assemblies[ass] = bom
|
||||
|
||||
def make_name(self, ass):
|
||||
if self.count == 1:
|
||||
@@ -119,10 +141,10 @@ class BOM:
|
||||
for ass in sorted(self.assemblies):
|
||||
bom = self.assemblies[ass]
|
||||
if part in bom.vitamins:
|
||||
file.write("%2d|" % bom.vitamins[part])
|
||||
file.write("%2d|" % bom.vitamins[part].count)
|
||||
else:
|
||||
file.write(" |")
|
||||
print("%3d" % self.vitamins[part], description, file=file)
|
||||
print("%3d" % self.vitamins[part].count, description, file=file)
|
||||
|
||||
if self.printed:
|
||||
if self.vitamins:
|
||||
@@ -133,10 +155,10 @@ class BOM:
|
||||
for ass in sorted(self.assemblies):
|
||||
bom = self.assemblies[ass]
|
||||
if part in bom.printed:
|
||||
file.write("%2d|" % bom.printed[part])
|
||||
file.write("%2d|" % bom.printed[part].count)
|
||||
else:
|
||||
file.write(" |")
|
||||
print("%3d" % self.printed[part], part, file=file)
|
||||
print("%3d" % self.printed[part].count, part, file=file)
|
||||
|
||||
if self.routed:
|
||||
print(file=file)
|
||||
@@ -146,10 +168,10 @@ class BOM:
|
||||
for ass in sorted(self.assemblies):
|
||||
bom = self.assemblies[ass]
|
||||
if part in bom.routed:
|
||||
file.write("%2d|" % bom.routed[part])
|
||||
file.write("%2d|" % bom.routed[part].count)
|
||||
else:
|
||||
file.write(" |")
|
||||
print("%3d" % self.routed[part], part, file=file)
|
||||
print("%3d" % self.routed[part].count, part, file=file)
|
||||
|
||||
if self.assemblies:
|
||||
print(file=file)
|
||||
@@ -161,17 +183,22 @@ def parse_bom(file = "openscad.log", name = None):
|
||||
main = BOM(name)
|
||||
main.ordered_assemblies = []
|
||||
stack = []
|
||||
|
||||
prog = re.compile(r'^(.*)\((.*)\)$')
|
||||
for line in open(file):
|
||||
pos = line.find('ECHO: "~')
|
||||
if pos > -1:
|
||||
s = line[pos + 8 : line.rfind('"')]
|
||||
if s[-1] == '{':
|
||||
ass = s[:-1]
|
||||
args = []
|
||||
match = prog.match(ass) #look for (...)
|
||||
if match:
|
||||
ass = match.group(1)
|
||||
args = match.group(2).split(',')
|
||||
if stack:
|
||||
main.assemblies[stack[-1]].add_assembly(ass) #add to nested BOM
|
||||
stack.append(ass)
|
||||
main.add_assembly(ass) #add to flat BOM
|
||||
main.add_assembly(ass, args) #add to flat BOM
|
||||
if ass in main.ordered_assemblies:
|
||||
main.ordered_assemblies.remove(ass)
|
||||
main.ordered_assemblies.insert(0, ass)
|
||||
@@ -189,8 +216,12 @@ def parse_bom(file = "openscad.log", name = None):
|
||||
print(line[:-1])
|
||||
return main
|
||||
|
||||
def usage():
|
||||
print("\nusage:\n\tbom [target_config] [<accessory_name>_assembly] - Generate BOMs for a project or an accessory to a project.")
|
||||
sys.exit(1)
|
||||
|
||||
def boms(target = None, assembly = None):
|
||||
bom_dir = set_config(target) + "bom"
|
||||
bom_dir = set_config(target, usage) + "bom"
|
||||
if assembly:
|
||||
bom_dir += "/accessories"
|
||||
if not os.path.isdir(bom_dir):
|
||||
@@ -217,7 +248,7 @@ def boms(target = None, assembly = None):
|
||||
#
|
||||
# Run openscad
|
||||
#
|
||||
openscad.run("-D","$bom=2","-D","$preview=true","-o", "openscad.echo", bom_maker_name)
|
||||
openscad.run("-D", "$bom=2", "-D", "$preview=true", "--hardwarnings", "-o", "openscad.echo", "-d", bom_dir + "/bom.deps", bom_maker_name)
|
||||
os.remove(bom_maker_name)
|
||||
print("Generating bom ...", end=" ")
|
||||
|
||||
@@ -239,11 +270,24 @@ def boms(target = None, assembly = None):
|
||||
print("done")
|
||||
|
||||
if __name__ == '__main__':
|
||||
args = len(sys.argv)
|
||||
if args > 1:
|
||||
if args > 2:
|
||||
boms(sys.argv[1], sys.argv[2])
|
||||
else:
|
||||
boms(sys.argv[1])
|
||||
if len(sys.argv) > 3: usage()
|
||||
|
||||
if len(sys.argv) == 3:
|
||||
target, assembly = sys.argv[1], sys.argv[2]
|
||||
else:
|
||||
boms();
|
||||
if len(sys.argv) == 2:
|
||||
if sys.argv[1][-9:] == "_assembly":
|
||||
target, assembly = None, sys.argv[1]
|
||||
else:
|
||||
target, assembly = sys.argv[1], None
|
||||
else:
|
||||
target, assembly = None, None
|
||||
|
||||
if assembly:
|
||||
if assembly[-9:] != "_assembly": usage()
|
||||
|
||||
try:
|
||||
boms(target, assembly)
|
||||
except Exception as e:
|
||||
print(str(e))
|
||||
sys.exit(1)
|
||||
|
@@ -113,5 +113,5 @@ if __name__ == '__main__':
|
||||
if len(sys.argv) == 2:
|
||||
canonicalise(sys.argv[1])
|
||||
else:
|
||||
print("usage: c14n_stl file")
|
||||
print("\nusage:\n\t c14n_stl file - Canonicalise an STL file created by OpenSCAD.")
|
||||
sys.exit(1)
|
||||
|
@@ -17,6 +17,7 @@
|
||||
# If not, see <https://www.gnu.org/licenses/>.
|
||||
#
|
||||
import os
|
||||
from set_config import source_dir
|
||||
|
||||
def mtime(file):
|
||||
if os.path.isfile(file):
|
||||
@@ -32,7 +33,7 @@ def read_deps(dname):
|
||||
deps = []
|
||||
for line in lines:
|
||||
if line.startswith('\t'):
|
||||
dep = line[1 : -1].rstrip(' \\')
|
||||
dep = line[1 : -1].rstrip(' \\').replace('\\ ', ' ')
|
||||
if not os.path.basename(dep) in ['stl.scad', 'dxf.scad', 'svf.scad', 'png.scad', 'target.scad']:
|
||||
deps.append(dep)
|
||||
return deps
|
||||
@@ -48,3 +49,18 @@ def check_deps(target, dname):
|
||||
if mtime(dep) > target_mtime:
|
||||
return dep + ' changed'
|
||||
return None
|
||||
|
||||
def source_dirs(bom_dir):
|
||||
dirs = set()
|
||||
lib_dirs = set()
|
||||
deps = read_deps(bom_dir + '/bom.deps')
|
||||
cwd = os.getcwd().replace('\\', '/')
|
||||
for dep in deps:
|
||||
dir = os.path.dirname(dep)
|
||||
if dir.startswith(cwd):
|
||||
dirs.add(dir[len(cwd) + 1:])
|
||||
else:
|
||||
if dir.endswith('/printed'):
|
||||
lib_dirs.add(dir)
|
||||
dirs.remove(source_dir)
|
||||
return [source_dir] + sorted(dirs) + sorted(lib_dirs)
|
||||
|
@@ -26,6 +26,7 @@ from __future__ import print_function
|
||||
|
||||
import os
|
||||
from tests import do_cmd
|
||||
import argparse
|
||||
|
||||
dir = 'scripts'
|
||||
|
||||
@@ -74,4 +75,5 @@ They should work with both Python 2 and Python 3.
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
argparse.ArgumentParser(description='Generate scripts/readme.md and make html versions of that and doc/usage.md').parse_args()
|
||||
doc_scripts()
|
||||
|
@@ -30,14 +30,14 @@ import times
|
||||
from deps import *
|
||||
import json
|
||||
|
||||
def bom_to_parts(target_dir, part_type, assembly = None):
|
||||
def bom_to_parts(bom_dir, part_type, assembly = None):
|
||||
#
|
||||
# Make a list of all the parts in the BOM
|
||||
#
|
||||
part_files = []
|
||||
bom = assembly + '.txt' if assembly else "bom.txt"
|
||||
suffix = ".dxf" if part_type == 'svg' else '.' + part_type
|
||||
with open(target_dir + "/../bom/" + bom, "rt") as f:
|
||||
with open(bom_dir + '/' + bom, "rt") as f:
|
||||
for line in f.readlines():
|
||||
words = line.split()
|
||||
if words:
|
||||
@@ -46,13 +46,24 @@ def bom_to_parts(target_dir, part_type, assembly = None):
|
||||
part_files.append(last_word[:-4] + '.' + part_type)
|
||||
return part_files
|
||||
|
||||
def usage(t):
|
||||
print("\nusage:\n\t%ss [target_config] [<name1>.%s] ... [<nameN>.%s] - Generate specified %s files or all if none specified." % ( t, t, t, t.upper()))
|
||||
sys.exit(1)
|
||||
|
||||
def make_parts(target, part_type, parts = None):
|
||||
#
|
||||
# Check list of parts is the correct type
|
||||
#
|
||||
if parts:
|
||||
for p in parts:
|
||||
if not p.endswith('.' + part_type): usage(part_type)
|
||||
#
|
||||
# Make the target directory
|
||||
#
|
||||
top_dir = set_config(target)
|
||||
top_dir = set_config(target, lambda: usage(part_type))
|
||||
target_dir = top_dir + part_type + 's'
|
||||
deps_dir = top_dir + "deps"
|
||||
bom_dir = top_dir + "bom"
|
||||
if not os.path.isdir(target_dir):
|
||||
os.makedirs(target_dir)
|
||||
if not os.path.isdir(deps_dir):
|
||||
@@ -64,7 +75,7 @@ def make_parts(target, part_type, parts = None):
|
||||
if parts:
|
||||
targets = list(parts) #copy the list so we dont modify the list passed in
|
||||
else:
|
||||
targets = bom_to_parts(target_dir, part_type)
|
||||
targets = bom_to_parts(bom_dir, part_type)
|
||||
for file in os.listdir(target_dir):
|
||||
if file.endswith('.' + part_type):
|
||||
if not file in targets:
|
||||
@@ -83,12 +94,11 @@ def make_parts(target, part_type, parts = None):
|
||||
#
|
||||
# Find all the scad files
|
||||
#
|
||||
lib_dirs = [path + '/' + lib + '/printed' for path in os.environ['OPENSCADPATH'].split(os.pathsep) for lib in sorted(os.listdir(path))]
|
||||
module_suffix = '_dxf' if part_type == 'svg' else '_' + part_type
|
||||
for dir in [source_dir, source_dir + '/printed'] + lib_dirs:
|
||||
if os.path.isdir(dir):
|
||||
for dir in source_dirs(bom_dir):
|
||||
if targets and os.path.isdir(dir):
|
||||
for filename in os.listdir(dir):
|
||||
if filename[-5:] == ".scad":
|
||||
if targets and filename[-5:] == ".scad":
|
||||
#
|
||||
# find any modules ending in _<part_type>
|
||||
#
|
||||
@@ -138,9 +148,6 @@ def make_parts(target, part_type, parts = None):
|
||||
#
|
||||
if targets:
|
||||
for part in targets:
|
||||
if part[-4:] != '.' + part_type:
|
||||
print(part, "is not a", part_type, "file")
|
||||
else:
|
||||
print("Could not find a module called", part[:-4] + module_suffix, "to make", part)
|
||||
sys.exit(1)
|
||||
print("Could not find a module called", part[:-4] + module_suffix, "to make", part)
|
||||
usage(part_type)
|
||||
times.print_times()
|
||||
|
@@ -30,6 +30,7 @@ import re
|
||||
from shutil import copyfile
|
||||
from tests import update_image
|
||||
import sys
|
||||
import argparse
|
||||
|
||||
project_dirs = ['../..', 'examples']
|
||||
target_dir = 'gallery'
|
||||
@@ -39,7 +40,6 @@ def gallery(force):
|
||||
if not os.path.isdir(target_dir):
|
||||
os.makedirs(target_dir)
|
||||
|
||||
|
||||
paths = sorted([pdir + '/' + i for pdir in project_dirs for i in os.listdir(pdir) if os.path.isdir(pdir + '/' + i + '/assemblies')], key = lambda s: os.path.basename(s))
|
||||
with open(output_name, 'wt') as output_file:
|
||||
print("# A gallery of projects made with NopSCADlib", file = output_file)
|
||||
@@ -78,4 +78,8 @@ def gallery(force):
|
||||
|
||||
if __name__ == '__main__':
|
||||
init()
|
||||
gallery(force = len(sys.argv) > 1 and sys.argv[1] == '-f')
|
||||
parser = argparse.ArgumentParser(description='Creates a galley of projects by copying the top level image and description to gallery/readme.md.')
|
||||
parser.add_argument("-f", help = "run make_all in each project to force update", action="store_true")
|
||||
args = parser.parse_args()
|
||||
|
||||
gallery(force = args.f)
|
||||
|
@@ -27,9 +27,17 @@ from bom import boms
|
||||
from render import render
|
||||
from views import views
|
||||
from plateup import plateup
|
||||
from set_config import set_config
|
||||
|
||||
|
||||
def usage():
|
||||
print("\nusage:\n\tmake_all [target_config] - Make all the manufacturing files and readme for a project.")
|
||||
sys.exit(1)
|
||||
|
||||
if __name__ == '__main__':
|
||||
if len(sys.argv) > 2: usage()
|
||||
target = None if len(sys.argv) == 1 else sys.argv[1]
|
||||
set_config(target, usage)
|
||||
boms(target)
|
||||
for part in ['stl', 'dxf']:
|
||||
make_parts(target, part)
|
||||
|
@@ -25,9 +25,15 @@ import sys
|
||||
|
||||
from plateup import plateup
|
||||
|
||||
def usage():
|
||||
print("\nusage:\n\tpanels [target_config] - Aggregate DXF files for routing together.")
|
||||
sys.exit(1)
|
||||
|
||||
if __name__ == '__main__':
|
||||
if len(sys.argv) > 2: usage()
|
||||
|
||||
if len(sys.argv) > 1:
|
||||
target = sys.argv[1]
|
||||
else:
|
||||
target = None
|
||||
plateup(target, 'dxf')
|
||||
plateup(target, 'dxf', usage)
|
||||
|
@@ -31,11 +31,11 @@ from shutil import copyfile
|
||||
source_dirs = { "stl" : "platters", "dxf" : "panels" }
|
||||
target_dirs = { "stl" : "printed", "dxf" : "routed" }
|
||||
|
||||
def plateup(target, part_type):
|
||||
def plateup(target, part_type, usage = None):
|
||||
#
|
||||
# Make the target directory
|
||||
#
|
||||
top_dir = set_config(target)
|
||||
top_dir = set_config(target, usage)
|
||||
parts_dir = top_dir + part_type + 's'
|
||||
target_dir = parts_dir + '/' + target_dirs[part_type]
|
||||
source_dir = top_dir + source_dirs[part_type]
|
||||
|
@@ -25,9 +25,15 @@ import sys
|
||||
|
||||
from plateup import plateup
|
||||
|
||||
def usage():
|
||||
print("\nusage:\n\tplatters [target_config] - Aggregate STL files for printing together.")
|
||||
sys.exit(1)
|
||||
|
||||
if __name__ == '__main__':
|
||||
if len(sys.argv) > 2: usage()
|
||||
|
||||
if len(sys.argv) > 1:
|
||||
target = sys.argv[1]
|
||||
else:
|
||||
target = None
|
||||
plateup(target, 'stl')
|
||||
plateup(target, 'stl', usage)
|
||||
|
@@ -29,18 +29,39 @@ import openscad
|
||||
from tests import do_cmd, update_image, colour_scheme, background
|
||||
from deps import mtime
|
||||
from colorama import init
|
||||
import json
|
||||
|
||||
def usage():
|
||||
print("\nusage:\n\trender [target_config] - Render images of the stl and dxf files.");
|
||||
sys.exit(1)
|
||||
|
||||
def render(target, type):
|
||||
#
|
||||
# Make the target directory
|
||||
#
|
||||
target_dir = set_config(target) + type + 's'
|
||||
top_dir = set_config(target, usage)
|
||||
target_dir = top_dir + type + 's'
|
||||
bom_dir = top_dir + 'bom'
|
||||
if not os.path.isdir(target_dir):
|
||||
os.makedirs(target_dir)
|
||||
#
|
||||
# Find all the parts
|
||||
#
|
||||
parts = bom_to_parts(target_dir, type)
|
||||
parts = bom_to_parts(bom_dir, type)
|
||||
#
|
||||
# Read the json bom to get the colours
|
||||
#
|
||||
bom_file = bom_dir + "/bom.json"
|
||||
with open(bom_file) as json_file:
|
||||
flat_bom = json.load(json_file)
|
||||
|
||||
things = { 'stl' : 'printed', 'dxf' : 'routed' }[type]
|
||||
colours = {}
|
||||
for ass in flat_bom:
|
||||
for part in ass[things]:
|
||||
obj = ass[things][part]
|
||||
if "colour" in obj:
|
||||
colours[part] = obj["colour"]
|
||||
#
|
||||
# Remove unused png files
|
||||
#
|
||||
@@ -49,7 +70,9 @@ def render(target, type):
|
||||
if not file[:-4] + '.' + type in parts:
|
||||
print("Removing %s" % file)
|
||||
os.remove(target_dir + '/' + file)
|
||||
|
||||
#
|
||||
# Render the parts
|
||||
#
|
||||
for part in parts:
|
||||
part_file = target_dir + '/' + part
|
||||
png_name = target_dir + '/' + part[:-4] + '.png'
|
||||
@@ -58,10 +81,16 @@ def render(target, type):
|
||||
#
|
||||
if mtime(part_file) > mtime(png_name):
|
||||
png_maker_name = "png.scad"
|
||||
pp1 = [0, 146/255, 0]
|
||||
colour = pp1
|
||||
if part in colours:
|
||||
colour = colours[part]
|
||||
if not '[' in colour:
|
||||
colour = '"' + colour + '"'
|
||||
with open(png_maker_name, "w") as f:
|
||||
f.write('color([0, 146/255, 0]) import("%s");\n' % part_file)
|
||||
f.write('color(%s) import("%s");\n' % (colour, part_file))
|
||||
cam = "--camera=0,0,0,70,0,315,500" if type == 'stl' else "--camera=0,0,0,0,0,0,500"
|
||||
render = "--preview" if type == 'stl' else "--render"
|
||||
render = "--preview" if type == 'stl' or colour != pp1 else "--render"
|
||||
tmp_name = 'tmp.png'
|
||||
openscad.run(colour_scheme, "--projection=p", "--imgsize=4096,4096", cam, render, "--autocenter", "--viewall", "-o", tmp_name, png_maker_name);
|
||||
do_cmd(("magick "+ tmp_name + " -trim -resize 280x280 -background %s -gravity Center -extent 280x280 -bordercolor %s -border 10 %s"
|
||||
@@ -71,6 +100,7 @@ def render(target, type):
|
||||
|
||||
if __name__ == '__main__':
|
||||
init()
|
||||
if len(sys.argv) > 2: usage()
|
||||
target = sys.argv[1] if len(sys.argv) > 1 else None
|
||||
render(target, 'stl')
|
||||
render(target, 'dxf')
|
||||
|
@@ -45,20 +45,27 @@ def valid_targets_string():
|
||||
return result
|
||||
|
||||
|
||||
def set_config(target):
|
||||
def set_config(target, usage = None):
|
||||
if target and target[:1] == '-' and usage: usage()
|
||||
targets = valid_targets()
|
||||
if not target:
|
||||
if not targets:
|
||||
return ""
|
||||
print("Must specify a configuration: " + valid_targets_string())
|
||||
if usage:
|
||||
usage()
|
||||
sys.exit(1)
|
||||
|
||||
if not targets:
|
||||
print("Not a muli-configuration project (no config_<target>.scad files found)")
|
||||
if usage:
|
||||
usage()
|
||||
sys.exit(1)
|
||||
|
||||
if not target in targets:
|
||||
print(target + " is not a configuration, avaliable configurations are: " + valid_targets_string())
|
||||
if usage:
|
||||
usage()
|
||||
sys.exit(1)
|
||||
|
||||
fname = source_dir + "/target.scad"
|
||||
@@ -75,10 +82,13 @@ def set_config(target):
|
||||
f. write(text);
|
||||
return target + "/"
|
||||
|
||||
def usage():
|
||||
print("\nusage:\n\tset_config config_name")
|
||||
sys.exit(1)
|
||||
|
||||
if __name__ == '__main__':
|
||||
args = len(sys.argv)
|
||||
if args == 2:
|
||||
set_config(sys.argv[1])
|
||||
set_config(sys.argv[1], usage)
|
||||
else:
|
||||
print("usage: set_config config_name")
|
||||
sys.exit(1)
|
||||
usage()
|
||||
|
@@ -85,6 +85,10 @@ def depluralise(name):
|
||||
def is_plural(name):
|
||||
return name != depluralise(name)
|
||||
|
||||
def usage():
|
||||
print("\nusage:\n\ttests [test_name1] ... [test_nameN] - Run specified tests or all tests in none specified.");
|
||||
sys.exit(1)
|
||||
|
||||
def tests(tests):
|
||||
scad_dir = "tests"
|
||||
deps_dir = scad_dir + "/deps"
|
||||
@@ -96,6 +100,7 @@ def tests(tests):
|
||||
doc_name = "readme.md"
|
||||
index = {}
|
||||
bodies = {}
|
||||
done = []
|
||||
times.read_times()
|
||||
options.check_options(deps_dir)
|
||||
#
|
||||
@@ -109,13 +114,15 @@ def tests(tests):
|
||||
#
|
||||
# List of individual part files
|
||||
#
|
||||
scads = [i for i in sorted(os.listdir(scad_dir)) if i[-5:] == ".scad"]
|
||||
scads = [i for i in sorted(os.listdir(scad_dir), key = lambda s: s.lower()) if i[-5:] == ".scad"]
|
||||
|
||||
for scad in scads:
|
||||
base_name = scad[:-5]
|
||||
if not tests or base_name in tests:
|
||||
done.append(base_name)
|
||||
print(base_name)
|
||||
cap_name = base_name[0].capitalize() + base_name[1:]
|
||||
base_name = base_name.lower()
|
||||
scad_name = scad_dir + '/' + scad
|
||||
png_name = png_dir + '/' + base_name + '.png'
|
||||
bom_name = bom_dir + '/' + base_name + '.json'
|
||||
@@ -140,11 +147,14 @@ def tests(tests):
|
||||
print("Can't find implementation!")
|
||||
continue
|
||||
|
||||
vsplit = "M"
|
||||
vsplit = "AJR" + chr(ord('Z') + 1)
|
||||
vtype = locations[0][1]
|
||||
types = [vtype + ' A-' + vsplit[0], vtype + ' ' + chr(ord(vsplit) + 1) + '-Z'] + [loc[1] for loc in locations[1 :]]
|
||||
types = [vtype + ' ' + vsplit[i] + '-' + chr(ord(vsplit[i + 1]) - 1) for i in range(len(vsplit) - 1)] + [loc[1] for loc in locations[1 :]]
|
||||
if type == vtype:
|
||||
type = types[0] if cap_name[0] <= vsplit else types[1]
|
||||
for i in range(1, len(vsplit)):
|
||||
if cap_name[0] < vsplit[i]:
|
||||
type = types[i - 1]
|
||||
break
|
||||
|
||||
for t in types:
|
||||
if not t in bodies:
|
||||
@@ -188,7 +198,7 @@ def tests(tests):
|
||||
|
||||
body += ["\n" %(base_name, png_name)]
|
||||
|
||||
dname = deps_name(deps_dir, scad)
|
||||
dname = deps_name(deps_dir, scad.lower())
|
||||
oldest = png_name if mtime(png_name) < mtime(bom_name) else bom_name
|
||||
changed = check_deps(oldest, dname)
|
||||
changed = times.check_have_time(changed, scad_name)
|
||||
@@ -222,14 +232,23 @@ def tests(tests):
|
||||
j = name.find(']]') + 2
|
||||
name = name.replace(name[i : j], '[ ... ]')
|
||||
desc = vit[1]
|
||||
body += ['| %3d | %s | %s |' % (things[item], name, desc)]
|
||||
body += ['| %3d | %s | %s |' % (things[item]["count"], name, desc)]
|
||||
else:
|
||||
body += ['| %3d | %s |' % (things[item], name)]
|
||||
count = things[item] if thing == 'assemblies' else things[item]["count"]
|
||||
body += ['| %3d | %s |' % (count, name)]
|
||||
body += ['']
|
||||
|
||||
body += ['\n<a href="#top">Top</a>']
|
||||
body += ["\n---"]
|
||||
|
||||
for test in done:
|
||||
if test in tests:
|
||||
tests.remove(test)
|
||||
if tests:
|
||||
for test in tests:
|
||||
print(Fore.MAGENTA + "Could not find a test called", test, Fore.WHITE)
|
||||
usage()
|
||||
|
||||
with open(doc_name, "wt") as doc_file:
|
||||
print('# NopSCADlib', file = doc_file)
|
||||
print('''\
|
||||
@@ -275,4 +294,6 @@ See [usage](docs/usage.md) for requirements, installation instructions and a usa
|
||||
do_cmd('codespell -L od readme.md'.split())
|
||||
|
||||
if __name__ == '__main__':
|
||||
for arg in sys.argv[1:]:
|
||||
if arg[:1] == '-': usage()
|
||||
tests(sys.argv[1:])
|
||||
|
@@ -48,6 +48,8 @@ def check_have_time(changed, name):
|
||||
return changed
|
||||
|
||||
def add_time(name, start):
|
||||
if name.lower() in times:
|
||||
del times[name.lower()]
|
||||
times[name] = round(time.time() - start, 3)
|
||||
|
||||
def print_times():
|
||||
|
@@ -52,22 +52,23 @@ def bom_to_assemblies(bom_dir, bounds_map):
|
||||
# Decide if we need big or small assembly pictures
|
||||
#
|
||||
for bom in flat_bom:
|
||||
big = False
|
||||
for ass in bom["assemblies"]:
|
||||
for b in flat_bom:
|
||||
if b["name"] == ass:
|
||||
if b["big"]:
|
||||
if bom["big"] == None:
|
||||
big = False
|
||||
for ass in bom["assemblies"]:
|
||||
for b in flat_bom:
|
||||
if b["name"] == ass:
|
||||
if b["big"]:
|
||||
big = True
|
||||
break
|
||||
if not big:
|
||||
for stl in bom["printed"]:
|
||||
bounds = bounds_map[stl]
|
||||
width = bounds[1][0] - bounds[0][0]
|
||||
depth = bounds[1][1] - bounds[0][1]
|
||||
if max(width, depth) > 80:
|
||||
big = True
|
||||
break
|
||||
if not big:
|
||||
for stl in bom["printed"]:
|
||||
bounds = bounds_map[stl]
|
||||
width = bounds[1][0] - bounds[0][0]
|
||||
depth = bounds[1][1] - bounds[0][1]
|
||||
if max(width, depth) > 80:
|
||||
big = True
|
||||
break
|
||||
bom["big"] = big or bom["routed"]
|
||||
break
|
||||
bom["big"] = big or bom["routed"]
|
||||
#
|
||||
# Remove the main assembly if it is a shell
|
||||
#
|
||||
@@ -89,12 +90,24 @@ def eop(print_mode, doc_file, last = False, first = False):
|
||||
def pad(s, before, after = 0):
|
||||
return ' ' * 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):
|
||||
done_assemblies = []
|
||||
#
|
||||
# Make the target directory
|
||||
#
|
||||
top_dir = set_config(target)
|
||||
top_dir = set_config(target, usage)
|
||||
target_dir = top_dir + 'assemblies'
|
||||
deps_dir = top_dir + "deps"
|
||||
bom_dir = top_dir + "bom"
|
||||
@@ -109,9 +122,10 @@ def views(target, do_assemblies = None):
|
||||
with open(bounds_fname) as json_file:
|
||||
bounds_map = json.load(json_file)
|
||||
#
|
||||
# Find all the assemblies
|
||||
# Find all the assemblies and remove any old views
|
||||
#
|
||||
assemblies = bom_to_assemblies(bom_dir, bounds_map)
|
||||
lc_assemblies = [ass.lower() for ass in assemblies]
|
||||
for file in os.listdir(target_dir):
|
||||
if file.endswith('.png'):
|
||||
assembly = file[:-4].replace('_assembled', '_assembly')
|
||||
@@ -124,8 +138,7 @@ def views(target, do_assemblies = None):
|
||||
# Find all the scad files
|
||||
#
|
||||
main_blurb = None
|
||||
lib_dirs = [path + '/' + lib + '/printed' for path in os.environ['OPENSCADPATH'].split(os.pathsep) for lib in sorted(os.listdir(path))]
|
||||
for dir in [source_dir, source_dir + '/printed'] + lib_dirs:
|
||||
for dir in source_dirs(bom_dir):
|
||||
if os.path.isdir(dir):
|
||||
for filename in os.listdir(dir):
|
||||
if filename.endswith('.scad'):
|
||||
@@ -140,22 +153,24 @@ def views(target, do_assemblies = None):
|
||||
if len(words) and words[0] == "module":
|
||||
module = words[1].split('(')[0]
|
||||
if is_assembly(module):
|
||||
if module in assemblies:
|
||||
lc_module = module.lower()
|
||||
if lc_module in lc_assemblies:
|
||||
real_name = assemblies[lc_assemblies.index(lc_module)]
|
||||
#
|
||||
# Scrape the assembly instructions
|
||||
#
|
||||
for ass in flat_bom:
|
||||
if ass["name"] == module:
|
||||
if ass["name"] == real_name:
|
||||
if not "blurb" in ass:
|
||||
ass["blurb"] = blurb.scrape_module_blurb(lines[:line_no])
|
||||
break
|
||||
if not do_assemblies or module in do_assemblies:
|
||||
if not do_assemblies or real_name in do_assemblies:
|
||||
#
|
||||
# Run openscad on the created file
|
||||
#
|
||||
dname = deps_name(deps_dir, filename)
|
||||
for explode in [0, 1]:
|
||||
png_name = target_dir + '/' + module + '.png'
|
||||
png_name = target_dir + '/' + real_name + '.png'
|
||||
if not explode:
|
||||
png_name = png_name.replace('_assembly', '_assembled')
|
||||
changed = check_deps(png_name, dname)
|
||||
@@ -181,7 +196,7 @@ def views(target, do_assemblies = None):
|
||||
if mtime(png_name) > mtime(tn_name):
|
||||
do_cmd(("magick "+ png_name + " -trim -resize 280x280 -background " + background + " -gravity Center -extent 280x280 -bordercolor " + background + " -border 10 " + tmp_name).split())
|
||||
update_image(tmp_name, tn_name)
|
||||
done_assemblies.append(module)
|
||||
done_assemblies.append(real_name)
|
||||
else:
|
||||
if module == 'main_assembly':
|
||||
main_blurb = blurb.scrape_module_blurb(lines[:line_no])
|
||||
@@ -216,7 +231,7 @@ def views(target, do_assemblies = None):
|
||||
print('1. [Parts list](#Parts_list)', file = doc_file)
|
||||
for ass in flat_bom:
|
||||
name = ass["name"]
|
||||
cap_name = name.replace('_', ' ').title()
|
||||
cap_name = titalise(name)
|
||||
print('1. [%s](#%s)' % (cap_name, name), file = doc_file)
|
||||
print(file = doc_file)
|
||||
eop(print_mode, doc_file)
|
||||
@@ -233,11 +248,11 @@ def views(target, do_assemblies = None):
|
||||
for t in types:
|
||||
for thing in ass[t]:
|
||||
if thing in things[t]:
|
||||
things[t][thing] += ass[t][thing]
|
||||
things[t][thing] += ass[t][thing]["count"]
|
||||
else:
|
||||
things[t][thing] = ass[t][thing]
|
||||
things[t][thing] = ass[t][thing]["count"]
|
||||
for ass in flat_bom:
|
||||
name = ass["name"][:-9].replace('_', ' ').title().replace(' ',' ')
|
||||
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;">TOTALS</span> | |', file = doc_file)
|
||||
|
||||
@@ -250,7 +265,7 @@ def views(target, do_assemblies = None):
|
||||
print(('| ' * len(flat_bom) + '| | **%s** |') % heading, file = doc_file)
|
||||
for thing in sorted(things[t], key = lambda s: s.split(":")[-1]):
|
||||
for ass in flat_bom:
|
||||
count = ass[t][thing] if thing in ass[t] else 0
|
||||
count = ass[t][thing]["count"] if thing in ass[t] else 0
|
||||
print('| %s ' % pad(count if count else '.', 2, 1), file = doc_file, end = '')
|
||||
name = ass["name"]
|
||||
if name in totals:
|
||||
@@ -274,7 +289,7 @@ def views(target, do_assemblies = None):
|
||||
#
|
||||
for ass in flat_bom:
|
||||
name = ass["name"]
|
||||
cap_name = name.replace('_', ' ').title()
|
||||
cap_name = titalise(name)
|
||||
|
||||
if ass["count"] > 1:
|
||||
print('<a name="%s"></a>\n## %d x %s' % (name, ass["count"], cap_name), file = doc_file)
|
||||
@@ -286,7 +301,7 @@ def views(target, do_assemblies = None):
|
||||
print("|Qty|Description|", file = doc_file)
|
||||
print("|---:|:----------|", file = doc_file)
|
||||
for v in sorted(vitamins, key = lambda s: s.split(":")[-1]):
|
||||
print("|%d|%s|" % (vitamins[v], v.split(":")[1]), file = doc_file)
|
||||
print("|%d|%s|" % (vitamins[v]["count"], v.split(":")[1]), file = doc_file)
|
||||
print("\n", file = doc_file)
|
||||
|
||||
printed = ass["printed"]
|
||||
@@ -295,7 +310,7 @@ def views(target, do_assemblies = None):
|
||||
keys = sorted(list(printed.keys()))
|
||||
for i in range(len(keys)):
|
||||
p = keys[i]
|
||||
print('%s %d x %s |' % ('\n|' if not (i % 3) else '', printed[p], p), file = doc_file, end = '')
|
||||
print('%s %d x %s |' % ('\n|' if not (i % 3) else '', printed[p]["count"], p), file = doc_file, end = '')
|
||||
if (i % 3) == 2 or i == len(printed) - 1:
|
||||
n = (i % 3) + 1
|
||||
print('\n|%s' % ('---|' * n), file = doc_file)
|
||||
@@ -311,7 +326,7 @@ def views(target, do_assemblies = None):
|
||||
keys = sorted(list(routed.keys()))
|
||||
for i in range(len(keys)):
|
||||
r = keys[i]
|
||||
print('%s %d x %s |' % ('\n|' if not (i % 3) else '', routed[r], r), file = doc_file, end = '')
|
||||
print('%s %d x %s |' % ('\n|' if not (i % 3) else '', routed[r]["count"], r), file = doc_file, end = '')
|
||||
if (i % 3) == 2 or i == len(routed) - 1:
|
||||
n = (i % 3) + 1
|
||||
print('\n|%s' % ('---|' * n), file = doc_file)
|
||||
@@ -385,4 +400,7 @@ if __name__ == '__main__':
|
||||
else:
|
||||
target, assemblies = None, sys.argv[1:]
|
||||
|
||||
for a in assemblies:
|
||||
if a[-9:] != "_assembly": usage()
|
||||
|
||||
views(target, assemblies)
|
||||
|
@@ -67,7 +67,7 @@ module widgit_dxf() {
|
||||
//! * Push the insert into the base with a soldering iron heated to 200°C
|
||||
module widgit_base_assembly()
|
||||
assembly("widgit_base") {
|
||||
color(pp1_colour)
|
||||
stl_colour(pp1_colour)
|
||||
widgit_stl();
|
||||
|
||||
translate_z(height)
|
30
tests/DIP.scad
Normal file
@@ -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();
|
133
tests/PCB.scad
Normal file
@@ -0,0 +1,133 @@
|
||||
//
|
||||
// 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, 140, 180, "usb_uA"],
|
||||
[ 8, 155, 180, "usb_B"],
|
||||
[ 8.5, 125, 180, "molex_usb_Ax2"],
|
||||
[ 25, 200, 0, "buzzer", 4.5, 8.5],
|
||||
[ 25, 218, 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);
|
@@ -21,11 +21,16 @@ include <../vitamins/pcbs.scad>
|
||||
|
||||
use <../utils/layout.scad>
|
||||
|
||||
module pcbs()
|
||||
module pcbs() {
|
||||
layout([for(p = pcbs) pcb_width(p)], 10)
|
||||
translate([0, pcb_length(pcbs[$i]) / 2])
|
||||
rotate(90)
|
||||
pcb_assembly(pcbs[$i], 5 + $i, 3);
|
||||
|
||||
translate([0, 120])
|
||||
layout([for(p = perfboards) pcb_length(p)], 10)
|
||||
translate([0, -pcb_width(perfboards[$i]) / 2])
|
||||
pcb_assembly(perfboards[$i], 5 + $i, 3);
|
||||
}
|
||||
if($preview)
|
||||
pcbs();
|
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();
|
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();
|
@@ -22,14 +22,14 @@ use <../printed/cable_grommets.scad>
|
||||
|
||||
module cable_grommets() {
|
||||
rotate(90)
|
||||
color(pp1_colour) ribbon_grommet(20, 3);
|
||||
stl_colour(pp1_colour) ribbon_grommet(20, 3);
|
||||
|
||||
translate([20, 0])
|
||||
round_grommet_assembly(6, 3);
|
||||
|
||||
translate([40, 0])
|
||||
rotate(90)
|
||||
color(pp1_colour) mouse_grommet(5, 3);
|
||||
stl_colour(pp1_colour) mouse_grommet(5, 3);
|
||||
}
|
||||
|
||||
if($preview)
|
||||
|
@@ -19,7 +19,16 @@
|
||||
include <../utils/core/core.scad>
|
||||
use <../printed/carriers.scad>
|
||||
|
||||
module carriers()
|
||||
color(pp1_colour) ESP12F_carrier_stl();
|
||||
module carriers() {
|
||||
stl_colour(pp1_colour) ESP12F_carrier_stl();
|
||||
|
||||
translate([0, 15])
|
||||
rotate(90)
|
||||
stl_colour(pp1_colour) TP4056_carrier_stl();
|
||||
|
||||
translate([0, 25])
|
||||
rotate(90)
|
||||
stl_colour(pp1_colour) MT3608_carrier_stl();
|
||||
}
|
||||
|
||||
carriers();
|
||||
|
40
tests/circlips.scad
Normal file
@@ -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);
|
@@ -26,14 +26,13 @@ module resistors()
|
||||
resistor(resistors[$i]);
|
||||
|
||||
module al_clad_resistors()
|
||||
layout([for(a = al_clad_resistors) al_clad_width(a)])
|
||||
layout([for(a = al_clad_resistors) al_clad_width(a)], 5, true)
|
||||
rotate(90)
|
||||
al_clad_resistor_assembly(al_clad_resistors[$i], 4.7)
|
||||
screw(al_clad_hole(al_clad_resistors[$i]) > 3 ? M3_pan_screw : M2p5_pan_screw, 16);
|
||||
|
||||
|
||||
module thermal_cutouts()
|
||||
layout([for(t = thermal_cutouts) tc_length(t)])
|
||||
layout([for(t = thermal_cutouts) tc_length(t)], 5, true)
|
||||
thermal_cutout(thermal_cutouts[$i]);
|
||||
|
||||
module components() {
|
||||
@@ -42,7 +41,7 @@ module components() {
|
||||
translate([0, 50])
|
||||
TO220("Generic TO220 package");
|
||||
|
||||
translate([30, 50])
|
||||
translate([50, 50])
|
||||
panel_USBA();
|
||||
|
||||
translate([0,80])
|
||||
|
@@ -20,7 +20,7 @@ include <../global_defs.scad>
|
||||
use <../utils/dogbones.scad>
|
||||
|
||||
module dogbones() {
|
||||
#linear_extrude(height = eps)
|
||||
#linear_extrude(eps)
|
||||
dogbone_square([10, 20]);
|
||||
|
||||
#translate([15, 0])
|
||||
|
@@ -24,6 +24,6 @@ use <../utils/layout.scad>
|
||||
|
||||
module fan_guards()
|
||||
layout([for(f = fans) fan_width(f)], 10)
|
||||
color(pp1_colour) fan_guard(fans[$i], spokes = fan_width(fans[$i]) > 60 ? 8 : 4);
|
||||
stl_colour(pp1_colour) fan_guard(fans[$i], spokes = fan_width(fans[$i]) > 60 ? 8 : 4);
|
||||
|
||||
fan_guards();
|
||||
|
@@ -24,4 +24,5 @@ module fuseholders()
|
||||
fuseholder(6);
|
||||
|
||||
if($preview)
|
||||
fuseholders();
|
||||
let($show_threads = 1)
|
||||
fuseholders();
|
||||
|
@@ -20,7 +20,7 @@
|
||||
include <../utils/core/core.scad>
|
||||
|
||||
module globals() {
|
||||
linear_extrude(height = eps) {
|
||||
linear_extrude(eps) {
|
||||
semi_circle(r = 10);
|
||||
|
||||
translate([30, 0])
|
||||
|
@@ -27,7 +27,7 @@ module inserts() {
|
||||
translate([10 * i, 0])
|
||||
insert(inserts[i]);
|
||||
|
||||
color(pp1_colour)
|
||||
stl_colour(pp1_colour)
|
||||
translate([len(inserts) * 10, 0]) {
|
||||
insert_lug(inserts[0], 2, 1);
|
||||
|
||||
|
@@ -32,4 +32,5 @@ module jacks() {
|
||||
}
|
||||
|
||||
if($preview)
|
||||
jacks();
|
||||
let($show_threads = true)
|
||||
jacks();
|
||||
|
@@ -22,7 +22,7 @@ use <../utils/layout.scad>
|
||||
diams = [3, 7, 5, 11];
|
||||
|
||||
module layouts() {
|
||||
linear_extrude(height = eps)
|
||||
linear_extrude(eps)
|
||||
layout(diams, gap = 1)
|
||||
circle(d = diams[$i]);
|
||||
}
|
||||
|
@@ -29,7 +29,7 @@ module light_strips()
|
||||
for(end = [-1, 1])
|
||||
translate([end * (light_strip_cut_length(light, segs) / 2 - d / 2), 0])
|
||||
rotate([90, 0, 90])
|
||||
color(pp1_colour) render()
|
||||
stl_colour(pp1_colour) render()
|
||||
translate_z(-d / 2)
|
||||
light_strip_clip(light);
|
||||
}
|
||||
|
@@ -61,6 +61,19 @@ module nuts() {
|
||||
if(n == M4_nut)
|
||||
sliding_t_nut(M4_hammer_nut);
|
||||
}
|
||||
|
||||
translate([0, 100]) {
|
||||
if(n == M3_nut)
|
||||
nut_square(M3nS_thin_nut);
|
||||
if(n == M4_nut)
|
||||
nut_square(M4nS_thin_nut);
|
||||
if(n == M5_nut)
|
||||
nut_square(M5nS_thin_nut);
|
||||
if(n == M6_nut)
|
||||
nut_square(M6nS_thin_nut);
|
||||
if(n == M8_nut)
|
||||
nut_square(M8nS_thin_nut);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
109
tests/pcb.scad
@@ -1,109 +0,0 @@
|
||||
//
|
||||
// NopSCADlib Copyright Chris Palmer 2020
|
||||
// nop.head@gmail.com
|
||||
// hydraraptor.blogspot.com
|
||||
//
|
||||
// This file is part of NopSCADlib.
|
||||
//
|
||||
// NopSCADlib is free software: you can redistribute it and/or modify it under the terms of the
|
||||
// GNU General Public License as published by the Free Software Foundation, either version 3 of
|
||||
// the License, or (at your option) any later version.
|
||||
//
|
||||
// NopSCADlib is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
||||
// without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
// See the GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
||||
// If not, see <https://www.gnu.org/licenses/>.
|
||||
//
|
||||
include <../core.scad>
|
||||
include <../vitamins/microswitches.scad>
|
||||
include <../vitamins/d_connectors.scad>
|
||||
|
||||
use <../vitamins/pcb.scad>
|
||||
|
||||
gt_5x17 = ["gt_5x17", 5, 10, 17, 5, 11, 0.4, 9, 2,1.5, 1, 3, 6, 0, 0, 0];
|
||||
gt_5x11 = ["gt_5x11", 5, 8, 11, 5, 7, 0.4, 7, 1.5,1.5, 1,2.5, 6, 0, 0, 0];
|
||||
|
||||
TMC2130HeatSinkColor = "DeepSkyBlue";
|
||||
TMC2130 = ["TMC2130", "TMC2130",
|
||||
20, 14, 1.6, 0, 3, 0, "white", false, [],
|
||||
[
|
||||
[ 10, 1, 0, "-2p54header", 8, 1 ,undef, "blue" ],
|
||||
[ 10, 13, 0, "-2p54header", 8, 1],
|
||||
[ 12, 7, 0, "-chip", 6, 4, 1, grey20 ],
|
||||
// mock up a heat sink
|
||||
[ 10, 7, 0, "block", 9, 9, 2, TMC2130HeatSinkColor ],
|
||||
[ 10, 11, 0, "block", 9, 1, 11, TMC2130HeatSinkColor ],
|
||||
[ 10, 9, 0, "block", 9, 1, 11, TMC2130HeatSinkColor ],
|
||||
[ 10, 7, 0, "block", 9, 1, 11, TMC2130HeatSinkColor ],
|
||||
[ 10, 5, 0, "block", 9, 1, 11, TMC2130HeatSinkColor ],
|
||||
[ 10, 3, 0, "block", 9, 1, 11, TMC2130HeatSinkColor ],
|
||||
],
|
||||
[]
|
||||
];
|
||||
|
||||
test_pcb = ["TestPCB", "Test PCB",
|
||||
50, 500, 1.6, // length, width, thickness
|
||||
3, // Corner radius
|
||||
2.75, // Mounting hole diameter
|
||||
6, // Pad around mounting hole
|
||||
"green",// Color
|
||||
false, // True if the parts should be separate BOM items
|
||||
// hole offsets
|
||||
[ [3, 3], [3, -3], [-3, 3], [-3, -3] ],
|
||||
// components
|
||||
[
|
||||
[ 10, 10, 0, "2p54header", 4, 1],
|
||||
[ 25, 10, 0, "2p54header", 5, 1, undef, "blue" ],
|
||||
[ 10, 20, 0, "2p54boxhdr", 4, 2],
|
||||
[ 10, 30, 0, "2p54socket", 6, 1],
|
||||
[ 25, 30, 0, "2p54socket", 4, 1, undef, undef, undef, "red" ],
|
||||
[ 10, 40, 0, "chip", 10, 5, 1, grey20],
|
||||
[ 10, 60, 180, "rj45"],
|
||||
[ 8, 80, 180, "usb_A"],
|
||||
[ 8, 100, 180, "usb_Ax2"],
|
||||
[ 3, 120, 180, "usb_uA"],
|
||||
[ 8, 140, 180, "usb_B"],
|
||||
[ 10, 160, 0, "buzzer"],
|
||||
[ 25, 160, 0, "buzzer", 4.5, 8.5],
|
||||
[ 10, 175, 0, "potentiometer"],
|
||||
[ 30, 175, 0, "potentiometer", 7, 8],
|
||||
[ 8, 190, 180, "jack"],
|
||||
[ 6, 200, 180, "barrel_jack"],
|
||||
[ 5, 220, 180, "hdmi"],
|
||||
[ 3, 240, 180, "mini_hdmi"],
|
||||
[ 10, 250, 0, "flex"],
|
||||
[ 10, 265, 0, "flat_flex"],
|
||||
[ 10, 280, 0, "D_plug", DCONN9],
|
||||
[ 10, 300, 0, "molex_hdr", 2],
|
||||
[ 10, 310, 0, "jst_xh", 2],
|
||||
[ 10, 320, 180, "term254", 3],
|
||||
[ 20, 320, 180, "term254", 3, undef, grey20],
|
||||
[ 10, 340, 180, "gterm35", 4, [1,2]],
|
||||
[ 20, 340, 180, "gterm35", 4, [1,2], "red"],
|
||||
[ 30, 340, 180, "gterm", gt_5x11, 3],
|
||||
[ 10, 360, 180, "gterm635", 2],
|
||||
[ 25, 360, 180, "gterm635", 2, undef, "blue"],
|
||||
[ 40, 360, 180, "gterm", gt_5x17, 2, undef, grey20],
|
||||
[ 40, 340, 180, "gterm", gt_5x17, 3, [1], "red"],
|
||||
[ 10, 380, 180, "term35", 4],
|
||||
[ 20, 380, 180, "term35", 3, "lime"],
|
||||
[ 10, 400, 0, "transition", 5],
|
||||
[ 10, 410, 0, "block", 10, 5, 8, "orange"],
|
||||
[ 10, 420, 0, "button_6mm"],
|
||||
[ 10, 435, 0, "microswitch", small_microswitch],
|
||||
[ 12, 450, 0, "pcb", 11, TMC2130 ],
|
||||
[ 12, 456, 0, "2p54socket", 8, 1 ],
|
||||
[ 12, 444, 0, "2p54socket", 8, 1, undef, undef, undef, "red" ],
|
||||
[ 10, 470, 0, "standoff", 5, 4.5, 12.5, 2.54],
|
||||
[ 6, 480, 180, "uSD", [12, 11.5, 1.4]],
|
||||
],
|
||||
// accessories
|
||||
[]
|
||||
];
|
||||
|
||||
|
||||
if($preview)
|
||||
let($show_threads = true)
|
||||
pcb(test_pcb);
|
BIN
tests/png/axial.png
Normal file
After Width: | Height: | Size: 251 KiB |
BIN
tests/png/axials.png
Normal file
After Width: | Height: | Size: 282 KiB |
Before Width: | Height: | Size: 86 KiB After Width: | Height: | Size: 98 KiB |
Before Width: | Height: | Size: 41 KiB After Width: | Height: | Size: 54 KiB |
BIN
tests/png/circlips.png
Normal file
After Width: | Height: | Size: 51 KiB |
Before Width: | Height: | Size: 101 KiB After Width: | Height: | Size: 101 KiB |
BIN
tests/png/dip.png
Normal file
After Width: | Height: | Size: 61 KiB |
Before Width: | Height: | Size: 118 KiB After Width: | Height: | Size: 118 KiB |
Before Width: | Height: | Size: 117 KiB After Width: | Height: | Size: 117 KiB |
Before Width: | Height: | Size: 91 KiB After Width: | Height: | Size: 95 KiB |
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 26 KiB |
Before Width: | Height: | Size: 64 KiB After Width: | Height: | Size: 82 KiB |
Before Width: | Height: | Size: 61 KiB After Width: | Height: | Size: 80 KiB |
Before Width: | Height: | Size: 84 KiB After Width: | Height: | Size: 85 KiB |
Before Width: | Height: | Size: 75 KiB After Width: | Height: | Size: 79 KiB |