STL.py 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. from stl import mesh
  2. import numpy as np
  3. def lire_et_extraire_infos(nom_fichier):
  4. entiers = []
  5. tableau_float = []
  6. try:
  7. with open(nom_fichier, 'r') as fichier:
  8. lignes = fichier.readlines()
  9. for i in range(3):
  10. entiers.append(
  11. int(lignes[i].strip())) # Convertit en entier et supprime les espaces en début et fin de ligne
  12. quatrieme_ligne = lignes[3].strip('[]\n').split(',')
  13. tableau_float = [float(x) for x in quatrieme_ligne]
  14. return entiers, tableau_float
  15. except FileNotFoundError:
  16. print(f"Le fichier '{nom_fichier}' n'a pas été trouvé.")
  17. return None, None
  18. def transformeSTL(nom):
  19. nomDonne = nom + ".rcl"
  20. donne = lire_et_extraire_infos(nomDonne)
  21. deplacement_metres = donne[0][0]
  22. lenX = donne[0][1]
  23. lenY = donne[0][2]
  24. test = donne[1]
  25. facteur = deplacement_metres
  26. test = [nombre / facteur for nombre in test]
  27. mini = min(test) - 1
  28. test = [nombre - mini for nombre in test]
  29. vertices = np.zeros((lenX * lenY * 2, 3), dtype=float)
  30. y = 0
  31. for i in range(0, lenX):
  32. for j in range(0, lenY):
  33. vertices[y] = [i, j, 0]
  34. vertices[y + 1] = [i, j, test[i * lenY + j]]
  35. y = y + 2
  36. nb = (lenX * 2 - 2)
  37. faces1 = np.zeros((nb, 3), dtype=int)
  38. y = 0
  39. for i in range(0, lenX * 2 - 2, 2):
  40. faces1[y] = [i, i + 1, i + 2]
  41. faces1[y + 1] = [i + 1, i + 3, i + 2]
  42. y = y + 2
  43. nb = lenY * 2 - 2
  44. faces2 = np.zeros((nb, 3), dtype=int)
  45. y = 0
  46. for i in range(0, lenX * 2 * lenY - lenY * 2, lenX * 2):
  47. faces2[y] = [i, i + 1, i + lenX * 2]
  48. faces2[y + 1] = [i + 1, i + lenX * 2 + 1, i + lenX * 2]
  49. y = y + 2
  50. nb = (lenX * 2 - 2)
  51. Start3 = (lenX * 2 * lenY) - lenX * 2
  52. faces3 = np.zeros((nb, 3), dtype=int)
  53. y = 0
  54. for i in range(Start3, lenX * 2 - 2 + Start3, 2):
  55. faces3[y] = [i, i + 1, i + 2]
  56. faces3[y + 1] = [i + 1, i + 3, i + 2]
  57. y = y + 2
  58. nb = lenY * 2 - 2
  59. Start4 = lenX * 2 - 2
  60. faces4 = np.zeros((nb, 3), dtype=int)
  61. y = 0
  62. for i in range(Start4, lenX * 2 * lenY - lenY * 2 + Start4, lenX * 2):
  63. faces4[y] = [i, i + 1, i + lenX * 2]
  64. faces4[y + 1] = [i + 1, i + lenX * 2 + 1, i + lenX * 2]
  65. y = y + 2
  66. nb = 2
  67. faces5 = np.zeros((nb, 3), dtype=int)
  68. faces5[0] = [0, lenX * 2 - 2, (lenX * 2 * lenY) - lenX * 2]
  69. faces5[1] = [lenX * 2 - 2, lenX * lenY * 2 - 2, (lenX * 2 * lenY) - lenX * 2]
  70. nb = lenX * lenY * 2
  71. faces6 = np.zeros((nb, 3), dtype=int)
  72. y = 0
  73. for j in range(0, lenY - 1):
  74. for i in range(lenX * 2 * j + 1, lenX * 2 * j + lenX * 2 - 1, 2):
  75. faces6[y] = [i, i + 2, lenX * 2 + i]
  76. faces6[y + 1] = [i + 2, lenX * 2 + i + 2, lenX * 2 + i]
  77. y = y + 2
  78. faces = np.concatenate((faces1, faces2, faces3, faces4, faces5, faces6), axis=0)
  79. # Créez le maillage STL
  80. cube = mesh.Mesh(np.zeros(faces.shape[0], dtype=mesh.Mesh.dtype))
  81. for i, f in enumerate(faces):
  82. for j in range(3):
  83. cube.vectors[i][j] = vertices[f[j], :]
  84. # Sauvegardez le cube au format STL
  85. nomSTL = nom + ".stl"
  86. cube.save(nomSTL)