From c7a0fb7b2df47553a41347218746207b676523fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Dante=20Ursini?= Date: Sat, 28 Dec 2024 17:19:58 -0300 Subject: [PATCH] Documentation --- .gitignore | 1 + Readme.md | 32 ++++++++ metalib.scad | 195 +++++++++++++++++++++++---------------------- resources/arch.png | Bin 0 -> 28505 bytes 4 files changed, 133 insertions(+), 95 deletions(-) create mode 100644 .gitignore create mode 100644 resources/arch.png diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e43b0f9 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.DS_Store diff --git a/Readme.md b/Readme.md index dd9573a..1bbeca3 100644 --- a/Readme.md +++ b/Readme.md @@ -3,4 +3,36 @@ Libraries for Metal makers +## Miter tubes module + + +This module generates a sequence of mitered tubes based on the provided section lengths, with options for customizing their dimensions and unfolding their arrangement. + +Parameters: +- `sections` (array): An array of section lengths, each specifying the length of an individual tube. + Example: `[10, 20, 30]` will create three tubes of lengths 10, 20, and 30 units respectively. + +- `height` (number): The height of each tube. This value defines the dimension perpendicular + to the tube's length and depth. + +- `depth` (number): The depth of each tube. This value defines the dimension perpendicular + to the tube's length and height. + +- `unfold` (boolean, optional): Determines whether the sequence of tubes should be unfolded + for easier visualization or fabrication. When `true`, the tubes are laid out in a flat arrangement. + Defaults to `false`. + +As an example let's create metalon arch : +```python +include ; +include ; + +yrot(-90) + miter_tubes([400,500,400],30,20,start=false,end=false); +`` + + +![image info](./resources/arch.png) + + diff --git a/metalib.scad b/metalib.scad index 28357b2..8aca2fe 100644 --- a/metalib.scad +++ b/metalib.scad @@ -1,6 +1,7 @@ include ; +/* section=20; height=800; depth=560; @@ -9,7 +10,7 @@ width=563; side_length = 20; // Length of each side of the square thickness = 3; // Thickness of the material - +*/ $fn=32; module miter_profile(length=200,height=30,depth=20) { @@ -25,27 +26,83 @@ module miter_profile(length=200,height=30,depth=20) { color([0.5,0.5,0,0.5]) cube([height, depth+2*delta, height*sqrt(2)+2],anchor=CENTER+LEFT+BOT); } - } -module miter_tube(length=200,height=30,depth=20,rounding=2,wall=1.5) { + + +/** + * Miter Tubes Module + * + * This module generates a sequence of mitered tubes based on the provided section lengths, + * with options for customizing their dimensions and unfolding their arrangement. + * + * Parameters: + * - `sections` (array): An array of section lengths, each specifying the length of an individual tube. + * Example: `[10, 20, 30]` will create three tubes of lengths 10, 20, and 30 units respectively. + * + * - `height` (number): The height of each tube. This value defines the dimension perpendicular + * to the tube's length and depth. + * + * - `depth` (number): The depth of each tube. This value defines the dimension perpendicular + * to the tube's length and height. + * + * - `unfold` (boolean, optional): Determines whether the sequence of tubes should be unfolded + * for easier visualization or fabrication. When `true`, the tubes are laid out in a flat arrangement. + * Defaults to `false`. + * + * Internal Variables and Process: + * - `moves` (array): Computed positions and rotations for each tube, determined by the `rotSlide` + * function applied to the `sections` and `unfold` parameters. + * + * - Loop: Iterates through the `sections` array to position and render each tube with the following steps: + * 1. Extracts the length of the current tube. + * 2. Retrieves the computed translation and rotation values for the tube from the `moves` array. + * 3. Logs debugging information about the current tube's dimensions and transformations. + * 4. Translates and rotates the coordinate system to align with the tube's placement. + * 5. Calls the `miter_tube` submodule to render the individual tube with specified dimensions. + * + * Submodules: + * - `miter_tube`: A separate submodule (not defined here) that handles the actual geometry creation + * for each tube, based on its length, height, and depth. + * + * Usage: + * ``` + * miter_tubes([10, 20, 30], height=5, depth=3, unfold=true); + * ``` + */ +module miter_tubes( sections, height, depth, start=true,end=true,unfold=false){ + for (index = [0:len(sections)-1]) { + length = sections[index]; + m = computeSectionPositions( sections, unfold )[index]; + translate([m[0],m[1], m[2]]) + yrot(-m[3]) + miter_tube( length, height, depth, start = index==0 ? start : true,end = index==len(sections)-1 ? end : true ); + } +} + +/** + * Creates a mitered tube with specified dimensions, wall thickness, and rounding. + * + * Parameters: + * - `length` (number): The length of the tube along its main axis (default: 200). + * - `height` (number): The height of the rectangular cross-section (default: 30). + * - `depth` (number): The depth of the rectangular cross-section (default: 20). + * - `rounding` (number): The rounding radius of the tube's edges (default: 2). + * - `wall` (number): The thickness of the tube walls (default: 1.5). + * - `start` (boolean): TRue if a miter cut should be done at the start position + * - `end` (boolean): TRue if a miter cut should be done at the end position + */ +module miter_tube(length=200,height=30,depth=20,rounding=2,wall=1.5,start=true,end=true) { delta=1; - translate([length,0,0]) - //union() { difference() { left(length/2) yrot(90) - rect_tube(size=[height,depth], wall=wall, h=length,rounding=rounding - //,anchor=F - ,anchor=[1,0,0] - ); - miter(-45); // Right Miter - //xflip() miter(); // Left Miter - translate([-length,0,0]) zrot(180) miter(-45); // Left Miter + rect_tube(size=[height,depth], wall=wall, h=length,rounding=rounding, anchor=[1,0,0]); + if ( end ) miter(-45); // Right Miter + if ( start ) translate([-length,0,0]) zrot(180) miter(-45); // Left Miter } module miter(rot) { - //translate([ length/2, 0, -height/2 ]) translate([0,0,0]) yrot(rot) color([0.5,0.5,0,0.5]) @@ -54,96 +111,44 @@ module miter_tube(length=200,height=30,depth=20,rounding=2,wall=1.5) { } -// Visualize one piece -if (false )miter_profile(); -if (false) { -// ydistribute(50) - translate([0,depth/2,0]) - xrot(90) miter_tube(length=width,height=section,depth=section); - - translate([0,-depth/2,0]) - xrot(-90) miter_tube(length=width,height=section,depth=section); - -} /** - * Miter Tubes + * Computes the positions and rotations for sections of a tube structure. * + * Parameters: + * - `v` (array): An array of section lengths. Each element represents the length of a tube segment. + * - `unfold` (boolean, optional): If true, the structure is laid flat, skipping rotation increments. + * Defaults to `false`. + * + * Returns: + * - An array of 4-element arrays, each representing the position and rotation of a section in the form [x, y, z, r]: + * - `x`, `y`, `z`: The computed coordinates for the section. + * - `r`: The rotation angle for the section. + * + * Example: + * computeSectionPositions([10, 20, 30], unfold=false); + * // Returns computed positions and rotations for each section. */ -module miter_tubes(sections,height,depth,unfold=false){ - echo(sections); - cumul=cumsum(sections); - moves=rotSlide(sections,unfold); - echo("moves",moves); - //assert(moves[0] ==[0,0,0,0,0,0], concat("Move 0 is wrong",moves[0])); - //assert(moves[1] ==[400,0,0,90,1,0], concat("Move 1 is wrong",moves[1])); - //assert(moves[2] ==[400,0,500,180,0,1], concat("Move 2 is wrong",moves[2])); - - //assert(moves[1] ==[400,0,500,180,0], concat("Move 1 is wrong",moves[1])); - - - for (index = [0:len(sections)-1]) { - - //if (index< 1) { - length = sections[index]; // Access the value at index i - slide = index == 0 ? 0: cumsum(sections)[index-1]; - //m = index==0 ? [0,0,0,0] : moves[index-1]; - m = moves[index]; - x=m[0]; - y=m[1]; - z=m[2]; - r=m[3]; - echo("------------"); - echo(concat("- tube",length," -")); - echo("------------"); - echo("x",x,"y",y,"z",z,"r",r,"length",length); - translate([x,y, z]) - yrot(-r) - //translate([0,40*index,0]) - miter_tube(length=length,height=height,depth=depth); - //} - } -} - - - -function rotSlide(v,unfold=false) = - v==[] ? [] : assert(is_consistent(v), "The input is not consistent." ) - [ + +function computeSectionPositions(sections, unfold=false) = + sections == [] ? [] : + assert(is_consistent(sections), "Input array is not consistent.") [ for ( - //x = v[0], - x = 0, - y = 0, - z = 0, - r = 0, - - xFactor = 0, - zFactor = 0, - idx = 0; - - - idx < len(v); - - - xFactor = r == 0 ? 1 : (r == 180 ? -1 : 0), - zFactor = r == 90 ? 1 : (r == 270 ? -1 : 0), - //echo("test"), - //x = i 0 && idx < len(v) ? z+v[idx]*zFactor: z , - r = r+(unfold ? 0 : 90), - idx = idx+1 + x = 0, y = 0, z = 0, r = 0, idx = 0; + idx < len(sections); + xFactor = r == 0 ? 1 : (r == 180 ? -1 : 0), + zFactor = r == 90 ? 1 : (r == 270 ? -1 : 0), + x = x + sections[idx] * xFactor, + z = z + sections[idx] * zFactor, + r = r + (unfold ? 0 : 90), + idx = idx + 1 ) - [x,y,z,r,xFactor,zFactor]]; - + [x, y, z, r] + ]; + -miter_tubes([400,500,600,700,800],30,20); +//miter_tubes([400,500,600,700,800],30,20); //echo ("rotSlide",rotSlide([400,500,600,500])); diff --git a/resources/arch.png b/resources/arch.png new file mode 100644 index 0000000000000000000000000000000000000000..b3be757c2ffd06ee0364ba7b43bb8ce56421c3ce GIT binary patch literal 28505 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 literal 0 HcmV?d00001