From 0acb1e0e6e627e77b5650ee58842de6e9da059b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Dante=20Ursini?= Date: Wed, 15 Jan 2025 14:02:16 -0300 Subject: [PATCH] Bottom insert --- Kitesurf-Fins.json | 38 +++++ Kitesurf-Fins.scad | 394 ++++++++++++++++++++++----------------------- 2 files changed, 230 insertions(+), 202 deletions(-) diff --git a/Kitesurf-Fins.json b/Kitesurf-Fins.json index 6cb22e9..7b20b6d 100644 --- a/Kitesurf-Fins.json +++ b/Kitesurf-Fins.json @@ -29,6 +29,44 @@ "parts": "all", "scale_factor": "1", "show_debug_layers": "false" + }, + "New set 2": { + "$fn": "64", + "OFFSET": "0.01", + "base_extra_thickness": "20", + "base_tickness": "8", + "build_fin": "true", + "build_mold": "true", + "draw_profile": "false", + "fin_back_angle": "20", + "fin_back_height": "30", + "fin_back_strength": "30", + "fin_back_widthdraw": "20", + "fin_back_withraw": "20", + "fin_base": "114", + "fin_counter_angle": "30", + "fin_counter_strength": "10", + "fin_edge_angle": "30", + "fin_edge_strength": "30", + "fin_end_angle": "110", + "fin_end_strength": "30", + "fin_height": "51", + "fin_start_angle": "60", + "fin_sweep": "25", + "fin_thickness": "8", + "fin_top_withdraw": "10", + "fin_width": "120", + "fin_width_tip": "5", + "merge_holes_diameter": "6", + "mold_base_height": "10", + "mold_extra_width": "15", + "mold_part": "bottom", + "mold_piston_height": "10", + "parts": "bottom", + "piston_depth": "5", + "resin_escape_diameter": "4", + "scale_factor": "1", + "show_debug_layers": "false" } } } diff --git a/Kitesurf-Fins.scad b/Kitesurf-Fins.scad index ae6b405..5660217 100644 --- a/Kitesurf-Fins.scad +++ b/Kitesurf-Fins.scad @@ -3,11 +3,12 @@ include ; include ; include ; include ; +include ; include ; include ; include ; -//include ; +include ; /************************************************/ /* Parameters */ @@ -50,7 +51,6 @@ fin_back_strength=30; base_tickness=8; base_extra_thickness=20; - /* [Debugging] */ // Showing all layers @@ -62,17 +62,54 @@ draw_profile = true; // Draw Fin build_fin = false; +// Build mold +build_mold = true; + +/* [Mold] */ + +// Mold base height +mold_base_height = 10; +mold_extra_width = 15; + +mold_piston_height = 10; + +resin_escape_diameter=4; + +// Diameter for screw holes in mm +merge_holes_diameter = 6; +piston_depth = 5; + /* [Rendering] */ // Rendering parts -parts="all"; // [all, top, bottom] +parts = "all"; // [all, top, bottom] +mold_part= "all"; // [all, top, bottom] // Scaling scale_factor = 1.0; // [0.1:0.1:2] +// Rendering mold +//render_mold = true; + $fn=64; + +/*************/ +/* Constants */ +/*************/ + + +// Define the offset value as a constant +OFFSET = 0.01; + /************************************************/ +/* Derived variable */ + +mold_width = fin_height +2 * mold_extra_width; +mold_length = fin_width +2 * mold_extra_width; +mold_height = mold_base_height; + +drilling_length = mold_base_height+mold_piston_height+2*OFFSET; pt1_x = adj_ang_to_opp(fin_height,fin_sweep)+fin_base/2; @@ -84,6 +121,8 @@ tail_point = [fin_width-3,fin_height/5]; edge_point = [fin_width-fin_top_withdraw,fin_height-2]; counter_edge_point = [fin_width-6,fin_height-8]; + + /******************/ /* Profile points */ /******************/ @@ -123,168 +162,12 @@ counter_edge_point = [fin_width-6,fin_height-8]; handle([fin_base,0],60,3), [fin_base,0] // End point ]; -/* -top_point = [0,fin_height]; -p1 = [fin_thickness/2,0]; -p2 = [-fin_thickness/2,0]; - - -vertical_shape=[ - p1, - handle(p1,90,fin_height/1.2), - // ***************** - // TOP Point - // ***************** - handle(top_point,140 ,0), - top_point, - handle(top_point,140 ,0), - // ***************** - // END POINT - // ***************** - handle(p2,90,fin_height/1.2), - p2 -]; -*/ -/* -lpoint=[fin_width/2,0]; -rpoint=[-lpoint[0],0]; -top_strength=fin_width/8; - -top_shape=[ - // Right - rpoint, - handle(rpoint,150,top_strength), - // Left - handle(lpoint,40,top_strength), - lpoint, - handle(lpoint,-40,top_strength), - // Final - handle(rpoint,-150,top_strength), - rpoint -]; -*/ - -// Calculate points along the Bézier curve. -// 'N' here determines the number of points to calculate. -//N = 50; // Number of points to generate -/* -translate_path( - resample_path(profile_path,200), - -fin_width/2, - 0 - ) -*/ -profile_path = translate_path( - asCurve(profile_points), - -fin_width/2 - ); -//vertical_path = asCurve(vertical_shape); -//top_path = asCurve(top_shape); - - -//left(50) polygon(vertical_path); -//polygon(profile_path); -//left(280) polygon(top_path); - -//left(100) back(70) -// resize([fin_width,fin_thickness])circle(d=fin_width); - - -//showDebugPath(top_path); - +profile_path = translate_path( asCurve(profile_points),-fin_width/2 ); + + + function asCurve(points) = bezier_curve(points/*,N=3*/,splinesteps=128); - - - - - -/* -bezier = bezier_points(profile_points, N=50); - -// Convert the Bézier curve points to a 3D path starting at z=0 -path3d_bezier = path3d(bezier); - -intersection(){ - if (true) down(fin_thickness) linear_extrude(height=fin_thickness*2) { - polygon(profile_path); - }; - left(0) yrot(90) linear_extrude(height=fin_width) { - polygon(vertical_path); - }; - if (true) right(fin_width/2) xrot(-90) linear_extrude(height=fin_height) { - resize([fin_width,fin_thickness])circle(d=fin_width); - }; - -} - -color("Red") left(300) intersection(){ - left(0) yrot(90) - - //bend(size = [fin_width*3, fin_height*2, fin_tickness*4], angle = 270) - linear_extrude(height=fin_width) - polygon(vertical_path); - if (true) right(fin_width/2) xrot(-90) linear_extrude(height=fin_height) { - resize([fin_width,fin_thickness])circle(d=fin_width); - }; - -} - - color("green") left(300) back(70) - left(0) yrot(90) - //bend(size = [fin_width*3, fin_height*2, fin_tickness*4], angle = 30) - linear_extrude(height=fin_width) - //bend_extrude(size = [100, 100], thickness = 1, angle = 270) - polygon(vertical_path); - //text("A"); - ; - -path = [for(theta=[-180:5:180]) [theta/10, 10*sin(theta)]]; -*/ - -// https://github.com/BelfrySCAD/BOSL2/wiki/skin.scad#functionmodule-path_sweep -/* -color("Yellow") path_sweep( - vertical_path, - get_n_items(profile_path,80), - spin=0 - ); -*/ - -/* - - echo ("PATH LENGTH",len(profile_path)); - echo ("PATH LENGTH2",len(subdivide_path(profile_path,400))); - echo ("PATH LENGTH3",len(resample_path(profile_path,500))); - -print_path_points(profile_path); - -print_path_points(translate_path(profile_path,-fin_width/2,0)); -*/ - -//if (true) - -/* -circle_r = 10; -round_r = 5; - -right(200) rounded_extrude(circle_r * 2, round_r) - circle(circle_r); - -right(300) rounded_extrude(circle_r * 2, round_r) - polygon(resample_path(profile_path,200)); -*/ - -//color("red")move_copies(profile_path) circle($fn=16); - - - - -/* -function get_n_items(arr, n) = - [for (i = [0 : n - 1]) if (i < len(arr)) arr[i]]; -*/ - function handle(point,angle,strength) = [ //point[0] + adj_ang_to_opp(strength,angle) /** xAngleFactor(angle)*/, //point[1] + /*(angle>0 ? strength :-strength)*/ strength * yAngleFactor(angle), @@ -295,7 +178,7 @@ function handle(point,angle,strength) = [ function xAngleFactor(angle) = angle > 0 && angle < 180 ? 1 : -1; function yAngleFactor(angle) = angle > -90 && angle < 90 ? 1 : -1; -function counterTop(x,withdraw,height) = [x-withdraw, height ]; +//function counterTop(x,withdraw,height) = [x-withdraw, height ]; function handleStart(x,withdraw,angle,strength) = [x+adj_ang_to_opp(strength,angle), x-withdraw +strength]; function handleEnd(x,withdraw,angle,strength) = [x-adj_ang_to_opp(strength,angle), x-withdraw -strength]; function endHandle(angle)= @@ -305,7 +188,7 @@ function endHandle(angle)= [fin_base - adj_ang_to_opp(fin_end_strength,angle-90),fin_end_strength] ; -function backPoint() = [fin_base-(fin_back_widthdraw/100*fin_base),fin_back_height/100*fin_height]; +//function backPoint() = [fin_base-(fin_back_widthdraw/100*fin_base),fin_back_height/100*fin_height]; function decrease_y(points, percentage) = [ for (p = points) [p[0], p[1] * (1 - percentage/100)]]; @@ -321,7 +204,7 @@ fin_profile = pathProfile( profile_points ); // **************** // * Slicing * // **************** - +/* layer_0 = pathProcess(addBase(fin_profile)); // Master layer with base layer_1 = contract(layer_0,-5); layer_2 = contract(layer_1,-4); @@ -334,13 +217,13 @@ layer_4 = contract(layer_3,-2); //layers = [layer_0,layer_1,layer_2,layer_3,layer_4]; layers = [layer_0,layer_1,layer_2,layer_3]; +*/ function pathProcess2(path) = subdivide_path(path,100); function pathProcess(path) = path; -function contract2(path,delta) = pathProcess(offset(path,r=delta,chamfer=true)); -function contract(path,delta) = +function expandPath(path,delta) = pathProcess( offset( deduplicate(path), @@ -350,14 +233,148 @@ function contract(path,delta) = ) ); -// **************** -// * Fin Drawing * -// **************** +// ***************** +// * Fin Drawing * +// ***************** if (build_fin) { - scale([scale_factor, scale_factor, scale_factor]) build(); + scale([scale_factor, scale_factor, scale_factor]) + buildFin(); +} +// ***************** +// * Mold * +// ***************** +/* +if (build_mold) { + back(mold_width/2-mold_extra_width-5) + // Bottom mold + + diff() cuboid( [ mold_length, mold_width, mold_height ],anchor=TOP ) { + // Bottom Insert + align(TOP,overlap=-OFFSET,inside=true) bottomInsert(); + + // Drills + align(BOTTOM,[FRONT+LEFT,FRONT+RIGHT,BACK+LEFT,BACK+RIGHT],inset=10,overlap=-OFFSET) + color("orange") tag("remove") drilling(); + + // Top Mold + + if (mold_part != "bottom") align(TOP) + //color("Goldenrod") + //color([255, 215, 0,0.1]) + up(OFFSET*3) + diff() { + color("Orange") cuboid([ mold_length, mold_width, mold_piston_height ]); + position(TOP) down(OFFSET) tag("remove") resin_escape(); + } + } + ; + +} +*/ + +if (build_mold) { + back(mold_width/2-mold_extra_width-5) + // Bottom mold + + difference() { + bottomCase(); + + // Bottom Insert + //align(TOP,overlap=-OFFSET,inside=true) + //up(piston_depth/2-OFFSET) + down(piston_depth-OFFSET) + fwd(20) + bottomInsert(); + + // Drills + //align(BOTTOM,[FRONT+LEFT,FRONT+RIGHT,BACK+LEFT,BACK+RIGHT],inset=10,overlap=-OFFSET) + // color("orange") + //tag("remove") + // drilling(); + + // Top Mold + + /* + if (mold_part != "bottom") align(TOP) + //color("Goldenrod") + //color([255, 215, 0,0.1]) + up(OFFSET*3) + diff() { + color("Orange") cuboid([ mold_length, mold_width, mold_piston_height ]); + position(TOP) down(OFFSET) tag("remove") resin_escape(); + } + */ + } } -module build() { + +//up(50) bottomInsert(); + +module bottomCase() { + diff() cuboid( [ mold_length, mold_width, mold_height ],anchor=TOP ) + // Drills + align(BOTTOM,[FRONT+LEFT,FRONT+RIGHT,BACK+LEFT,BACK+RIGHT],inset=10,overlap=-OFFSET) + // color("orange") + tag("remove") + drilling(); +} + + +// ***************** +// * Bottom insert * +// ***************** +module bottomInsert() { + debug=true; + layer_profile = pathProcess(profile_path); + skin( [ layer_profile,expandPath(layer_profile,3) ], z=[0,piston_depth], slices=0 ) + //up(debug ? 2 : 0) + up(OFFSET) + buildFinSide(true) + ; +} + +/** + * Build fin side + * + * @param flip - Define it it is top or bottom fin side + */ +module buildFinSide(flip=false) { + mirror([0,0,flip ? 1 : 0]) + color(flip ? "Gray" : "LightGray") /*up(fin_thickness/4)*/ /*down(fin_thickness) */ + ellipse_extrude( fin_thickness/2) + polygon(profile_path); +} + +module resin_escape() { + color ("Blue") cylinder(h=drilling_length, r=resin_escape_diameter/2); +} + +// ***************** +// * Drilling * +// ***************** +module drilling(){ + +//length = mold_base_height+mold_piston_height+10; + +/*fwd(20)*/ color("Red") /*up(mold_piston_height+5)*/ up(-OFFSET) +orient(DOWN) + threaded_rod( + d=merge_holes_diameter, + l=drilling_length, + pitch=1.5, + anchor=BOTTOM, + //orient=BOTTOM + + ); +} + + + + +//drilling(); + +module buildFin() { + if (false) union(){ difference(){ union() { @@ -380,35 +397,8 @@ module subtracted(anchor) { } -/** - * Build fin side - * - * @param layers - Layers path as array - * @param thickness - thickness of half fin - */ -//module buildFinSide(layers,thickness,flip=false) { -module buildFinSide(flip=false) { - mirror([0,0,flip ? 1 : 0]) - color(flip ? "Gray" : "LightGray") up(fin_thickness/4) /*down(fin_thickness) */ - ellipse_extrude( - fin_thickness/2, - center=true, - ) - polygon(profile_path) - /* - polygon( - translate_path( - resample_path(profile_path,200), - -fin_width/2, - 0 - ) - - )*/ - ; -} - echo ("layerHeights(3,thickness):",layerHeights(3,base_tickness/2)); if (show_debug_layers) { @@ -515,9 +505,9 @@ module print_path_points(path) { echo ("**********************"); echo ("* Configuration *"); echo ("**********************"); -echo ("Layers count" ,len(layers)); +//echo ("Layers count" ,len(layers)); echo ("Base thickness" ,str(base_tickness," mm")); -echo ("Layers heights" ,layerHeights(len(layers),fin_thickness/2)); +//echo ("Layers heights" ,layerHeights(len(layers),fin_thickness/2));