Browse Source

Merge branch 'bugfix_CURA-3604_print_adter_loading_gcode' of github.com:Ultimaker/Cura into 2.5

Jaime van Kessel 8 years ago
parent
commit
e2faaf56fd

+ 7 - 0
plugins/GCodeReader/GCodeReader.py

@@ -2,6 +2,7 @@
 # Cura is released under the terms of the AGPLv3 or higher.
 
 from UM.Application import Application
+from UM.Backend import Backend
 from UM.Job import Job
 from UM.Logger import Logger
 from UM.Math.AxisAlignedBox import AxisAlignedBox
@@ -335,6 +336,8 @@ class GCodeReader(MeshReader):
         gcode_list_decorator.setGCodeList(gcode_list)
         scene_node.addDecorator(gcode_list_decorator)
 
+        Application.getInstance().getController().getScene().gcode_list = gcode_list
+
         Logger.log("d", "Finished parsing %s" % file_name)
         self._message.hide()
 
@@ -356,4 +359,8 @@ class GCodeReader(MeshReader):
                 "Make sure the g-code is suitable for your printer and printer configuration before sending the file to it. The g-code representation may not be accurate."), lifetime=0)
             caution_message.show()
 
+        # The "save/print" button's state is bound to the backend state.
+        backend = Application.getInstance().getBackend()
+        backend.backendStateChange.emit(Backend.BackendState.Disabled)
+
         return scene_node

+ 16 - 4
plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py

@@ -624,7 +624,7 @@ class NetworkPrinterOutputDevice(PrinterOutputDevice):
         if print_information.materialLengths:
             # Check if print cores / materials are loaded at all. Any failure in these results in an Error.
             for index in range(0, self._num_extruders):
-                if print_information.materialLengths[index] != 0:
+                if index < len(print_information.materialLengths) and print_information.materialLengths[index] != 0:
                     if self._json_printer_state["heads"][0]["extruders"][index]["hotend"]["id"] == "":
                         Logger.log("e", "No cartridge loaded in slot %s, unable to start print", index + 1)
                         self._error_message = Message(
@@ -642,13 +642,13 @@ class NetworkPrinterOutputDevice(PrinterOutputDevice):
             for index in range(0, self._num_extruders):
                 # Check if there is enough material. Any failure in these results in a warning.
                 material_length = self._json_printer_state["heads"][0]["extruders"][index]["active_material"]["length_remaining"]
-                if material_length != -1 and print_information.materialLengths[index] > material_length:
+                if material_length != -1 and index < len(print_information.materialLengths) and print_information.materialLengths[index] > material_length:
                     Logger.log("w", "Printer reports that there is not enough material left for extruder %s. We need %s and the printer has %s", index + 1, print_information.materialLengths[index], material_length)
                     warnings.append(i18n_catalog.i18nc("@label", "Not enough material for spool {0}.").format(index+1))
 
                 # Check if the right cartridges are loaded. Any failure in these results in a warning.
                 extruder_manager = cura.Settings.ExtruderManager.ExtruderManager.getInstance()
-                if print_information.materialLengths[index] != 0:
+                if index < len(print_information.materialLengths) and print_information.materialLengths[index] != 0:
                     variant = extruder_manager.getExtruderStack(index).findContainer({"type": "variant"})
                     core_name = self._json_printer_state["heads"][0]["extruders"][index]["hotend"]["id"]
                     if variant:
@@ -790,13 +790,25 @@ class NetworkPrinterOutputDevice(PrinterOutputDevice):
             Logger.log("d", "Started sending g-code to remote printer.")
             self._compressing_print = True
             ## Mash the data into single string
+
+            max_chars_per_line = 1024*1024*2  # 2 MB
+
             byte_array_file_data = b""
+            batched_line = ""
             for line in self._gcode:
                 if not self._compressing_print:
                     self._progress_message.hide()
                     return  # Stop trying to zip, abort was called.
+
+                # if the gcode was read from a gcode file, self._gcode will be a list of all lines in that file.
+                # Compressing line by line in this case is extremely slow, so we need to batch them.
+                if len(batched_line) < max_chars_per_line:
+                    batched_line += line
+                    continue
+
                 if self._use_gzip:
-                    byte_array_file_data += gzip.compress(line.encode("utf-8"))
+                    byte_array_file_data += gzip.compress(batched_line.encode("utf-8"))
+                    batched_line = ""
                     QCoreApplication.processEvents()  # Ensure that the GUI does not freeze.
                     # Pretend that this is a response, as zipping might take a bit of time.
                     self._last_response_time = time()