From d710d42c0aed53df753eff7dfa90a4da005a8a7a Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 5 Aug 2020 02:16:16 +0200 Subject: [PATCH 01/17] Keep tooltip visible when hovering over it Except when hovering over it while it's completely invisible. You just get this 100ms leeway time to transition from the setting to the tooltip. --- resources/qml/PrintSetupTooltip.qml | 47 ++++++++++++++++++++--------- 1 file changed, 32 insertions(+), 15 deletions(-) diff --git a/resources/qml/PrintSetupTooltip.qml b/resources/qml/PrintSetupTooltip.qml index 41d68aef37..cb9801f1bb 100644 --- a/resources/qml/PrintSetupTooltip.qml +++ b/resources/qml/PrintSetupTooltip.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2019 Ultimaker B.V. +// Copyright (c) 2020 Ultimaker B.V. // Cura is released under the terms of the LGPLv3 or higher. import QtQuick 2.7 @@ -59,22 +59,39 @@ UM.PointingRectangle base.opacity = 0; } - Label + MouseArea { - id: label; - anchors + anchors.fill: parent + hoverEnabled: true + onHoveredChanged: { - top: parent.top; - topMargin: UM.Theme.getSize("tooltip_margins").height; - left: parent.left; - leftMargin: UM.Theme.getSize("tooltip_margins").width; - right: parent.right; - rightMargin: UM.Theme.getSize("tooltip_margins").width; + if(containsMouse && base.opacity > 0) + { + base.show(Qt.point(base.x + base.width, base.y + UM.Theme.getSize("tooltip_arrow_margins").height)); + } + else + { + base.hide(); + } + } + + Label + { + id: label + anchors + { + top: parent.top; + topMargin: UM.Theme.getSize("tooltip_margins").height; + left: parent.left; + leftMargin: UM.Theme.getSize("tooltip_margins").width; + right: parent.right; + rightMargin: UM.Theme.getSize("tooltip_margins").width; + } + wrapMode: Text.Wrap; + textFormat: Text.RichText + font: UM.Theme.getFont("default"); + color: UM.Theme.getColor("tooltip_text"); + renderType: Text.NativeRendering } - wrapMode: Text.Wrap; - textFormat: Text.RichText - font: UM.Theme.getFont("default"); - color: UM.Theme.getColor("tooltip_text"); - renderType: Text.NativeRendering } } From 3b8ae6439c61d9e63068ea91ef391c498608d2f6 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 5 Aug 2020 02:40:45 +0200 Subject: [PATCH 02/17] Put the setting tooltip in a scrollview You can now scroll through it if the description is too long for it to fit on the screen. --- resources/qml/PrintSetupTooltip.qml | 38 +++++++++++++++++------------ 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/resources/qml/PrintSetupTooltip.qml b/resources/qml/PrintSetupTooltip.qml index cb9801f1bb..515427e655 100644 --- a/resources/qml/PrintSetupTooltip.qml +++ b/resources/qml/PrintSetupTooltip.qml @@ -11,7 +11,7 @@ UM.PointingRectangle id: base property real sourceWidth: 0 width: UM.Theme.getSize("tooltip").width - height: label.height + UM.Theme.getSize("tooltip_margins").height * 2 + height: textScroll.height + UM.Theme.getSize("tooltip_margins").height * 2 color: UM.Theme.getColor("tooltip") arrowSize: UM.Theme.getSize("default_arrow").width @@ -75,23 +75,29 @@ UM.PointingRectangle } } - Label + ScrollView { - id: label - anchors - { - top: parent.top; - topMargin: UM.Theme.getSize("tooltip_margins").height; - left: parent.left; - leftMargin: UM.Theme.getSize("tooltip_margins").width; - right: parent.right; - rightMargin: UM.Theme.getSize("tooltip_margins").width; + id: textScroll + width: parent.width + height: Math.min(label.height, base.parent.height) + + ScrollBar.horizontal: ScrollBar { + active: false //Only allow vertical scrolling. We should grow vertically only, but due to how the label is positioned it allocates space in the ScrollView horizontally. + } + + Label + { + id: label + x: UM.Theme.getSize("tooltip_margins").width + y: UM.Theme.getSize("tooltip_margins").height + width: base.width - UM.Theme.getSize("tooltip_margins").width * 2 + + wrapMode: Text.Wrap; + textFormat: Text.RichText + font: UM.Theme.getFont("default"); + color: UM.Theme.getColor("tooltip_text"); + renderType: Text.NativeRendering } - wrapMode: Text.Wrap; - textFormat: Text.RichText - font: UM.Theme.getFont("default"); - color: UM.Theme.getColor("tooltip_text"); - renderType: Text.NativeRendering } } } From 10857094070e79aabce25bd4fbcb394a0f5d3d68 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 5 Aug 2020 02:44:19 +0200 Subject: [PATCH 03/17] Fix arrow position if tooltip is too big to fit on the screen --- resources/qml/PrintSetupTooltip.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/PrintSetupTooltip.qml b/resources/qml/PrintSetupTooltip.qml index 515427e655..6b39842ec0 100644 --- a/resources/qml/PrintSetupTooltip.qml +++ b/resources/qml/PrintSetupTooltip.qml @@ -67,7 +67,7 @@ UM.PointingRectangle { if(containsMouse && base.opacity > 0) { - base.show(Qt.point(base.x + base.width, base.y + UM.Theme.getSize("tooltip_arrow_margins").height)); + base.show(Qt.point(target.x - 1, target.y - UM.Theme.getSize("tooltip_arrow_margins").height / 2)); //Same arrow position as before. } else { From 724498cba79ac8ce5fdb3a48371b18313d0c0656 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 6 Aug 2020 17:12:14 +0200 Subject: [PATCH 04/17] Reset quality if none was found CURA-7589 --- cura/Settings/MachineManager.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 1934befd66..da1d13aa4e 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -1212,9 +1212,8 @@ class MachineManager(QObject): return if not available_quality_types: - if global_stack.qualityChanges == empty_quality_changes_container: - Logger.log("i", "No available quality types found, setting all qualities to empty (Not Supported).") - self._setEmptyQuality() + Logger.log("i", "No available quality types found, setting all qualities to empty (Not Supported).") + self._setEmptyQuality() return if current_quality_type in available_quality_types: From 45461e702d4493ee7e4e8a7203763c0fcd577a11 Mon Sep 17 00:00:00 2001 From: n7484443 Date: Tue, 11 Aug 2020 08:53:21 +0900 Subject: [PATCH 05/17] Retranslate ko_kr "ironing_flow" MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit en:i changed ironing_flow translation to "다림질 압출량". "과정" means process. so i changed it "압출량"-every flow word has been translated to this. kr:기존의 다림질 과정에서 flow를 "과정"이 아닌 "압출량"으로 바꾸었습니다. --- resources/i18n/ko_KR/fdmprinter.def.json.po | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/i18n/ko_KR/fdmprinter.def.json.po b/resources/i18n/ko_KR/fdmprinter.def.json.po index 52770fac4c..830239fb46 100644 --- a/resources/i18n/ko_KR/fdmprinter.def.json.po +++ b/resources/i18n/ko_KR/fdmprinter.def.json.po @@ -1488,12 +1488,12 @@ msgstr "다림질 라인 사이의 거리." #: fdmprinter.def.json msgctxt "ironing_flow label" msgid "Ironing Flow" -msgstr "다림질 과정" +msgstr "다림질 압출량" #: fdmprinter.def.json msgctxt "ironing_flow description" msgid "The amount of material, relative to a normal skin line, to extrude during ironing. Keeping the nozzle filled helps filling some of the crevices of the top surface, but too much results in overextrusion and blips on the side of the surface." -msgstr "다림질하는 동안 기본 스킨 라인을 기준으로 한 재료의 양. 노즐을 가득 채우면 윗면의 틈새가 채워서포트만 표면의 과도한 압출과 틈이 너무 많이 생깁니다." +msgstr "다림질하는 동안 기본 스킨 라인을 기준으로 한 재료의 압출량. 노즐을 가득 채우면 윗면의 틈새가 채워서포트만 표면의 과도한 압출과 틈이 너무 많이 생깁니다." #: fdmprinter.def.json msgctxt "ironing_inset label" From 55dbb1ea0c6a0c8281c4053d766e42e346d230bd Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 11 Aug 2020 13:29:53 +0200 Subject: [PATCH 06/17] Temporarily remove warning message for cloud cameras It's incorrect; the camera is possible with development firmware, but not implemented yet in Cura. Removed this in lieu of the actual fix in CURA-7637, which takes too much time to fix for the 4.7 release. --- .../UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml index da2acc8cf7..6416558fe7 100644 --- a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml +++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml @@ -282,12 +282,13 @@ Item enabled: !cameraButton.enabled } + /* //Warning message is commented out because it's factually incorrect. Fix CURA-7637 to allow camera connections via cloud. MonitorInfoBlurb { id: cameraDisabledInfo text: catalog.i18nc("@info", "The webcam is not available because you are monitoring a cloud printer.") target: cameraButton - } + }*/ } // Divider From 5ec57d42d0f474453c64e05d24f79bfb658bdd86 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 12 Aug 2020 09:45:51 +0200 Subject: [PATCH 07/17] Improve translatability of cloud printer syncing texts Here are a number of improvements to the translated texts that make it easier for the translators to translate them: * Never include layout elements such as
    or
  • in the translated text. The translators don't know what to do with them. Instead, leave the tags out of the translated parts and then wrap them around it in Python. * If there are replacement keys in the source text, explain all of them in the context. * Use a name within the brackets, to make it clear from context what the brackets mean and to disambiguate multiple keys if there are multiple. * No invisible whitespace (such as space at the end of a line). * Use plural forms with i18ncp if applicable (or i18np if no context is necessary). I also changed the catalogue variable to lowercase with underscores, as per our code style. --- .../src/Cloud/CloudOutputDeviceManager.py | 48 +++++++++---------- 1 file changed, 23 insertions(+), 25 deletions(-) diff --git a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py index ec8dfd9ae7..7730adec1e 100644 --- a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py +++ b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py @@ -1,5 +1,6 @@ -# Copyright (c) 2019 Ultimaker B.V. +# Copyright (c) 2020 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. + import os from typing import Dict, List, Optional, Set @@ -37,7 +38,7 @@ class CloudOutputDeviceManager: SYNC_SERVICE_NAME = "CloudOutputDeviceManager" # The translation catalog for this device. - I18N_CATALOG = i18nCatalog("cura") + i18n_catalog = i18nCatalog("cura") # Signal emitted when the list of discovered devices changed. discoveredDevicesChanged = Signal() @@ -221,7 +222,7 @@ class CloudOutputDeviceManager: ) message = Message( - title = self.I18N_CATALOG.i18ncp( + title = self.i18n_catalog.i18ncp( "info:status", "New printer detected from your Ultimaker account", "New printers detected from your Ultimaker account", @@ -234,11 +235,7 @@ class CloudOutputDeviceManager: message.show() for idx, device in enumerate(new_devices): - message_text = self.I18N_CATALOG.i18nc( - "info:status", "Adding printer {} ({}) from your account", - device.name, - device.printerTypeName - ) + message_text = self.i18n_catalog.i18nc("info:status %1 is printer name, %2 is printer type", "Adding printer {name} ({type}) from your account").format(name = device.name, type = device.printerTypeName) message.setText(message_text) if len(new_devices) > 1: message.setProgress((idx / len(new_devices)) * 100) @@ -255,16 +252,12 @@ class CloudOutputDeviceManager: if len(new_devices) > max_disp_devices: num_hidden = len(new_devices) - max_disp_devices device_name_list = ["
  • {} ({})
  • ".format(device.name, device.printerTypeName) for device in new_devices[0:max_disp_devices]] - device_name_list.append(self.I18N_CATALOG.i18nc("info:hidden list items", "
  • ... and {} others
  • ", num_hidden)) + device_name_list.append("
  • " + self.i18n_catalog.i18ncp("info:{num_hidden} gets replaced by a number of printers", "... and {num_hidden} other", "... and {num_hidden} others", num_hidden).format(num_hidden = num_hidden) + "
  • ") device_names = "".join(device_name_list) else: device_names = "".join(["
  • {} ({})
  • ".format(device.name, device.printerTypeName) for device in new_devices]) - message_text = self.I18N_CATALOG.i18nc( - "info:status", - "Printers added from Digital Factory:
      {}
    ", - device_names - ) + message_text = self.i18n_catalog.i18nc("info:status", "Printers added from Digital Factory:") + "
      " + device_names + "
    " message.setText(message_text) def _updateOutdatedMachine(self, outdated_machine: GlobalStack, new_cloud_output_device: CloudOutputDevice) -> None: @@ -318,7 +311,7 @@ class CloudOutputDeviceManager: # Generate message self._removed_printers_message = Message( - title = self.I18N_CATALOG.i18ncp( + title = self.i18n_catalog.i18ncp( "info:status", "A cloud connection is not available for a printer", "A cloud connection is not available for some printers", @@ -326,27 +319,27 @@ class CloudOutputDeviceManager: ) ) device_names = "".join(["
  • {} ({})
  • ".format(self._um_cloud_printers[device].name, self._um_cloud_printers[device].definition.name) for device in self.reported_device_ids]) - message_text = self.I18N_CATALOG.i18ncp( + message_text = self.i18n_catalog.i18ncp( "info:status", "This printer is not linked to the Digital Factory:", "These printers are not linked to the Digital Factory:", len(self.reported_device_ids) ) message_text += "
      {}

    ".format(device_names) - digital_factory_string = self.I18N_CATALOG.i18nc("info:name", "Ultimaker Digital Factory") + digital_factory_string = self.i18n_catalog.i18nc("info:name", "Ultimaker Digital Factory") - message_text += self.I18N_CATALOG.i18nc( + message_text += self.i18n_catalog.i18nc( "info:status", "To establish a connection, please visit the {website_link}".format(website_link = "{}.".format(digital_factory_string)) ) self._removed_printers_message.setText(message_text) self._removed_printers_message.addAction("keep_printer_configurations_action", - name = self.I18N_CATALOG.i18nc("@action:button", "Keep printer configurations"), + name = self.i18n_catalog.i18nc("@action:button", "Keep printer configurations"), icon = "", description = "Keep cloud printers in Ultimaker Cura when not connected to your account.", button_align = Message.ActionButtonAlignment.ALIGN_RIGHT) self._removed_printers_message.addAction("remove_printers_action", - name = self.I18N_CATALOG.i18nc("@action:button", "Remove printers"), + name = self.i18n_catalog.i18nc("@action:button", "Remove printers"), icon = "", description = "Remove cloud printer(s) which aren't linked to your account.", button_style = Message.ActionButtonStyle.SECONDARY, @@ -423,9 +416,9 @@ class CloudOutputDeviceManager: machine.setMetaDataEntry(self.META_HOST_GUID, device.clusterData.host_guid) machine.setMetaDataEntry("group_name", device.name) machine.setMetaDataEntry("group_size", device.clusterSize) - digital_factory_string = self.I18N_CATALOG.i18nc("info:name", "Ultimaker Digital Factory") + digital_factory_string = self.i18n_catalog.i18nc("info:name", "Ultimaker Digital Factory") digital_factory_link = "{}".format(digital_factory_string) - removal_warning_string = self.I18N_CATALOG.i18nc( + removal_warning_string = self.i18n_catalog.i18nc( "@label ({printer_name} is replaced with the name of the printer", "{printer_name} will be removed until the next account sync.
    To remove {printer_name} permanently, " "visit {digital_factory_link}" @@ -469,10 +462,15 @@ class CloudOutputDeviceManager: remove_printers_ids = {self._um_cloud_printers[i].getId() for i in self.reported_device_ids} all_ids = {m.getId() for m in CuraApplication.getInstance().getContainerRegistry().findContainerStacks(type = "machine")} - question_title = self.I18N_CATALOG.i18nc("@title:window", "Remove printers?") - question_content = self.I18N_CATALOG.i18nc("@label", "You are about to remove {} printer(s) from Cura. This action cannot be undone. \nAre you sure you want to continue?".format(len(remove_printers_ids))) + question_title = self.i18n_catalog.i18nc("@title:window", "Remove printers?") + question_content = self.i18n_catalog.i18ncp( + "@label", + "You are about to remove {num_printers} printer from Cura. This action cannot be undone.\nAre you sure you want to continue?", + "You are about to remove {num_printers} printers from Cura. This action cannot be undone.\nAre you sure you want to continue?", + len(remove_printers_ids) + ).format(num_printers = len(remove_printers_ids)) if remove_printers_ids == all_ids: - question_content = self.I18N_CATALOG.i18nc("@label", "You are about to remove all printers from Cura. This action cannot be undone. \nAre you sure you want to continue?") + question_content = self.i18n_catalog.i18nc("@label", "You are about to remove all printers from Cura. This action cannot be undone.\nAre you sure you want to continue?") result = QMessageBox.question(None, question_title, question_content) if result == QMessageBox.No: return From 4ecab892e54ae068c212ea867bb2c32abe65e9b9 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 12 Aug 2020 10:53:37 +0200 Subject: [PATCH 08/17] Further improve translated strings Remove this formatting from the translated part. --- .../src/Cloud/CloudOutputDeviceManager.py | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py index 7730adec1e..c5883e59ca 100644 --- a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py +++ b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py @@ -235,7 +235,7 @@ class CloudOutputDeviceManager: message.show() for idx, device in enumerate(new_devices): - message_text = self.i18n_catalog.i18nc("info:status %1 is printer name, %2 is printer type", "Adding printer {name} ({type}) from your account").format(name = device.name, type = device.printerTypeName) + message_text = self.i18n_catalog.i18nc("info:status Filled in with printer name and printer model.", "Adding printer {name} ({model}) from your account").format(name = device.name, model = device.printerTypeName) message.setText(message_text) if len(new_devices) > 1: message.setProgress((idx / len(new_devices)) * 100) @@ -417,15 +417,10 @@ class CloudOutputDeviceManager: machine.setMetaDataEntry("group_name", device.name) machine.setMetaDataEntry("group_size", device.clusterSize) digital_factory_string = self.i18n_catalog.i18nc("info:name", "Ultimaker Digital Factory") - digital_factory_link = "{}".format(digital_factory_string) - removal_warning_string = self.i18n_catalog.i18nc( - "@label ({printer_name} is replaced with the name of the printer", - "{printer_name} will be removed until the next account sync.
    To remove {printer_name} permanently, " - "visit {digital_factory_link}" - "

    Are you sure you want to remove {printer_name} temporarily?".format(printer_name = device.name, - digital_factory_link = digital_factory_link) - ) - + digital_factory_link = "{digital_factory_string}".format(digital_factory_string = digital_factory_string) + removal_warning_string = self.i18n_catalog.i18nc("@message {printer_name} is replaced with the name of the printer", "{printer_name} will be removed until the next account sync.").format(printer_name = device.name) \ + + "
    " + self.i18n_catalog.i18nc("@message {printer_name} is replaced with the name of the printer", "To remove {printer_name} permanently, visit {digital_factory_link}").format(printer_name = device.name, digital_factory_link = digital_factory_link) \ + + "

    " + self.i18n_catalog.i18nc("@message {printer_name} is replaced with the name of the printer", "Are you sure you want to remove {printer_name} temporarily?").format(printer_name = device.name) machine.setMetaDataEntry("removal_warning", removal_warning_string) machine.addConfiguredConnectionType(device.connectionType.value) From 3de3d438a547ed70694684038241c38cfb4a8890 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 12 Aug 2020 11:02:04 +0200 Subject: [PATCH 09/17] Prevent MouseArea from stealing mouse clicks Possibly this is a problem if the tooltip is invisible. We're not sure yet how to reproduce that bug though. In any case, it's neater to not catch mouse events you don't need. --- resources/qml/PrintSetupTooltip.qml | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/qml/PrintSetupTooltip.qml b/resources/qml/PrintSetupTooltip.qml index 6b39842ec0..82210b5399 100644 --- a/resources/qml/PrintSetupTooltip.qml +++ b/resources/qml/PrintSetupTooltip.qml @@ -62,6 +62,7 @@ UM.PointingRectangle MouseArea { anchors.fill: parent + acceptedButtons: Qt.NoButton hoverEnabled: true onHoveredChanged: { From 615c124960840e81ed119f4b9d9b858fda1b44e7 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 12 Aug 2020 11:07:09 +0200 Subject: [PATCH 10/17] Remove MouseArea if tooltip is not visible It should unnecessarily catch any mouse events then. And neither should the ScrollView inside. --- resources/qml/PrintSetupTooltip.qml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/resources/qml/PrintSetupTooltip.qml b/resources/qml/PrintSetupTooltip.qml index 82210b5399..91f044ceed 100644 --- a/resources/qml/PrintSetupTooltip.qml +++ b/resources/qml/PrintSetupTooltip.qml @@ -61,6 +61,8 @@ UM.PointingRectangle MouseArea { + enabled: parent.opacity > 0 + visible: enabled anchors.fill: parent acceptedButtons: Qt.NoButton hoverEnabled: true From 33ea62bb3d863bd234b415c3a54691d7d6b85110 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 12 Aug 2020 11:40:40 +0200 Subject: [PATCH 11/17] Update translation of ironing flow description MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is an improvement suggested by Kwang jun Ko from Brulé via e-mail. --- resources/i18n/ko_KR/fdmprinter.def.json.po | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/i18n/ko_KR/fdmprinter.def.json.po b/resources/i18n/ko_KR/fdmprinter.def.json.po index 52770fac4c..8cbbaf3071 100644 --- a/resources/i18n/ko_KR/fdmprinter.def.json.po +++ b/resources/i18n/ko_KR/fdmprinter.def.json.po @@ -1493,7 +1493,7 @@ msgstr "다림질 과정" #: fdmprinter.def.json msgctxt "ironing_flow description" msgid "The amount of material, relative to a normal skin line, to extrude during ironing. Keeping the nozzle filled helps filling some of the crevices of the top surface, but too much results in overextrusion and blips on the side of the surface." -msgstr "다림질하는 동안 기본 스킨 라인을 기준으로 한 재료의 양. 노즐을 가득 채우면 윗면의 틈새가 채워서포트만 표면의 과도한 압출과 틈이 너무 많이 생깁니다." +msgstr "다림질하는 동안 기본 스킨 라인을 기준으로 한 재료의 압출량. 노즐을 가득 채우면 윗면의 틈새를 채울 수 있지만 표면에 과도한 압출과 필라멘트 덩어리가 생길 수 있습니다." #: fdmprinter.def.json msgctxt "ironing_inset label" From 67ef6405240a8ef6b4abde24eb85e281b0dbb98a Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 12 Aug 2020 11:43:46 +0200 Subject: [PATCH 12/17] Improve ironing flow setting name Another suggestion for an improvement, this time by William Lee from Ultimaker. --- resources/i18n/ko_KR/fdmprinter.def.json.po | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/i18n/ko_KR/fdmprinter.def.json.po b/resources/i18n/ko_KR/fdmprinter.def.json.po index 8cbbaf3071..a423723d2a 100644 --- a/resources/i18n/ko_KR/fdmprinter.def.json.po +++ b/resources/i18n/ko_KR/fdmprinter.def.json.po @@ -1488,7 +1488,7 @@ msgstr "다림질 라인 사이의 거리." #: fdmprinter.def.json msgctxt "ironing_flow label" msgid "Ironing Flow" -msgstr "다림질 과정" +msgstr "다림질 압출량" #: fdmprinter.def.json msgctxt "ironing_flow description" From 8b59fe83d8afa87a8111b5bb9a4784a7be9b8e05 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 12 Aug 2020 14:15:38 +0200 Subject: [PATCH 13/17] Clarify description of infill mesh rank Translators found it confusing, and I think users would find so too. Hopefully this is a bit better. --- resources/definitions/fdmprinter.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 2623dff181..e1b550621e 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -6152,7 +6152,7 @@ "infill_mesh_order": { "label": "Mesh Processing Rank", - "description": "Determines the priority of this mesh when considering overlapping volumes. Areas where multiple meshes reside will be won by the lower rank mesh. An infill mesh with a higher order will modify the infill of infill meshes with lower order and normal meshes.", + "description": "Determines the priority of this mesh when considering multiple overlapping infill meshes. Areas where multiple infill meshes overlap will take on the settings of the mesh with the lowest rank. An infill mesh with a higher order will modify the infill of infill meshes with lower order and normal meshes.", "default_value": 0, "value": "1 if infill_mesh else 0", "minimum_value_warning": "1", From 99cd8ab1b0cd7a506d97d7b47b1f628fdb894d10 Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Wed, 12 Aug 2020 17:42:10 +0200 Subject: [PATCH 14/17] Show models outside of BP clearly in layerview. CURA-7586 --- plugins/SimulationView/SimulationPass.py | 15 +++++++++++++++ resources/shaders/striped.shader | 7 +++++-- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/plugins/SimulationView/SimulationPass.py b/plugins/SimulationView/SimulationPass.py index b720fc5758..f594fefbe5 100644 --- a/plugins/SimulationView/SimulationPass.py +++ b/plugins/SimulationView/SimulationPass.py @@ -32,6 +32,7 @@ class SimulationPass(RenderPass): self._current_shader = None # This shader will be the shadow or the normal depending if the user wants to see the paths or the layers self._tool_handle_shader = None self._nozzle_shader = None + self._disabled_shader = None self._old_current_layer = 0 self._old_current_path = 0 self._switching_layers = True # It tracks when the user is moving the layers' slider @@ -90,9 +91,17 @@ class SimulationPass(RenderPass): self._nozzle_shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "color.shader")) self._nozzle_shader.setUniformValue("u_color", Color(*Application.getInstance().getTheme().getColor("layerview_nozzle").getRgb())) + if not self._disabled_shader: + self._disabled_shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "striped.shader")) + self._disabled_shader.setUniformValue("u_diffuseColor1", Color(*Application.getInstance().getTheme().getColor("model_unslicable").getRgb())) + self._disabled_shader.setUniformValue("u_diffuseColor2", Color(*Application.getInstance().getTheme().getColor("model_unslicable_alt").getRgb())) + self._disabled_shader.setUniformValue("u_width", 50.0) + self._disabled_shader.setUniformValue("u_opacity", 0.6) + self.bind() tool_handle_batch = RenderBatch(self._tool_handle_shader, type = RenderBatch.RenderType.Overlay, backface_cull = True) + disabled_batch = RenderBatch(self._disabled_shader) head_position = None # Indicates the current position of the print head nozzle_node = None @@ -105,6 +114,9 @@ class SimulationPass(RenderPass): nozzle_node = node nozzle_node.setVisible(False) + elif getattr(node, "_outside_buildarea", False) and isinstance(node, SceneNode) and node.getMeshData() and node.isVisible(): + disabled_batch.addItem(node.getWorldTransformation(copy=False), node.getMeshData()) + elif isinstance(node, SceneNode) and (node.getMeshData() or node.callDecoration("isBlockSlicing")) and node.isVisible(): layer_data = node.callDecoration("getLayerData") if not layer_data: @@ -183,6 +195,9 @@ class SimulationPass(RenderPass): nozzle_batch.addItem(nozzle_node.getWorldTransformation(), mesh = nozzle_node.getMeshData()) nozzle_batch.render(self._scene.getActiveCamera()) + if len(disabled_batch.items) > 0: + disabled_batch.render(self._scene.getActiveCamera()) + # Render toolhandles on top of the layerview if len(tool_handle_batch.items) > 0: tool_handle_batch.render(self._scene.getActiveCamera()) diff --git a/resources/shaders/striped.shader b/resources/shaders/striped.shader index 71b1f7b0fa..07ce2bebe6 100644 --- a/resources/shaders/striped.shader +++ b/resources/shaders/striped.shader @@ -29,6 +29,7 @@ fragment = uniform mediump vec4 u_diffuseColor1; uniform mediump vec4 u_diffuseColor2; uniform mediump vec4 u_specularColor; + uniform mediump float u_opacity; uniform highp vec3 u_lightPosition; uniform mediump float u_shininess; uniform highp vec3 u_viewPosition; @@ -65,7 +66,7 @@ fragment = finalColor += pow(NdotR, u_shininess) * u_specularColor; gl_FragColor = finalColor; - gl_FragColor.a = 1.0; + gl_FragColor.a = u_opacity; } vertex41core = @@ -100,6 +101,7 @@ fragment41core = uniform mediump vec4 u_diffuseColor1; uniform mediump vec4 u_diffuseColor2; uniform mediump vec4 u_specularColor; + uniform mediump float u_opacity; uniform highp vec3 u_lightPosition; uniform mediump float u_shininess; uniform highp vec3 u_viewPosition; @@ -138,7 +140,7 @@ fragment41core = finalColor += pow(NdotR, u_shininess) * u_specularColor; frag_color = finalColor; - frag_color.a = 1.0; + frag_color.a = u_opacity; } [defaults] @@ -146,6 +148,7 @@ u_ambientColor = [0.3, 0.3, 0.3, 1.0] u_diffuseColor1 = [1.0, 0.5, 0.5, 1.0] u_diffuseColor2 = [0.5, 0.5, 0.5, 1.0] u_specularColor = [0.4, 0.4, 0.4, 1.0] +u_opacity = 1.0 u_shininess = 20.0 u_width = 5.0 u_vertical_stripes = 0 From 6ad696e69ade661ced9d2be10273b45ed5622d42 Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Wed, 12 Aug 2020 17:45:31 +0200 Subject: [PATCH 15/17] Fix non-printing objects in preview. --- cura/PreviewPass.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/PreviewPass.py b/cura/PreviewPass.py index ba139bb2b3..47e8c367dc 100644 --- a/cura/PreviewPass.py +++ b/cura/PreviewPass.py @@ -76,8 +76,8 @@ class PreviewPass(RenderPass): Logger.error("Unable to compile shader program: overhang.shader") if not self._non_printing_shader: + self._non_printing_shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "transparent_object.shader")) if self._non_printing_shader: - self._non_printing_shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "transparent_object.shader")) self._non_printing_shader.setUniformValue("u_diffuseColor", [0.5, 0.5, 0.5, 0.5]) self._non_printing_shader.setUniformValue("u_opacity", 0.6) From 5c8132a94452afb137ed1744df0b719246b8a125 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 13 Aug 2020 14:54:34 +0200 Subject: [PATCH 16/17] Fix translation crash --- .../UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py index c5883e59ca..767739d935 100644 --- a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py +++ b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py @@ -252,7 +252,7 @@ class CloudOutputDeviceManager: if len(new_devices) > max_disp_devices: num_hidden = len(new_devices) - max_disp_devices device_name_list = ["
  • {} ({})
  • ".format(device.name, device.printerTypeName) for device in new_devices[0:max_disp_devices]] - device_name_list.append("
  • " + self.i18n_catalog.i18ncp("info:{num_hidden} gets replaced by a number of printers", "... and {num_hidden} other", "... and {num_hidden} others", num_hidden).format(num_hidden = num_hidden) + "
  • ") + device_name_list.append("
  • " + self.i18n_catalog.i18ncp("info:{num_hidden} gets replaced by a number of printers", "... and {num_hidden} other", "... and {num_hidden} others").format(num_hidden = num_hidden) + "
  • ") device_names = "".join(device_name_list) else: device_names = "".join(["
  • {} ({})
  • ".format(device.name, device.printerTypeName) for device in new_devices]) From 1374c2faa93d83b9add7e414272facd993f7e572 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 13 Aug 2020 15:13:11 +0200 Subject: [PATCH 17/17] Properly fix the translation crash --- .../UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py index 767739d935..508476095d 100644 --- a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py +++ b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py @@ -252,7 +252,7 @@ class CloudOutputDeviceManager: if len(new_devices) > max_disp_devices: num_hidden = len(new_devices) - max_disp_devices device_name_list = ["
  • {} ({})
  • ".format(device.name, device.printerTypeName) for device in new_devices[0:max_disp_devices]] - device_name_list.append("
  • " + self.i18n_catalog.i18ncp("info:{num_hidden} gets replaced by a number of printers", "... and {num_hidden} other", "... and {num_hidden} others").format(num_hidden = num_hidden) + "
  • ") + device_name_list.append("
  • " + self.i18n_catalog.i18ncp("info:{0} gets replaced by a number of printers", "... and {0} other", "... and {0} others", num_hidden) + "
  • ") device_names = "".join(device_name_list) else: device_names = "".join(["
  • {} ({})
  • ".format(device.name, device.printerTypeName) for device in new_devices])