From c50f7aa4558576612c71daa4612f217ac2afa9eb Mon Sep 17 00:00:00 2001 From: Nino van Hooff Date: Tue, 30 Jun 2020 17:04:03 +0200 Subject: [PATCH 1/4] Add a print job name setting to general preferences CURA-5479 --- cura/CuraApplication.py | 2 +- cura/UI/PrintInformation.py | 42 +++++++++++++++++------ resources/qml/Preferences/GeneralPage.qml | 27 ++++++++++----- resources/texts/change_log.txt | 2 +- 4 files changed, 53 insertions(+), 20 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index bae212917a..82797cd231 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -533,7 +533,7 @@ class CuraApplication(QtApplication): preferences.addPreference("cura/active_mode", "simple") preferences.addPreference("cura/categories_expanded", "") - preferences.addPreference("cura/jobname_prefix", True) + preferences.addPreference("cura/job_name_template", "{machine_name_short}_{project_name}") preferences.addPreference("cura/select_models_on_load", False) preferences.addPreference("view/center_on_select", False) preferences.addPreference("mesh/scale_to_fit", False) diff --git a/cura/UI/PrintInformation.py b/cura/UI/PrintInformation.py index ae4aab0407..1a5c096c8c 100644 --- a/cura/UI/PrintInformation.py +++ b/cura/UI/PrintInformation.py @@ -252,11 +252,12 @@ class PrintInformation(QObject): self.materialNamesChanged.emit() def _onPreferencesChanged(self, preference: str) -> None: - if preference != "cura/material_settings": - return + if preference == "cura/job_name_template": + self._updateJobName() - for build_plate_number in range(self._multi_build_plate_model.maxBuildPlate + 1): - self._calculateInformation(build_plate_number) + if preference == "cura/material_settings": + for build_plate_number in range(self._multi_build_plate_model.maxBuildPlate + 1): + self._calculateInformation(build_plate_number) def _onActiveBuildPlateChanged(self) -> None: new_active_build_plate = self._multi_build_plate_model.activeBuildPlate @@ -305,12 +306,8 @@ class PrintInformation(QObject): # Only update the job name when it's not user-specified. if not self._is_user_specified_job_name: - if self._application.getInstance().getPreferences().getValue("cura/jobname_prefix") and not self._pre_sliced: - # Don't add abbreviation if it already has the exact same abbreviation. - if base_name.startswith(self._abbr_machine + "_"): - self._job_name = base_name - else: - self._job_name = self._abbr_machine + "_" + base_name + if not self._pre_sliced: + self._job_name = self.parseTemplate() else: self._job_name = base_name @@ -440,3 +437,28 @@ class PrintInformation(QObject): """Listen to scene changes to check if we need to reset the print information""" self.setToZeroPrintInformation(self._active_build_plate) + + def parseTemplate(self) -> str: + """Generate a print job name from the job name template + + The template is a user preference: "cura/job_name_template" + """ + template = self._application.getInstance().getPreferences().getValue("cura/job_name_template") + output = template + + output = output.replace("{machine_name_short}", self._abbr_machine) + + if "{machine_name}" in template: + global_container_stack = self._application.getGlobalContainerStack() + if not global_container_stack: + self._abbr_machine = "" + return + active_machine_type_name = global_container_stack.definition.getName() + active_machine_type_name = active_machine_type_name.replace(" ", "_") + output = output.replace("{machine_name}", active_machine_type_name) + + if "{project_name}" in template: + base_name = self._stripAccents(self._base_name) + output = output.replace("{project_name}", base_name) + + return output diff --git a/resources/qml/Preferences/GeneralPage.qml b/resources/qml/Preferences/GeneralPage.qml index 62768556e4..a8ec52cff5 100644 --- a/resources/qml/Preferences/GeneralPage.qml +++ b/resources/qml/Preferences/GeneralPage.qml @@ -85,8 +85,8 @@ UM.PreferencesPage scaleTinyCheckbox.checked = boolCheck(UM.Preferences.getValue("mesh/scale_tiny_meshes")) UM.Preferences.resetPreference("cura/select_models_on_load") selectModelsOnLoadCheckbox.checked = boolCheck(UM.Preferences.getValue("cura/select_models_on_load")) - UM.Preferences.resetPreference("cura/jobname_prefix") - prefixJobNameCheckbox.checked = boolCheck(UM.Preferences.getValue("cura/jobname_prefix")) + UM.Preferences.resetPreference("cura/job_name_template") + jobnameTemplateTextField.text = UM.Preferences.getValue("cura/job_name_template") UM.Preferences.resetPreference("view/show_overhang"); showOverhangCheckbox.checked = boolCheck(UM.Preferences.getValue("view/show_overhang")) UM.Preferences.resetPreference("view/show_xray_warning"); @@ -627,14 +627,25 @@ UM.PreferencesPage { width: childrenRect.width height: childrenRect.height - text: catalog.i18nc("@info:tooltip", "Should a prefix based on the printer name be added to the print job name automatically?") + text: catalog.i18nc("@info:tooltip. Note variable names themselves (ie. machine_name_short, project_name) should not be translated", "Variables: machine_name_short, machine_name, project_name") - CheckBox + Column { - id: prefixJobNameCheckbox - text: catalog.i18nc("@option:check", "Add machine prefix to job name") - checked: boolCheck(UM.Preferences.getValue("cura/jobname_prefix")) - onCheckedChanged: UM.Preferences.setValue("cura/jobname_prefix", checked) + spacing: 4 * screenScaleFactor + + Label + { + id: jobNameTemplateLabel + text: catalog.i18nc("@label","Print job template:") + } + + TextField + { + id: jobNameTemplateTextField + width: 200 * screenScaleFactor + text: UM.Preferences.getValue("cura/job_name_template") + onTextChanged: UM.Preferences.setValue("cura/job_name_template", text) + } } } diff --git a/resources/texts/change_log.txt b/resources/texts/change_log.txt index 8ce125d932..7621f6f713 100644 --- a/resources/texts/change_log.txt +++ b/resources/texts/change_log.txt @@ -140,7 +140,7 @@ A new performance enhancement that limits re-rendering of the application interf Previous versions used different ways of handling HTTP requests. This version uses a unified method, for better performance. * Job names less sensitive to being touched. -A contribution from fieldOfview has fixed an issue where the jobname in the bottom-left of the scene is no longer made static by clicking on it. If you load a model and change to another printer, the prefix is now correctly updated. +A contribution from fieldOfview has fixed an issue where the job name in the bottom-left of the scene is no longer made static by clicking on it. If you load a model and change to another printer, the prefix is now correctly updated. * Property checks on instance containers. A new speed optimization for reading setting values from profiles. From adf082a4ad6a4be2cabe45bb958dc096f7af4103 Mon Sep 17 00:00:00 2001 From: Nino van Hooff Date: Wed, 1 Jul 2020 14:59:14 +0200 Subject: [PATCH 2/4] Fix TextPrintInformation CURA-5479 --- tests/TestPrintInformation.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/tests/TestPrintInformation.py b/tests/TestPrintInformation.py index 5133dfcafb..3d88febb61 100644 --- a/tests/TestPrintInformation.py +++ b/tests/TestPrintInformation.py @@ -8,6 +8,13 @@ from unittest.mock import MagicMock, patch from UM.MimeTypeDatabase import MimeTypeDatabase, MimeType +def preferencesGetValue(key: str): + if key == "cura/job_name_template": + return "{machine_name_short}_{project_name}" + + return '{"omgzomg": {"spool_weight": 10, "spool_cost": 9}}' + + def getPrintInformation(printer_name) -> PrintInformation: mock_application = MagicMock(name = "mock_application") @@ -19,7 +26,7 @@ def getPrintInformation(printer_name) -> PrintInformation: mocked_extruder_stack.material = mocked_material mock_application.getInstance = MagicMock(return_value = mock_application) - mocked_preferences.getValue = MagicMock(return_value = '{"omgzomg": {"spool_weight": 10, "spool_cost": 9}}') + mocked_preferences.getValue = MagicMock(side_effect=preferencesGetValue) global_container_stack = MagicMock() global_container_stack.definition.getName = MagicMock(return_value = printer_name) From 24820bab077856686c717a85c175a5455d7c4f2c Mon Sep 17 00:00:00 2001 From: Nino van Hooff Date: Wed, 1 Jul 2020 15:00:35 +0200 Subject: [PATCH 3/4] Fix: incorrect return statement CURA-5479 --- cura/UI/PrintInformation.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cura/UI/PrintInformation.py b/cura/UI/PrintInformation.py index 1a5c096c8c..9edff36440 100644 --- a/cura/UI/PrintInformation.py +++ b/cura/UI/PrintInformation.py @@ -450,10 +450,10 @@ class PrintInformation(QObject): if "{machine_name}" in template: global_container_stack = self._application.getGlobalContainerStack() - if not global_container_stack: - self._abbr_machine = "" - return - active_machine_type_name = global_container_stack.definition.getName() + active_machine_type_name = global_container_stack.definition.getName() \ + if global_container_stack \ + else "no_machine" + active_machine_type_name = active_machine_type_name.replace(" ", "_") output = output.replace("{machine_name}", active_machine_type_name) From 06284b6a738ce3147f43328aa067751f23f573b6 Mon Sep 17 00:00:00 2001 From: Nino van Hooff Date: Wed, 1 Jul 2020 16:47:20 +0200 Subject: [PATCH 4/4] Implement Review comments CURA-5479 --- cura/UI/PrintInformation.py | 3 +-- resources/qml/Preferences/GeneralPage.qml | 6 +++--- tests/TestPrintInformation.py | 2 +- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/cura/UI/PrintInformation.py b/cura/UI/PrintInformation.py index 9edff36440..95aceb67e1 100644 --- a/cura/UI/PrintInformation.py +++ b/cura/UI/PrintInformation.py @@ -254,8 +254,7 @@ class PrintInformation(QObject): def _onPreferencesChanged(self, preference: str) -> None: if preference == "cura/job_name_template": self._updateJobName() - - if preference == "cura/material_settings": + elif preference == "cura/material_settings": for build_plate_number in range(self._multi_build_plate_model.maxBuildPlate + 1): self._calculateInformation(build_plate_number) diff --git a/resources/qml/Preferences/GeneralPage.qml b/resources/qml/Preferences/GeneralPage.qml index a8ec52cff5..0d3f6ea586 100644 --- a/resources/qml/Preferences/GeneralPage.qml +++ b/resources/qml/Preferences/GeneralPage.qml @@ -642,7 +642,7 @@ UM.PreferencesPage TextField { id: jobNameTemplateTextField - width: 200 * screenScaleFactor + width: 250 * screenScaleFactor text: UM.Preferences.getValue("cura/job_name_template") onTextChanged: UM.Preferences.setValue("cura/job_name_template", text) } @@ -681,7 +681,7 @@ UM.PreferencesPage ComboBox { id: choiceOnOpenProjectDropDownButton - width: 200 * screenScaleFactor + width: 250 * screenScaleFactor model: ListModel { @@ -747,7 +747,7 @@ UM.PreferencesPage ComboBox { id: choiceOnProfileOverrideDropDownButton - width: 200 * screenScaleFactor + width: 250 * screenScaleFactor model: ListModel { diff --git a/tests/TestPrintInformation.py b/tests/TestPrintInformation.py index 3d88febb61..577827f326 100644 --- a/tests/TestPrintInformation.py +++ b/tests/TestPrintInformation.py @@ -26,7 +26,7 @@ def getPrintInformation(printer_name) -> PrintInformation: mocked_extruder_stack.material = mocked_material mock_application.getInstance = MagicMock(return_value = mock_application) - mocked_preferences.getValue = MagicMock(side_effect=preferencesGetValue) + mocked_preferences.getValue = MagicMock(side_effect = preferencesGetValue) global_container_stack = MagicMock() global_container_stack.definition.getName = MagicMock(return_value = printer_name)