STLperso.py 2.6 KB

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