123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- import base64
- from UM.Logger import Logger
- from cura.Snapshot import Snapshot
- from PyQt6.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.OpenModeFlag.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
|