mirror of
https://github.com/nophead/NopSCADlib.git
synced 2025-09-24 22:21:28 +02:00
E2020t and E4040t thinner extrusions added to work with the brackets. Extrusions can now have recessed channels, round or square centre sections and holes. Fixed the shape of extrusion centre section spars. T-nuts now have 45 degree chamfers instead of a fixed 1mm minimum thickness.
144 lines
6.2 KiB
OpenSCAD
144 lines
6.2 KiB
OpenSCAD
//
|
|
// 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/>.
|
|
|
|
//
|
|
//! Aluminium extrusion.
|
|
//
|
|
include <../utils/core/core.scad>
|
|
|
|
function extrusion_width(type) = type[1]; //! Width of extrusion
|
|
function extrusion_height(type) = type[2]; //! Height of extrusion
|
|
function extrusion_center_hole_wd(type) = type[3]; //! Diameter of center hole if -ve or square side if +ve
|
|
function extrusion_corner_hole_wd(type) = type[4]; //! Diameter of corner hole if -ve or square side if +ve
|
|
function extrusion_center_square_wd(type) = type[5]; //! Size of center square if +ve or tube diameter if -ve
|
|
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
|
|
function extrusion_channel_recess(type) = type[11]; //! Channel recess width and depth or false in none
|
|
|
|
function extrusion_center_hole(type) = abs(extrusion_center_hole_wd(type)); //! Diameter of center hole or side if square
|
|
function extrusion_corner_hole(type) = abs(extrusion_corner_hole_wd(type)); //! Diameter of corner hole or side if square
|
|
function extrusion_center_square(type) = abs(extrusion_center_square_wd(type)); //! Size of center square or tube
|
|
|
|
module extrusion_cross_section(type, cornerHole) {
|
|
width = extrusion_width(type);
|
|
height = extrusion_height(type);
|
|
centerSquare = extrusion_center_square(type);
|
|
tabThickness = extrusion_tab_thickness(type);
|
|
sparThickness = extrusion_spar_thickness(type);
|
|
channelWidth = extrusion_channel_width(type);
|
|
recess = extrusion_channel_recess(type);
|
|
cornerSquare = (width - extrusion_channel_width_internal(type)) / 2;
|
|
|
|
module squircle(d) // Draw a square if positive else a circle
|
|
if(d > 0)
|
|
square([d, d], center = true);
|
|
else
|
|
if(d < 0)
|
|
circle(d = -d);
|
|
|
|
module extrusion_corner(type, cornerHole) {
|
|
fillet = extrusion_fillet(type);
|
|
cornerSize = (width - channelWidth) / 2;
|
|
cornerHoleDiameter = abs(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])
|
|
squircle(extrusion_corner_hole_wd(type));
|
|
}
|
|
}
|
|
}
|
|
|
|
module extrusion_center_section(type) {
|
|
for(side = [-1, 1]) {
|
|
translate([side * (width / 2 - tabThickness / 2), 0])
|
|
square([tabThickness, width - channelWidth], center = true);
|
|
|
|
l = cornerSquare + sparThickness * tan(22.5) - sparThickness / sqrt(2);
|
|
for(end = [-1, 1])
|
|
translate([side * (width / 2 - l / 2), end * (cornerSquare - sparThickness / 2)])
|
|
square([l, sparThickness], center = true);
|
|
}
|
|
}
|
|
|
|
|
|
count = height / width - 1;
|
|
|
|
difference() {
|
|
union() {
|
|
for(i = [0 : count])
|
|
translate([0, i * width + (width - height) / 2]) {
|
|
difference() {
|
|
union() {
|
|
squircle(extrusion_center_square_wd(type));
|
|
|
|
for(j = [0 : 3])
|
|
rotate(45 + 90 * j)
|
|
translate([centerSquare / 2 - sparThickness / 2, -sparThickness / 2])
|
|
square([width / sqrt(2) - cornerSquare * sqrt(2) - centerSquare / 2 + sparThickness *(1 + tan(22.5)), sparThickness]);
|
|
}
|
|
squircle(d = extrusion_center_hole_wd(type));
|
|
}
|
|
}
|
|
|
|
for(side = [-1, 1])
|
|
translate([0, side * (width - height) / 2])
|
|
for(angle = [0, 90])
|
|
rotate(angle + (side < 0 ? 180 : 0))
|
|
extrusion_corner(type, cornerHole);
|
|
|
|
if(count >= 1)
|
|
for(i = [1 : count])
|
|
translate([0, i * width - height / 2])
|
|
extrusion_center_section(type);
|
|
}
|
|
if(recess)
|
|
for(i = [0 : count], j = [0 : 3])
|
|
translate([0, i * width + (width - height) / 2])
|
|
rotate(j * 90)
|
|
translate([width / 2, 0])
|
|
square([recess.y * 2, recess.x], center = true);
|
|
}
|
|
}
|
|
|
|
module extrusion(type, length, center = true, cornerHole = false) { //! Draw the specified extrusion
|
|
|
|
vitamin(str("extrusion(", type[0], ", ", length, arg(cornerHole, false, "cornerHole"), "): Extrusion ", type[0], " x ", length, "mm"));
|
|
|
|
color(grey(90))
|
|
linear_extrude(length, center = center)
|
|
extrusion_cross_section(type, cornerHole);
|
|
}
|