From 4107a2c8483cf1a30a6b8c2792bbe69aaa052bd9 Mon Sep 17 00:00:00 2001 From: Martin Budden Date: Fri, 10 Jan 2020 08:26:20 +0000 Subject: [PATCH 1/7] Fixed typo where 'rocker' was spelt 'rocket'. --- readme.md | 2 +- vitamins/rocker.scad | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/readme.md b/readme.md index a33251f..79486bb 100644 --- a/readme.md +++ b/readme.md @@ -2164,7 +2164,7 @@ Ring terminals and earth assemblies for DiBond panels. --- ## Rockers -Rocket switch. Also used for neon indicator in the same form factor. +Rocker switch. Also used for neon indicator in the same form factor. [vitamins/rockers.scad](vitamins/rockers.scad) Object definitions. diff --git a/vitamins/rocker.scad b/vitamins/rocker.scad index e11f43c..e8349ce 100644 --- a/vitamins/rocker.scad +++ b/vitamins/rocker.scad @@ -18,7 +18,7 @@ // // -//! Rocket switch. Also used for neon indicator in the same form factor. +//! Rocker switch. Also used for neon indicator in the same form factor. // include <../core.scad> use From ed97d226f8737e5d7a74498a938ed28d01d49592 Mon Sep 17 00:00:00 2001 From: Martin Budden Date: Fri, 10 Jan 2020 08:49:03 +0000 Subject: [PATCH 2/7] Tabs used instead of spaces in module e3d_resistor. --- vitamins/e3d.scad | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/vitamins/e3d.scad b/vitamins/e3d.scad index f0b5964..c12f274 100644 --- a/vitamins/e3d.scad +++ b/vitamins/e3d.scad @@ -68,16 +68,16 @@ module e3d_resistor(type, resistor_wire_rotate = [0,0,0]) { cylinder(r = resistor_dia / 2, h = resistor_len); color("red") - translate([0, resistor_len + 3.5/2 + 1, 0]) { - rotate(resistor_wire_rotate) { - translate([-3.5/2, 0, 0]) { - cylinder(d = 3.5, h = 36); + translate([0, resistor_len + 3.5/2 + 1, 0]) { + rotate(resistor_wire_rotate) { + translate([-3.5/2, 0, 0]) { + cylinder(d = 3.5, h = 36); - translate([3.5, 0, 0]) - cylinder(r = 3.5 / 2, h = 36); - } - } - } + translate([3.5, 0, 0]) + cylinder(r = 3.5 / 2, h = 36); + } + } + } } } From 61493eaa349894a8afd72cf7115d88aeaf51e86a Mon Sep 17 00:00:00 2001 From: Martin Budden Date: Fri, 10 Jan 2020 09:11:31 +0000 Subject: [PATCH 3/7] Resistor wire drawn even if naked=true. --- vitamins/e3d.scad | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/vitamins/e3d.scad b/vitamins/e3d.scad index c12f274..4bb338a 100644 --- a/vitamins/e3d.scad +++ b/vitamins/e3d.scad @@ -61,34 +61,35 @@ heater_y = heater_width / 2; fan_x_offset = rad_dia / 2 + 4; -module e3d_resistor(type, resistor_wire_rotate = [0,0,0]) { +module e3d_resistor(type, naked = false, resistor_wire_rotate = [0,0,0]) { translate([11 - heater_x, -3 - heater_y, heater_height / 2 + nozzle_h]) { color("grey") rotate([-90, 0, 0]) cylinder(r = resistor_dia / 2, h = resistor_len); - color("red") - translate([0, resistor_len + 3.5/2 + 1, 0]) { - rotate(resistor_wire_rotate) { - translate([-3.5/2, 0, 0]) { - cylinder(d = 3.5, h = 36); + if(!naked) + color("red") + translate([0, resistor_len + 3.5/2 + 1, 0]) { + rotate(resistor_wire_rotate) { + translate([-3.5/2, 0, 0]) { + cylinder(d = 3.5, h = 36); - translate([3.5, 0, 0]) - cylinder(r = 3.5 / 2, h = 36); - } - } - } + translate([3.5, 0, 0]) + cylinder(r = 3.5 / 2, h = 36); + } + } + } } } -module heater_block(type, resistor_wire_rotate = [0,0,0]) { +module heater_block(type, naked = false, resistor_wire_rotate = [0,0,0]) { translate_z(-hot_end_length(type)) { translate_z(nozzle_h) color("lightgrey") translate([-heater_x, -heater_y, 0]) cube([heater_length, heater_width, heater_height]); - e3d_resistor(type, resistor_wire_rotate); + e3d_resistor(type, naked, resistor_wire_rotate); e3d_nozzle(type); } } @@ -150,7 +151,7 @@ module e3d_hot_end(type, filament, naked = false, resistor_wire_rotate = [0,0,0] } rotate(90) - heater_block(type, resistor_wire_rotate); + heater_block(type, naked, resistor_wire_rotate); if(!naked) translate_z(inset - insulator_length) From 1f038decd4b314d1c1799667fadf827b6d75fd37 Mon Sep 17 00:00:00 2001 From: Martin Budden Date: Fri, 10 Jan 2020 11:31:17 +0000 Subject: [PATCH 4/7] Initial submission of aluminium extrusion. Supports 2020, 2040, 2060, 2080, 3030, 3060, 4040, 4080 types. Added extrusions to main picture. --- lib.scad | 1 + libtest.scad | 7 ++- tests/extrusions.scad | 30 +++++++++ vitamins/extrusion.scad | 128 +++++++++++++++++++++++++++++++++++++++ vitamins/extrusions.scad | 35 +++++++++++ 5 files changed, 200 insertions(+), 1 deletion(-) create mode 100644 tests/extrusions.scad create mode 100644 vitamins/extrusion.scad create mode 100644 vitamins/extrusions.scad diff --git a/lib.scad b/lib.scad index 26faf3c..92b520e 100644 --- a/lib.scad +++ b/lib.scad @@ -62,6 +62,7 @@ include include include include +include use use diff --git a/libtest.scad b/libtest.scad index c34b931..038ba71 100644 --- a/libtest.scad +++ b/libtest.scad @@ -32,6 +32,7 @@ use use use use +use use use use @@ -152,7 +153,7 @@ leadnuts_y = pillars_y + 40; pulleys_y = leadnuts_y +40; hot_ends_y = pulleys_y + 60; linear_bearings_y = hot_ends_y + 50; -sheets_y = linear_bearings_y + 50; +sheets_y = linear_bearings_y + 100; pcbs_y = sheets_y + 40; displays_y = pcbs_y + 150; fans_y = displays_y + 100; @@ -203,6 +204,10 @@ translate([x0, linear_bearings_y]) { rods(); } +translate([x0+120, linear_bearings_y+30]) { + extrusions(); +} + translate([x0 + 10, hot_ends_y]) hot_ends(); diff --git a/tests/extrusions.scad b/tests/extrusions.scad new file mode 100644 index 0000000..e88b09d --- /dev/null +++ b/tests/extrusions.scad @@ -0,0 +1,30 @@ +// +// NopSCADlib Copyright Chris Palmer 2020 +// nop.head@gmail.com +// hydraraptor.blogspot.com +// +// This file is part of NopSCADlib. +// +// NopSCADlib is free software: you can redistribute it and/or modify it under the terms of the +// GNU General Public License as published by the Free Software Foundation, either version 3 of +// the License, or (at your option) any later version. +// +// NopSCADlib is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +// without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License along with NopSCADlib. +// If not, see . +// +include <../core.scad> +use <../utils/layout.scad> + +include <../vitamins/extrusions.scad> + +module extrusions() + layout([for(e = extrusions) extrusion_width(e)], 10) + extrusion(extrusions[$i], 80); + +if ($preview) + extrusions(); + diff --git a/vitamins/extrusion.scad b/vitamins/extrusion.scad new file mode 100644 index 0000000..7768006 --- /dev/null +++ b/vitamins/extrusion.scad @@ -0,0 +1,128 @@ +// +// 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 . + +// +//! Aluminium extrusion. +// +include <../core.scad> + +function extrusion_width(type) = type[1]; //! Width of extrusion +function extrusion_height(type) = type[2]; //! Height of extrusion +function extrusion_center_hole(type) = type[3]; //! Diameter of center hole +function extrusion_corner_hole(type) = type[4]; //! Diameter of corner hole +function extrusion_center_square(type) = type[5]; //! Size of center square +function extrusion_channel_width(type) = type[6]; //! Channel width +function extrusion_channel_width_internal(type) = type[7]; //! Internal channel width +function extrusion_tab_thickness(type) = type[8]; //! Tab thickness +function extrusion_spar_thickness(type) = type[9]; //! Spar thickness +function extrusion_fillet(type) = type[10]; //! Radius of corner fillet + +module extrusion_cross_section(type, cornerHole) { + + module extrusion_corner(type, cornerHole) { + width = extrusion_width(type); + tabThickness = extrusion_tab_thickness(type); + sparThickness = extrusion_spar_thickness(type); + centerSquare = extrusion_center_square(type); + channelWidth = extrusion_channel_width(type); + fillet = extrusion_fillet(type); + cornerSize = (width-channelWidth)/2; + cornerSquare = (width-extrusion_channel_width_internal(type))/2; + cornerHoleDiameter =extrusion_corner_hole(type); + + translate([-width/2,-width/2]) { + difference() { + union() { + translate([fillet,0]) + square([cornerSize-fillet,tabThickness]); + translate([0,fillet]) + square([tabThickness,cornerSize-fillet]); + translate([fillet,fillet]) + circle(fillet); + translate([fillet,fillet]) + square([cornerSquare-fillet,cornerSquare-fillet]); + } + if(cornerHole) + translate([cornerSquare/2,cornerSquare/2]) + circle(d=cornerHoleDiameter); + } + } + rotate(-135) translate([centerSquare/2,-sparThickness/2]) square([sqrt(2)*(width-centerSquare-cornerSquare)/2,sparThickness]); + } + + module extrusion_center_section(type) { + width = extrusion_width(type); + tabThickness = extrusion_tab_thickness(type); + sparThickness = extrusion_spar_thickness(type); + centerSquare = extrusion_center_square(type); + channelWidth = extrusion_channel_width(type); + + translate([0,width/2]) + for(angle=[225,315]) + rotate(angle) + translate([centerSquare/2,-sparThickness/2]) + square([sqrt(2)*(width-centerSquare)/2,sparThickness]); + translate([0,-width/2]) + for(angle=[45,135]) + rotate(angle) + translate([centerSquare/2,-sparThickness/2]) + square([sqrt(2)*(width-centerSquare)/2,sparThickness]); + + centerHeight = width-channelWidth; + translate([-width/2,-centerHeight/2]) + square([tabThickness,centerHeight]); + translate([width/2-tabThickness,-centerHeight/2]) + square([tabThickness,centerHeight]); + } + + + centerSquare = extrusion_center_square(type); + + width = extrusion_width(type); + height = extrusion_height(type); + count = (height-width)/width; + + for(i=[0:count]) + translate([0,i*width+(width-height)/2]) + difference() { + square([centerSquare,centerSquare],center=true); + circle(d=extrusion_center_hole(type)); + } + translate([0,(width-height)/2]) + for(angle=[0,90]) + rotate(angle) + extrusion_corner(type, cornerHole); + translate([0,-(width-height)/2]) + for(angle=[180,270]) + rotate(angle) + extrusion_corner(type, cornerHole); + if(count>=1) + for(i=[1:count]) + translate([0,i*width-height/2]) + extrusion_center_section(type); +} + +module extrusion(type, length, cornerHole = false) { //! Draw the specified extrusion + + vitamin(str("extrusion(", type[0], ", ", length, "): Extrusion ", type[0], " x ", length, "mm")); + + color(grey90) + linear_extrude(height = length) + extrusion_cross_section(type, cornerHole); +} + diff --git a/vitamins/extrusions.scad b/vitamins/extrusions.scad new file mode 100644 index 0000000..159f609 --- /dev/null +++ b/vitamins/extrusions.scad @@ -0,0 +1,35 @@ +// +// 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 . +// +// +// Extrusion +// +// W H d1 d2 s cw cwi t st f +E2020 = [ "E2020", 20, 20, 4.2, 0, 8, 6, 12.0, 2, 2, 1 ]; +E2040 = [ "E2040", 20, 40, 4.2, 0, 8, 6, 12.0, 2, 2, 1 ]; +E2060 = [ "E2060", 20, 60, 4.2, 0, 8, 6, 12.0, 2, 2, 1 ]; +E2080 = [ "E2080", 20, 80, 4.2, 0, 8, 6, 12.0, 2, 2, 1 ]; +E3030 = [ "E3030", 30, 30, 6.8, 4.2, 12, 8, 16.5, 2, 2, 1 ]; +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]; + +use + From f7a972f946b21da2096c586f1b5043f9a734de63 Mon Sep 17 00:00:00 2001 From: Chris Palmer Date: Fri, 10 Jan 2020 20:10:17 +0000 Subject: [PATCH 5/7] Added pictures and documentation for extrusions. --- libtest.png | Bin 758731 -> 771883 bytes readme.md | 85 ++++++++++++++++++++++++++++++--------- tests/png/extrusions.png | Bin 0 -> 62454 bytes 3 files changed, 67 insertions(+), 18 deletions(-) create mode 100644 tests/png/extrusions.png diff --git a/libtest.png b/libtest.png index 22611063dc5cf9fda428280201621022875f8a31..788a0df4823a32c4907e94a9620a0c80dc1451c1 100644 GIT binary patch literal 771883 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