PauseAtHeightforRepetier.py 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. from UM.Logger import Logger
  2. from ..Script import Script
  3. class PauseAtHeightforRepetier(Script):
  4. def __init__(self):
  5. super().__init__()
  6. def getSettingDataString(self):
  7. return """{
  8. "name":"Pause at height for repetier",
  9. "key": "PauseAtHeightforRepetier",
  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": 5.0
  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": 5.0
  37. },
  38. "head_move_Z":
  39. {
  40. "label": "Head move Z",
  41. "description": "The Hieght of Z-axis retraction before parking.",
  42. "unit": "mm",
  43. "type": "float",
  44. "default_value": 15.0
  45. },
  46. "retraction_amount":
  47. {
  48. "label": "Retraction",
  49. "description": "How much fillament must be retracted at pause.",
  50. "unit": "mm",
  51. "type": "float",
  52. "default_value": 5.0
  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": 90.0
  61. },
  62. "redo_layers":
  63. {
  64. "label": "Redo layers",
  65. "description": "Redo a number of previous layers after a pause to increases adhesion.",
  66. "unit": "layers",
  67. "type": "int",
  68. "default_value": 0
  69. }
  70. }
  71. }"""
  72. def execute(self, data):
  73. x = 0.
  74. y = 0.
  75. current_extrusion_f = 0
  76. current_z = 0.
  77. pause_z = self.getSettingValueByKey("pause_height")
  78. retraction_amount = self.getSettingValueByKey("retraction_amount")
  79. extrude_amount = self.getSettingValueByKey("extrude_amount")
  80. park_x = self.getSettingValueByKey("head_park_x")
  81. park_y = self.getSettingValueByKey("head_park_y")
  82. move_Z = self.getSettingValueByKey("head_move_Z")
  83. layers_started = False
  84. redo_layers = self.getSettingValueByKey("redo_layers")
  85. for layer in data:
  86. lines = layer.split("\n")
  87. for line in lines:
  88. if ";LAYER:0" in line:
  89. layers_started = True
  90. continue
  91. if not layers_started:
  92. continue
  93. if self.getValue(line, 'G') == 1 or self.getValue(line, 'G') == 0:
  94. current_z = self.getValue(line, 'Z')
  95. if self.getValue(line, 'F') is not None and self.getValue(line, 'E') is not None:
  96. current_extrusion_f = self.getValue(line, 'F', current_extrusion_f)
  97. x = self.getValue(line, 'X', x)
  98. y = self.getValue(line, 'Y', y)
  99. if current_z is not None:
  100. if current_z >= pause_z:
  101. index = data.index(layer)
  102. prevLayer = data[index-1]
  103. prevLines = prevLayer.split("\n")
  104. current_e = 0.
  105. for prevLine in reversed(prevLines):
  106. current_e = self.getValue(prevLine, 'E', -1)
  107. if current_e >= 0:
  108. break
  109. prepend_gcode = ";TYPE:CUSTOM\n"
  110. prepend_gcode += ";added code by post processing\n"
  111. prepend_gcode += ";script: PauseAtHeightforRepetier.py\n"
  112. prepend_gcode += ";current z: %f \n" % (current_z)
  113. prepend_gcode += ";current X: %f \n" % (x)
  114. prepend_gcode += ";current Y: %f \n" % (y)
  115. #Retraction
  116. prepend_gcode += "M83\n"
  117. if retraction_amount != 0:
  118. prepend_gcode += "G1 E-%f F6000\n" % (retraction_amount)
  119. #Move the head away
  120. prepend_gcode += "G1 Z%f F300\n" % (1 + current_z)
  121. prepend_gcode += "G1 X%f Y%f F9000\n" % (park_x, park_y)
  122. if current_z < move_Z:
  123. prepend_gcode += "G1 Z%f F300\n" % (current_z + move_Z)
  124. #Disable the E steppers
  125. prepend_gcode += "M84 E0\n"
  126. #Wait till the user continues printing
  127. prepend_gcode += "@pause now change filament and press continue printing ;Do the actual pause\n"
  128. #Push the filament back,
  129. if retraction_amount != 0:
  130. prepend_gcode += "G1 E%f F6000\n" % (retraction_amount)
  131. # Optionally extrude material
  132. if extrude_amount != 0:
  133. prepend_gcode += "G1 E%f F200\n" % (extrude_amount)
  134. prepend_gcode += "@info wait for cleaning nozzle from previous filament\n"
  135. prepend_gcode += "@pause remove the waste filament from parking area and press continue printing\n"
  136. # and retract again, the properly primes the nozzle when changing filament.
  137. if retraction_amount != 0:
  138. prepend_gcode += "G1 E-%f F6000\n" % (retraction_amount)
  139. #Move the head back
  140. prepend_gcode += "G1 Z%f F300\n" % (1 + current_z)
  141. prepend_gcode +="G1 X%f Y%f F9000\n" % (x, y)
  142. if retraction_amount != 0:
  143. prepend_gcode +="G1 E%f F6000\n" % (retraction_amount)
  144. if current_extrusion_f != 0:
  145. prepend_gcode += self.putValue(G=1, F=current_extrusion_f) + " ; restore extrusion feedrate\n"
  146. else:
  147. Logger.log("w", "No previous feedrate found in gcode, feedrate for next layer(s) might be incorrect")
  148. prepend_gcode +="M82\n"
  149. # reset extrude value to pre pause value
  150. prepend_gcode +="G92 E%f\n" % (current_e)
  151. layer = prepend_gcode + layer
  152. # include a number of previous layers
  153. for i in range(1, redo_layers + 1):
  154. prevLayer = data[index-i]
  155. layer = prevLayer + layer
  156. data[index] = layer #Override the data of this layer with the modified data
  157. return data
  158. break
  159. return data