vis.scad 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  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])
  30. (i*pas/360 - pas) > 0 ?
  31. (i*pas/360 - pas) > haut ?
  32. [ d1*cos(i)/2, d1*sin(i)/2, haut ] : //si Za > haut
  33. [ d1*cos(i)/2, d1*sin(i)/2, i*pas/360 - pas ] : //si 0 < Za < haut
  34. [ d1*cos(i)/2, d1*sin(i)/2, 0 ] ]; //si Za < 0
  35. B = [ for(i=[0 : precision : angle])
  36. (i*pas/360 - pas + AB + BC) > 0 ?
  37. (i*pas/360 - pas + AB) > 0 ?
  38. (i*pas/360 - pas + AB) > haut ?
  39. [ d1*cos(i)/2, d1*sin(i)/2, haut ] :
  40. [ d2*cos(i)/2, d2*sin(i)/2, i*pas/360 - pas + AB ] :
  41. [ d2*cos(i)/2, d2*sin(i)/2, 0 ] :
  42. [ d1*cos(i)/2, d1*sin(i)/2, 0 ] ];
  43. C = [ for(i=[0 : precision : angle]) (i*pas/360 - pas + AB + BC) > 0 ?
  44. (i*pas/360 - pas + AB) > haut ?
  45. [ d1*cos(i)/2, d1*sin(i)/2, haut] :
  46. (i*pas/360 - pas + AB + BC) > haut ?
  47. [ d2*cos(i)/2, d2*sin(i)/2, haut] :
  48. [ d2*cos(i)/2, d2*sin(i)/2, i*pas/360 - pas + AB + BC] :
  49. [ d1*cos(i)/2, d1*sin(i)/2, 0] ];
  50. D = [ for(i=[0 : precision : angle]) (i*pas/360 - pas + AB + BC + AB) > 0 ?
  51. (i*pas/360 - pas + AB + BC + AB) > haut ?
  52. [ d1*cos(i)/2, d1*sin(i)/2, haut] :
  53. [ d1*cos(i)/2, d1*sin(i)/2, i*pas/360 - pas + AB + BC + AB] :
  54. [ d1*cos(i)/2, d1*sin(i)/2, 0] ];
  55. points = concat(A, B, C, D, [[0, 0, 0]], [[0, 0, haut]]);
  56. longueur = len(A);
  57. index_A = 0;
  58. index_B = longueur;
  59. index_C = index_B + longueur;
  60. index_D = index_C + longueur;
  61. index_O = index_D + longueur;
  62. index_Oh = index_O + 1;
  63. faces_inferieurs1 = [ for(i=[0:longueur - 2]) [ index_A + i, index_B + i, index_A + 1 + i ] ];
  64. faces_inferieurs2 = [ for(i=[0:longueur - 2]) [ index_B + i, index_B + 1 + i, index_A + 1 + i ] ];
  65. faces_exterieurs1 = [ for(i=[0:longueur - 2]) [ index_B + 1+ i, index_B + i, index_C + i ] ];
  66. faces_exterieurs2 = [ for(i=[0:longueur - 2]) [ index_C + i, index_C + 1 + i, index_B + 1 + i ] ];
  67. faces_superieurs1 = [ for(i=[0:longueur - 2]) [ index_C + 1 + i, index_C + i, index_D + i ] ];
  68. faces_superieurs2 = [ for(i=[0:longueur - 2]) [ index_D + i, index_D + 1 + i, index_C + 1 + i ] ];
  69. faces_interieurs1 = [ for(i=[0:longueur - 2 - 360/precision]) [ index_D + i, index_A + 360/precision + i, index_D + 1 + i ] ];
  70. faces_interieurs2 = [ for(i=[0:longueur - 2 - 360/precision]) [ index_A + 360/precision + i, index_A + 360/precision + 1 + i, index_D + 1 + i ] ];
  71. /*!!!!! ATTENTION !!!!!
  72. pour éviter l'erreur : Object may not be a valid 2-manifold and may need repair!
  73. il faut que les points utilisés pour les disques aient été utilisés dans les autres faces.
  74. */
  75. faces_disque_inferieur = [ for(i=[0 : 360/precision - 1]) [ index_A + i, index_A + 1 + i, index_O ] ];
  76. 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 ] ];
  77. face_fermeture_basse = [ [index_O, index_A + 360/precision, index_D, index_C, index_B, index_A] ];
  78. 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] ];
  79. faces = concat( faces_inferieurs1, faces_inferieurs2,
  80. faces_exterieurs1, faces_exterieurs2,
  81. faces_superieurs1, faces_superieurs2,
  82. faces_interieurs1, faces_interieurs2,
  83. faces_disque_inferieur, faces_disque_superieur,
  84. face_fermeture_basse, face_fermeture_haute
  85. );
  86. polyhedron(points, faces);
  87. }
  88. module vis_metrique(d = 4, haut = 10, precision = 5, diam_buse = 0.4)
  89. {
  90. // 0 1 2 3 4 5 6 7 8 9
  91. pas_metrique = [ -1.0, 0.25, 0.40, 0.50, 0.70, 0.80, 1.00, -1.0, 1.25, -1.0,
  92. 1.50, -1.0, 1.75, -1.0, 2.00, -1.0, 2.00, -1.0, 2.50, -1.0,
  93. 2.50];
  94. H = 0.866*pas_metrique[d];
  95. d1 = d - 1.0825*pas_metrique[d];
  96. if(pas_metrique[d] != -1)
  97. {
  98. 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);
  99. }
  100. else
  101. {
  102. echo("<font color='red'><b>mauvais diamètre pour la vis métrique</b></font>");
  103. }
  104. }
  105. module vis_sans_fin(m = 1, alpha = 20, diam = 15, haut = 10, precision = 5, diam_buse = 0.4)
  106. {
  107. //hauteur d'une dent
  108. hf = m <= 1.25 ? 1.4*m : 1.25*m;
  109. ha = m;
  110. h = hf + ha;
  111. p = m*PI;
  112. largeur_base = 2*hf*tan(alpha) + p/2;
  113. largeur_crete = largeur_base - 2*h*tan(alpha);
  114. 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);
  115. }