Compare commits
25 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
6f8ff606fa | ||
|
acd5de0fbd | ||
|
cc1e3baaf6 | ||
|
ab50b6f9a6 | ||
|
d9cb604f92 | ||
|
52d2a49e1c | ||
|
85cb54ef31 | ||
|
cd4447a2e6 | ||
|
9699a70cf5 | ||
|
6d79e587aa | ||
|
15b3b3a8c2 | ||
|
ec891c8013 | ||
|
c7811f21e0 | ||
|
782deccf6b | ||
|
69da4c1c23 | ||
|
dad2bccbaa | ||
|
0a00f244e4 | ||
|
76ea28e88e | ||
|
44cf9e910b | ||
|
0261362794 | ||
|
2e6b55bcbc | ||
|
20901f0356 | ||
|
77ffdcb1ac | ||
|
14c6219733 | ||
|
b21b7b9de0 |
1
lib.scad
@@ -90,6 +90,7 @@ use <utils/gears.scad>
|
||||
use <utils/hanging_hole.scad>
|
||||
use <utils/fillet.scad>
|
||||
use <utils/rounded_polygon.scad>
|
||||
use <utils/rounded_right_triangle.scad>
|
||||
use <utils/layout.scad>
|
||||
use <utils/round.scad>
|
||||
use <utils/offset.scad>
|
||||
|
BIN
libtest.png
Before Width: | Height: | Size: 854 KiB After Width: | Height: | Size: 859 KiB |
63
readme.md
@@ -35,11 +35,11 @@ See [usage](docs/usage.md) for requirements, installation instructions and a usa
|
||||
<tr><td> <a href = "#D_connectors">D_connectors</a> </td><td> <a href = "#Modules">Modules</a> </td><td> <a href = "#Spades">Spades</a> </td><td> <a href = "#Foot">Foot</a> </td><td> <a href = "#Round">Round</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Displays">Displays</a> </td><td> <a href = "#Nuts">Nuts</a> </td><td> <a href = "#Spools">Spools</a> </td><td> <a href = "#Handle">Handle</a> </td><td> <a href = "#Rounded_cylinder">Rounded_cylinder</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Extrusion_brackets">Extrusion_brackets</a> </td><td> <a href = "#O_ring">O_ring</a> </td><td> <a href = "#Springs">Springs</a> </td><td> <a href = "#PCB_mount">PCB_mount</a> </td><td> <a href = "#Rounded_polygon">Rounded_polygon</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Extrusions">Extrusions</a> </td><td> <a href = "#Opengrab">Opengrab</a> </td><td> <a href = "#Stepper_motors">Stepper_motors</a> </td><td> <a href = "#PSU_shroud">PSU_shroud</a> </td><td> <a href = "#Sector">Sector</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Fans">Fans</a> </td><td> <a href = "#PCB">PCB</a> </td><td> <a href = "#Swiss_clips">Swiss_clips</a> </td><td> <a href = "#Press_fit">Press_fit</a> </td><td> <a href = "#Sweep">Sweep</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Fuseholder">Fuseholder</a> </td><td> <a href = "#PCBs">PCBs</a> </td><td> <a href = "#Toggles">Toggles</a> </td><td> <a href = "#Printed_box">Printed_box</a> </td><td> <a href = "#Thread">Thread</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Geared_steppers">Geared_steppers</a> </td><td> <a href = "#PSUs">PSUs</a> </td><td> <a href = "#Transformers">Transformers</a> </td><td> <a href = "#Ribbon_clamp">Ribbon_clamp</a> </td><td> <a href = "#Tube">Tube</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Green_terminals">Green_terminals</a> </td><td> <a href = "#Panel_meters">Panel_meters</a> </td><td> <a href = "#Tubings">Tubings</a> </td><td> <a href = "#SSR_shroud">SSR_shroud</a> </td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Extrusions">Extrusions</a> </td><td> <a href = "#Opengrab">Opengrab</a> </td><td> <a href = "#Stepper_motors">Stepper_motors</a> </td><td> <a href = "#PSU_shroud">PSU_shroud</a> </td><td> <a href = "#Rounded_right_triangle">Rounded_right_triangle</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Fans">Fans</a> </td><td> <a href = "#PCB">PCB</a> </td><td> <a href = "#Swiss_clips">Swiss_clips</a> </td><td> <a href = "#Press_fit">Press_fit</a> </td><td> <a href = "#Sector">Sector</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Fuseholder">Fuseholder</a> </td><td> <a href = "#PCBs">PCBs</a> </td><td> <a href = "#Toggles">Toggles</a> </td><td> <a href = "#Printed_box">Printed_box</a> </td><td> <a href = "#Sweep">Sweep</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Geared_steppers">Geared_steppers</a> </td><td> <a href = "#PSUs">PSUs</a> </td><td> <a href = "#Transformers">Transformers</a> </td><td> <a href = "#Ribbon_clamp">Ribbon_clamp</a> </td><td> <a href = "#Thread">Thread</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Green_terminals">Green_terminals</a> </td><td> <a href = "#Panel_meters">Panel_meters</a> </td><td> <a href = "#Tubings">Tubings</a> </td><td> <a href = "#SSR_shroud">SSR_shroud</a> </td><td> <a href = "#Tube">Tube</a> </td><td></td></tr>
|
||||
<tr><td> <a href = "#Hot_ends">Hot_ends</a> </td><td> <a href = "#Pillars">Pillars</a> </td><td> <a href = "#Variacs">Variacs</a> </td><td> <a href = "#Screw_knob">Screw_knob</a> </td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#Hygrometer">Hygrometer</a> </td><td> <a href = "#Pin_headers">Pin_headers</a> </td><td> <a href = "#Veroboard">Veroboard</a> </td><td> <a href = "#Socket_box">Socket_box</a> </td><td></td><td></td></tr>
|
||||
<tr><td> <a href = "#IECs">IECs</a> </td><td> <a href = "#Pulleys">Pulleys</a> </td><td> <a href = "#Washers">Washers</a> </td><td> <a href = "#Strap_handle">Strap_handle</a> </td><td></td><td></td></tr>
|
||||
@@ -2707,6 +2707,7 @@ Linear rails with carriages.
|
||||
| Function | Description |
|
||||
|:--- |:--- |
|
||||
| ```carriage_screw_depth(type)``` | Carriage thread depth |
|
||||
| ```carriage_size(type)``` | Size of carriage |
|
||||
| ```rail_holes(type, length)``` | Number of holes in a rail given its ```length``` |
|
||||
| ```rail_screw_height(type, screw)``` | Position screw taking into account countersink into counterbored hole |
|
||||
| ```rail_travel(type, length)``` | How far the carriage can travel |
|
||||
@@ -3126,8 +3127,12 @@ The "Soft" parameter can be used to determinesif the sheet material needs machin
|
||||
|
||||
The "Colour" parameter is a quad-array: [R, G, B, Alpha], or can be a named colour, see [OpenSCAD_User_Manual](https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/The_OpenSCAD_Language#color).
|
||||
|
||||
For speed sheets should be modelled in 2D by subtracting holes from 2D templates made by ```sheet_2D()``` and then extruded to 3D with ```render_2D_sheet()```.
|
||||
Note that modules that drill holes will return a 2D object if ```h``` is set to 0 to facilitate this.
|
||||
For speed sheets should be modelled in 2D by subtracting holes from 2D templates made by `sheet_2D()` and then extruded to 3D with `render_2D_sheet()`.
|
||||
Note that modules that drill holes will return a 2D object if `h` is set to 0 to facilitate this.
|
||||
|
||||
If 3D features are needed, for example countersinks, then sheets can be modelled in 3D using `sheet()` and then coloured with `render_sheet()`.
|
||||
|
||||
When woven sheets (e.g. carbon fibre) are rendered it is necessary to specify the dimensions again to `render_sheet()` or `render_2D_sheet()`.
|
||||
|
||||
|
||||
[vitamins/sheets.scad](vitamins/sheets.scad) Object definitions.
|
||||
@@ -3140,14 +3145,22 @@ Note that modules that drill holes will return a 2D object if ```h``` is set to
|
||||
| Function | Description |
|
||||
|:--- |:--- |
|
||||
| ```sheet_colour(type)``` | Colour |
|
||||
| ```sheet_colour2(type)``` | Second colour for a woven sheet |
|
||||
| ```sheet_is_soft(type)``` | Is soft enough for wood screws |
|
||||
| ```sheet_thickness(type)``` | Thickness |
|
||||
| ```sheet_warp(type)``` | Wovern sheet warp |
|
||||
| ```sheet_weft(type)``` | Wovern sheet weft |
|
||||
|
||||
### Functions
|
||||
| Function | Description |
|
||||
|:--- |:--- |
|
||||
| ```sheet_is_woven(type)``` | Is a woven sheet, eg carbon fiber |
|
||||
|
||||
### Modules
|
||||
| Module | Description |
|
||||
|:--- |:--- |
|
||||
| ```render_2D_sheet(type, colour = false)``` | Extrude a 2D sheet template and give it the correct colour |
|
||||
| ```render_sheet(type, colour = false)``` | Render a sheet in the correct colour after holes have been subtracted |
|
||||
| ```render_2D_sheet(type, colour = false, colour2 = false, w = undef, d = undef)``` | Extrude a 2D sheet template and give it the correct colour |
|
||||
| ```render_sheet(type, colour = false, colour2 = false, w = undef, d = undef)``` | Render a sheet in the correct colour after holes have been subtracted |
|
||||
| ```sheet(type, w, d, corners = [0, 0, 0, 0])``` | Draw specified sheet |
|
||||
| ```sheet_2D(type, w, d, corners = [0, 0, 0, 0])``` | 2D sheet template with specified size and optionally rounded corners |
|
||||
|
||||
@@ -3172,6 +3185,9 @@ Note that modules that drill holes will return a 2D object if ```h``` is set to
|
||||
| 1 | ```sheet(PMMA3, 30, 30, 2)``` | Sheet acrylic 30mm x 30mm x 3mm |
|
||||
| 1 | ```sheet(PMMA6, 30, 30, 2)``` | Sheet acrylic 30mm x 30mm x 6mm |
|
||||
| 1 | ```sheet(PMMA8, 30, 30, 2)``` | Sheet acrylic 30mm x 30mm x 8mm |
|
||||
| 1 | ```sheet(CF1, 30, 30, 2)``` | Sheet carbon fiber 30mm x 30mm x 1mm |
|
||||
| 1 | ```sheet(CF2, 30, 30, 2)``` | Sheet carbon fiber 30mm x 30mm x 2mm |
|
||||
| 1 | ```sheet(CF3, 30, 30, 2)``` | Sheet carbon fiber 30mm x 30mm x 3mm |
|
||||
| 1 | ```sheet(glass2, 30, 30, 2)``` | Sheet glass 30mm x 30mm x 2mm |
|
||||
| 1 | ```sheet(Steel06, 30, 30, 2)``` | Sheet mild steel 30mm x 30mm x 0.6mm |
|
||||
|
||||
@@ -5511,8 +5527,10 @@ a square cornered part fits in the hole then circles are placed in the corners m
|
||||
### Modules
|
||||
| Module | Description |
|
||||
|:--- |:--- |
|
||||
| ```dogbone_rectangle(size, r = cnc_bit_r, center = true, xy_center = true)``` | Rectangle with cylinders at the corners |
|
||||
| ```dogbone_square(size, r = cnc_bit_r, center = true)``` | Square with circles at the corners |
|
||||
| ```dogbone_rectangle(size, r = cnc_bit_r, center = true, xy_center = true, x_offset, y_offset)``` | Rectangle with cylinders at the corners |
|
||||
| ```dogbone_rectangle_x(size, r = cnc_bit_r, center = true, xy_center = true)``` | Rectangle with cylinders at the corners, offset in the x direction |
|
||||
| ```dogbone_rectangle_y(size, r = cnc_bit_r, center = true, xy_center = true)``` | Rectangle with cylinders at the corners, offset in the y direction |
|
||||
| ```dogbone_square(size, r = cnc_bit_r, center = true, x_offset, y_offset)``` | Square with circles at the corners, with optional offsets |
|
||||
|
||||

|
||||
|
||||
@@ -5833,6 +5851,26 @@ Because the tangents need to be calculated to find the length these can be calcu
|
||||

|
||||
|
||||
|
||||
<a href="#top">Top</a>
|
||||
|
||||
---
|
||||
<a name="Rounded_right_triangle"></a>
|
||||
## Rounded_right_triangle
|
||||
Draw a 3D right triangle with rounded edges. Intended to be embedded in other parts. Can be optionally offset by the filleted amount.
|
||||
|
||||
|
||||
[utils/rounded_right_triangle.scad](utils/rounded_right_triangle.scad) Implementation.
|
||||
|
||||
[tests/rounded_right_triangle.scad](tests/rounded_right_triangle.scad) Code for this example.
|
||||
|
||||
### Modules
|
||||
| Module | Description |
|
||||
|:--- |:--- |
|
||||
| ```rounded_right_triangle(x, y, z, fillet, center = true, offset = false)``` | Draw a 3D right triangle with rounded edges. |
|
||||
|
||||

|
||||
|
||||
|
||||
<a href="#top">Top</a>
|
||||
|
||||
---
|
||||
@@ -6098,6 +6136,7 @@ Global constants, functions and modules. This file is used directly or indirectl
|
||||
| ```ellipse(xr, yr)``` | Draw an ellipse |
|
||||
| ```extrude_if(h, center = true)``` | Extrudes 2D object to 3D when ```h``` is nonzero, otherwise leaves it 2D |
|
||||
| ```hflip(flip=true)``` | Invert children by doing a 180° flip around the Y axis |
|
||||
| ```render_if(render = true, convexity = 2)``` | Renders an object if ```render``` is true, otherwise leaves it unrendered |
|
||||
| ```right_triangle(width, height, h, center = true)``` | A right angled triangle with the 90° corner at the origin. 3D when ```h``` is nonzero, otherwise 2D |
|
||||
| ```semi_circle(r, d = undef)``` | A semi circle in the positive Y domain |
|
||||
| ```translate_z(z)``` | Shortcut for Z only translations |
|
||||
@@ -6199,6 +6238,8 @@ Rectangle with rounded corners.
|
||||
| Module | Description |
|
||||
|:--- |:--- |
|
||||
| ```rounded_rectangle(size, r, center = true, xy_center = true)``` | Like ```cube()``` but corners rounded in XY plane and separate centre options for xy and z. |
|
||||
| ```rounded_rectangle_xz(size, r, center = true, xy_center = true)``` | Like ```cube()``` but corners rounded in XZ plane and separate centre options for xy and z. |
|
||||
| ```rounded_rectangle_yz(size, r, center = true, xy_center = true)``` | Like ```cube()``` but corners rounded in YX plane and separate centre options for xy and z. |
|
||||
| ```rounded_square(size, r, center = true)``` | Like ```square()``` but with with rounded corners |
|
||||
|
||||

|
||||
|
@@ -26,6 +26,12 @@ module dogbones() {
|
||||
#translate([15, 0])
|
||||
dogbone_rectangle([10, 20, 5], center = false);
|
||||
|
||||
#translate([30, 0])
|
||||
dogbone_rectangle_x([10, 20, 5], center = false);
|
||||
|
||||
#translate([45, 0])
|
||||
dogbone_rectangle_y([10, 20, 5], center = false);
|
||||
|
||||
sq = 3;
|
||||
translate([-5 + sq / 2 + eps, -10 + sq / 2 + eps])
|
||||
%cube([sq, sq, 1], center = true);
|
||||
|
Before Width: | Height: | Size: 56 KiB After Width: | Height: | Size: 55 KiB |
Before Width: | Height: | Size: 37 KiB After Width: | Height: | Size: 43 KiB |
BIN
tests/png/rounded_right_triangle.png
Normal file
After Width: | Height: | Size: 67 KiB |
Before Width: | Height: | Size: 35 KiB After Width: | Height: | Size: 42 KiB |
@@ -25,6 +25,12 @@ module rounded_rectangles() {
|
||||
|
||||
translate([40, 0])
|
||||
rounded_rectangle([30, 20, 10], 3);
|
||||
|
||||
translate([80, 0])
|
||||
rounded_rectangle_xz([30, 20, 10], 3);
|
||||
|
||||
translate([120, 0])
|
||||
rounded_rectangle_yz([30, 20, 10], 3);
|
||||
}
|
||||
|
||||
rounded_rectangles();
|
||||
|
31
tests/rounded_right_triangle.scad
Normal file
@@ -0,0 +1,31 @@
|
||||
//
|
||||
// NopSCADlib Copyright Chris Palmer 2018
|
||||
// nop.head@gmail.com
|
||||
// hydraraptor.blogspot.com
|
||||
//
|
||||
// This file is part of NopSCADlib.
|
||||
//
|
||||
// NopSCADlib is free software: you can redistribute it and/or modify it under the terms of the
|
||||
// GNU General Public License as published by the Free Software Foundation, either version 3 of
|
||||
// the License, or (at your option) any later version.
|
||||
//
|
||||
// NopSCADlib is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
||||
// without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
// See the GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License along with NopSCADlib.
|
||||
// If not, see <https://www.gnu.org/licenses/>.
|
||||
//
|
||||
|
||||
include <../global_defs.scad>
|
||||
use <../utils/rounded_right_triangle.scad>
|
||||
|
||||
|
||||
module rounded_right_triangles() {
|
||||
rounded_right_triangle(10, 20, 5, 0.5);
|
||||
|
||||
translate([20, 0])
|
||||
rounded_right_triangle(10, 20, 5, 0.5, offset = true);
|
||||
}
|
||||
|
||||
rounded_right_triangles();
|
@@ -20,12 +20,30 @@ include <../utils/core/core.scad>
|
||||
use <../utils/layout.scad>
|
||||
|
||||
include <../vitamins/sheets.scad>
|
||||
include <../vitamins/screws.scad>
|
||||
|
||||
width = 30;
|
||||
2d = true;
|
||||
|
||||
module sheets()
|
||||
layout([for(s = sheets) width], 5)
|
||||
render_sheet(sheets[$i]) sheet(sheets[$i], width, width, 2);
|
||||
let(sheet = sheets[$i], w = sheet_is_woven(sheet) ? width : undef)
|
||||
if(2d)
|
||||
render_2D_sheet(sheet, w = w, d = w)
|
||||
difference() {
|
||||
sheet_2D(sheet, width, width, 2);
|
||||
|
||||
circle(3);
|
||||
}
|
||||
else
|
||||
render_sheet(sheet, w = w, d = w)
|
||||
difference() {
|
||||
sheet(sheet, width, width, 2);
|
||||
|
||||
translate_z(sheet_thickness(sheet) / 2)
|
||||
screw_countersink(M3_cs_cap_screw);
|
||||
}
|
||||
|
||||
|
||||
if($preview)
|
||||
sheets();
|
||||
|
@@ -52,6 +52,13 @@ function slice(list, start = 0, end = undef) = let( //! Slice a list or string w
|
||||
) is_string(list) ? slice_str(list, start, end) : [for(i = [start : 1 : end - 1]) list[i]];
|
||||
|
||||
|
||||
module render_if(render = true, convexity = 2) //! Renders an object if ```render``` is true, otherwise leaves it unrendered
|
||||
if (render)
|
||||
render(convexity = convexity)
|
||||
children();
|
||||
else
|
||||
children();
|
||||
|
||||
module extrude_if(h, center = true) //! Extrudes 2D object to 3D when ```h``` is nonzero, otherwise leaves it 2D
|
||||
if(h)
|
||||
linear_extrude(h, center = center, convexity = 2) // 3D
|
||||
|
@@ -28,6 +28,21 @@ module rounded_square(size, r, center = true) //! Like ```square()``` but with w
|
||||
|
||||
module rounded_rectangle(size, r, center = true, xy_center = true) //! Like ```cube()``` but corners rounded in XY plane and separate centre options for xy and z.
|
||||
{
|
||||
linear_extrude(size[2], center = center)
|
||||
rounded_square([size[0], size[1]], r, xy_center);
|
||||
linear_extrude(size.z, center = center)
|
||||
rounded_square([size.x, size.y], r, xy_center);
|
||||
}
|
||||
|
||||
module rounded_rectangle_xz(size, r, center = true, xy_center = true) //! Like ```cube()``` but corners rounded in XZ plane and separate centre options for xy and z.
|
||||
{
|
||||
translate([xy_center ? 0 : size.x / 2, xy_center ? 0 : size.y / 2, center ? 0 : size.z / 2])
|
||||
rotate([90, 0, 0])
|
||||
rounded_rectangle([size.x, size.z, size.y], r, center = true, xy_center = true);
|
||||
}
|
||||
|
||||
module rounded_rectangle_yz(size, r, center = true, xy_center = true) //! Like ```cube()``` but corners rounded in YX plane and separate centre options for xy and z.
|
||||
{
|
||||
translate([xy_center ? 0 : size.x / 2, xy_center ? 0 : size.y / 2, center ? 0 : size.z / 2])
|
||||
rotate([90, 0, 90])
|
||||
rounded_rectangle([size.y, size.z, size.x], r, center = true, xy_center = true);
|
||||
}
|
||||
|
||||
|
@@ -23,24 +23,36 @@
|
||||
//
|
||||
include <../utils/core/core.scad>
|
||||
|
||||
module dogbone_square(size, r = cnc_bit_r, center = true) //! Square with circles at the corners
|
||||
module dogbone_square(size, r = cnc_bit_r, center = true, x_offset, y_offset) //! Square with circles at the corners, with optional offsets
|
||||
{
|
||||
x_offset = is_undef(x_offset) ? r / sqrt(2) : x_offset;
|
||||
y_offset = is_undef(y_offset) ? r / sqrt(2) : y_offset;
|
||||
|
||||
union() {
|
||||
square(size, center = center);
|
||||
|
||||
if(r > 0) {
|
||||
origin = center ? [0, 0] : size / 2;
|
||||
offset = r / sqrt(2);
|
||||
|
||||
for(x = [-1, 1], y = [-1, 1])
|
||||
translate(origin + [x * (size.x / 2 - offset), y * (size.y / 2 - offset)])
|
||||
translate(origin + [x * (size.x / 2 - x_offset), y * (size.y / 2 - y_offset)])
|
||||
drill(r, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module dogbone_rectangle(size, r = cnc_bit_r, center = true, xy_center = true) //! Rectangle with cylinders at the corners
|
||||
module dogbone_rectangle(size, r = cnc_bit_r, center = true, xy_center = true, x_offset, y_offset) //! Rectangle with cylinders at the corners
|
||||
{
|
||||
extrude_if(h = size.z, center = center)
|
||||
dogbone_square([size.x, size.y], r, xy_center);
|
||||
dogbone_square([size.x, size.y], r, xy_center, x_offset, y_offset);
|
||||
}
|
||||
|
||||
module dogbone_rectangle_x(size, r = cnc_bit_r, center = true, xy_center = true) //! Rectangle with cylinders at the corners, offset in the x direction
|
||||
{
|
||||
dogbone_rectangle(size = size, r = r, center = center, x_offset = 0, y_offset = r);
|
||||
}
|
||||
|
||||
module dogbone_rectangle_y(size, r = cnc_bit_r, center = true, xy_center = true) //! Rectangle with cylinders at the corners, offset in the y direction
|
||||
{
|
||||
dogbone_rectangle(size = size, r = r, center = center, x_offset = r, y_offset = 0);
|
||||
}
|
||||
|
46
utils/rounded_right_triangle.scad
Normal file
@@ -0,0 +1,46 @@
|
||||
//
|
||||
// NopSCADlib Copyright Chris Palmer 2018
|
||||
// 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/>.
|
||||
//
|
||||
|
||||
//
|
||||
//! Draw a 3D right triangle with rounded edges. Intended to be embedded in other parts. Can be optionally offset by the filleted amount.
|
||||
//
|
||||
include <../utils/core/core.scad>
|
||||
include <NopSCADlib/utils/core/rounded_rectangle.scad>
|
||||
|
||||
module rounded_right_triangle(x, y, z, fillet, center = true, offset = false) { //! Draw a 3D right triangle with rounded edges.
|
||||
fillet = max(fillet, eps);
|
||||
size = [x + (offset ? 2 * fillet : 0), y + (offset ? 2 * fillet : 0), z];
|
||||
|
||||
translate([offset ? -2 * fillet : 0, offset ? -2 * fillet : 0, center ? 0 : size.z / 2])
|
||||
hull() {
|
||||
translate([0, fillet, size.z / 2])
|
||||
rotate([90, 90, 0])
|
||||
rounded_rectangle([size.z, 2 * fillet, eps], fillet - eps, center = false, xy_center = false);
|
||||
translate([0, size.y, size.z / 2])
|
||||
rotate([90, 90, 0])
|
||||
rounded_rectangle([size.z, 2 * fillet, eps], fillet - eps, center = false, xy_center = false);
|
||||
translate([fillet, 0, size.z / 2])
|
||||
rotate([0, 90, 0])
|
||||
rounded_rectangle([size.z, 2 * fillet, eps], fillet - eps, center = false, xy_center = false);
|
||||
translate([size.x, 0, size.z / 2])
|
||||
rotate([0, 90, 0])
|
||||
rounded_rectangle([size.z, 2 * fillet, eps], fillet - eps, center = false, xy_center = false);
|
||||
}
|
||||
}
|
||||
|
@@ -40,6 +40,7 @@ function carriage_length(type) = type[0]; //! Overall length
|
||||
function carriage_block_length(type) = type[1]; //! Length of the metal part
|
||||
function carriage_width(type) = type[2]; //! Width of carriage
|
||||
function carriage_height(type) = type[3]; //! Height of carriage
|
||||
function carriage_size(type) = [ type[1], type[2], type[3] ]; //! Size of carriage
|
||||
function carriage_clearance(type) = type[4]; //! Gap under the carriage
|
||||
function carriage_pitch_x(type) = type[5]; //! Screw hole x pitch
|
||||
function carriage_pitch_y(type) = type[6]; //! Screw hole y pitch
|
||||
|
@@ -27,14 +27,22 @@
|
||||
//!
|
||||
//! The "Colour" parameter is a quad-array: [R, G, B, Alpha], or can be a named colour, see [OpenSCAD_User_Manual](https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/The_OpenSCAD_Language#color).
|
||||
//!
|
||||
//! For speed sheets should be modelled in 2D by subtracting holes from 2D templates made by ```sheet_2D()``` and then extruded to 3D with ```render_2D_sheet()```.
|
||||
//! Note that modules that drill holes will return a 2D object if ```h``` is set to 0 to facilitate this.
|
||||
//! For speed sheets should be modelled in 2D by subtracting holes from 2D templates made by `sheet_2D()` and then extruded to 3D with `render_2D_sheet()`.
|
||||
//! Note that modules that drill holes will return a 2D object if `h` is set to 0 to facilitate this.
|
||||
//!
|
||||
//! If 3D features are needed, for example countersinks, then sheets can be modelled in 3D using `sheet()` and then coloured with `render_sheet()`.
|
||||
//!
|
||||
//! When woven sheets (e.g. carbon fibre) are rendered it is necessary to specify the dimensions again to `render_sheet()` or `render_2D_sheet()`.
|
||||
//
|
||||
include <../utils/core/core.scad>
|
||||
|
||||
function sheet_thickness(type) = type[2]; //! Thickness
|
||||
function sheet_colour(type) = type[3]; //! Colour
|
||||
function sheet_is_soft(type) = type[4]; //! Is soft enough for wood screws
|
||||
function sheet_is_woven(type) = !is_undef(type[5]); //! Is a woven sheet, eg carbon fiber
|
||||
function sheet_warp(type) = type[5]; //! Wovern sheet warp
|
||||
function sheet_weft(type) = type[6]; //! Wovern sheet weft
|
||||
function sheet_colour2(type) = type[7]; //! Second colour for a woven sheet
|
||||
|
||||
module corner(r) {
|
||||
if(r > 0)
|
||||
@@ -78,12 +86,66 @@ module sheet(type, w, d, corners = [0, 0, 0, 0]) //! Draw specified sheet
|
||||
linear_extrude(sheet_thickness(type), center = true)
|
||||
sheet_2D(type, w, d, corners);
|
||||
|
||||
module render_sheet(type, colour = false) //! Render a sheet in the correct colour after holes have been subtracted
|
||||
color(colour ? colour : sheet_colour(type))
|
||||
render() children();
|
||||
module render_sheet(type, colour = false, colour2 = false, w = undef, d = undef) { //! Render a sheet in the correct colour after holes have been subtracted
|
||||
woven = sheet_is_woven(type);
|
||||
t = sheet_thickness(type);
|
||||
colour = colour ? colour : sheet_colour(type);
|
||||
colour2 = colour2 ? colour2 : sheet_colour2(type);
|
||||
let($dxf_colour = colour)
|
||||
color(woven ? colour2 : colour)
|
||||
render()
|
||||
scale([1, 1, woven ? (t - 2 * eps) / t : 1])
|
||||
children();
|
||||
|
||||
module render_2D_sheet(type, colour = false) //! Extrude a 2D sheet template and give it the correct colour
|
||||
let($dxf_colour = colour ? colour : sheet_colour(type))
|
||||
color($dxf_colour)
|
||||
linear_extrude(sheet_thickness(type), center = true)
|
||||
if(woven)
|
||||
for(side = [-1, 1], z = side * (t - eps) / 2)
|
||||
translate_z(z)
|
||||
woven_sheet(type, eps, colour, colour2, w, d)
|
||||
projection(cut = true)
|
||||
translate_z(-z)
|
||||
not_on_bom()
|
||||
children();
|
||||
}
|
||||
|
||||
module render_2D_sheet(type, colour = false, colour2 = false, w = undef, d = undef) { //! Extrude a 2D sheet template and give it the correct colour
|
||||
colour = colour ? colour : sheet_colour(type);
|
||||
colour2 = colour2 ? colour2 : sheet_colour2(type);
|
||||
let($dxf_colour = colour)
|
||||
if(sheet_is_woven(type))
|
||||
woven_sheet(type, sheet_thickness(type), colour, colour2, w, d)
|
||||
children();
|
||||
else
|
||||
color($dxf_colour)
|
||||
linear_extrude(sheet_thickness(type), center = true)
|
||||
children();
|
||||
}
|
||||
|
||||
module woven_sheet(type, thickness, colour, colour2, w, d) { // Create a woven 2D sheet with specified thickness and colours
|
||||
warp = sheet_warp(type);
|
||||
weft = sheet_weft(type);
|
||||
warp_doublet_count = assert(!is_undef(w) && !is_undef(d), "Must specify the dimensions to render woven sheets") ceil(w / (2 * warp));
|
||||
weft_count = ceil(d / weft);
|
||||
|
||||
module chequerboard(odd = 0)
|
||||
translate([-w / 2, -d / 2])
|
||||
for (y = [0 : weft_count - 1], x = [0 : warp_doublet_count - 1])
|
||||
translate([warp * (2 * x + ((y + odd) % 2)), weft * y])
|
||||
square([warp, weft]);
|
||||
|
||||
color(colour)
|
||||
linear_extrude(thickness)
|
||||
intersection() {
|
||||
chequerboard();
|
||||
children();
|
||||
}
|
||||
|
||||
if(thickness > eps)
|
||||
color(colour2)
|
||||
linear_extrude(thickness)
|
||||
intersection() {
|
||||
chequerboard(1);
|
||||
|
||||
not_on_bom()
|
||||
children();
|
||||
}
|
||||
}
|
||||
|
@@ -22,7 +22,7 @@
|
||||
//
|
||||
|
||||
//
|
||||
// [ Code, Description, Thickness, Color, Soft]
|
||||
// [ Code, Description, Thickness, Color, Soft, Warp, Weft, Color2]
|
||||
//
|
||||
mdf_colour = "#BEA587"; // sampled from a photo
|
||||
|
||||
@@ -45,7 +45,11 @@ Foam20 = [ "Foam20", "Foam sponge", 20,[0.3, 0.3, 0.3, 1 ],
|
||||
AL6 = [ "AL6", "Aluminium tooling plate", 6, [0.9, 0.9, 0.9, 1 ], false];
|
||||
AL8 = [ "AL8", "Aluminium tooling plate", 8, [0.9, 0.9, 0.9, 1 ], false];
|
||||
Steel06 = [ "Steel06", "Sheet mild steel", 0.6,"silver" , false];
|
||||
CF1 = [ "CF1", "Sheet carbon fiber", 1, grey(30), false, 2, 2, grey(25)];
|
||||
CF2 = [ "CF2", "Sheet carbon fiber", 2, grey(30), false, 2, 2, grey(25)];
|
||||
CF3 = [ "CF3", "Sheet carbon fiber", 3, grey(30), false, 2, 2, grey(25)];
|
||||
|
||||
sheets = [MDF6, MDF10, MDF12, MDF19, PMMA2, PMMA3, PMMA6, PMMA8, PMMA10, glass2, DiBond, DiBond6, Cardboard, FoilTape, Foam20, AL6, AL8, Steel06];
|
||||
|
||||
sheets = [CF1, CF2, CF3, MDF6, MDF10, MDF12, MDF19, PMMA2, PMMA3, PMMA6, PMMA8, PMMA10, glass2, DiBond, DiBond6, Cardboard, FoilTape, Foam20, AL6, AL8, Steel06];
|
||||
|
||||
use <sheet.scad>
|
||||
|