PauseAtHeight.py 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. from ..Script import Script
  2. # from cura.Settings.ExtruderManager import ExtruderManager
  3. class PauseAtHeight(Script):
  4. def __init__(self):
  5. super().__init__()
  6. def getSettingDataString(self):
  7. return """{
  8. "name":"Pause at height",
  9. "key": "PauseAtHeight",
  10. "metadata": {},
  11. "version": 2,
  12. "settings":
  13. {
  14. "pause_height":
  15. {
  16. "label": "Pause Height",
  17. "description": "At what height should the pause occur",
  18. "unit": "mm",
  19. "type": "float",
  20. "default_value": 5.0
  21. },
  22. "head_park_x":
  23. {
  24. "label": "Park Print Head X",
  25. "description": "What X location does the head move to when pausing.",
  26. "unit": "mm",
  27. "type": "float",
  28. "default_value": 190
  29. },
  30. "head_park_y":
  31. {
  32. "label": "Park Print Head Y",
  33. "description": "What Y location does the head move to when pausing.",
  34. "unit": "mm",
  35. "type": "float",
  36. "default_value": 190
  37. },
  38. "retraction_amount":
  39. {
  40. "label": "Retraction",
  41. "description": "How much filament must be retracted at pause.",
  42. "unit": "mm",
  43. "type": "float",
  44. "default_value": 0
  45. },
  46. "retraction_speed":
  47. {
  48. "label": "Retraction Speed",
  49. "description": "How fast to retract the filament.",
  50. "unit": "mm/s",
  51. "type": "float",
  52. "default_value": 25
  53. },
  54. "extrude_amount":
  55. {
  56. "label": "Extrude Amount",
  57. "description": "How much filament should be extruded after pause. This is needed when doing a material change on Ultimaker2's to compensate for the retraction after the change. In that case 128+ is recommended.",
  58. "unit": "mm",
  59. "type": "float",
  60. "default_value": 0
  61. },
  62. "extrude_speed":
  63. {
  64. "label": "Extrude Speed",
  65. "description": "How fast to extrude the material after pause.",
  66. "unit": "mm/s",
  67. "type": "float",
  68. "default_value": 3.3333
  69. },
  70. "redo_layers":
  71. {
  72. "label": "Redo Layers",
  73. "description": "Redo a number of previous layers after a pause to increases adhesion.",
  74. "unit": "layers",
  75. "type": "int",
  76. "default_value": 0
  77. },
  78. "standby_temperature":
  79. {
  80. "label": "Standby Temperature",
  81. "description": "Change the temperature during the pause",
  82. "unit": "°C",
  83. "type": "int",
  84. "default_value": 0
  85. },
  86. "resume_temperature":
  87. {
  88. "label": "Resume Temperature",
  89. "description": "Change the temperature after the pause",
  90. "unit": "°C",
  91. "type": "int",
  92. "default_value": 0
  93. }
  94. }
  95. }"""
  96. def execute(self, data: list):
  97. """data is a list. Each index contains a layer"""
  98. x = 0.
  99. y = 0.
  100. current_z = 0.
  101. pause_height = self.getSettingValueByKey("pause_height")
  102. retraction_amount = self.getSettingValueByKey("retraction_amount")
  103. retraction_speed = self.getSettingValueByKey("retraction_speed")
  104. extrude_amount = self.getSettingValueByKey("extrude_amount")
  105. extrude_speed = self.getSettingValueByKey("extrude_speed")
  106. park_x = self.getSettingValueByKey("head_park_x")
  107. park_y = self.getSettingValueByKey("head_park_y")
  108. layers_started = False
  109. redo_layers = self.getSettingValueByKey("redo_layers")
  110. standby_temperature = self.getSettingValueByKey("standby_temperature")
  111. resume_temperature = self.getSettingValueByKey("resume_temperature")
  112. # T = ExtruderManager.getInstance().getActiveExtruderStack().getProperty("material_print_temperature", "value")
  113. # with open("out.txt", "w") as f:
  114. # f.write(T)
  115. # use offset to calculate the current height: <current_height> = <current_z> - <layer_0_z>
  116. layer_0_z = 0.
  117. got_first_g_cmd_on_layer_0 = False
  118. for layer in data:
  119. lines = layer.split("\n")
  120. for line in lines:
  121. if ";LAYER:0" in line:
  122. layers_started = True
  123. continue
  124. if not layers_started:
  125. continue
  126. if self.getValue(line, 'G') == 1 or self.getValue(line, 'G') == 0:
  127. current_z = self.getValue(line, 'Z')
  128. if not got_first_g_cmd_on_layer_0:
  129. layer_0_z = current_z
  130. got_first_g_cmd_on_layer_0 = True
  131. x = self.getValue(line, 'X', x)
  132. y = self.getValue(line, 'Y', y)
  133. if current_z is not None:
  134. current_height = current_z - layer_0_z
  135. if current_height >= pause_height:
  136. index = data.index(layer)
  137. prevLayer = data[index - 1]
  138. prevLines = prevLayer.split("\n")
  139. current_e = 0.
  140. for prevLine in reversed(prevLines):
  141. current_e = self.getValue(prevLine, 'E', -1)
  142. if current_e >= 0:
  143. break
  144. # include a number of previous layers
  145. for i in range(1, redo_layers + 1):
  146. prevLayer = data[index - i]
  147. layer = prevLayer + layer
  148. prepend_gcode = ";TYPE:CUSTOM\n"
  149. prepend_gcode += ";added code by post processing\n"
  150. prepend_gcode += ";script: PauseAtHeight.py\n"
  151. prepend_gcode += ";current z: %f \n" % current_z
  152. prepend_gcode += ";current height: %f \n" % current_height
  153. # Retraction
  154. prepend_gcode += "M83\n"
  155. if retraction_amount != 0:
  156. prepend_gcode += "G1 E-%f F%f\n" % (retraction_amount, retraction_speed * 60)
  157. # Move the head away
  158. prepend_gcode += "G1 Z%f F300\n" % (current_z + 1)
  159. prepend_gcode += "G1 X%f Y%f F9000\n" % (park_x, park_y)
  160. if current_z < 15:
  161. prepend_gcode += "G1 Z15 F300\n"
  162. # Disable the E steppers
  163. prepend_gcode += "M84 E0\n"
  164. # Set extruder standby temperature
  165. prepend_gcode += "M104 S%i; standby temperature\n" % (standby_temperature)
  166. # Wait till the user continues printing
  167. prepend_gcode += "M0 ;Do the actual pause\n"
  168. # Set extruder resume temperature
  169. prepend_gcode += "M109 S%i; resume temperature\n" % (resume_temperature)
  170. # Push the filament back,
  171. if retraction_amount != 0:
  172. prepend_gcode += "G1 E%f F%f\n" % (retraction_amount, retraction_speed * 60)
  173. # Optionally extrude material
  174. if extrude_amount != 0:
  175. prepend_gcode += "G1 E%f F%f\n" % (extrude_amount, extrude_speed * 60)
  176. # and retract again, the properly primes the nozzle
  177. # when changing filament.
  178. if retraction_amount != 0:
  179. prepend_gcode += "G1 E-%f F%f\n" % (retraction_amount, retraction_speed * 60)
  180. # Move the head back
  181. prepend_gcode += "G1 Z%f F300\n" % (current_z + 1)
  182. prepend_gcode += "G1 X%f Y%f F9000\n" % (x, y)
  183. if retraction_amount != 0:
  184. prepend_gcode += "G1 E%f F%f\n" % (retraction_amount, retraction_speed * 60)
  185. prepend_gcode += "G1 F9000\n"
  186. prepend_gcode += "M82\n"
  187. # reset extrude value to pre pause value
  188. prepend_gcode += "G92 E%f\n" % (current_e)
  189. layer = prepend_gcode + layer
  190. # Override the data of this layer with the
  191. # modified data
  192. data[index] = layer
  193. return data
  194. break
  195. return data