/*la variable pas contient les pas des vis métrique p[1] = pas d'une vis M1, p[2] = pas d'une vis M2 etc ... !!!!! ATTENTION !!!!! les vis M7 n'éxistent pas p[7] = -1 idem pour 9, 11, 13, 15, 17 etc ... */ /* profil de la vis B ___C B ___ / \ / / \ / ____/ \____/ A D A -----> +Z */ //function limite_haute(i, p, h, k) = i*p/360 - p + k < h ? i*p/360 - p + k : h; //function hauteur( i, p, h, k) = i*p/360 - p + k < 0 ? 0 : limite_haute(i, p, h, k); module vis(diam_int = 4, diam_ext = 6, DA = 0.25, BC = 0.25, pas = 1, haut = 10, precision = 5, diam_buse = 0.4) { /*Lors de l'impression le centre de la buse se placera au bon endroit ce qui signifie qu'une erreur de la moitié du diamètre de la buse apparaitra à l'extérieur. */ d1 = diam_int - diam_buse; d2 = diam_ext - diam_buse; //ajout de 2 tour pour avoir une coupe propre lors de la création de la vis nbr_tours = ceil(haut/pas) + 2; angle = nbr_tours * 360; //par symétrie AB = CD AB = pas/2 - BC/2 - DA/2; A = [ for(i=[0 : precision : angle]) (i*pas/360 - pas) > 0 ? (i*pas/360 - pas) > haut ? [ d1*cos(i)/2, d1*sin(i)/2, haut ] : //si Za > haut [ d1*cos(i)/2, d1*sin(i)/2, i*pas/360 - pas ] : //si 0 < Za < haut [ d1*cos(i)/2, d1*sin(i)/2, 0 ] ]; //si Za < 0 B = [ for(i=[0 : precision : angle]) (i*pas/360 - pas + AB + BC) > 0 ? (i*pas/360 - pas + AB) > 0 ? (i*pas/360 - pas + AB) > haut ? [ d1*cos(i)/2, d1*sin(i)/2, haut ] : [ d2*cos(i)/2, d2*sin(i)/2, i*pas/360 - pas + AB ] : [ d2*cos(i)/2, d2*sin(i)/2, 0 ] : [ d1*cos(i)/2, d1*sin(i)/2, 0 ] ]; C = [ for(i=[0 : precision : angle]) (i*pas/360 - pas + AB + BC) > 0 ? (i*pas/360 - pas + AB) > haut ? [ d1*cos(i)/2, d1*sin(i)/2, haut] : (i*pas/360 - pas + AB + BC) > haut ? [ d2*cos(i)/2, d2*sin(i)/2, haut] : [ d2*cos(i)/2, d2*sin(i)/2, i*pas/360 - pas + AB + BC] : [ d1*cos(i)/2, d1*sin(i)/2, 0] ]; D = [ for(i=[0 : precision : angle]) (i*pas/360 - pas + AB + BC + AB) > 0 ? (i*pas/360 - pas + AB + BC + AB) > haut ? [ d1*cos(i)/2, d1*sin(i)/2, haut] : [ d1*cos(i)/2, d1*sin(i)/2, i*pas/360 - pas + AB + BC + AB] : [ d1*cos(i)/2, d1*sin(i)/2, 0] ]; points = concat(A, B, C, D, [[0, 0, 0]], [[0, 0, haut]]); longueur = len(A); index_A = 0; index_B = longueur; index_C = index_B + longueur; index_D = index_C + longueur; index_O = index_D + longueur; index_Oh = index_O + 1; faces_inferieurs1 = [ for(i=[0:longueur - 2]) [ index_A + i, index_B + i, index_A + 1 + i ] ]; faces_inferieurs2 = [ for(i=[0:longueur - 2]) [ index_B + i, index_B + 1 + i, index_A + 1 + i ] ]; faces_exterieurs1 = [ for(i=[0:longueur - 2]) [ index_B + 1+ i, index_B + i, index_C + i ] ]; faces_exterieurs2 = [ for(i=[0:longueur - 2]) [ index_C + i, index_C + 1 + i, index_B + 1 + i ] ]; faces_superieurs1 = [ for(i=[0:longueur - 2]) [ index_C + 1 + i, index_C + i, index_D + i ] ]; faces_superieurs2 = [ for(i=[0:longueur - 2]) [ index_D + i, index_D + 1 + i, index_C + 1 + i ] ]; faces_interieurs1 = [ for(i=[0:longueur - 2 - 360/precision]) [ index_D + i, index_A + 360/precision + i, index_D + 1 + i ] ]; faces_interieurs2 = [ for(i=[0:longueur - 2 - 360/precision]) [ index_A + 360/precision + i, index_A + 360/precision + 1 + i, index_D + 1 + i ] ]; /*!!!!! ATTENTION !!!!! pour éviter l'erreur : Object may not be a valid 2-manifold and may need repair! il faut que les points utilisés pour les disques aient été utilisés dans les autres faces. */ faces_disque_inferieur = [ for(i=[0 : 360/precision - 1]) [ index_A + i, index_A + 1 + i, index_O ] ]; faces_disque_superieur = [ for(i=[0 : 360/precision - 1]) [ index_D + len(D) - 360/precision + i, index_D + len(D) - 360/precision - 1 + i, index_Oh ] ]; face_fermeture_basse = [ [index_O, index_A + 360/precision, index_D, index_C, index_B, index_A] ]; face_fermeture_haute = [ [index_Oh, index_D + len(D) - 360/precision - 1, index_A + len(A) - 1, index_B + len(B) - 1, index_C + len(C) - 1, index_D + len(D) - 1] ]; faces = concat( faces_inferieurs1, faces_inferieurs2, faces_exterieurs1, faces_exterieurs2, faces_superieurs1, faces_superieurs2, faces_interieurs1, faces_interieurs2, faces_disque_inferieur, faces_disque_superieur, face_fermeture_basse, face_fermeture_haute ); polyhedron(points, faces); } module vis_metrique(d = 4, haut = 10, precision = 5, diam_buse = 0.4) { // 0 1 2 3 4 5 6 7 8 9 pas_metrique = [ -1.0, 0.25, 0.40, 0.50, 0.70, 0.80, 1.00, -1.0, 1.25, -1.0, 1.50, -1.0, 1.75, -1.0, 2.00, -1.0, 2.00, -1.0, 2.50, -1.0, 2.50]; H = 0.866*pas_metrique[d]; d1 = d - 1.0825*pas_metrique[d]; if(pas_metrique[d] != -1) { vis(diam_int = d1, diam_ext = d, DA = pas_metrique[d]/4, BC = pas_metrique[d]/8, pas = pas_metrique[d], haut = haut, precision = precision, diam_buse = diam_buse); } else { echo("mauvais diamètre pour la vis métrique"); } } module vis_sans_fin(m = 1, alpha = 20, diam = 15, haut = 10, precision = 5, diam_buse = 0.4) { //hauteur d'une dent hf = m <= 1.25 ? 1.4*m : 1.25*m; ha = m; h = hf + ha; p = m*PI; largeur_base = 2*hf*tan(alpha) + p/2; largeur_crete = largeur_base - 2*h*tan(alpha); vis(diam_int = diam, diam_ext = diam + 2*h, DA = p - largeur_base, BC = largeur_crete, pas = p, haut = haut, precision = precision, diam_buse = diam_buse); }