Browse Source

Create CreateThumbnail.py

Chris Racioppo 4 years ago
parent
commit
efb79ae650
1 changed files with 109 additions and 0 deletions
  1. 109 0
      plugins/PostProcessingPlugin/scripts/CreateThumbnail.py

+ 109 - 0
plugins/PostProcessingPlugin/scripts/CreateThumbnail.py

@@ -0,0 +1,109 @@
+import base64
+import re
+
+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
+
+                final_lines = "\n".join(lines)
+                data[layer_index] = final_lines
+
+        return data