diff --git a/src/octoprint/plugins/cura/__init__.py b/src/octoprint/plugins/cura/__init__.py index 03653062..62f6770c 100644 --- a/src/octoprint/plugins/cura/__init__.py +++ b/src/octoprint/plugins/cura/__init__.py @@ -50,12 +50,10 @@ class CuraPlugin(octoprint.plugin.SlicerPlugin, ##~~ TemplatePlugin API - def get_template_configs(self): - from flask.ext.babel import gettext - return [ - dict(type="settings", name=gettext("CuraEngine")), - dict(type="wizard", name=gettext("CuraEngine")) - ] + def get_template_vars(self): + return dict( + homepage=__plugin_url__ + ) ##~~ WizardPlugin API @@ -522,10 +520,10 @@ def _get_usage_from_length(filament_length, filament_diameter): return usage -__plugin_name__ = "CuraEngine" +__plugin_name__ = "CuraEngine (<= 15.04)" __plugin_author__ = "Gina Häußge" __plugin_url__ = "https://github.com/foosel/OctoPrint/wiki/Plugin:-Cura" -__plugin_description__ = "Adds support for slicing via CuraEngine from within OctoPrint" +__plugin_description__ = "Adds support for slicing via CuraEngine versions up to and including version 15.04 from within OctoPrint" __plugin_license__ = "AGPLv3" __plugin_implementation__ = CuraPlugin() diff --git a/src/octoprint/plugins/cura/templates/_snippets/settings/cura/profileImporter.jinja2 b/src/octoprint/plugins/cura/templates/_snippets/settings/cura/profileImporter.jinja2 index 219f474a..1db74c08 100644 --- a/src/octoprint/plugins/cura/templates/_snippets/settings/cura/profileImporter.jinja2 +++ b/src/octoprint/plugins/cura/templates/_snippets/settings/cura/profileImporter.jinja2 @@ -50,6 +50,12 @@ + {% trans %} + You can import your existing profile .ini files from Cura (version up to and + including 15.04) here. Please be aware that neither the .json profile format + from Cura versions starting with 15.06 is supported, nor are the custom Cura profile formats + that third party tools like e.g. Repetier create. + {% endtrans %} diff --git a/src/octoprint/util/comm.py b/src/octoprint/util/comm.py index 010e7c9b..3c5f00c3 100644 --- a/src/octoprint/util/comm.py +++ b/src/octoprint/util/comm.py @@ -277,6 +277,7 @@ class MachineCom(object): self._serial_factory_hooks = self._pluginManager.get_hooks("octoprint.comm.transport.serial.factory") # SD status data + self._sdEnabled = settings().getBoolean(["feature", "sdSupport"]) self._sdAvailable = False self._sdFileList = False self._sdFiles = [] @@ -776,21 +777,28 @@ class MachineCom(object): return self._sdFiles def startSdFileTransfer(self, filename): - if not self.isOperational() or self.isBusy(): + if not self._sdEnabled: return + if not self.isOperational() or self.isBusy(): + return self._changeState(self.STATE_TRANSFERING_FILE) self.sendCommand("M28 %s" % filename.lower()) def endSdFileTransfer(self, filename): - if not self.isOperational() or self.isBusy(): + if not self._sdEnabled: return + if not self.isOperational() or self.isBusy(): + return self.sendCommand("M29 %s" % filename.lower()) self._changeState(self.STATE_OPERATIONAL) self.refreshSdFiles() def deleteSdFile(self, filename): + if not self._sdEnabled: + return + if not self.isOperational() or (self.isBusy() and isinstance(self._currentFile, PrintingSdFileInformation) and self._currentFile.getFilename() == filename): @@ -801,13 +809,21 @@ class MachineCom(object): self.refreshSdFiles() def refreshSdFiles(self): + if not self._sdEnabled: + return + if not self.isOperational() or self.isBusy(): return + self.sendCommand("M20") def initSdCard(self): + if not self._sdEnabled: + return + if not self.isOperational(): return + self.sendCommand("M21") if settings().getBoolean(["feature", "sdAlwaysAvailable"]): self._sdAvailable = True @@ -815,6 +831,9 @@ class MachineCom(object): self._callback.on_comm_sd_state_change(self._sdAvailable) def releaseSdCard(self): + if not self._sdEnabled: + return + if not self.isOperational() or (self.isBusy() and self.isSdFileSelected()): # do not release the sd card if we are currently printing from it return @@ -1398,6 +1417,9 @@ class MachineCom(object): or "error writing to file" in line.lower(): #Also skip errors with the SD card pass + elif 'unknown command' in line.lower(): + #Ignore unkown command errors, it could be a typo or some missing feature + pass elif not self.isError(): self._errorValue = line[6:] if line.startswith("Error:") else line[2:] self._changeState(self.STATE_ERROR)