diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index 8e56787aeb..6934354a70 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -1,12 +1,18 @@ +--- +name: Bug report +about: Create a report to help us fix issues. +title: '' +labels: 'Type: Bug' +assignees: '' + +--- + @@ -15,14 +21,17 @@ Thank you for using Cura! (The version of the application this issue occurs with.) **Platform** -(Information about the operating system the issue occurs on. Include at least the operating system. In the case of visual glitches/issues, also include information about your graphics drivers and GPU.) +(Information about the operating system the issue occurs on. Include at least the operating system and maybe GPU.) **Printer** -(Which printer was selected in Cura? If possible, please attach project file as .curaproject.3mf.zip.) +(Which printer was selected in Cura?) **Reproduction steps** -1. Something you did. -2. Something you did next. +1. (Something you did.) +2. (Something you did next.) + +**Screenshot(s)** +(Image showing the problem, perhaps before/after images.) **Actual results** (What happens after the above steps have been followed.) @@ -30,5 +39,11 @@ Thank you for using Cura! **Expected results** (What should happen after the above steps have been followed.) +**Project file** +(For slicing bugs, provide a project which clearly shows the bug, by going to File->Save. For big files you may need to use WeTransfer or similar file sharing sites.) + +**Log file** +(See https://github.com/Ultimaker/Cura#logging-issues to find the log file to upload, or copy a relevant snippet from it.) + **Additional information** -(Extra information relevant to the issue, like screenshots. Don't forget to attach the log files with this issue report.) +(Extra information relevant to the issue.) diff --git a/.github/ISSUE_TEMPLATE/bug-report.md b/.github/ISSUE_TEMPLATE/bug-report.md index 749b8037c1..6934354a70 100644 --- a/.github/ISSUE_TEMPLATE/bug-report.md +++ b/.github/ISSUE_TEMPLATE/bug-report.md @@ -14,10 +14,6 @@ Before filing, PLEASE check if the issue already exists (either open or closed) Also, please note the application version in the title of the issue. For example: "[3.2.1] Cannot connect to 3rd-party printer". Please do NOT write things like "Request:" or "[BUG]" in the title; this is what labels are for. -It is also helpful to attach a project (.3mf or .curaproject) file and Cura log file so we can debug issues quicker. Information about how to find the log file can be found at https://github.com/Ultimaker/Cura#logging-issues - -To upload a project, try changing the extension to e.g. .curaproject.3mf.zip so that GitHub accepts uploading the file. Otherwise, we recommend http://wetransfer.com, but other file hosts like Google Drive or Dropbox work well too. - Thank you for using Cura! --> @@ -25,14 +21,17 @@ Thank you for using Cura! (The version of the application this issue occurs with.) **Platform** -(Information about the operating system the issue occurs on. Include at least the operating system. In the case of visual glitches/issues, also include information about your graphics drivers and GPU.) +(Information about the operating system the issue occurs on. Include at least the operating system and maybe GPU.) **Printer** -(Which printer was selected in Cura? If possible, please attach project file as .curaproject.3mf.zip.) +(Which printer was selected in Cura?) **Reproduction steps** -1. Something you did. -2. Something you did next. +1. (Something you did.) +2. (Something you did next.) + +**Screenshot(s)** +(Image showing the problem, perhaps before/after images.) **Actual results** (What happens after the above steps have been followed.) @@ -40,5 +39,11 @@ Thank you for using Cura! **Expected results** (What should happen after the above steps have been followed.) +**Project file** +(For slicing bugs, provide a project which clearly shows the bug, by going to File->Save. For big files you may need to use WeTransfer or similar file sharing sites.) + +**Log file** +(See https://github.com/Ultimaker/Cura#logging-issues to find the log file to upload, or copy a relevant snippet from it.) + **Additional information** -(Extra information relevant to the issue, like screenshots. Don't forget to attach the log files with this issue report.) +(Extra information relevant to the issue.) diff --git a/cura/CrashHandler.py b/cura/CrashHandler.py index 1d85a1da54..1ec00787d7 100644 --- a/cura/CrashHandler.py +++ b/cura/CrashHandler.py @@ -25,6 +25,8 @@ from UM.View.GL.OpenGL import OpenGL from UM.i18n import i18nCatalog from UM.Resources import Resources +from cura import ApplicationMetadata + catalog = i18nCatalog("cura") MYPY = False @@ -181,6 +183,7 @@ class CrashHandler: self.cura_version = catalog.i18nc("@label unknown version of Cura", "Unknown") crash_info = "" + catalog.i18nc("@label Cura version number", "Cura version") + ": " + str(self.cura_version) + "
" + crash_info += "" + catalog.i18nc("@label Cura build type", "Cura build type") + ": " + str(ApplicationMetadata.CuraBuildType) + "
" crash_info += "" + catalog.i18nc("@label Type of platform", "Platform") + ": " + str(platform.platform()) + "
" crash_info += "" + catalog.i18nc("@label", "Qt version") + ": " + str(QT_VERSION_STR) + "
" crash_info += "" + catalog.i18nc("@label", "PyQt version") + ": " + str(PYQT_VERSION_STR) + "
" @@ -191,6 +194,7 @@ class CrashHandler: group.setLayout(layout) self.data["cura_version"] = self.cura_version + self.data["cura_build_type"] = ApplicationMetadata.CuraBuildType self.data["os"] = {"type": platform.system(), "version": platform.version()} self.data["qt_version"] = QT_VERSION_STR self.data["pyqt_version"] = PYQT_VERSION_STR diff --git a/cura/Machines/MachineNode.py b/cura/Machines/MachineNode.py index 8d69ffdc8d..92f71b409b 100644 --- a/cura/Machines/MachineNode.py +++ b/cura/Machines/MachineNode.py @@ -140,7 +140,7 @@ class MachineNode(ContainerNode): elif groups_by_name[name].intent_category == "default": # Intent category should be stored as "default" if everything is default or as the intent if any of the extruder have an actual intent. groups_by_name[name].intent_category = quality_changes.get("intent_category", "default") - if quality_changes.get("position") is not None: # An extruder profile. + if quality_changes.get("position") is not None and quality_changes.get("position") != "None": # An extruder profile. groups_by_name[name].metadata_per_extruder[int(quality_changes["position"])] = quality_changes else: # Global profile. groups_by_name[name].metadata_for_global = quality_changes diff --git a/cura/Machines/Models/IntentModel.py b/cura/Machines/Models/IntentModel.py index f5560bc94e..986f28a826 100644 --- a/cura/Machines/Models/IntentModel.py +++ b/cura/Machines/Models/IntentModel.py @@ -7,6 +7,7 @@ from PyQt5.QtCore import Qt, QObject, pyqtProperty, pyqtSignal import cura.CuraApplication from UM.Qt.ListModel import ListModel from UM.Settings.ContainerRegistry import ContainerRegistry +from UM.Logger import Logger from cura.Machines.ContainerTree import ContainerTree from cura.Machines.MaterialNode import MaterialNode from cura.Machines.Models.MachineModelUtils import fetchLayerHeight @@ -101,6 +102,9 @@ class IntentModel(ListModel): for extruder in global_stack.extruderList: active_variant_name = extruder.variant.getMetaDataEntry("name") + if active_variant_name not in machine_node.variants: + Logger.log("w", "Could not find the variant %s", active_variant_name) + continue active_variant_node = machine_node.variants[active_variant_name] active_material_node = active_variant_node.materials[extruder.material.getMetaDataEntry("base_file")] nodes.add(active_material_node) diff --git a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py index 392df7bded..60be5bc8f3 100644 --- a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py +++ b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py @@ -154,7 +154,7 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): part = QHttpPart() if not content_header.startswith("form-data;"): - content_header = "form_data; " + content_header + content_header = "form-data; " + content_header part.setHeader(QNetworkRequest.ContentDispositionHeader, content_header) if content_type is not None: diff --git a/cura/Settings/IntentManager.py b/cura/Settings/IntentManager.py index 732e22d1bd..5133b401b4 100644 --- a/cura/Settings/IntentManager.py +++ b/cura/Settings/IntentManager.py @@ -39,7 +39,11 @@ class IntentManager(QObject): # an empty list if nothing was found. def intentMetadatas(self, definition_id: str, nozzle_name: str, material_base_file: str) -> List[Dict[str, Any]]: intent_metadatas = [] # type: List[Dict[str, Any]] - materials = ContainerTree.getInstance().machines[definition_id].variants[nozzle_name].materials + try: + materials = ContainerTree.getInstance().machines[definition_id].variants[nozzle_name].materials + except KeyError: + Logger.log("w", "Unable to find the machine %s or the variant %s", definition_id, nozzle_name) + materials = {} if material_base_file not in materials: return intent_metadatas diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index d7a7586115..de6e270a86 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -1247,6 +1247,8 @@ class MachineManager(QObject): if metadata_key in new_machine.getMetaData(): continue # Don't copy the already preset stuff. new_machine.setMetaDataEntry(metadata_key, self._global_container_stack.getMetaDataEntry(metadata_key)) + # Special case, group_id should be overwritten! + new_machine.setMetaDataEntry("group_id", self._global_container_stack.getMetaDataEntry("group_id")) else: Logger.log("i", "Found a %s with the key %s. Let's use it!", machine_name, self.activeMachineNetworkKey()) diff --git a/plugins/PostProcessingPlugin/scripts/DisplayRemainingTimeOnLCD.py b/plugins/PostProcessingPlugin/scripts/DisplayRemainingTimeOnLCD.py index 9152ab65f9..7d9af10925 100644 --- a/plugins/PostProcessingPlugin/scripts/DisplayRemainingTimeOnLCD.py +++ b/plugins/PostProcessingPlugin/scripts/DisplayRemainingTimeOnLCD.py @@ -1,7 +1,7 @@ # Cura PostProcessingPlugin # Author: Mathias Lyngklip Kjeldgaard # Date: July 31, 2019 -# Modified: --- +# Modified: November 26, 2019 # Description: This plugin displayes the remaining time on the LCD of the printer # using the estimated print-time generated by Cura. @@ -23,7 +23,7 @@ class DisplayRemainingTimeOnLCD(Script): def getSettingDataString(self): return """{ - "name":"Disaplay Remaining Time on LCD", + "name":"Display Remaining Time on LCD", "key":"DisplayRemainingTimeOnLCD", "metadata": {}, "version": 2, @@ -32,7 +32,7 @@ class DisplayRemainingTimeOnLCD(Script): "TurnOn": { "label": "Enable", - "description": "When enabled, It will write Time Left: HHMMSS on the display", + "description": "When enabled, It will write Time Left: HHMMSS on the display. This is updated every layer.", "type": "bool", "default_value": false } diff --git a/plugins/PostProcessingPlugin/scripts/PauseAtHeight.py b/plugins/PostProcessingPlugin/scripts/PauseAtHeight.py index 499214a0e9..17b4de88dd 100644 --- a/plugins/PostProcessingPlugin/scripts/PauseAtHeight.py +++ b/plugins/PostProcessingPlugin/scripts/PauseAtHeight.py @@ -219,7 +219,7 @@ class PauseAtHeight(Script): current_height = current_z - layer_0_z if current_height < pause_height: - break # Try the next layer. + continue # Scan the enitre layer, z-changes are not always on the same/first line. # Pause at layer else: diff --git a/plugins/SliceInfoPlugin/SliceInfo.py b/plugins/SliceInfoPlugin/SliceInfo.py index acab445fd6..af8a8b9853 100755 --- a/plugins/SliceInfoPlugin/SliceInfo.py +++ b/plugins/SliceInfoPlugin/SliceInfo.py @@ -18,6 +18,8 @@ from UM.Logger import Logger from UM.PluginRegistry import PluginRegistry from UM.Qt.Duration import DurationFormat +from cura import ApplicationMetadata + from .SliceInfoJob import SliceInfoJob @@ -119,6 +121,7 @@ class SliceInfo(QObject, Extension): data["time_stamp"] = time.time() data["schema_version"] = 0 data["cura_version"] = application.getVersion() + data["cura_build_type"] = ApplicationMetadata.CuraBuildType active_mode = Application.getInstance().getPreferences().getValue("cura/active_mode") if active_mode == 0: diff --git a/plugins/VersionUpgrade/VersionUpgrade41to42/VersionUpgrade41to42.py b/plugins/VersionUpgrade/VersionUpgrade41to42/VersionUpgrade41to42.py index 1151d7101a..305cce16c6 100644 --- a/plugins/VersionUpgrade/VersionUpgrade41to42/VersionUpgrade41to42.py +++ b/plugins/VersionUpgrade/VersionUpgrade41to42/VersionUpgrade41to42.py @@ -239,7 +239,7 @@ class VersionUpgrade41to42(VersionUpgrade): # # This renames the renamed settings in the containers. def upgradeInstanceContainer(self, serialized: str, filename: str) -> Tuple[List[str], List[str]]: - parser = configparser.ConfigParser(interpolation = None) + parser = configparser.ConfigParser(interpolation = None, comment_prefixes=()) parser.read_string(serialized) # Update version number. diff --git a/plugins/VersionUpgrade/VersionUpgrade42to43/VersionUpgrade42to43.py b/plugins/VersionUpgrade/VersionUpgrade42to43/VersionUpgrade42to43.py index c15f1e0468..d6489f6d8b 100644 --- a/plugins/VersionUpgrade/VersionUpgrade42to43/VersionUpgrade42to43.py +++ b/plugins/VersionUpgrade/VersionUpgrade42to43/VersionUpgrade42to43.py @@ -104,7 +104,7 @@ class VersionUpgrade42to43(VersionUpgrade): # # This renames the renamed settings in the containers. def upgradeInstanceContainer(self, serialized: str, filename: str) -> Tuple[List[str], List[str]]: - parser = configparser.ConfigParser(interpolation = None) + parser = configparser.ConfigParser(interpolation = None, comment_prefixes=()) parser.read_string(serialized) # Update version number. diff --git a/plugins/VersionUpgrade/VersionUpgrade43to44/VersionUpgrade43to44.py b/plugins/VersionUpgrade/VersionUpgrade43to44/VersionUpgrade43to44.py index 40927fe3a0..8b69852cb2 100644 --- a/plugins/VersionUpgrade/VersionUpgrade43to44/VersionUpgrade43to44.py +++ b/plugins/VersionUpgrade/VersionUpgrade43to44/VersionUpgrade43to44.py @@ -52,7 +52,7 @@ class VersionUpgrade43to44(VersionUpgrade): # # This renames the renamed settings in the containers. def upgradeInstanceContainer(self, serialized: str, filename: str) -> Tuple[List[str], List[str]]: - parser = configparser.ConfigParser(interpolation = None) + parser = configparser.ConfigParser(interpolation = None, comment_prefixes=()) parser.read_string(serialized) # Update version number. diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index 948751ab8b..52b204affc 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -1104,6 +1104,7 @@ class XmlMaterialProfile(InstanceContainer): "anti ooze retract speed": "material_anti_ooze_retraction_speed", "break preparation position": "material_break_preparation_retracted_position", "break preparation speed": "material_break_preparation_speed", + "break preparation temperature": "material_break_preparation_temperature", "break position": "material_break_retracted_position", "break speed": "material_break_speed", "break temperature": "material_break_temperature" diff --git a/resources/definitions/creality_ender3.def.json b/resources/definitions/creality_ender3.def.json index 691d590caa..2e2bebb798 100644 --- a/resources/definitions/creality_ender3.def.json +++ b/resources/definitions/creality_ender3.def.json @@ -9,9 +9,14 @@ }, "overrides": { "machine_name": { "default_value": "Creality Ender-3" }, - "machine_width": { "default_value": 220 }, - "machine_depth": { "default_value": 220 }, + "machine_width": { "default_value": 235 }, + "machine_depth": { "default_value": 235 }, "machine_height": { "default_value": 250 }, + "machine_disallowed_areas": { + "default_value": [ + [[-117.5, 117.5], [-117.5, 108], [117.5, 108], [117.5, 117.5]], + [[-117.5, -108], [-117.5, -117.5], [117.5, -117.5], [117.5, -108]] + ]}, "machine_head_with_fans_polygon": { "default_value": [ [-26, 34], [-26, -32], @@ -22,4 +27,4 @@ "gantry_height": { "value": 25 } } -} \ No newline at end of file +} diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 8d39f11c4c..1c84e99d24 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -2337,6 +2337,20 @@ "settable_per_mesh": false, "settable_per_extruder": true }, + "material_break_preparation_temperature": + { + "label": "Break Preparation Temperature", + "description": "The temperature used to purge material, should be roughly equal to the highest possible printing temperature.", + "type": "float", + "unit": "°C", + "default_value": 50, + "value": "material_print_temperature", + "enabled": false, + "minimum_value": "-273.15", + "maximum_value_warning": "300", + "settable_per_mesh": false, + "settable_per_extruder": true + }, "material_break_retracted_position": { "label": "Break Retracted Position", @@ -2695,7 +2709,6 @@ "minimum_value": "0", "minimum_value_warning": "line_width * 1.5", "maximum_value_warning": "10", - "enabled": false, "settable_per_mesh": false, "settable_per_extruder": true }, @@ -7123,6 +7136,17 @@ "enabled": "bridge_settings_enabled", "settable_per_mesh": true }, + "bridge_sparse_infill_max_density": + { + "label": "Bridge Sparse Infill Max Density", + "description": "Maximum density of infill considered to be sparse. Skin over sparse infill is considered to be unsupported and so may be treated as a bridge skin.", + "unit": "%", + "type": "float", + "default_value": 0, + "minimum_value": "0", + "enabled": "bridge_settings_enabled", + "settable_per_mesh": true + }, "bridge_wall_coast": { "label": "Bridge Wall Coasting", diff --git a/resources/definitions/vertex_k8400.def.json b/resources/definitions/vertex_k8400.def.json index b2a6374f83..bbeb8510ba 100644 --- a/resources/definitions/vertex_k8400.def.json +++ b/resources/definitions/vertex_k8400.def.json @@ -50,10 +50,10 @@ "default_value": "RepRap (Marlin/Sprinter)" }, "machine_start_gcode": { - "default_value": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG1 Z15.0 F9000 ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E3 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F9000\n;Put printing message on LCD screen\nM117 Printing..." + "default_value": "M104 T0 S{material_print_temperature_layer_0}\nG28 ;Home extruder\nG90 ;Absolute positioning\nM82 ;Extruder in absolute mode\nG1 Z1 F100\nG92 E0 ;Reset extruder position\nM109 T0 S{material_print_temperature_layer_0}\nG1 E20 F100\nG92 E0 ;Reset extruder position" }, "machine_end_gcode": { - "default_value": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning" + "default_value": "G1 X0 Y0 Z130 ;Get extruder out of way\nM107 ;Turn off fan\n;Disable all extruders\nG91 ;Relative positioning\nT0\nG1 E-1 ;Reduce filament pressure\nM104 T0 S0\nG90 ;Absolute positioning\nG92 E0 ;Reset extruder position\nM140 S0 ;Disable heated bed\nM84 ;Turn steppers off" } } } \ No newline at end of file diff --git a/resources/i18n/es_ES/cura.po b/resources/i18n/es_ES/cura.po index 8956c138ef..f971746925 100644 --- a/resources/i18n/es_ES/cura.po +++ b/resources/i18n/es_ES/cura.po @@ -2890,7 +2890,7 @@ msgstr "Coste del filamento" #: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:276 msgctxt "@label" msgid "Filament weight" -msgstr "Anchura del filamento" +msgstr "Peso del filamento" #: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:294 msgctxt "@label" diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index f13f9e0ce9..8dcf60018f 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -21,7 +21,8 @@ UM.MainWindow id: base // Cura application window title - title: catalog.i18nc("@title:window", "Ultimaker Cura") + title: PrintInformation.jobName + " - " + catalog.i18nc("@title:window", CuraApplication.applicationDisplayName) + backgroundColor: UM.Theme.getColor("viewport_background") UM.I18nCatalog diff --git a/resources/qml/Dialogs/WorkspaceSummaryDialog.qml b/resources/qml/Dialogs/WorkspaceSummaryDialog.qml index dfc6e3a9ca..6fe9607274 100644 --- a/resources/qml/Dialogs/WorkspaceSummaryDialog.qml +++ b/resources/qml/Dialogs/WorkspaceSummaryDialog.qml @@ -177,6 +177,7 @@ UM.Dialog return catalog.i18nc("@action:label", "Extruder %1").arg(extruder_id) } font.bold: true + enabled: modelData.isEnabled } Row { @@ -194,6 +195,7 @@ UM.Dialog return catalog.i18nc("@action:label", "Material") } width: Math.floor(scroll.width / 3) | 0 + enabled: modelData.isEnabled } Label { @@ -205,7 +207,7 @@ UM.Dialog } return materialName } - + enabled: modelData.isEnabled width: Math.floor(scroll.width / 3) | 0 } } diff --git a/resources/qml/WelcomePages/AddLocalPrinterScrollView.qml b/resources/qml/WelcomePages/AddLocalPrinterScrollView.qml index e4a7a98308..fce616472f 100644 --- a/resources/qml/WelcomePages/AddLocalPrinterScrollView.qml +++ b/resources/qml/WelcomePages/AddLocalPrinterScrollView.qml @@ -91,7 +91,8 @@ Item // individual item has a dynamic change on its visibility, the ListView doesn't redraw itself. // The default value of cacheBuffer is platform-dependent, so we explicitly disable it here. cacheBuffer: 0 - + boundsBehavior: Flickable.StopAtBounds + flickDeceleration: 20000 // To prevent the flicking behavior. model: UM.DefinitionContainersModel { id: machineDefinitionsModel diff --git a/resources/qml/WelcomePages/AddNetworkPrinterScrollView.qml b/resources/qml/WelcomePages/AddNetworkPrinterScrollView.qml index 95eff0465a..5a4f5ec7b7 100644 --- a/resources/qml/WelcomePages/AddNetworkPrinterScrollView.qml +++ b/resources/qml/WelcomePages/AddNetworkPrinterScrollView.qml @@ -71,7 +71,8 @@ Item section.property: "modelData.sectionName" section.criteria: ViewSection.FullString section.delegate: sectionHeading - + boundsBehavior: Flickable.StopAtBounds + flickDeceleration: 20000 // To prevent the flicking behavior. cacheBuffer: 1000000 // Set a large cache to effectively just cache every list item. Component.onCompleted: