diff --git a/cura/BuildVolume.py b/cura/BuildVolume.py index e85a852441..38922ab4a5 100644 --- a/cura/BuildVolume.py +++ b/cura/BuildVolume.py @@ -1,6 +1,7 @@ # Copyright (c) 2015 Ultimaker B.V. # Cura is released under the terms of the AGPLv3 or higher. +from cura.Settings.ExtruderManager import ExtruderManager from UM.i18n import i18nCatalog from UM.Scene.Platform import Platform from UM.Scene.SceneNode import SceneNode @@ -20,6 +21,10 @@ catalog = i18nCatalog("cura") import numpy +# Setting for clearance around the prime +PRIME_CLEARANCE = 10 + + def approximatedCircleVertices(r): """ Return vertices from an approximated circle. @@ -281,6 +286,29 @@ class BuildVolume(SceneNode): disallowed_areas = self._active_container_stack.getProperty("machine_disallowed_areas", "value") areas = [] + # Add extruder prime locations as disallowed areas. + # Probably needs some rework after coordinate system change. + machine_definition = self._active_container_stack.getBottom() + current_machine_id = machine_definition.getId() + extruder_manager = ExtruderManager.getInstance() + extruders = extruder_manager.getMachineExtruders(current_machine_id) + machine_width = machine_definition.getProperty("machine_width", "value") + machine_depth = machine_definition.getProperty("machine_depth", "value") + for single_extruder in extruders: + extruder_prime_pos_x = single_extruder.getProperty("extruder_prime_pos_x", "value") + extruder_prime_pos_y = single_extruder.getProperty("extruder_prime_pos_y", "value") + # TODO: calculate everything in CuraEngine/Firmware/lower left as origin coordinates. + # Here we transform the extruder prime pos (lower left as origin) to Cura coordinates + # (center as origin, y from back to front) + prime_x = extruder_prime_pos_x - machine_width / 2 + prime_y = machine_depth / 2 - extruder_prime_pos_y + disallowed_areas.append([ + [prime_x - PRIME_CLEARANCE, prime_y - PRIME_CLEARANCE], + [prime_x + PRIME_CLEARANCE, prime_y - PRIME_CLEARANCE], + [prime_x + PRIME_CLEARANCE, prime_y + PRIME_CLEARANCE], + [prime_x - PRIME_CLEARANCE, prime_y + PRIME_CLEARANCE], + ]) + skirt_size = self._getSkirtSize(self._active_container_stack) if disallowed_areas: diff --git a/cura/Settings/ExtruderManager.py b/cura/Settings/ExtruderManager.py index 079b01598e..744a6811c5 100644 --- a/cura/Settings/ExtruderManager.py +++ b/cura/Settings/ExtruderManager.py @@ -187,18 +187,26 @@ class ExtruderManager(QObject): # Find a quality to use for this extruder. quality = container_registry.getEmptyInstanceContainer() - # First add any quality. Later, overwrite with preference if the preference is valid. - qualities = container_registry.findInstanceContainers(type = "quality") - if len(qualities) >= 1: - quality = qualities[0] - preferred_quality_id = machine_definition.getMetaDataEntry("preferred_quality") - if preferred_quality_id: - preferred_quality = container_registry.findInstanceContainers(id = preferred_quality_id, type = "quality") - if len(preferred_quality) >= 1: - quality = preferred_quality[0] - else: - UM.Logger.log("w", "The preferred quality \"%s\" of machine %s doesn't exist or is not a quality profile.", preferred_quality_id, machine_id) - # And leave it at the default quality. + search_criteria = { "type": "quality" } + if machine_definition.getMetaDataEntry("has_machine_quality"): + search_criteria["definition"] = machine_definition.id + if machine_definition.getMetaDataEntry("has_materials") and material: + search_criteria["material"] = material.id + else: + search_criteria["definition"] = "fdmprinter" + + preferred_quality = machine_definition.getMetaDataEntry("preferred_quality") + if preferred_quality: + search_criteria["id"] = preferred_quality + + containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(**search_criteria) + if not containers and preferred_quality: + UM.Logger.log("w", "The preferred quality \"%s\" of machine %s doesn't exist or is not a quality profile.", preferred_quality, machine_id) + search_criteria.pop("id", None) + containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(**search_criteria) + if containers: + quality = containers[0] + container_stack.addContainer(quality) user_profile = container_registry.findInstanceContainers(type = "user", extruder = extruder_stack_id) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 4b3141f900..2b2135e4a3 100644 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -788,13 +788,10 @@ class MachineManager(QObject): return self._empty_quality_container def _onMachineNameChanged(self): - print("machine name changed") self.globalContainerChanged.emit() def _onMaterialNameChanged(self): - print("material name changed") self.activeMaterialChanged.emit() def _onQualityNameChanged(self): - print("quality name changed") self.activeQualityChanged.emit() diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index e777414459..d2f34da9a3 100644 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -89,6 +89,7 @@ class CuraEngineBackend(Backend): self._always_restart = True #Always restart the engine when starting a new slice. Don't keep the process running. TODO: Fix engine statelessness. self._process_layers_job = None #The currently active job to process layers, or None if it is not processing layers. + self._backend_log_max_lines = 200 # Maximal count of lines to buffer self._error_message = None #Pop-up message that shows errors. self.backendQuit.connect(self._onBackendQuit) diff --git a/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml b/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml index 34544dca75..14ed1e2c51 100644 --- a/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml +++ b/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml @@ -196,7 +196,6 @@ Cura.MachineAction visible: checkupMachineAction.usbConnected Button { - height: 20 text: checkupMachineAction.heatupHotendStarted ? catalog.i18nc("@action:button","Stop Heating") : catalog.i18nc("@action:button","Start Heating") onClicked: { @@ -259,7 +258,6 @@ Cura.MachineAction Button { text: checkupMachineAction.heatupBedStarted ?catalog.i18nc("@action:button","Stop Heating") : catalog.i18nc("@action:button","Start Heating") - height: 20 onClicked: { if (checkupMachineAction.heatupBedStarted) diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index 604f8e0b92..8404db01fa 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -22,6 +22,18 @@ UM.MainWindow Component.onCompleted: { Printer.setMinimumWindowSize(UM.Theme.getSize("window_minimum_size")) + + // Workaround silly issues with QML Action's shortcut property. + // + // Currently, there is no way to define shortcuts as "Application Shortcut". + // This means that all Actions are "Window Shortcuts". The code for this + // implements a rather naive check that just checks if any of the action's parents + // are a window. Since the "Actions" object is a singleton it has no parent by + // default. If we set its parent to something contained in this window, the + // shortcut will activate properly because one of its parents is a window. + // + // This has been fixed for QtQuick Controls 2 since the Shortcut item has a context property. + Cura.Actions.parent = backgroundItem } Item @@ -517,64 +529,6 @@ UM.MainWindow } } - // Workaround for shortcuts not working for singletons. - // The main window eats all the events, so we need to pass them manually. - Action - { - shortcut: StandardKey.Undo - onTriggered: Cura.Actions.undo.trigger() - } - Action - { - shortcut: StandardKey.Redo - onTriggered: Cura.Actions.redo.trigger() - } - Action - { - shortcut: StandardKey.Quit - onTriggered: Cura.Actions.quit.trigger() - } - Action - { - shortcut: StandardKey.Help - onTriggered: Cura.Actions.help.trigger() - } - Action - { - shortcut: StandardKey.Delete - onTriggered: Cura.Actions.delete.trigger() - } - Action - { - shortcut: "Ctrl+G" - onTriggered: Cura.Actions.groupObjects.trigger() - } - Action - { - shortcut: "Ctrl+Shift+G" - onTriggered: Cura.Actions.unGroupObjects.trigger() - } - Action - { - shortcut: "Ctrl+Alt+G" - onTriggered: Cura.Actions.mergeObjects.trigger() - } - Action - { - shortcut: "Ctrl+D" - onTriggered: Cura.Actions.deleteAll.trigger() - } - Action - { - shortcut: StandardKey.Open - onTriggered: Cura.Actions.open.trigger() - } - Action - { - shortcut: StandardKey.WhatsThis - onTriggered: Cura.Actions.showEngineLog.trigger() - } - Menu { id: objectContextMenu;