Compare commits
40 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
a7dde2d4e2 | ||
|
56390bf8dd | ||
|
53f0bbcd6e | ||
|
f2ec3e71f4 | ||
|
c1b5bd1b87 | ||
|
268c066965 | ||
|
fd8712d6bf | ||
|
b6a32b6b41 | ||
|
0738893510 | ||
|
849bc479cc | ||
|
86d7e0f124 | ||
|
c897060726 | ||
|
b2c2fc668b | ||
|
4914f90994 | ||
|
2210396234 | ||
|
2eef050f60 | ||
|
23a64f238d | ||
|
a8422a6aa6 | ||
|
b56ddea1e3 | ||
|
c16a1c3804 | ||
|
245b158f1d | ||
|
60628dfec0 | ||
|
f7db793c74 | ||
|
53292c9f89 | ||
|
bd60b50b09 | ||
|
4d51cb73f3 | ||
|
3b77c97532 | ||
|
4442042197 | ||
|
4e233e5e9d | ||
|
675953d334 | ||
|
9527fa1c1f | ||
|
3f209cbdd3 | ||
|
7b76aceaad | ||
|
4edd08977f | ||
|
a1d385f9ec | ||
|
fc17b52518 | ||
|
9fbdb82991 | ||
|
7706716fa2 | ||
|
343351155c | ||
|
c41b1fa115 |
@@ -233,3 +233,33 @@ Vitamins are only ever previewed, so they are optimised to draw quickly in F5 an
|
||||
In OpenCSG 3D difference and intersection are relatively slow and the negative volumes interfere with nearby objects when they are composed into assemblies. For this reason as much
|
||||
as possible is done by unioning primitives and extruded 2D shapes. Any 3D differences or intersections are wrapped in ```render()``` so that CGAL will compute a polyhedron
|
||||
that is cached and reused. This will be very slow the first time it renders but very fast afterwards.
|
||||
|
||||
### Panels and Platters
|
||||
|
||||
The ```stls``` and ```dxfs``` scripts produce a file for each part but often it is desirable to print or route collections of parts laid out together.
|
||||
This can be done by adding scad files to folders called ```platters``` for STL files and ```panels``` for DXF files.
|
||||
These can aggregate and lay out parts by including ```NopSCADlib/core.scad``` and using modules ```use_stl(name)``` and ```use_dxf(name)```.
|
||||
These modules import the already generated singular STL and DXF files, so they are relatively fast. The name does not include the suffix.
|
||||
The scad files typically also need to include other files from the project to get the dimensions of the parts to calculate their positions.
|
||||
|
||||
The composite part files have the same name as the scad file that generates them, with the suffix changed to ```.stl``` or ```.dxf```.
|
||||
|
||||
The generated files are placed in ```stls/printed``` and ```dxfs/routed```.
|
||||
Any parts that are not covered by the platters / panels are copied into the ```printed``` / ```routed``` directories, so that they contain everything to be made.
|
||||
|
||||
### Multiple configurations
|
||||
|
||||
Some parametric designs might have several configurations, for example a 3D printer with different size options. If several configurations need to be supported at the
|
||||
same time multiple sets of BOMS, STLS and DXFs need to be generated in separate diectories. NopSCADlib supports this by having multiple configuration files named
|
||||
```config_<target_name>.scad```. All the scripts take an optional first parameter that selects one of these config files by specifying ```target_name```.
|
||||
|
||||
The target config file is selected by generating ```target.scad``` that includes ```config_<target_name>.scad```.
|
||||
The rest of the project includes ```target.scad``` to use the configuration.
|
||||
Additionally all the generated file directories (assemblies, bom, stls, dxfs, etc.) are placed in a sub-directory called ```<target_name>```.
|
||||
|
||||
### Other libraries
|
||||
|
||||
The build scripts need to be able to locate the source files where the modules to generate the STL files and assemblies reside. They will search all the scad files
|
||||
in the project plus any ```printed``` directories outside the project. This covers the printed parts in NopSCADlib but also allows other libraries of printed parts.
|
||||
|
||||
Other libraries of vitamins and utilities can be used provided they follow the same convensions of NopSCADlib. The build scripts don't need to search those.
|
||||
|
Before Width: | Height: | Size: 187 KiB After Width: | Height: | Size: 200 KiB |
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 33 KiB |
@@ -35,7 +35,14 @@ $extrusion_width = 0.5;
|
||||
$pp1_colour = "dimgrey";
|
||||
$pp2_colour = [0.9, 0.9, 0.9];
|
||||
|
||||
include <NopSCADlib/lib.scad>
|
||||
include <NopSCADlib/core.scad>
|
||||
include <NopSCADlib/vitamins/iecs.scad>
|
||||
include <NopSCADlib/vitamins/mains_sockets.scad>
|
||||
include <NopSCADlib/vitamins/tubings.scad>
|
||||
|
||||
use <NopSCADlib/vitamins/insert.scad>
|
||||
use <NopSCADlib/vitamins/wire.scad>
|
||||
use <NopSCADlib/vitamins/jack.scad>
|
||||
use <NopSCADlib/printed/foot.scad>
|
||||
|
||||
echo(extrusion_width = extrusion_width, layer_height = layer_height);
|
||||
|
Before Width: | Height: | Size: 108 KiB After Width: | Height: | Size: 107 KiB |
BIN
gallery/EnviroPlus.png
Normal file
After Width: | Height: | Size: 121 KiB |
Before Width: | Height: | Size: 124 KiB After Width: | Height: | Size: 179 KiB |
Before Width: | Height: | Size: 169 KiB After Width: | Height: | Size: 169 KiB |
Before Width: | Height: | Size: 280 KiB After Width: | Height: | Size: 280 KiB |
Before Width: | Height: | Size: 291 KiB After Width: | Height: | Size: 291 KiB |
Before Width: | Height: | Size: 286 KiB After Width: | Height: | Size: 287 KiB |
Before Width: | Height: | Size: 230 KiB After Width: | Height: | Size: 230 KiB |
Before Width: | Height: | Size: 206 KiB After Width: | Height: | Size: 205 KiB |
Before Width: | Height: | Size: 207 KiB After Width: | Height: | Size: 207 KiB |
Before Width: | Height: | Size: 198 KiB After Width: | Height: | Size: 198 KiB |
@@ -6,6 +6,13 @@ Arduino thermostat to control a beer fridge to use it as an environmental chambe
|
||||

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

|
||||
|
||||
|
||||
<a name="TOP"></a>
|
||||
## FilamentDryBox
|
||||
A small fan oven with a spool holder to keep the filament warm and dry.
|
||||
|
4
lib.scad
@@ -32,9 +32,12 @@ include <vitamins/buttons.scad>
|
||||
include <vitamins/components.scad>
|
||||
include <vitamins/displays.scad>
|
||||
include <vitamins/extrusions.scad>
|
||||
include <vitamins/extrusion_brackets.scad>
|
||||
include <vitamins/geared_steppers.scad>
|
||||
include <vitamins/green_terminals.scad>
|
||||
include <vitamins/hot_ends.scad>
|
||||
include <vitamins/inserts.scad>
|
||||
include <vitamins/kp_pillow_blocks.scad>
|
||||
include <vitamins/ldrs.scad>
|
||||
include <vitamins/leadnuts.scad>
|
||||
include <vitamins/leds.scad>
|
||||
@@ -42,6 +45,7 @@ include <vitamins/light_strips.scad>
|
||||
include <vitamins/mains_sockets.scad>
|
||||
include <vitamins/modules.scad>
|
||||
include <vitamins/pillars.scad>
|
||||
include <vitamins/pin_headers.scad>
|
||||
include <vitamins/pulleys.scad>
|
||||
include <vitamins/ring_terminals.scad>
|
||||
include <vitamins/rails.scad>
|
||||
|
BIN
libtest.png
Before Width: | Height: | Size: 781 KiB After Width: | Height: | Size: 781 KiB |
51
libtest.scad
@@ -29,6 +29,7 @@ use <tests/blowers.scad>
|
||||
use <tests/bulldogs.scad>
|
||||
use <tests/buttons.scad>
|
||||
use <tests/cable_strips.scad>
|
||||
use <tests/circlips.scad>
|
||||
use <tests/components.scad>
|
||||
use <tests/d_connectors.scad>
|
||||
use <tests/displays.scad>
|
||||
@@ -38,13 +39,13 @@ use <tests/fans.scad>
|
||||
use <tests/fuseholder.scad>
|
||||
use <tests/geared_steppers.scad>
|
||||
use <tests/hot_ends.scad>
|
||||
use <tests/iecs.scad>
|
||||
use <tests/IECs.scad>
|
||||
use <tests/inserts.scad>
|
||||
use <tests/jack.scad>
|
||||
use <tests/kp_pillow_blocks.scad>
|
||||
use <tests/KP_pillow_blocks.scad>
|
||||
use <tests/leadnuts.scad>
|
||||
use <tests/leds.scad>
|
||||
use <tests/ldrs.scad>
|
||||
use <tests/LDRs.scad>
|
||||
use <tests/LEDs.scad>
|
||||
use <tests/light_strips.scad>
|
||||
use <tests/linear_bearings.scad>
|
||||
use <tests/meter.scad>
|
||||
@@ -53,22 +54,22 @@ use <tests/modules.scad>
|
||||
use <tests/nuts.scad>
|
||||
use <tests/o_ring.scad>
|
||||
use <tests/opengrab.scad>
|
||||
use <tests/pcbs.scad>
|
||||
use <tests/PCBs.scad>
|
||||
use <tests/pillars.scad>
|
||||
use <tests/psus.scad>
|
||||
use <tests/PSUs.scad>
|
||||
use <tests/pulleys.scad>
|
||||
use <tests/rails.scad>
|
||||
use <tests/ring_terminals.scad>
|
||||
use <tests/rockers.scad>
|
||||
use <tests/rod.scad>
|
||||
use <tests/screws.scad>
|
||||
use <tests/scs_bearing_blocks.scad>
|
||||
use <tests/SCS_bearing_blocks.scad>
|
||||
use <tests/sealing_strip.scad>
|
||||
use <tests/sheets.scad>
|
||||
use <tests/sk_brackets.scad>
|
||||
use <tests/SK_brackets.scad>
|
||||
use <tests/spades.scad>
|
||||
use <tests/springs.scad>
|
||||
use <tests/ssrs.scad>
|
||||
use <tests/SSRs.scad>
|
||||
use <tests/stepper_motors.scad>
|
||||
use <tests/toggles.scad>
|
||||
use <tests/transformers.scad>
|
||||
@@ -90,14 +91,14 @@ use <tests/fixing_block.scad>
|
||||
use <tests/flat_hinge.scad>
|
||||
use <tests/foot.scad>
|
||||
use <tests/handle.scad>
|
||||
use <tests/pcb_mount.scad>
|
||||
use <tests/PCB_mount.scad>
|
||||
use <tests/printed_box.scad>
|
||||
use <tests/ribbon_clamp.scad>
|
||||
use <tests/screw_knob.scad>
|
||||
use <tests/socket_box.scad>
|
||||
use <tests/strap_handle.scad>
|
||||
use <tests/ssr_shroud.scad>
|
||||
use <tests/psu_shroud.scad>
|
||||
use <tests/SSR_shroud.scad>
|
||||
use <tests/PSU_shroud.scad>
|
||||
|
||||
x0 = 0;
|
||||
x1 = x0 + 100;
|
||||
@@ -147,20 +148,20 @@ translate([x5, cable_grommets_y + 250])
|
||||
translate([950, 600])
|
||||
box_test();
|
||||
|
||||
translate([890, 730])
|
||||
translate([890, 750])
|
||||
printed_boxes();
|
||||
|
||||
|
||||
translate([850, 1260])
|
||||
translate([850, 1330])
|
||||
bbox_test();
|
||||
|
||||
|
||||
inserts_y = 0;
|
||||
nuts_y = inserts_y + 20;
|
||||
washers_y = nuts_y + 100;
|
||||
washers_y = nuts_y + 120;
|
||||
screws_y = washers_y + 120;
|
||||
o_rings_y = screws_y + 130;
|
||||
springs_y = o_rings_y + 20;
|
||||
circlips_y = screws_y + 160;
|
||||
springs_y = circlips_y + 20;
|
||||
o_rings_y = springs_y;
|
||||
sealing_strip_y = springs_y + 20;
|
||||
tubings_y = sealing_strip_y + 20;
|
||||
pillars_y = tubings_y + 20;
|
||||
@@ -190,10 +191,13 @@ translate([x0, washers_y])
|
||||
translate([x0, screws_y])
|
||||
screws();
|
||||
|
||||
translate([x0, circlips_y])
|
||||
circlips();
|
||||
|
||||
translate([x0, o_rings_y])
|
||||
o_rings();
|
||||
|
||||
translate([x0, springs_y])
|
||||
translate([x0 + 20, springs_y])
|
||||
springs();
|
||||
|
||||
translate([x0 + 50, sealing_strip_y])
|
||||
@@ -208,7 +212,7 @@ translate([x0, pillars_y])
|
||||
translate([x0, leadnuts_y ])
|
||||
leadnuts();
|
||||
|
||||
translate([x0 + 80, leadnuts_y])
|
||||
translate([x0 + 60, leadnuts_y])
|
||||
ball_bearings();
|
||||
|
||||
translate([x0, pulleys_y])
|
||||
@@ -366,7 +370,7 @@ sk_brackets_y = extrusion_brackets_y + 80;
|
||||
kp_pillow_blocks_y = sk_brackets_y + 50;
|
||||
scs_bearing_blocks_y = kp_pillow_blocks_y + 60;
|
||||
|
||||
translate([x4 + 130, belts_y + 58]) {
|
||||
translate([x4 + 150, belts_y + 58]) {
|
||||
belt_test();
|
||||
|
||||
translate([0, 60])
|
||||
@@ -376,9 +380,8 @@ translate([x4 + 130, belts_y + 58]) {
|
||||
translate([x4, rails_y + 130])
|
||||
rails();
|
||||
|
||||
translate([780, 0])
|
||||
rotate(90)
|
||||
cable_strips();
|
||||
translate([800, fans_y])
|
||||
cable_strips();
|
||||
|
||||
translate([x4, kp_pillow_blocks_y])
|
||||
kp_pillow_blocks();
|
||||
|
@@ -143,7 +143,7 @@ module psu_shroud(type, cable_d, name, cables = 1) { //! Generate the STL file f
|
||||
}
|
||||
|
||||
module psu_shroud_assembly(type, cable_d, name, cables = 1) //! The printed parts with inserts fitted
|
||||
assembly(str("psu_shroud_", name)) {
|
||||
assembly(str("PSU_shroud_", name)) {
|
||||
|
||||
translate_z(psu_shroud_height(type))
|
||||
vflip()
|
||||
|
@@ -107,7 +107,7 @@ module ssr_shroud(type, cable_d, name) { //! Generate the STL file for a spec
|
||||
}
|
||||
|
||||
module ssr_shroud_assembly(type, cable_d, name) //! The printed parts with inserts fitted
|
||||
assembly(str("ssr_shroud_", name)) {
|
||||
assembly(str("SSR_shroud_", name)) {
|
||||
|
||||
translate_z(ssr_shroud_height(type))
|
||||
vflip()
|
||||
|
225
readme.md
@@ -17,39 +17,29 @@ See [usage](docs/usage.md) for requirements, installation instructions and a usa
|
||||
|
||||
## Table of Contents<a name="top"/>
|
||||
<table><tr>
|
||||
<th align="left"> Vitamins A-M </th><th align="left"> Vitamins N-Z </th><th align="left"> Printed </th><th align="left"> Utilities </th><th align="left"> Core Utilities </th></tr>
|
||||
<tr><td> <a href = "#Ball_bearings">Ball_bearings</a> </td><td> <a href = "#Nuts">Nuts</a> </td><td> <a href = "#Box">Box</a> </td><td> <a href = "#Annotation">Annotation</a> </td><td> <a href = "#Bom">Bom</a> </td></tr>
|
||||
<tr><td> <a href = "#Batteries">Batteries</a> </td><td> <a href = "#O_ring">O_ring</a> </td><td> <a href = "#Butt_box">Butt_box</a> </td><td> <a href = "#Bezier">Bezier</a> </td><td> <a href = "#Clip">Clip</a> </td></tr>
|
||||
<tr><td> <a href = "#Belts">Belts</a> </td><td> <a href = "#Opengrab">Opengrab</a> </td><td> <a href = "#Cable_grommets">Cable_grommets</a> </td><td> <a href = "#Dogbones">Dogbones</a> </td><td> <a href = "#Global">Global</a> </td></tr>
|
||||
<tr><td> <a href = "#Blowers">Blowers</a> </td><td> <a href = "#Pcb">Pcb</a> </td><td> <a href = "#Carriers">Carriers</a> </td><td> <a href = "#Fillet">Fillet</a> </td><td> <a href = "#Polyholes">Polyholes</a> </td></tr>
|
||||
<tr><td> <a href = "#Bulldogs">Bulldogs</a> </td><td> <a href = "#Pcbs">Pcbs</a> </td><td> <a href = "#Corner_block">Corner_block</a> </td><td> <a href = "#Hanging_hole">Hanging_hole</a> </td><td> <a href = "#Rounded_rectangle">Rounded_rectangle</a> </td></tr>
|
||||
<tr><td> <a href = "#Buttons">Buttons</a> </td><td> <a href = "#Pillars">Pillars</a> </td><td> <a href = "#Door_hinge">Door_hinge</a> </td><td> <a href = "#Layout">Layout</a> </td><td> <a href = "#Sphere">Sphere</a> </td></tr>
|
||||
<tr><td> <a href = "#Cable_strips">Cable_strips</a> </td><td> <a href = "#Pin_headers">Pin_headers</a> </td><td> <a href = "#Door_latch">Door_latch</a> </td><td> <a href = "#Maths">Maths</a> </td><td> <a href = "#Teardrops">Teardrops</a> </td></tr>
|
||||
<tr><td> <a href = "#Components">Components</a> </td><td> <a href = "#Psus">Psus</a> </td><td> <a href = "#Fan_guard">Fan_guard</a> </td><td> <a href = "#Offset">Offset</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#D_connectors">D_connectors</a> </td><td> <a href = "#Pulleys">Pulleys</a> </td><td> <a href = "#Fixing_block">Fixing_block</a> </td><td> <a href = "#Quadrant">Quadrant</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Displays">Displays</a> </td><td> <a href = "#Rails">Rails</a> </td><td> <a href = "#Flat_hinge">Flat_hinge</a> </td><td> <a href = "#Round">Round</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Extrusion_brackets">Extrusion_brackets</a> </td><td> <a href = "#Ring_terminals">Ring_terminals</a> </td><td> <a href = "#Foot">Foot</a> </td><td> <a href = "#Rounded_cylinder">Rounded_cylinder</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Extrusions">Extrusions</a> </td><td> <a href = "#Rockers">Rockers</a> </td><td> <a href = "#Handle">Handle</a> </td><td> <a href = "#Rounded_polygon">Rounded_polygon</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Fans">Fans</a> </td><td> <a href = "#Rod">Rod</a> </td><td> <a href = "#Pcb_mount">Pcb_mount</a> </td><td> <a href = "#Sector">Sector</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Fuseholder">Fuseholder</a> </td><td> <a href = "#Screws">Screws</a> </td><td> <a href = "#Printed_box">Printed_box</a> </td><td> <a href = "#Sweep">Sweep</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Geared_steppers">Geared_steppers</a> </td><td> <a href = "#Scs_bearing_blocks">Scs_bearing_blocks</a> </td><td> <a href = "#Psu_shroud">Psu_shroud</a> </td><td> <a href = "#Thread">Thread</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Green_terminals">Green_terminals</a> </td><td> <a href = "#Sealing_strip">Sealing_strip</a> </td><td> <a href = "#Ribbon_clamp">Ribbon_clamp</a> </td><td> <a href = "#Tube">Tube</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Hot_ends">Hot_ends</a> </td><td> <a href = "#Sheets">Sheets</a> </td><td> <a href = "#Screw_knob">Screw_knob</a> </td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Hygrometer">Hygrometer</a> </td><td> <a href = "#Sk_brackets">Sk_brackets</a> </td><td> <a href = "#Socket_box">Socket_box</a> </td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Iecs">Iecs</a> </td><td> <a href = "#Spades">Spades</a> </td><td> <a href = "#Ssr_shroud">Ssr_shroud</a> </td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Inserts">Inserts</a> </td><td> <a href = "#Spools">Spools</a> </td><td> <a href = "#Strap_handle">Strap_handle</a> </td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Jack">Jack</a> </td><td> <a href = "#Springs">Springs</a> </td><td></td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Kp_pillow_blocks">Kp_pillow_blocks</a> </td><td> <a href = "#Ssrs">Ssrs</a> </td><td></td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Ldrs">Ldrs</a> </td><td> <a href = "#Stepper_motors">Stepper_motors</a> </td><td></td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Leadnuts">Leadnuts</a> </td><td> <a href = "#Toggles">Toggles</a> </td><td></td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Leds">Leds</a> </td><td> <a href = "#Transformers">Transformers</a> </td><td></td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Light_strips">Light_strips</a> </td><td> <a href = "#Tubings">Tubings</a> </td><td></td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Linear_bearings">Linear_bearings</a> </td><td> <a href = "#Variacs">Variacs</a> </td><td></td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Mains_sockets">Mains_sockets</a> </td><td> <a href = "#Veroboard">Veroboard</a> </td><td></td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Meter">Meter</a> </td><td> <a href = "#Washers">Washers</a> </td><td></td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Microswitches">Microswitches</a> </td><td> <a href = "#Wire">Wire</a> </td><td></td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Microview">Microview</a> </td><td> <a href = "#Zipties">Zipties</a> </td><td></td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Modules">Modules</a> </td><td></td><td></td><td></td><td></td></tr>
|
||||
<th align="left"> Vitamins A-J </th><th align="left"> Vitamins K-Q </th><th align="left"> Vitamins R-Z </th><th align="left"> Printed </th><th align="left"> Utilities </th><th align="left"> Core Utilities </th></tr>
|
||||
<tr><td> <a href = "#Ball_bearings">Ball_bearings</a> </td><td> <a href = "#KP_pillow_blocks">KP_pillow_blocks</a> </td><td> <a href = "#Rails">Rails</a> </td><td> <a href = "#Box">Box</a> </td><td> <a href = "#Annotation">Annotation</a> </td><td> <a href = "#BOM">BOM</a> </td></tr>
|
||||
<tr><td> <a href = "#Batteries">Batteries</a> </td><td> <a href = "#LDRs">LDRs</a> </td><td> <a href = "#Ring_terminals">Ring_terminals</a> </td><td> <a href = "#Butt_box">Butt_box</a> </td><td> <a href = "#Bezier">Bezier</a> </td><td> <a href = "#Clip">Clip</a> </td></tr>
|
||||
<tr><td> <a href = "#Belts">Belts</a> </td><td> <a href = "#LEDs">LEDs</a> </td><td> <a href = "#Rockers">Rockers</a> </td><td> <a href = "#Cable_grommets">Cable_grommets</a> </td><td> <a href = "#Dogbones">Dogbones</a> </td><td> <a href = "#Global">Global</a> </td></tr>
|
||||
<tr><td> <a href = "#Blowers">Blowers</a> </td><td> <a href = "#Leadnuts">Leadnuts</a> </td><td> <a href = "#Rod">Rod</a> </td><td> <a href = "#Carriers">Carriers</a> </td><td> <a href = "#Fillet">Fillet</a> </td><td> <a href = "#Polyholes">Polyholes</a> </td></tr>
|
||||
<tr><td> <a href = "#Bulldogs">Bulldogs</a> </td><td> <a href = "#Light_strips">Light_strips</a> </td><td> <a href = "#SCS_bearing_blocks">SCS_bearing_blocks</a> </td><td> <a href = "#Corner_block">Corner_block</a> </td><td> <a href = "#Hanging_hole">Hanging_hole</a> </td><td> <a href = "#Rounded_rectangle">Rounded_rectangle</a> </td></tr>
|
||||
<tr><td> <a href = "#Buttons">Buttons</a> </td><td> <a href = "#Linear_bearings">Linear_bearings</a> </td><td> <a href = "#SK_brackets">SK_brackets</a> </td><td> <a href = "#Door_hinge">Door_hinge</a> </td><td> <a href = "#Layout">Layout</a> </td><td> <a href = "#Sphere">Sphere</a> </td></tr>
|
||||
<tr><td> <a href = "#Cable_strips">Cable_strips</a> </td><td> <a href = "#Mains_sockets">Mains_sockets</a> </td><td> <a href = "#SSRs">SSRs</a> </td><td> <a href = "#Door_latch">Door_latch</a> </td><td> <a href = "#Maths">Maths</a> </td><td> <a href = "#Teardrops">Teardrops</a> </td></tr>
|
||||
<tr><td> <a href = "#Circlips">Circlips</a> </td><td> <a href = "#Meter">Meter</a> </td><td> <a href = "#Screws">Screws</a> </td><td> <a href = "#Fan_guard">Fan_guard</a> </td><td> <a href = "#Offset">Offset</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Components">Components</a> </td><td> <a href = "#Microswitches">Microswitches</a> </td><td> <a href = "#Sealing_strip">Sealing_strip</a> </td><td> <a href = "#Fixing_block">Fixing_block</a> </td><td> <a href = "#Quadrant">Quadrant</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#D_connectors">D_connectors</a> </td><td> <a href = "#Microview">Microview</a> </td><td> <a href = "#Sheets">Sheets</a> </td><td> <a href = "#Flat_hinge">Flat_hinge</a> </td><td> <a href = "#Round">Round</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Displays">Displays</a> </td><td> <a href = "#Modules">Modules</a> </td><td> <a href = "#Spades">Spades</a> </td><td> <a href = "#Foot">Foot</a> </td><td> <a href = "#Rounded_cylinder">Rounded_cylinder</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Extrusion_brackets">Extrusion_brackets</a> </td><td> <a href = "#Nuts">Nuts</a> </td><td> <a href = "#Spools">Spools</a> </td><td> <a href = "#Handle">Handle</a> </td><td> <a href = "#Rounded_polygon">Rounded_polygon</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Extrusions">Extrusions</a> </td><td> <a href = "#O_ring">O_ring</a> </td><td> <a href = "#Springs">Springs</a> </td><td> <a href = "#PCB_mount">PCB_mount</a> </td><td> <a href = "#Sector">Sector</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Fans">Fans</a> </td><td> <a href = "#Opengrab">Opengrab</a> </td><td> <a href = "#Stepper_motors">Stepper_motors</a> </td><td> <a href = "#PSU_shroud">PSU_shroud</a> </td><td> <a href = "#Sweep">Sweep</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Fuseholder">Fuseholder</a> </td><td> <a href = "#PCB">PCB</a> </td><td> <a href = "#Toggles">Toggles</a> </td><td> <a href = "#Printed_box">Printed_box</a> </td><td> <a href = "#Thread">Thread</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Geared_steppers">Geared_steppers</a> </td><td> <a href = "#PCBs">PCBs</a> </td><td> <a href = "#Transformers">Transformers</a> </td><td> <a href = "#Ribbon_clamp">Ribbon_clamp</a> </td><td> <a href = "#Tube">Tube</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Green_terminals">Green_terminals</a> </td><td> <a href = "#PSUs">PSUs</a> </td><td> <a href = "#Tubings">Tubings</a> </td><td> <a href = "#SSR_shroud">SSR_shroud</a> </td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Hot_ends">Hot_ends</a> </td><td> <a href = "#Pillars">Pillars</a> </td><td> <a href = "#Variacs">Variacs</a> </td><td> <a href = "#Screw_knob">Screw_knob</a> </td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Hygrometer">Hygrometer</a> </td><td> <a href = "#Pin_headers">Pin_headers</a> </td><td> <a href = "#Veroboard">Veroboard</a> </td><td> <a href = "#Socket_box">Socket_box</a> </td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#IECs">IECs</a> </td><td> <a href = "#Pulleys">Pulleys</a> </td><td> <a href = "#Washers">Washers</a> </td><td> <a href = "#Strap_handle">Strap_handle</a> </td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Inserts">Inserts</a> </td><td></td><td> <a href = "#Wire">Wire</a> </td><td></td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Jack">Jack</a> </td><td></td><td> <a href = "#Zipties">Zipties</a> </td><td></td><td></td><td></td></tr>
|
||||
</table>
|
||||
|
||||
---
|
||||
@@ -395,6 +385,48 @@ When the sides are constrained then a circular model is more accurate.
|
||||
| 3 | ```cable_strip(20, 25, 100, 30)``` | Polypropylene strip 189mm x 24mm x 0.8mm |
|
||||
|
||||
|
||||
<a href="#top">Top</a>
|
||||
|
||||
---
|
||||
<a name="Circlips"></a>
|
||||
## Circlips
|
||||
Circlips aka tapered retaining rings.
|
||||
|
||||
|
||||
[vitamins/circlips.scad](vitamins/circlips.scad) Object definitions.
|
||||
|
||||
[vitamins/circlip.scad](vitamins/circlip.scad) Implementation.
|
||||
|
||||
[tests/circlips.scad](tests/circlips.scad) Code for this example.
|
||||
|
||||
### Properties
|
||||
| Function | Description |
|
||||
|:--- |:--- |
|
||||
| ```circlip_a(type)``` | Size of the lugs |
|
||||
| ```circlip_b(type)``` | Widest part of the taper |
|
||||
| ```circlip_d1(type)``` | Nominal OD, i.e. diameter of tube |
|
||||
| ```circlip_d2(type)``` | Groove diameter, i.e. OD when installed |
|
||||
| ```circlip_d3(type)``` | Relaxed OD when not installed |
|
||||
| ```circlip_d5(type)``` | Plier hole diameter |
|
||||
| ```circlip_thickness(type)``` | Thickness |
|
||||
|
||||
### Modules
|
||||
| Module | Description |
|
||||
|:--- |:--- |
|
||||
| ```internal_circlip(type, open = 0)``` | Draw specified internal circlip, open = 0, for nominal size installed, 1 for relaxed uninstalled, -1 for squeezed to install |
|
||||
|
||||

|
||||
|
||||
### Vitamins
|
||||
| Qty | Module call | BOM entry |
|
||||
| ---:|:--- |:---|
|
||||
| 3 | ```circlip(circlip_12i)``` | Circlip internal 12mm |
|
||||
| 3 | ```circlip(circlip_15i)``` | Circlip internal 15mm |
|
||||
| 3 | ```circlip(circlip_19i)``` | Circlip internal 19mm |
|
||||
| 3 | ```circlip(circlip_21i)``` | Circlip internal 21mm |
|
||||
| 3 | ```circlip(circlip_28i)``` | Circlip internal 28mm |
|
||||
|
||||
|
||||
<a href="#top">Top</a>
|
||||
|
||||
---
|
||||
@@ -676,14 +708,15 @@ Aluminium extrusion.
|
||||
### Vitamins
|
||||
| Qty | Module call | BOM entry |
|
||||
| ---:|:--- |:---|
|
||||
| 1 | ```extrusion(E1515, 80)``` | Extrusion E1515 x 80mm |
|
||||
| 1 | ```extrusion(E2020, 80)``` | Extrusion E2020 x 80mm |
|
||||
| 1 | ```extrusion(E2040, 80)``` | Extrusion E2040 x 80mm |
|
||||
| 1 | ```extrusion(E2060, 80)``` | Extrusion E2060 x 80mm |
|
||||
| 1 | ```extrusion(E2080, 80)``` | Extrusion E2080 x 80mm |
|
||||
| 1 | ```extrusion(E3030, 80)``` | Extrusion E3030 x 80mm |
|
||||
| 1 | ```extrusion(E3060, 80)``` | Extrusion E3060 x 80mm |
|
||||
| 1 | ```extrusion(E4040, 80)``` | Extrusion E4040 x 80mm |
|
||||
| 1 | ```extrusion(E4080, 80)``` | Extrusion E4080 x 80mm |
|
||||
| 1 | ```extrusion(E3030, 80, cornerHole = true)``` | Extrusion E3030 x 80mm |
|
||||
| 1 | ```extrusion(E3060, 80, cornerHole = true)``` | Extrusion E3060 x 80mm |
|
||||
| 1 | ```extrusion(E4040, 80, cornerHole = true)``` | Extrusion E4040 x 80mm |
|
||||
| 1 | ```extrusion(E4080, 80, cornerHole = true)``` | Extrusion E4080 x 80mm |
|
||||
|
||||
|
||||
<a href="#top">Top</a>
|
||||
@@ -876,7 +909,6 @@ Parametric green terminal blocks
|
||||
| Module | Description |
|
||||
|:--- |:--- |
|
||||
| ```green_terminal(type, ways, skip = [], colour = "lime")``` | Draw green terminal blocks, skip can be used to remove pins. |
|
||||
| ```terminal_254(ways, skip = [])``` | Draw 0.1" terminal block |
|
||||
|
||||

|
||||
|
||||
@@ -986,8 +1018,8 @@ Mini LCD Celsius Digital Thermometer Hygrometer Temperature Humidity Meter Gauge
|
||||
<a href="#top">Top</a>
|
||||
|
||||
---
|
||||
<a name="Iecs"></a>
|
||||
## Iecs
|
||||
<a name="IECs"></a>
|
||||
## IECs
|
||||
IEC mains inlets and outlet.
|
||||
|
||||
|
||||
@@ -995,7 +1027,7 @@ IEC mains inlets and outlet.
|
||||
|
||||
[vitamins/iec.scad](vitamins/iec.scad) Implementation.
|
||||
|
||||
[tests/iecs.scad](tests/iecs.scad) Code for this example.
|
||||
[tests/IECs.scad](tests/IECs.scad) Code for this example.
|
||||
|
||||
### Properties
|
||||
| Function | Description |
|
||||
@@ -1142,8 +1174,8 @@ E.g. a "brown" socket for mains live needs to be displayed as "sienna" to look r
|
||||
<a href="#top">Top</a>
|
||||
|
||||
---
|
||||
<a name="Kp_pillow_blocks"></a>
|
||||
## Kp_pillow_blocks
|
||||
<a name="KP_pillow_blocks"></a>
|
||||
## KP_pillow_blocks
|
||||
KP pillow block bearings
|
||||
|
||||
|
||||
@@ -1151,7 +1183,7 @@ KP pillow block bearings
|
||||
|
||||
[vitamins/kp_pillow_block.scad](vitamins/kp_pillow_block.scad) Implementation.
|
||||
|
||||
[tests/kp_pillow_blocks.scad](tests/kp_pillow_blocks.scad) Code for this example.
|
||||
[tests/KP_pillow_blocks.scad](tests/KP_pillow_blocks.scad) Code for this example.
|
||||
|
||||
### Properties
|
||||
| Function | Description |
|
||||
@@ -1195,8 +1227,8 @@ KP pillow block bearings
|
||||
<a href="#top">Top</a>
|
||||
|
||||
---
|
||||
<a name="Ldrs"></a>
|
||||
## Ldrs
|
||||
<a name="LDRs"></a>
|
||||
## LDRs
|
||||
Light dependent resistors.
|
||||
|
||||
Larger ones seem to have both a higher dark resistance and a lower bright light resistance.
|
||||
@@ -1206,7 +1238,7 @@ Larger ones seem to have both a higher dark resistance and a lower bright light
|
||||
|
||||
[vitamins/ldr.scad](vitamins/ldr.scad) Implementation.
|
||||
|
||||
[tests/ldrs.scad](tests/ldrs.scad) Code for this example.
|
||||
[tests/LDRs.scad](tests/LDRs.scad) Code for this example.
|
||||
|
||||
### Properties
|
||||
| Function | Description |
|
||||
@@ -1286,8 +1318,8 @@ Nuts for leadscrews.
|
||||
<a href="#top">Top</a>
|
||||
|
||||
---
|
||||
<a name="Leds"></a>
|
||||
## Leds
|
||||
<a name="LEDs"></a>
|
||||
## LEDs
|
||||
Standard domed through hole LEDs. Can specify colour and lead length.
|
||||
|
||||
|
||||
@@ -1295,7 +1327,7 @@ Standard domed through hole LEDs. Can specify colour and lead length.
|
||||
|
||||
[vitamins/led.scad](vitamins/led.scad) Implementation.
|
||||
|
||||
[tests/leds.scad](tests/leds.scad) Code for this example.
|
||||
[tests/LEDs.scad](tests/LEDs.scad) Code for this example.
|
||||
|
||||
### Properties
|
||||
| Function | Description |
|
||||
@@ -1697,8 +1729,12 @@ If a nut is given a child then it gets placed on its top surface.
|
||||
### Properties
|
||||
| Function | Description |
|
||||
|:--- |:--- |
|
||||
| ```nut_pitch(type)``` | Pitch if not standard metric course thread |
|
||||
| ```nut_radius(type)``` | Radius across the corners |
|
||||
| ```nut_size(type)``` | Diameter of the corresponding screw |
|
||||
| ```nut_square_size(type)``` | Diameter of the corresponding screw |
|
||||
| ```nut_square_thickness(type)``` | Thickness of the square nut |
|
||||
| ```nut_square_width(type)``` | Width of the square nut |
|
||||
| ```nut_trap_depth(type)``` | Depth of nut trap |
|
||||
| ```nut_washer(type)``` | Corresponding washer |
|
||||
|
||||
@@ -1715,6 +1751,7 @@ If a nut is given a child then it gets placed on its top surface.
|
||||
|:--- |:--- |
|
||||
| ```nut(type, nyloc = false, brass = false, nylon = false)``` | Draw specified nut |
|
||||
| ```nut_and_washer(type, nyloc)``` | Draw nut with corresponding washer |
|
||||
| ```nut_square(type, brass = false, nylon = false)``` | Draw specified square nut |
|
||||
| ```nut_trap(screw, nut, depth = 0, horizontal = false, supported = false, h = 200)``` | Make a nut trap |
|
||||
| ```wingnut(type)``` | Draw a wingnut |
|
||||
|
||||
@@ -1733,18 +1770,23 @@ If a nut is given a child then it gets placed on its top surface.
|
||||
| 1 | ```nut(M3_nut)``` | Nut M3 x 2.4mm |
|
||||
| 1 | ```nut(M3_nut, brass = true)``` | Nut M3 x 2.4mm brass |
|
||||
| 1 | ```nut(M3_nut, nyloc = true)``` | Nut M3 x 2.4mm nyloc |
|
||||
| 1 | ```nut(M3nS_thin_nut)``` | Nut M3nS 5.5 x 1.8mm |
|
||||
| 1 | ```sliding_t_nut(M4_hammer_nut)``` | Nut M4 hammer |
|
||||
| 1 | ```sliding_t_nut(M4_sliding_t_nut)``` | Nut M4 sliding T |
|
||||
| 1 | ```nut(M4_nut)``` | Nut M4 x 3.2mm |
|
||||
| 1 | ```nut(M4_nut, nyloc = true)``` | Nut M4 x 3.2mm nyloc |
|
||||
| 1 | ```nut(M4nS_thin_nut)``` | Nut M4nS 7 x 2.2mm |
|
||||
| 1 | ```sliding_t_nut(M5_sliding_t_nut)``` | Nut M5 sliding T |
|
||||
| 1 | ```nut(M5_nut)``` | Nut M5 x 4mm |
|
||||
| 1 | ```nut(M5_nut, nyloc = true)``` | Nut M5 x 4mm nyloc |
|
||||
| 1 | ```nut(M5nS_thin_nut)``` | Nut M5nS 8 x 2.7mm |
|
||||
| 1 | ```nut(M6_half_nut)``` | Nut M6 x 3mm |
|
||||
| 1 | ```nut(M6_nut)``` | Nut M6 x 5mm |
|
||||
| 1 | ```nut(M6_nut, nyloc = true)``` | Nut M6 x 5mm nyloc |
|
||||
| 1 | ```nut(M6nS_thin_nut)``` | Nut M6nS 10 x 3.2mm |
|
||||
| 1 | ```nut(M8_nut)``` | Nut M8 x 6.5mm |
|
||||
| 1 | ```nut(M8_nut, nyloc = true)``` | Nut M8 x 6.5mm nyloc |
|
||||
| 1 | ```nut(M8nS_thin_nut)``` | Nut M8nS 13 x 4mm |
|
||||
| 1 | ```washer(M6_washer)``` | Washer M6 x 12.5mm x 1.5mm |
|
||||
| 1 | ```wingnut(M4_wingnut)``` | Wingnut M4 |
|
||||
|
||||
@@ -1817,14 +1859,14 @@ A permanent magnet that can be magnatized and de-magnatized electronically.
|
||||
<a href="#top">Top</a>
|
||||
|
||||
---
|
||||
<a name="Pcb"></a>
|
||||
## Pcb
|
||||
<a name="PCB"></a>
|
||||
## PCB
|
||||
PCBs and perfboard with optional components. The shape can be a rectangle with optionally rounded corners or a polygon for odd shapes like Arduino.
|
||||
|
||||
|
||||
[vitamins/pcb.scad](vitamins/pcb.scad) Implementation.
|
||||
|
||||
[tests/pcb.scad](tests/pcb.scad) Code for this example.
|
||||
[tests/PCB.scad](tests/PCB.scad) Code for this example.
|
||||
|
||||
### Properties
|
||||
| Function | Description |
|
||||
@@ -1899,8 +1941,8 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
|
||||
<a href="#top">Top</a>
|
||||
|
||||
---
|
||||
<a name="Pcbs"></a>
|
||||
## Pcbs
|
||||
<a name="PCBs"></a>
|
||||
## PCBs
|
||||
PCBs and perfboard with optional components. The shape can be a rectangle with optionally rounded corners or a polygon for odd shapes like Arduino.
|
||||
|
||||
|
||||
@@ -1908,7 +1950,7 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
|
||||
|
||||
[vitamins/pcb.scad](vitamins/pcb.scad) Implementation.
|
||||
|
||||
[tests/pcbs.scad](tests/pcbs.scad) Code for this example.
|
||||
[tests/PCBs.scad](tests/PCBs.scad) Code for this example.
|
||||
|
||||
### Properties
|
||||
| Function | Description |
|
||||
@@ -1992,7 +2034,7 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
|
||||
| 1 | ```molex_254(2)``` | Molex KK header 2 way |
|
||||
| 1 | ```molex_254(3)``` | Molex KK header 3 way |
|
||||
| 16 | ```nut(M2_nut, nyloc = true)``` | Nut M2 x 1.6mm nyloc |
|
||||
| 32 | ```nut(M2p5_nut, nyloc = true)``` | Nut M2.5 x 2.2mm nyloc |
|
||||
| 30 | ```nut(M2p5_nut, nyloc = true)``` | Nut M2.5 x 2.2mm nyloc |
|
||||
| 12 | ```nut(M3_nut, nyloc = true)``` | Nut M3 x 2.4mm nyloc |
|
||||
| 12 | ```nut(M4_nut, nyloc = true)``` | Nut M4 x 3.2mm nyloc |
|
||||
| 1 | ```pcb(PI_IO)``` | PI_IO V2 |
|
||||
@@ -2007,7 +2049,7 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
|
||||
| 1 | ```pcb(RPI3)``` | Raspberry Pi 3 |
|
||||
| 1 | ```pcb(RPI0)``` | Raspberry Pi Zero |
|
||||
| 16 | ```screw(M2_cap_screw, 25)``` | Screw M2 cap x 25mm |
|
||||
| 4 | ```screw(M2p5_cap_screw, 16)``` | Screw M2.5 cap x 16mm |
|
||||
| 2 | ```screw(M2p5_cap_screw, 16)``` | Screw M2.5 cap x 16mm |
|
||||
| 12 | ```screw(M2p5_cap_screw, 20)``` | Screw M2.5 cap x 20mm |
|
||||
| 4 | ```screw(M2p5_pan_screw, 20)``` | Screw M2.5 pan x 20mm |
|
||||
| 8 | ```screw(M2p5_pan_screw, 25)``` | Screw M2.5 pan x 25mm |
|
||||
@@ -2019,7 +2061,7 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
|
||||
| 2 | ```green_terminal(gt_2p54, 4)``` | Terminal block 4 way 0.1" |
|
||||
| 1 | | USB A to Mini B lead |
|
||||
| 16 | ```washer(M2_washer)``` | Washer M2 x 5mm x 0.3mm |
|
||||
| 32 | ```washer(M2p5_washer)``` | Washer M2.5 x 5.9mm x 0.5mm |
|
||||
| 30 | ```washer(M2p5_washer)``` | Washer M2.5 x 5.9mm x 0.5mm |
|
||||
| 12 | ```washer(M3_washer)``` | Washer M3 x 7mm x 0.5mm |
|
||||
| 12 | ```washer(M4_washer)``` | Washer M4 x 9mm x 0.8mm |
|
||||
| 1 | ```pcb(ZC_A0591)``` | ZC-A0591 ULN2003 driver PCB |
|
||||
@@ -2036,7 +2078,7 @@ PCBs and perfboard with optional components. The shape can be a rectangle with o
|
||||
| 4 | pcb_spacer25120_2.stl |
|
||||
| 4 | pcb_spacer25130_2.stl |
|
||||
| 4 | pcb_spacer25240.stl |
|
||||
| 4 | pcb_spacer2550.stl |
|
||||
| 2 | pcb_spacer2550.stl |
|
||||
| 4 | pcb_spacer2580.stl |
|
||||
| 4 | pcb_spacer2590.stl |
|
||||
| 4 | pcb_spacer30180.stl |
|
||||
@@ -2146,8 +2188,8 @@ Pin headers and sockets, etc.
|
||||
<a href="#top">Top</a>
|
||||
|
||||
---
|
||||
<a name="Psus"></a>
|
||||
## Psus
|
||||
<a name="PSUs"></a>
|
||||
## PSUs
|
||||
Powersupplies. Can be a simple cube or can be defined by a list of six faces, each with thickness, holes, cutouts, etc.
|
||||
|
||||
Face order is bottom, top, left, right, front, back.
|
||||
@@ -2157,7 +2199,7 @@ Face order is bottom, top, left, right, front, back.
|
||||
|
||||
[vitamins/psu.scad](vitamins/psu.scad) Implementation.
|
||||
|
||||
[tests/psus.scad](tests/psus.scad) Code for this example.
|
||||
[tests/PSUs.scad](tests/PSUs.scad) Code for this example.
|
||||
|
||||
### Properties
|
||||
| Function | Description |
|
||||
@@ -2600,8 +2642,8 @@ Machine screws and wood screws with various head styles.
|
||||
<a href="#top">Top</a>
|
||||
|
||||
---
|
||||
<a name="Scs_bearing_blocks"></a>
|
||||
## Scs_bearing_blocks
|
||||
<a name="SCS_bearing_blocks"></a>
|
||||
## SCS_bearing_blocks
|
||||
SCSnUU and SCSnLUU bearing blocks
|
||||
|
||||
|
||||
@@ -2609,7 +2651,7 @@ SCSnUU and SCSnLUU bearing blocks
|
||||
|
||||
[vitamins/scs_bearing_block.scad](vitamins/scs_bearing_block.scad) Implementation.
|
||||
|
||||
[tests/scs_bearing_blocks.scad](tests/scs_bearing_blocks.scad) Code for this example.
|
||||
[tests/SCS_bearing_blocks.scad](tests/SCS_bearing_blocks.scad) Code for this example.
|
||||
|
||||
### Properties
|
||||
| Function | Description |
|
||||
@@ -2617,10 +2659,12 @@ SCSnUU and SCSnLUU bearing blocks
|
||||
| ```scs_bearing(type)``` | Linear bearing used |
|
||||
| ```scs_block_center_height(type)``` | Height of the center of the block |
|
||||
| ```scs_block_side_height(type)``` | Height of the side of the block, this determines the minimum screw length |
|
||||
| ```scs_circlip(type)``` | Circlip used |
|
||||
| ```scs_hole_offset(type)``` | Offset of bearing hole from base of block |
|
||||
| ```scs_screw(type)``` | Screw type |
|
||||
| ```scs_screw_separation_x(type)``` | Screw separation in X direction |
|
||||
| ```scs_screw_separation_z(type)``` | Screw separation in Z direction |
|
||||
| ```scs_spacer(type)``` | Spacer used in long bearings |
|
||||
|
||||
### Functions
|
||||
| Function | Description |
|
||||
@@ -2750,8 +2794,8 @@ Note that modules that drill holes will return a 2D object if ```h``` is set to
|
||||
<a href="#top">Top</a>
|
||||
|
||||
---
|
||||
<a name="Sk_brackets"></a>
|
||||
## Sk_brackets
|
||||
<a name="SK_brackets"></a>
|
||||
## SK_brackets
|
||||
SK shaft support brackets
|
||||
|
||||
|
||||
@@ -2759,7 +2803,7 @@ SK shaft support brackets
|
||||
|
||||
[vitamins/sk_bracket.scad](vitamins/sk_bracket.scad) Implementation.
|
||||
|
||||
[tests/sk_brackets.scad](tests/sk_brackets.scad) Code for this example.
|
||||
[tests/SK_brackets.scad](tests/SK_brackets.scad) Code for this example.
|
||||
|
||||
### Properties
|
||||
| Function | Description |
|
||||
@@ -2933,8 +2977,8 @@ By default springs have their origin at the bottom but can be centered.
|
||||
<a href="#top">Top</a>
|
||||
|
||||
---
|
||||
<a name="Ssrs"></a>
|
||||
## Ssrs
|
||||
<a name="SSRs"></a>
|
||||
## SSRs
|
||||
Solid state relays.
|
||||
|
||||
|
||||
@@ -2942,7 +2986,7 @@ Solid state relays.
|
||||
|
||||
[vitamins/ssr.scad](vitamins/ssr.scad) Implementation.
|
||||
|
||||
[tests/ssrs.scad](tests/ssrs.scad) Code for this example.
|
||||
[tests/SSRs.scad](tests/SSRs.scad) Code for this example.
|
||||
|
||||
### Properties
|
||||
| Function | Description |
|
||||
@@ -4251,15 +4295,15 @@ Printed handle that can be printed without needing support material due to its t
|
||||
<a href="#top">Top</a>
|
||||
|
||||
---
|
||||
<a name="Pcb_mount"></a>
|
||||
## Pcb_mount
|
||||
<a name="PCB_mount"></a>
|
||||
## PCB_mount
|
||||
A frame to mount a PCB by its corners when it has no mounting holes.
|
||||
The stl must be given a parameterless wrapper in the project that uses it.
|
||||
|
||||
|
||||
[printed/pcb_mount.scad](printed/pcb_mount.scad) Implementation.
|
||||
|
||||
[tests/pcb_mount.scad](tests/pcb_mount.scad) Code for this example.
|
||||
[tests/PCB_mount.scad](tests/PCB_mount.scad) Code for this example.
|
||||
|
||||
### Functions
|
||||
| Function | Description |
|
||||
@@ -4380,15 +4424,15 @@ It can also have printed feet on the base with the screws doubling up to hold th
|
||||
<a href="#top">Top</a>
|
||||
|
||||
---
|
||||
<a name="Psu_shroud"></a>
|
||||
## Psu_shroud
|
||||
<a name="PSU_shroud"></a>
|
||||
## PSU_shroud
|
||||
A cover to go over the mains end of a PSU terminal strip to make it safe.
|
||||
The stl and assembly must be given a name and parameterless wrappers for the stl and assembly added to the project.
|
||||
|
||||
|
||||
[printed/psu_shroud.scad](printed/psu_shroud.scad) Implementation.
|
||||
|
||||
[tests/psu_shroud.scad](tests/psu_shroud.scad) Code for this example.
|
||||
[tests/PSU_shroud.scad](tests/PSU_shroud.scad) Code for this example.
|
||||
|
||||
### Functions
|
||||
| Function | Description |
|
||||
@@ -4432,9 +4476,9 @@ The stl and assembly must be given a name and parameterless wrappers for the stl
|
||||
### Assemblies
|
||||
| Qty | Name |
|
||||
| ---:|:--- |
|
||||
| 1 | psu_shroud_PD_150_12_assembly |
|
||||
| 1 | psu_shroud_S_250_48_assembly |
|
||||
| 1 | psu_shroud_S_300_12_assembly |
|
||||
| 1 | PSU_shroud_PD_150_12_assembly |
|
||||
| 1 | PSU_shroud_S_250_48_assembly |
|
||||
| 1 | PSU_shroud_S_300_12_assembly |
|
||||
|
||||
|
||||
<a href="#top">Top</a>
|
||||
@@ -4582,15 +4626,15 @@ UK 13A socket and printed backbox with earth terminal for the panel it is mounte
|
||||
<a href="#top">Top</a>
|
||||
|
||||
---
|
||||
<a name="Ssr_shroud"></a>
|
||||
## Ssr_shroud
|
||||
<a name="SSR_shroud"></a>
|
||||
## SSR_shroud
|
||||
A cover to go over the mains end of an SSR to make it safe to be touched.
|
||||
The STL and assembly must be given a name and parameterless wrappers for the stl and assembly added to the project.
|
||||
|
||||
|
||||
[printed/ssr_shroud.scad](printed/ssr_shroud.scad) Implementation.
|
||||
|
||||
[tests/ssr_shroud.scad](tests/ssr_shroud.scad) Code for this example.
|
||||
[tests/SSR_shroud.scad](tests/SSR_shroud.scad) Code for this example.
|
||||
|
||||
### Functions
|
||||
| Function | Description |
|
||||
@@ -4630,8 +4674,8 @@ The STL and assembly must be given a name and parameterless wrappers for the stl
|
||||
### Assemblies
|
||||
| Qty | Name |
|
||||
| ---:|:--- |
|
||||
| 1 | ssr_shroud_SSR10DA_assembly |
|
||||
| 1 | ssr_shroud_SSR25DA_assembly |
|
||||
| 1 | SSR_shroud_SSR10DA_assembly |
|
||||
| 1 | SSR_shroud_SSR25DA_assembly |
|
||||
|
||||
|
||||
<a href="#top">Top</a>
|
||||
@@ -4846,6 +4890,7 @@ Maths utilities for manipulating vectors and matrices.
|
||||
| ```euler(R)``` | Convert a rotation matrix to a Euler rotation vector. |
|
||||
| ```identity(n, x = 1)``` | Construct an arbitrary size identity matrix |
|
||||
| ```reverse(v)``` | Reverse a vector |
|
||||
| ```rot3_z(a)``` | Generate a 3x3 matrix to rotate around z |
|
||||
| ```rotate(a, v)``` | Generate a 4x4 rotation matrix, ```a``` can be a vector of three angles or a single angle around ```z```, or around axis ```v``` |
|
||||
| ```scale(v)``` | Generate a 4x4 matrix that scales by ```v```, which can be a vector of xyz factors or a scalar to scale all axes equally |
|
||||
| ```transform(v, m)``` | Apply 4x4 transform to a 3 vector by extending it and cropping it again |
|
||||
@@ -5055,7 +5100,7 @@ a cylinder. To get around this a colour can be passed to thread that is used to
|
||||
|
||||
Making the ends requires a CGAL intersection, which make threads relatively slow. For this reason they are generally disabled when using the GUI but can
|
||||
be enabled by setting ```$show_threads``` to ```true```. When the tests are run, by default, threads are enabled only for things that feature them like screws.
|
||||
This behaviour can be changed by setting a ```SHOW_THREADS``` environment variable to ```false``` to disable all threads and ```true``` to enable all threads.
|
||||
This behaviour can be changed by setting a ```NOPSCADLIB_SHOW_THREADS``` environment variable to ```false``` to disable all threads and ```true``` to enable all threads.
|
||||
The same variable also affects the generation of assembly diagrams.
|
||||
|
||||
Threads obey the $fn, $fa, $fs variables.
|
||||
@@ -5105,8 +5150,8 @@ Simple tube or ring
|
||||
<a href="#top">Top</a>
|
||||
|
||||
---
|
||||
<a name="Bom"></a>
|
||||
## Bom
|
||||
<a name="BOM"></a>
|
||||
## BOM
|
||||
Bill Of Materials generation via echo and the ```bom.py``` script. Also handles exploded assembly views and posing. Assembly instructions can precede the module
|
||||
definition that makes the assembly.
|
||||
|
||||
@@ -5116,7 +5161,7 @@ heirachical BOMs are also generated for real projects.
|
||||
|
||||
[utils/core/bom.scad](utils/core/bom.scad) Implementation.
|
||||
|
||||
[tests/bom.scad](tests/bom.scad) Code for this example.
|
||||
[tests/BOM.scad](tests/BOM.scad) Code for this example.
|
||||
|
||||
### Functions
|
||||
| Function | Description |
|
||||
|
@@ -184,10 +184,17 @@ def parse_bom(file = "openscad.log", name = None):
|
||||
main.add_part(s)
|
||||
if stack:
|
||||
main.assemblies[stack[-1]].add_part(s)
|
||||
else:
|
||||
if 'ERROR:' in line or 'WARNING:' in line:
|
||||
print(line[:-1])
|
||||
return main
|
||||
|
||||
def usage():
|
||||
print("\nusage:\n\tbom [target_config] [<accessory_name>_assembly] - Generate BOMs for a project or an accessory to a project.")
|
||||
sys.exit(1)
|
||||
|
||||
def boms(target = None, assembly = None):
|
||||
bom_dir = set_config(target) + "bom"
|
||||
bom_dir = set_config(target, usage) + "bom"
|
||||
if assembly:
|
||||
bom_dir += "/accessories"
|
||||
if not os.path.isdir(bom_dir):
|
||||
@@ -214,7 +221,7 @@ def boms(target = None, assembly = None):
|
||||
#
|
||||
# Run openscad
|
||||
#
|
||||
openscad.run("-D","$bom=2","-D","$preview=true","-o", "openscad.echo", bom_maker_name)
|
||||
openscad.run("-D","$bom=2","-D","$preview=true","-o", "openscad.echo", "-d", bom_dir + "/bom.deps", bom_maker_name)
|
||||
os.remove(bom_maker_name)
|
||||
print("Generating bom ...", end=" ")
|
||||
|
||||
@@ -236,11 +243,24 @@ def boms(target = None, assembly = None):
|
||||
print("done")
|
||||
|
||||
if __name__ == '__main__':
|
||||
args = len(sys.argv)
|
||||
if args > 1:
|
||||
if args > 2:
|
||||
boms(sys.argv[1], sys.argv[2])
|
||||
else:
|
||||
boms(sys.argv[1])
|
||||
if len(sys.argv) > 3: usage()
|
||||
|
||||
if len(sys.argv) == 3:
|
||||
target, assembly = sys.argv[1], sys.argv[2]
|
||||
else:
|
||||
boms();
|
||||
if len(sys.argv) == 2:
|
||||
if sys.argv[1][-9:] == "_assembly":
|
||||
target, assembly = None, sys.argv[1]
|
||||
else:
|
||||
target, assembly = sys.argv[1], None
|
||||
else:
|
||||
target, assembly = None, None
|
||||
|
||||
if assembly:
|
||||
if assembly[-9:] != "_assembly": usage()
|
||||
|
||||
try:
|
||||
boms(target, assembly)
|
||||
except Exception as e:
|
||||
print(str(e))
|
||||
sys.exit(1)
|
||||
|
@@ -113,5 +113,5 @@ if __name__ == '__main__':
|
||||
if len(sys.argv) == 2:
|
||||
canonicalise(sys.argv[1])
|
||||
else:
|
||||
print("usage: c14n_stl file")
|
||||
print("\nusage:\n\t c14n_stl file - Canonicalise an STL file created by OpenSCAD.")
|
||||
sys.exit(1)
|
||||
|
@@ -17,6 +17,7 @@
|
||||
# If not, see <https://www.gnu.org/licenses/>.
|
||||
#
|
||||
import os
|
||||
from set_config import source_dir
|
||||
|
||||
def mtime(file):
|
||||
if os.path.isfile(file):
|
||||
@@ -32,7 +33,7 @@ def read_deps(dname):
|
||||
deps = []
|
||||
for line in lines:
|
||||
if line.startswith('\t'):
|
||||
dep = line[1 : -1].rstrip(' \\')
|
||||
dep = line[1 : -1].rstrip(' \\').replace('\\ ', ' ')
|
||||
if not os.path.basename(dep) in ['stl.scad', 'dxf.scad', 'svf.scad', 'png.scad', 'target.scad']:
|
||||
deps.append(dep)
|
||||
return deps
|
||||
@@ -48,3 +49,18 @@ def check_deps(target, dname):
|
||||
if mtime(dep) > target_mtime:
|
||||
return dep + ' changed'
|
||||
return None
|
||||
|
||||
def source_dirs(bom_dir):
|
||||
dirs = set()
|
||||
lib_dirs = set()
|
||||
deps = read_deps(bom_dir + '/bom.deps')
|
||||
cwd = os.getcwd().replace('\\', '/')
|
||||
for dep in deps:
|
||||
dir = os.path.dirname(dep)
|
||||
if dir.startswith(cwd):
|
||||
dirs.add(dir[len(cwd) + 1:])
|
||||
else:
|
||||
if dir.endswith('/printed'):
|
||||
lib_dirs.add(dir)
|
||||
dirs.remove(source_dir)
|
||||
return [source_dir] + sorted(dirs) + sorted(lib_dirs)
|
||||
|
@@ -26,6 +26,7 @@ from __future__ import print_function
|
||||
|
||||
import os
|
||||
from tests import do_cmd
|
||||
import argparse
|
||||
|
||||
dir = 'scripts'
|
||||
|
||||
@@ -74,4 +75,5 @@ They should work with both Python 2 and Python 3.
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
argparse.ArgumentParser(description='Generate scripts/readme.md and make html versions of that and doc/usage.md').parse_args()
|
||||
doc_scripts()
|
||||
|
@@ -30,14 +30,14 @@ import times
|
||||
from deps import *
|
||||
import json
|
||||
|
||||
def bom_to_parts(target_dir, part_type, assembly = None):
|
||||
def bom_to_parts(bom_dir, part_type, assembly = None):
|
||||
#
|
||||
# Make a list of all the parts in the BOM
|
||||
#
|
||||
part_files = []
|
||||
bom = assembly + '.txt' if assembly else "bom.txt"
|
||||
suffix = ".dxf" if part_type == 'svg' else '.' + part_type
|
||||
with open(target_dir + "/../bom/" + bom, "rt") as f:
|
||||
with open(bom_dir + '/' + bom, "rt") as f:
|
||||
for line in f.readlines():
|
||||
words = line.split()
|
||||
if words:
|
||||
@@ -46,13 +46,24 @@ def bom_to_parts(target_dir, part_type, assembly = None):
|
||||
part_files.append(last_word[:-4] + '.' + part_type)
|
||||
return part_files
|
||||
|
||||
def usage(t):
|
||||
print("\nusage:\n\t%ss [target_config] [<name1>.%s] ... [<nameN>.%s] - Generate specified %s files or all if none specified." % ( t, t, t, t.upper()))
|
||||
sys.exit(1)
|
||||
|
||||
def make_parts(target, part_type, parts = None):
|
||||
#
|
||||
# Check list of parts is the correct type
|
||||
#
|
||||
if parts:
|
||||
for p in parts:
|
||||
if not p.endswith('.' + part_type): usage(part_type)
|
||||
#
|
||||
# Make the target directory
|
||||
#
|
||||
top_dir = set_config(target)
|
||||
top_dir = set_config(target, lambda: usage(part_type))
|
||||
target_dir = top_dir + part_type + 's'
|
||||
deps_dir = top_dir + "deps"
|
||||
bom_dir = top_dir + "bom"
|
||||
if not os.path.isdir(target_dir):
|
||||
os.makedirs(target_dir)
|
||||
if not os.path.isdir(deps_dir):
|
||||
@@ -64,7 +75,7 @@ def make_parts(target, part_type, parts = None):
|
||||
if parts:
|
||||
targets = list(parts) #copy the list so we dont modify the list passed in
|
||||
else:
|
||||
targets = bom_to_parts(target_dir, part_type)
|
||||
targets = bom_to_parts(bom_dir, part_type)
|
||||
for file in os.listdir(target_dir):
|
||||
if file.endswith('.' + part_type):
|
||||
if not file in targets:
|
||||
@@ -83,12 +94,11 @@ def make_parts(target, part_type, parts = None):
|
||||
#
|
||||
# Find all the scad files
|
||||
#
|
||||
lib_dir = os.environ['OPENSCADPATH'] + '/NopSCADlib/printed'
|
||||
module_suffix = '_dxf' if part_type == 'svg' else '_' + part_type
|
||||
for dir in [source_dir, source_dir + '/printed', lib_dir]:
|
||||
if os.path.isdir(dir):
|
||||
for dir in source_dirs(bom_dir):
|
||||
if targets and os.path.isdir(dir):
|
||||
for filename in os.listdir(dir):
|
||||
if filename[-5:] == ".scad":
|
||||
if targets and filename[-5:] == ".scad":
|
||||
#
|
||||
# find any modules ending in _<part_type>
|
||||
#
|
||||
@@ -138,9 +148,6 @@ def make_parts(target, part_type, parts = None):
|
||||
#
|
||||
if targets:
|
||||
for part in targets:
|
||||
if part[-4:] != '.' + part_type:
|
||||
print(part, "is not a", part_type, "file")
|
||||
else:
|
||||
print("Could not find a module called", part[:-4] + module_suffix, "to make", part)
|
||||
sys.exit(1)
|
||||
print("Could not find a module called", part[:-4] + module_suffix, "to make", part)
|
||||
usage(part_type)
|
||||
times.print_times()
|
||||
|
@@ -30,6 +30,7 @@ import re
|
||||
from shutil import copyfile
|
||||
from tests import update_image
|
||||
import sys
|
||||
import argparse
|
||||
|
||||
project_dirs = ['../..', 'examples']
|
||||
target_dir = 'gallery'
|
||||
@@ -39,7 +40,6 @@ def gallery(force):
|
||||
if not os.path.isdir(target_dir):
|
||||
os.makedirs(target_dir)
|
||||
|
||||
|
||||
paths = sorted([pdir + '/' + i for pdir in project_dirs for i in os.listdir(pdir) if os.path.isdir(pdir + '/' + i + '/assemblies')], key = lambda s: os.path.basename(s))
|
||||
with open(output_name, 'wt') as output_file:
|
||||
print("# A gallery of projects made with NopSCADlib", file = output_file)
|
||||
@@ -78,4 +78,8 @@ def gallery(force):
|
||||
|
||||
if __name__ == '__main__':
|
||||
init()
|
||||
gallery(force = len(sys.argv) > 1 and sys.argv[1] == '-f')
|
||||
parser = argparse.ArgumentParser(description='Creates a galley of projects by copying the top level image and description to gallery/readme.md.')
|
||||
parser.add_argument("-f", help = "run make_all in each project to force update", action="store_true")
|
||||
args = parser.parse_args()
|
||||
|
||||
gallery(force = args.f)
|
||||
|
@@ -27,9 +27,17 @@ from bom import boms
|
||||
from render import render
|
||||
from views import views
|
||||
from plateup import plateup
|
||||
from set_config import set_config
|
||||
|
||||
|
||||
def usage():
|
||||
print("\nusage:\n\tmake_all [target_config] - Make all the manufacturing files and readme for a project.")
|
||||
sys.exit(1)
|
||||
|
||||
if __name__ == '__main__':
|
||||
if len(sys.argv) > 2: usage()
|
||||
target = None if len(sys.argv) == 1 else sys.argv[1]
|
||||
set_config(target, usage)
|
||||
boms(target)
|
||||
for part in ['stl', 'dxf']:
|
||||
make_parts(target, part)
|
||||
|
@@ -25,9 +25,15 @@ import sys
|
||||
|
||||
from plateup import plateup
|
||||
|
||||
def usage():
|
||||
print("\nusage:\n\tpanels [target_config] - Aggregate DXF files for routing together.")
|
||||
sys.exit(1)
|
||||
|
||||
if __name__ == '__main__':
|
||||
if len(sys.argv) > 2: usage()
|
||||
|
||||
if len(sys.argv) > 1:
|
||||
target = sys.argv[1]
|
||||
else:
|
||||
target = None
|
||||
plateup(target, 'dxf')
|
||||
plateup(target, 'dxf', usage)
|
||||
|
@@ -31,11 +31,11 @@ from shutil import copyfile
|
||||
source_dirs = { "stl" : "platters", "dxf" : "panels" }
|
||||
target_dirs = { "stl" : "printed", "dxf" : "routed" }
|
||||
|
||||
def plateup(target, part_type):
|
||||
def plateup(target, part_type, usage = None):
|
||||
#
|
||||
# Make the target directory
|
||||
#
|
||||
top_dir = set_config(target)
|
||||
top_dir = set_config(target, usage)
|
||||
parts_dir = top_dir + part_type + 's'
|
||||
target_dir = parts_dir + '/' + target_dirs[part_type]
|
||||
source_dir = top_dir + source_dirs[part_type]
|
||||
|
@@ -25,9 +25,15 @@ import sys
|
||||
|
||||
from plateup import plateup
|
||||
|
||||
def usage():
|
||||
print("\nusage:\n\tplatters [target_config] - Aggregate STL files for printing together.")
|
||||
sys.exit(1)
|
||||
|
||||
if __name__ == '__main__':
|
||||
if len(sys.argv) > 2: usage()
|
||||
|
||||
if len(sys.argv) > 1:
|
||||
target = sys.argv[1]
|
||||
else:
|
||||
target = None
|
||||
plateup(target, 'stl')
|
||||
plateup(target, 'stl', usage)
|
||||
|
@@ -30,17 +30,23 @@ from tests import do_cmd, update_image, colour_scheme, background
|
||||
from deps import mtime
|
||||
from colorama import init
|
||||
|
||||
def usage():
|
||||
print("\nusage:\n\trender [target_config] - Render images of the stl and dxf files.");
|
||||
sys.exit(1)
|
||||
|
||||
def render(target, type):
|
||||
#
|
||||
# Make the target directory
|
||||
#
|
||||
target_dir = set_config(target) + type + 's'
|
||||
top_dir = set_config(target, usage)
|
||||
target_dir = top_dir + type + 's'
|
||||
bom_dir = top_dir + 'bom'
|
||||
if not os.path.isdir(target_dir):
|
||||
os.makedirs(target_dir)
|
||||
#
|
||||
# Find all the parts
|
||||
#
|
||||
parts = bom_to_parts(target_dir, type)
|
||||
parts = bom_to_parts(bom_dir, type)
|
||||
#
|
||||
# Remove unused png files
|
||||
#
|
||||
@@ -71,6 +77,7 @@ def render(target, type):
|
||||
|
||||
if __name__ == '__main__':
|
||||
init()
|
||||
if len(sys.argv) > 2: usage()
|
||||
target = sys.argv[1] if len(sys.argv) > 1 else None
|
||||
render(target, 'stl')
|
||||
render(target, 'dxf')
|
||||
|
@@ -45,20 +45,27 @@ def valid_targets_string():
|
||||
return result
|
||||
|
||||
|
||||
def set_config(target):
|
||||
def set_config(target, usage = None):
|
||||
if target and target[:1] == '-' and usage: usage()
|
||||
targets = valid_targets()
|
||||
if not target:
|
||||
if not targets:
|
||||
return ""
|
||||
print("Must specify a configuration: " + valid_targets_string())
|
||||
if usage:
|
||||
usage()
|
||||
sys.exit(1)
|
||||
|
||||
if not targets:
|
||||
print("Not a muli-configuration project (no config_<target>.scad files found)")
|
||||
if usage:
|
||||
usage()
|
||||
sys.exit(1)
|
||||
|
||||
if not target in targets:
|
||||
print(target + " is not a configuration, avaliable configurations are: " + valid_targets_string())
|
||||
if usage:
|
||||
usage()
|
||||
sys.exit(1)
|
||||
|
||||
fname = source_dir + "/target.scad"
|
||||
@@ -75,10 +82,13 @@ def set_config(target):
|
||||
f. write(text);
|
||||
return target + "/"
|
||||
|
||||
def usage():
|
||||
print("\nusage:\n\tset_config config_name")
|
||||
sys.exit(1)
|
||||
|
||||
if __name__ == '__main__':
|
||||
args = len(sys.argv)
|
||||
if args == 2:
|
||||
set_config(sys.argv[1])
|
||||
set_config(sys.argv[1], usage)
|
||||
else:
|
||||
print("usage: set_config config_name")
|
||||
sys.exit(1)
|
||||
usage()
|
||||
|
@@ -85,6 +85,10 @@ def depluralise(name):
|
||||
def is_plural(name):
|
||||
return name != depluralise(name)
|
||||
|
||||
def usage():
|
||||
print("\nusage:\n\ttests [test_name1] ... [test_nameN] - Run specified tests or all tests in none specified.");
|
||||
sys.exit(1)
|
||||
|
||||
def tests(tests):
|
||||
scad_dir = "tests"
|
||||
deps_dir = scad_dir + "/deps"
|
||||
@@ -96,6 +100,7 @@ def tests(tests):
|
||||
doc_name = "readme.md"
|
||||
index = {}
|
||||
bodies = {}
|
||||
done = []
|
||||
times.read_times()
|
||||
options.check_options(deps_dir)
|
||||
#
|
||||
@@ -109,13 +114,15 @@ def tests(tests):
|
||||
#
|
||||
# List of individual part files
|
||||
#
|
||||
scads = [i for i in sorted(os.listdir(scad_dir)) if i[-5:] == ".scad"]
|
||||
scads = [i for i in sorted(os.listdir(scad_dir), key = lambda s: s.lower()) if i[-5:] == ".scad"]
|
||||
|
||||
for scad in scads:
|
||||
base_name = scad[:-5]
|
||||
if not tests or base_name in tests:
|
||||
done.append(base_name)
|
||||
print(base_name)
|
||||
cap_name = base_name[0].capitalize() + base_name[1:]
|
||||
base_name = base_name.lower()
|
||||
scad_name = scad_dir + '/' + scad
|
||||
png_name = png_dir + '/' + base_name + '.png'
|
||||
bom_name = bom_dir + '/' + base_name + '.json'
|
||||
@@ -140,11 +147,14 @@ def tests(tests):
|
||||
print("Can't find implementation!")
|
||||
continue
|
||||
|
||||
vsplit = "M"
|
||||
vsplit = "AKR" + chr(ord('Z') + 1)
|
||||
vtype = locations[0][1]
|
||||
types = [vtype + ' A-' + vsplit[0], vtype + ' ' + chr(ord(vsplit) + 1) + '-Z'] + [loc[1] for loc in locations[1 :]]
|
||||
types = [vtype + ' ' + vsplit[i] + '-' + chr(ord(vsplit[i + 1]) - 1) for i in range(len(vsplit) - 1)] + [loc[1] for loc in locations[1 :]]
|
||||
if type == vtype:
|
||||
type = types[0] if cap_name[0] <= vsplit else types[1]
|
||||
for i in range(1, len(vsplit)):
|
||||
if cap_name[0] < vsplit[i]:
|
||||
type = types[i - 1]
|
||||
break
|
||||
|
||||
for t in types:
|
||||
if not t in bodies:
|
||||
@@ -188,10 +198,10 @@ def tests(tests):
|
||||
|
||||
body += ["\n" %(base_name, png_name)]
|
||||
|
||||
dname = deps_name(deps_dir, scad)
|
||||
dname = deps_name(deps_dir, scad.lower())
|
||||
oldest = png_name if mtime(png_name) < mtime(bom_name) else bom_name
|
||||
changed = check_deps(oldest, dname)
|
||||
changed = times.check_have_time(changed, scad_name)
|
||||
changed = times.check_have_time(changed, scad_name.lower())
|
||||
changed = options.have_changed(changed, oldest)
|
||||
if changed:
|
||||
print(changed)
|
||||
@@ -230,6 +240,14 @@ def tests(tests):
|
||||
body += ['\n<a href="#top">Top</a>']
|
||||
body += ["\n---"]
|
||||
|
||||
for test in done:
|
||||
if test in tests:
|
||||
tests.remove(test)
|
||||
if tests:
|
||||
for test in tests:
|
||||
print(Fore.MAGENTA + "Could not find a test called", test, Fore.WHITE)
|
||||
usage()
|
||||
|
||||
with open(doc_name, "wt") as doc_file:
|
||||
print('# NopSCADlib', file = doc_file)
|
||||
print('''\
|
||||
@@ -275,4 +293,6 @@ See [usage](docs/usage.md) for requirements, installation instructions and a usa
|
||||
do_cmd('codespell -L od readme.md'.split())
|
||||
|
||||
if __name__ == '__main__':
|
||||
for arg in sys.argv[1:]:
|
||||
if arg[:1] == '-': usage()
|
||||
tests(sys.argv[1:])
|
||||
|
@@ -89,12 +89,24 @@ def eop(print_mode, doc_file, last = False, first = False):
|
||||
def pad(s, before, after = 0):
|
||||
return ' ' * before + str(s) + ' ' * after
|
||||
|
||||
def titalise(name):
|
||||
cap_next = True
|
||||
result = ''
|
||||
for c in name.replace('_', ' '):
|
||||
result = result + (c.upper() if cap_next else c);
|
||||
cap_next = c == ' '
|
||||
return result
|
||||
|
||||
def usage():
|
||||
print("\nusage:\n\t views [target_config] [<name1>_assembly] ... [<nameN>_assembly] - Create assembly images and readme.")
|
||||
sys.exit(1)
|
||||
|
||||
def views(target, do_assemblies = None):
|
||||
done_assemblies = []
|
||||
#
|
||||
# Make the target directory
|
||||
#
|
||||
top_dir = set_config(target)
|
||||
top_dir = set_config(target, usage)
|
||||
target_dir = top_dir + 'assemblies'
|
||||
deps_dir = top_dir + "deps"
|
||||
bom_dir = top_dir + "bom"
|
||||
@@ -109,9 +121,10 @@ def views(target, do_assemblies = None):
|
||||
with open(bounds_fname) as json_file:
|
||||
bounds_map = json.load(json_file)
|
||||
#
|
||||
# Find all the assemblies
|
||||
# Find all the assemblies and remove any old views
|
||||
#
|
||||
assemblies = bom_to_assemblies(bom_dir, bounds_map)
|
||||
lc_assemblies = [ass.lower() for ass in assemblies]
|
||||
for file in os.listdir(target_dir):
|
||||
if file.endswith('.png'):
|
||||
assembly = file[:-4].replace('_assembled', '_assembly')
|
||||
@@ -124,8 +137,7 @@ def views(target, do_assemblies = None):
|
||||
# Find all the scad files
|
||||
#
|
||||
main_blurb = None
|
||||
lib_dir = os.environ['OPENSCADPATH'] + '/NopSCADlib/printed'
|
||||
for dir in [source_dir, source_dir + '/printed', lib_dir]:
|
||||
for dir in source_dirs(bom_dir):
|
||||
if os.path.isdir(dir):
|
||||
for filename in os.listdir(dir):
|
||||
if filename.endswith('.scad'):
|
||||
@@ -140,22 +152,24 @@ def views(target, do_assemblies = None):
|
||||
if len(words) and words[0] == "module":
|
||||
module = words[1].split('(')[0]
|
||||
if is_assembly(module):
|
||||
if module in assemblies:
|
||||
lc_module = module.lower()
|
||||
if lc_module in lc_assemblies:
|
||||
real_name = assemblies[lc_assemblies.index(lc_module)]
|
||||
#
|
||||
# Scrape the assembly instructions
|
||||
#
|
||||
for ass in flat_bom:
|
||||
if ass["name"] == module:
|
||||
if ass["name"] == real_name:
|
||||
if not "blurb" in ass:
|
||||
ass["blurb"] = blurb.scrape_module_blurb(lines[:line_no])
|
||||
break
|
||||
if not do_assemblies or module in do_assemblies:
|
||||
if not do_assemblies or real_name in do_assemblies:
|
||||
#
|
||||
# Run openscad on the created file
|
||||
#
|
||||
dname = deps_name(deps_dir, filename)
|
||||
for explode in [0, 1]:
|
||||
png_name = target_dir + '/' + module + '.png'
|
||||
png_name = target_dir + '/' + real_name + '.png'
|
||||
if not explode:
|
||||
png_name = png_name.replace('_assembly', '_assembled')
|
||||
changed = check_deps(png_name, dname)
|
||||
@@ -181,7 +195,7 @@ def views(target, do_assemblies = None):
|
||||
if mtime(png_name) > mtime(tn_name):
|
||||
do_cmd(("magick "+ png_name + " -trim -resize 280x280 -background " + background + " -gravity Center -extent 280x280 -bordercolor " + background + " -border 10 " + tmp_name).split())
|
||||
update_image(tmp_name, tn_name)
|
||||
done_assemblies.append(module)
|
||||
done_assemblies.append(real_name)
|
||||
else:
|
||||
if module == 'main_assembly':
|
||||
main_blurb = blurb.scrape_module_blurb(lines[:line_no])
|
||||
@@ -216,7 +230,7 @@ def views(target, do_assemblies = None):
|
||||
print('1. [Parts list](#Parts_list)', file = doc_file)
|
||||
for ass in flat_bom:
|
||||
name = ass["name"]
|
||||
cap_name = name.replace('_', ' ').title()
|
||||
cap_name = titalise(name)
|
||||
print('1. [%s](#%s)' % (cap_name, name), file = doc_file)
|
||||
print(file = doc_file)
|
||||
eop(print_mode, doc_file)
|
||||
@@ -237,7 +251,7 @@ def views(target, do_assemblies = None):
|
||||
else:
|
||||
things[t][thing] = ass[t][thing]
|
||||
for ass in flat_bom:
|
||||
name = ass["name"][:-9].replace('_', ' ').title().replace(' ',' ')
|
||||
name = titalise(ass["name"][:-9]).replace(' ',' ')
|
||||
print('| <span style="writing-mode: vertical-rl; text-orientation: mixed;">%s</span> ' % name, file = doc_file, end = '')
|
||||
print('| <span style="writing-mode: vertical-rl; text-orientation: mixed;">TOTALS</span> | |', file = doc_file)
|
||||
|
||||
@@ -274,7 +288,7 @@ def views(target, do_assemblies = None):
|
||||
#
|
||||
for ass in flat_bom:
|
||||
name = ass["name"]
|
||||
cap_name = name.replace('_', ' ').title()
|
||||
cap_name = titalise(name)
|
||||
|
||||
if ass["count"] > 1:
|
||||
print('<a name="%s"></a>\n## %d x %s' % (name, ass["count"], cap_name), file = doc_file)
|
||||
@@ -385,4 +399,7 @@ if __name__ == '__main__':
|
||||
else:
|
||||
target, assemblies = None, sys.argv[1:]
|
||||
|
||||
for a in assemblies:
|
||||
if a[-9:] != "_assembly": usage()
|
||||
|
||||
views(target, assemblies)
|
||||
|
40
tests/circlips.scad
Normal file
@@ -0,0 +1,40 @@
|
||||
//
|
||||
// NopSCADlib Copyright Chris Palmer 2020
|
||||
// nop.head@gmail.com
|
||||
// hydraraptor.blogspot.com
|
||||
//
|
||||
// This file is part of NopSCADlib.
|
||||
//
|
||||
// NopSCADlib is free software: you can redistribute it and/or modify it under the terms of the
|
||||
// GNU General Public License as published by the Free Software Foundation, either version 3 of
|
||||
// the License, or (at your option) any later version.
|
||||
//
|
||||
// NopSCADlib is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
||||
// without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
// See the GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
||||
// If not, see <https://www.gnu.org/licenses/>.
|
||||
//
|
||||
include <../core.scad>
|
||||
use <../utils/layout.scad>
|
||||
|
||||
include <../vitamins/circlips.scad>
|
||||
|
||||
module circlips(all = false)
|
||||
layout([for(c = circlips) circlip_d3(c)], 10, false) let(c = circlips[$i]) {
|
||||
gap = circlip_d3(c) + 2;
|
||||
|
||||
internal_circlip(c, 1);
|
||||
|
||||
if(all) {
|
||||
translate([0, gap])
|
||||
internal_circlip(c, 0);
|
||||
|
||||
translate([0, 2 * gap])
|
||||
internal_circlip(c, -1);
|
||||
}
|
||||
}
|
||||
|
||||
if($preview)
|
||||
circlips(true);
|
@@ -26,14 +26,13 @@ module resistors()
|
||||
resistor(resistors[$i]);
|
||||
|
||||
module al_clad_resistors()
|
||||
layout([for(a = al_clad_resistors) al_clad_width(a)])
|
||||
layout([for(a = al_clad_resistors) al_clad_width(a)], 5, true)
|
||||
rotate(90)
|
||||
al_clad_resistor_assembly(al_clad_resistors[$i], 4.7)
|
||||
screw(al_clad_hole(al_clad_resistors[$i]) > 3 ? M3_pan_screw : M2p5_pan_screw, 16);
|
||||
|
||||
|
||||
module thermal_cutouts()
|
||||
layout([for(t = thermal_cutouts) tc_length(t)])
|
||||
layout([for(t = thermal_cutouts) tc_length(t)], 5, true)
|
||||
thermal_cutout(thermal_cutouts[$i]);
|
||||
|
||||
module components() {
|
||||
@@ -42,7 +41,7 @@ module components() {
|
||||
translate([0, 50])
|
||||
TO220("Generic TO220 package");
|
||||
|
||||
translate([30, 50])
|
||||
translate([50, 50])
|
||||
panel_USBA();
|
||||
|
||||
translate([0,80])
|
||||
|
@@ -23,7 +23,7 @@ include <../vitamins/extrusions.scad>
|
||||
|
||||
module extrusions()
|
||||
layout([for(e = extrusions) extrusion_width(e)], 10)
|
||||
extrusion(extrusions[$i], 80);
|
||||
extrusion(extrusions[$i], 80, cornerHole = extrusion_width(extrusions[$i]) > 20);
|
||||
|
||||
if ($preview)
|
||||
extrusions();
|
||||
|
@@ -24,4 +24,5 @@ module fuseholders()
|
||||
fuseholder(6);
|
||||
|
||||
if($preview)
|
||||
fuseholders();
|
||||
let($show_threads = 1)
|
||||
fuseholders();
|
||||
|
@@ -32,4 +32,5 @@ module jacks() {
|
||||
}
|
||||
|
||||
if($preview)
|
||||
jacks();
|
||||
let($show_threads = true)
|
||||
jacks();
|
||||
|
@@ -61,6 +61,19 @@ module nuts() {
|
||||
if(n == M4_nut)
|
||||
sliding_t_nut(M4_hammer_nut);
|
||||
}
|
||||
|
||||
translate([0, 100]) {
|
||||
if(n == M3_nut)
|
||||
nut_square(M3nS_thin_nut);
|
||||
if(n == M4_nut)
|
||||
nut_square(M4nS_thin_nut);
|
||||
if(n == M5_nut)
|
||||
nut_square(M5nS_thin_nut);
|
||||
if(n == M6_nut)
|
||||
nut_square(M6nS_thin_nut);
|
||||
if(n == M8_nut)
|
||||
nut_square(M8nS_thin_nut);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
BIN
tests/png/circlips.png
Normal file
After Width: | Height: | Size: 51 KiB |
Before Width: | Height: | Size: 101 KiB After Width: | Height: | Size: 101 KiB |
Before Width: | Height: | Size: 61 KiB After Width: | Height: | Size: 64 KiB |
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 26 KiB |
Before Width: | Height: | Size: 61 KiB After Width: | Height: | Size: 80 KiB |
Before Width: | Height: | Size: 75 KiB After Width: | Height: | Size: 79 KiB |
Before Width: | Height: | Size: 106 KiB After Width: | Height: | Size: 111 KiB |
Before Width: | Height: | Size: 144 KiB After Width: | Height: | Size: 143 KiB |
Before Width: | Height: | Size: 88 KiB After Width: | Height: | Size: 92 KiB |
@@ -18,7 +18,7 @@
|
||||
//
|
||||
include <../utils/core/core.scad>
|
||||
|
||||
include <../vitamins/wire.scad>
|
||||
use <../vitamins/wire.scad>
|
||||
|
||||
bundle = [7, 1.4];
|
||||
|
||||
|
@@ -56,6 +56,13 @@ function rotate(a, v) = //! Generate a 4x4 rotation matrix, ```a``` can be a vec
|
||||
[ 0, 0, 0, 1]
|
||||
];
|
||||
|
||||
function rot3_z(a) = //! Generate a 3x3 matrix to rotate around z
|
||||
let(c = cos(a),
|
||||
s = sin(a))
|
||||
[ [ c, -s, 0],
|
||||
[ s, c, 0],
|
||||
[ 0, 0, 1] ];
|
||||
|
||||
function scale(v) = let(s = is_list(v) ? v : [v, v, v]) //! Generate a 4x4 matrix that scales by ```v```, which can be a vector of xyz factors or a scalar to scale all axes equally
|
||||
[
|
||||
[s.x, 0, 0, 0],
|
||||
|
@@ -79,7 +79,7 @@ module thread(dia, pitch, length, profile, center = true, top = -1, bot = -1, st
|
||||
sides = r2sides4n(r);
|
||||
step_angle = 360 / sides;
|
||||
segs = ceil(turns * sides);
|
||||
leadin = ceil(sides / starts);
|
||||
leadin = min(ceil(sides / starts), floor(turns * sides / 2));
|
||||
final = floor(turns * sides) - leadin;
|
||||
path = [for(i = [0 : segs],
|
||||
R = i < leadin && bot < 0 ? r + dir * (h - h * i / leadin)
|
||||
|
90
vitamins/circlip.scad
Normal file
@@ -0,0 +1,90 @@
|
||||
//
|
||||
// NopSCADlib Copyright Chris Palmer 2020
|
||||
// nop.head@gmail.com
|
||||
// hydraraptor.blogspot.com
|
||||
//
|
||||
// This file is part of NopSCADlib.
|
||||
//
|
||||
// NopSCADlib is free software: you can redistribute it and/or modify it under the terms of the
|
||||
// GNU General Public License as published by the Free Software Foundation, either version 3 of
|
||||
// the License, or (at your option) any later version.
|
||||
//
|
||||
// NopSCADlib is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
||||
// without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
// See the GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
||||
// If not, see <https://www.gnu.org/licenses/>.
|
||||
//
|
||||
|
||||
//
|
||||
//! Circlips aka tapered retaining rings.
|
||||
//
|
||||
include <../utils/core/core.scad>
|
||||
include <../utils/sector.scad>
|
||||
include <../utils/round.scad>
|
||||
include <../utils/maths.scad>
|
||||
|
||||
function circlip_d1(type) = type[1]; //! Nominal OD, i.e. diameter of tube
|
||||
function circlip_d2(type) = type[2]; //! Groove diameter, i.e. OD when installed
|
||||
function circlip_d3(type) = type[3]; //! Relaxed OD when not installed
|
||||
function circlip_thickness(type) = type[4]; //! Thickness
|
||||
function circlip_a(type) = type[5]; //! Size of the lugs
|
||||
function circlip_b(type) = type[6]; //! Widest part of the taper
|
||||
function circlip_d5(type) = type[7]; //! Plier hole diameter
|
||||
|
||||
circlip_colour = grey20;
|
||||
closed_angle = 25;
|
||||
|
||||
module internal_circlip(type, open = 0) { //! Draw specified internal circlip, open = 0, for nominal size installed, 1 for relaxed uninstalled, -1 for squeezed to install
|
||||
d1 = circlip_d1(type);
|
||||
|
||||
vitamin(str("circlip(", type[0], "): Circlip internal ", d1, "mm"));
|
||||
d3 = circlip_d3(type);
|
||||
d2 = circlip_d2(type);
|
||||
a = circlip_a(type);
|
||||
b = circlip_b(type);
|
||||
d5 = circlip_d5(type);
|
||||
|
||||
od = lookup(open, [[-1, d1], [0, d2], [1, d3]]);
|
||||
or = od / 2;
|
||||
c = (d3 - d1);
|
||||
|
||||
angle = (od - d1) / d1 * 360 + closed_angle;
|
||||
tab_angle = 360 * a / PI / od;
|
||||
p = [0, -or + b / 2, 1] * rot3_z(angle / 2 + tab_angle);
|
||||
pitch = (or - a / 2);
|
||||
y_offset = (sqr(p.x) + sqr(p.y) - sqr(or - b)) / (or - b - p.y) / 2;
|
||||
ir = or - b + y_offset;
|
||||
color(circlip_colour)
|
||||
linear_extrude(height = circlip_thickness(type), center = true)
|
||||
round((a - d5) / 5)
|
||||
union() {
|
||||
difference() {
|
||||
circle(or);
|
||||
|
||||
translate([0, -y_offset])
|
||||
circle(ir);
|
||||
|
||||
sector(d3 / 2 + 1, 270 - angle / 2 - tab_angle, 270 + angle / 2 + tab_angle);
|
||||
|
||||
}
|
||||
for(side = [-1, 1])
|
||||
intersection() {
|
||||
circle(or);
|
||||
|
||||
rotate(side * (angle + tab_angle) / 2)
|
||||
difference() {
|
||||
hull() {
|
||||
translate([0, -pitch])
|
||||
circle(d = a);
|
||||
|
||||
translate([0, -pitch - a])
|
||||
circle(d = 1.5 * a);
|
||||
}
|
||||
translate([0, -pitch])
|
||||
circle(d = d5);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
28
vitamins/circlips.scad
Normal file
@@ -0,0 +1,28 @@
|
||||
//
|
||||
// NopSCADlib Copyright Chris Palmer 2020
|
||||
// nop.head@gmail.com
|
||||
// hydraraptor.blogspot.com
|
||||
//
|
||||
// This file is part of NopSCADlib.
|
||||
//
|
||||
// NopSCADlib is free software: you can redistribute it and/or modify it under the terms of the
|
||||
// GNU General Public License as published by the Free Software Foundation, either version 3 of
|
||||
// the License, or (at your option) any later version.
|
||||
//
|
||||
// NopSCADlib is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
||||
// without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
// See the GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
||||
// If not, see <https://www.gnu.org/licenses/>.
|
||||
//
|
||||
// d1 d2 d3 s a b d5
|
||||
circlip_12i = ["circlip_12i", 12, 12.5, 13.0, 1.0, 3.4, 1.7, 1.5];
|
||||
circlip_15i = ["circlip_15i", 15, 15.7, 16.2, 1.0, 3.7, 2.0, 1.7];
|
||||
circlip_19i = ["circlip_19i", 19, 20.0, 20.5, 1.0, 4.1, 2.2, 2.0];
|
||||
circlip_21i = ["circlip_21i", 21, 22.0, 22.5, 1.0, 4.2, 2.4, 2.0];
|
||||
circlip_28i = ["circlip_28i", 28, 29.4, 30.1, 1.2, 4.8, 2.9, 2.0];
|
||||
|
||||
circlips = [circlip_12i, circlip_15i, circlip_19i, circlip_21i, circlip_28i];
|
||||
|
||||
use <circlip.scad>
|
@@ -101,7 +101,8 @@ module extrusion_cross_section(type, cornerHole) {
|
||||
translate([0,i*width+(width-height)/2])
|
||||
difference() {
|
||||
square([centerSquare,centerSquare],center=true);
|
||||
circle(d=extrusion_center_hole(type));
|
||||
if(extrusion_center_hole(type)>0)
|
||||
circle(d=extrusion_center_hole(type));
|
||||
}
|
||||
translate([0,(width-height)/2])
|
||||
for(angle=[0,90])
|
||||
|
@@ -20,6 +20,7 @@
|
||||
// Extrusion
|
||||
//
|
||||
// W H d1 d2 s cw cwi t st f
|
||||
E1515 = [ "E1515", 15, 15, 2.5, 0,5.7,3.4, 5.7, 1.1,1.1, 0.5 ];
|
||||
E2020 = [ "E2020", 20, 20, 4.2, 3, 8, 6, 12.0, 2, 2, 1 ];
|
||||
E2040 = [ "E2040", 20, 40, 4.2, 3, 8, 6, 12.0, 2, 2, 1 ];
|
||||
E2060 = [ "E2060", 20, 60, 4.2, 3, 8, 6, 12.0, 2, 2, 1 ];
|
||||
@@ -29,7 +30,7 @@ E3060 = [ "E3060", 30, 60, 6.8, 4.2, 12, 8, 16.5, 2, 2, 1 ];
|
||||
E4040 = [ "E4040", 40, 40, 10.5, 6.0, 15, 10, 20.0, 5.5, 3, 1 ];
|
||||
E4080 = [ "E4080", 40, 80, 10.5, 6.0, 15, 10, 20.0, 5.5, 3, 1 ];
|
||||
|
||||
extrusions = [E2020,E2040,E2060,E2080,E3030,E3060,E4040,E4080];
|
||||
extrusions = [E1515,E2020,E2040,E2060,E2080,E3030,E3060,E4040,E4080];
|
||||
|
||||
use <extrusion.scad>
|
||||
|
||||
|
@@ -23,6 +23,7 @@
|
||||
include <../utils/core/core.scad>
|
||||
include <spades.scad>
|
||||
use <../utils/tube.scad>
|
||||
use <../utils/thread.scad>
|
||||
|
||||
module fuseholder_hole(h = 100) //! Hole with flats for fuseholder
|
||||
extrude_if(h)
|
||||
@@ -39,7 +40,8 @@ module fuseholder(thickness) { //! Fuseholder with nut in place for specified pa
|
||||
flange_d = fuseholder_diameter();
|
||||
flange_t = 2;
|
||||
height = 33.2;
|
||||
thread_d = 11.7;
|
||||
thread_d = 12;
|
||||
thread_p = 1;
|
||||
thread = 15;
|
||||
bot_d = 10.4;
|
||||
top_d = 8.7;
|
||||
@@ -59,24 +61,28 @@ module fuseholder(thickness) { //! Fuseholder with nut in place for specified pa
|
||||
//
|
||||
// Nut
|
||||
//
|
||||
colour = grey40;
|
||||
vflip()
|
||||
translate_z(thickness)
|
||||
explode(height)
|
||||
color("dimgrey") {
|
||||
tube(or = nut_d / 2, ir = 5, h = nut_flange_t, center = false);
|
||||
explode(height) {
|
||||
color(colour) {
|
||||
tube(or = nut_d / 2, ir = thread_d / 2, h = nut_flange_t, center = false);
|
||||
|
||||
linear_extrude(height = nut_t)
|
||||
difference() {
|
||||
circle(d = nut_d, $fn = 6);
|
||||
|
||||
circle(5);
|
||||
circle(d = thread_d);
|
||||
}
|
||||
}
|
||||
if(show_threads)
|
||||
female_metric_thread(thread_d, thread_p, nut_t, false, colour = colour);
|
||||
}
|
||||
//
|
||||
// Body
|
||||
//
|
||||
explode(height + 5, offset = -height - 4) {
|
||||
color("dimgrey") {
|
||||
color(colour) {
|
||||
tube(or = flange_d / 2, ir = 5.2, h = flange_t, center = false);
|
||||
|
||||
cylinder(r = 5, h = flange_t - 1);
|
||||
@@ -89,26 +95,35 @@ module fuseholder(thickness) { //! Fuseholder with nut in place for specified pa
|
||||
}
|
||||
|
||||
vflip() {
|
||||
linear_extrude(height = thread)
|
||||
intersection() {
|
||||
circle(d = thread_d);
|
||||
if(!show_threads)
|
||||
linear_extrude(height = thread)
|
||||
intersection() {
|
||||
circle(d = thread_d - 0.3);
|
||||
|
||||
square([100, 10.8], center = true);
|
||||
}
|
||||
render() difference() {
|
||||
translate_z(thread)
|
||||
cylinder(d1 = bot_d, d2 = top_d, h = height - flange_t - thread);
|
||||
square([100, 10.8], center = true);
|
||||
}
|
||||
render() difference() {
|
||||
translate_z(thread)
|
||||
cylinder(d1 = bot_d, d2 = top_d, h = height - flange_t - thread);
|
||||
|
||||
for(side = [-1, 1])
|
||||
translate([side * (contact_slot_d / 2 + 1) - 1, -contact_slot_w / 2, contact_slot_z])
|
||||
cube([2, contact_slot_w, 100]);
|
||||
}
|
||||
for(side = [-1, 1])
|
||||
translate([side * (contact_slot_d / 2 + 1) - 1, -contact_slot_w / 2, contact_slot_z])
|
||||
cube([2, contact_slot_w, 100]);
|
||||
}
|
||||
}
|
||||
if(show_threads)
|
||||
vflip()
|
||||
render() intersection() {
|
||||
male_metric_thread(thread_d, thread_p, thread, false, colour = colour);
|
||||
|
||||
translate_z(thread / 2)
|
||||
cube([100, 10.8, thread + 1], center = true);
|
||||
}
|
||||
}
|
||||
//
|
||||
// Side contacts
|
||||
//
|
||||
color("silver") vflip()
|
||||
color(silver) vflip()
|
||||
for(side = [-1, 1])
|
||||
translate([side * contact_slot_d / 2, 0, contact_slot_z])
|
||||
rotate([0, -70, 90 - side * 90])
|
||||
|
@@ -177,6 +177,3 @@ module green_terminal(type, ways, skip = [], colour = "lime") { //! Draw green t
|
||||
translate([0, i * pitch - width / 2 + pitch / 2])
|
||||
single(in(skip, i));
|
||||
}
|
||||
|
||||
module terminal_254(ways, skip = []) //! Draw 0.1" terminal block
|
||||
green_terminal(gt_2p54, ways, skip);
|
||||
|
@@ -25,6 +25,7 @@ include <../core.scad>
|
||||
include <spades.scad>
|
||||
use <../utils/tube.scad>
|
||||
use <../utils/rounded_cylinder.scad>
|
||||
use <../utils/thread.scad>
|
||||
use <ring_terminal.scad>
|
||||
|
||||
function jack_4mm_hole_radius() = 8/2; //! Panel hole radius for 4mm jack
|
||||
@@ -39,6 +40,7 @@ module jack_4mm(colour, thickness, display_colour = false) { //! Draw a 4mm jack
|
||||
sleaved_d = 6.4;
|
||||
thread = 10.4;
|
||||
thread_d = 8;
|
||||
thread_p = 0.75;
|
||||
nut_d = 9.8;
|
||||
nut_t = 3;
|
||||
barrel_d = 5.4;
|
||||
@@ -56,28 +58,33 @@ module jack_4mm(colour, thickness, display_colour = false) { //! Draw a 4mm jack
|
||||
}
|
||||
square([flange_id, 100], center = true);
|
||||
}
|
||||
color("silver") rotate_extrude() difference() {
|
||||
color(silver) rotate_extrude() difference() {
|
||||
union() {
|
||||
translate([0, -thread])
|
||||
square([thread_d / 2, thread]);
|
||||
|
||||
*translate([0, -nut_t - thickness])
|
||||
square([nut_d / 2, nut_t]);
|
||||
square([thread_d / 2 - (show_threads ? thread_p / 2 : 0), thread]);
|
||||
|
||||
translate([0, -barrel])
|
||||
square([barrel_d / 2, barrel]);
|
||||
}
|
||||
square([4, 2 * (barrel - 1)], center = true);
|
||||
}
|
||||
if(show_threads)
|
||||
translate_z(-thread)
|
||||
male_metric_thread(thread_d, thread_p, thread, false, solid = false, colour = silver);
|
||||
|
||||
translate_z(-length + flange_t + spade)
|
||||
vflip()
|
||||
spade(spade4p8l, spade);
|
||||
}
|
||||
translate_z(-thickness)
|
||||
explode(-length)
|
||||
color("silver")
|
||||
vflip()
|
||||
vflip() {
|
||||
color(silver)
|
||||
tube(ir = thread_d / 2, or = nut_d / 2, h = nut_t, center = false);
|
||||
|
||||
if(show_threads)
|
||||
female_metric_thread(thread_d, thread_p, nut_t, false, colour = silver);
|
||||
}
|
||||
}
|
||||
|
||||
function jack_4mm_shielded_hole_radius() = 12/2; //! Panel hole radius for 4mm shielded jack
|
||||
@@ -90,14 +97,16 @@ module jack_4mm_shielded(colour, thickness, display_colour = false) { //! Draw a
|
||||
sleaved = 21;
|
||||
sleaved_d = 10.7;
|
||||
thread = 14;
|
||||
thread_d = 11.7;
|
||||
thread_d = 12;
|
||||
thread_p = 0.75;
|
||||
nut_d = 14.4;
|
||||
nut_t = 5;
|
||||
length = 32;
|
||||
spade = 8.5;
|
||||
actual_colour = display_colour ? display_colour : colour;
|
||||
|
||||
explode(length, offset = -length + flange_t) {
|
||||
color(display_colour ? display_colour : colour) {
|
||||
color(actual_colour) {
|
||||
rounded_cylinder(r = flange_d / 2, h = flange_t, r2 = 1, ir = 4.5);
|
||||
|
||||
rotate_extrude() difference() {
|
||||
@@ -105,8 +114,9 @@ module jack_4mm_shielded(colour, thickness, display_colour = false) { //! Draw a
|
||||
translate([0, -sleaved])
|
||||
square([sleaved_d / 2, sleaved + flange_t]);
|
||||
|
||||
translate([0, -thread])
|
||||
square([thread_d / 2, thread]);
|
||||
if(!show_threads)
|
||||
translate([0, -thread])
|
||||
square([thread_d / 2, thread]);
|
||||
}
|
||||
square([flange_id, 100], center = true);
|
||||
|
||||
@@ -115,8 +125,13 @@ module jack_4mm_shielded(colour, thickness, display_colour = false) { //! Draw a
|
||||
square([6, 2 * sleaved], center = true);
|
||||
}
|
||||
}
|
||||
|
||||
if(show_threads)
|
||||
translate_z(-thread)
|
||||
male_metric_thread(thread_d, thread_p, thread, false, solid = false);
|
||||
}
|
||||
color("silver")
|
||||
|
||||
color(silver)
|
||||
translate_z(-length + flange_t + spade - 0.5)
|
||||
cylinder(d = 4.8, h = 0.5);
|
||||
|
||||
@@ -127,10 +142,13 @@ module jack_4mm_shielded(colour, thickness, display_colour = false) { //! Draw a
|
||||
|
||||
translate_z(-thickness)
|
||||
explode(-length)
|
||||
color("silver")
|
||||
vflip()
|
||||
vflip() {
|
||||
color(silver)
|
||||
tube(ir = thread_d / 2, or = nut_d / 2, h = nut_t, center = false);
|
||||
|
||||
if(show_threads)
|
||||
female_metric_thread(thread_d, thread_p, nut_t, false, colour = silver);
|
||||
}
|
||||
}
|
||||
|
||||
function post_4mm_diameter() = 13; //! Outer diameter of 4mm binding post
|
||||
@@ -167,14 +185,15 @@ module post_4mm(colour, thickness, display_colour = false) { //! Draw a 4mm bind
|
||||
|
||||
post_od = 9.5;
|
||||
post_metal = 0.2;
|
||||
thread_d = 3.5;
|
||||
thread_d = 3.6;
|
||||
thread_p = 0.66;
|
||||
thread_l = 15;
|
||||
post_d = 7;
|
||||
post_h = 14;
|
||||
|
||||
ringterm = ["", 6.3, 3.8, 16.7, 3, 1.6, 0.3, M4_dome_screw];
|
||||
|
||||
module washer() {
|
||||
module washer() color(silver) {
|
||||
washer_t = 0.65;
|
||||
|
||||
tube(or = 7.6 / 2, ir = thread_d / 2, h = washer_t, center = false);
|
||||
@@ -186,11 +205,14 @@ module post_4mm(colour, thickness, display_colour = false) { //! Draw a 4mm bind
|
||||
module nut() {
|
||||
nut_t = 2.3;
|
||||
|
||||
linear_extrude(height = nut_t) difference() {
|
||||
circle(d = 6.3 / cos(30), $fn = 6);
|
||||
color(silver)
|
||||
linear_extrude(height = nut_t) difference() {
|
||||
circle(d = 6.3 / cos(30), $fn = 6);
|
||||
|
||||
circle(d = thread_d);
|
||||
}
|
||||
circle(d = thread_d);
|
||||
}
|
||||
if(show_threads)
|
||||
female_metric_thread(thread_d, thread_p, nut_t, false, colour = silver);
|
||||
|
||||
translate_z(nut_t)
|
||||
children();
|
||||
@@ -219,8 +241,7 @@ module post_4mm(colour, thickness, display_colour = false) { //! Draw a 4mm bind
|
||||
render() difference() {
|
||||
rotate_extrude(angle = 360 / 8)
|
||||
polygon([
|
||||
[0, 0],
|
||||
[0, 2],
|
||||
[post_d / 2, 0],
|
||||
[post_d / 2, 2],
|
||||
[post_d / 2, 17.5],
|
||||
[11 / 2, 17.5],
|
||||
@@ -238,7 +259,7 @@ module post_4mm(colour, thickness, display_colour = false) { //! Draw a 4mm bind
|
||||
}
|
||||
}
|
||||
|
||||
color("silver") {
|
||||
color(silver) {
|
||||
translate_z(post_metal)
|
||||
cylinder(d = post_od, h = base_h);
|
||||
|
||||
@@ -252,9 +273,13 @@ module post_4mm(colour, thickness, display_colour = false) { //! Draw a 4mm bind
|
||||
square([2, post_h]);
|
||||
|
||||
}
|
||||
vflip()
|
||||
cylinder(d = thread_d, h = thread_l);
|
||||
if(!show_threads)
|
||||
vflip()
|
||||
cylinder(d = thread_d, h = thread_l);
|
||||
}
|
||||
if(show_threads)
|
||||
vflip()
|
||||
male_metric_thread(thread_d, thread_p, thread_l, false, colour = silver);
|
||||
}
|
||||
explode(-15)
|
||||
color(actual_colour) {
|
||||
@@ -272,12 +297,11 @@ module post_4mm(colour, thickness, display_colour = false) { //! Draw a 4mm bind
|
||||
}
|
||||
translate_z(-thickness - base_h)
|
||||
explode(-20, true)
|
||||
color("silver")
|
||||
vflip()
|
||||
not_on_bom()
|
||||
washer()
|
||||
explode(5, true) nut()
|
||||
explode(5, true) ring_terminal(ringterm)
|
||||
explode(5, true) washer()
|
||||
explode(5, true) nut();
|
||||
vflip()
|
||||
not_on_bom()
|
||||
washer()
|
||||
explode(5, true) nut()
|
||||
explode(5, true) ring_terminal(ringterm)
|
||||
explode(5, true) washer()
|
||||
explode(5, true) nut();
|
||||
}
|
||||
|
@@ -26,7 +26,7 @@ use <../utils/tube.scad>
|
||||
|
||||
bearing_colour = grey70;
|
||||
groove_colour = grey60;
|
||||
seal_colour = grey20;
|
||||
seal_colour = grey30;
|
||||
|
||||
|
||||
function bearing_length(type) = type[1]; //! Total length
|
||||
@@ -61,5 +61,10 @@ module linear_bearing(type) { //! Draw specified linear bearing
|
||||
color(bearing_colour) translate_z(offset+gs) tube(or = or, ir = casing_ir, h = offset, center = false);
|
||||
}
|
||||
}
|
||||
color(seal_colour) tube(or = casing_ir, ir = bearing_rod_dia(type) / 2, h = length - 0.5);
|
||||
rod_r = bearing_rod_dia(type) / 2;
|
||||
color(seal_colour)
|
||||
tube(or = casing_ir, ir = rod_r + eps, h = length - 0.5);
|
||||
|
||||
color(seal_colour * 0.8)
|
||||
tube(or = rod_r * 1.12, ir = rod_r, h = length);
|
||||
}
|
||||
|
@@ -39,6 +39,10 @@ function nut_trap_depth(type) = type[6]; //! Depth of nut trap
|
||||
|
||||
function nut_flat_radius(type) = nut_radius(type) * cos(30); //! Radius across the flats
|
||||
|
||||
function nut_square_size(type) = type[1]; //! Diameter of the corresponding screw
|
||||
function nut_square_width(type) = type[2]; //! Width of the square nut
|
||||
function nut_square_thickness(type) = type[3]; //! Thickness of the square nut
|
||||
|
||||
module nut(type, nyloc = false, brass = false, nylon = false) { //! Draw specified nut
|
||||
thread_d = nut_size(type);
|
||||
hole_rad = thread_d / 2;
|
||||
@@ -189,6 +193,31 @@ module extrusionSlidingNut(size, tabSizeY1, tabSizeY2, tabSizeZ, holeRadius, hol
|
||||
}
|
||||
}
|
||||
|
||||
module nut_square(type, brass = false, nylon = false) { //! Draw specified square nut
|
||||
thread_d = nut_size(type);
|
||||
hole_rad = thread_d / 2;
|
||||
width = nut_square_width(type);
|
||||
thickness = nut_square_thickness(type);
|
||||
desc = brass ? "brass" : nylon ? "nylon" : "";
|
||||
vitamin(str("nut(", type[0], arg(brass, false, "brass"), arg(nylon, false, "nylon"),
|
||||
"): Nut M", nut_size(type), "nS ", width, " x ", thickness, "mm ", desc));
|
||||
|
||||
colour = brass ? brass_colour : nylon ? grey30 : grey70;
|
||||
color(colour)
|
||||
difference() {
|
||||
linear_extrude(height = thickness) {
|
||||
difference() {
|
||||
square([width, width], center = true);
|
||||
|
||||
circle(hole_rad);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
if(show_threads)
|
||||
female_metric_thread(thread_d, metric_coarse_pitch(thread_d), thickness, center = false, colour = colour);
|
||||
}
|
||||
|
||||
function nut_trap_radius(nut, horizontal = false) = nut_radius(nut) + (horizontal ? layer_height / 4 : 0); //! Radius across the corners of a nut trap
|
||||
function nut_trap_flat_radius(nut, horizontal = false) = nut_trap_radius(nut, horizontal) * cos(30); //! Radius across the flats of a nut trap
|
||||
|
||||
|
@@ -51,6 +51,20 @@ toggle_nut = ["toggle_nut", 6.1, 9.2, 1.5, 1.5, M6_washer, 1.5]
|
||||
|
||||
M4_wingnut = ["M4_wingnut", 4, 10, 3.75,8, M4_washer, 0, 22, 10, 6, 3];
|
||||
|
||||
// DIN 562 (thin) square nuts
|
||||
// s w h
|
||||
// c i e
|
||||
// r d i
|
||||
// e t g
|
||||
// w h h
|
||||
// t
|
||||
//
|
||||
M3nS_thin_nut = ["M3nS_thin_nut", 3, 5.5, 1.8];
|
||||
M4nS_thin_nut = ["M4nS_thin_nut", 4, 7, 2.2];
|
||||
M5nS_thin_nut = ["M5nS_thin_nut", 5, 8, 2.7];
|
||||
M6nS_thin_nut = ["M6nS_thin_nut", 6, 10, 3.2];
|
||||
M8nS_thin_nut = ["M8nS_thin_nut", 8, 13, 4];
|
||||
|
||||
// sx ty1 ty2 hammer
|
||||
M3_sliding_t_nut = ["M3_sliding_t_nut", 3, 6, 3.0, 4.0, false, 0, 10, 10, 6, false];
|
||||
M4_sliding_t_nut = ["M4_sliding_t_nut", 4, 6, 3.25,4.5, false, 0, 11, 10, 6, false];
|
||||
|
@@ -26,7 +26,7 @@ include <../core.scad>
|
||||
include <buttons.scad>
|
||||
include <green_terminals.scad>
|
||||
include <pin_headers.scad>
|
||||
include <microswitches.scad>
|
||||
use <microswitch.scad>
|
||||
|
||||
use <../utils/rounded_cylinder.scad>
|
||||
use <../utils/dogbones.scad>
|
||||
@@ -63,17 +63,20 @@ function pcb_coord(type, p) = let(l = pcb_length(type), w = pcb_width(type)) //!
|
||||
[(p.x >= 0 ? p.x : l + p.x) - l / 2,
|
||||
(p.y >= 0 ? p.y : w + p.y) - w / 2];
|
||||
|
||||
module pcb_screw_positions(type) { //! Positions children at the mounting hole positions
|
||||
module pcb_hole_positions(type, all = true) { // Positition children at the hole positions, including holes not used for screws
|
||||
holes = pcb_holes(type);
|
||||
|
||||
if(len(holes))
|
||||
for($i = [0 : len(holes) - 1]) {
|
||||
p = pcb_coord(type, holes[$i]);
|
||||
translate([p.x, p.y, 0])
|
||||
for($i = [0 : 1 : len(holes) - 1]) {
|
||||
hole = holes[$i];
|
||||
if(len(hole) == 2 || all)
|
||||
translate(pcb_coord(type, hole))
|
||||
children();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module pcb_screw_positions(type) //! Positions children at the mounting hole positions
|
||||
pcb_hole_positions(type, false) children();
|
||||
|
||||
module chip(length, width, thickness, colour, cutout = false) //! Draw a coloured cube to represent a chip, or other rectangular component
|
||||
if(!cutout)
|
||||
color(colour)
|
||||
@@ -837,7 +840,7 @@ module pcb(type) { //! Draw specified PCB
|
||||
else
|
||||
rounded_square([pcb_length(type), pcb_width(type)], r = pcb_radius(type));
|
||||
|
||||
pcb_screw_positions(type)
|
||||
pcb_hole_positions(type)
|
||||
circle(d = pcb_hole_d(type) + eps);
|
||||
|
||||
if(Len(grid))
|
||||
@@ -847,7 +850,7 @@ module pcb(type) { //! Draw specified PCB
|
||||
|
||||
color("silver")
|
||||
translate_z(t / 2)
|
||||
pcb_screw_positions(type)
|
||||
pcb_hole_positions(type)
|
||||
tube(or = max(pcb_land_d(type), 1) / 2, ir = pcb_hole_d(type) / 2, h = t + 2 * eps);
|
||||
|
||||
fr4 = pcb_colour(type) != "sienna";
|
||||
|
@@ -342,7 +342,7 @@ PSU12V1A = ["PSU12V1A", "PSU 12V 1A", 67, 31, 1.7, 0, 3.9, 0, "green", true, [[3
|
||||
RAMPSEndstop = ["RAMPSEndstop", "RAMPS Endstop Switch",
|
||||
40.0, 16.0, 1.6, 0.5, 2.54, 0, "red", false,
|
||||
[
|
||||
[2, 2], [2, 13.5], [17, 13.5], [36, 13.5]
|
||||
[2, 2, false], [2, 13.5, false], [17, 13.5], [36, 13.5]
|
||||
],
|
||||
[
|
||||
[ 12, 8, -90, "jst_xh", 3, true, "white", "silver"],
|
||||
|
@@ -27,6 +27,7 @@ use <screw.scad>
|
||||
use <nut.scad>
|
||||
use <washer.scad>
|
||||
use <linear_bearing.scad>
|
||||
use <circlip.scad>
|
||||
|
||||
function scs_size(type) = [type[4],type[6],type[5]]; //! Size of scs bracket bounding block
|
||||
function scs_hole_offset(type) = type[2]; //! Offset of bearing hole from base of block
|
||||
@@ -36,6 +37,8 @@ function scs_screw(type) = type[11]; //! Screw type
|
||||
function scs_screw_separation_x(type) = type[8]; //! Screw separation in X direction
|
||||
function scs_screw_separation_z(type) = type[9]; //! Screw separation in Z direction
|
||||
function scs_bearing(type) = type[14]; //! Linear bearing used
|
||||
function scs_circlip(type) = type[15]; //! Circlip used
|
||||
function scs_spacer(type) = type[16]; //! Spacer used in long bearings
|
||||
|
||||
|
||||
sks_bearing_block_color = grey90;
|
||||
@@ -57,6 +60,8 @@ module scs_bearing_block(type) { //! Draw the specified SCS bearing block
|
||||
S1 = scs_screw(type);
|
||||
S2 = type[12];
|
||||
L1 = type[13];
|
||||
bearing = scs_bearing(type);
|
||||
clip = scs_circlip(type);
|
||||
|
||||
module right_trapezoid(base, top, height, h = 0, center = true) {//! A right angled trapezoid with the 90° corner at the origin. 3D when ```h``` is nonzero, otherwise 2D
|
||||
extrude_if(h, center = center)
|
||||
@@ -64,11 +69,11 @@ module scs_bearing_block(type) { //! Draw the specified SCS bearing block
|
||||
}
|
||||
|
||||
boltHoleRadius = screw_clearance_radius(S1);
|
||||
footHeight = min(0.75, (G - bearing_dia(scs_bearing(type)) - 1.5) / 2); // estimate, not specified on drawings
|
||||
footHeight = min(0.75, (G - bearing_dia(bearing) - 1.5) / 2); // estimate, not specified on drawings
|
||||
|
||||
color(sks_bearing_block_color) {
|
||||
linear_extrude(L, center = true) {
|
||||
bearingRadius = bearing_dia(scs_bearing(type)) / 2;
|
||||
bearingRadius = bearing_dia(bearing) / 2;
|
||||
// center section with bearing hole
|
||||
difference() {
|
||||
union() {
|
||||
@@ -117,8 +122,17 @@ module scs_bearing_block(type) { //! Draw the specified SCS bearing block
|
||||
circle(r = boltHoleRadius);
|
||||
}
|
||||
}
|
||||
not_on_bom() no_explode()
|
||||
linear_bearing(scs_bearing(type));
|
||||
not_on_bom() no_explode() {
|
||||
spacer = scs_spacer(type);
|
||||
for(end = spacer ? [-1, 1] : 0)
|
||||
translate_z(end * (bearing_length(bearing) + spacer) / 2)
|
||||
linear_bearing(bearing);
|
||||
|
||||
for(end = [-1, 1])
|
||||
translate_z(end * ((spacer ? 2 * bearing_length(bearing) + spacer : bearing_length(bearing)) + circlip_thickness(clip)) / 2)
|
||||
rotate(180)
|
||||
internal_circlip(clip);
|
||||
}
|
||||
}
|
||||
|
||||
module scs_bearing_block_hole_positions(type) { //! Place children at hole positions
|
||||
|
@@ -22,18 +22,19 @@
|
||||
//
|
||||
|
||||
include <linear_bearings.scad>
|
||||
include <circlips.scad>
|
||||
|
||||
// T h E W L F G B C K S1 S2 L1 LB
|
||||
SCS6UU = ["SCS6UU", 6, 9, 15, 30, 25, 18, 15, 20, 15, 5, M4_cap_screw, 3.4, 8, LM6UU];
|
||||
SCS8UU = ["SCS8UU", 6, 11, 17, 34, 30, 22, 18, 24, 18, 5, M4_cap_screw, 3.4, 8, LM8UU];
|
||||
SCS10UU = ["SCS10UU", 8, 13, 20, 40, 35, 26, 21, 28, 21, 6, M5_cap_screw, 4.3, 12, LM10UU];
|
||||
SCS12UU = ["SCS12UU", 8, 15, 21, 42, 36, 28, 24, 30.5, 26, 5.75, M5_cap_screw, 4.3, 12, LM12UU];
|
||||
SCS16UU = ["SCS16UU", 9, 19, 25, 50, 44, 38.5, 32.5, 36, 34, 7, M5_cap_screw, 4.3, 12, LM16UU];
|
||||
SCS6UU = ["SCS6UU", 6, 9, 15, 30, 25, 18, 15, 20, 15, 5, M4_cap_screw, 3.4, 8, LM6UU, circlip_12i, 0];
|
||||
SCS8UU = ["SCS8UU", 6, 11, 17, 34, 30, 22, 18, 24, 18, 5, M4_cap_screw, 3.4, 8, LM8UU, circlip_15i, 0];
|
||||
SCS10UU = ["SCS10UU", 8, 13, 20, 40, 35, 26, 21, 28, 21, 6, M5_cap_screw, 4.3, 12, LM10UU, circlip_19i, 0];
|
||||
SCS12UU = ["SCS12UU", 8, 15, 21, 42, 36, 28, 24, 30.5, 26, 5.75, M5_cap_screw, 4.3, 12, LM12UU, circlip_21i, 0];
|
||||
SCS16UU = ["SCS16UU", 9, 19, 25, 50, 44, 38.5, 32.5, 36, 34, 7, M5_cap_screw, 4.3, 12, LM16UU, circlip_28i, 0];
|
||||
|
||||
SCS8LUU = ["SCS8LUU", 6, 11, 17, 34, 58, 22, 18, 24, 42, 5, M4_cap_screw, 3.4, 8, LM8LUU];
|
||||
SCS10LUU = ["SCS10LUU", 8, 13, 20, 40, 68, 26, 21, 28, 45, 6, M5_cap_screw, 4.3, 12, LM10LUU];
|
||||
SCS12LUU = ["SCS12LUU", 8, 15, 21, 42, 70, 28, 24, 30.5, 50, 5.75, M5_cap_screw, 4.3, 12, LM12LUU];
|
||||
SCS16LUU = ["SCS16LUU", 9, 19, 25, 50, 85, 38.5, 32.5, 36, 60, 7, M5_cap_screw, 4.3, 12, LM16LUU];
|
||||
SCS8LUU = ["SCS8LUU", 6, 11, 17, 34, 58, 22, 18, 24, 42, 5, M4_cap_screw, 3.4, 8, LM8UU, circlip_15i, 4];
|
||||
SCS10LUU = ["SCS10LUU", 8, 13, 20, 40, 68, 26, 21, 28, 45, 6, M5_cap_screw, 4.3, 12, LM10UU, circlip_19i, 4];
|
||||
SCS12LUU = ["SCS12LUU", 8, 15, 21, 42, 70, 28, 24, 30.5, 50, 5.75, M5_cap_screw, 4.3, 12, LM12UU, circlip_21i, 4];
|
||||
SCS16LUU = ["SCS16LUU", 9, 19, 25, 50, 85, 38.5, 32.5, 36, 60, 7, M5_cap_screw, 4.3, 12, LM16UU, circlip_28i, 4];
|
||||
|
||||
|
||||
scs_bearing_blocks = [SCS6UU, SCS8UU, SCS10UU, SCS12UU, SCS16UU];
|
||||
|