Compare commits
62 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
9a4cc7ec42 | ||
|
2fb1185edf | ||
|
a782d43e67 | ||
|
ae934d47c7 | ||
|
823f3b936e | ||
|
3027b942a6 | ||
|
749a1f0648 | ||
|
5c898df217 | ||
|
7a566cc856 | ||
|
20d799a3c1 | ||
|
2ee95bba65 | ||
|
f49bb63266 | ||
|
258109811b | ||
|
b39fd536c2 | ||
|
a5a87d260d | ||
|
b09efb10e0 | ||
|
53acaac379 | ||
|
9b40e0dcef | ||
|
00ca412441 | ||
|
1e6d7f5dd6 | ||
|
ec07d95657 | ||
|
0dab0dca08 | ||
|
6e6cd45295 | ||
|
3a7fde6c56 | ||
|
c5bb898856 | ||
|
11ebe2225d | ||
|
a1e25bb878 | ||
|
9689683b7e | ||
|
08946e3d70 | ||
|
15c2946e91 | ||
|
34019196cd | ||
|
436fc71cf3 | ||
|
fd67c166f7 | ||
|
634deab911 | ||
|
e2feceb608 | ||
|
d1258e0b0c | ||
|
bd61a1dc55 | ||
|
055e83902f | ||
|
feec1e7ae5 | ||
|
be76af2fc4 | ||
|
9c1a9bf357 | ||
|
9647fb474b | ||
|
49fdfea792 | ||
|
ac0bacfeda | ||
|
6288059d99 | ||
|
0f1dff230a | ||
|
e379fa8ada | ||
|
313d7508df | ||
|
083caca4e8 | ||
|
49329df00c | ||
|
edc0b86bb1 | ||
|
5fbff060b0 | ||
|
b94ca4ad3a | ||
|
bc5515d35e | ||
|
44d213deaa | ||
|
145c5d9b1a | ||
|
7abbbd9b96 | ||
|
5b160cee88 | ||
|
3f31607840 | ||
|
1efed649cf | ||
|
b70c2f993c | ||
|
56e252f3dc |
82
CHANGELOG.md
@@ -3,6 +3,88 @@
|
|||||||
This changelog is generated by `changelog.py` using manually added semantic version tags to classify commits as breaking changes, additions or fixes.
|
This changelog is generated by `changelog.py` using manually added semantic version tags to classify commits as breaking changes, additions or fixes.
|
||||||
|
|
||||||
|
|
||||||
|
### [v15.16.0](https://github.com/nophead/NopSCADlib/releases/tag/v15.16.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v15.15.0...v15.16.0 "diff with v15.15.0")
|
||||||
|
* 2021-06-04 [`a782d43`](https://github.com/nophead/NopSCADlib/commit/a782d43e67f4091f44bd9018817e7263e2944477 "show commit") [C.P.](# "Chris Palmer") `bom.py` now generates `bom.csv` to allow costed BOMs to be made using a spreadsheet.
|
||||||
|
|
||||||
|
### [v15.15.0](https://github.com/nophead/NopSCADlib/releases/tag/v15.15.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v15.14.2...v15.15.0 "diff with v15.14.2")
|
||||||
|
* 2021-06-03 [`823f3b9`](https://github.com/nophead/NopSCADlib/commit/823f3b936e6c33897445d3f3272b69237f013537 "show commit") [C.P.](# "Chris Palmer") Add the ability to have a target specific top level module in place of `main_assembly()`.
|
||||||
|
|
||||||
|
#### [v15.14.2](https://github.com/nophead/NopSCADlib/releases/tag/v15.14.2 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v15.14.1...v15.14.2 "diff with v15.14.1")
|
||||||
|
* 2021-06-02 [`749a1f0`](https://github.com/nophead/NopSCADlib/commit/749a1f0648196bd0ae47dbe93ac1b5e3a06d78cd "show commit") [C.P.](# "Chris Palmer") Fixed male thread z-fighting bug.
|
||||||
|
|
||||||
|
* 2021-06-01 [`5c898df`](https://github.com/nophead/NopSCADlib/commit/5c898df2172a7e202c9e3d8c6641a0aaf95e5d48 "show commit") [C.P.](# "Chris Palmer") More readable code in `rounded_polygon`.
|
||||||
|
|
||||||
|
#### [v15.14.1](https://github.com/nophead/NopSCADlib/releases/tag/v15.14.1 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v15.14.0...v15.14.1 "diff with v15.14.0")
|
||||||
|
* 2021-06-01 [`20d799a`](https://github.com/nophead/NopSCADlib/commit/20d799a3c115d3d32f101c4419d6e9b57c3be8c7 "show commit") [C.P.](# "Chris Palmer") `IEC_320_C14_switched_fused_inlet` now shows the correct object name in the example.
|
||||||
|
|
||||||
|
### [v15.14.0](https://github.com/nophead/NopSCADlib/releases/tag/v15.14.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v15.13.4...v15.14.0 "diff with v15.13.4")
|
||||||
|
* 2021-05-31 [`2581098`](https://github.com/nophead/NopSCADlib/commit/258109811b7b7f71895340dc4b86b96d7dbc2037 "show commit") [C.P.](# "Chris Palmer") Added uppercase version of `BLCD_motors.scad`.
|
||||||
|
|
||||||
|
* 2021-05-31 [`b39fd53`](https://github.com/nophead/NopSCADlib/commit/b39fd536c2841a95ab50b8a196e21ee8fc5976d1 "show commit") [C.P.](# "Chris Palmer") Removed lower case version of `bldc_motors.scad`.
|
||||||
|
|
||||||
|
* 2021-05-31 [`a5a87d2`](https://github.com/nophead/NopSCADlib/commit/a5a87d260dd4bbe40a8727a4099207271918d02b "show commit") [C.P.](# "Chris Palmer") Updated images and readme.
|
||||||
|
|
||||||
|
* 2021-05-30 [`00ca412`](https://github.com/nophead/NopSCADlib/commit/00ca412441c85ea1fd7082453c823445fbbdce4e "show commit") [M.B.](# "Martin Budden") Added BLDC3548 motor.
|
||||||
|
|
||||||
|
* 2021-05-30 [`1e6d7f5`](https://github.com/nophead/NopSCADlib/commit/1e6d7f5dd68e64181aef019bb8bca186abb2ac68 "show commit") [M.B.](# "Martin Budden") Brushless DC motors.
|
||||||
|
|
||||||
|
#### [v15.13.4](https://github.com/nophead/NopSCADlib/releases/tag/v15.13.4 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v15.13.3...v15.13.4 "diff with v15.13.3")
|
||||||
|
* 2021-05-30 [`ec07d95`](https://github.com/nophead/NopSCADlib/commit/ec07d95657d52aab375b3b2acb95c87b369d2194 "show commit") [M.B.](# "Martin Budden") Added assertion to check colour format in module thread.
|
||||||
|
|
||||||
|
#### [v15.13.3](https://github.com/nophead/NopSCADlib/releases/tag/v15.13.3 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v15.13.2...v15.13.3 "diff with v15.13.2")
|
||||||
|
* 2021-05-19 [`0dab0dc`](https://github.com/nophead/NopSCADlib/commit/0dab0dca08485d1717ee516a61831fcd6963e335 "show commit") [C.P.](# "Chris Palmer") Added missing includes `core.scad` which generates warnings with latest OpenSCAD snapshots.
|
||||||
|
|
||||||
|
* Note, however, NopSCADlib does not work with the current OpenSCAD snapshot.
|
||||||
|
|
||||||
|
#### [v15.13.2](https://github.com/nophead/NopSCADlib/releases/tag/v15.13.2 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v15.13.1...v15.13.2 "diff with v15.13.1")
|
||||||
|
* 2021-05-15 [`9689683`](https://github.com/nophead/NopSCADlib/commit/9689683b7efbde882c057a903dd7fa018107d029 "show commit") [M.B.](# "Martin Budden") Typo in `global_defs`.
|
||||||
|
|
||||||
|
#### [v15.13.1](https://github.com/nophead/NopSCADlib/releases/tag/v15.13.1 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v15.13.0...v15.13.1 "diff with v15.13.0")
|
||||||
|
* 2021-05-18 [`11ebe22`](https://github.com/nophead/NopSCADlib/commit/11ebe2225db09bdd45089e4ebf5c1037243bf45c "show commit") [C.P.](# "Chris Palmer") Removed spurious convexity in difference from `rounded_polygon()`.
|
||||||
|
|
||||||
|
### [v15.13.0](https://github.com/nophead/NopSCADlib/releases/tag/v15.13.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v15.12.0...v15.13.0 "diff with v15.12.0")
|
||||||
|
* 2021-05-02 [`3401919`](https://github.com/nophead/NopSCADlib/commit/34019196cdac6b08e57d773e138a22394b609ea5 "show commit") [C.P.](# "Chris Palmer") Updated readme
|
||||||
|
|
||||||
|
* 2021-05-02 [`436fc71`](https://github.com/nophead/NopSCADlib/commit/436fc71cf319c1e71b6cbd240b76d7cad5ecd8ba "show commit") [M.B.](# "Martin Budden") Added `blower_size` function.
|
||||||
|
|
||||||
|
### [v15.12.0](https://github.com/nophead/NopSCADlib/releases/tag/v15.12.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v15.11.1...v15.12.0 "diff with v15.11.1")
|
||||||
|
* 2021-04-26 [`e2feceb`](https://github.com/nophead/NopSCADlib/commit/e2feceb608b4491424c0e4c1e7c191f7d8aeceec "show commit") [C.P.](# "Chris Palmer") Updated readme
|
||||||
|
|
||||||
|
* 2021-04-25 [`9c1a9bf`](https://github.com/nophead/NopSCADlib/commit/9c1a9bf3572c07a57b5bd1fde1d9a4aba14e5ea8 "show commit") [M.B.](# "Martin Budden") Add facility to orient `core_xy` with left motor being lower or upper motor.
|
||||||
|
|
||||||
|
#### [v15.11.1](https://github.com/nophead/NopSCADlib/releases/tag/v15.11.1 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v15.11.0...v15.11.1 "diff with v15.11.0")
|
||||||
|
* 2021-04-25 [`feec1e7`](https://github.com/nophead/NopSCADlib/commit/feec1e7ae5a5217586e0ab9e7b002e8af8f7c749 "show commit") [C.P.](# "Chris Palmer") Updated readme.
|
||||||
|
|
||||||
|
* 2021-04-25 [`be76af2`](https://github.com/nophead/NopSCADlib/commit/be76af2fc490e10e4dd115a56019e33005f87db9 "show commit") [M.B.](# "Martin Budden") Fixed typo in `leadnut.scad`.
|
||||||
|
|
||||||
|
### [v15.11.0](https://github.com/nophead/NopSCADlib/releases/tag/v15.11.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v15.10.1...v15.11.0 "diff with v15.10.1")
|
||||||
|
* 2021-04-25 [`49fdfea`](https://github.com/nophead/NopSCADlib/commit/49fdfea7926d677b6e0a9eee2fbd928f2935e1eb "show commit") [C.P.](# "Chris Palmer") Added 35BYGHJ75 geared stepper.
|
||||||
|
|
||||||
|
#### [v15.10.1](https://github.com/nophead/NopSCADlib/releases/tag/v15.10.1 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v15.10.0...v15.10.1 "diff with v15.10.0")
|
||||||
|
* 2021-04-25 [`ac0bacf`](https://github.com/nophead/NopSCADlib/commit/ac0bacfeda43af62256e7bd3184df695b3e01d37 "show commit") [C.P.](# "Chris Palmer") Removed echo in rails test.
|
||||||
|
|
||||||
|
### [v15.10.0](https://github.com/nophead/NopSCADlib/releases/tag/v15.10.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v15.9.0...v15.10.0 "diff with v15.9.0")
|
||||||
|
* 2021-04-13 [`e379fa8`](https://github.com/nophead/NopSCADlib/commit/e379fa8ada4a4089fc24ce5fc2c140a2531e2e95 "show commit") [C.P.](# "Chris Palmer") Updated readme.
|
||||||
|
|
||||||
|
* 2021-04-13 [`5fbff06`](https://github.com/nophead/NopSCADlib/commit/5fbff060b019a983eba93eb8c5b16adfb6a3f7ee "show commit") [M.B.](# "Martin Budden") Added a `pcb_component` function.
|
||||||
|
|
||||||
|
### [v15.9.0](https://github.com/nophead/NopSCADlib/releases/tag/v15.9.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v15.8.0...v15.9.0 "diff with v15.8.0")
|
||||||
|
* 2021-04-13 [`edc0b86`](https://github.com/nophead/NopSCADlib/commit/edc0b86bb1cd52e90fe353c4aea9539e95aa5aee "show commit") [C.P.](# "Chris Palmer") Updated images and readme.
|
||||||
|
|
||||||
|
* 2021-03-31 [`b70c2f9`](https://github.com/nophead/NopSCADlib/commit/b70c2f993c351bf71da57cfc169ed02a235cf4f3 "show commit") [M.B.](# "Martin Budden") Added box sections.
|
||||||
|
|
||||||
|
### [v15.8.0](https://github.com/nophead/NopSCADlib/releases/tag/v15.8.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v15.7.0...v15.8.0 "diff with v15.7.0")
|
||||||
|
* 2021-04-12 [`145c5d9`](https://github.com/nophead/NopSCADlib/commit/145c5d9b1a7c873940abf266a321edabdff3b7a0 "show commit") [C.P.](# "Chris Palmer") Updated readme.
|
||||||
|
|
||||||
|
* 2021-04-12 [`1efed64`](https://github.com/nophead/NopSCADlib/commit/1efed649cf54607b9d39d4b7f422dd385ccb441f "show commit") [M.B.](# "Martin Budden") Added PSU size function.
|
||||||
|
|
||||||
|
### [v15.7.0](https://github.com/nophead/NopSCADlib/releases/tag/v15.7.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v15.6.1...v15.7.0 "diff with v15.6.1")
|
||||||
|
* 2021-04-12 [`3f31607`](https://github.com/nophead/NopSCADlib/commit/3f31607840d162f63d12eb2317d2f28af1ecf492 "show commit") [C.P.](# "Chris Palmer") Added No8 screws.
|
||||||
|
|
||||||
|
#### [v15.6.1](https://github.com/nophead/NopSCADlib/releases/tag/v15.6.1 "show release") Fixes [...](https://github.com/nophead/NopSCADlib/compare/v15.6.0...v15.6.1 "diff with v15.6.0")
|
||||||
|
* 2021-04-05 [`f12b36e`](https://github.com/nophead/NopSCADlib/commit/f12b36ea046b5a784dd81b3c4e95eaf4cf24a58d "show commit") [C.P.](# "Chris Palmer") Corrected MGN12 rail end value.
|
||||||
|
Added assert for rail end value too big.
|
||||||
|
|
||||||
### [v15.6.0](https://github.com/nophead/NopSCADlib/releases/tag/v15.6.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v15.5.0...v15.6.0 "diff with v15.5.0")
|
### [v15.6.0](https://github.com/nophead/NopSCADlib/releases/tag/v15.6.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v15.5.0...v15.6.0 "diff with v15.5.0")
|
||||||
* 2021-04-03 [`51cc2fd`](https://github.com/nophead/NopSCADlib/commit/51cc2fd6791065e1c94c761abf7dac0271e6ab28 "show commit") [C.P.](# "Chris Palmer") Carriages now appear on the BOM and both variants are shown in the rail test.
|
* 2021-04-03 [`51cc2fd`](https://github.com/nophead/NopSCADlib/commit/51cc2fd6791065e1c94c761abf7dac0271e6ab28 "show commit") [C.P.](# "Chris Palmer") Carriages now appear on the BOM and both variants are shown in the rail test.
|
||||||
|
|
||||||
|
@@ -270,6 +270,22 @@ The target config file is selected by generating `target.scad` that includes `co
|
|||||||
The rest of the project includes `target.scad` to use the configuration.
|
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>`.
|
Additionally all the generated file directories (assemblies, bom, stls, dxfs, etc.) are placed in a sub-directory called `<target_name>`.
|
||||||
|
|
||||||
|
The build system will look for a `<target_name>_assembly` module and use it as the top level module instead of `main_assembly` if it it exists.
|
||||||
|
That allows the project description to be target specific if the top level modules are in different scad files.
|
||||||
|
The top level assembly instructions and assembly contents could also be different if appropriate.
|
||||||
|
|
||||||
|
If the top level module is just a shell wrapper that simply includes one other assembly, with no additional parts, then it is removed from the build instructions and
|
||||||
|
the assembly it calls becomes the top level. This allows a different project description for each target but only one set of top level instructions without repeating them.
|
||||||
|
|
||||||
|
### Costed BOMs
|
||||||
|
|
||||||
|
A costed bill of materials can be made by opening the generated file `bom/bom.csv` in a spreadsheet program using a single quote as the string delimiter and comma as the field separator.
|
||||||
|
That gets a list of part descriptions and quantities to which prices can be added to get the total cost and perhaps a URL of where to buy each part.
|
||||||
|
|
||||||
|
If a Python file called `parts.py` is found then `bom.py` will attempt to call functions for each part to get a price and URL.
|
||||||
|
Any functions not found are printed, so you can see the format expected.
|
||||||
|
The function are passed the quantity to allow them to calculate volume discounts, etc.
|
||||||
|
|
||||||
### Other libraries
|
### 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
|
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
|
||||||
|
Before Width: | Height: | Size: 138 KiB After Width: | Height: | Size: 137 KiB |
16
examples/MainsBreakOutBox/bom/bom.csv
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
'Ferrule for 1.5mm^2 wire - not shown', 3
|
||||||
|
'Wire blue 30/0.25mm strands, length 150mm - not shown', 2
|
||||||
|
'Wire brown 30/0.25mm strands, length 150mm - not shown', 2
|
||||||
|
'Wire green & yellow 30/0.25mm strands, length 150mm - not shown', 2
|
||||||
|
'IEC inlet for ATX', 1
|
||||||
|
'Heatfit insert M3', 2
|
||||||
|
'4mm shielded jack socket blue', 2
|
||||||
|
'4mm shielded jack socket brown', 1
|
||||||
|
'4mm shielded jack socket green', 2
|
||||||
|
'Mains socket 13A', 1
|
||||||
|
'Nut M3 x 2.4mm nyloc', 6
|
||||||
|
'Screw M3 cs cap x 12mm', 2
|
||||||
|
'Screw M3 cs cap x 20mm', 2
|
||||||
|
'Screw M3 dome x 10mm', 4
|
||||||
|
'Heatshrink sleeving ID 3.2mm x 15mm - not shown', 8
|
||||||
|
'Washer M3 x 7mm x 0.5mm', 10
|
|
@@ -27,15 +27,16 @@
|
|||||||
// Setting $_bom in the local file overrides it in the local file but not in the libs.
|
// Setting $_bom in the local file overrides it in the local file but not in the libs.
|
||||||
//
|
//
|
||||||
rr_green = [0, 146/255, 0]; // RepRap logo colour
|
rr_green = [0, 146/255, 0]; // RepRap logo colour
|
||||||
|
crimson = [220/255, 20/255, 60/255];
|
||||||
|
|
||||||
$_bom = is_undef($bom) ? 0 : $bom; // 0 no bom, 1 assemblies and stls, 2 vitamins as well
|
$_bom = is_undef($bom) ? 0 : $bom; // 0 no bom, 1 assemblies and stls, 2 vitamins as well
|
||||||
$exploded = is_undef($explode) ? 0 : $explode; // 1 for exploded view
|
$exploded = is_undef($explode) ? 0 : $explode; // 1 for exploded view
|
||||||
layer_height = is_undef($layer_height) ? 0.25 : $layer_height; // layer heigth when printing
|
layer_height = is_undef($layer_height) ? 0.25 : $layer_height; // layer height when printing
|
||||||
extrusion_width = is_undef($extrusion_width) ? 0.5 : $extrusion_width; // filament width when printing
|
extrusion_width = is_undef($extrusion_width) ? 0.5 : $extrusion_width; // filament width when printing
|
||||||
nozzle = is_undef($nozzle) ? 0.45 : $nozzle; // 3D printer nozzle
|
nozzle = is_undef($nozzle) ? 0.45 : $nozzle; // 3D printer nozzle
|
||||||
cnc_bit_r = is_undef($cnc_bit_r) ? 1.2 : $cnc_bit_r; // minimum tool radius when milling 2D objects
|
cnc_bit_r = is_undef($cnc_bit_r) ? 1.2 : $cnc_bit_r; // minimum tool radius when milling 2D objects
|
||||||
pp1_colour = is_undef($pp1_colour) ? rr_green : $pp1_colour; // printed part colour 1, RepRap logo colour
|
pp1_colour = is_undef($pp1_colour) ? rr_green : $pp1_colour; // printed part colour 1, RepRap logo colour
|
||||||
pp2_colour = is_undef($pp2_colour) ? "Crimson" : $pp2_colour; // printed part colour 2
|
pp2_colour = is_undef($pp2_colour) ? crimson : $pp2_colour; // printed part colour 2
|
||||||
pp3_colour = is_undef($pp3_colour) ? "SteelBlue" : $pp3_colour; // printed part colour 3
|
pp3_colour = is_undef($pp3_colour) ? "SteelBlue" : $pp3_colour; // printed part colour 3
|
||||||
pp4_colour = is_undef($pp4_colour) ? "darkorange" : $pp4_colour;// printed part colour 4
|
pp4_colour = is_undef($pp4_colour) ? "darkorange" : $pp4_colour;// printed part colour 4
|
||||||
show_rays = is_undef($show_rays) ? false : $show_rays; // show camera sight lines and light direction
|
show_rays = is_undef($show_rays) ? false : $show_rays; // show camera sight lines and light direction
|
||||||
|
2
lib.scad
@@ -28,6 +28,8 @@ include <vitamins/pcbs.scad>
|
|||||||
include <vitamins/batteries.scad>
|
include <vitamins/batteries.scad>
|
||||||
include <vitamins/bearing_blocks.scad>
|
include <vitamins/bearing_blocks.scad>
|
||||||
include <vitamins/blowers.scad>
|
include <vitamins/blowers.scad>
|
||||||
|
include <vitamins/bldc_motors.scad>
|
||||||
|
include <vitamins/box_sections.scad>
|
||||||
include <vitamins/bulldogs.scad>
|
include <vitamins/bulldogs.scad>
|
||||||
include <vitamins/buttons.scad>
|
include <vitamins/buttons.scad>
|
||||||
include <vitamins/cameras.scad>
|
include <vitamins/cameras.scad>
|
||||||
|
BIN
libtest.png
Before Width: | Height: | Size: 889 KiB After Width: | Height: | Size: 908 KiB |
16
libtest.scad
@@ -45,7 +45,9 @@ use <tests/ball_bearings.scad>
|
|||||||
use <tests/batteries.scad>
|
use <tests/batteries.scad>
|
||||||
use <tests/bearing_blocks.scad>
|
use <tests/bearing_blocks.scad>
|
||||||
use <tests/belts.scad>
|
use <tests/belts.scad>
|
||||||
|
use <tests/BLDC_motors.scad>
|
||||||
use <tests/blowers.scad>
|
use <tests/blowers.scad>
|
||||||
|
use <tests/box_sections.scad>
|
||||||
use <tests/bulldogs.scad>
|
use <tests/bulldogs.scad>
|
||||||
use <tests/buttons.scad>
|
use <tests/buttons.scad>
|
||||||
use <tests/cable_strips.scad>
|
use <tests/cable_strips.scad>
|
||||||
@@ -368,10 +370,10 @@ extrusions_y = panel_meters_y + 80;
|
|||||||
translate([x3, veroboard_y])
|
translate([x3, veroboard_y])
|
||||||
veroboard_test();
|
veroboard_test();
|
||||||
|
|
||||||
translate([x3 + 70, veroboard_y + 30])
|
translate([x3 + 60, veroboard_y + 20])
|
||||||
geared_steppers();
|
geared_steppers();
|
||||||
|
|
||||||
translate([x3 + 140, veroboard_y + 20])
|
translate([x3 + 160, ssrs_y])
|
||||||
pcb_mounts();
|
pcb_mounts();
|
||||||
|
|
||||||
translate([x3 + 170, veroboard_y + 16])
|
translate([x3 + 170, veroboard_y + 16])
|
||||||
@@ -426,6 +428,9 @@ extrusion_brackets_y = rails_y + 250;
|
|||||||
sk_brackets_y = extrusion_brackets_y + 80;
|
sk_brackets_y = extrusion_brackets_y + 80;
|
||||||
kp_pillow_blocks_y = sk_brackets_y + 50;
|
kp_pillow_blocks_y = sk_brackets_y + 50;
|
||||||
scs_bearing_blocks_y = kp_pillow_blocks_y + 60;
|
scs_bearing_blocks_y = kp_pillow_blocks_y + 60;
|
||||||
|
cable_strip_y = fans_y + 50;
|
||||||
|
box_sections_y = cable_strip_y;
|
||||||
|
BLDC_y = sheets_y;
|
||||||
|
|
||||||
translate([x4 + 200, belts_y + 58]) {
|
translate([x4 + 200, belts_y + 58]) {
|
||||||
belt_test();
|
belt_test();
|
||||||
@@ -441,7 +446,7 @@ translate([x4 + 175, belts_y, -20])
|
|||||||
translate([x4, rails_y + 130])
|
translate([x4, rails_y + 130])
|
||||||
rails();
|
rails();
|
||||||
|
|
||||||
translate([770, fans_y + 50])
|
translate([770, cable_strip_y])
|
||||||
cable_strips();
|
cable_strips();
|
||||||
|
|
||||||
translate([x4, kp_pillow_blocks_y])
|
translate([x4, kp_pillow_blocks_y])
|
||||||
@@ -459,6 +464,11 @@ translate([x4 + 120, extrusion_brackets_y])
|
|||||||
translate([x4, scs_bearing_blocks_y])
|
translate([x4, scs_bearing_blocks_y])
|
||||||
scs_bearing_blocks();
|
scs_bearing_blocks();
|
||||||
|
|
||||||
|
translate([x4, BLDC_y])
|
||||||
|
bldc_motors();
|
||||||
|
|
||||||
|
translate([x6, box_sections_y])
|
||||||
|
box_sections();
|
||||||
|
|
||||||
translate([x6, 125])
|
translate([x6, 125])
|
||||||
light_strips();
|
light_strips();
|
||||||
|
199
readme.md
@@ -20,32 +20,32 @@ A list of changes classified as breaking, additions or fixes is maintained in [C
|
|||||||
|
|
||||||
## Table of Contents<a name="top"/>
|
## Table of Contents<a name="top"/>
|
||||||
<table><tr>
|
<table><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>
|
<th align="left"> Vitamins A-H </th><th align="left"> Vitamins I-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 = "#Axials">Axials</a> </td><td> <a href = "#IECs">IECs</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 = "#LDRs">LDRs</a> </td><td> <a href = "#Ring_terminals">Ring_terminals</a> </td><td> <a href = "#Butt_box">Butt_box</a> </td><td> <a href = "#Bezier">Bezier</a> </td><td> <a href = "#Clip">Clip</a> </td></tr>
|
<tr><td> <a href = "#BLDC_motors">BLDC_motors</a> </td><td> <a href = "#Inserts">Inserts</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 = "#LED_meters">LED_meters</a> </td><td> <a href = "#Rockers">Rockers</a> </td><td> <a href = "#Cable_grommets">Cable_grommets</a> </td><td> <a href = "#Catenary">Catenary</a> </td><td> <a href = "#Global">Global</a> </td></tr>
|
<tr><td> <a href = "#Ball_bearings">Ball_bearings</a> </td><td> <a href = "#Jack">Jack</a> </td><td> <a href = "#Rockers">Rockers</a> </td><td> <a href = "#Cable_grommets">Cable_grommets</a> </td><td> <a href = "#Catenary">Catenary</a> </td><td> <a href = "#Global">Global</a> </td></tr>
|
||||||
<tr><td> <a href = "#Bearing_blocks">Bearing_blocks</a> </td><td> <a href = "#LEDs">LEDs</a> </td><td> <a href = "#Rod">Rod</a> </td><td> <a href = "#Camera_housing">Camera_housing</a> </td><td> <a href = "#Core_xy">Core_xy</a> </td><td> <a href = "#Polyholes">Polyholes</a> </td></tr>
|
<tr><td> <a href = "#Batteries">Batteries</a> </td><td> <a href = "#LDRs">LDRs</a> </td><td> <a href = "#Rod">Rod</a> </td><td> <a href = "#Camera_housing">Camera_housing</a> </td><td> <a href = "#Core_xy">Core_xy</a> </td><td> <a href = "#Polyholes">Polyholes</a> </td></tr>
|
||||||
<tr><td> <a href = "#Belts">Belts</a> </td><td> <a href = "#Leadnuts">Leadnuts</a> </td><td> <a href = "#SK_brackets">SK_brackets</a> </td><td> <a href = "#Carriers">Carriers</a> </td><td> <a href = "#Dogbones">Dogbones</a> </td><td> <a href = "#Rounded_rectangle">Rounded_rectangle</a> </td></tr>
|
<tr><td> <a href = "#Bearing_blocks">Bearing_blocks</a> </td><td> <a href = "#LED_meters">LED_meters</a> </td><td> <a href = "#SK_brackets">SK_brackets</a> </td><td> <a href = "#Carriers">Carriers</a> </td><td> <a href = "#Dogbones">Dogbones</a> </td><td> <a href = "#Rounded_rectangle">Rounded_rectangle</a> </td></tr>
|
||||||
<tr><td> <a href = "#Blowers">Blowers</a> </td><td> <a href = "#Light_strips">Light_strips</a> </td><td> <a href = "#SMDs">SMDs</a> </td><td> <a href = "#Corner_block">Corner_block</a> </td><td> <a href = "#Fillet">Fillet</a> </td><td> <a href = "#Sphere">Sphere</a> </td></tr>
|
<tr><td> <a href = "#Belts">Belts</a> </td><td> <a href = "#LEDs">LEDs</a> </td><td> <a href = "#SMDs">SMDs</a> </td><td> <a href = "#Corner_block">Corner_block</a> </td><td> <a href = "#Fillet">Fillet</a> </td><td> <a href = "#Sphere">Sphere</a> </td></tr>
|
||||||
<tr><td> <a href = "#Bulldogs">Bulldogs</a> </td><td> <a href = "#Linear_bearings">Linear_bearings</a> </td><td> <a href = "#SSRs">SSRs</a> </td><td> <a href = "#Door_hinge">Door_hinge</a> </td><td> <a href = "#Gears">Gears</a> </td><td> <a href = "#Teardrops">Teardrops</a> </td></tr>
|
<tr><td> <a href = "#Blowers">Blowers</a> </td><td> <a href = "#Leadnuts">Leadnuts</a> </td><td> <a href = "#SSRs">SSRs</a> </td><td> <a href = "#Door_hinge">Door_hinge</a> </td><td> <a href = "#Gears">Gears</a> </td><td> <a href = "#Teardrops">Teardrops</a> </td></tr>
|
||||||
<tr><td> <a href = "#Buttons">Buttons</a> </td><td> <a href = "#Magnets">Magnets</a> </td><td> <a href = "#Screws">Screws</a> </td><td> <a href = "#Door_latch">Door_latch</a> </td><td> <a href = "#Hanging_hole">Hanging_hole</a> </td><td></td></tr>
|
<tr><td> <a href = "#Box_sections">Box_sections</a> </td><td> <a href = "#Light_strips">Light_strips</a> </td><td> <a href = "#Screws">Screws</a> </td><td> <a href = "#Door_latch">Door_latch</a> </td><td> <a href = "#Hanging_hole">Hanging_hole</a> </td><td></td></tr>
|
||||||
<tr><td> <a href = "#Cable_strips">Cable_strips</a> </td><td> <a href = "#Mains_sockets">Mains_sockets</a> </td><td> <a href = "#Sealing_strip">Sealing_strip</a> </td><td> <a href = "#Drag_chain">Drag_chain</a> </td><td> <a href = "#Horiholes">Horiholes</a> </td><td></td></tr>
|
<tr><td> <a href = "#Bulldogs">Bulldogs</a> </td><td> <a href = "#Linear_bearings">Linear_bearings</a> </td><td> <a href = "#Sealing_strip">Sealing_strip</a> </td><td> <a href = "#Drag_chain">Drag_chain</a> </td><td> <a href = "#Horiholes">Horiholes</a> </td><td></td></tr>
|
||||||
<tr><td> <a href = "#Cameras">Cameras</a> </td><td> <a href = "#Microswitches">Microswitches</a> </td><td> <a href = "#Shaft_couplings">Shaft_couplings</a> </td><td> <a href = "#Fan_guard">Fan_guard</a> </td><td> <a href = "#Layout">Layout</a> </td><td></td></tr>
|
<tr><td> <a href = "#Buttons">Buttons</a> </td><td> <a href = "#Magnets">Magnets</a> </td><td> <a href = "#Shaft_couplings">Shaft_couplings</a> </td><td> <a href = "#Fan_guard">Fan_guard</a> </td><td> <a href = "#Layout">Layout</a> </td><td></td></tr>
|
||||||
<tr><td> <a href = "#Circlips">Circlips</a> </td><td> <a href = "#Microview">Microview</a> </td><td> <a href = "#Sheets">Sheets</a> </td><td> <a href = "#Fixing_block">Fixing_block</a> </td><td> <a href = "#Maths">Maths</a> </td><td></td></tr>
|
<tr><td> <a href = "#Cable_strips">Cable_strips</a> </td><td> <a href = "#Mains_sockets">Mains_sockets</a> </td><td> <a href = "#Sheets">Sheets</a> </td><td> <a href = "#Fixing_block">Fixing_block</a> </td><td> <a href = "#Maths">Maths</a> </td><td></td></tr>
|
||||||
<tr><td> <a href = "#Components">Components</a> </td><td> <a href = "#Modules">Modules</a> </td><td> <a href = "#Spades">Spades</a> </td><td> <a href = "#Flat_hinge">Flat_hinge</a> </td><td> <a href = "#Offset">Offset</a> </td><td></td></tr>
|
<tr><td> <a href = "#Cameras">Cameras</a> </td><td> <a href = "#Microswitches">Microswitches</a> </td><td> <a href = "#Spades">Spades</a> </td><td> <a href = "#Flat_hinge">Flat_hinge</a> </td><td> <a href = "#Offset">Offset</a> </td><td></td></tr>
|
||||||
<tr><td> <a href = "#DIP">DIP</a> </td><td> <a href = "#Nuts">Nuts</a> </td><td> <a href = "#Spools">Spools</a> </td><td> <a href = "#Foot">Foot</a> </td><td> <a href = "#Quadrant">Quadrant</a> </td><td></td></tr>
|
<tr><td> <a href = "#Circlips">Circlips</a> </td><td> <a href = "#Microview">Microview</a> </td><td> <a href = "#Spools">Spools</a> </td><td> <a href = "#Foot">Foot</a> </td><td> <a href = "#Quadrant">Quadrant</a> </td><td></td></tr>
|
||||||
<tr><td> <a href = "#D_connectors">D_connectors</a> </td><td> <a href = "#O_ring">O_ring</a> </td><td> <a href = "#Springs">Springs</a> </td><td> <a href = "#Handle">Handle</a> </td><td> <a href = "#Round">Round</a> </td><td></td></tr>
|
<tr><td> <a href = "#Components">Components</a> </td><td> <a href = "#Modules">Modules</a> </td><td> <a href = "#Springs">Springs</a> </td><td> <a href = "#Handle">Handle</a> </td><td> <a href = "#Round">Round</a> </td><td></td></tr>
|
||||||
<tr><td> <a href = "#Displays">Displays</a> </td><td> <a href = "#Opengrab">Opengrab</a> </td><td> <a href = "#Stepper_motors">Stepper_motors</a> </td><td> <a href = "#PCB_mount">PCB_mount</a> </td><td> <a href = "#Rounded_cylinder">Rounded_cylinder</a> </td><td></td></tr>
|
<tr><td> <a href = "#DIP">DIP</a> </td><td> <a href = "#Nuts">Nuts</a> </td><td> <a href = "#Stepper_motors">Stepper_motors</a> </td><td> <a href = "#PCB_mount">PCB_mount</a> </td><td> <a href = "#Rounded_cylinder">Rounded_cylinder</a> </td><td></td></tr>
|
||||||
<tr><td> <a href = "#Extrusion_brackets">Extrusion_brackets</a> </td><td> <a href = "#PCB">PCB</a> </td><td> <a href = "#Swiss_clips">Swiss_clips</a> </td><td> <a href = "#PSU_shroud">PSU_shroud</a> </td><td> <a href = "#Rounded_polygon">Rounded_polygon</a> </td><td></td></tr>
|
<tr><td> <a href = "#D_connectors">D_connectors</a> </td><td> <a href = "#O_ring">O_ring</a> </td><td> <a href = "#Swiss_clips">Swiss_clips</a> </td><td> <a href = "#PSU_shroud">PSU_shroud</a> </td><td> <a href = "#Rounded_polygon">Rounded_polygon</a> </td><td></td></tr>
|
||||||
<tr><td> <a href = "#Extrusions">Extrusions</a> </td><td> <a href = "#PCBs">PCBs</a> </td><td> <a href = "#Toggles">Toggles</a> </td><td> <a href = "#Pocket_handle">Pocket_handle</a> </td><td> <a href = "#Rounded_triangle">Rounded_triangle</a> </td><td></td></tr>
|
<tr><td> <a href = "#Displays">Displays</a> </td><td> <a href = "#Opengrab">Opengrab</a> </td><td> <a href = "#Toggles">Toggles</a> </td><td> <a href = "#Pocket_handle">Pocket_handle</a> </td><td> <a href = "#Rounded_triangle">Rounded_triangle</a> </td><td></td></tr>
|
||||||
<tr><td> <a href = "#Fans">Fans</a> </td><td> <a href = "#PSUs">PSUs</a> </td><td> <a href = "#Transformers">Transformers</a> </td><td> <a href = "#Press_fit">Press_fit</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 = "#PCB">PCB</a> </td><td> <a href = "#Transformers">Transformers</a> </td><td> <a href = "#Press_fit">Press_fit</a> </td><td> <a href = "#Sector">Sector</a> </td><td></td></tr>
|
||||||
<tr><td> <a href = "#Fuseholder">Fuseholder</a> </td><td> <a href = "#Panel_meters">Panel_meters</a> </td><td> <a href = "#Tubings">Tubings</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 = "#Extrusions">Extrusions</a> </td><td> <a href = "#PCBs">PCBs</a> </td><td> <a href = "#Tubings">Tubings</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 = "#Pillars">Pillars</a> </td><td> <a href = "#Variacs">Variacs</a> </td><td> <a href = "#Printed_pulleys">Printed_pulleys</a> </td><td> <a href = "#Thread">Thread</a> </td><td></td></tr>
|
<tr><td> <a href = "#Fans">Fans</a> </td><td> <a href = "#PSUs">PSUs</a> </td><td> <a href = "#Variacs">Variacs</a> </td><td> <a href = "#Printed_pulleys">Printed_pulleys</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 = "#Pillow_blocks">Pillow_blocks</a> </td><td> <a href = "#Veroboard">Veroboard</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 = "#Panel_meters">Panel_meters</a> </td><td> <a href = "#Veroboard">Veroboard</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 = "#Pin_headers">Pin_headers</a> </td><td> <a href = "#Washers">Washers</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 = "#Pillars">Pillars</a> </td><td> <a href = "#Washers">Washers</a> </td><td> <a href = "#SSR_shroud">SSR_shroud</a> </td><td></td><td></td></tr>
|
||||||
<tr><td> <a href = "#Hygrometer">Hygrometer</a> </td><td> <a href = "#Pulleys">Pulleys</a> </td><td> <a href = "#Wire">Wire</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 = "#Pillow_blocks">Pillow_blocks</a> </td><td> <a href = "#Wire">Wire</a> </td><td> <a href = "#Screw_knob">Screw_knob</a> </td><td></td><td></td></tr>
|
||||||
<tr><td> <a href = "#IECs">IECs</a> </td><td></td><td> <a href = "#Zipties">Zipties</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 = "#Zipties">Zipties</a> </td><td> <a href = "#Socket_box">Socket_box</a> </td><td></td><td></td></tr>
|
||||||
<tr><td> <a href = "#Inserts">Inserts</a> </td><td></td><td></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></td><td> <a href = "#Strap_handle">Strap_handle</a> </td><td></td><td></td></tr>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -334,6 +334,73 @@ Individual teeth are not drawn, instead they are represented by a lighter colour
|
|||||||
| 6 | `screw(M3_grub_screw, 6)` | Screw M3 grub x 6mm |
|
| 6 | `screw(M3_grub_screw, 6)` | Screw M3 grub x 6mm |
|
||||||
|
|
||||||
|
|
||||||
|
<a href="#top">Top</a>
|
||||||
|
|
||||||
|
---
|
||||||
|
<a name="BLDC_motors"></a>
|
||||||
|
## BLDC_motors
|
||||||
|
Brushless DC electric motor
|
||||||
|
|
||||||
|
[vitamins/bldc_motors.scad](vitamins/bldc_motors.scad) Object definitions.
|
||||||
|
|
||||||
|
[vitamins/bldc_motor.scad](vitamins/bldc_motor.scad) Implementation.
|
||||||
|
|
||||||
|
[tests/BLDC_motors.scad](tests/BLDC_motors.scad) Code for this example.
|
||||||
|
|
||||||
|
### Properties
|
||||||
|
| Function | Description |
|
||||||
|
|:--- |:--- |
|
||||||
|
| `BLDC_base_diameter(type)` | Base diameter |
|
||||||
|
| `BLDC_base_height_1(type)` | Base height 1 |
|
||||||
|
| `BLDC_base_height_2(type)` | Base height 2 |
|
||||||
|
| `BLDC_base_hole_diameter(type)` | Base hole diameter |
|
||||||
|
| `BLDC_base_holes(type)` | Base holes |
|
||||||
|
| `BLDC_base_open(type)` | Base open |
|
||||||
|
| `BLDC_bell_diameter(type)` | Bell diameter |
|
||||||
|
| `BLDC_bell_height_1(type)` | Bell height 1 |
|
||||||
|
| `BLDC_bell_height_2(type)` | Bell height 2 |
|
||||||
|
| `BLDC_bell_hole_diameter(type)` | Bell hole diameter |
|
||||||
|
| `BLDC_bell_holes(type)` | Bell holes |
|
||||||
|
| `BLDC_bell_spokes(type)` | Bell spoke count |
|
||||||
|
| `BLDC_body_colour(type)` | Body colour |
|
||||||
|
| `BLDC_boss_diameter(type)` | Boss diameter |
|
||||||
|
| `BLDC_boss_height(type)` | Boss height |
|
||||||
|
| `BLDC_diameter(type)` | Diameter of motor |
|
||||||
|
| `BLDC_height(type)` | Height of motor including boss, if any, but excluding prop shaft |
|
||||||
|
| `BLDC_prop_shaft_diameter(type)` | Diameter of unthreaded portion of prop shaft |
|
||||||
|
| `BLDC_prop_shaft_length(type)` | Prop shaft length, including threaded section |
|
||||||
|
| `BLDC_prop_shaft_thread_diameter(type)` | Diameter of threaded section of prop shaft |
|
||||||
|
| `BLDC_prop_shaft_thread_length(type)` | Length of threaded section of prop shaft |
|
||||||
|
| `BLDC_shaft_diameter(type)` | shaft diameter |
|
||||||
|
| `BLDC_shaft_length(type)` | Total shaft length |
|
||||||
|
| `BLDC_shaft_offset(type)` | shaft offset from base |
|
||||||
|
| `BLDC_side_colour(type)` | Side colour |
|
||||||
|
| `BLDC_wire_diameter(type)` | Wire diameter |
|
||||||
|
|
||||||
|
### Modules
|
||||||
|
| Module | Description |
|
||||||
|
|:--- |:--- |
|
||||||
|
| `BLDC(type)` | Draw specified BLDC motor |
|
||||||
|
| `BLDC_base_screw_positions(type, n = 4)` | Positions children at the base screw holes |
|
||||||
|
| `BLDC_bell_screw_positions(type, n = 4)` | Positions children at the bell screw holes |
|
||||||
|
| `BLDC_screw_positions(holes, n = 4)` | Screw positions utility function |
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### Vitamins
|
||||||
|
| Qty | Module call | BOM entry |
|
||||||
|
| ---:|:--- |:---|
|
||||||
|
| 1 | `BLDC(BLDC0603)` | Brushless DC motor BLDC0603 |
|
||||||
|
| 1 | `BLDC(BLDC0802)` | Brushless DC motor BLDC0802 |
|
||||||
|
| 1 | `BLDC(BLDC1105)` | Brushless DC motor BLDC1105 |
|
||||||
|
| 1 | `BLDC(BLDC1306)` | Brushless DC motor BLDC1306 |
|
||||||
|
| 1 | `BLDC(BLDC1804)` | Brushless DC motor BLDC1804 |
|
||||||
|
| 1 | `BLDC(BLDC2205)` | Brushless DC motor BLDC2205 |
|
||||||
|
| 1 | `BLDC(BLDC2212)` | Brushless DC motor BLDC2212 |
|
||||||
|
| 1 | `BLDC(BLDC3548)` | Brushless DC motor BLDC3548 |
|
||||||
|
| 1 | `BLDC(BLDC4250)` | Brushless DC motor BLDC4250 |
|
||||||
|
|
||||||
|
|
||||||
<a href="#top">Top</a>
|
<a href="#top">Top</a>
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -373,6 +440,7 @@ Models of radial blowers.
|
|||||||
|:--- |:--- |
|
|:--- |:--- |
|
||||||
| `blower_casing_is_square(type)` | True for square radial fans, false for spiral shape radial blowers |
|
| `blower_casing_is_square(type)` | True for square radial fans, false for spiral shape radial blowers |
|
||||||
| `blower_exit_offset(type)` | Offset of exit's centre from the edge |
|
| `blower_exit_offset(type)` | Offset of exit's centre from the edge |
|
||||||
|
| `blower_size(type)` | Size |
|
||||||
|
|
||||||
### Modules
|
### Modules
|
||||||
| Module | Description |
|
| Module | Description |
|
||||||
@@ -399,6 +467,44 @@ Models of radial blowers.
|
|||||||
| 2 | `washer(M4_washer)` | Washer M4 x 9mm x 0.8mm |
|
| 2 | `washer(M4_washer)` | Washer M4 x 9mm x 0.8mm |
|
||||||
|
|
||||||
|
|
||||||
|
<a href="#top">Top</a>
|
||||||
|
|
||||||
|
---
|
||||||
|
<a name="Box_sections"></a>
|
||||||
|
## Box_sections
|
||||||
|
Box sections.
|
||||||
|
|
||||||
|
[vitamins/box_sections.scad](vitamins/box_sections.scad) Object definitions.
|
||||||
|
|
||||||
|
[vitamins/box_section.scad](vitamins/box_section.scad) Implementation.
|
||||||
|
|
||||||
|
[tests/box_sections.scad](tests/box_sections.scad) Code for this example.
|
||||||
|
|
||||||
|
### Properties
|
||||||
|
| Function | Description |
|
||||||
|
|:--- |:--- |
|
||||||
|
| `box_section_colour(type)` | Colour |
|
||||||
|
| `box_section_colour2(type)` | Colour2, for woven box section |
|
||||||
|
| `box_section_fillet(type)` | Fillet |
|
||||||
|
| `box_section_material(type)` | Material description |
|
||||||
|
| `box_section_size(type)` | Size |
|
||||||
|
| `box_section_thickness(type)` | Wall thickness |
|
||||||
|
|
||||||
|
### Functions
|
||||||
|
| Function | Description |
|
||||||
|
|:--- |:--- |
|
||||||
|
| `box_section_is_woven(type)` | Box section is woven, eg carbon fiber |
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### Vitamins
|
||||||
|
| Qty | Module call | BOM entry |
|
||||||
|
| ---:|:--- |:---|
|
||||||
|
| 1 | `box_section(AL12x8x1, 100)` | Aluminium rectangular box section 12mm x 8mm x 1mm, length 100mm |
|
||||||
|
| 1 | `box_section(AL20x20x2, 100)` | Aluminium rectangular box section 20mm x 20mm x 2mm, length 100mm |
|
||||||
|
| 1 | `box_section(CF10x10x1, 100)` | Carbon fiber rectangular box section 10mm x 10mm x 1mm, length 100mm |
|
||||||
|
|
||||||
|
|
||||||
<a href="#top">Top</a>
|
<a href="#top">Top</a>
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -1053,23 +1159,23 @@ Geared tin can steppers
|
|||||||
|:--- |:--- |
|
|:--- |:--- |
|
||||||
| `gs_boss_d(type)` | Boss around the shaft diameter |
|
| `gs_boss_d(type)` | Boss around the shaft diameter |
|
||||||
| `gs_boss_h(type)` | Boss around the shaft height |
|
| `gs_boss_h(type)` | Boss around the shaft height |
|
||||||
| `gs_bulge2_d(type)` | Plastic rear bulge depth from centre |
|
| `gs_bulge(type)` | Plastic bulge width, depth, height, z offset |
|
||||||
| `gs_bulge2_h(type)` | Plastic rear bulge height |
|
| `gs_bulge2(type)` | Plastic rear bulge width, depth, height |
|
||||||
| `gs_bulge2_w(type)` | Plastic rear bulge width |
|
|
||||||
| `gs_bulge_d(type)` | Plastic bulge depth from centre |
|
|
||||||
| `gs_bulge_h(type)` | Plastic bulge height |
|
|
||||||
| `gs_bulge_w(type)` | Plastic bulge width |
|
|
||||||
| `gs_diameter(type)` | Can diameter |
|
| `gs_diameter(type)` | Can diameter |
|
||||||
| `gs_flat_length(type)` | Shaft flat length |
|
| `gs_flat_length(type)` | Shaft flat length |
|
||||||
| `gs_height(type)` | Can height |
|
| `gs_height(type)` | Can height |
|
||||||
| `gs_hole_d(type)` | Screw hole diameter |
|
| `gs_hole_d(type)` | Screw hole diameter |
|
||||||
| `gs_lug_t(type)` | Screw lug thickness |
|
| `gs_lug_t(type)` | Screw lug thickness |
|
||||||
| `gs_lug_w(type)` | Screw lug width |
|
| `gs_lug_w(type)` | Screw lug width |
|
||||||
|
| `gs_motor(type)` | Motor diameter and height if separate from gearbox |
|
||||||
| `gs_offset(type)` | Offset of the shaft from the centre of the can |
|
| `gs_offset(type)` | Offset of the shaft from the centre of the can |
|
||||||
| `gs_pitch(type)` | Screw pitch |
|
| `gs_pitch(type)` | Screw pitch |
|
||||||
|
| `gs_radius(type)` | Top - or bottom + corner radius |
|
||||||
| `gs_shaft_d(type)` | Shaft diameter |
|
| `gs_shaft_d(type)` | Shaft diameter |
|
||||||
| `gs_shaft_flat(type)` | Shaft width across the flats |
|
| `gs_shaft_flat(type)` | Shaft width across the flats |
|
||||||
| `gs_shaft_length(type)` | Shaft length |
|
| `gs_shaft_length(type)` | Shaft length |
|
||||||
|
| `gs_wire_d(type)` | Wire diameter |
|
||||||
|
| `gs_wires(type)` | Wire colours and grouping |
|
||||||
|
|
||||||
### Modules
|
### Modules
|
||||||
| Module | Description |
|
| Module | Description |
|
||||||
@@ -1083,6 +1189,7 @@ Geared tin can steppers
|
|||||||
| Qty | Module call | BOM entry |
|
| Qty | Module call | BOM entry |
|
||||||
| ---:|:--- |:---|
|
| ---:|:--- |:---|
|
||||||
| 1 | `geared_stepper(28BYJ_48)` | Geared stepper - 28BYJ-48 5V |
|
| 1 | `geared_stepper(28BYJ_48)` | Geared stepper - 28BYJ-48 5V |
|
||||||
|
| 1 | `geared_stepper(35BYGHJ75)` | Geared stepper - 35BYGHJ75 0.4A |
|
||||||
|
|
||||||
|
|
||||||
<a href="#top">Top</a>
|
<a href="#top">Top</a>
|
||||||
@@ -1196,7 +1303,7 @@ Needs updating as mostly obsolete versions.
|
|||||||
| 1 | | Tape self amalgamating silicone 110mm x 25mm |
|
| 1 | | Tape self amalgamating silicone 110mm x 25mm |
|
||||||
| 1 | `resistor(Epcos)` | Thermistor Epcos B57560G104F 100K 1% - not shown |
|
| 1 | `resistor(Epcos)` | Thermistor Epcos B57560G104F 100K 1% - not shown |
|
||||||
| 2 | | Wire Red PTFE 16/0.2mm strands, length 170mm |
|
| 2 | | Wire Red PTFE 16/0.2mm strands, length 170mm |
|
||||||
| 4 | `ziptie(small_ziptie, 8)` | Ziptie 2.5mm x 100mm min length |
|
| 4 | `ziptie(small_ziptie)` | Ziptie 2.5mm x 100mm min length |
|
||||||
|
|
||||||
|
|
||||||
<a href="#top">Top</a>
|
<a href="#top">Top</a>
|
||||||
@@ -1289,7 +1396,7 @@ IEC mains inlets and outlet.
|
|||||||
| 1 | `iec(IEC_inlet)` | IEC inlet |
|
| 1 | `iec(IEC_inlet)` | IEC inlet |
|
||||||
| 1 | `iec(IEC_inlet_atx)` | IEC inlet for ATX |
|
| 1 | `iec(IEC_inlet_atx)` | IEC inlet for ATX |
|
||||||
| 1 | `iec(IEC_outlet)` | IEC outlet RS 811-7193 |
|
| 1 | `iec(IEC_outlet)` | IEC outlet RS 811-7193 |
|
||||||
| 1 | `iec(IEC_switched_fused_inlet)` | IEC320 C14 switched fused inlet module |
|
| 1 | `iec(IEC_320_C14_switched_fused_inlet)` | IEC320 C14 switched fused inlet module |
|
||||||
| 12 | `nut(M3_nut, nyloc = true)` | Nut M3 x 2.4mm nyloc |
|
| 12 | `nut(M3_nut, nyloc = true)` | Nut M3 x 2.4mm nyloc |
|
||||||
| 4 | `screw(M3_cs_cap_screw, 10)` | Screw M3 cs cap x 10mm |
|
| 4 | `screw(M3_cs_cap_screw, 10)` | Screw M3 cs cap x 10mm |
|
||||||
| 8 | `screw(M3_cs_cap_screw, 12)` | Screw M3 cs cap x 12mm |
|
| 8 | `screw(M3_cs_cap_screw, 12)` | Screw M3 cs cap x 12mm |
|
||||||
@@ -1445,7 +1552,7 @@ Nuts for leadscrews.
|
|||||||
| `leadnut_flange_t(type)` | Flange thickness |
|
| `leadnut_flange_t(type)` | Flange thickness |
|
||||||
| `leadnut_height(type)` | Total height |
|
| `leadnut_height(type)` | Total height |
|
||||||
| `leadnut_hole_dia(type)` | The diameter of the screw holes |
|
| `leadnut_hole_dia(type)` | The diameter of the screw holes |
|
||||||
| `leadnut_hole_pitch(type)` | The radia pitch of the screw holes |
|
| `leadnut_hole_pitch(type)` | The radial pitch of the screw holes |
|
||||||
| `leadnut_holes(type)` | The number of screw holes |
|
| `leadnut_holes(type)` | The number of screw holes |
|
||||||
| `leadnut_lead(type)` | Screw lead |
|
| `leadnut_lead(type)` | Screw lead |
|
||||||
| `leadnut_od(type)` | Outer diameter of the shank |
|
| `leadnut_od(type)` | Outer diameter of the shank |
|
||||||
@@ -2157,6 +2264,7 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
|
|||||||
### Functions
|
### Functions
|
||||||
| Function | Description |
|
| Function | Description |
|
||||||
|:--- |:--- |
|
|:--- |:--- |
|
||||||
|
| `pcb_component(type, name, index = 0)` | Return the component specified by name and index |
|
||||||
| `pcb_component_position(type, name, index = 0)` | Return x y position of specified component |
|
| `pcb_component_position(type, name, index = 0)` | Return x y position of specified component |
|
||||||
| `pcb_coord(type, p)` | Convert offsets from the edge to coordinates relative to the centre |
|
| `pcb_coord(type, p)` | Convert offsets from the edge to coordinates relative to the centre |
|
||||||
| `pcb_grid_pos(type, x, y, z = 0)` | Returns a pcb grid position |
|
| `pcb_grid_pos(type, x, y, z = 0)` | Returns a pcb grid position |
|
||||||
@@ -2293,6 +2401,7 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
|
|||||||
### Functions
|
### Functions
|
||||||
| Function | Description |
|
| Function | Description |
|
||||||
|:--- |:--- |
|
|:--- |:--- |
|
||||||
|
| `pcb_component(type, name, index = 0)` | Return the component specified by name and index |
|
||||||
| `pcb_component_position(type, name, index = 0)` | Return x y position of specified component |
|
| `pcb_component_position(type, name, index = 0)` | Return x y position of specified component |
|
||||||
| `pcb_coord(type, p)` | Convert offsets from the edge to coordinates relative to the centre |
|
| `pcb_coord(type, p)` | Convert offsets from the edge to coordinates relative to the centre |
|
||||||
| `pcb_grid_pos(type, x, y, z = 0)` | Returns a pcb grid position |
|
| `pcb_grid_pos(type, x, y, z = 0)` | Returns a pcb grid position |
|
||||||
@@ -2627,6 +2736,7 @@ Face order is bottom, top, left, right, front, back.
|
|||||||
| Function | Description |
|
| Function | Description |
|
||||||
|:--- |:--- |
|
|:--- |:--- |
|
||||||
| `psu_face_transform(type, face)` | Returns a transformation matrix to get to the specified face |
|
| `psu_face_transform(type, face)` | Returns a transformation matrix to get to the specified face |
|
||||||
|
| `psu_size(type)` | Size |
|
||||||
| `terminal_block_length(type, ways)` | Total length of terminal block |
|
| `terminal_block_length(type, ways)` | Total length of terminal block |
|
||||||
|
|
||||||
### Modules
|
### Modules
|
||||||
@@ -3056,6 +3166,7 @@ For an explanation of `screw_polysink()` see <https://hydraraptor.blogspot.com/2
|
|||||||
| 1 | `screw(No4_screw, 10)` | Screw No4 pan wood x 10mm |
|
| 1 | `screw(No4_screw, 10)` | Screw No4 pan wood x 10mm |
|
||||||
| 1 | `screw(No6_cs_screw, 30)` | Screw No6 cs wood x 30mm |
|
| 1 | `screw(No6_cs_screw, 30)` | Screw No6 cs wood x 30mm |
|
||||||
| 1 | `screw(No6_screw, 30)` | Screw No6 pan wood x 30mm |
|
| 1 | `screw(No6_screw, 30)` | Screw No6 pan wood x 30mm |
|
||||||
|
| 1 | `screw(No8_screw, 30)` | Screw No8 pan wood x 30mm |
|
||||||
|
|
||||||
### Printed
|
### Printed
|
||||||
| Qty | Filename |
|
| Qty | Filename |
|
||||||
@@ -4000,7 +4111,7 @@ Just a BOM entry at the moment and cable bundle size functions for holes, plus c
|
|||||||
| 1 | | Wire orange 7/0.2mm strands, length 90mm |
|
| 1 | | Wire orange 7/0.2mm strands, length 90mm |
|
||||||
| 1 | | Wire red 7/0.2mm strands, length 90mm |
|
| 1 | | Wire red 7/0.2mm strands, length 90mm |
|
||||||
| 1 | | Wire yellow 7/0.2mm strands, length 90mm |
|
| 1 | | Wire yellow 7/0.2mm strands, length 90mm |
|
||||||
| 1 | `ziptie(small_ziptie, 2.1)` | Ziptie 2.5mm x 100mm min length |
|
| 1 | `ziptie(small_ziptie)` | Ziptie 2.5mm x 100mm min length |
|
||||||
|
|
||||||
|
|
||||||
<a href="#top">Top</a>
|
<a href="#top">Top</a>
|
||||||
@@ -4028,16 +4139,16 @@ Cable zipties.
|
|||||||
### Modules
|
### Modules
|
||||||
| Module | Description |
|
| Module | Description |
|
||||||
|:--- |:--- |
|
|:--- |:--- |
|
||||||
| `ziptie(type, r, t = 0)` | Draw specified ziptie wrapped around radius `r` and optionally through panel thickness `t` |
|
| `ziptie(type, r = 5, t = 0)` | Draw specified ziptie wrapped around radius `r` and optionally through panel thickness `t` |
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
### Vitamins
|
### Vitamins
|
||||||
| Qty | Module call | BOM entry |
|
| Qty | Module call | BOM entry |
|
||||||
| ---:|:--- |:---|
|
| ---:|:--- |:---|
|
||||||
| 1 | `ziptie(small_ziptie, 5)` | Ziptie 2.5mm x 100mm min length |
|
| 1 | `ziptie(small_ziptie)` | Ziptie 2.5mm x 100mm min length |
|
||||||
| 1 | `ziptie(ziptie_3p6mm, 5)` | Ziptie 3.6mm x 100mm min length |
|
| 1 | `ziptie(ziptie_3p6mm)` | Ziptie 3.6mm x 100mm min length |
|
||||||
| 1 | `ziptie(ziptie_3mm, 5)` | Ziptie 3mm x 100mm min length |
|
| 1 | `ziptie(ziptie_3mm)` | Ziptie 3mm x 100mm min length |
|
||||||
|
|
||||||
|
|
||||||
<a href="#top">Top</a>
|
<a href="#top">Top</a>
|
||||||
@@ -5247,7 +5358,7 @@ The stl and assembly must be given a name and parameterless wrappers for the stl
|
|||||||
| 6 | `screw(M3_cap_screw, 10)` | Screw M3 cap x 10mm |
|
| 6 | `screw(M3_cap_screw, 10)` | Screw M3 cap x 10mm |
|
||||||
| 6 | `washer(M3_washer)` | Washer M3 x 7mm x 0.5mm |
|
| 6 | `washer(M3_washer)` | Washer M3 x 7mm x 0.5mm |
|
||||||
| 6 | `star_washer(M3_washer)` | Washer star M3 x 0.5mm |
|
| 6 | `star_washer(M3_washer)` | Washer star M3 x 0.5mm |
|
||||||
| 3 | `ziptie(small_ziptie, 3)` | Ziptie 2.5mm x 100mm min length |
|
| 3 | `ziptie(small_ziptie)` | Ziptie 2.5mm x 100mm min length |
|
||||||
|
|
||||||
### Printed
|
### Printed
|
||||||
| Qty | Filename |
|
| Qty | Filename |
|
||||||
@@ -5449,7 +5560,7 @@ The STL and assembly must be given a name and parameterless wrappers for the stl
|
|||||||
| 4 | `screw(M3_cap_screw, 10)` | Screw M3 cap x 10mm |
|
| 4 | `screw(M3_cap_screw, 10)` | Screw M3 cap x 10mm |
|
||||||
| 4 | `washer(M3_washer)` | Washer M3 x 7mm x 0.5mm |
|
| 4 | `washer(M3_washer)` | Washer M3 x 7mm x 0.5mm |
|
||||||
| 4 | `star_washer(M3_washer)` | Washer star M3 x 0.5mm |
|
| 4 | `star_washer(M3_washer)` | Washer star M3 x 0.5mm |
|
||||||
| 4 | `ziptie(small_ziptie, 3)` | Ziptie 2.5mm x 100mm min length |
|
| 4 | `ziptie(small_ziptie)` | Ziptie 2.5mm x 100mm min length |
|
||||||
|
|
||||||
### Printed
|
### Printed
|
||||||
| Qty | Filename |
|
| Qty | Filename |
|
||||||
@@ -5642,8 +5753,8 @@ allows flexible positioning of the motors.
|
|||||||
### Modules
|
### Modules
|
||||||
| Module | Description |
|
| Module | Description |
|
||||||
|:--- |:--- |
|
|:--- |:--- |
|
||||||
| `coreXY(type, size, pos, separation, x_gap, plain_idler_offset = 0, upper_drive_pulley_offset, lower_drive_pulley_offset, show_pulleys = false)` | Wrapper module to draw both belts of a coreXY setup |
|
| `coreXY(type, size, pos, separation, x_gap, plain_idler_offset = 0, upper_drive_pulley_offset, lower_drive_pulley_offset, show_pulleys = false, left_lower = false)` | Wrapper module to draw both belts of a coreXY setup |
|
||||||
| `coreXY_belts(type, carriagePosition, coreXYPosBL, coreXYPosTR, separation, x_gap = 20, upper_drive_pulley_offset = [0, 0], lower_drive_pulley_offset = [0, 0], show_pulleys = false)` | Draw the coreXY belts |
|
| `coreXY_belts(type, carriagePosition, coreXYPosBL, coreXYPosTR, separation, x_gap = 20, upper_drive_pulley_offset = [0, 0], lower_drive_pulley_offset = [0, 0], show_pulleys = false, left_lower = false)` | Draw the coreXY belts |
|
||||||
| `coreXY_half(type, size, pos, separation_y = 0, x_gap = 0, plain_idler_offset = 0, drive_pulley_offset = [0, 0], show_pulleys = false, lower_belt = false, hflip = false)` | Draw one belt of a coreXY setup |
|
| `coreXY_half(type, size, pos, separation_y = 0, x_gap = 0, plain_idler_offset = 0, drive_pulley_offset = [0, 0], show_pulleys = false, lower_belt = false, hflip = false)` | Draw one belt of a coreXY setup |
|
||||||
|
|
||||||

|

|
||||||
|
@@ -31,6 +31,12 @@ from set_config import *
|
|||||||
import json
|
import json
|
||||||
import re
|
import re
|
||||||
|
|
||||||
|
try:
|
||||||
|
import parts
|
||||||
|
got_parts_py = True
|
||||||
|
except:
|
||||||
|
got_parts_py = False
|
||||||
|
|
||||||
def find_scad_file(mname):
|
def find_scad_file(mname):
|
||||||
for filename in os.listdir(source_dir):
|
for filename in os.listdir(source_dir):
|
||||||
if filename[-5:] == ".scad":
|
if filename[-5:] == ".scad":
|
||||||
@@ -46,6 +52,18 @@ def find_scad_file(mname):
|
|||||||
return filename
|
return filename
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
def main_assembly(target):
|
||||||
|
file = None
|
||||||
|
if target:
|
||||||
|
assembly = target + "_assembly"
|
||||||
|
file = find_scad_file(assembly)
|
||||||
|
if not file:
|
||||||
|
assembly = "main_assembly"
|
||||||
|
file = find_scad_file(assembly)
|
||||||
|
if not file:
|
||||||
|
raise Exception("can't find source for " + assembly)
|
||||||
|
return assembly, file
|
||||||
|
|
||||||
class Part:
|
class Part:
|
||||||
def __init__(self, args):
|
def __init__(self, args):
|
||||||
self.count = 1
|
self.count = 1
|
||||||
@@ -117,6 +135,33 @@ class BOM:
|
|||||||
return ass
|
return ass
|
||||||
return ass.replace("assembly", "assemblies")
|
return ass.replace("assembly", "assemblies")
|
||||||
|
|
||||||
|
def print_CSV(self, file = None):
|
||||||
|
i = 0
|
||||||
|
for part in sorted(self.vitamins):
|
||||||
|
i += 1
|
||||||
|
if ': ' in part:
|
||||||
|
part_no, description = part.split(': ')
|
||||||
|
else:
|
||||||
|
part_no, description = "", part
|
||||||
|
qty = self.vitamins[part].count
|
||||||
|
if got_parts_py:
|
||||||
|
match = re.match(r'^.*\((.*?)[,\)].*$', part_no)
|
||||||
|
if match and not match.group(1).startswith('"'):
|
||||||
|
part_no = part_no.replace('(' + match.group(1), '_' + match.group(1) + '(').replace('(, ', '(')
|
||||||
|
func = 'parts.' + part_no.replace('(', '(%d, ' % qty).replace(', )', ')')
|
||||||
|
func = func.replace('true', 'True').replace('false', 'False').replace('undef', 'None')
|
||||||
|
try:
|
||||||
|
price, url = eval(func)
|
||||||
|
print("'%s',%3d,%.2f,'=B%d*C%d',%s" % (description, qty, price, i, i, url), file=file)
|
||||||
|
except:
|
||||||
|
if part_no:
|
||||||
|
print("%s not found in parts.py" % func)
|
||||||
|
print("'%s',%3d" % (description, qty), file=file)
|
||||||
|
else:
|
||||||
|
print("'%s',%3d" % (description, qty), file=file)
|
||||||
|
if got_parts_py:
|
||||||
|
print(",'=SUM(B1:B%d)',,'=SUM(D1:D%d)'" %(i, i), file=file)
|
||||||
|
|
||||||
def print_bom(self, breakdown, file = None):
|
def print_bom(self, breakdown, file = None):
|
||||||
if self.vitamins:
|
if self.vitamins:
|
||||||
print("Vitamins:", file=file)
|
print("Vitamins:", file=file)
|
||||||
@@ -221,28 +266,20 @@ def parse_bom(file = "openscad.log", name = None):
|
|||||||
return main
|
return main
|
||||||
|
|
||||||
def usage():
|
def usage():
|
||||||
print("\nusage:\n\tbom [target_config] [<accessory_name>_assembly] - Generate BOMs for a project or an accessory to a project.")
|
print("\nusage:\n\tbom [target_config] - Generate BOMs for a project.")
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
def boms(target = None, assembly = None):
|
def boms(target = None):
|
||||||
try:
|
try:
|
||||||
bom_dir = set_config(target, usage) + "bom"
|
bom_dir = set_config(target, usage) + "bom"
|
||||||
if assembly:
|
if os.path.isdir(bom_dir):
|
||||||
bom_dir += "/accessories"
|
shutil.rmtree(bom_dir)
|
||||||
if not os.path.isdir(bom_dir):
|
sleep(0.1)
|
||||||
os.makedirs(bom_dir)
|
os.makedirs(bom_dir)
|
||||||
else:
|
|
||||||
assembly = "main_assembly"
|
|
||||||
if os.path.isdir(bom_dir):
|
|
||||||
shutil.rmtree(bom_dir)
|
|
||||||
sleep(0.1)
|
|
||||||
os.makedirs(bom_dir)
|
|
||||||
#
|
#
|
||||||
# Find the scad file that makes the module
|
# Find the scad file that makes the main assembly
|
||||||
#
|
#
|
||||||
scad_file = find_scad_file(assembly)
|
assembly, scad_file = main_assembly(target)
|
||||||
if not scad_file:
|
|
||||||
raise Exception("can't find source for " + assembly)
|
|
||||||
#
|
#
|
||||||
# make a file to use the module
|
# make a file to use the module
|
||||||
#
|
#
|
||||||
@@ -259,8 +296,9 @@ def boms(target = None, assembly = None):
|
|||||||
|
|
||||||
main = parse_bom("openscad.echo", assembly)
|
main = parse_bom("openscad.echo", assembly)
|
||||||
|
|
||||||
if assembly == "main_assembly":
|
main.print_bom(True, open(bom_dir + "/bom.txt","wt"))
|
||||||
main.print_bom(True, open(bom_dir + "/bom.txt","wt"))
|
|
||||||
|
main.print_CSV(open(bom_dir + "/bom.csv","wt"))
|
||||||
|
|
||||||
for ass in main.assemblies:
|
for ass in main.assemblies:
|
||||||
with open(bom_dir + "/" + ass + ".txt", "wt") as f:
|
with open(bom_dir + "/" + ass + ".txt", "wt") as f:
|
||||||
@@ -278,20 +316,8 @@ def boms(target = None, assembly = None):
|
|||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
if len(sys.argv) > 3: usage()
|
if len(sys.argv) > 2: usage()
|
||||||
|
|
||||||
if len(sys.argv) == 3:
|
target = sys.argv[1] if len(sys.argv) == 2 else None
|
||||||
target, assembly = sys.argv[1], sys.argv[2]
|
|
||||||
else:
|
|
||||||
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:
|
boms(target)
|
||||||
if assembly[-9:] != "_assembly": usage()
|
|
||||||
|
|
||||||
boms(target, assembly)
|
|
||||||
|
@@ -173,7 +173,7 @@ def tests(tests):
|
|||||||
impl_name = None
|
impl_name = None
|
||||||
|
|
||||||
if libtest:
|
if libtest:
|
||||||
vsplit = "AJR" + chr(ord('Z') + 1)
|
vsplit = "AIR" + chr(ord('Z') + 1)
|
||||||
vtype = locations[0][1]
|
vtype = locations[0][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 :]]
|
types = [vtype + ' ' + vsplit[i] + '-' + chr(ord(vsplit[i + 1]) - 1) for i in range(len(vsplit) - 1)] + [loc[1] for loc in locations[1 :]]
|
||||||
if type == vtype:
|
if type == vtype:
|
||||||
|
@@ -161,6 +161,7 @@ def views(target, do_assemblies = None):
|
|||||||
# Find all the scad files
|
# Find all the scad files
|
||||||
#
|
#
|
||||||
main_blurb = None
|
main_blurb = None
|
||||||
|
main_assembly, main_file = bom.main_assembly(target)
|
||||||
pngs = []
|
pngs = []
|
||||||
for dir in source_dirs(bom_dir):
|
for dir in source_dirs(bom_dir):
|
||||||
if os.path.isdir(dir):
|
if os.path.isdir(dir):
|
||||||
@@ -232,7 +233,7 @@ def views(target, do_assemblies = None):
|
|||||||
update_image(tmp_name, tn_name)
|
update_image(tmp_name, tn_name)
|
||||||
done_assemblies.append(real_name)
|
done_assemblies.append(real_name)
|
||||||
else:
|
else:
|
||||||
if module == 'main_assembly':
|
if module == main_assembly:
|
||||||
main_blurb = blurb.scrape_module_blurb(lines[:line_no])
|
main_blurb = blurb.scrape_module_blurb(lines[:line_no])
|
||||||
line_no += 1
|
line_no += 1
|
||||||
#
|
#
|
||||||
@@ -246,9 +247,6 @@ def views(target, do_assemblies = None):
|
|||||||
project = ' '.join(word[0].upper() + word[1:] for word in os.path.basename(os.getcwd()).split('_'))
|
project = ' '.join(word[0].upper() + word[1:] for word in os.path.basename(os.getcwd()).split('_'))
|
||||||
print('<a name="TOP"></a>', file = doc_file)
|
print('<a name="TOP"></a>', file = doc_file)
|
||||||
print('# %s' % project, file = doc_file)
|
print('# %s' % project, file = doc_file)
|
||||||
main_file = bom.find_scad_file('main_assembly')
|
|
||||||
if not main_file:
|
|
||||||
raise Exception("can't find source for main_assembly")
|
|
||||||
text = blurb.scrape_blurb(source_dir + '/' + main_file)
|
text = blurb.scrape_blurb(source_dir + '/' + main_file)
|
||||||
blurbs = blurb.split_blurb(text)
|
blurbs = blurb.split_blurb(text)
|
||||||
if len(text):
|
if len(text):
|
||||||
|
31
tests/BLDC_motors.scad
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
//
|
||||||
|
// NopSCADlib Copyright Chris Palmer 2021
|
||||||
|
// 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/bldc_motors.scad>
|
||||||
|
|
||||||
|
module bldc_motors()
|
||||||
|
layout([for(b = bldc_motors) BLDC_diameter(b)])
|
||||||
|
rotate(-90)
|
||||||
|
BLDC(bldc_motors[$i]);
|
||||||
|
|
||||||
|
if($preview)
|
||||||
|
let($show_threads = 1)
|
||||||
|
bldc_motors();
|
@@ -20,10 +20,10 @@
|
|||||||
//
|
//
|
||||||
//! BOM and assembly demonstration
|
//! BOM and assembly demonstration
|
||||||
//
|
//
|
||||||
|
$explode = 1; // Normally set on the command line when generating assembly views with views.py
|
||||||
include <../core.scad>
|
include <../core.scad>
|
||||||
include <../vitamins/sheets.scad>
|
include <../vitamins/sheets.scad>
|
||||||
use <../vitamins/insert.scad>
|
use <../vitamins/insert.scad>
|
||||||
$explode = 1; // Normally set on the command line when generating assembly views with views.py
|
|
||||||
|
|
||||||
screw = M3_cap_screw;
|
screw = M3_cap_screw;
|
||||||
sheet = PMMA3;
|
sheet = PMMA3;
|
||||||
|
@@ -16,6 +16,7 @@
|
|||||||
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
||||||
// If not, see <https://www.gnu.org/licenses/>.
|
// If not, see <https://www.gnu.org/licenses/>.
|
||||||
//
|
//
|
||||||
|
include <../core.scad>
|
||||||
include <../vitamins/ldrs.scad>
|
include <../vitamins/ldrs.scad>
|
||||||
|
|
||||||
use <../utils/layout.scad>
|
use <../utils/layout.scad>
|
||||||
|
@@ -16,7 +16,7 @@
|
|||||||
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
||||||
// If not, see <https://www.gnu.org/licenses/>.
|
// If not, see <https://www.gnu.org/licenses/>.
|
||||||
//
|
//
|
||||||
|
include <../core.scad>
|
||||||
use <../utils/layout.scad>
|
use <../utils/layout.scad>
|
||||||
|
|
||||||
include <../vitamins/ball_bearings.scad>
|
include <../vitamins/ball_bearings.scad>
|
||||||
|
30
tests/box_sections.scad
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
//
|
||||||
|
// NopSCADlib Copyright Chris Palmer 2021
|
||||||
|
// 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/box_sections.scad>
|
||||||
|
|
||||||
|
module box_sections() {
|
||||||
|
layout([for(b = box_sections) box_section_size(b).x], 20)
|
||||||
|
box_section(box_sections[$i], 100);
|
||||||
|
}
|
||||||
|
|
||||||
|
if($preview)
|
||||||
|
box_sections();
|
@@ -16,6 +16,7 @@
|
|||||||
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
||||||
// If not, see <https://www.gnu.org/licenses/>.
|
// If not, see <https://www.gnu.org/licenses/>.
|
||||||
//
|
//
|
||||||
|
include <../core.scad>
|
||||||
use <../utils/layout.scad>
|
use <../utils/layout.scad>
|
||||||
|
|
||||||
include <../vitamins/displays.scad>
|
include <../vitamins/displays.scad>
|
||||||
|
@@ -16,12 +16,13 @@
|
|||||||
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
||||||
// If not, see <https://www.gnu.org/licenses/>.
|
// If not, see <https://www.gnu.org/licenses/>.
|
||||||
//
|
//
|
||||||
|
include <../core.scad>
|
||||||
include <../vitamins/geared_steppers.scad>
|
include <../vitamins/geared_steppers.scad>
|
||||||
|
|
||||||
use <../utils/layout.scad>
|
use <../utils/layout.scad>
|
||||||
|
|
||||||
module geared_steppers()
|
module geared_steppers()
|
||||||
layout([for(g = geared_steppers) gs_diameter(g)], 5)
|
layout([for(g = geared_steppers) max(gs_diameter(g), gs_pitch(g) + gs_lug_w(g) / 2)], 5)
|
||||||
geared_stepper(geared_steppers[$i]);
|
geared_stepper(geared_steppers[$i]);
|
||||||
|
|
||||||
geared_steppers();
|
geared_steppers();
|
||||||
|
@@ -16,6 +16,7 @@
|
|||||||
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
||||||
// If not, see <https://www.gnu.org/licenses/>.
|
// If not, see <https://www.gnu.org/licenses/>.
|
||||||
//
|
//
|
||||||
|
include <../core.scad>
|
||||||
use <../utils/layout.scad>
|
use <../utils/layout.scad>
|
||||||
|
|
||||||
include <../vitamins/green_terminals.scad>
|
include <../vitamins/green_terminals.scad>
|
||||||
|
@@ -16,6 +16,7 @@
|
|||||||
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
||||||
// If not, see <https://www.gnu.org/licenses/>.
|
// If not, see <https://www.gnu.org/licenses/>.
|
||||||
//
|
//
|
||||||
|
include <../core.scad>
|
||||||
use <../vitamins/hygrometer.scad>
|
use <../vitamins/hygrometer.scad>
|
||||||
|
|
||||||
if($preview)
|
if($preview)
|
||||||
|
@@ -16,6 +16,7 @@
|
|||||||
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
||||||
// If not, see <https://www.gnu.org/licenses/>.
|
// If not, see <https://www.gnu.org/licenses/>.
|
||||||
//
|
//
|
||||||
|
include <../core.scad>
|
||||||
use <../vitamins/microview.scad>
|
use <../vitamins/microview.scad>
|
||||||
|
|
||||||
microview(!$preview);
|
microview(!$preview);
|
||||||
|
@@ -16,6 +16,7 @@
|
|||||||
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
||||||
// If not, see <https://www.gnu.org/licenses/>.
|
// If not, see <https://www.gnu.org/licenses/>.
|
||||||
//
|
//
|
||||||
|
include <../core.scad>
|
||||||
use <../vitamins/o_ring.scad>
|
use <../vitamins/o_ring.scad>
|
||||||
|
|
||||||
module o_rings()
|
module o_rings()
|
||||||
|
BIN
tests/png/bldc_motors.png
Normal file
After Width: | Height: | Size: 142 KiB |
BIN
tests/png/box_sections.png
Normal file
After Width: | Height: | Size: 26 KiB |
Before Width: | Height: | Size: 117 KiB After Width: | Height: | Size: 117 KiB |
Before Width: | Height: | Size: 67 KiB After Width: | Height: | Size: 94 KiB |
Before Width: | Height: | Size: 61 KiB After Width: | Height: | Size: 61 KiB |
Before Width: | Height: | Size: 188 KiB After Width: | Height: | Size: 188 KiB |
Before Width: | Height: | Size: 158 KiB After Width: | Height: | Size: 160 KiB |
@@ -16,8 +16,8 @@
|
|||||||
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
||||||
// If not, see <https://www.gnu.org/licenses/>.
|
// If not, see <https://www.gnu.org/licenses/>.
|
||||||
//
|
//
|
||||||
|
include <../core.scad>
|
||||||
include <../printed/press_fit.scad>
|
use <../printed/press_fit.scad>
|
||||||
|
|
||||||
module press_fits()
|
module press_fits()
|
||||||
{
|
{
|
||||||
|
@@ -50,8 +50,6 @@ module rails()
|
|||||||
translate_z(-sheet)
|
translate_z(-sheet)
|
||||||
vflip()
|
vflip()
|
||||||
nut_and_washer(nut, true);
|
nut_and_washer(nut, true);
|
||||||
|
|
||||||
echo(rail[0], (length - (rail_holes(rail, length) - 1) * rail_pitch(rail)) / 2);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if($preview)
|
if($preview)
|
||||||
|
@@ -180,24 +180,25 @@ module coreXY_half(type, size, pos, separation_y = 0, x_gap = 0, plain_idler_off
|
|||||||
tooth_colour = lower_belt ? coreXY_lower_tooth_colour(type) : coreXY_upper_tooth_colour(type));
|
tooth_colour = lower_belt ? coreXY_lower_tooth_colour(type) : coreXY_upper_tooth_colour(type));
|
||||||
}
|
}
|
||||||
|
|
||||||
module coreXY(type, size, pos, separation, x_gap, plain_idler_offset = 0, upper_drive_pulley_offset, lower_drive_pulley_offset, show_pulleys = false) { //! Wrapper module to draw both belts of a coreXY setup
|
module coreXY(type, size, pos, separation, x_gap, plain_idler_offset = 0, upper_drive_pulley_offset, lower_drive_pulley_offset, show_pulleys = false, left_lower = false) { //! Wrapper module to draw both belts of a coreXY setup
|
||||||
translate([size.x / 2 - separation.x / 2, size.y / 2, -separation.z / 2]) {
|
translate([size.x / 2 - separation.x / 2, size.y / 2, -separation.z / 2]) {
|
||||||
// lower belt
|
// lower belt
|
||||||
hflip()
|
hflip(!left_lower)
|
||||||
explode(25)
|
explode(25)
|
||||||
coreXY_half(type, size, [size.x - pos.x - separation.x, pos.y], separation.y, x_gap, plain_idler_offset, [-lower_drive_pulley_offset.x, lower_drive_pulley_offset.y], show_pulleys, lower_belt = true, hflip = true);
|
coreXY_half(type, size, [size.x - pos.x - separation.x/2 - (left_lower ? x_gap : 0), pos.y], separation.y, x_gap, plain_idler_offset, [-lower_drive_pulley_offset.x, lower_drive_pulley_offset.y], show_pulleys, lower_belt = true, hflip = true);
|
||||||
|
|
||||||
// upper belt
|
// upper belt
|
||||||
translate([separation.x, 0, separation.z])
|
translate([separation.x, 0, separation.z])
|
||||||
explode(25)
|
hflip(left_lower)
|
||||||
coreXY_half(type, size, [pos.x, pos.y], separation.y, x_gap, plain_idler_offset, upper_drive_pulley_offset, show_pulleys, lower_belt = false, hflip=false);
|
explode(25)
|
||||||
|
coreXY_half(type, size, [pos.x + separation.x/2 + (left_lower ? x_gap : 0), pos.y], separation.y, x_gap, plain_idler_offset, upper_drive_pulley_offset, show_pulleys, lower_belt = false, hflip = false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
module coreXY_belts(type, carriagePosition, coreXYPosBL, coreXYPosTR, separation, x_gap = 20, upper_drive_pulley_offset = [0, 0], lower_drive_pulley_offset = [0, 0], show_pulleys = false) { //! Draw the coreXY belts
|
module coreXY_belts(type, carriagePosition, coreXYPosBL, coreXYPosTR, separation, x_gap = 20, upper_drive_pulley_offset = [0, 0], lower_drive_pulley_offset = [0, 0], show_pulleys = false, left_lower = false) { //! Draw the coreXY belts
|
||||||
assert(coreXYPosBL.z == coreXYPosTR.z);
|
assert(coreXYPosBL.z == coreXYPosTR.z);
|
||||||
|
|
||||||
coreXYSize = coreXYPosTR - coreXYPosBL;
|
coreXYSize = coreXYPosTR - coreXYPosBL;
|
||||||
translate(coreXYPosBL)
|
translate(coreXYPosBL)
|
||||||
coreXY(type, coreXYSize, [carriagePosition.x - coreXYPosBL.x + separation.x / 2, carriagePosition.y - coreXYPosBL.y], separation = separation, x_gap = x_gap, plain_idler_offset = 0, upper_drive_pulley_offset = upper_drive_pulley_offset, lower_drive_pulley_offset = lower_drive_pulley_offset, show_pulleys = show_pulleys);
|
coreXY(type, coreXYSize, [carriagePosition.x - coreXYPosBL.x, carriagePosition.y - coreXYPosBL.y], separation = separation, x_gap = x_gap, plain_idler_offset = 0, upper_drive_pulley_offset = upper_drive_pulley_offset, lower_drive_pulley_offset = lower_drive_pulley_offset, show_pulleys = show_pulleys, left_lower = left_lower);
|
||||||
}
|
}
|
||||||
|
@@ -75,28 +75,28 @@ function rounded_polygon_length(points, tangents) = //! Calculate the length giv
|
|||||||
module rounded_polygon(points, _tangents = undef) { //! Draw the rounded polygon from the point list, can pass the tangent list to save it being calculated
|
module rounded_polygon(points, _tangents = undef) { //! Draw the rounded polygon from the point list, can pass the tangent list to save it being calculated
|
||||||
len = len(points);
|
len = len(points);
|
||||||
indices = [0 : len - 1];
|
indices = [0 : len - 1];
|
||||||
tangents = [ for (t = _tangents ? _tangents : rounded_polygon_tangents(points)) each [t.x, t.y] ];
|
tangents = _tangents ? _tangents : rounded_polygon_tangents(points);
|
||||||
|
|
||||||
difference(convexity = points) {
|
difference() {
|
||||||
union() {
|
union() {
|
||||||
for(i = indices)
|
for(i = indices, last = (i - 1 + len) % len)
|
||||||
if(points[i][2] > 0)
|
if(points[i][2] > 0)
|
||||||
hull() {
|
hull() {
|
||||||
translate([points[i].x, points[i].y])
|
translate(vec2(points[i]))
|
||||||
circle(points[i][2]);
|
circle(points[i][2]);
|
||||||
|
|
||||||
polygon([tangents[(2 * i - 1 + 2 * len) % (2 * len)], tangents[2 * i], [points[i].x, points[i].y]]);
|
polygon([vec2(tangents[last][1]), vec2(tangents[i][0]), vec2(points[i])]);
|
||||||
}
|
}
|
||||||
|
|
||||||
polygon(tangents, convexity = points);
|
polygon([for(t = tangents) each(vec2(t))], convexity = points);
|
||||||
}
|
}
|
||||||
for(i = indices)
|
for(i = indices, last = (i - 1 + len) % len)
|
||||||
if(points[i][2] < 0)
|
if(points[i][2] < 0)
|
||||||
hull() {
|
hull() {
|
||||||
translate([points[i].x, points[i].y])
|
translate(vec2(points[i]))
|
||||||
circle(-points[i][2]);
|
circle(-points[i][2]);
|
||||||
|
|
||||||
polygon([tangents[(2 * i - 1 + 2 * len) % (2 * len)], tangents[2 * i], [points[i].x, points[i].y]]);
|
polygon([vec2(tangents[last][1]), vec2(tangents[i][0]), vec2(points[i])]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -50,6 +50,7 @@ function thread_profile(h, crest, angle, overlap = 0.1) = //! Create thread prof
|
|||||||
[[-base / 2, -overlap, 0], [-crest / 2, h, 0], [crest / 2, h, 0], [base / 2, -overlap, 0]];
|
[[-base / 2, -overlap, 0], [-crest / 2, h, 0], [crest / 2, h, 0], [base / 2, -overlap, 0]];
|
||||||
|
|
||||||
module thread(dia, pitch, length, profile, center = true, top = -1, bot = -1, starts = 1, solid = true, female = false, colour = undef) { //! Create male or female thread, ends can be tapered, chamfered or square
|
module thread(dia, pitch, length, profile, center = true, top = -1, bot = -1, starts = 1, solid = true, female = false, colour = undef) { //! Create male or female thread, ends can be tapered, chamfered or square
|
||||||
|
assert(is_undef(colour) || is_list(colour), "Thread colour must be in [r, g, b] form");
|
||||||
//
|
//
|
||||||
// Apply colour if defined
|
// Apply colour if defined
|
||||||
//
|
//
|
||||||
@@ -155,7 +156,7 @@ module thread(dia, pitch, length, profile, center = true, top = -1, bot = -1, st
|
|||||||
translate([0, offset])
|
translate([0, offset])
|
||||||
square([r, len]);
|
square([r, len]);
|
||||||
|
|
||||||
translate([0, bot_chamfer_h])
|
translate([0, offset + bot_chamfer_h])
|
||||||
square([r + h + overlap, len - top_chamfer_h - bot_chamfer_h]);
|
square([r + h + overlap, len - top_chamfer_h - bot_chamfer_h]);
|
||||||
}
|
}
|
||||||
if(!solid)
|
if(!solid)
|
||||||
@@ -190,7 +191,8 @@ module female_metric_thread(d, pitch, length, center = true, top = -1, bot = -1,
|
|||||||
}
|
}
|
||||||
|
|
||||||
function metric_coarse_pitch(d) //! Convert metric diameter to pitch
|
function metric_coarse_pitch(d) //! Convert metric diameter to pitch
|
||||||
= d == 1.6 ? 0.35 // M1.6
|
= d == 1.4 ? 0.3 // M1.4
|
||||||
|
: d == 1.6 ? 0.35 // M1.6
|
||||||
: [0.4, // M2
|
: [0.4, // M2
|
||||||
0.45,// M2.5
|
0.45,// M2.5
|
||||||
0.5, // M3
|
0.5, // M3
|
||||||
|
286
vitamins/bldc_motor.scad
Normal file
@@ -0,0 +1,286 @@
|
|||||||
|
//
|
||||||
|
// NopSCADlib Copyright Chris Palmer 2021
|
||||||
|
// 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/>.
|
||||||
|
//
|
||||||
|
|
||||||
|
//
|
||||||
|
//! Brushless DC electric motor
|
||||||
|
//
|
||||||
|
include <NopSCADlib/core.scad>
|
||||||
|
|
||||||
|
use <NopSCADlib/vitamins/rod.scad>
|
||||||
|
use <NopSCADlib/utils/thread.scad>
|
||||||
|
use <NopSCADlib/utils/tube.scad>
|
||||||
|
|
||||||
|
|
||||||
|
function BLDC_diameter(type) = type[1]; //! Diameter of motor
|
||||||
|
function BLDC_height(type) = type[2]; //! Height of motor including boss, if any, but excluding prop shaft
|
||||||
|
function BLDC_shaft_diameter(type) = type[3]; //! shaft diameter
|
||||||
|
function BLDC_shaft_length(type) = type[4]; //! Total shaft length
|
||||||
|
function BLDC_shaft_offset(type) = type[5]; //! shaft offset from base
|
||||||
|
function BLDC_body_colour(type) = type[6]; //! Body colour
|
||||||
|
function BLDC_base_diameter(type) = type[7]; //! Base diameter
|
||||||
|
function BLDC_base_height_1(type) = type[8]; //! Base height 1
|
||||||
|
function BLDC_base_height_2(type) = type[9]; //! Base height 2
|
||||||
|
function BLDC_base_hole_diameter(type) = type[10]; //! Base hole diameter
|
||||||
|
function BLDC_base_holes(type) = type[11]; //! Base holes
|
||||||
|
function BLDC_base_open(type) = type[12]; //! Base open
|
||||||
|
function BLDC_wire_diameter(type) = type[13]; //! Wire diameter
|
||||||
|
function BLDC_side_colour(type) = type[14]; //! Side colour
|
||||||
|
function BLDC_bell_diameter(type) = type[15]; //! Bell diameter
|
||||||
|
function BLDC_bell_height_1(type) = type[16]; //! Bell height 1
|
||||||
|
function BLDC_bell_height_2(type) = type[17]; //! Bell height 2
|
||||||
|
function BLDC_bell_hole_diameter(type) = type[18]; //! Bell hole diameter
|
||||||
|
function BLDC_bell_holes(type) = type[19]; //! Bell holes
|
||||||
|
function BLDC_bell_spokes(type) = type[20]; //! Bell spoke count
|
||||||
|
function BLDC_boss_diameter(type) = type[21]; //! Boss diameter
|
||||||
|
function BLDC_boss_height(type) = type[22]; //! Boss height
|
||||||
|
function BLDC_prop_shaft_length(type) = type[23]; //! Prop shaft length, including threaded section
|
||||||
|
function BLDC_prop_shaft_diameter(type) = type[24]; //! Diameter of unthreaded portion of prop shaft
|
||||||
|
function BLDC_prop_shaft_thread_length(type) = type[25]; //! Length of threaded section of prop shaft
|
||||||
|
function BLDC_prop_shaft_thread_diameter(type) = type[26]; //! Diameter of threaded section of prop shaft
|
||||||
|
|
||||||
|
bldc_cap_colour = grey(50);
|
||||||
|
bldc_shaft_colour = grey(90);
|
||||||
|
bldc_bearing_colour = grey(80);
|
||||||
|
|
||||||
|
module BLDC(type) { //! Draw specified BLDC motor
|
||||||
|
vitamin(str("BLDC(", type[0], "): Brushless DC motor ", type[0]));
|
||||||
|
|
||||||
|
body_colour = BLDC_body_colour(type);
|
||||||
|
side_colour = BLDC_side_colour(type);
|
||||||
|
body_diameter = BLDC_diameter(type);
|
||||||
|
wall_thickness = 1;
|
||||||
|
|
||||||
|
height = BLDC_height(type) - BLDC_boss_height(type);
|
||||||
|
|
||||||
|
module feet(base_diameter) {
|
||||||
|
holes = BLDC_base_holes(type);
|
||||||
|
hole_count = is_list(holes) ? len(holes) : 4;
|
||||||
|
for(i = [0 : 1 : hole_count - 1]) {
|
||||||
|
spacing = is_list(holes) ? holes[i] : holes;
|
||||||
|
radius = base_diameter / 2 - spacing / 2;
|
||||||
|
rotate(i * 360 / hole_count + (hole_count == 4 ? 45 : 0))
|
||||||
|
difference() {
|
||||||
|
hull() {
|
||||||
|
circle(r = radius);
|
||||||
|
translate([-spacing / 2, 0])
|
||||||
|
circle(r = radius);
|
||||||
|
}
|
||||||
|
translate([-spacing / 2, 0])
|
||||||
|
circle(d = BLDC_base_hole_diameter(type));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module cutout(d1, d2, r, h) {
|
||||||
|
translate_z(-eps)
|
||||||
|
linear_extrude(h + 2 * eps)
|
||||||
|
hull() {
|
||||||
|
translate([d1 / 2, 0])
|
||||||
|
circle(r = r);
|
||||||
|
translate([d2 / 2, -r])
|
||||||
|
square([eps, 2 * r]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module cutout2(d1, r1, d2, r2, h) {
|
||||||
|
translate_z(-eps)
|
||||||
|
linear_extrude(h + 2 * eps)
|
||||||
|
hull() {
|
||||||
|
translate([d1 / 2, 0])
|
||||||
|
circle(r = r1);
|
||||||
|
translate([d2 / 2, 0])
|
||||||
|
circle(r = r2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module base() {
|
||||||
|
base_diameter = BLDC_base_diameter(type);
|
||||||
|
h1 = BLDC_base_height_1(type);
|
||||||
|
h2 = BLDC_base_height_2(type);
|
||||||
|
color(body_colour)
|
||||||
|
if (BLDC_base_open(type)) {
|
||||||
|
linear_extrude(h1)
|
||||||
|
difference() {
|
||||||
|
union() {
|
||||||
|
feet(base_diameter);
|
||||||
|
circle(d = 3 * BLDC_shaft_diameter(type));
|
||||||
|
}
|
||||||
|
circle(d = 2 * BLDC_shaft_diameter(type));
|
||||||
|
}
|
||||||
|
translate_z(h1)
|
||||||
|
cylinder(d = 3 * BLDC_shaft_diameter(type), h = h2);
|
||||||
|
} else {
|
||||||
|
difference() {
|
||||||
|
union() {
|
||||||
|
render(convexity = 8)
|
||||||
|
linear_extrude(h1)
|
||||||
|
difference() {
|
||||||
|
circle(d = base_diameter);
|
||||||
|
circle(d = 2 * BLDC_shaft_diameter(type));
|
||||||
|
BLDC_base_screw_positions(type)
|
||||||
|
circle(d = BLDC_base_hole_diameter(type));
|
||||||
|
}
|
||||||
|
rotate_extrude()
|
||||||
|
polygon([ [base_diameter / 2, 0], [body_diameter / 2, h1], [body_diameter / 2, h1+h2], [body_diameter / 2 - wall_thickness, h1 + h2], [body_diameter / 2 - wall_thickness, h1], [base_diameter / 2, h1] ]);
|
||||||
|
}
|
||||||
|
r = body_diameter > 40 ? 2 : body_diameter * PI / (8 * 3);
|
||||||
|
if (body_diameter > 40) {
|
||||||
|
r = 2;
|
||||||
|
// cutout for wires
|
||||||
|
translate_z(h2 /2)
|
||||||
|
cutout(base_diameter, body_diameter, 6, h1);
|
||||||
|
for (a = [90, 180, 270])
|
||||||
|
rotate(a) {
|
||||||
|
cutout(base_diameter - 2 * r, body_diameter, r, h1 + h2 / 2);
|
||||||
|
for (b = [-90 / 4, 90 / 4])
|
||||||
|
rotate(b)
|
||||||
|
cutout(base_diameter - 5 * r, body_diameter, r, h1 + h2 / 2);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
r = body_diameter * PI / (8 * 3);
|
||||||
|
for (a = [0, 90, 180, 270])
|
||||||
|
rotate(a)
|
||||||
|
cutout(base_diameter, body_diameter, r, h1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
color(bldc_bearing_colour)
|
||||||
|
translate_z(0.25)
|
||||||
|
tube(or = BLDC_shaft_diameter(type), ir = BLDC_shaft_diameter(type) / 2, h = h1, center = false);
|
||||||
|
|
||||||
|
if (show_threads)
|
||||||
|
BLDC_base_screw_positions(type)
|
||||||
|
female_metric_thread(BLDC_base_hole_diameter(type), metric_coarse_pitch(BLDC_base_hole_diameter(type)), h1, center = false, colour = body_colour);
|
||||||
|
|
||||||
|
wire_diameter = BLDC_wire_diameter(type);
|
||||||
|
for (i = [0 : 2])
|
||||||
|
color(wire_diameter >= 3 ? ["yellow", grey(20), "red"][i] : grey(20))
|
||||||
|
translate([body_diameter / 5, (i - 1) * wire_diameter, wire_diameter / 2 + 0.25 + (body_diameter > 40 ? h2/2 : 0)])
|
||||||
|
rotate([0, 90, 0])
|
||||||
|
cylinder(r = wire_diameter / 2, h = body_diameter / 2, center = false);
|
||||||
|
|
||||||
|
} // end module base
|
||||||
|
|
||||||
|
module bell() {
|
||||||
|
bell_diameter = BLDC_bell_diameter(type);
|
||||||
|
h1 = BLDC_bell_height_1(type);
|
||||||
|
h2 = BLDC_bell_height_2(type);
|
||||||
|
gap = BLDC_base_open(type) ? 0 : height > 20 ? 0.5 : 0.25;
|
||||||
|
side_length = height - h2 - h1 - gap - BLDC_base_height_1(type) - BLDC_base_height_2(type);
|
||||||
|
|
||||||
|
color(body_colour) {
|
||||||
|
translate_z(height - h2) {
|
||||||
|
difference() {
|
||||||
|
union() {
|
||||||
|
top_thickness = min(h2, 2);
|
||||||
|
render(convexity = 8)
|
||||||
|
translate_z(h2 - top_thickness)
|
||||||
|
linear_extrude(top_thickness)
|
||||||
|
difference() {
|
||||||
|
circle(d = bell_diameter);
|
||||||
|
if (BLDC_shaft_length(type) > height)
|
||||||
|
circle(d = BLDC_shaft_diameter(type));
|
||||||
|
BLDC_bell_screw_positions(type)
|
||||||
|
circle(d = BLDC_bell_hole_diameter(type));
|
||||||
|
}
|
||||||
|
rotate_extrude()
|
||||||
|
polygon([ [bell_diameter/2, h2], [body_diameter/2, 0], [body_diameter/2, -h1], [body_diameter/2 - wall_thickness, -h1], [body_diameter/2 - wall_thickness, 0], [bell_diameter/2, h2 - top_thickness] ]);
|
||||||
|
}
|
||||||
|
spoke_count = BLDC_bell_spokes(type);
|
||||||
|
if (spoke_count % 4 == 0) {
|
||||||
|
r = body_diameter > 40 ? body_diameter / 15 : 2.5;
|
||||||
|
for (a = [0, 90, 180, 270])
|
||||||
|
rotate(a) {
|
||||||
|
cutout(bell_diameter + 2 * r, body_diameter, r, h2);
|
||||||
|
rotate(45) {
|
||||||
|
cutout(bell_diameter, body_diameter, r, h2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
r1 = bell_diameter * PI / (spoke_count * 3);
|
||||||
|
r2 = body_diameter * PI / (spoke_count * 3);
|
||||||
|
for (i = [0 : 1 : spoke_count - 1])
|
||||||
|
rotate(i * 360 / spoke_count)
|
||||||
|
cutout2(bell_diameter, r1, body_diameter, r2, h2);
|
||||||
|
}
|
||||||
|
} // end difference
|
||||||
|
} // end translate
|
||||||
|
|
||||||
|
if (BLDC_boss_height(type))
|
||||||
|
translate_z(height)
|
||||||
|
tube(or = BLDC_boss_diameter(type)/2, ir = BLDC_shaft_diameter(type)/2, h = BLDC_boss_height(type), center = false);
|
||||||
|
|
||||||
|
if (BLDC_prop_shaft_diameter(type))
|
||||||
|
translate_z(height + BLDC_boss_height(type)) {
|
||||||
|
thread_diameter = BLDC_prop_shaft_thread_diameter(type);
|
||||||
|
unthreaded_length = BLDC_prop_shaft_length(type) - BLDC_prop_shaft_thread_length(type);
|
||||||
|
cylinder(d=BLDC_prop_shaft_diameter(type), h = unthreaded_length);
|
||||||
|
translate_z(unthreaded_length)
|
||||||
|
if (show_threads)
|
||||||
|
male_metric_thread(thread_diameter, metric_coarse_pitch(thread_diameter), BLDC_prop_shaft_thread_length(type), center = false);
|
||||||
|
else
|
||||||
|
cylinder(d = thread_diameter, h = BLDC_prop_shaft_thread_length(type));
|
||||||
|
}
|
||||||
|
} // end colour
|
||||||
|
|
||||||
|
color(side_colour)
|
||||||
|
translate_z(height - h2 - h1 -side_length)
|
||||||
|
tube(body_diameter/2, body_diameter/2 - wall_thickness, side_length, center = false);
|
||||||
|
|
||||||
|
if (show_threads)
|
||||||
|
translate_z(height)
|
||||||
|
BLDC_bell_screw_positions(type)
|
||||||
|
vflip()
|
||||||
|
female_metric_thread(BLDC_bell_hole_diameter(type), metric_coarse_pitch(BLDC_bell_hole_diameter(type)), h2, center = false, colour = body_colour);
|
||||||
|
} // end module bell
|
||||||
|
|
||||||
|
base();
|
||||||
|
bell();
|
||||||
|
|
||||||
|
color(bldc_shaft_colour)
|
||||||
|
translate_z(-BLDC_shaft_offset(type) - eps)
|
||||||
|
not_on_bom()
|
||||||
|
rod(d = BLDC_shaft_diameter(type), l = BLDC_shaft_length(type), center = false);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
module BLDC_screw_positions(holes, n = 4) { //! Screw positions utility function
|
||||||
|
hole_count = is_list(holes) ? len(holes) : 4;
|
||||||
|
for($i = [0 : min(n, hole_count) - 1]) {
|
||||||
|
spacing = is_list(holes) ? holes[$i] : holes;
|
||||||
|
rotate($i * 360 / hole_count)
|
||||||
|
translate([spacing / 2, 0])
|
||||||
|
rotate(-$i * 90)
|
||||||
|
children();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module BLDC_base_screw_positions(type, n = 4) { //! Positions children at the base screw holes
|
||||||
|
if (BLDC_base_holes(type))
|
||||||
|
rotate(is_list(BLDC_base_holes(type)) && len(BLDC_base_holes(type)) == 3 ? 180 : 45)
|
||||||
|
BLDC_screw_positions(BLDC_base_holes(type), n)
|
||||||
|
children();
|
||||||
|
}
|
||||||
|
|
||||||
|
module BLDC_bell_screw_positions(type, n = 4) { //! Positions children at the bell screw holes
|
||||||
|
if (BLDC_bell_holes(type))
|
||||||
|
rotate(is_list(BLDC_bell_holes(type)) && len(BLDC_bell_holes(type)) == 3 ? 30 : 0)
|
||||||
|
BLDC_screw_positions(BLDC_bell_holes(type), n)
|
||||||
|
children();
|
||||||
|
}
|
37
vitamins/bldc_motors.scad
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
//
|
||||||
|
// NopSCADlib Copyright Chris Palmer 2021
|
||||||
|
// 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/>.
|
||||||
|
//
|
||||||
|
|
||||||
|
//
|
||||||
|
// Brushless DC electric motors
|
||||||
|
//
|
||||||
|
// shaft shaft shaft body base holes base side bell holes boss prop shaft thread
|
||||||
|
// diameter height diam length offset colour diam h1 h2 diam position open wire colour diam h1 h1 d pos spokes d h length diam length diam
|
||||||
|
BLDC0603 = ["BLDC0603", 9.0, 8, 1, 15.5, 1, crimson, 10, 1, 1.5, 1.4, [6,6,6], true, 0.8, grey(20), 9, 1, 1, 0, 0, 5, 0, 0, 0, 0, 0, 0];
|
||||||
|
BLDC0802 = ["BLDC0802", 11.5, 9.5, 1.5, 12, 0.5, grey(20), 9, 1, 2, 1.6, [6,6,6], true, 1.0, grey(20), 11, 2, 0.75, 0, 0, 3, 0, 0, 0, 0, 0, 0];
|
||||||
|
BLDC1105 = ["BLDC1105", 14.0, 11.75, 1.5, 11, 0, grey(90), 12.5, 1.6, 1.4, 2, 9, true, 1.0, grey(90), 12, 1, 1, 2, [5,5], 4, 0, 0, 0, 0, 0, 0];
|
||||||
|
BLDC1306 = ["BLDC1306", 17.75, 14.5, 2, 14, 0, crimson, 16, 1.5, 1, 2, 12, false, 1.0, grey(20), 12, 1, 1, 0, 0, 6, 8, 1, 11.5, 5, 6.5, 5];
|
||||||
|
BLDC1804 = ["BLDC1804", 23.0, 12, 2, 11, 0, grey(20), 19, 2.5, 1.5, 2, 12, false, 1.5, grey(20), 18, 1, 2.5, 0, 0, 6, 9, 1, 12, 5, 6, 5];
|
||||||
|
BLDC2205 = ["BLDC2205", 28.0, 17.25, 3, 16, 0, crimson, 26, 2, 3, 3, [19,16,19,16], false, 1.6, grey(20), 22.5, 1, 3.75, 0, 0, 6, 0, 0, 14, 5, 9, 5];
|
||||||
|
BLDC2212 = ["BLDC2212", 28.0, 27, 3, 26, 0, grey(20), 23, 4, 2, 3, [19,16,19,16], false, 2.0, grey(20), 18, 2, 4, 0, 0, 6, 0, 0, 14, 8, 7, 6];
|
||||||
|
BLDC3548 = ["BLDC3548", 35.0, 45, 5, 65.5, 1, gold, 32, 7, 1, 3, [25,19,25,19], false, 3.0, grey(20), 32, 2, 4,2.5, [16,16,16],6,12, 3.4, 0, 0, 0, 0];
|
||||||
|
BLDC4250 = ["BLDC4250", 42.5, 48, 5, 70, 20, crimson, 38, 4, 6, 3, 25, false, 3.5, grey(20), 28, 3, 6, 3, 17, 8, 12, 2, 0, 0, 0, 0];
|
||||||
|
|
||||||
|
bldc_motors = [BLDC0603, BLDC0802, BLDC1105, BLDC1306, BLDC1804, BLDC2205, BLDC2212, BLDC3548, BLDC4250];
|
||||||
|
|
||||||
|
use <bldc_motor.scad>
|
@@ -28,6 +28,7 @@ use <screw.scad>
|
|||||||
function blower_length(type) = type[2]; //! Length of enclosing rectangle
|
function blower_length(type) = type[2]; //! Length of enclosing rectangle
|
||||||
function blower_width(type) = type[3]; //! Width of enclosing rectangle
|
function blower_width(type) = type[3]; //! Width of enclosing rectangle
|
||||||
function blower_depth(type) = type[4]; //! Height
|
function blower_depth(type) = type[4]; //! Height
|
||||||
|
function blower_size(type) = [blower_length(type), blower_width(type), blower_depth(type)]; //! Size
|
||||||
function blower_bore(type) = type[5]; //! The air intake hole diameter
|
function blower_bore(type) = type[5]; //! The air intake hole diameter
|
||||||
function blower_screw(type) = type[6]; //! The type of screws needed
|
function blower_screw(type) = type[6]; //! The type of screws needed
|
||||||
function blower_hub(type) = type[7]; //! Rotor hub diameter
|
function blower_hub(type) = type[7]; //! Rotor hub diameter
|
||||||
|
58
vitamins/box_section.scad
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
//
|
||||||
|
// NopSCADlib Copyright Chris Palmer 2021
|
||||||
|
// 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/>.
|
||||||
|
//
|
||||||
|
|
||||||
|
//
|
||||||
|
//! Box sections.
|
||||||
|
//
|
||||||
|
include <../utils/core/core.scad>
|
||||||
|
include <../utils/tube.scad>
|
||||||
|
|
||||||
|
include <../vitamins/sheets.scad>
|
||||||
|
|
||||||
|
function box_section_material(type) = type[1]; //! Material description
|
||||||
|
function box_section_size(type) = type[2]; //! Size
|
||||||
|
function box_section_thickness(type) = type[3]; //! Wall thickness
|
||||||
|
function box_section_fillet(type) = type[4]; //! Fillet
|
||||||
|
function box_section_colour(type) = type[5]; //! Colour
|
||||||
|
function box_section_colour2(type) = type[6]; //! Colour2, for woven box section
|
||||||
|
function box_section_is_woven(type) = !is_undef(type[6]); //! Box section is woven, eg carbon fiber
|
||||||
|
|
||||||
|
module box_section(type, length, center = true) {
|
||||||
|
vitamin(str("box_section(", type[0], arg(length, 15), "): ", box_section_material(type), ", length ", length, "mm"));
|
||||||
|
|
||||||
|
size = box_section_size(type);
|
||||||
|
thickness = box_section_thickness(type);
|
||||||
|
|
||||||
|
if (box_section_is_woven(type))
|
||||||
|
translate_z(center ? 0 : length / 2) {
|
||||||
|
rotate([0, -90, 90])
|
||||||
|
for (z = [-size.y / 2, size.y / 2 - thickness])
|
||||||
|
translate_z(z)
|
||||||
|
woven_sheet(CF1, thickness, box_section_colour(type), box_section_colour2(type), length, size.x)
|
||||||
|
square([length, size.x], center=true);
|
||||||
|
rotate([0, -90, 0])
|
||||||
|
for (z = [-size.x / 2, size.x / 2 - thickness])
|
||||||
|
translate_z(z)
|
||||||
|
woven_sheet(CF1, thickness, box_section_colour(type), box_section_colour2(type), length, size.y)
|
||||||
|
square([length, size.y], center=true);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
color(box_section_colour(type))
|
||||||
|
rectangular_tube([size.x, size.y, length], center, thickness, box_section_fillet(type));
|
||||||
|
}
|
30
vitamins/box_sections.scad
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
//
|
||||||
|
// NopSCADlib Copyright Chris Palmer 2021
|
||||||
|
// 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/>.
|
||||||
|
//
|
||||||
|
|
||||||
|
//
|
||||||
|
// Box sections
|
||||||
|
//
|
||||||
|
AL12x8x1 = ["AL12x8x1", "Aluminium rectangular box section 12mm x 8mm x 1mm", [12, 8], 1, 0.5, silver, undef];
|
||||||
|
AL20x20x2 = ["AL20x20x2", "Aluminium rectangular box section 20mm x 20mm x 2mm", [20, 20], 2, 0.5, silver, undef];
|
||||||
|
CF10x10x1 = ["CF10x10x1", "Carbon fiber rectangular box section 10mm x 10mm x 1mm", [10, 10], 1, 0.5, grey(35), grey(20)];
|
||||||
|
|
||||||
|
|
||||||
|
box_sections = [AL12x8x1, AL20x20x2, CF10x10x1];
|
||||||
|
|
||||||
|
use <box_section.scad>
|
@@ -26,89 +26,138 @@ use <../utils/round.scad>
|
|||||||
|
|
||||||
function gs_diameter(type) = type[2]; //! Can diameter
|
function gs_diameter(type) = type[2]; //! Can diameter
|
||||||
function gs_height(type) = type[3]; //! Can height
|
function gs_height(type) = type[3]; //! Can height
|
||||||
function gs_pitch(type) = type[4]; //! Screw pitch
|
function gs_radius(type) = type[4]; //! Top - or bottom + corner radius
|
||||||
function gs_lug_w(type) = type[5]; //! Screw lug width
|
function gs_motor(type) = type[5]; //! Motor diameter and height if separate from gearbox
|
||||||
function gs_lug_t(type) = type[6]; //! Screw lug thickness
|
function gs_pitch(type) = type[6]; //! Screw pitch
|
||||||
function gs_hole_d(type) = type[7]; //! Screw hole diameter
|
function gs_lug_w(type) = type[7]; //! Screw lug width
|
||||||
function gs_offset(type) = type[8]; //! Offset of the shaft from the centre of the can
|
function gs_lug_t(type) = type[8]; //! Screw lug thickness
|
||||||
function gs_boss_d(type) = type[9]; //! Boss around the shaft diameter
|
function gs_hole_d(type) = type[9]; //! Screw hole diameter
|
||||||
function gs_boss_h(type) = type[10]; //! Boss around the shaft height
|
function gs_offset(type) = type[10]; //! Offset of the shaft from the centre of the can
|
||||||
function gs_shaft_d(type) = type[11]; //! Shaft diameter
|
function gs_boss_d(type) = type[11]; //! Boss around the shaft diameter
|
||||||
function gs_shaft_flat(type) = type[12]; //! Shaft width across the flats
|
function gs_boss_h(type) = type[12]; //! Boss around the shaft height
|
||||||
function gs_shaft_length(type) = type[13]; //! Shaft length
|
function gs_shaft_d(type) = type[13]; //! Shaft diameter
|
||||||
function gs_flat_length(type) = type[14]; //! Shaft flat length
|
function gs_shaft_flat(type) = type[14]; //! Shaft width across the flats
|
||||||
function gs_bulge_w(type) = type[15]; //! Plastic bulge width
|
function gs_shaft_length(type) = type[15]; //! Shaft length
|
||||||
function gs_bulge_d(type) = type[16]; //! Plastic bulge depth from centre
|
function gs_flat_length(type) = type[16]; //! Shaft flat length
|
||||||
function gs_bulge_h(type) = type[17]; //! Plastic bulge height
|
function gs_bulge(type) = type[17]; //! Plastic bulge width, depth, height, z offset
|
||||||
function gs_bulge2_w(type) = type[18]; //! Plastic rear bulge width
|
function gs_bulge2(type) = type[18]; //! Plastic rear bulge width, depth, height
|
||||||
function gs_bulge2_d(type) = type[19]; //! Plastic rear bulge depth from centre
|
function gs_wire_d(type) = type[19]; //! Wire diameter
|
||||||
function gs_bulge2_h(type) = type[20]; //! Plastic rear bulge height
|
function gs_wires(type) = type[20]; //! Wire colours and grouping
|
||||||
|
|
||||||
module geared_stepper_screw_positions(type) //! Place children at the screw positions
|
module geared_stepper_screw_positions(type) //! Place children at the screw positions
|
||||||
for(side = [-1, 1])
|
for(side = [-1, 1])
|
||||||
translate([side * gs_pitch(type) / 2, -gs_offset(type)])
|
translate([side * gs_pitch(type) / 2, -gs_offset(type)])
|
||||||
children();
|
children();
|
||||||
|
|
||||||
|
motor_colour = "#9BA2AC";
|
||||||
|
gearbox_colour = "#FFF7EE";
|
||||||
|
|
||||||
module geared_stepper(type) { //! Draw the specified geared stepper
|
module geared_stepper(type) { //! Draw the specified geared stepper
|
||||||
vitamin(str("geared_stepper(", type[0], "): Geared stepper - ", type[1]));
|
vitamin(str("geared_stepper(", type[0], "): Geared stepper - ", type[1]));
|
||||||
|
|
||||||
radius = gs_diameter(type) / 2;
|
radius = gs_diameter(type) / 2;
|
||||||
height = gs_height(type);
|
motor = gs_motor(type);
|
||||||
|
height = gs_height(type) - motor.y;
|
||||||
offset = gs_offset(type);
|
offset = gs_offset(type);
|
||||||
color("silver") {
|
lug_t = gs_lug_t(type);
|
||||||
translate([0, -offset])
|
bulge = gs_bulge(type);
|
||||||
rounded_cylinder(r = radius, h = height, r2 = 1);
|
bulge_z = bulge[3];
|
||||||
|
bulge2 = gs_bulge2(type);
|
||||||
|
wires = gs_wires(type);
|
||||||
|
|
||||||
|
// Gearbox
|
||||||
|
color(motor.y ? gearbox_colour : motor_colour) {
|
||||||
|
difference() {
|
||||||
|
rad = gs_radius(type);
|
||||||
|
translate([0, -offset])
|
||||||
|
if(rad >= 0)
|
||||||
|
rounded_cylinder(r = radius, h = height, r2 = rad);
|
||||||
|
else
|
||||||
|
translate_z(height)
|
||||||
|
vflip()
|
||||||
|
rounded_cylinder(r = radius, h = height, r2 = -rad);
|
||||||
|
|
||||||
|
if(!lug_t)
|
||||||
|
geared_stepper_screw_positions(type)
|
||||||
|
cylinder(d = gs_hole_d(type), h = 10, center = true);
|
||||||
|
}
|
||||||
|
|
||||||
cylinder(d = gs_boss_d(type), h = 2 * gs_boss_h(type), center = true);
|
cylinder(d = gs_boss_d(type), h = 2 * gs_boss_h(type), center = true);
|
||||||
|
|
||||||
linear_extrude(gs_lug_t(type))
|
if(lug_t)
|
||||||
difference() {
|
linear_extrude(lug_t)
|
||||||
hull()
|
difference() {
|
||||||
|
hull()
|
||||||
|
geared_stepper_screw_positions(type)
|
||||||
|
circle(d = gs_lug_w(type));
|
||||||
|
|
||||||
geared_stepper_screw_positions(type)
|
geared_stepper_screw_positions(type)
|
||||||
circle(d = gs_lug_w(type));
|
circle(d = gs_hole_d(type));
|
||||||
|
}
|
||||||
|
|
||||||
geared_stepper_screw_positions(type)
|
if(!bulge_z)
|
||||||
circle(d = gs_hole_d(type));
|
translate([0, -offset - radius, eps])
|
||||||
}
|
cube([bulge.x - 2, 2 * (bulge.y - radius) - 2, 2 * eps], center = true);
|
||||||
|
|
||||||
translate([0, -offset - radius, eps])
|
|
||||||
cube([gs_bulge_w(type) - 2, 2 * (gs_bulge_d(type) - radius) - 2, 2 * eps], center = true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Motor
|
||||||
|
if(motor.y)
|
||||||
|
color("#9BA2AC")
|
||||||
|
translate([0, -offset, height])
|
||||||
|
rotate_extrude()
|
||||||
|
union() {
|
||||||
|
r = motor.x / 2;
|
||||||
|
rad = motor[2];
|
||||||
|
square([r - rad, rad]);
|
||||||
|
|
||||||
|
translate([0, motor.y - rad])
|
||||||
|
square([r - rad, rad]);
|
||||||
|
|
||||||
|
hull()
|
||||||
|
for(y = [2 * rad, motor.y - 2 * rad])
|
||||||
|
translate([r - rad, y])
|
||||||
|
circle(rad);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Shaft
|
||||||
|
f = gs_shaft_flat(type);
|
||||||
|
two_flats = f < 0;
|
||||||
vflip()
|
vflip()
|
||||||
color(brass) {
|
color(two_flats ? brass : gearbox_colour) {
|
||||||
d = gs_shaft_d(type);
|
d = gs_shaft_d(type);
|
||||||
h = gs_shaft_length(type);
|
h = gs_shaft_length(type);
|
||||||
linear_extrude(h)
|
linear_extrude(h)
|
||||||
intersection() {
|
intersection() {
|
||||||
circle(d = d);
|
circle(d = d);
|
||||||
|
|
||||||
square([d + 1, gs_shaft_flat(type)], center = true);
|
translate([0, two_flats ? 0 : (f - d) / 2])
|
||||||
|
square([d + 1, abs(f)], center = true);
|
||||||
}
|
}
|
||||||
|
|
||||||
cylinder(d = d, h = h - gs_flat_length(type));
|
cylinder(d = d, h = h - gs_flat_length(type));
|
||||||
}
|
}
|
||||||
|
|
||||||
color("skyblue") {
|
// Wire block
|
||||||
h1 = gs_bulge_h(type);
|
color(bulge_z ? "white" : "skyblue") {
|
||||||
translate([0, - offset - radius, eps])
|
translate([0, - offset - radius, eps + bulge[3]])
|
||||||
rounded_rectangle([gs_bulge_w(type), 2 * (gs_bulge_d(type) - radius), h1], 0.5, center = false);
|
rounded_rectangle([bulge.x, 2 * (bulge.y - radius), bulge.z], 0.5, center = false);
|
||||||
|
|
||||||
h2 = gs_bulge2_h(type);
|
if(bulge2.z)
|
||||||
translate([0, - offset, h1 + 1 - h2])
|
translate([0, - offset, bulge.z + 1 - bulge2.z])
|
||||||
linear_extrude(h2)
|
linear_extrude(bulge2.z)
|
||||||
round(0.5)
|
round(0.5)
|
||||||
intersection() {
|
intersection() {
|
||||||
circle(gs_bulge2_d(type));
|
circle(bulge2.y);
|
||||||
|
|
||||||
translate([0, -50])
|
translate([0, -50])
|
||||||
square([gs_bulge2_w(type), 100], center = true);
|
square([bulge2.x, 100], center = true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
translate_z(2.5)
|
wire_d = gs_wire_d(type);
|
||||||
for(i = [0 : 4])
|
for(j = [0 : len(wires) - 1], i = [0 : len(wires[j]) - 1])
|
||||||
translate([i - 2.5, 0])
|
translate([(i - len(wires[j]) / 2 + 0.5) * wire_d, 0, bulge_z + (j ? bulge.z - 2.5 : 2.5)])
|
||||||
rotate([90, 0, 0])
|
rotate([90, 0, 0])
|
||||||
color(["yellow", "orange", "red", "pink", "blue"][i])
|
color(wires[j][i])
|
||||||
cylinder(d = 1, h = radius + offset + 10);
|
cylinder(d = wire_d, h = radius + offset + 10);
|
||||||
}
|
}
|
||||||
|
@@ -20,8 +20,16 @@
|
|||||||
//
|
//
|
||||||
//! Geared tin can steppers
|
//! Geared tin can steppers
|
||||||
//
|
//
|
||||||
28BYJ_48 = ["28BYJ_48", "28BYJ-48 5V", 28, 19, 35, 7, 0.85, 4.2, 8, 9, 1.5, 5, 3, 10, 6, 14.7, 17, 16.5, 17.7, 15.5, 13.8 ];
|
// d h r m p l l h o b b s f s f b b w
|
||||||
|
// i e a o i u u o f o o h l h l u u i
|
||||||
|
// a i d t t g g l f s s a a a a l l r
|
||||||
|
// g i o c e s s s f t f t g g e
|
||||||
|
// h u r h w t e t t e e
|
||||||
|
// t s d t d h w l 2 d
|
||||||
|
// d h r d l w d h z w d h
|
||||||
|
28BYJ_48 = ["28BYJ_48", "28BYJ-48 5V", 28, 19, 1, [ 0, 0, 0], 35, 7, 0.85, 4.2, 8, 9, 1.5, 5,-3.0, 10, 6, [14.7, 17, 16.5, 0], [17.7, 15.5, 13.8], 1, [["yellow", "orange", "red", "pink", "blue"]] ];
|
||||||
|
35BYGHJ75 = ["35BYGHJ75", "35BYGHJ75 0.4A",37, 37, -2, [35, 22, 1], 27, 0, 0, 3.0, 7, 12, 3.0, 5, 4.5, 17, 10, [ 7.7, 20.7, 9.25, 21], [ 0, 0, 0], 1.3,[["brown", "red"], ["yellow", "green"]] ];
|
||||||
|
|
||||||
geared_steppers = [28BYJ_48];
|
geared_steppers = [28BYJ_48, 35BYGHJ75];
|
||||||
|
|
||||||
use <geared_stepper.scad>
|
use <geared_stepper.scad>
|
||||||
|
@@ -55,7 +55,7 @@ outlet_spades = [[spade4p8ll, 8, -7, -2, 90],
|
|||||||
// w h r t
|
// w h r t
|
||||||
IEC_fused_inlet = ["IEC_fused_inlet", "IEC fused inlet JR-101-1F", M3_cs_cap_screw, 36, 27, 16, 31, 3, 28, 31, 2, 2.0, 30, 33, 4, 3.0, 44, 15, fused_spades, false ];
|
IEC_fused_inlet = ["IEC_fused_inlet", "IEC fused inlet JR-101-1F", M3_cs_cap_screw, 36, 27, 16, 31, 3, 28, 31, 2, 2.0, 30, 33, 4, 3.0, 44, 15, fused_spades, false ];
|
||||||
IEC_fused_inlet2= ["IEC_fused_inlet2","IEC fused inlet old", M3_cs_cap_screw, 36, 27, 14, 31, 3, 28, 31, 2, 2.5, 30, 33, 4, 2.5, 44, 18, fused_spades2, false ];
|
IEC_fused_inlet2= ["IEC_fused_inlet2","IEC fused inlet old", M3_cs_cap_screw, 36, 27, 14, 31, 3, 28, 31, 2, 2.5, 30, 33, 4, 2.5, 44, 18, fused_spades2, false ];
|
||||||
IEC_320_C14_switched_fused_inlet = ["IEC_switched_fused_inlet", "IEC320 C14 switched fused inlet module",
|
IEC_320_C14_switched_fused_inlet = ["IEC_320_C14_switched_fused_inlet", "IEC320 C14 switched fused inlet module",
|
||||||
M3_cs_cap_screw, 40, 27, 16,46.8,3,28, 48, 2.4, 1.0, 33, 57, 4, 3.0, 48,16.5, iec320c14FusedSwitchedSpades, false ];
|
M3_cs_cap_screw, 40, 27, 16,46.8,3,28, 48, 2.4, 1.0, 33, 57, 4, 3.0, 48,16.5, iec320c14FusedSwitchedSpades, false ];
|
||||||
IEC_inlet = ["IEC_inlet", "IEC inlet", M3_cs_cap_screw, 40, 28, 18, 20, 3, 28, 20.5, 4, 2.5, 37, 23, 1, 2.5, 48, 14, inlet_spades, false ];
|
IEC_inlet = ["IEC_inlet", "IEC inlet", M3_cs_cap_screw, 40, 28, 18, 20, 3, 28, 20.5, 4, 2.5, 37, 23, 1, 2.5, 48, 14, inlet_spades, false ];
|
||||||
IEC_inlet_atx = ["IEC_inlet_atx", "IEC inlet for ATX", M3_cs_cap_screw, 40, 27, 18, 19, 3, 30.5, 22, 2, 2.0, 30.5, 22, 2, 4.0, 50, 15, atx_spades, false ];
|
IEC_inlet_atx = ["IEC_inlet_atx", "IEC inlet for ATX", M3_cs_cap_screw, 40, 27, 18, 19, 3, 30.5, 22, 2, 2.0, 30.5, 22, 2, 4.0, 50, 15, atx_spades, false ];
|
||||||
|
@@ -32,7 +32,7 @@ function leadnut_flange_t(type) = type[6]; //! Flange thickness
|
|||||||
function leadnut_flange_offset(type) = type[7]; //! Offset of the flange from the top
|
function leadnut_flange_offset(type) = type[7]; //! Offset of the flange from the top
|
||||||
function leadnut_holes(type) = type[8]; //! The number of screw holes
|
function leadnut_holes(type) = type[8]; //! The number of screw holes
|
||||||
function leadnut_hole_dia(type) = type[9]; //! The diameter of the screw holes
|
function leadnut_hole_dia(type) = type[9]; //! The diameter of the screw holes
|
||||||
function leadnut_hole_pitch(type) = type[10]; //! The radia pitch of the screw holes
|
function leadnut_hole_pitch(type) = type[10]; //! The radial pitch of the screw holes
|
||||||
function leadnut_screw(type) = type[11]; //! The type of the fixing screws
|
function leadnut_screw(type) = type[11]; //! The type of the fixing screws
|
||||||
function leadnut_pitch(type) = type[12]; //! Screw pitch
|
function leadnut_pitch(type) = type[12]; //! Screw pitch
|
||||||
function leadnut_lead(type) = type[13]; //! Screw lead
|
function leadnut_lead(type) = type[13]; //! Screw lead
|
||||||
|
@@ -55,6 +55,9 @@ function pcb_polygon(type) = type[14]; //! Optional outline polygon for odd
|
|||||||
function pcb_screw(type, cap = hs_cap) = Len(type[15]) ? type[15] : find_screw(cap, screw_smaller_than(pcb_hole_d(type))); //! Mounting screw type
|
function pcb_screw(type, cap = hs_cap) = Len(type[15]) ? type[15] : find_screw(cap, screw_smaller_than(pcb_hole_d(type))); //! Mounting screw type
|
||||||
function pcb_size(type) = [pcb_length(type), pcb_width(type), pcb_thickness(type)]; //! Length, width and thickness in a vector
|
function pcb_size(type) = [pcb_length(type), pcb_width(type), pcb_thickness(type)]; //! Length, width and thickness in a vector
|
||||||
|
|
||||||
|
function pcb_component(type, name, index = 0) = //! Return the component specified by name and index
|
||||||
|
[for(component = pcb_components(type)) if(component[3] == name) component][index];
|
||||||
|
|
||||||
|
|
||||||
function pcb_grid_pos(type, x, y, z = 0) = //! Returns a pcb grid position
|
function pcb_grid_pos(type, x, y, z = 0) = //! Returns a pcb grid position
|
||||||
[-pcb_length(type) / 2 + pcb_grid(type).x + 2.54 * x,
|
[-pcb_length(type) / 2 + pcb_grid(type).x + 2.54 * x,
|
||||||
|
@@ -44,6 +44,7 @@ function psu_name(type) = type[1]; //! The part name
|
|||||||
function psu_length(type) = type[2]; //! Length
|
function psu_length(type) = type[2]; //! Length
|
||||||
function psu_width(type) = type[3]; //! Width
|
function psu_width(type) = type[3]; //! Width
|
||||||
function psu_height(type) = type[4]; //! Height
|
function psu_height(type) = type[4]; //! Height
|
||||||
|
function psu_size(type) = [psu_length(type), psu_width(type), psu_height(type)]; //! Size
|
||||||
function psu_screw(type) = type[5]; //! Screw type
|
function psu_screw(type) = type[5]; //! Screw type
|
||||||
function psu_screw_hole_radius(type) = type[6]; //! Clearance hole for screw, bigger than normal on ATX
|
function psu_screw_hole_radius(type) = type[6]; //! Clearance hole for screw, bigger than normal on ATX
|
||||||
function atx_psu(type) = type[7]; //! True if an ATX style PSU
|
function atx_psu(type) = type[7]; //! True if an ATX style PSU
|
||||||
|
@@ -108,6 +108,7 @@ No2_screw = ["No2", "No2 pan wood", hs_pan, 2.2, 4.2, 1.7, 0, 0
|
|||||||
No4_screw = ["No4", "No4 pan wood", hs_pan, 3.0, 5.5, 2.0, 0, 0, 0 ,M3p5_washer, false, No4_pilot_radius, No4_clearance_radius];
|
No4_screw = ["No4", "No4 pan wood", hs_pan, 3.0, 5.5, 2.0, 0, 0, 0 ,M3p5_washer, false, No4_pilot_radius, No4_clearance_radius];
|
||||||
No6_screw = ["No6", "No6 pan wood", hs_pan, 3.5, 6.7, 2.2, 0, 0, 0 , M4_washer, false, No6_pilot_radius, No6_clearance_radius];
|
No6_screw = ["No6", "No6 pan wood", hs_pan, 3.5, 6.7, 2.2, 0, 0, 0 , M4_washer, false, No6_pilot_radius, No6_clearance_radius];
|
||||||
No6_cs_screw = ["No6_cs", "No6 cs wood", hs_cs, 3.5, 7.0, 0, 0, 0, 0, M4_washer, false, No6_pilot_radius, No6_clearance_radius];
|
No6_cs_screw = ["No6_cs", "No6 cs wood", hs_cs, 3.5, 7.0, 0, 0, 0, 0, M4_washer, false, No6_pilot_radius, No6_clearance_radius];
|
||||||
|
No8_screw = ["No8", "No8 pan wood", hs_pan, 4.2, 8.2, 3.05, 0, 0, 0 , M5_washer, false, No8_pilot_radius, No8_clearance_radius];
|
||||||
|
|
||||||
screw_lists = [
|
screw_lists = [
|
||||||
[ M2_cap_screw, M2p5_cap_screw, M3_cap_screw, M4_cap_screw, M5_cap_screw, M6_cap_screw, M8_cap_screw],
|
[ M2_cap_screw, M2p5_cap_screw, M3_cap_screw, M4_cap_screw, M5_cap_screw, M6_cap_screw, M8_cap_screw],
|
||||||
@@ -116,7 +117,7 @@ screw_lists = [
|
|||||||
[ M2_dome_screw, 0, M3_dome_screw, M4_dome_screw, M5_dome_screw],
|
[ M2_dome_screw, 0, M3_dome_screw, M4_dome_screw, M5_dome_screw],
|
||||||
[ 0, 0, M3_hex_screw, M4_hex_screw, M5_hex_screw, M6_hex_screw, M8_hex_screw],
|
[ 0, 0, M3_hex_screw, M4_hex_screw, M5_hex_screw, M6_hex_screw, M8_hex_screw],
|
||||||
[ 0, M2p5_pan_screw, M3_pan_screw, M4_pan_screw, M5_pan_screw, M6_pan_screw, No632_pan_screw],
|
[ 0, M2p5_pan_screw, M3_pan_screw, M4_pan_screw, M5_pan_screw, M6_pan_screw, No632_pan_screw],
|
||||||
[ No2_screw, 0, No4_screw, No6_screw, No6_cs_screw],
|
[ No2_screw, 0, No4_screw, No6_screw, No8_screw, No6_cs_screw],
|
||||||
[ 0, 0, M3_grub_screw, M4_grub_screw]
|
[ 0, 0, M3_grub_screw, M4_grub_screw]
|
||||||
];
|
];
|
||||||
|
|
||||||
|
@@ -30,7 +30,7 @@ function ziptie_latch(type) = type[3]; //! Latch dimensions
|
|||||||
function ziptie_colour(type) = type[4]; //! Colour
|
function ziptie_colour(type) = type[4]; //! Colour
|
||||||
function ziptie_tail(type) = type[5]; //! The length without teeth
|
function ziptie_tail(type) = type[5]; //! The length without teeth
|
||||||
|
|
||||||
module ziptie(type, r, t = 0) //! Draw specified ziptie wrapped around radius `r` and optionally through panel thickness `t`
|
module ziptie(type, r = 5, t = 0) //! Draw specified ziptie wrapped around radius `r` and optionally through panel thickness `t`
|
||||||
{
|
{
|
||||||
latch = ziptie_latch(type);
|
latch = ziptie_latch(type);
|
||||||
lx = latch.x / 2;
|
lx = latch.x / 2;
|
||||||
@@ -50,7 +50,7 @@ module ziptie(type, r, t = 0) //! Draw specified ziptie wrapped around radius `r
|
|||||||
len = length <= 100 ? 100 : length;
|
len = length <= 100 ? 100 : length;
|
||||||
width = ziptie_width(type);
|
width = ziptie_width(type);
|
||||||
|
|
||||||
vitamin(str("ziptie(", type[0], ", ", r, "): Ziptie ", width, "mm x ", len, "mm min length"));
|
vitamin(str("ziptie(", type[0], "): Ziptie ", width, "mm x ", len, "mm min length"));
|
||||||
|
|
||||||
color(ziptie_colour(type)){
|
color(ziptie_colour(type)){
|
||||||
linear_extrude(width, center = true)
|
linear_extrude(width, center = true)
|
||||||
|