|
@@ -0,0 +1,109 @@
|
|
|
+import base64
|
|
|
+
|
|
|
+from UM.Logger import Logger
|
|
|
+from cura.Snapshot import Snapshot
|
|
|
+from PyQt5.QtCore import QByteArray, QIODevice, QBuffer
|
|
|
+
|
|
|
+from ..Script import Script
|
|
|
+
|
|
|
+
|
|
|
+class CreateThumbnail(Script):
|
|
|
+ def __init__(self):
|
|
|
+ super().__init__()
|
|
|
+
|
|
|
+ def _createSnapshot(self, width, height):
|
|
|
+ Logger.log("d", "Creating thumbnail image...")
|
|
|
+ try:
|
|
|
+ return Snapshot.snapshot(width, height)
|
|
|
+ except Exception:
|
|
|
+ Logger.logException("w", "Failed to create snapshot image")
|
|
|
+
|
|
|
+ def _encodeSnapshot(self, snapshot):
|
|
|
+ Logger.log("d", "Encoding thumbnail image...")
|
|
|
+ try:
|
|
|
+ thumbnail_buffer = QBuffer()
|
|
|
+ thumbnail_buffer.open(QBuffer.ReadWrite)
|
|
|
+ thumbnail_image = snapshot
|
|
|
+ thumbnail_image.save(thumbnail_buffer, "PNG")
|
|
|
+ base64_bytes = base64.b64encode(thumbnail_buffer.data())
|
|
|
+ base64_message = base64_bytes.decode('ascii')
|
|
|
+ thumbnail_buffer.close()
|
|
|
+ return base64_message
|
|
|
+ except Exception:
|
|
|
+ Logger.logException("w", "Failed to encode snapshot image")
|
|
|
+
|
|
|
+ def _convertSnapshotToGcode(self, encoded_snapshot, width, height, chunk_size=78):
|
|
|
+ gcode = []
|
|
|
+
|
|
|
+ encoded_snapshot_length = len(encoded_snapshot)
|
|
|
+ gcode.append(";")
|
|
|
+ gcode.append("; thumbnail begin {} {} {}".format(
|
|
|
+ width, height, encoded_snapshot_length))
|
|
|
+
|
|
|
+ chunks = ["; {}".format(encoded_snapshot[i:i+chunk_size])
|
|
|
+ for i in range(0, len(encoded_snapshot), chunk_size)]
|
|
|
+ gcode.extend(chunks)
|
|
|
+
|
|
|
+ gcode.append("; thumbnail end")
|
|
|
+ gcode.append(";")
|
|
|
+ gcode.append("")
|
|
|
+
|
|
|
+ return gcode
|
|
|
+
|
|
|
+ def getSettingDataString(self):
|
|
|
+ return """{
|
|
|
+ "name": "Create Thumbnail",
|
|
|
+ "key": "CreateThumbnail",
|
|
|
+ "metadata": {},
|
|
|
+ "version": 2,
|
|
|
+ "settings":
|
|
|
+ {
|
|
|
+ "width":
|
|
|
+ {
|
|
|
+ "label": "Width",
|
|
|
+ "description": "Width of the generated thumbnail",
|
|
|
+ "unit": "px",
|
|
|
+ "type": "int",
|
|
|
+ "default_value": 32,
|
|
|
+ "minimum_value": "0",
|
|
|
+ "minimum_value_warning": "12",
|
|
|
+ "maximum_value_warning": "800"
|
|
|
+ },
|
|
|
+ "height":
|
|
|
+ {
|
|
|
+ "label": "Height",
|
|
|
+ "description": "Height of the generated thumbnail",
|
|
|
+ "unit": "px",
|
|
|
+ "type": "int",
|
|
|
+ "default_value": 32,
|
|
|
+ "minimum_value": "0",
|
|
|
+ "minimum_value_warning": "12",
|
|
|
+ "maximum_value_warning": "600"
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }"""
|
|
|
+
|
|
|
+ def execute(self, data):
|
|
|
+ width = self.getSettingValueByKey("width")
|
|
|
+ height = self.getSettingValueByKey("height")
|
|
|
+
|
|
|
+ snapshot = self._createSnapshot(width, height)
|
|
|
+ if snapshot:
|
|
|
+ encoded_snapshot = self._encodeSnapshot(snapshot)
|
|
|
+ snapshot_gcode = self._convertSnapshotToGcode(
|
|
|
+ encoded_snapshot, width, height)
|
|
|
+
|
|
|
+ for layer in data:
|
|
|
+ layer_index = data.index(layer)
|
|
|
+ lines = data[layer_index].split("\n")
|
|
|
+ for line in lines:
|
|
|
+ if line.startswith(";Generated with Cura"):
|
|
|
+ line_index = lines.index(line)
|
|
|
+ insert_index = line_index + 1
|
|
|
+ lines[insert_index:insert_index] = snapshot_gcode
|
|
|
+ break
|
|
|
+
|
|
|
+ final_lines = "\n".join(lines)
|
|
|
+ data[layer_index] = final_lines
|
|
|
+
|
|
|
+ return data
|