vis.scad 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. /*la variable pas contient les pas des vis métrique
  2. p[1] = pas d'une vis M1, p[2] = pas d'une vis M2 etc ...
  3. !!!!! ATTENTION !!!!!
  4. les vis M7 n'éxistent pas p[7] = -1
  5. idem pour 9, 11, 13, 15, 17 etc ...
  6. */
  7. /* profil de la vis
  8. B ___C B ___
  9. / \ /
  10. / \ /
  11. ____/ \____/
  12. A D A
  13. -----> +Z
  14. */
  15. //function limite_haute(i, p, h, k) = i*p/360 - p + k < h ? i*p/360 - p + k : h;
  16. //function hauteur( i, p, h, k) = i*p/360 - p + k < 0 ? 0 : limite_haute(i, p, h, k);
  17. module vis(diam_int = 4, diam_ext = 6, DA = 0.25, BC = 0.25, pas = 1, haut = 10, precision = 5, diam_buse = 0.4)
  18. {
  19. /*Lors de l'impression le centre de la buse se placera au bon endroit
  20. ce qui signifie qu'une erreur de la moitié du diamètre de la buse apparaitra à l'extérieur.
  21. */
  22. d1 = diam_int - diam_buse;
  23. d2 = diam_ext - diam_buse;
  24. //ajout de 2 tour pour avoir une coupe propre lors de la création de la vis
  25. nbr_tours = ceil(haut/pas) + 2;
  26. angle = nbr_tours * 360;
  27. //par symétrie AB = CD
  28. AB = pas/2 - BC/2 - DA/2;
  29. A = [ for(i=[0 : precision : angle]) [ d1*cos(i)/2, d1*sin(i)/2, i*pas/360 - pas ] ] ;
  30. B = [ for(i=[0 : precision : angle]) [ d2*cos(i)/2, d2*sin(i)/2, i*pas/360 - pas + AB ] ];
  31. C = [ for(i=[0 : precision : angle]) [ d2*cos(i)/2, d2*sin(i)/2, i*pas/360 - pas + AB + BC] ];
  32. D = [ for(i=[0 : precision : angle]) [ d1*cos(i)/2, d1*sin(i)/2, i*pas/360 - pas + AB + BC + AB] ];
  33. points = concat(A, B, C, D, [[0, 0, 0]], [[0, 0, nbr_tours * pas]]);
  34. longueur = len(A);
  35. index_A = 0;
  36. index_B = longueur;
  37. index_C = index_B + longueur;
  38. index_D = index_C + longueur;
  39. index_O = index_D + longueur;
  40. index_Oh = index_O + 1;
  41. faces_inferieurs1 = [ for(i=[0:longueur - 2]) [ index_A + i, index_B + i, index_A + 1 + i ] ];
  42. faces_inferieurs2 = [ for(i=[0:longueur - 2]) [ index_B + i, index_B + 1 + i, index_A + 1 + i ] ];
  43. faces_exterieurs1 = [ for(i=[0:longueur - 2]) [ index_B + 1+ i, index_B + i, index_C + i ] ];
  44. faces_exterieurs2 = [ for(i=[0:longueur - 2]) [ index_C + i, index_C + 1 + i, index_B + 1 + i ] ];
  45. faces_superieurs1 = [ for(i=[0:longueur - 2]) [ index_C + 1 + i, index_C + i, index_D + i ] ];
  46. faces_superieurs2 = [ for(i=[0:longueur - 2]) [ index_D + i, index_D + 1 + i, index_C + 1 + i ] ];
  47. faces_interieurs1 = [ for(i=[0:longueur - 2 - 360/precision]) [ index_D + i, index_A + 360/precision + i, index_D + 1 + i ] ];
  48. faces_interieurs2 = [ for(i=[0:longueur - 2 - 360/precision]) [ index_A + 360/precision + i, index_A + 360/precision + 1 + i, index_D + 1 + i ] ];
  49. /*!!!!! ATTENTION !!!!!
  50. pour éviter l'erreur : Object may not be a valid 2-manifold and may need repair!
  51. il faut que les points utilisés pour les disques aient été utilisés dans les autres faces.
  52. */
  53. faces_disque_inferieur = [ for(i=[0 : 360/precision - 1]) [ index_A + i, index_A + 1 + i, index_O ] ];
  54. 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 ] ];
  55. face_fermeture_basse = [ [index_O, index_A + 360/precision, index_D, index_C, index_B, index_A] ];
  56. 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] ];
  57. faces = concat( faces_inferieurs1, faces_inferieurs2,
  58. faces_exterieurs1, faces_exterieurs2,
  59. faces_superieurs1, faces_superieurs2,
  60. faces_interieurs1, faces_interieurs2,
  61. faces_disque_inferieur, faces_disque_superieur,
  62. face_fermeture_basse, face_fermeture_haute
  63. );
  64. difference()
  65. {
  66. polyhedron(points, faces);
  67. translate([0, 0, -pas])
  68. {cylinder(d = 2*d2, h = pas);}
  69. translate([0, 0, haut])
  70. {cylinder(d = 2*d2, h = 3*pas);}
  71. }
  72. }
  73. module vis_metrique(d = 4, haut = 10, precision = 5, diam_buse = 0.4)
  74. {
  75. // 0 1 2 3 4 5 6 7 8 9
  76. pas_metrique = [ -1.0, 0.25, 0.40, 0.50, 0.70, 0.80, 1.00, -1.0, 1.25, -1.0,
  77. 1.50, -1.0, 1.75, -1.0, 2.00, -1.0, 2.00, -1.0, 2.50, -1.0,
  78. 2.50];
  79. H = 0.866*pas_metrique[d];
  80. d1 = d - 1.0825*pas_metrique[d];
  81. if(pas_metrique[d] != -1)
  82. {
  83. 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);
  84. }
  85. else
  86. {
  87. echo("<font color='red'><b>mauvais diamètre pour la vis métrique</b></font>");
  88. }
  89. }
  90. module vis_sans_fin(m = 1, alpha = 20, diam = 15, haut = 10, precision = 5, diam_buse = 0.4)
  91. {
  92. //hauteur d'une dent
  93. hf = m <= 1.25 ? 1.4*m : 1.25*m;
  94. ha = m;
  95. h = hf + ha;
  96. p = m*PI;
  97. largeur_base = 2*hf*tan(alpha) + p/2;
  98. largeur_crete = largeur_base - 2*h*tan(alpha);
  99. 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);
  100. }