From 0aac7813e44d32532e83b3a3b0660bf7c3025903 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gina=20H=C3=A4u=C3=9Fge?= Date: Wed, 29 Oct 2014 12:16:49 +0100 Subject: [PATCH] More work on slicing integration: - be able to handle slicers which can't report progress - distinguish between registered and configured slicers (e.g. to allow uploading of profiles via the settings before having saved the path to the executable) --- docs/events/index.rst | 1 + src/octoprint/plugin/types.py | 1 + src/octoprint/plugins/cura/__init__.py | 3 ++- src/octoprint/slicing/__init__.py | 19 +++++++++++++------ src/octoprint/static/js/app/dataupdater.js | 6 +++++- 5 files changed, 22 insertions(+), 8 deletions(-) diff --git a/docs/events/index.rst b/docs/events/index.rst index 9a1d5310..f0a55169 100644 --- a/docs/events/index.rst +++ b/docs/events/index.rst @@ -328,6 +328,7 @@ SlicingStarted * ``stl``: the STL's filename * ``gcode``: the sliced GCODE's filename + * ``progressAvailable``: true if progress information via the ``slicingProgress`` push update will be available, false if not SlicingDone The slicing of a file has completed. diff --git a/src/octoprint/plugin/types.py b/src/octoprint/plugin/types.py index 12e41dab..28747317 100644 --- a/src/octoprint/plugin/types.py +++ b/src/octoprint/plugin/types.py @@ -199,6 +199,7 @@ class SlicerPlugin(Plugin): type=None, name=None, same_device=True, + progress_report=False ) def get_slicer_profile_options(self): diff --git a/src/octoprint/plugins/cura/__init__.py b/src/octoprint/plugins/cura/__init__.py index 9e963919..9cebe18e 100644 --- a/src/octoprint/plugins/cura/__init__.py +++ b/src/octoprint/plugins/cura/__init__.py @@ -194,7 +194,8 @@ class CuraPlugin(octoprint.plugin.SlicerPlugin, return dict( type="cura", name="CuraEngine", - same_device=True + same_device=True, + progress_report=True ) def get_slicer_default_profile(self): diff --git a/src/octoprint/slicing/__init__.py b/src/octoprint/slicing/__init__.py index 0cd4ae17..fa44a8b7 100644 --- a/src/octoprint/slicing/__init__.py +++ b/src/octoprint/slicing/__init__.py @@ -73,22 +73,26 @@ class SlicingManager(object): @property def slicing_enabled(self): - return len(self.registered_slicers) > 0 + return len(self.configured_slicers) > 0 @property def registered_slicers(self): return self._slicers.keys() + @property + def configured_slicers(self): + return map(lambda slicer: slicer.get_slicer_properties()["type"], filter(lambda slicer: slicer.is_slicer_configured(), self._slicers.values())) + @property def default_slicer(self): slicer_name = settings().get(["slicing", "defaultSlicer"]) - if slicer_name in self.registered_slicers: + if slicer_name in self.configured_slicers: return slicer_name else: return None - def get_slicer(self, slicer): - return self._slicers[slicer] if slicer in self._slicers else None + def get_slicer(self, slicer, require_configured=True): + return self._slicers[slicer] if slicer in self._slicers and (not require_configured or self._slicers[slicer].is_slicer_configured()) else None def slice(self, slicer_name, source_path, dest_path, profile_name, callback, callback_args=None, callback_kwargs=None, overrides=None, on_progress=None, on_progress_args=None, on_progress_kwargs=None): if callback_args is None: @@ -96,8 +100,11 @@ class SlicingManager(object): if callback_kwargs is None: callback_kwargs = dict() - if not slicer_name in self.registered_slicers: - error = "No such slicer: {slicer_name}".format(**locals()) + if not slicer_name in self.configured_slicers: + if not slicer_name in self.registered_slicers: + error = "No such slicer: {slicer_name}".format(**locals()) + else: + error = "Slicer not configured: {slicer_name}".format(**locals()) callback_kwargs.update(dict(_error=error)) callback(*callback_args, **callback_kwargs) return False, error diff --git a/src/octoprint/static/js/app/dataupdater.js b/src/octoprint/static/js/app/dataupdater.js index f134fe86..9a709017 100644 --- a/src/octoprint/static/js/app/dataupdater.js +++ b/src/octoprint/static/js/app/dataupdater.js @@ -181,7 +181,11 @@ function DataUpdater(allViewModels) { } else if (type == "SlicingStarted") { gcodeUploadProgress.addClass("progress-striped").addClass("active"); gcodeUploadProgressBar.css("width", "100%"); - gcodeUploadProgressBar.text(_.sprintf(gettext("Slicing ... (%(percentage)d%%)"), {percentage: 0})); + if (payload.progressAvailable) { + gcodeUploadProgressBar.text(_.sprintf(gettext("Slicing ... (%(percentage)d%%)"), {percentage: 0})); + } else { + gcodeUploadProgressBar.text(gettext("Slicing ...")); + } } else if (type == "SlicingDone") { gcodeUploadProgress.removeClass("progress-striped").removeClass("active"); gcodeUploadProgressBar.css("width", "0%");