diff --git a/src/octoprint/plugins/cura/__init__.py b/src/octoprint/plugins/cura/__init__.py index 4dab650f..b21fd1a7 100644 --- a/src/octoprint/plugins/cura/__init__.py +++ b/src/octoprint/plugins/cura/__init__.py @@ -25,7 +25,8 @@ class CuraPlugin(octoprint.plugin.SlicerPlugin, octoprint.plugin.TemplatePlugin, octoprint.plugin.AssetPlugin, octoprint.plugin.BlueprintPlugin, - octoprint.plugin.StartupPlugin): + octoprint.plugin.StartupPlugin, + octoprint.plugin.WizardPlugin): def __init__(self): self._logger = logging.getLogger("octoprint.plugins.cura") @@ -37,14 +38,28 @@ class CuraPlugin(octoprint.plugin.SlicerPlugin, self._cancelled_jobs = [] self._job_mutex = threading.Lock() + def _is_engine_configured(self, cura_engine=None): + if cura_engine is None: + cura_engine = normalize_path(self._settings.get(["cura_engine"])) + return cura_engine is not None and os.path.exists(cura_engine) + + def _is_profile_available(self): + return bool(self._slicing_manager.all_profiles("cura", require_configured=False)) + ##~~ TemplatePlugin API def get_template_configs(self): from flask.ext.babel import gettext return [ - dict(type="settings", name=gettext("CuraEngine")) + dict(type="settings", name=gettext("CuraEngine")), + dict(type="wizard", name=gettext("CuraEngine")) ] + ##~~ WizardPlugin API + + def is_wizard_required(self): + return not self._is_engine_configured() or not self._is_profile_available() + ##~~ StartupPlugin API def on_startup(self, host, port): @@ -62,9 +77,6 @@ class CuraPlugin(octoprint.plugin.SlicerPlugin, @octoprint.plugin.BlueprintPlugin.route("/import", methods=["POST"]) def import_cura_profile(self): import datetime - import tempfile - - from octoprint.server import slicingManager input_name = "file" input_upload_name = input_name + "." + self._settings.global_get(["server", "uploads", "nameSuffix"]) @@ -106,12 +118,12 @@ class CuraPlugin(octoprint.plugin.SlicerPlugin, profile_allow_overwrite = flask.request.values["allowOverwrite"] in valid_boolean_trues try: - slicingManager.save_profile("cura", - profile_name, - profile_dict, - allow_overwrite=profile_allow_overwrite, - display_name=profile_display_name, - description=profile_description) + self._slicing_manager.save_profile("cura", + profile_name, + profile_dict, + allow_overwrite=profile_allow_overwrite, + display_name=profile_display_name, + description=profile_description) except octoprint.slicing.ProfileAlreadyExists: self._logger.warn("Profile {profile_name} already exists, aborting".format(**locals())) return flask.make_response("A profile named {profile_name} already exists for slicer cura".format(**locals()), 409) @@ -159,10 +171,11 @@ class CuraPlugin(octoprint.plugin.SlicerPlugin, def is_slicer_configured(self): cura_engine = normalize_path(self._settings.get(["cura_engine"])) - if cura_engine is not None and os.path.exists(cura_engine): + if self._is_engine_configured(cura_engine=cura_engine): return True else: self._logger.info("Path to CuraEngine has not been configured yet or does not exist (currently set to %r), Cura will not be selectable for slicing" % cura_engine) + return False def get_slicer_properties(self): return dict( diff --git a/src/octoprint/plugins/cura/static/js/cura.js b/src/octoprint/plugins/cura/static/js/cura.js index 99820e2e..c03c7e84 100644 --- a/src/octoprint/plugins/cura/static/js/cura.js +++ b/src/octoprint/plugins/cura/static/js/cura.js @@ -24,6 +24,9 @@ $(function() { self.profileDescription = ko.observable(); self.profileAllowOverwrite = ko.observable(true); + self.unconfiguredCuraEngine = ko.observable(); + self.unconfiguredSlicingProfile = ko.observable(); + self.uploadElement = $("#settings-cura-import"); self.uploadButton = $("#settings-cura-import-start"); @@ -215,6 +218,13 @@ $(function() { }); }); self.profiles.updateItems(profiles); + + if (self.unconfiguredCuraEngine() === undefined) { + self.unconfiguredCuraEngine(self.settings.plugins.cura.cura_engine() == false); + } + if (self.unconfiguredSlicingProfile() === undefined) { + self.unconfiguredSlicingProfile(profiles.length == 0); + } }; self.onBeforeBinding = function () { @@ -233,6 +243,6 @@ $(function() { OCTOPRINT_VIEWMODELS.push([ CuraViewModel, ["loginStateViewModel", "settingsViewModel", "slicingViewModel"], - "#settings_plugin_cura" + ["#settings_plugin_cura", "#wizard_plugin_cura"] ]); }); diff --git a/src/octoprint/plugins/cura/templates/cura_settings.jinja2 b/src/octoprint/plugins/cura/templates/cura_settings.jinja2 index 1cacf658..dec631da 100644 --- a/src/octoprint/plugins/cura/templates/cura_settings.jinja2 +++ b/src/octoprint/plugins/cura/templates/cura_settings.jinja2 @@ -1,111 +1,9 @@
| {{ _('Identifier') }} | -{{ _('Name') }} | -{{ _('Actions') }} | -
|---|---|---|
| - | - | - | - | -
{% trans %} + The path to CuraEngine has not yet been set up, in order to be able to use + CuraEngine for slicing it needs to be specified. + {% endtrans %}
+ +{% trans %}You don't have imported a slicing profile to use for slicing with CuraEngine + yet. You should do this now.{% endtrans %}
+ + {% include "snippets/cura_profiles.jinja2" %} + +{% trans %} + Don't know where to get a profile? In order to export + a slicing profile from the Cura desktop UI, open it, set up your + profile, then click on "File" and there on "Save Profile". You can + import the .ini-file this creates via the "Import Profile" button. + {% endtrans %}
+{% trans %} + Note: OctoPrint currently only supports slicing with + CuraEngine up to 15.04 and importing Cura profiles from Cura versions + up to 15.04. Newer Cura releases (e.g. 15.06) do not allow to + export the slicing profile anymore and also use a different internal format + that will not work with the current version of the Cura Plugin. +{% endtrans %}
diff --git a/src/octoprint/plugins/cura/templates/snippets/cura_engine.jinja2 b/src/octoprint/plugins/cura/templates/snippets/cura_engine.jinja2 new file mode 100644 index 00000000..b05802a1 --- /dev/null +++ b/src/octoprint/plugins/cura/templates/snippets/cura_engine.jinja2 @@ -0,0 +1,19 @@ + diff --git a/src/octoprint/plugins/cura/templates/snippets/cura_profile_importer.jinja2 b/src/octoprint/plugins/cura/templates/snippets/cura_profile_importer.jinja2 new file mode 100644 index 00000000..1a4b428f --- /dev/null +++ b/src/octoprint/plugins/cura/templates/snippets/cura_profile_importer.jinja2 @@ -0,0 +1,51 @@ + diff --git a/src/octoprint/plugins/cura/templates/snippets/cura_profiles.jinja2 b/src/octoprint/plugins/cura/templates/snippets/cura_profiles.jinja2 new file mode 100644 index 00000000..2e1cf672 --- /dev/null +++ b/src/octoprint/plugins/cura/templates/snippets/cura_profiles.jinja2 @@ -0,0 +1,35 @@ +| {{ _('Identifier') }} | +{{ _('Name') }} | +{{ _('Actions') }} | +
|---|---|---|
| + | + | + | + | +