diff --git a/docs/sliding_t_nut.png b/docs/sliding_t_nut.png new file mode 100644 index 0000000..7901396 Binary files /dev/null and b/docs/sliding_t_nut.png differ diff --git a/tests/dimension.scad b/tests/dimension.scad new file mode 100644 index 0000000..a5fa4be --- /dev/null +++ b/tests/dimension.scad @@ -0,0 +1,82 @@ +// +// 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 . +// +include <../utils/core/core.scad> +use <../utils/dimension.scad> + + +module dimensions_3d_xy() { + dimension([0,0,0], [10,10,0], "", 0.2); + dimension([0,0,0], [10,-10,0], "", 0.2); + dimension([0,0,0], [-10,10,0], ""); + dimension([0,0,0], [-10,-10,0], ""); + + + dimension([0,0,0], [0,10,0], ""); + dimension([0,0,0], [0,-10,0], ""); + dimension([0,0,0], [10,0,0], "",rot_around_dim=0); + dimension([0,0,0], [-10,0,0], "", rot_around_dim=90); +} + +module dimensions_3d_xyz() { + dimension([0,0,0], [10,10,10], ""); + dimension([0,0,0], [10,-10,10], ""); + dimension([0,0,0], [-10,10,10], ""); + dimension([0,0,0], [-10,-10,10], ""); + + dimension([0,0,0], [10,10,-10], ""); + dimension([0,0,0], [10,-10,-10], ""); + dimension([0,0,0], [-10,10,-10], ""); + dimension([0,0,0], [-10,-10,-10], "", rot_around_dim=45); + + dimension([0,0,0], [-3,0,10], ""); + dimension([0,0,0], [0,0,-10], ""); + + dimension([0,0,0], [0,2,10], ""); + dimension([0,0,0], [0,2,-10], ""); + +} + +module dimension_1d_x() { + dimension_x([12,0,0], [18,0,0]); + dimension_x([12,5,0], [18,10,0], offset = -1); + dimension_x([12,0,-5], [18,0,0], plane= "xz"); + dimension_x([12,5,0], [18,10,5]); +} + +module dimension_1d_y() { + dimension_y([12,0,0], [12,-5,0]); + dimension_y([12,-8,0], [18,-10,0]); + dimension_y([12,-5,0], [18,-10,5], offset = -1, plane= "yz"); +} + +module dimension_1d_z() { + dimension_z([20,0,5], [20,0,0]); + dimension_z([20,0,10], [20,0,0]); + dimension_z([20,0,0], [20,10,10],plane= "yz"); +} + +if($preview) + dimensions_3d_xy(); + dimensions_3d_xyz(); + dimension_1d_x(); + dimension_1d_y(); + dimension_1d_z(); + + + \ No newline at end of file diff --git a/utils/dimension.scad b/utils/dimension.scad new file mode 100644 index 0000000..c0b0ef8 --- /dev/null +++ b/utils/dimension.scad @@ -0,0 +1,171 @@ +// +// 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 . +// + +include <../utils/core/core.scad> +include <../utils/maths.scad> + + + + +module dimension(startpoint, endpoint, text = "", thickness = 0, text_size = 0 , rot_around_dim=0) { //! Will create a 3D dimension between two points. If text is empty, will display the measured distance. Thickness will determine the thickness of the lines, and size of the arrows, if 0, will use 0.5% of the length of the dim. Text_size will determine the size of the text, if 0, will use percentage of the length of the dim + // Compute vector between points + direction = endpoint - startpoint; + length = norm(direction); + midpoint = (startpoint + endpoint) / 2; + thickness = (thickness == 0? length/200:thickness); + + // Ensure nonzero values for calculations + dir_xy = norm([direction.x, direction.y]); + + // Compute rotation angles + azimuth = atan2(direction.y, direction.x); + elevation = -atan2(direction.z, dir_xy); + + //end triangle size + etr_width = thickness *10; + etr_height = thickness *4; + + // Draw measurement line as a thin cylinder + translate(midpoint) + rotate([0, elevation, azimuth]) + rotate([0, 90, 0]) + resize([thickness, thickness, length - etr_width+0.01 ]) + cube(center = true); + + //do some vector calculations + dir = (length > 0) ? (direction / length) * thickness * 4 : [1, 0, 0]; + + // Draw endpoint markers + translate(startpoint) + rotate([0, elevation, azimuth]) + rotate([rot_around_dim,0,0]) + translate([0,0,-thickness/2]) + linear_extrude(thickness) + polygon([[etr_width, etr_height/2],[0,0],[etr_width, -etr_height/2]],[[0,1,2]]); + + translate(endpoint) + rotate([0, elevation, azimuth]) + rotate([rot_around_dim,0,0]) + translate([0,0,-thickness/2]) + linear_extrude(thickness) + polygon([[-etr_width, etr_height/2],[0,0],[-etr_width, -etr_height/2]],[[0,1,2]]); + + + // Draw the text/distance + translate(midpoint) + rotate([0, elevation, azimuth]) + rotate([rot_around_dim,0,0]) + translate([0,thickness,-thickness/2]) + linear_extrude(thickness) + text(text == "" ? str(length) : text, size = (text_size == 0? length/15:text_size), valign = "bottom", halign = "center"); +} + + +module dimension_x(startpoint, endpoint, offset = 1, text = "", thickness = 0, text_size = 0 , plane = "xy") { //! Will create a dimension in the x direction. Offset will determine how much space is between the measured point and the dimension. Plane options : xy, xz + length = norm(endpoint - startpoint); + thickness = (thickness == 0? length/200:thickness); + + y = offset > 0 ? max(startpoint.y, endpoint.y) + (plane=="xy"?offset:0) : min(startpoint.y, endpoint.y) + (plane=="xy"?offset:0); + z = offset > 0 ? max(startpoint.z, endpoint.z) + (plane=="xz"?offset:0) : min(startpoint.z, endpoint.z) + (plane=="xz"?offset:0); + + dimension([startpoint.x, y, z], [endpoint.x, y, z], text, thickness, text_size, rot_around_dim=(plane=="xz"?90:0)); + + v1= [startpoint.x, y, z]-startpoint; + h1 = norm(v1); + axis1 = cross([0,0,1], v1); + angle1 = atan2(norm(axis1), v1.z); + translate(startpoint) + rotate(angle1, axis1) + cylinder( h= h1+thickness*2, d=thickness); + + + v2= [endpoint.x, y, z]-endpoint; + h2 = norm(v2); + axis2 = cross([0,0,1], v2); + angle2 = atan2(norm(axis2), v2.z); + + translate(endpoint) + rotate(angle2, axis2) + cylinder( h= h2+thickness*2, d=thickness); +} + + +module dimension_y(startpoint, endpoint, offset = 1, text = "", thickness = 0, text_size = 0 , plane = "xy") { //! Will create a dimension in the y direction. Offset will determine how much space is between the measured point and the dimension. Plane options : xy, yz + length = norm(endpoint - startpoint); + thickness = (thickness == 0? length/200:thickness); + + + x = offset > 0 ? max(startpoint.x, endpoint.x) + (plane=="xy"?offset:0) : min(startpoint.x, endpoint.x) + (plane=="xy"?offset:0); + z = offset > 0 ? max(startpoint.z, endpoint.z) + (plane=="yz"?offset:0) : min(startpoint.z, endpoint.z) + (plane=="yz"?offset:0); + dimension([x, startpoint.y, z], [x, endpoint.y, z], text, thickness, text_size, rot_around_dim=(plane=="yz"?90:0)); + + v1= [x, startpoint.y, z]-startpoint; + h1 = norm(v1); + axis1 = cross([0,0,1], v1); + angle1 = atan2(norm(axis1), v1.z); + + translate(startpoint) + rotate(angle1, axis1) + rotate([offset>0?0:180,0,0]) + cylinder( h= h1+thickness*2, d=thickness); + + + v2= [x, endpoint.y, z]-endpoint; + h2 = norm(v2); + axis2 = cross([0,0,1], v2); + angle2 = atan2(norm(axis2), v2.z); + + translate(endpoint) + rotate(angle2, axis2) + rotate([offset>0?0:180,0,0]) + cylinder( h= h2+thickness*2, d=thickness); +} + +module dimension_z(startpoint, endpoint, offset = 1, text = "", thickness = 0, text_size = 0 , plane = "xz") { //! Will create a dimension in the z direction. Offset will determine how much space is between the measured point and the dimension. Plane options : xz, yz + length = norm(endpoint - startpoint); + thickness = (thickness == 0? length/200:thickness); + + + x = offset > 0 ? max(startpoint.x, endpoint.x) + (plane=="xz"?offset:0) : min(startpoint.x, endpoint.x) + (plane=="xz"?offset:0); + y = offset > 0 ? max(startpoint.y, endpoint.y) + (plane=="yz"?offset:0) : min(startpoint.y, endpoint.y) + (plane=="yz"?offset:0); + dimension([x, y, startpoint.z], [x, y, endpoint.z], text, thickness, text_size, rot_around_dim=(plane=="xz"?90:0)); + + v1= [x, y, startpoint.z]-startpoint; + h1 = norm(v1); + axis1 = cross([0,0,1], v1); + angle1 = atan2(norm(axis1), v1.z); + + translate(startpoint) + rotate(angle1, axis1) + cylinder( h= h1+thickness*2, d=thickness); + + + v2= [x, y, endpoint.z]-endpoint; + h2 = norm(v2); + axis2 = cross([0,0,1], v2); + angle2 = atan2(norm(axis2), v2.z); + + translate(endpoint) + rotate(angle2, axis2) + cylinder( h= h2+thickness*2, d=thickness); +} + + + + diff --git a/utils/maths.scad b/utils/maths.scad index 3d03f47..0f8b68c 100644 --- a/utils/maths.scad +++ b/utils/maths.scad @@ -190,4 +190,4 @@ function cubic_real_roots(a, b, c, d) = //! Returns real roots of cubic equation function path_length(path, i = 0, length = 0) = //! Calculated the length along a path i >= len(path) - 1 ? length - : path_length(path, i + 1, length + norm(path[i + 1] - path[i])); + : path_length(path, i + 1, length + norm(path[i + 1] - path[i])); \ No newline at end of file diff --git a/vitamins/nut.scad b/vitamins/nut.scad index d6534e4..8cd9bbc 100644 --- a/vitamins/nut.scad +++ b/vitamins/nut.scad @@ -21,6 +21,8 @@ //! Default is steel but can be drawn as brass or nylon. A utility for making nut traps included. //! //! If a nut is given a child then it gets placed on its top surface. +//! The following diagram shows you the parameters for drawing a sliding_t_nut +//! ![](docs/sliding_t_nut.png) // include <../utils/core/core.scad> use