From 3450bf2c526658106f1aa97afe0fde7eda434d44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Dante=20Ursini?= Date: Mon, 20 Jan 2025 22:41:11 -0300 Subject: [PATCH] finbox mold refactoring --- Surf-Fins-10inch.json | 53 ++++++++++++++ Surf-Fins-10inch.scad | 150 ++++++++++++++++++++-------------------- lib/chinook.scad | 132 +++++++++++++++++++++++------------ lib/finbox_us.scad | 157 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 373 insertions(+), 119 deletions(-) create mode 100644 lib/finbox_us.scad diff --git a/Surf-Fins-10inch.json b/Surf-Fins-10inch.json index 3c56ef4..a3b1a2c 100644 --- a/Surf-Fins-10inch.json +++ b/Surf-Fins-10inch.json @@ -42,6 +42,59 @@ "show_curve_points": "false", "show_debug_layers": "false", "start": "[0, 0]" + }, + "New set 2": { + "$fn": "64", + "base_extra_thickness": "40", + "base_tickness": "8", + "build_box": "false", + "build_fin": "false", + "build_mold": "true", + "draw_profile": "false", + "fin_back_angle": "20", + "fin_back_height": "30", + "fin_back_strength": "30", + "fin_back_widthdraw": "20", + "fin_base": "130", + "fin_counter_angle": "30", + "fin_counter_strength": "10", + "fin_edge_angle": "30", + "fin_edge_strength": "30", + "fin_edge_withdraw": "20", + "fin_end_angle": "110", + "fin_end_strength": "30", + "fin_height": "254", + "fin_start_angle": "70", + "fin_sweep": "25", + "fin_thickness": "9", + "fin_top_withdraw": "35", + "fin_width": "270", + "fin_width_tip": "5", + "height": "25", + "merge_holes_diameter": "6", + "mirror_vec": "[1, 1, 0]", + "mold_base_height": "10", + "mold_extra_width": "15", + "mold_part": "all", + "mold_piston_height": "10", + "mold_top_height": "5", + "parts": "all", + "pin_back": "9", + "pin_depth": "16.399999999999999", + "pin_dia": "3", + "piston_depth": "5", + "printable": "true", + "render_drill_template": "false", + "resin_escape_diameter": "4", + "scale_factor": "1", + "screw_dia": "4.5", + "screw_pos": "9.5999999999999996", + "show_curve_points": "false", + "show_debug_layers": "false", + "start": "[0, 0]", + "tab_height": "13", + "thick": "9.1999999999999993", + "thick_cut": "1" } } } diff --git a/Surf-Fins-10inch.scad b/Surf-Fins-10inch.scad index 64488b3..0f7f89d 100644 --- a/Surf-Fins-10inch.scad +++ b/Surf-Fins-10inch.scad @@ -62,7 +62,7 @@ fin_counter_strength = 10; // Length [Point 2] fin_width_tip = 5; // Width at the tip in mm -fin_thickness = 10; // Thickness of the fin in mm +fin_thickness = 9; // Thickness of the fin in mm fin_end_angle = 110; fin_end_strength = 30; @@ -222,15 +222,18 @@ points = flatten([ // ***************** bez_end(end_point,75,40), ]); -profile_curve = translate_path( addBase(asCurve(points,32)),-fin_base/2,0 ); -//profile_curve = translate_path( asCurve(points,32),-fin_base/2,0 ); -//profile_curve = resample_path(translate_path( asCurve(points,32),-fin_base/2,0 ),64); -assert(is_path_simple(profile_curve)); +profile_curve_with_base = translate_path( addBase(asCurve(points,32)),-fin_base/2,0 ); +profile = translate_path( asCurve(points,32),-fin_base/2,0 ); + +//profile_curve_with_base = translate_path( asCurve(points,32),-fin_base/2,0 ); +//profile_curve_with_base = resample_path(translate_path( asCurve(points,32),-fin_base/2,0 ),64); + +assert(is_path_simple(profile_curve_with_base)); if (show_curve_points) - color("Blue")move_copies(profile_curve) circle($fn=16); + color("Blue")move_copies(profile_curve_with_base) circle($fn=16); // Draw fin profile @@ -238,60 +241,34 @@ if (draw_profile) { //left(425) drawProfile( points, true ); - layer0 = expandPath(profile_curve,-2); - layer1 = expandPath(profile_curve,-8); - layer2 = expandPath(profile_curve,-15); - layer3 = expandPath(profile_curve,-30); - layer4 = expandPath(profile_curve,-40); + layer0 = expandPath(profile_curve_with_base,-2); + layer1 = expandPath(profile_curve_with_base,-8); + layer2 = expandPath(profile_curve_with_base,-15); + layer3 = expandPath(profile_curve_with_base,-30); + layer4 = expandPath(profile_curve_with_base,-40); back(10) showDebugPath(layer0); left(500) { - color("Red") polygon(profile_curve); + color("Red") polygon(profile_curve_with_base); up(10) polygon(layer0); up(20) color("Yellow") polygon(layer1); up(30) color("Brown") polygon(layer2); } - layers = [profile_curve,layer0,layer1,layer2,layer3,layer4]; + layers = [profile_curve_with_base,layer0,layer1,layer2,layer3,layer4]; - left (800) color ("Green") polygon(profile_curve); + left (800) color ("Green") polygon(profile_curve_with_base); - left (1000) color ("Green") shell(10) polygon(profile_curve); + left (1000) color ("Green") shell(10) polygon(profile_curve_with_base); } -/** - * Draws a profile based on Bezier path points with optional debug visualization. - * - * @param points - Array of points defining the Bezier path. - * @param debug - Boolean flag to enable/disable debug visualization. Defaults to true. - * - * This module: - * - Calculates the closest point on the Bezier path to a fixed point. - * - Draws the Bezier path with debug information if debug is true. - * - Optionally shows spheres at specific points for debugging (currently commented out). - */ -module drawProfile( points,debug = true ){ - debugPoint (start, "Start", "Red" ); - debugPoint (top_point, "Top", "Blue" ); - debugPoint (edge_point, "Edge", "Brown" ); - debugPoint (counter_edge_point, "Counter Edge", "Brown" ); - debugPoint (tail_point, "Tail", "Yellow" ); - debugPoint (end_point, "End", "Yellow" ); - - //pt = [100,0]; - //pos = bezpath_closest_point(points, pt); - //xy = bezpath_points(points,pos[0],pos[1]); - - debug_bezier(points, N=3,width=1.2); -} - // ***************** // * Fin Drawing * // ***************** @@ -319,8 +296,18 @@ module buildCompletFin() { module buildBox() { - left(80) xflip() - finfit(fin_base+20, [1,1,0],false,false); + left(80) { + xflip() { + finfit(fin_base+20, [1,1,0],false,false); + } + + //up(20) tab_cut(); + } + +} +module buildBoxMold() { + zrot(-90) chinook_profile(fin_base+20); + zrot(-90) up(-2) offset(chinook_profile(fin_base+20),delta=5); } @@ -329,18 +316,21 @@ module buildBox() { * */ module buildMold() { - - moldContour = expandPath(profile_curve,mold_extra_width); - showDebugPath(moldContour); moldHeight = 10; skirtHeight = 30; + + + moldContour = expandPath(profile,mold_extra_width); buildMoldSkirt(skirtHeight,mold_extra_width,3); if (mold_part != "top") { difference() { union() { down(moldHeight) linear_extrude (moldHeight) polygon(moldContour); // bottom - back(5) left(95) cube([20+10,25,moldHeight],anchor=BACK+TOP); // Box shell + //back(5) left(95) cube([20+10,25,moldHeight],anchor=BACK+TOP); // Box shell + + up(5) color("Yellow") left(80) buildBoxMold(); + }; buildCompletFin(); } @@ -371,11 +361,11 @@ module buildMold() { */ } module buildMoldSkirt( height,offset,thickness ) { - outside = expandPath(profile_curve,offset); - inside = expandPath(profile_curve,offset-thickness); + outside = expandPath(profile,offset); + inside = expandPath(profile,offset-thickness); down(height) { // Skirt - linear_extrude (height) difference() { + linear_extrude (height-thick/2) difference() { polygon(outside); polygon(inside); }; @@ -474,7 +464,7 @@ module buildDrillTemplate() { // ***************** module bottomInsert() { debug=true; - layer_profile = profile_curve; + layer_profile = profile_curve_with_base; skin( [ layer_profile,expandPath(layer_profile,3) ], z=[0,piston_depth], slices=0 ) up(OFFSET) buildFinSide(true) @@ -486,7 +476,7 @@ module bottomInsert() { // ***************** module topPiston() { debug=true; - layer_profile = profile_curve; + layer_profile = profile_curve_with_base; difference() { skin( [ layer_profile,expandPath(layer_profile,3) ], z=[0,piston_depth], slices=0 ); down(OFFSET) @@ -512,14 +502,14 @@ module buildFin( thickness ) { */ module buildFinSide(thickness,flip=false) { - //profile_curve1 = subdivide_path (profile_curve,500); + //profile_curve_with_base1 = subdivide_path (profile_curve_with_base,500); //if (false) mirror([0,0,flip ? 1 : 0]) color(flip ? "Gray" : "LightGray") ellipse_extrude( thickness / 2 /*,height=2*/,center=false,twist=-7) //zrot(30) - polygon( profile_curve); + polygon( profile_curve_with_base); } module resin_escape(length) { @@ -541,26 +531,9 @@ module drilling(){ ); } -/* -echo ("bez_begin([-50,0],[0,-20])",bez_begin([-50,0],[0,-20])); -echo ("bez_begin([-50,0],[0,-20])", - - - flatten([ - bez_begin([-50,0],[0,-20]), - bez_end([-50,0],[0,-20]) - ]) - -); -*/ -echo ("bez_tang([0,0],70,80)",bez_tang(counter_edge_point,60+180,30)); -echo ("point 1 ",points[8]); -echo ("point 2",points[9]); -echo ("point 3",points[10]); function addBase(path) = concat(path,[[fin_base,-base_extra_thickness],[0,-base_extra_thickness]]); - // Function to create a parallel bezier curve offset by a given amount function offset_bezier_points(points, offset_distance, normal=[0,0,1]) = @@ -604,7 +577,7 @@ function make_bezier_patch_from_curve(base_points, width, length_steps=32, width if (false) { - //vnf = bezier_vnf(profile_curve, splinesteps=10); + //vnf = bezier_vnf(profile_curve_with_base, splinesteps=10); /* vnf = make_bezier_patch_from_curve(points, width=10); @@ -614,9 +587,9 @@ if (false) { } */ /* - polygon(profile_curve); - vnf2 =vnf_from_region(polygon(profile_curve)); - //vnf2 = vnf_from_polygons(profile_curve, fast=true); + polygon(profile_curve_with_base); + vnf2 =vnf_from_region(polygon(profile_curve_with_base)); + //vnf2 = vnf_from_polygons(profile_curve_with_base, fast=true); vnf_polyhedron(vnf2); */ @@ -646,6 +619,33 @@ if (false) { } +/** + * Draws a profile based on Bezier path points with optional debug visualization. + * + * @param points - Array of points defining the Bezier path. + * @param debug - Boolean flag to enable/disable debug visualization. Defaults to true. + * + * This module: + * - Calculates the closest point on the Bezier path to a fixed point. + * - Draws the Bezier path with debug information if debug is true. + * - Optionally shows spheres at specific points for debugging (currently commented out). + */ +module drawProfile( points,debug = true ){ + + + debugPoint (start, "Start", "Red" ); + debugPoint (top_point, "Top", "Blue" ); + debugPoint (edge_point, "Edge", "Brown" ); + debugPoint (counter_edge_point, "Counter Edge", "Brown" ); + debugPoint (tail_point, "Tail", "Yellow" ); + debugPoint (end_point, "End", "Yellow" ); + + //pt = [100,0]; + //pos = bezpath_closest_point(points, pt); + //xy = bezpath_points(points,pos[0],pos[1]); + + debug_bezier(points, N=3,width=1.2); +} \ No newline at end of file diff --git a/lib/chinook.scad b/lib/chinook.scad index f29f38c..7930376 100644 --- a/lib/chinook.scad +++ b/lib/chinook.scad @@ -1,54 +1,79 @@ -module chinook(length,screw = true,pin=true) -{ - difference() - { - base_cube(length); - tab_cut(); - if (screw) screw_cut(); - back_round_cut(length); - if (pin) pin_cut(length); - thickness_cut(length, thick/2); - thickness_cut(length, -thick/2); - } -} + +include ; module finfit(base_length, mirror_vec,screw = true,pin=true) { front_offset = tab_length; length = base_length + tab_length; - echo ("length:",length); mirror(mirror_vec) - translate([0,-front_offset, 0]) - chinook( length, screw ,pin ); + translate([0,-front_offset, 0]) + chinook( length, screw ,pin ); } -module base_cube(BaseLength) +module chinook(length,screw = true,pin=true,thick = 9.2,height=25,tab_height=13,) +{ + difference() + { + base_cube( length, thick, height ); + tab_cut( thick ,height, tab_height ); + if (screw) + screw_cut(tab_height); + back_round_cut(length,thick,height); + if (pin) + pin_cut(length,tab_height); + thickness_cut(length,height, thick/2); + thickness_cut(length,height, -thick/2); + } +} + +module chinook_profile(length,thick = 9.2,height=25,tab_height=13,tab_round=13,tab_length=9.6*2) +{ + difference(){ + rect( + [height,length], + rounding=[tab_round,0,0,0], + anchor=BOTTOM+LEFT + ) + { + align(RIGHT+BOTTOM,inside=true,shiftout=0.1) + rect( [ height-tab_height, tab_length+tab_round ],rounding=[0,tab_round-1,0,0] ); + } + } + + //region(difference(shape1,shape2)); + + } + +module base_cube( length,thick,height ) { translate([0,0,-thick/2]) - cube(size=[height, - BaseLength, - thick], - center=false); + cube( + size=[ + height, + length, + thick + ], + center=false + ); } -module tab_cut() +module tab_cut( thick, height,tab_height,tab_round=13,tab_length=9.6*2 ) { translate([tab_height,0,-thick/2*1.1]) union() { translate([0,-thick,0]) - cube(size=[height, - tab_length+thick, - thick*1.1], + cube( + size=[height, tab_length+thick, thick*1.1], center=false); translate([tab_round,tab_length,0]) - cylinder(h=thick*1.1, - r=tab_round, - center=false); + cylinder(h=thick*1.1,r=tab_round,center=false); } } -module screw_cut() + + +module screw_cut(tab_height,screw_pos=9.6,screw_dia=4.5) { translate([tab_height/2,screw_pos,0]) rotate([0,90,0]) @@ -57,7 +82,7 @@ module screw_cut() center=true); } -module back_round_cut(BaseLength) +module back_round_cut(BaseLength,thick,height,tab_round=13) { translate([height-tab_round, BaseLength-tab_round, @@ -74,25 +99,44 @@ module back_round_cut(BaseLength) } } -module pin_cut(BaseLength) +module pin_cut(BaseLength,tab_height,pin_dia=3, pin_back=9,pin_depth=16.4) { translate([pin_depth, BaseLength-pin_back, 0]) - rotate([0,0,0]) - cylinder(h=tab_height*1.1, - d=pin_dia, - center=true); + rotate([0,0,0]) + cylinder( + h=tab_height*1.1, + d=pin_dia, + center=true + ); } -module thickness_cut(BaseLength, zOffset) +module thickness_cut(BaseLength,height, zOffset,pin_depth=16.4, pin_back=9,thick_cut = 1 ) { - translate([pin_depth, - BaseLength-pin_back, - zOffset]) - rotate([0,0,45]) - cube(size=[pin_depth*2.2, - height*3, - thick_cut], - center=true); + translate([ + pin_depth, + BaseLength-pin_back, + zOffset]) + rotate([0,0,45]) + cube( + size=[ + pin_depth*2.2, + height*3, + thick_cut + ], + center=true + ); } + +if (true) { + + chinook(130+20); + //up(5.2) left() color("Yellow")chinook_profile(130+20); + + +} + + + + diff --git a/lib/finbox_us.scad b/lib/finbox_us.scad new file mode 100644 index 0000000..ea9463b --- /dev/null +++ b/lib/finbox_us.scad @@ -0,0 +1,157 @@ + +include ; +include ; + +include + + +$fn=64; + +OFFSET=0.01; + +/** + * US Box profile + + * @param length - Length of the fin without the tab and back space + * + **/ +module boxProfileUS( length ,height=23, tabHeight = 8,tabLength = 20, backRounding = 8, backExtra = 10 ) { + + + tabExtra = opp_ang_to_adj(height-tabHeight,45); + points = [ + [ -tabLength , 0 ,1], // 0 + [ length+backExtra , 0 ,2], // 1 + [ length+backExtra , -height ,backRounding], // 2 + [ tabExtra , -height ,4], // 3 + [ 0 , -tabHeight ,4], // 4 + [ -tabLength , -tabHeight ,1] // 5 + ]; + polygon( + polyRound(points) + ); +} + +function profileUS( length,height=23,tabHeight = 8,tabLength = 20, backRounding = 8, backExtra = 10 ) = polyRound([ + [ -tabLength , 0 ,1], // 0 + [ length+backExtra , 0 ,2], // 1 + [ length+backExtra , -height ,backRounding], // 2 + [ opp_ang_to_adj(height-tabHeight,45) , -height ,4], // 3 + [ 0 , -tabHeight ,4], // 4 + [ -tabLength , -tabHeight ,1] // 5 + ]); + + +module usBox( length, height=23, thickness = 9, tabLength = 20,pinDiameter = 5,pinInset = 8, backExtra = 10,cutReduction = 0.5,screw_diameter=4.5,drill = true, color="Grey" ) { + color(color) mirror_copy([0,0,1], offset=-OFFSET) difference() { + linear_extrude ( height = thickness/2 ) boxProfileUS( length, tabLength = tabLength, height=height, backExtra=backExtra ); + // Thickness cut + translate([length + backExtra + OFFSET,-OFFSET,thickness/2-cutReduction+OFFSET]) + thickness_cut( cutReduction , height ); + // Pin drill + if (drill) translate([length+backExtra-pinInset,-height+pinInset,0]) color("Red") + cyl(h=thickness*2,d=pinDiameter,$fn=32); + + // Screw Cut + if (drill) translate ([-tabLength/2,-height/2+OFFSET,0]) color ("Red") cyl( h=height, d=screw_diameter, orient=FRONT ); + } +} + + +module usBoxMold( length, height=23, thickness = 9, moldThickness = 4,tabLength = 20,part = "bottom",skirtAngle=80 ) { + + moldHeight = thickness + 2 * moldThickness; + skirtHeight = 3 * thickness; + deviation = opp_ang_to_adj (skirtHeight,skirtAngle); // Skirt devitation + + baseInt = profileUS (length); + baseExt = offset(baseInt,delta=moldThickness , chamfer=false, same_length=true ); + topInt = offset(baseInt,delta=deviation , chamfer=false, same_length=true ); + topExt = offset(baseInt,delta=deviation+moldThickness , chamfer=false, same_length=true ); + + union() { + difference() { + // Mold + { + if ( part == "bottom") + down (moldHeight/2) linear_extrude(moldHeight) + offset(r=moldThickness) + boxProfileUS( length, height ); + if ( part == "top") { + //baseInt = profileUS (length); + //baseInt = profileUS (length); + //topInt = offset(baseInt,delta=-deviation,chamfer=false,same_length=true); + baseInt2 = offset(baseInt,delta=-moldThickness,chamfer=false,same_length=true); + topInt2 = offset(baseInt,delta=deviation-moldThickness,chamfer=false,same_length=true); + + difference(){ + skin([baseInt , topInt ],z=[0,skirtHeight],slices=0); + skin([baseInt2 , topInt2 ],z=[thickness/2,skirtHeight+OFFSET],slices=0); + } + + /* + down (moldHeight/2) linear_extrude(moldHeight) + offset(r=moldThickness) + boxProfileUS( length, height ); + */ + } + } + // US Box to subtract + usBox(length,height,drill=false,color="Red"); + + // Mask Top + verticalMask = + part == "bottom" ? 0 : + part == "top" ? moldHeight : + 100; + down( verticalMask ) + linear_extrude( moldHeight ) + offset( r = moldThickness*2 ) + boxProfileUS( length, height ); + } + + if ( part == "bottom") { + // offset is a function + + //topInt = offset(baseInt,delta=deviation,chamfer=false,same_length=true); + showSkirt = true; + if (showSkirt) difference(){ + skin([baseExt,topExt],z=[0,skirtHeight],slices=0); + skin([baseInt,topInt],z=[0,skirtHeight+OFFSET],slices=0); + } + } + if ( part == "top") { + + } + } + +} + +//test = profileUS (100); +//test2 = offset(test,30); +//region1 = +//region([test,test2]); +//polygon(region1); + + + +module thickness_cut(thickness,height) { + color("Orange") + linear_extrude(thickness) + polygon([ + [0 , 0 ], + [0 , -height ], + [-height*2 , -height ] + ]); +} + + + + +//boxProfileUS( length= 188); + +//usBox( 130,drill=false ); +usBoxMold( 130,part="top" ); +down(50) usBoxMold( 130,part="bottom" ); + +