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

Compare commits

...

19 Commits

Author SHA1 Message Date
Chris Palmer
e4f6227e9a Fixed include path in gridfinity test file. 2025-08-11 16:05:36 +01:00
Chris Palmer
4c4a40c30e Updated changelog. 2025-07-29 21:04:39 +01:00
Chris Palmer
aedccd35b3 Updated images and readme. 2025-07-29 20:51:04 +01:00
Chris Palmer
98b82873bf Fixed undef extrusion type in BOM 2025-07-29 20:48:41 +01:00
Chris Palmer
aca921d737 Fixed some indentation. 2025-07-29 20:48:13 +01:00
Alex Verschoot
018f70ae3c moved the corner_3d_connector over to the extrusion brackets 2025-07-19 15:57:09 +02:00
Alex Verschoot
89c4b96525 replaced the nut diameter with the actual nut from the vitamin list 2025-07-19 00:50:43 +02:00
Alex Verschoot
4e443fc742 used the show_threads variable instead of parameter 2025-07-18 21:00:26 +02:00
Alex Verschoot
f032bb76db added convexity to the linear extrude 2025-07-18 19:52:45 +02:00
Alex Verschoot
c23c3619e4 fixed length typo 2025-07-18 19:48:32 +02:00
Alex Verschoot
c16f0bd472 more formatting 2025-07-17 22:45:04 +02:00
Alex Verschoot
9756845c59 formatting + extra comments 2025-07-17 22:42:02 +02:00
Alex Verschoot
00eeb1b52d Added a testfile for the corner3d connector 2025-07-15 23:31:00 +02:00
Alex Verschoot
80b17a012d renamed variables + corrected horizontal directions 2025-07-15 23:13:09 +02:00
Alex Verschoot
9327c7c134 added option for grub screws 2025-07-12 22:45:13 +02:00
Alex Verschoot
55f7537ba6 made threads a toggle 2025-07-12 21:35:41 +02:00
Alex Verschoot
bfaa48dc7c Added the implementation 2025-07-12 15:04:03 +02:00
Alex Verschoot
a785ae1050 added a corner_3d_connectors page 2025-07-12 12:52:34 +02:00
Chris Palmer
20ee4026f8 Updated changelog. 2025-07-01 15:06:55 +01:00
7 changed files with 459 additions and 198 deletions

View File

@@ -3,6 +3,44 @@
This changelog is generated by `changelog.py` using manually added semantic version tags to classify commits as breaking changes, additions or fixes.
### [v21.41.0](https://github.com/nophead/NopSCADlib/releases/tag/v21.41.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v21.40.0...v21.41.0 "diff with v21.40.0")
* 2025-07-29 [`aedccd3`](https://github.com/nophead/NopSCADlib/commit/aedccd35b32591932d73cb8b429a1ca57152f781 "show commit") [C.P.](# "Chris Palmer") Updated images and readme.
* 2025-07-29 [`98b8287`](https://github.com/nophead/NopSCADlib/commit/98b82873bff27e592cb13be72c923cac42ab7842 "show commit") [C.P.](# "Chris Palmer") Fixed undef extrusion type in BOM
* 2025-07-29 [`aca921d`](https://github.com/nophead/NopSCADlib/commit/aca921d737c0a9e89a318385ac2945b7ed932114 "show commit") [C.P.](# "Chris Palmer") Fixed some indentation.
* 2025-07-19 [`018f70a`](https://github.com/nophead/NopSCADlib/commit/018f70ae3c51cda911471ec1922cd1dcb5c73cb0 "show commit") [A.V.](# "Alex Verschoot") moved the `corner_3d_connector` over to the extrusion brackets
* 2025-07-19 [`89c4b96`](https://github.com/nophead/NopSCADlib/commit/89c4b96525c0bdd1cd73756fd7a12f2c8144a6fd "show commit") [A.V.](# "Alex Verschoot") replaced the nut diameter with the actual nut from the vitamin list
* 2025-07-18 [`4e443fc`](https://github.com/nophead/NopSCADlib/commit/4e443fc742bbce2efc5777fb0ab0395ac199bcfb "show commit") [A.V.](# "Alex Verschoot") used the `show_threads` variable instead of parameter
* 2025-07-18 [`f032bb7`](https://github.com/nophead/NopSCADlib/commit/f032bb76db516a0265817e7c6d2233e2e847d51f "show commit") [A.V.](# "Alex Verschoot") added convexity to the linear extrude
* 2025-07-18 [`c23c361`](https://github.com/nophead/NopSCADlib/commit/c23c3619e4090db59a1c4120375a54b5f4333817 "show commit") [A.V.](# "Alex Verschoot") fixed length typo
* 2025-07-17 [`c16f0bd`](https://github.com/nophead/NopSCADlib/commit/c16f0bd47290d7215b5c66fff08b9e3f6bd34485 "show commit") [A.V.](# "Alex Verschoot") more formatting
* 2025-07-17 [`9756845`](https://github.com/nophead/NopSCADlib/commit/9756845c59a85499c6f5c5efe029783735fc4e73 "show commit") [A.V.](# "Alex Verschoot") formatting + extra comments
* 2025-07-15 [`00eeb1b`](https://github.com/nophead/NopSCADlib/commit/00eeb1b52de100200dd73b60ac605224033b0351 "show commit") [A.V.](# "Alex Verschoot") Added a testfile for the corner3d connector
* 2025-07-15 [`80b17a0`](https://github.com/nophead/NopSCADlib/commit/80b17a012db0b2fa21b77205a1faafc5d9475abe "show commit") [A.V.](# "Alex Verschoot") renamed variables + corrected horizontal directions
* 2025-07-12 [`9327c7c`](https://github.com/nophead/NopSCADlib/commit/9327c7c134a73c044e0fdba95f58e00ceaaaee05 "show commit") [A.V.](# "Alex Verschoot") added option for grub screws
* 2025-07-12 [`55f7537`](https://github.com/nophead/NopSCADlib/commit/55f7537ba62242c5ed89f48fb05cb426e382132c "show commit") [A.V.](# "Alex Verschoot") made threads a toggle
* 2025-07-12 [`bfaa48d`](https://github.com/nophead/NopSCADlib/commit/bfaa48dc7c0303d359b52a4a122ea14b74b535e2 "show commit") [A.V.](# "Alex Verschoot") Added the implementation
* 2025-07-12 [`a785ae1`](https://github.com/nophead/NopSCADlib/commit/a785ae105006c88dc7fb705e5c615d68131daf50 "show commit") [A.V.](# "Alex Verschoot") added a `corner_3d_connectors` page
### [v21.40.0](https://github.com/nophead/NopSCADlib/releases/tag/v21.40.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v21.39.0...v21.40.0 "diff with v21.39.0")
* 2025-07-01 [`d15cf6c`](https://github.com/nophead/NopSCADlib/commit/d15cf6cf35cbbd790525341c461e168eda9f3964 "show commit") [C.P.](# "Chris Palmer") Updated images and readme.
* 2025-06-28 [`ca9cc97`](https://github.com/nophead/NopSCADlib/commit/ca9cc97b2a26324bef2b4683bef82eaceee1ffe9 "show commit") [E.F.](# "Elliot Foster") Makerbeam work in progress
### [v21.39.0](https://github.com/nophead/NopSCADlib/releases/tag/v21.39.0 "show release") Additions [...](https://github.com/nophead/NopSCADlib/compare/v21.38.1...v21.39.0 "diff with v21.38.1")
* 2025-07-01 [`915ceea`](https://github.com/nophead/NopSCADlib/commit/915ceea296aa54e8432c98ac01d527d214740953 "show commit") [C.P.](# "Chris Palmer") Updated images and readme.

View File

@@ -1128,6 +1128,19 @@ Brackets for joining extrusions at a corner.
### Properties
| Function | Description |
|:--- |:--- |
| `extrusion_corner_bracket_3D_inner_height(type)` | The depth offset of the dip in the cuboid |
| `extrusion_corner_bracket_3D_inner_side_length(type)` | The length of the dip in the cuboid sides |
| `extrusion_corner_bracket_3D_nut_dia(type)` | The width of bottom part of the nut |
| `extrusion_corner_bracket_3D_nut_nyloc_thickness(type)` | The total thickness of the nut |
| `extrusion_corner_bracket_3D_nut_screw(type)` | The screw (most likely Mx_grub_screw from <NopSCADlib/vitamins/screws.scad>) |
| `extrusion_corner_bracket_3D_nut_screws_hor(type)` | The positions of the screw holes on the horizontal arms, expressed in %/100 of the nut arm |
| `extrusion_corner_bracket_3D_nut_screws_ver(type)` | The positions of the screw holes on the vertical arms, expressed in %/100 of the nut arm |
| `extrusion_corner_bracket_3D_nut_sx(type)` | The length of the nuts |
| `extrusion_corner_bracket_3D_nut_thickness(type)` | The thickness of the top part of the nut |
| `extrusion_corner_bracket_3D_nut_ty1(type)` | The total width of the nut |
| `extrusion_corner_bracket_3D_nut_ty2(type)` | The width of the top edge of the nut |
| `extrusion_corner_bracket_3D_outer_height(type)` | The height of the cuboid |
| `extrusion_corner_bracket_3D_outer_side_length(type)` | The length of the base cuboid sides |
| `extrusion_corner_bracket_base_thickness(type)` | Thickness of base of bracket |
| `extrusion_corner_bracket_extrusion(type)` | Default extrusion this bracket is for |
| `extrusion_corner_bracket_hole_offset(type)` | Hole offset from corner |
@@ -1139,12 +1152,20 @@ Brackets for joining extrusions at a corner.
| `extrusion_inner_corner_bracket_size(type)` | Size of inner bracket |
| `extrusion_inner_corner_bracket_tnut(type)` | The sliding t-nut it is based on |
### Functions
| Function | Description |
|:--- |:--- |
| `extrusion_corner_bracket_3D_get_x_offset(type)` | helper function to position the x beam |
| `extrusion_corner_bracket_3D_get_x_rot(type)` | helper function to rotate the y beam |
| `extrusion_corner_bracket_3D_get_y_offset(type)` | helper function to position the y beam |
| `extrusion_corner_bracket_3D_get_y_rot(type)` | helper function to rotate the y beam |
### Modules
| Module | Description |
|:--- |:--- |
| `extrusion_corner_bracket(type)` | Corner bracket for extrusion |
| `extrusion_corner_bracket_3D(type, grub_screws = true)` | draw the specified extrusion_corner_bracket_3D |
| `extrusion_corner_bracket_assembly(type, part_thickness = undef, screw_type = undef, nut_type = undef, max_screw_depth = undef, extrusion = undef)` | Assembly with fasteners in place |
| `extrusion_corner_bracket_hole_positions(type)` | Place children at hole positions |
| `extrusion_inner_corner_bracket(type, grub_screws = true, backwards = false, extrusion = undef)` | Inner corner bracket for extrusion |
![extrusion_brackets](tests/png/extrusion_brackets.png)
@@ -1152,21 +1173,30 @@ Brackets for joining extrusions at a corner.
### Vitamins
| Qty | Module call | BOM entry |
| ---:|:--- |:---|
| 3 | `extrusion(E2020, 40, cornerHole = true)` | Extrusion E2020 x 40mm |
| 2 | `extrusion(E2020t, 20.5)` | Extrusion E2020t x 20.5mm |
| 1 | `extrusion(E2020t, 28)` | Extrusion E2020t x 28mm |
| 2 | `extrusion(E2020t, 39.5)` | Extrusion E2020t x 39.5mm |
| 1 | `extrusion(E2020t, 48)` | Extrusion E2020t x 48mm |
| 3 | `extrusion(E3030, 40, cornerHole = true)` | Extrusion E3030 x 40mm |
| 3 | `extrusion(E4040, 40, cornerHole = true)` | Extrusion E4040 x 40mm |
| 1 | `extrusion(E4040t, 27.4, cornerHole = true)` | Extrusion E4040t x 27.4mm |
| 1 | `extrusion(E4040t, 40, cornerHole = true)` | Extrusion E4040t x 40mm |
| 1 | `extrusion(E4040t, 60.4, cornerHole = true)` | Extrusion E4040t x 60.4mm |
| 1 | `extrusion(E4040t, 80, cornerHole = true)` | Extrusion E4040t x 80mm |
| 2 | `extrusion_corner_bracket(E20_corner_bracket)` | Extrusion corner bracket 20mm for E2020t |
| 2 | `extrusion_corner_bracket(E40_corner_bracket)` | Extrusion corner bracket 35mm for E4040t |
| 2 | `extrusion_corner_bracket_3D(extrusion_corner_bracket_3D_2020)` | Extrusion corner bracket 3D mm for E2020 |
| 2 | `extrusion_corner_bracket_3D(extrusion_corner_bracket_3D_3030)` | Extrusion corner bracket 3D mm for E3030 |
| 2 | `extrusion_corner_bracket_3D(extrusion_corner_bracket_3D_4040)` | Extrusion corner bracket 3D mm for E4040 |
| 4 | `extrusion_inner_corner_bracket(E20_inner_corner_bracket)` | Extrusion inner corner bracket for E2020t |
| 2 | `extrusion_inner_corner_bracket(E40_inner_corner_bracket)` | Extrusion inner corner bracket for E4040t |
| 4 | `sliding_t_nut(M4_sliding_t_nut)` | Nut M4 sliding T |
| 4 | `sliding_t_nut(M8_sliding_ball_t_nut)` | Nut M8 sliding T with spring loaded ball |
| 4 | `screw(M4_cap_screw, 8)` | Screw M4 cap x 8mm |
| 12 | `screw(M4_grub_screw, 5)` | Screw M4 grub x 5mm |
| 20 | `screw(M6_grub_screw, 6.2)` | Screw M6 grub x 6.2mm |
| 20 | `screw(M6_grub_screw, 9.5)` | Screw M6 grub x 9.5mm |
| 4 | `screw(M8_cap_screw, 12)` | Screw M8 cap x 12mm |
| 4 | `washer(M4_washer)` | Washer M4 x 9mm x 0.8mm |
| 4 | `washer(M8_washer)` | Washer M8 x 17mm x 1.6mm |

View File

@@ -24,76 +24,109 @@ include <../vitamins/washers.scad>
include <../vitamins/nuts.scad>
module inner_bracket_test(bracket, backwards = false)
rotate([90, 0, 180]) {
extrusion = extrusion_inner_corner_bracket_extrusion(bracket);
eWidth = extrusion_width(extrusion);
size = extrusion_inner_corner_bracket_size(bracket);
tnut = extrusion_inner_corner_bracket_tnut(bracket);
rotate([90, 0, 180]) {
extrusion = extrusion_inner_corner_bracket_extrusion(bracket);
eWidth = extrusion_width(extrusion);
size = extrusion_inner_corner_bracket_size(bracket);
tnut = extrusion_inner_corner_bracket_tnut(bracket);
translate([backwards ? -eWidth : 0, 0])
extrusion_inner_corner_bracket(bracket, backwards = backwards);
translate([backwards ? -eWidth : 0, 0])
extrusion_inner_corner_bracket(bracket, backwards=backwards);
translate([-eWidth / 2, 0])
rotate([-90, 0, 0])
extrusion(extrusion, size.x - nut_thickness(tnut) - extrusion_tab_thickness(extrusion), false, cornerHole = eWidth > 20);
translate([-eWidth / 2, 0])
rotate([-90, 0, 0])
extrusion(extrusion, size.x - nut_thickness(tnut) - extrusion_tab_thickness(extrusion), false, cornerHole=eWidth > 20);
translate([-eWidth, -eWidth / 2])
rotate([0, 90, 0])
extrusion(extrusion, eWidth + size.y - nut_thickness(tnut) - extrusion_tab_thickness(extrusion), false, cornerHole = eWidth > 20);
}
translate([-eWidth, -eWidth / 2])
rotate([0, 90, 0])
extrusion(extrusion, eWidth + size.y - nut_thickness(tnut) - extrusion_tab_thickness(extrusion), false, cornerHole=eWidth > 20);
}
module bracket_test(bracket)
rotate([90, 0, 180]) {
extrusion = extrusion_corner_bracket_extrusion(bracket);
eWidth = extrusion_width(extrusion);
size = extrusion_corner_bracket_size(bracket);
extrusion_corner_bracket_assembly(bracket);
translate([-eWidth / 2, 0])
rotate([-90, 0, 0])
extrusion(extrusion, size.y, false, cornerHole = eWidth > 20);
translate([-eWidth, -eWidth / 2])
rotate([0, 90, 0])
extrusion(extrusion, eWidth + size.x, false, cornerHole = eWidth > 20);
}
module extrusion_brackets(examples = false) {
extrusion_inner_corner_bracket(E20_inner_corner_bracket);
translate([30, 0])
extrusion_inner_corner_bracket(E20_inner_corner_bracket, grub_screws = false);
translate([60, 0])
extrusion_corner_bracket_assembly(E20_corner_bracket);
translate([110, 0])
extrusion_inner_corner_bracket(E40_inner_corner_bracket);
translate([140, 0])
extrusion_corner_bracket_assembly(E40_corner_bracket);
if(examples) {
translate([20, 50, 10])
inner_bracket_test(E20_inner_corner_bracket, true);
translate([20, 80, 10])
inner_bracket_test(E20_inner_corner_bracket);
translate([20, 120, 10])
bracket_test(E20_corner_bracket);
translate([100, 70, 10])
inner_bracket_test(E40_inner_corner_bracket);
translate([100, 130, 10])
bracket_test(E40_corner_bracket);
}
module corner_3d_connector(with_profiles = false, corner_connector_type, extrusion_type) {
extrusion_length = 40;
extrusion_corner_bracket_3D(corner_connector_type, grub_screws=true);
if (with_profiles) {
translate([0, 0, extrusion_length / 2])
extrusion(extrusion_type, extrusion_length);
translate(extrusion_corner_bracket_3D_get_y_offset(corner_connector_type))
rotate(extrusion_corner_bracket_3D_get_y_rot(corner_connector_type))
translate([0, 0, extrusion_length / 2])
extrusion(extrusion_type, extrusion_length);
translate(extrusion_corner_bracket_3D_get_x_offset(corner_connector_type))
rotate(extrusion_corner_bracket_3D_get_x_rot(corner_connector_type))
translate([0, 0, extrusion_length / 2])
extrusion(extrusion_type, extrusion_length);
}
}
if($preview)
let($show_threads = true)
extrusion_brackets(true);
module corner_3d_connectors(with_profiles = false) {
corner_3d_connector(with_profiles, extrusion_corner_bracket_3D_2020, E2020);
translate([80, 0, 0])
corner_3d_connector(with_profiles, extrusion_corner_bracket_3D_3030, E3030);
translate([180, 0, 0])
corner_3d_connector(with_profiles, extrusion_corner_bracket_3D_4040, E4040);
}
module bracket_test(bracket)
rotate([90, 0, 180]) {
extrusion = extrusion_corner_bracket_extrusion(bracket);
eWidth = extrusion_width(extrusion);
size = extrusion_corner_bracket_size(bracket);
extrusion_corner_bracket_assembly(bracket);
translate([-eWidth / 2, 0])
rotate([-90, 0, 0])
extrusion(extrusion, size.y, false, cornerHole=eWidth > 20);
translate([-eWidth, -eWidth / 2])
rotate([0, 90, 0])
extrusion(extrusion, eWidth + size.x, false, cornerHole=eWidth > 20);
}
module extrusion_brackets(examples = false) {
extrusion_inner_corner_bracket(E20_inner_corner_bracket);
translate([30, 0])
extrusion_inner_corner_bracket(E20_inner_corner_bracket, grub_screws=false);
translate([60, 0])
extrusion_corner_bracket_assembly(E20_corner_bracket);
translate([110, 0])
extrusion_inner_corner_bracket(E40_inner_corner_bracket);
translate([140, 0])
extrusion_corner_bracket_assembly(E40_corner_bracket);
if (examples) {
translate([20, 50, 10])
inner_bracket_test(E20_inner_corner_bracket, true);
translate([20, 80, 10])
inner_bracket_test(E20_inner_corner_bracket);
translate([20, 120, 10])
bracket_test(E20_corner_bracket);
translate([100, 70, 10])
inner_bracket_test(E40_inner_corner_bracket);
translate([100, 130, 10])
bracket_test(E40_corner_bracket);
}
//the 3d connectors
translate([0, -30, 0])
corner_3d_connectors();
if (examples) {
translate([0, -110, 0])
corner_3d_connectors(true);
}
}
if ($preview)
let ($show_threads = true)
extrusion_brackets(true);

View File

@@ -20,7 +20,7 @@ include <../core.scad>
include <../printed/gridfinity.scad>
use <NopSCADlib/utils/chamfer.scad>
use <../utils/chamfer.scad>
box = gridfinity_bin("chuck_stand", 2, 2, 5);

Binary file not shown.

Before

Width:  |  Height:  |  Size: 85 KiB

After

Width:  |  Height:  |  Size: 88 KiB

View File

@@ -20,151 +20,301 @@
//! Brackets for joining extrusions at a corner.
include <../core.scad>
include <../utils/thread.scad>
use <extrusion.scad>
function extrusion_inner_corner_bracket_size(type) = type[1]; //! Size of inner bracket
function extrusion_inner_corner_bracket_tnut(type) = type[2]; //! The sliding t-nut it is based on
function extrusion_inner_corner_bracket_extrusion(type) = type[3]; //! Default extrusion this bracket is for
function extrusion_inner_corner_bracket_screw_offsets(type) = type[4]; //! Screw offsets from the ends
function extrusion_inner_corner_bracket_size(type) = type[1]; //! Size of inner bracket
function extrusion_inner_corner_bracket_tnut(type) = type[2]; //! The sliding t-nut it is based on
function extrusion_inner_corner_bracket_extrusion(type) = type[3]; //! Default extrusion this bracket is for
function extrusion_inner_corner_bracket_screw_offsets(type) = type[4]; //! Screw offsets from the ends
module extrusion_inner_corner_bracket(type, grub_screws = true, backwards = false, extrusion = undef) { //! Inner corner bracket for extrusion
extrusion = is_undef(extrusion) ? extrusion_inner_corner_bracket_extrusion(type) : extrusion;
vitamin(str("extrusion_inner_corner_bracket(", type[0], "): Extrusion inner corner bracket for ", extrusion[0]));
module extrusion_inner_corner_bracket(type, grub_screws = true, backwards = false, extrusion = undef) { //! Inner corner bracket for extrusion
extrusion = is_undef(extrusion) ? extrusion_inner_corner_bracket_extrusion(type) : extrusion;
vitamin(str("extrusion_inner_corner_bracket(", type[0], "): Extrusion inner corner bracket for ", extrusion[0]));
size = extrusion_inner_corner_bracket_size(type);
tnut = extrusion_inner_corner_bracket_tnut(type);
screw_offsets = extrusion_inner_corner_bracket_screw_offsets(type);
bottomTabOffset = 4;
topTabOffset = 10;
sizeBottom = [size.y - bottomTabOffset, nut_square_width(tnut), size.z];
sizeTop = [size.x - topTabOffset, nut_square_width(tnut), size.z];
tab = t_nut_tab(tnut);
tabSizeZ = nut_thickness(tnut);
screw = find_screw(hs_grub, nut_size(tnut));
holeRadius = screw_pilot_hole(screw);
depth = (extrusion_width(extrusion) - extrusion_center_square(extrusion)) / 2;
size = extrusion_inner_corner_bracket_size(type);
tnut = extrusion_inner_corner_bracket_tnut(type);
screw_offsets = extrusion_inner_corner_bracket_screw_offsets(type);
bottomTabOffset = 4;
topTabOffset = 10;
sizeBottom = [size.y - bottomTabOffset, nut_square_width(tnut), size.z];
sizeTop = [size.x - topTabOffset, nut_square_width(tnut), size.z];
tab = t_nut_tab(tnut);
tabSizeZ = nut_thickness(tnut);
screw = find_screw(hs_grub, nut_size(tnut));
holeRadius = screw_pilot_hole(screw);
depth = (extrusion_width(extrusion) - extrusion_center_square(extrusion)) / 2;
offset = extrusion_tab_thickness(extrusion) + tabSizeZ;
offset2 = extrusion_tab_thickness(extrusion) - nut_thickness(tnut, true) + nut_thickness(tnut);
translate([backwards ? offset2 : -offset, -offset])
rotate([-90, 0, 0]) {
color("silver") {
translate([(size.y + bottomTabOffset) / 2, 0, tabSizeZ])
rotate([0, 180, 0])
extrusionSlidingNut(sizeBottom, tab[0], tab[1], tabSizeZ, holeRadius, (bottomTabOffset - size.y) / 2 + screw_offsets.y);
offset = extrusion_tab_thickness(extrusion) + tabSizeZ;
offset2 = extrusion_tab_thickness(extrusion) - nut_thickness(tnut, true) + nut_thickness(tnut);
translate([backwards ? offset2 : -offset, -offset])
rotate([-90, 0, 0]) {
color("silver") {
translate([(size.y + bottomTabOffset) / 2, 0, tabSizeZ])
rotate([0, 180, 0])
extrusionSlidingNut(sizeBottom, tab[0], tab[1], tabSizeZ, holeRadius, (bottomTabOffset - size.y) / 2 + screw_offsets.y);
translate([tabSizeZ, 0, (size.x + topTabOffset) / 2])
rotate([0, -90, 0])
extrusionSlidingNut(sizeTop, tab[0], tab[0], tabSizeZ, holeRadius, -(topTabOffset - size.x) / 2 - screw_offsets.x);
translate([tabSizeZ, 0, (size.x + topTabOffset) / 2])
rotate([0, -90, 0])
extrusionSlidingNut(sizeTop, tab[0], tab[0], tabSizeZ, holeRadius, -(topTabOffset - size.x) / 2 - screw_offsets.x);
translate([0, -tab[1] / 2]) {
cube([bottomTabOffset, tab[1], size.z]);
cube([size.z, tab[1], topTabOffset]);
}
}
if(grub_screws)
not_on_bom() no_explode() {
screw_len = screw_shorter_than(depth);
gap = depth - screw_len;
screw_z = offset - gap;
rotate([0, -90, 180])
if(backwards)
translate([size.x - screw_offsets.x, 0, -offset2 + gap])
vflip()
screw(screw, screw_len);
else
translate([size.x - screw_offsets.x, 0, screw_z])
screw(screw, screw_len);
translate([size.y - screw_offsets.y, 0, screw_z])
screw(screw, screw_len);
}
translate([0, -tab[1] / 2]) {
cube([bottomTabOffset, tab[1], size.z]);
cube([size.z, tab[1], topTabOffset]);
}
}
if (grub_screws)
not_on_bom() no_explode() {
screw_len = screw_shorter_than(depth);
gap = depth - screw_len;
screw_z = offset - gap;
rotate([0, -90, 180]) if (backwards)
translate([size.x - screw_offsets.x, 0, -offset2 + gap])
vflip()
screw(screw, screw_len);
else
translate([size.x - screw_offsets.x, 0, screw_z])
screw(screw, screw_len);
translate([size.y - screw_offsets.y, 0, screw_z])
screw(screw, screw_len);
}
}
}
function extrusion_corner_bracket_size(type) = type[1]; //! Size of bracket
function extrusion_corner_bracket_base_thickness(type) = type[2]; //! Thickness of base of bracket
function extrusion_corner_bracket_side_thickness(type) = type[3]; //! Thickness of side of bracket
function extrusion_corner_bracket_hole_offset(type) = type[4]; //! Hole offset from corner
function extrusion_corner_bracket_tnut(type) = type[5]; //! The sliding t-nut to use in the assembly
function extrusion_corner_bracket_extrusion(type) = type[6]; //! Default extrusion this bracket is for
function extrusion_corner_bracket_size(type) = type[1]; //! Size of bracket
function extrusion_corner_bracket_base_thickness(type) = type[2]; //! Thickness of base of bracket
function extrusion_corner_bracket_side_thickness(type) = type[3]; //! Thickness of side of bracket
function extrusion_corner_bracket_hole_offset(type) = type[4]; //! Hole offset from corner
function extrusion_corner_bracket_tnut(type) = type[5]; //! The sliding t-nut to use in the assembly
function extrusion_corner_bracket_extrusion(type) = type[6]; //! Default extrusion this bracket is for
module extrusion_corner_bracket(type) { //! Corner bracket for extrusion
vitamin(str("extrusion_corner_bracket(", type[0], "): Extrusion corner bracket ", type[1].z, "mm for ", extrusion_corner_bracket_extrusion(type)[0]));
module extrusion_corner_bracket(type) { //! Corner bracket for extrusion
vitamin(str("extrusion_corner_bracket(", type[0], "): Extrusion corner bracket ", type[1].z, "mm for ", extrusion_corner_bracket_extrusion(type)[0]));
eSize = extrusion_corner_bracket_size(type).z;
cbSize = extrusion_corner_bracket_size(type).x;
baseThickness = extrusion_corner_bracket_base_thickness(type);
hole_r = screw_clearance_radius(find_screw(hs_cap, nut_size(extrusion_corner_bracket_tnut(type))));
eSize = extrusion_corner_bracket_size(type).z;
cbSize = extrusion_corner_bracket_size(type).x;
baseThickness = extrusion_corner_bracket_base_thickness(type);
hole_r = screw_clearance_radius(find_screw(hs_cap, nut_size(extrusion_corner_bracket_tnut(type))));
module base() {
linear_extrude(baseThickness)
difference() {
translate([0, -eSize / 2])
square([cbSize, eSize]);
module base() {
linear_extrude(baseThickness)
difference() {
translate([0, -eSize / 2])
square([cbSize, eSize]);
hull() {
translate([extrusion_corner_bracket_hole_offset(type) + 1.5, 0])
circle(hole_r);
hull() {
translate([extrusion_corner_bracket_hole_offset(type) + 1.5, 0])
circle(hole_r);
translate([extrusion_corner_bracket_hole_offset(type) - 1.5, 0])
circle(hole_r);
}
}
translate([extrusion_corner_bracket_hole_offset(type) - 1.5, 0])
circle(hole_r);
}
}
}
color("silver") {
rotate([90, 0, 90])
base();
translate([0, baseThickness])
rotate([90, 0, 0])
base();
sideThickness = extrusion_corner_bracket_side_thickness(type);
for (z = [-eSize / 2, eSize / 2 - sideThickness]) {
translate_z(z) {
right_triangle(cbSize, cbSize, sideThickness, center=false);
cube([5, cbSize, sideThickness]);
cube([cbSize, 5, sideThickness]);
}
}
}
}
color("silver") {
rotate([90, 0, 90])
base();
module extrusion_corner_bracket_hole_positions(type) {
//! Place children at hole positions
for (angle = [[0, 90, 0], [-90, -90, 0]])
rotate(angle)
translate([0, extrusion_corner_bracket_hole_offset(type), extrusion_corner_bracket_base_thickness(type)])
children();
}
translate([0, baseThickness])
rotate([90, 0, 0])
base();
module extrusion_corner_bracket_assembly(type, part_thickness = undef, screw_type = undef, nut_type = undef, max_screw_depth = undef, extrusion = undef) { //! Assembly with fasteners in place
extrusion_corner_bracket(type);
extrusion = is_undef(extrusion) ? extrusion_corner_bracket_extrusion(type) : extrusion;
sideThickness = extrusion_corner_bracket_side_thickness(type);
for(z = [-eSize / 2, eSize / 2 - sideThickness]) {
translate_z(z) {
right_triangle(cbSize, cbSize, sideThickness, center = false);
cube([5, cbSize, sideThickness]);
cube([cbSize, 5, sideThickness]);
nut = is_undef(nut_type) ? extrusion_corner_bracket_tnut(type) : nut_type;
screw = is_undef(screw_type) ? find_screw(hs_cap, nut_size(nut)) : screw_type;
thickness = is_undef(part_thickness) ? extrusion_tab_thickness(extrusion) : part_thickness;
depth = is_undef(max_screw_depth) ? (extrusion_width(extrusion) - extrusion_center_square(extrusion)) / 2 - eps : max_screw_depth;
screw_washer_thickness = washer_thickness(screw_washer(screw));
nut_washer_type = nut_washer(nut);
nut_washer_thickness = nut_washer_type ? washer_thickness(nut_washer_type) : 0;
nut_offset = extrusion_corner_bracket_base_thickness(type) + thickness;
screw_length =
depth ? screw_shorter_than(extrusion_corner_bracket_base_thickness(type) + screw_washer_thickness + depth)
: screw_longer_than(nut_offset + screw_washer_thickness + nut_washer_thickness + nut_thickness(nut));
extrusion_corner_bracket_hole_positions(type) {
screw_and_washer(screw, screw_length);
translate_z(-nut_offset)
vflip() if (nut_washer_type)
nut_and_washer(nut);
else
rotate(90)
sliding_t_nut(nut);
}
}
function extrusion_corner_bracket_3D_outer_side_length(type) = type[1]; //! The length of the base cuboid sides
function extrusion_corner_bracket_3D_outer_height(type) = type[2]; //! The height of the cuboid
function extrusion_corner_bracket_3D_inner_side_length(type) = type[3]; //! The length of the dip in the cuboid sides
function extrusion_corner_bracket_3D_inner_height(type) = type[4]; //! The depth offset of the dip in the cuboid
function extrusion_corner_bracket_3D_nut_screw(type) = type[5]; //! The screw (most likely Mx_grub_screw from <NopSCADlib/vitamins/screws.scad>)
function extrusion_corner_bracket_3D_nut_dia(type) = type[6]; //! The width of bottom part of the nut
function extrusion_corner_bracket_3D_nut_thickness(type) = type[7]; //! The thickness of the top part of the nut
function extrusion_corner_bracket_3D_nut_nyloc_thickness(type) = type[8]; //! The total thickness of the nut
function extrusion_corner_bracket_3D_nut_sx(type) = type[9]; //! The length of the nuts
function extrusion_corner_bracket_3D_nut_ty1(type) = type[10]; //! The total width of the nut
function extrusion_corner_bracket_3D_nut_ty2(type) = type[11]; //! The width of the top edge of the nut
function extrusion_corner_bracket_3D_nut_screws_hor(type) = type[12]; //! The positions of the screw holes on the horizontal arms, expressed in %/100 of the nut arm
function extrusion_corner_bracket_3D_nut_screws_ver(type) = type[13]; //! The positions of the screw holes on the vertical arms, expressed in %/100 of the nut arm
function extrusion_corner_bracket_3D_get_y_offset(type) = [0, -extrusion_corner_bracket_3D_outer_side_length(type) / 2, extrusion_corner_bracket_3D_nut_nyloc_thickness(type)]; //! helper function to position the y beam
function extrusion_corner_bracket_3D_get_y_rot(type) = [90, 0, 0]; //! helper function to rotate the y beam
function extrusion_corner_bracket_3D_get_x_offset(type) = [extrusion_corner_bracket_3D_outer_side_length(type) / 2, 0, extrusion_corner_bracket_3D_nut_nyloc_thickness(type)]; //! helper function to position the x beam
function extrusion_corner_bracket_3D_get_x_rot(type) = [0, 90, 0]; //! helper function to rotate the y beam
module extrusion_corner_bracket_3D(type, grub_screws = true) { //! draw the specified extrusion_corner_bracket_3D
vitamin(str("extrusion_corner_bracket_3D(", type[0], "): Extrusion corner bracket 3D mm for E", slice(type[0], -4)));
nut_screw_dia = screw_radius(extrusion_corner_bracket_3D_nut_screw(type) * 2);
nut_dia = extrusion_corner_bracket_3D_nut_dia(type);
nut_thickness = extrusion_corner_bracket_3D_nut_thickness(type);
nut_nyloc_thickness = extrusion_corner_bracket_3D_nut_nyloc_thickness(type);
nut_sx = extrusion_corner_bracket_3D_nut_sx(type);
nut_ty1 = extrusion_corner_bracket_3D_nut_ty1(type);
nut_ty2 = extrusion_corner_bracket_3D_nut_ty2(type);
nut_profile = [
[0, nut_dia / 2],
[nut_nyloc_thickness - nut_thickness, nut_dia / 2],
[nut_nyloc_thickness - nut_thickness, nut_ty1 / 2],
[nut_nyloc_thickness - nut_thickness + (nut_ty1 - nut_ty2) / 2, nut_ty1 / 2],
[nut_nyloc_thickness, nut_ty2 / 2],
[nut_nyloc_thickness, -nut_ty2 / 2],
[nut_nyloc_thickness - nut_thickness + (nut_ty1 - nut_ty2) / 2, -nut_ty1 / 2],
[nut_nyloc_thickness - nut_thickness, -nut_ty1 / 2],
[nut_nyloc_thickness - nut_thickness, -nut_dia / 2],
[0, -nut_dia / 2],
];
grub_screw = extrusion_corner_bracket_3D_nut_screw(type);
outer_side_length = extrusion_corner_bracket_3D_outer_side_length(type);
outer_height = extrusion_corner_bracket_3D_outer_height(type);
inner_side_length = extrusion_corner_bracket_3D_inner_side_length(type);
inner_height = extrusion_corner_bracket_3D_inner_height(type);
inner_offset_z = outer_height - inner_height + 0.01;
//position the nuts on the base
positions_horizontal = [
[outer_side_length / 2, 0.001, 0, 0, 270, 90],
[outer_side_length - 0.001, outer_side_length / 2, 0, 0, 270, 180],
];
positions_vertical = [
[0, outer_side_length / 2, inner_offset_z, 0, 0, 0],
[outer_side_length / 2, outer_side_length, inner_offset_z, 0, 0, 270],
];
//the radius of the base corners
r = 1;
//offset so everything is centered for easy attachment to extrusion
translate([-outer_side_length / 2, -outer_side_length / 2, -outer_height]) {
color("silver")
union() {
//create the base
difference() {
rounded_cube_xy([outer_side_length, outer_side_length, outer_height], r=r);
translate([(outer_side_length - inner_side_length) / 2, (outer_side_length - inner_side_length) / 2, inner_offset_z])
rounded_cube_xy([inner_side_length, inner_side_length, inner_height], r=r);
}
for (pos = positions_horizontal) {
translate([pos[0], pos[1], pos[2]])
rotate([pos[3], pos[4], pos[5]])
difference() {
linear_extrude(nut_sx, convexity=3)
polygon(nut_profile);
//create the screw holes
for (dist = extrusion_corner_bracket_3D_nut_screws_hor(type)) {
translate([-0.01, 0, nut_sx * dist])
rotate([0, 90, 0])
difference() {
cylinder(h=nut_nyloc_thickness + 0.02, d=nut_screw_dia, center=false);
if (show_threads) {
female_metric_thread(nut_screw_dia, metric_coarse_pitch(nut_screw_dia), nut_nyloc_thickness, center=false);
}
}
if (grub_screws) {
screw(grub_screw, nut_nyloc_thickness);
}
}
}
}
for (pos = positions_vertical) {
translate([pos[0], pos[1], pos[2]])
rotate([pos[3], pos[4], pos[5]]) {
difference() {
linear_extrude(nut_sx, convexity=3)
polygon(nut_profile);
//create the screw holes
for (dist = extrusion_corner_bracket_3D_nut_screws_ver(type)) {
translate([-0.01, 0, nut_sx * dist])
rotate([0, 90, 0])
difference() {
cylinder(h=nut_nyloc_thickness + 0.02, d=nut_screw_dia, center=false);
if (show_threads) {
female_metric_thread(nut_screw_dia, metric_coarse_pitch(nut_screw_dia), nut_nyloc_thickness, center=false);
}
}
}
}
}
}
}
if (grub_screws) {
for (pos = positions_horizontal) {
translate([pos[0], pos[1], pos[2]])
rotate([pos[3], pos[4], pos[5]]) {
for (dist = extrusion_corner_bracket_3D_nut_screws_hor(type)) {
translate([-0.01, 0, nut_sx * dist])
rotate([180, 90, 0])
screw(grub_screw, nut_nyloc_thickness);
}
}
}
for (pos = positions_vertical) {
translate([pos[0], pos[1], pos[2]])
rotate([pos[3], pos[4], pos[5]]) {
for (dist = extrusion_corner_bracket_3D_nut_screws_ver(type)) {
translate([-0.01, 0, nut_sx * dist])
rotate([180, 90, 0])
screw(grub_screw, nut_nyloc_thickness);
}
}
}
}
}
module extrusion_corner_bracket_hole_positions(type) { //! Place children at hole positions
for(angle = [ [0, 90, 0], [-90, -90, 0] ])
rotate(angle)
translate([0, extrusion_corner_bracket_hole_offset(type), extrusion_corner_bracket_base_thickness(type)])
children();
}
module extrusion_corner_bracket_assembly(type, part_thickness = undef, screw_type = undef, nut_type = undef, max_screw_depth = undef, extrusion = undef) { //! Assembly with fasteners in place
extrusion_corner_bracket(type);
extrusion = is_undef(extrusion) ? extrusion_corner_bracket_extrusion(type) : extrusion;
nut = is_undef(nut_type) ? extrusion_corner_bracket_tnut(type) : nut_type;
screw = is_undef(screw_type) ? find_screw(hs_cap, nut_size(nut)) : screw_type;
thickness = is_undef(part_thickness) ? extrusion_tab_thickness(extrusion) : part_thickness;
depth = is_undef(max_screw_depth) ? (extrusion_width(extrusion) - extrusion_center_square(extrusion)) / 2 - eps : max_screw_depth;
screw_washer_thickness = washer_thickness(screw_washer(screw));
nut_washer_type = nut_washer(nut);
nut_washer_thickness = nut_washer_type ? washer_thickness(nut_washer_type) : 0;
nut_offset = extrusion_corner_bracket_base_thickness(type) + thickness;
screw_length = depth ? screw_shorter_than(extrusion_corner_bracket_base_thickness(type) + screw_washer_thickness + depth)
: screw_longer_than(nut_offset + screw_washer_thickness + nut_washer_thickness + nut_thickness(nut));
extrusion_corner_bracket_hole_positions(type) {
screw_and_washer(screw, screw_length);
translate_z(-nut_offset)
vflip()
if(nut_washer_type)
nut_and_washer(nut);
else
rotate(90)
sliding_t_nut(nut);
}
}
}

View File

@@ -19,12 +19,22 @@
//
// Extrusion brackets
//
include <../core.scad>
include <screws.scad>
E20_inner_corner_bracket = [ "E20_inner_corner_bracket", [26, 25, 4.7], M4_sliding_t_nut, E2020t, [7, 6]];
E40_inner_corner_bracket = [ "E40_inner_corner_bracket", [38, 31, 8.5], M6_sliding_t_nut, E4040t, [13, 10]];
E20_inner_corner_bracket = ["E20_inner_corner_bracket", [26, 25, 4.7], M4_sliding_t_nut, E2020t, [7, 6]];
E40_inner_corner_bracket = ["E40_inner_corner_bracket", [38, 31, 8.5], M6_sliding_t_nut, E4040t, [13, 10]];
E20_corner_bracket = [ "E20_corner_bracket", [28, 28, 20], 2, 3, 19.5, M4_sliding_t_nut, E2020t];
E40_corner_bracket = [ "E40_corner_bracket", [40, 40, 35], 2, 3, 19.5, M8_sliding_ball_t_nut, E4040t];
E20_corner_bracket = ["E20_corner_bracket", [28, 28, 20], 2, 3, 19.5, M4_sliding_t_nut, E2020t];
E40_corner_bracket = ["E40_corner_bracket", [40, 40, 35], 2, 3, 19.5, M8_sliding_ball_t_nut, E4040t];
//sh is horizontal positions of the screw holes, expressed in %/100 of the nut arm
//sv is vertical positions of the screw holes, expressed in %/100 of the nut arm
// screw nd nt nnt nsx nty1 nty2 sh sv
extrusion_corner_bracket_3D_2020 = ["extrusion_corner_bracket_3D_2020", 20, 5, 13, 2.5, M4_grub_screw, 6, 3.5, 5, 15.5, 10, 6, [0.5], [0.5]];
extrusion_corner_bracket_3D_3030 = ["extrusion_corner_bracket_3D_3030", 29.6, 6.2, 22, 2.5, M6_grub_screw, 8, 4.2, 6.2, 24.9, 16, 11, [0.25, 0.75], [0.65]];
extrusion_corner_bracket_3D_4040 = ["extrusion_corner_bracket_3D_4040", 40, 9.5, 25, 2.5, M6_grub_screw, 8, 5, 9.5, 34.0, 19.5, 14, [0.25, 0.75], [0.65]];
extrusion_corner_bracket_3Ds = [extrusion_corner_bracket_3D_2020, extrusion_corner_bracket_3D_3030, extrusion_corner_bracket_3D_4040];
use <extrusion_bracket.scad>