diff --git a/readme.md b/readme.md
index 6d9f2c2..2c9cd07 100644
--- a/readme.md
+++ b/readme.md
@@ -25,26 +25,26 @@ A list of changes classified as breaking, additions or fixes is maintained in [C
Antennas | Inserts | Rails | Butt_box | Bezier | Clip |
Axials | Jack | Ring_terminals | Cable_clip | Catenary | Global |
BLDC_motors | LDRs | Rockers | Cable_grommets | Core_xy | Polyholes |
- Ball_bearings | LED_meters | Rod | Camera_housing | Dogbones | Rounded_rectangle |
- Batteries | LEDs | Rod_ends | Carriers | Fillet | Sphere |
- Bearing_blocks | Leadnuts | SBR_rails | Corner_block | Gears | Teardrops |
- Belts | Light_strips | SK_brackets | Door_hinge | Hanging_hole | |
- Blowers | Linear_bearings | SMDs | Door_latch | Horiholes | |
- Box_sections | Magnets | SSRs | Drag_chain | Layout | |
- Bulldogs | Mains_sockets | Screws | Fan_guard | Maths | |
- Buttons | Microswitches | Sealing_strip | Fixing_block | Offset | |
- Cable_strips | Microview | Servo_motors | Flat_hinge | PCB_utils | |
- Cameras | Modules | Shaft_couplings | Foot | Quadrant | |
- Circlips | Nuts | Sheets | Handle | Round | |
- Components | O_ring | Spades | Knob | Rounded_cylinder | |
- DIP | Opengrab | Spools | LED_bezel | Rounded_polygon | |
- D_connectors | PCB | Springs | PCB_mount | Rounded_triangle | |
- Displays | PCBs | Stepper_motors | PSU_shroud | Sector | |
- Extrusion_brackets | PSUs | Swiss_clips | Pocket_handle | Splines | |
- Extrusions | Panel_meters | Terminals | Press_fit | Sweep | |
- Fans | Photo_interrupters | Toggles | Printed_box | Thread | |
- Fastons | Pillars | Transformers | Printed_pulleys | Tube | |
- Fuseholder | Pillow_blocks | Ttracks | Ribbon_clamp | | |
+ Ball_bearings | LED_meters | Rod | Camera_housing | Dimension | Rounded_rectangle |
+ Batteries | LEDs | Rod_ends | Carriers | Dogbones | Sphere |
+ Bearing_blocks | Leadnuts | SBR_rails | Corner_block | Fillet | Teardrops |
+ Belts | Light_strips | SK_brackets | Door_hinge | Gears | |
+ Blowers | Linear_bearings | SMDs | Door_latch | Hanging_hole | |
+ Box_sections | Magnets | SSRs | Drag_chain | Horiholes | |
+ Bulldogs | Mains_sockets | Screws | Fan_guard | Layout | |
+ Buttons | Microswitches | Sealing_strip | Fixing_block | Maths | |
+ Cable_strips | Microview | Servo_motors | Flat_hinge | Offset | |
+ Cameras | Modules | Shaft_couplings | Foot | PCB_utils | |
+ Circlips | Nuts | Sheets | Handle | Quadrant | |
+ Components | O_ring | Spades | Knob | Round | |
+ DIP | Opengrab | Spools | LED_bezel | Rounded_cylinder | |
+ D_connectors | PCB | Springs | PCB_mount | Rounded_polygon | |
+ Displays | PCBs | Stepper_motors | PSU_shroud | Rounded_triangle | |
+ Extrusion_brackets | PSUs | Swiss_clips | Pocket_handle | Sector | |
+ Extrusions | Panel_meters | Terminals | Press_fit | Splines | |
+ Fans | Photo_interrupters | Toggles | Printed_box | Sweep | |
+ Fastons | Pillars | Transformers | Printed_pulleys | Thread | |
+ Fuseholder | Pillow_blocks | Ttracks | Ribbon_clamp | Tube | |
Gear_motors | Pin_headers | Tubings | SSR_shroud | | |
Geared_steppers | Potentiometers | Variacs | Screw_knob | | |
Green_terminals | Pulleys | Veroboard | Socket_box | | |
@@ -2460,6 +2460,10 @@ Default is steel but can be drawn as brass or nylon. A utility for making nut tr
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:
+
+
+
[vitamins/nuts.scad](vitamins/nuts.scad) Object definitions.
[vitamins/nut.scad](vitamins/nut.scad) Implementation.
@@ -7242,6 +7246,35 @@ allows flexible positioning of the motors.
| 6 | `NEMA(NEMA17_40)` | Stepper motor NEMA17 x 40mm (5x20 shaft) |
+Top
+
+---
+
+## Dimension
+Modules for adding dimensions to assembly views.
+
+
+
+* If `text` is empty, will display the measured distance.
+* `offset` will determine how much space is between the measured point and the dimension.
+* `thickness` is 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.
+
+[utils/dimension.scad](utils/dimension.scad) Implementation.
+
+[tests/dimension.scad](tests/dimension.scad) Code for this example.
+
+### Modules
+| Module | Description |
+|:--- |:--- |
+| `dimension(startpoint, endpoint, text = "", thickness = 0, text_size = 0 , rot_around_dim = 0)` | Creates a 3D dimension between two points. |
+| `dimension_x(startpoint, endpoint, offset = 1, text = "", thickness = 0, text_size = 0 , plane = "xy")` | Creates a dimension in the x direction. Plane options : xy, xz |
+| `dimension_y(startpoint, endpoint, offset = 1, text = "", thickness = 0, text_size = 0 , plane = "xy")` | Creates a dimension in the y direction. Plane options : xy, yz |
+| `dimension_z(startpoint, endpoint, offset = 1, text = "", thickness = 0, text_size = 0 , plane = "xz")` | Creates a dimension in the z direction. Plane options : xz, yz |
+
+
+
+
Top
---
diff --git a/tests/dimension.scad b/tests/dimension.scad
index a5fa4be..eefeec5 100644
--- a/tests/dimension.scad
+++ b/tests/dimension.scad
@@ -1,5 +1,5 @@
//
-// NopSCADlib Copyright Chris Palmer 2018
+// NopSCADlib Copyright Chris Palmer 2025
// nop.head@gmail.com
// hydraraptor.blogspot.com
//
@@ -46,29 +46,29 @@ module dimensions_3d_xyz() {
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]);
+ 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");
+ 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");
+ dimension_z([20,0,0], [20,10,10],plane= "yz");
}
if($preview)
@@ -77,6 +77,3 @@ if($preview)
dimension_1d_x();
dimension_1d_y();
dimension_1d_z();
-
-
-
\ No newline at end of file
diff --git a/tests/png/butt_box.png b/tests/png/butt_box.png
index c2ae6e7..17620ef 100644
Binary files a/tests/png/butt_box.png and b/tests/png/butt_box.png differ
diff --git a/tests/png/dimension.png b/tests/png/dimension.png
new file mode 100644
index 0000000..f9cda94
Binary files /dev/null and b/tests/png/dimension.png differ
diff --git a/utils/dimension.scad b/utils/dimension.scad
index c0b0ef8..e5736ce 100644
--- a/utils/dimension.scad
+++ b/utils/dimension.scad
@@ -1,5 +1,5 @@
//
-// NopSCADlib Copyright Chris Palmer 2018
+// NopSCADlib Copyright Chris Palmer 2025
// nop.head@gmail.com
// hydraraptor.blogspot.com
//
@@ -17,13 +17,20 @@
// If not, see .
//
+//
+//! Modules for adding dimensions to assembly views.
+//!
+//!
+//!
+//! * If `text` is empty, will display the measured distance.
+//! * `offset` will determine how much space is between the measured point and the dimension.
+//! * `thickness` is 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.
+
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
+module dimension(startpoint, endpoint, text = "", thickness = 0, text_size = 0 , rot_around_dim = 0) { //! Creates a 3D dimension between two points.
// Compute vector between points
direction = endpoint - startpoint;
length = norm(direction);
@@ -34,9 +41,9 @@ module dimension(startpoint, endpoint, text = "", thickness = 0, text_size = 0 ,
dir_xy = norm([direction.x, direction.y]);
// Compute rotation angles
- azimuth = atan2(direction.y, direction.x);
+ azimuth = atan2(direction.y, direction.x);
elevation = -atan2(direction.z, dir_xy);
-
+
//end triangle size
etr_width = thickness *10;
etr_height = thickness *4;
@@ -44,32 +51,32 @@ module dimension(startpoint, endpoint, text = "", thickness = 0, text_size = 0 ,
// Draw measurement line as a thin cylinder
translate(midpoint)
rotate([0, elevation, azimuth])
- rotate([0, 90, 0])
+ 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];
+ dir = (length > 0) ? (direction / length) * thickness * 4 : [1, 0, 0];
// Draw endpoint markers
- translate(startpoint)
- rotate([0, elevation, azimuth])
+ 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])
+
+ 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([0, elevation, azimuth])
rotate([rot_around_dim,0,0])
translate([0,thickness,-thickness/2])
linear_extrude(thickness)
@@ -77,36 +84,36 @@ module dimension(startpoint, endpoint, text = "", thickness = 0, text_size = 0 ,
}
-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
+module dimension_x(startpoint, endpoint, offset = 1, text = "", thickness = 0, text_size = 0 , plane = "xy") { //! Creates a dimension in the x direction. 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));
-
+
+ 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);
+ 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);
+ 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
+module dimension_y(startpoint, endpoint, offset = 1, text = "", thickness = 0, text_size = 0 , plane = "xy") { //! Creates a dimension in the y direction. Plane options : xy, yz
length = norm(endpoint - startpoint);
thickness = (thickness == 0? length/200:thickness);
@@ -114,30 +121,30 @@ module dimension_y(startpoint, endpoint, offset = 1, text = "", thickness = 0, t
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);
+ 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
+module dimension_z(startpoint, endpoint, offset = 1, text = "", thickness = 0, text_size = 0 , plane = "xz") { //! Creates a dimension in the z direction. Plane options : xz, yz
length = norm(endpoint - startpoint);
thickness = (thickness == 0? length/200:thickness);
@@ -145,27 +152,23 @@ module dimension_z(startpoint, endpoint, offset = 1, text = "", thickness = 0, t
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);
+ cylinder( h= h2+thickness*2, d=thickness);
}
-
-
-
-
diff --git a/utils/maths.scad b/utils/maths.scad
index 0f8b68c..3d03f47 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]));
\ No newline at end of file
+ : path_length(path, i + 1, length + norm(path[i + 1] - path[i]));
diff --git a/vitamins/nut.scad b/vitamins/nut.scad
index 8cd9bbc..5d7000b 100644
--- a/vitamins/nut.scad
+++ b/vitamins/nut.scad
@@ -21,7 +21,9 @@
//! 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
+//!
+//! The following diagram shows you the parameters for drawing a sliding_t_nut:
+//!
//! 
//
include <../utils/core/core.scad>