# Copyright (c) 2017 Aleph Objects, Inc. # Cura is released under the terms of the LGPLv3 or higher. from UM.FileHandler.FileReader import FileReader from UM.Mesh.MeshReader import MeshReader from UM.i18n import i18nCatalog from UM.Application import Application from UM.MimeTypeDatabase import MimeTypeDatabase, MimeType catalog = i18nCatalog("cura") from . import MarlinFlavorParser, RepRapFlavorParser MimeTypeDatabase.addMimeType( MimeType( name = "application/x-cura-gcode-file", comment = "Cura GCode File", suffixes = ["gcode", "gcode.gz"] ) ) # Class for loading and parsing G-code files class GCodeReader(MeshReader): _flavor_default = "Marlin" _flavor_keyword = ";FLAVOR:" _flavor_readers_dict = {"RepRap" : RepRapFlavorParser.RepRapFlavorParser(), "Marlin" : MarlinFlavorParser.MarlinFlavorParser()} def __init__(self, application): super(GCodeReader, self).__init__(application) self._supported_extensions = [".gcode", ".g"] self._flavor_reader = None Application.getInstance().getPreferences().addPreference("gcodereader/show_caution", True) def preReadFromStream(self, stream, *args, **kwargs): for line in stream.split("\n"): if line[:len(self._flavor_keyword)] == self._flavor_keyword: try: self._flavor_reader = self._flavor_readers_dict[line[len(self._flavor_keyword):].rstrip()] return FileReader.PreReadResult.accepted except: # If there is no entry in the dictionary for this flavor, just skip and select the by-default flavor break # If no flavor is found in the GCode, then we use the by-default self._flavor_reader = self._flavor_readers_dict[self._flavor_default] return FileReader.PreReadResult.accepted # PreRead is used to get the correct flavor. If not, Marlin is set by default def preRead(self, file_name, *args, **kwargs): with open(file_name, "r", encoding = "utf-8") as file: file_data = file.read() return self.preReadFromStream(file_data, args, kwargs) def readFromStream(self, stream): return self._flavor_reader.processGCodeStream(stream) def _read(self, file_name): with open(file_name, "r", encoding = "utf-8") as file: file_data = file.read() return self.readFromStream(file_data)