123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138 |
- /*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("<font color='red'><b>mauvais diamètre pour la vis métrique</b></font>");
- }
- }
- 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);
- }
|