diff --git a/tests/corner_3d_connectors.scad b/tests/corner_3d_connectors.scad deleted file mode 100644 index f9f5dba..0000000 --- a/tests/corner_3d_connectors.scad +++ /dev/null @@ -1,55 +0,0 @@ -// -// NopSCADlib Copyright Chris Palmer 2021 -// nop.head@gmail.com -// hydraraptor.blogspot.com -// -// This file is part of NopSCADlib. -// -// NopSCADlib is free software: you can redistribute it and/or modify it under the terms of the -// GNU General Public License as published by the Free Software Foundation, either version 3 of -// the License, or (at your option) any later version. -// -// NopSCADlib is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; -// without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -// See the GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License along with NopSCADlib. -// If not, see . -// -include <../vitamins/corner_3d_connectors.scad> -include <../vitamins/extrusions.scad> - -module corner_connector(with_profiles = false, corner_connector_type, extrusion_type) { - extrusion_length = 40; - corner_3d_connector(corner_connector_type, grub_screws=true); - if(with_profiles){ - translate([0,0,extrusion_length/2]) - extrusion(extrusion_type, extrusion_length); - translate(corner_3d_connector_get_y_offset(corner_connector_type)) - rotate(corner_3d_connector_get_y_rot(corner_connector_type)) - translate([0,0,extrusion_length/2]) - extrusion(extrusion_type, extrusion_length); - translate(corner_3d_connector_get_x_offset(corner_connector_type)) - rotate(corner_3d_connector_get_x_rot(corner_connector_type)) - translate([0,0,extrusion_length/2]) - extrusion(extrusion_type, extrusion_length); - } -} - -module corner_connectors(with_profiles = false) { -corner_connector(with_profiles, corner_3d_connector_2020, E2020); - - -translate([100,0,0]) -corner_connector(with_profiles, corner_3d_connector_3030, E3030); - - -translate([220,0,0]) -corner_connector(with_profiles, corner_3d_connector_4040, E4040); -} - -$show_threads=false; -corner_connectors(); -translate ([0,100,0]) -corner_connectors(true); - diff --git a/tests/extrusion_brackets.scad b/tests/extrusion_brackets.scad index 76033b9..b724cd9 100644 --- a/tests/extrusion_brackets.scad +++ b/tests/extrusion_brackets.scad @@ -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); diff --git a/vitamins/corner_3d_connector.scad b/vitamins/corner_3d_connector.scad deleted file mode 100644 index b2f423d..0000000 --- a/vitamins/corner_3d_connector.scad +++ /dev/null @@ -1,187 +0,0 @@ -// -// NopSCADlib Copyright Chris Palmer 2021 -// nop.head@gmail.com -// hydraraptor.blogspot.com -// -// This file is part of NopSCADlib. -// -// NopSCADlib is free software: you can redistribute it and/or modify it under the terms of the -// GNU General Public License as published by the Free Software Foundation, either version 3 of -// the License, or (at your option) any later version. -// -// NopSCADlib is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; -// without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -// See the GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License along with NopSCADlib. -// If not, see . -// - -// -//! Default is steel but can be drawn as brass or nylon. A utility for making nut traps included. -//! -//! 3D corner connector with t-nut -//! -//! The following diagram shows you the parameters for the nut parameters: -//! -//! ![](docs/sliding_t_nut.png) -// - -include -include <../utils/thread.scad> -//include - - - - -function corner_3d_connector_outer_side_length(type) = type[1]; //! The length of the base cuboid sides -function corner_3d_connector_outer_height(type) = type[2]; //! The height of the cuboid -function corner_3d_connector_inner_side_length(type)= type[3]; //! The length of the dip in the cuboid sides -function corner_3d_connector_inner_height(type) = type[4]; //! The depth offset of the dip in the cuboid - -function corner_3d_connector_nut_screw(type) = type[5]; //! The screw (most likely Mx_grub_screw from ) -function corner_3d_connector_nut_dia(type) = type[6]; //! The width of bottom part of the nut -function corner_3d_connector_nut_thickness(type) = type[7]; //! The thickness of the top part of the nut -function corner_3d_connector_nut_nyloc_thickness(type) = type[8]; //! The total thickness of the nut -function corner_3d_connector_nut_sx(type) = type[9]; //! The length of the nuts -function corner_3d_connector_nut_ty1(type) = type[10]; //! The total width of the nut -function corner_3d_connector_nut_ty2(type) = type[11]; //! The width of the top edge of the nut -function corner_3d_connector_nut_screws_hor(type) = type[12]; //! The positions of the screw holes on the horizontal arms, expressed in %/100 of the nut arm -function corner_3d_connector_nut_screws_ver(type) = type[13]; //! The positions of the screw holes on the vertical arms, expressed in %/100 of the nut arm - - -function corner_3d_connector_get_y_offset(type) = [0,-corner_3d_connector_outer_side_length(type)/2,corner_3d_connector_nut_nyloc_thickness(type)]; //! helper function to position the y beam -function corner_3d_connector_get_y_rot(type) = [90,0,0]; //! helper function to rotate the y beam -function corner_3d_connector_get_x_offset(type) = [corner_3d_connector_outer_side_length(type)/2,0,corner_3d_connector_nut_nyloc_thickness(type)]; //! helper function to position the x beam -function corner_3d_connector_get_x_rot(type) = [0,90,0]; //! helper function to rotate the y beam - - -module corner_3d_connector (type, grub_screws = true) { //! draw the specified corner_3d_connector - - nut_screw_dia = screw_radius(corner_3d_connector_nut_screw(type)*2); - nut_dia = corner_3d_connector_nut_dia(type); - nut_thickness = corner_3d_connector_nut_thickness(type); - nut_nyloc_thickness = corner_3d_connector_nut_nyloc_thickness(type); - nut_sx = corner_3d_connector_nut_sx(type); - nut_ty1 = corner_3d_connector_nut_ty1(type); - nut_ty2= corner_3d_connector_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 = corner_3d_connector_nut_screw(type); - - outer_side_length = corner_3d_connector_outer_side_length(type); - outer_height = corner_3d_connector_outer_height(type); - inner_side_length= corner_3d_connector_inner_side_length(type); - inner_height = corner_3d_connector_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 = corner_3d_connector_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 = corner_3d_connector_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 = corner_3d_connector_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 = corner_3d_connector_nut_screws_ver(type) ){ - translate([-0.01,0,nut_sx*dist]) - rotate([180,90,0]) - screw(grub_screw, nut_nyloc_thickness); - } - } - } - } - } -} diff --git a/vitamins/corner_3d_connectors.scad b/vitamins/corner_3d_connectors.scad deleted file mode 100644 index 80db261..0000000 --- a/vitamins/corner_3d_connectors.scad +++ /dev/null @@ -1,33 +0,0 @@ -// -// NopSCADlib Copyright Chris Palmer 2021 -// nop.head@gmail.com -// hydraraptor.blogspot.com -// -// This file is part of NopSCADlib. -// -// NopSCADlib is free software: you can redistribute it and/or modify it under the terms of the -// GNU General Public License as published by the Free Software Foundation, either version 3 of -// the License, or (at your option) any later version. -// -// NopSCADlib is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; -// without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -// See the GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License along with NopSCADlib. -// If not, see . -// -include <../core.scad> -include - - - -//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 -corner_3d_connector_2020 = ["corner_3d_connector_2020", 20, 5, 13, 2.5, M4_grub_screw, 6, 3.5,5, 15.5,10, 6, [0.5], [0.5]]; -corner_3d_connector_3030 = ["corner_3d_connector_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]]; -corner_3d_connector_4040 = ["corner_3d_connector_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]]; - -corner_3d_connectors = [corner_3d_connector_2020,corner_3d_connector_3030,corner_3d_connector_4040]; - -use diff --git a/vitamins/extrusion_bracket.scad b/vitamins/extrusion_bracket.scad index e7345d6..a01c98a 100644 --- a/vitamins/extrusion_bracket.scad +++ b/vitamins/extrusion_bracket.scad @@ -20,151 +20,301 @@ //! Brackets for joining extrusions at a corner. include <../core.scad> +include <../utils/thread.scad> + use -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 ) +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 ", extrusion_corner_bracket_extrusion(type)[0])); + + + 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); - } + } } diff --git a/vitamins/extrusion_brackets.scad b/vitamins/extrusion_brackets.scad index 18deaee..90c129e 100644 --- a/vitamins/extrusion_brackets.scad +++ b/vitamins/extrusion_brackets.scad @@ -19,12 +19,22 @@ // // Extrusion brackets // +include <../core.scad> +include -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