gcode2images.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. # by svsd_val
  4. # jabber : svsd_val@jabber.ru
  5. # mail to: svsdval@gmail.com
  6. import os
  7. import datetime
  8. import time
  9. import re
  10. import sys
  11. from PIL import Image , ImageDraw
  12. if len(sys.argv) > 1:
  13. path = sys.argv[1]
  14. if not os.path.exists('layers'):
  15. os.mkdir('layers');
  16. f = open(path, "r");
  17. n =0;
  18. # setup image resolution
  19. img_width=1440;
  20. img_height=2560;
  21. # get pixels in mm
  22. pw=img_height/120.96;
  23. # setup line width
  24. LW = 2;
  25. #
  26. img = Image.new('RGB', [img_width,img_height], 0)
  27. draw = ImageDraw.Draw(img)
  28. data = img.load()
  29. #
  30. lb=[0,0];
  31. le=(0,0);
  32. seg=[];
  33. currentLayerIdx = 0
  34. currentLayerZ = 0
  35. # first time prev command is empty
  36. prev= {
  37. "C":"-",
  38. "X":0.0,
  39. "Y":0.0,
  40. "Z":0.0,
  41. "F":0.0,
  42. "E":0.0,
  43. "T":0,
  44. "L":0 };
  45. def parse(l):
  46. global prev;
  47. global currentLayerIdx
  48. global currentLayerZ
  49. scmd = re.sub("\([^)]*\)", "", l.upper())
  50. ## then semicolons
  51. symidx = scmd.find(';')
  52. if symidx >= 0:
  53. scmd = scmd[0:symidx].strip()
  54. symidx = scmd.find('(')
  55. if symidx >= 0:
  56. scmd = scmd[0:symidx].strip();
  57. cmd= {
  58. "C":"-",
  59. "X":0.0,
  60. "Y":0.0,
  61. "Z":0.0,
  62. "F":0.0,
  63. "E":0.0,
  64. "T":0,
  65. "L":0 };
  66. # if scmd == "":
  67. # cmd["C"] = "-"
  68. # return cmd;
  69. array = scmd.split(" ");
  70. cmd["C"] = array[0];
  71. for i in range(1,len(array)):
  72. x=array[i];
  73. if len(x) < 1:
  74. continue;
  75. cmd[x[:1]] = float(x[1:]);
  76. cmdtype = "move"
  77. if ( (cmd["X"] == prev["X"]) and (cmd["Y"] == prev["Y"]) and (cmd["E"] != prev["E"]) ):
  78. cmdtype = "retract" if (cmd["E"] < prev["E"]) else "restore"
  79. if ( ( (cmd["X"] != prev["X"]) or (cmd["Y"] != prev["Y"]) ) and (cmd["E"] > prev["E"]) ):
  80. cmdtype = "extrude"
  81. if ( (cmd["Z"] > prev["Z"]) ):
  82. currentLayerZ = cmd["Z"]
  83. currentLayerIdx += 1
  84. print("currentLayerZ",currentLayerZ, " currentLayerIdx=",currentLayerIdx);
  85. # set cmdtype and layer index for command
  86. cmd["T"] = cmdtype
  87. cmd["L"] = currentLayerIdx;
  88. # save as last command, to combare with new command after...
  89. prev = cmd
  90. #print (cmd);
  91. return cmd;
  92. def seg2vec(seg):
  93. return [ int(seg["X"] * pw ), int(seg["Y"]* pw )];
  94. old_z=0;
  95. layer_idx=0;
  96. for l in f:
  97. cmd = parse(l);
  98. seg.append(cmd);
  99. #if cmd["C"] == "-":
  100. # continue;
  101. #print(cmd);
  102. if old_z != cmd["L"]:
  103. #
  104. print("Z", old_z)
  105. old_z = cmd["L"];
  106. #
  107. # check if we have segments to draw..
  108. empty=1;
  109. for i in range(len(seg)):
  110. if seg[i]["T"] == "extrude":
  111. empty=0;
  112. # if not, then
  113. if empty:
  114. print("skip.." , old_z)
  115. continue
  116. layer_idx+=1;
  117. # Create new image with black fill
  118. img = Image.new('RGB', [img_width,img_height], 0)
  119. draw = ImageDraw.Draw(img)
  120. lb= seg2vec(seg[0]);
  121. # Draw segments:
  122. for i in range(len(seg)):
  123. if seg[i]["T"] != "extrude":
  124. continue;
  125. if (i >0):
  126. lb=seg2vec(seg[i-1]);
  127. le=seg2vec(seg[i]);
  128. if lb[0] == 0 and lb[1] == 0 :
  129. lb=le;
  130. if le[0] == 0 and le[1] == 0 :
  131. le=lb;
  132. draw.line([ lb[0], lb[1], le[0],le[1] ], width=LW, fill="#FFFFFF");
  133. # generate image id
  134. si=str(layer_idx);
  135. while len(si) < 7:
  136. si="0"+si;
  137. s="layers/layer_"+si+".png"
  138. # save to file
  139. print("save layer to file:"+s);
  140. img.save(s);
  141. # and print we got a new layer
  142. print("New Layer");
  143. # remove all old not needed layer segments
  144. seg[:] = [];
  145. f.close();