mirror of
https://github.com/nophead/NopSCADlib.git
synced 2025-08-06 15:36:30 +02:00
Merge branch 'dimensions' of https://github.com/AlexVerschoot/NopSCADlib into AlexVerschoot-dimensions
This commit is contained in:
BIN
docs/sliding_t_nut.png
Normal file
BIN
docs/sliding_t_nut.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 28 KiB |
82
tests/dimension.scad
Normal file
82
tests/dimension.scad
Normal file
@@ -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 <https://www.gnu.org/licenses/>.
|
||||
//
|
||||
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();
|
||||
|
||||
|
||||
|
171
utils/dimension.scad
Normal file
171
utils/dimension.scad
Normal file
@@ -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 <https://www.gnu.org/licenses/>.
|
||||
//
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
@@ -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]));
|
@@ -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
|
||||
//! 
|
||||
//
|
||||
include <../utils/core/core.scad>
|
||||
use <washer.scad>
|
||||
|
Reference in New Issue
Block a user