Compare commits

..

3 Commits

Author SHA1 Message Date
3e17af43aa - 2025-01-17 18:43:01 -03:00
c5b91d4b0e Wax product 2025-01-17 18:40:35 -03:00
fb1bdf0b84 Kiteboard fin drill template 2025-01-16 19:06:29 -03:00
11 changed files with 340811 additions and 186 deletions

View File

@ -36,7 +36,6 @@
"base_extra_thickness": "20",
"base_tickness": "8",
"build_fin": "true",
"build_mold": "true",
"draw_profile": "false",
"fin_back_angle": "20",
"fin_back_height": "30",
@ -68,6 +67,131 @@
"resin_escape_diameter": "4",
"scale_factor": "1",
"show_debug_layers": "false"
},
"New set 3": {
"$fn": "64",
"OFFSET": "0.01",
"base_extra_thickness": "20",
"base_tickness": "8",
"build_fin": "false",
"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": "top",
"mold_piston_height": "10",
"mold_top_height": "5",
"parts": "all",
"piston_depth": "5",
"printable": "true",
"render_fin": "true",
"render_mold": "false",
"resin_escape_diameter": "4",
"scale_factor": "1",
"show_debug_layers": "false"
},
"New set 4": {
"$fn": "64",
"OFFSET": "0.01",
"base_extra_thickness": "20",
"base_tickness": "8",
"build_fin": "false",
"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": "all",
"mold_piston_height": "10",
"mold_top_height": "5",
"parts": "all",
"piston_depth": "5",
"printable": "true",
"render_fin": "false",
"render_mold": "false",
"resin_escape_diameter": "4",
"scale_factor": "1",
"show_debug_layers": "false"
},
"New set 5": {
"$fn": "64",
"CLEARING": "0.10000000000000001",
"OFFSET": "0.01",
"base_extra_thickness": "20",
"base_tickness": "8",
"build_fin": "false",
"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": "all",
"mold_piston_height": "10",
"mold_top_height": "5",
"parts": "all",
"piston_depth": "5",
"printable": "true",
"render_drill_template": "true",
"render_fin": "false",
"render_mold": "false",
"resin_escape_diameter": "4",
"scale_factor": "1",
"show_debug_layers": "false"
}
}
}

View File

@ -10,6 +10,17 @@ include <DotScad/src/bend_extrude.scad>;
include <DotScad/src/ellipse_extrude.scad>;
include <DotScad/src/loft.scad>;
/**
* Kitesurf Fins mold
*
*
*
* Requirements :
* - The plunger normaly should be twice the height of the part
*
*/
/************************************************/
/* Parameters */
/************************************************/
@ -62,9 +73,6 @@ draw_profile = false;
// Draw Fin
build_fin = false;
// Build mold
build_mold = true;
/* [Mold] */
// Mold base height
@ -83,8 +91,13 @@ piston_depth = 5;
/* [Rendering] */
// Rendering parts
render_fin = false;
render_mold = true;
render_drill_template = true;
parts = "all"; // [all, top, bottom]
mold_part = "all"; // [all, top, bottom]
// Scaling
scale_factor = 1.0; // [0.1:0.1:2]
@ -92,9 +105,6 @@ scale_factor = 1.0; // [0.1:0.1:2]
// Printable rendering
printable = true;
// Rendering mold
//render_mold = true;
$fn=64;
@ -102,9 +112,9 @@ $fn=64;
/* Constants */
/*************/
// Define the offset value as a constant
OFFSET = 0.01;
CLEARING = 0.1;
/************************************************/
/* Derived variable */
@ -119,14 +129,12 @@ drilling_length = mold_base_height+mold_piston_height+2*OFFSET;
pt1_x = adj_ang_to_opp(fin_height,fin_sweep)+fin_base/2;
pt1_y = fin_height;
//back_point = [fin_width-7,fin_height/2];
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 */
/******************/
@ -170,57 +178,21 @@ counter_edge_point = [fin_width-6,fin_height-8];
profile_path = translate_path( asCurve(profile_points),-fin_width/2 );
function asCurve(points) = bezier_curve(points/*,N=3*/,splinesteps=128);
function handle(point,angle,strength) = [
//point[0] + adj_ang_to_opp(strength,angle) /** xAngleFactor(angle)*/,
//point[1] + /*(angle>0 ? strength :-strength)*/ strength * yAngleFactor(angle),
point[0] + polar_to_xy(strength,angle)[0] ,
point[1] + polar_to_xy(strength,angle)[1]
];
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 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)=
angle < 90 ?
[fin_base + adj_ang_to_opp(fin_end_strength,90-angle),fin_end_strength]
:
[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 decrease_y(points, percentage) = [ for (p = points) [p[0], p[1] * (1 - percentage/100)]];
function pathProfile(points) = bezpath_curve(points,N=3);
// Surf Fin profile
fin_profile = pathProfile( profile_points );
function expandPath(path,delta) =
offset(
deduplicate(path),
delta=delta,
chamfer=false,
same_length=true
)
;
// *****************
// * Fin Drawing *
// *****************
if (build_fin) {
scale([scale_factor, scale_factor, scale_factor]) buildFin();
if ( render_fin ) {
scale([scale_factor, scale_factor, scale_factor])
buildFin( fin_thickness );
}
if (build_mold) {
buildMold();
}
/**
* Render Mold
*/
if ( render_mold ) buildMold();
if ( render_drill_template ) buildDrillTemplate();
/**
* Build mold
@ -228,29 +200,27 @@ if (build_mold) {
*/
module buildMold() {
// Bottom mold
if (mold_part != "top")
difference() {
case(mold_base_height,true);
// Piston
down(piston_depth-OFFSET) fwd(20) bottomInsert();
}
// Top Mold
if (mold_part != "bottom")
up(printable ? 0 : 60) fwd(printable ? fin_height+50 : 0) down(mold_base_height) mirror([0,0,printable ? 1 : 0 ]) {
difference() {
union() {
// case
case(mold_top_height,false);
// Piston
mirror([1,0,0])
down(mold_top_height+piston_depth-OFFSET) fwd(20) topPiston();
};
resin_escape(40);
};
};
}
}
}
/**
@ -259,34 +229,6 @@ module buildMold() {
* @param height - Height of the case
* @param bottom - Is bottom or top
*/
module case_old(height,bottom=true) {
diff() cuboid( [ mold_length, mold_width, height ],
rounding=4,
edges=[bottom ? BOTTOM: TOP],
anchor=TOP ){
// Drills
align(BOTTOM,[FRONT+LEFT,FRONT+RIGHT,BACK+LEFT,BACK+RIGHT],inset=10,overlap=-OFFSET)
color("orange")
tag("remove")
drilling();
// Material holes
/*
align(TOP,[CENTER+BACK+LEFT],inside=true,inset=15,overlap=-OFFSET)
color("Red") wedge([mold_height+2*OFFSET, 50, 30], center=true,orient=FRONT,spin=-90 );
*/
// Material holes
align(TOP,[CENTER+BACK+LEFT]/*,inside=true*/,inset=15,overlap=-OFFSET)
color("Red")
up(OFFSET)
tag("remove")
rounded_triangle(radius=3, height=height+2*OFFSET);
}
}
module case( height , bottom=true ) {
difference() {
diff() cuboid( [ mold_length, mold_width, height ],
@ -298,41 +240,71 @@ module case(height,bottom=true) {
color("orange")
tag("remove")
drilling();
// Material holes
/*
align(TOP,[CENTER+BACK+LEFT],inside=true,inset=15,overlap=-OFFSET)
color("Red") wedge([mold_height+2*OFFSET, 50, 30], center=true,orient=FRONT,spin=-90 );
*/
};
// Material holes
mirror([bottom ? 0:1,0,0])
back(38) left(55)
color("Red")
up(OFFSET)
//tag("remove")
rounded_triangle(radius=3, height=height+2*OFFSET);
// Length hole
fwd(32) cuboid([120,10,50],rounding=5);
// Side holes
left(67) cuboid([10,40,50],rounding=5);
right(67) cuboid([10,40,50],rounding=5);
}
}
/**
* Drill template
*
*/
module buildDrillTemplate() {
spacing = 38.5;
drill_depth = 15;
drill_diameter = 6;
template_height = 5;
p1 = 20;
p2 = p1-spacing;
mirror([0,0,printable ? 1 : 0]) difference() {
left(1) color ("Orange") cuboid([fin_width+7,15,10],rounding=3);
down(OFFSET) {
hull(){
left(28) cylinder(h=template_height+2*OFFSET,r=drill_diameter/2);
left(55) cylinder(h=template_height+2*OFFSET,r=drill_diameter/2);
}
hull(){
left(12) cylinder(h=template_height+2*OFFSET,r=drill_diameter/2);
left(-10) cylinder(h=template_height+2*OFFSET,r=drill_diameter/2);
}
hull(){
left(-27) cylinder(h=template_height+2*OFFSET,r=drill_diameter/2);
left(-53) cylinder(h=template_height+2*OFFSET,r=drill_diameter/2);
}
}
xrot(-90) buildFin(fin_thickness + 2*CLEARING );
//left(60) cylinder(h=20,r=6/2);
up(template_height+OFFSET)
{
left(p1)
cylinder(h=drill_depth+template_height,r=drill_diameter/2,orient=DOWN);
left(p2)
cylinder(h=drill_depth,r=drill_diameter/2,orient=DOWN);
}
}
}
module rounded_triangle(radius, height) {
triangle_points = [[0, 0], [75, 0], [0, -35]]; // Equilateral triangle with side length 100
// Round the corners of the triangle
rounded_shape = round_corners( triangle_points, r=radius );
// Extrude the 2D rounded triangle
//mirror([0,0,1]) linear_extrude(height = height) polygon(rounded_shape);
mirror([0,0,1]) linear_extrude(height = height) polygon(rounded_shape);
//mirror([0,0,1]) linear_extrude(height = height) polygon(round_corners(right_triangle([40,30]),r=radius));
//mirror([0,0,1]) linear_extrude(height = height) polygon(right_triangle([40,30]));
//mirror([0,0,1]) cyl(l=80, r=10); // Work with cylinder
}
@ -364,17 +336,26 @@ module topPiston() {
}
}
/**
* Build fin
*
*/
module buildFin( thickness ) {
union() {
if (parts != "bottom") buildFinSide( thickness );
if (parts != "top") buildFinSide( thickness , true );
}
}
/**
* Build fin side
*
* @param flip - Define it it is top or bottom fin side
*/
module buildFinSide(flip=false) {
debug=false;
module buildFinSide(thickness,flip=false) {
mirror([0,0,flip ? 1 : 0])
color(flip ? "Gray" : "LightGray") /*up(fin_thickness/4)*/ /*down(fin_thickness) */
ellipse_extrude( fin_thickness/2*(debug?1.2:1))
ellipse_extrude( thickness / 2 )
polygon(profile_path);
}
@ -386,9 +367,6 @@ module resin_escape(length) {
// * 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(
@ -402,56 +380,13 @@ orient(DOWN)
}
//drilling();
module buildFin() {
if (false)
union(){
difference(){
union() {
if (parts != "bottom")
//buildFinSide([layer_0,layer_1,layer_2],fin_thickness/2);
buildFinSide();
if (parts != "top")
buildFinSide(true);
//zflip()
// buildFinSide([layer_0,layer_1,layer_2],fin_thickness/2);
}
color("Red") cube([fin_base+20,base_extra_thickness+20,base_tickness+20],anchor=LEFT+BACK);
}
}
}
module subtracted(anchor) {
color("Red") fwd(40) left(40) cube([fin_width+100,fin_height+100,20],anchor=anchor);
}
if (show_debug_layers) {
left(130) {
showDebugPath(layer_0);
showDebugPath(layer_1);
showDebugPath(layer_2);
assert(is_path(layer_3),"Layer 3 is not a path");
showDebugPath(layer_3);
//showDebugPath(layer_4);
}
left(230)
showDebugPath(vertical_profile);
//showDebugPath(layer_3);
}
if (draw_profile) {
// Draw fin profile
drawProfile( profile_points, true );
}
if (draw_profile) drawProfile( profile_points, true );
/**
@ -523,11 +458,48 @@ module print_path_points(path) {
echo ("**********************");
echo ("* Configuration *");
echo ("**********************");
//echo ("Layers count" ,len(layers));
echo ("Base thickness" ,str(base_tickness," mm"));
function asCurve(points) = bezier_curve(points/*,N=3*/,splinesteps=128);
function handle(point,angle,strength) = [
//point[0] + adj_ang_to_opp(strength,angle) /** xAngleFactor(angle)*/,
//point[1] + /*(angle>0 ? strength :-strength)*/ strength * yAngleFactor(angle),
point[0] + polar_to_xy(strength,angle)[0] ,
point[1] + polar_to_xy(strength,angle)[1]
];
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 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)=
angle < 90 ?
[fin_base + adj_ang_to_opp(fin_end_strength,90-angle),fin_end_strength]
:
[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 decrease_y(points, percentage) = [ for (p = points) [p[0], p[1] * (1 - percentage/100)]];
function pathProfile(points) = bezpath_curve(points,N=3);
// Surf Fin profile
fin_profile = pathProfile( profile_points );
function expandPath(path,delta) =
offset(
deduplicate(path),
delta=delta,
chamfer=false,
same_length=true
)
;

View File

@ -17,5 +17,41 @@ The box is designed using library [Fin Base](https://github.com/hrobeers/finbase
![](./res/Kitesurf-Fins-Bottom.png)
![](./res/Kitesurf-Fins-Top.png)
[Understanding Kitesruf fins](https://24-7boardsports.com/understanding-kitesurf-twintip-board-fins/)
## Measure models
Open web app [at](https://0x00019913.github.io/meshy/) and import it to get the volume.
Volume is 21037 mm3.
To convert 21037 cubic millimeters (mm³) to deciliters (dl), you can use the conversion factor that 1 deciliter equals 100000 cubic millimeters.
Therefore, 21037 cubic millimeters is equivalent to 0.21dl.
## Required Material
- Durcisseur : Correspondant à la résine choisie.
- Fibre de verre :
Tissus de fibre de verre : Différents grammages, comme le roving (tissé) pour la solidité et le mat pour l'imprégnation.
- Fibre de carbone :
Tissus de fibre de carbone : Pour des pièces plus légères et très résistantes.
- Résine époxy : Choisissez selon les propriétés mécaniques et la température de travail. Il est préférable d'utiliser une résine époxy de bonne qualité pour des pièces finies robustes.
- Wax (Vonixx Carnauba Plus) R$ 30
![](./res/products/vonixx_carnauba_plus.webp)
## Required Tools
- Gants et masques : Pour la sécurité, car les résines époxy sont toxiques.
- Scellants et cires de démoulage : Pour faciliter le démoulage et éviter que les pièces ne collent au moule.
- Ciseaux ou coupe-couteau : Pour découper les tissus de fibre.
- Pinceaux ou rouleaux : Pour appliquer la résine.
- Système de dégazage : Optionnel, pour éliminer les bulles d'air dans la résine, améliorant la qualité du composite.
- Seringue

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

BIN
stl/Kitesurf-Fin.stl Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
stl/Kitesurf-Fins-Top.stl Normal file

Binary file not shown.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff