mirror of
https://git.mirrors.martin98.com/https://github.com/Ultimaker/Cura
synced 2025-05-23 13:09:28 +08:00
Merge branch 'master' into docker
This commit is contained in:
commit
96b40433a9
@ -10,6 +10,8 @@ from UM.Logger import Logger
|
|||||||
from UM.Util import parseBool
|
from UM.Util import parseBool
|
||||||
from UM.Settings.InstanceContainer import InstanceContainer
|
from UM.Settings.InstanceContainer import InstanceContainer
|
||||||
|
|
||||||
|
from cura.Settings.ExtruderStack import ExtruderStack
|
||||||
|
|
||||||
from .QualityGroup import QualityGroup
|
from .QualityGroup import QualityGroup
|
||||||
from .QualityNode import QualityNode
|
from .QualityNode import QualityNode
|
||||||
|
|
||||||
@ -393,6 +395,50 @@ class QualityManager(QObject):
|
|||||||
new_id = self._container_registry.uniqueName(container.getId())
|
new_id = self._container_registry.uniqueName(container.getId())
|
||||||
self._container_registry.addContainer(container.duplicate(new_id, new_name))
|
self._container_registry.addContainer(container.duplicate(new_id, new_name))
|
||||||
|
|
||||||
|
## Create quality changes containers from the user containers in the active stacks.
|
||||||
|
#
|
||||||
|
# This will go through the global and extruder stacks and create quality_changes containers from
|
||||||
|
# the user containers in each stack. These then replace the quality_changes containers in the
|
||||||
|
# stack and clear the user settings.
|
||||||
|
@pyqtSlot(str)
|
||||||
|
def createQualityChanges(self, base_name):
|
||||||
|
machine_manager = Application.getInstance().getMachineManager()
|
||||||
|
|
||||||
|
global_stack = machine_manager.activeMachine
|
||||||
|
if not global_stack:
|
||||||
|
return
|
||||||
|
|
||||||
|
active_quality_name = machine_manager.activeQualityOrQualityChangesName
|
||||||
|
if active_quality_name == "":
|
||||||
|
Logger.log("w", "No quality container found in stack %s, cannot create profile", global_stack.getId())
|
||||||
|
return
|
||||||
|
|
||||||
|
machine_manager.blurSettings.emit()
|
||||||
|
if base_name is None or base_name == "":
|
||||||
|
base_name = active_quality_name
|
||||||
|
unique_name = self._container_registry.uniqueName(base_name)
|
||||||
|
|
||||||
|
# Go through the active stacks and create quality_changes containers from the user containers.
|
||||||
|
stack_list = [global_stack] + list(global_stack.extruders.values())
|
||||||
|
for stack in stack_list:
|
||||||
|
user_container = stack.userChanges
|
||||||
|
quality_container = stack.quality
|
||||||
|
quality_changes_container = stack.qualityChanges
|
||||||
|
if not quality_container or not quality_changes_container:
|
||||||
|
Logger.log("w", "No quality or quality changes container found in stack %s, ignoring it", stack.getId())
|
||||||
|
continue
|
||||||
|
|
||||||
|
extruder_definition_id = None
|
||||||
|
if isinstance(stack, ExtruderStack):
|
||||||
|
extruder_definition_id = stack.definition.getId()
|
||||||
|
quality_type = quality_container.getMetaDataEntry("quality_type")
|
||||||
|
new_changes = self._createQualityChanges(quality_type, unique_name, global_stack, extruder_definition_id)
|
||||||
|
from cura.Settings.ContainerManager import ContainerManager
|
||||||
|
ContainerManager.getInstance()._performMerge(new_changes, quality_changes_container, clear_settings = False)
|
||||||
|
ContainerManager.getInstance()._performMerge(new_changes, user_container)
|
||||||
|
|
||||||
|
self._container_registry.addContainer(new_changes)
|
||||||
|
|
||||||
#
|
#
|
||||||
# Create a quality changes container with the given setup.
|
# Create a quality changes container with the given setup.
|
||||||
#
|
#
|
||||||
|
@ -219,6 +219,9 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice):
|
|||||||
reply.uploadProgress.connect(onProgress)
|
reply.uploadProgress.connect(onProgress)
|
||||||
self._registerOnFinishedCallback(reply, onFinished)
|
self._registerOnFinishedCallback(reply, onFinished)
|
||||||
|
|
||||||
|
|
||||||
|
return reply
|
||||||
|
|
||||||
def postForm(self, target: str, header_data: str, body_data: bytes, onFinished: Optional[Callable[[Any, QNetworkReply], None]], onProgress: Callable = None) -> None:
|
def postForm(self, target: str, header_data: str, body_data: bytes, onFinished: Optional[Callable[[Any, QNetworkReply], None]], onProgress: Callable = None) -> None:
|
||||||
post_part = QHttpPart()
|
post_part = QHttpPart()
|
||||||
post_part.setHeader(QNetworkRequest.ContentDispositionHeader, header_data)
|
post_part.setHeader(QNetworkRequest.ContentDispositionHeader, header_data)
|
||||||
|
@ -103,32 +103,32 @@ class PrinterOutputModel(QObject):
|
|||||||
self._head_position = Vector(x, y, z)
|
self._head_position = Vector(x, y, z)
|
||||||
self.headPositionChanged.emit()
|
self.headPositionChanged.emit()
|
||||||
|
|
||||||
@pyqtProperty("long", "long", "long")
|
@pyqtProperty(float, float, float)
|
||||||
@pyqtProperty("long", "long", "long", "long")
|
@pyqtProperty(float, float, float, float)
|
||||||
def setHeadPosition(self, x, y, z, speed = 3000):
|
def setHeadPosition(self, x, y, z, speed = 3000):
|
||||||
self.updateHeadPosition(x, y, z)
|
self.updateHeadPosition(x, y, z)
|
||||||
self._controller.setHeadPosition(self, x, y, z, speed)
|
self._controller.setHeadPosition(self, x, y, z, speed)
|
||||||
|
|
||||||
@pyqtProperty("long")
|
@pyqtProperty(float)
|
||||||
@pyqtProperty("long", "long")
|
@pyqtProperty(float, float)
|
||||||
def setHeadX(self, x, speed = 3000):
|
def setHeadX(self, x, speed = 3000):
|
||||||
self.updateHeadPosition(x, self._head_position.y, self._head_position.z)
|
self.updateHeadPosition(x, self._head_position.y, self._head_position.z)
|
||||||
self._controller.setHeadPosition(self, x, self._head_position.y, self._head_position.z, speed)
|
self._controller.setHeadPosition(self, x, self._head_position.y, self._head_position.z, speed)
|
||||||
|
|
||||||
@pyqtProperty("long")
|
@pyqtProperty(float)
|
||||||
@pyqtProperty("long", "long")
|
@pyqtProperty(float, float)
|
||||||
def setHeadY(self, y, speed = 3000):
|
def setHeadY(self, y, speed = 3000):
|
||||||
self.updateHeadPosition(self._head_position.x, y, self._head_position.z)
|
self.updateHeadPosition(self._head_position.x, y, self._head_position.z)
|
||||||
self._controller.setHeadPosition(self, self._head_position.x, y, self._head_position.z, speed)
|
self._controller.setHeadPosition(self, self._head_position.x, y, self._head_position.z, speed)
|
||||||
|
|
||||||
@pyqtProperty("long")
|
@pyqtProperty(float)
|
||||||
@pyqtProperty("long", "long")
|
@pyqtProperty(float, float)
|
||||||
def setHeadZ(self, z, speed = 3000):
|
def setHeadZ(self, z, speed = 3000):
|
||||||
self.updateHeadPosition(self._head_position.x, self._head_position.y, z)
|
self.updateHeadPosition(self._head_position.x, self._head_position.y, z)
|
||||||
self._controller.setHeadPosition(self, self._head_position.x, self._head_position.y, z, speed)
|
self._controller.setHeadPosition(self, self._head_position.x, self._head_position.y, z, speed)
|
||||||
|
|
||||||
@pyqtSlot("long", "long", "long")
|
@pyqtSlot(float, float, float)
|
||||||
@pyqtSlot("long", "long", "long", "long")
|
@pyqtSlot(float, float, float, float)
|
||||||
def moveHead(self, x = 0, y = 0, z = 0, speed = 3000):
|
def moveHead(self, x = 0, y = 0, z = 0, speed = 3000):
|
||||||
self._controller.moveHead(self, x, y, z, speed)
|
self._controller.moveHead(self, x, y, z, speed)
|
||||||
|
|
||||||
|
@ -341,46 +341,6 @@ class ContainerManager(QObject):
|
|||||||
for container in send_emits_containers:
|
for container in send_emits_containers:
|
||||||
container.sendPostponedEmits()
|
container.sendPostponedEmits()
|
||||||
|
|
||||||
## Create quality changes containers from the user containers in the active stacks.
|
|
||||||
#
|
|
||||||
# This will go through the global and extruder stacks and create quality_changes containers from
|
|
||||||
# the user containers in each stack. These then replace the quality_changes containers in the
|
|
||||||
# stack and clear the user settings.
|
|
||||||
@pyqtSlot(str)
|
|
||||||
def createQualityChanges(self, base_name):
|
|
||||||
global_stack = Application.getInstance().getGlobalContainerStack()
|
|
||||||
if not global_stack:
|
|
||||||
return
|
|
||||||
|
|
||||||
active_quality_name = self._machine_manager.activeQualityOrQualityChangesName
|
|
||||||
if active_quality_name == "":
|
|
||||||
Logger.log("w", "No quality container found in stack %s, cannot create profile", global_stack.getId())
|
|
||||||
return
|
|
||||||
|
|
||||||
self._machine_manager.blurSettings.emit()
|
|
||||||
if base_name is None or base_name == "":
|
|
||||||
base_name = active_quality_name
|
|
||||||
unique_name = self._container_registry.uniqueName(base_name)
|
|
||||||
|
|
||||||
# Go through the active stacks and create quality_changes containers from the user containers.
|
|
||||||
for stack in ExtruderManager.getInstance().getActiveGlobalAndExtruderStacks():
|
|
||||||
user_container = stack.userChanges
|
|
||||||
quality_container = stack.quality
|
|
||||||
quality_changes_container = stack.qualityChanges
|
|
||||||
if not quality_container or not quality_changes_container:
|
|
||||||
Logger.log("w", "No quality or quality changes container found in stack %s, ignoring it", stack.getId())
|
|
||||||
continue
|
|
||||||
|
|
||||||
extruder_definition_id = None
|
|
||||||
if isinstance(stack, ExtruderStack):
|
|
||||||
extruder_definition_id = stack.definition.getId()
|
|
||||||
quality_type = quality_container.getMetaDataEntry("quality_type")
|
|
||||||
new_changes = self._createQualityChanges(quality_type, unique_name, global_stack, extruder_definition_id)
|
|
||||||
self._performMerge(new_changes, quality_changes_container, clear_settings = False)
|
|
||||||
self._performMerge(new_changes, user_container)
|
|
||||||
|
|
||||||
self._container_registry.addContainer(new_changes)
|
|
||||||
|
|
||||||
## Get a list of materials that have the same GUID as the reference material
|
## Get a list of materials that have the same GUID as the reference material
|
||||||
#
|
#
|
||||||
# \param material_id \type{str} the id of the material for which to get the linked materials.
|
# \param material_id \type{str} the id of the material for which to get the linked materials.
|
||||||
|
@ -181,7 +181,6 @@ class PerObjectSettingsTool(Tool):
|
|||||||
|
|
||||||
|
|
||||||
def _checkStackForErrors(self, stack):
|
def _checkStackForErrors(self, stack):
|
||||||
print("checking for errors")
|
|
||||||
if stack is None:
|
if stack is None:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
@ -77,6 +77,9 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice):
|
|||||||
|
|
||||||
self._cluster_size = int(properties.get(b"cluster_size", 0))
|
self._cluster_size = int(properties.get(b"cluster_size", 0))
|
||||||
|
|
||||||
|
self._latest_reply_handler = None
|
||||||
|
|
||||||
|
|
||||||
def requestWrite(self, nodes, file_name=None, filter_by_machine=False, file_handler=None, **kwargs):
|
def requestWrite(self, nodes, file_name=None, filter_by_machine=False, file_handler=None, **kwargs):
|
||||||
self.writeStarted.emit(self)
|
self.writeStarted.emit(self)
|
||||||
|
|
||||||
@ -147,7 +150,7 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice):
|
|||||||
|
|
||||||
parts.append(self._createFormPart("name=\"file\"; filename=\"%s\"" % file_name, compressed_gcode))
|
parts.append(self._createFormPart("name=\"file\"; filename=\"%s\"" % file_name, compressed_gcode))
|
||||||
|
|
||||||
self.postFormWithParts("print_jobs/", parts, onFinished=self._onPostPrintJobFinished, onProgress=self._onUploadPrintJobProgress)
|
self._latest_reply_handler = self.postFormWithParts("print_jobs/", parts, onFinished=self._onPostPrintJobFinished, onProgress=self._onUploadPrintJobProgress)
|
||||||
|
|
||||||
@pyqtProperty(QObject, notify=activePrinterChanged)
|
@pyqtProperty(QObject, notify=activePrinterChanged)
|
||||||
def activePrinter(self) -> Optional["PrinterOutputModel"]:
|
def activePrinter(self) -> Optional["PrinterOutputModel"]:
|
||||||
@ -187,6 +190,12 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice):
|
|||||||
self._sending_gcode = False
|
self._sending_gcode = False
|
||||||
Application.getInstance().getController().setActiveStage("PrepareStage")
|
Application.getInstance().getController().setActiveStage("PrepareStage")
|
||||||
|
|
||||||
|
# After compressing the sliced model Cura sends data to printer, to stop receiving updates from the request
|
||||||
|
# the "reply" should be disconnected
|
||||||
|
if self._latest_reply_handler:
|
||||||
|
self._latest_reply_handler.disconnect()
|
||||||
|
|
||||||
|
|
||||||
@pyqtSlot()
|
@pyqtSlot()
|
||||||
def openPrintJobControlPanel(self):
|
def openPrintJobControlPanel(self):
|
||||||
Logger.log("d", "Opening print job control panel...")
|
Logger.log("d", "Opening print job control panel...")
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
// Copyright (c) 2018 Ultimaker B.V.
|
// Copyright (c) 2018 Ultimaker B.V.
|
||||||
// Cura is released under the terms of the LGPLv3 or higher.
|
// Cura is released under the terms of the LGPLv3 or higher.
|
||||||
|
|
||||||
import QtQuick 2.8
|
import QtQuick 2.7
|
||||||
import QtQuick.Controls 1.4
|
import QtQuick.Controls 1.4
|
||||||
|
|
||||||
import UM 1.2 as UM
|
import UM 1.2 as UM
|
||||||
@ -12,7 +12,7 @@ Menu
|
|||||||
id: menu
|
id: menu
|
||||||
title: "Build plate"
|
title: "Build plate"
|
||||||
|
|
||||||
property Cura.BuildPlateModel buildPlateModel: CuraApplication.getBuildPlateModel()
|
property var buildPlateModel: CuraApplication.getBuildPlateModel()
|
||||||
|
|
||||||
Instantiator
|
Instantiator
|
||||||
{
|
{
|
||||||
|
@ -15,7 +15,7 @@ Menu
|
|||||||
|
|
||||||
property bool shouldShowExtruders: machineExtruderCount.properties.value > 1;
|
property bool shouldShowExtruders: machineExtruderCount.properties.value > 1;
|
||||||
|
|
||||||
property Cura.MultiBuildPlateModel multiBuildPlateModel: CuraApplication.getMultiBuildPlateModel()
|
property var multiBuildPlateModel: CuraApplication.getMultiBuildPlateModel()
|
||||||
|
|
||||||
// Selection-related actions.
|
// Selection-related actions.
|
||||||
MenuItem { action: Cura.Actions.centerSelection; }
|
MenuItem { action: Cura.Actions.centerSelection; }
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
// Copyright (c) 2018 Ultimaker B.V.
|
// Copyright (c) 2018 Ultimaker B.V.
|
||||||
// Cura is released under the terms of the LGPLv3 or higher.
|
// Cura is released under the terms of the LGPLv3 or higher.
|
||||||
|
|
||||||
import QtQuick 2.8
|
import QtQuick 2.7
|
||||||
import QtQuick.Controls 1.4
|
import QtQuick.Controls 1.4
|
||||||
|
|
||||||
import UM 1.2 as UM
|
import UM 1.2 as UM
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
// Copyright (c) 2017 Ultimaker B.V.
|
// Copyright (c) 2017 Ultimaker B.V.
|
||||||
// Cura is released under the terms of the LGPLv3 or higher.
|
// Cura is released under the terms of the LGPLv3 or higher.
|
||||||
|
|
||||||
import QtQuick 2.8
|
import QtQuick 2.7
|
||||||
import QtQuick.Controls 1.4
|
import QtQuick.Controls 1.4
|
||||||
|
|
||||||
import UM 1.2 as UM
|
import UM 1.2 as UM
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
// Copyright (c) 2018 Ultimaker B.V.
|
// Copyright (c) 2018 Ultimaker B.V.
|
||||||
// Cura is released under the terms of the LGPLv3 or higher.
|
// Cura is released under the terms of the LGPLv3 or higher.
|
||||||
|
|
||||||
import QtQuick 2.8
|
import QtQuick 2.7
|
||||||
import QtQuick.Controls 1.4
|
import QtQuick.Controls 1.4
|
||||||
|
|
||||||
import UM 1.2 as UM
|
import UM 1.2 as UM
|
||||||
|
@ -13,7 +13,7 @@ Menu
|
|||||||
id: base
|
id: base
|
||||||
enabled: !PrintInformation.preSliced
|
enabled: !PrintInformation.preSliced
|
||||||
|
|
||||||
property Cura.MultiBuildPlateModel multiBuildPlateModel: CuraApplication.getMultiBuildPlateModel()
|
property var multiBuildPlateModel: CuraApplication.getMultiBuildPlateModel()
|
||||||
|
|
||||||
// main views
|
// main views
|
||||||
Instantiator
|
Instantiator
|
||||||
|
@ -31,9 +31,9 @@ Rectangle
|
|||||||
border.width: UM.Theme.getSize("default_lining").width
|
border.width: UM.Theme.getSize("default_lining").width
|
||||||
border.color: UM.Theme.getColor("lining")
|
border.color: UM.Theme.getColor("lining")
|
||||||
|
|
||||||
property bool collapsed: true;
|
property bool collapsed: true
|
||||||
|
|
||||||
property Cura.MultiBuildPlateModel multiBuildPlateModel: CuraApplication.getMultiBuildPlateModel()
|
property var multiBuildPlateModel: CuraApplication.getMultiBuildPlateModel()
|
||||||
|
|
||||||
SystemPalette { id: palette }
|
SystemPalette { id: palette }
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
// Copyright (c) 2016 Ultimaker B.V.
|
// Copyright (c) 2016 Ultimaker B.V.
|
||||||
// Cura is released under the terms of the LGPLv3 or higher.
|
// Cura is released under the terms of the LGPLv3 or higher.
|
||||||
|
|
||||||
import QtQuick 2.8
|
import QtQuick 2.7
|
||||||
import QtQuick.Controls 1.4
|
import QtQuick.Controls 1.4
|
||||||
import QtQuick.Window 2.1
|
import QtQuick.Window 2.1
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
// Copyright (c) 2017 Ultimaker B.V.
|
// Copyright (c) 2017 Ultimaker B.V.
|
||||||
// Cura is released under the terms of the LGPLv3 or higher.
|
// Cura is released under the terms of the LGPLv3 or higher.
|
||||||
|
|
||||||
import QtQuick 2.8
|
import QtQuick 2.7
|
||||||
import QtQuick.Controls 1.4
|
import QtQuick.Controls 1.4
|
||||||
import QtQuick.Dialogs 1.2
|
import QtQuick.Dialogs 1.2
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
// Copyright (c) 2018 Ultimaker B.V.
|
// Copyright (c) 2018 Ultimaker B.V.
|
||||||
// Uranium is released under the terms of the LGPLv3 or higher.
|
// Uranium is released under the terms of the LGPLv3 or higher.
|
||||||
|
|
||||||
import QtQuick 2.8
|
import QtQuick 2.7
|
||||||
import QtQuick.Controls 1.4
|
import QtQuick.Controls 1.4
|
||||||
import QtQuick.Layouts 1.3
|
import QtQuick.Layouts 1.3
|
||||||
import QtQuick.Dialogs 1.2
|
import QtQuick.Dialogs 1.2
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
// Copyright (c) 2018 Ultimaker B.V.
|
// Copyright (c) 2018 Ultimaker B.V.
|
||||||
// Cura is released under the terms of the LGPLv3 or higher.
|
// Cura is released under the terms of the LGPLv3 or higher.
|
||||||
|
|
||||||
import QtQuick 2.8
|
import QtQuick 2.7
|
||||||
import QtQuick.Controls 1.4
|
import QtQuick.Controls 1.4
|
||||||
|
|
||||||
import UM 1.2 as UM
|
import UM 1.2 as UM
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
// Copyright (c) 2018 Ultimaker B.V.
|
// Copyright (c) 2018 Ultimaker B.V.
|
||||||
// Uranium is released under the terms of the LGPLv3 or higher.
|
// Uranium is released under the terms of the LGPLv3 or higher.
|
||||||
|
|
||||||
import QtQuick 2.8
|
import QtQuick 2.7
|
||||||
import QtQuick.Controls 1.4
|
import QtQuick.Controls 1.4
|
||||||
import QtQuick.Layouts 1.3
|
import QtQuick.Layouts 1.3
|
||||||
import QtQuick.Dialogs 1.2
|
import QtQuick.Dialogs 1.2
|
||||||
@ -175,7 +175,7 @@ Item
|
|||||||
{
|
{
|
||||||
base.newQualityNameToSelect = newName; // We want to switch to the new profile once it's created
|
base.newQualityNameToSelect = newName; // We want to switch to the new profile once it's created
|
||||||
base.toActivateNewQuality = true;
|
base.toActivateNewQuality = true;
|
||||||
Cura.ContainerManager.createQualityChanges(newName);
|
base.qualityManager.createQualityChanges(newName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
// Copyright (c) 2015 Ultimaker B.V.
|
// Copyright (c) 2015 Ultimaker B.V.
|
||||||
// Cura is released under the terms of the LGPLv3 or higher.
|
// Cura is released under the terms of the LGPLv3 or higher.
|
||||||
|
|
||||||
import QtQuick 2.8
|
import QtQuick 2.7
|
||||||
import QtQuick.Controls 2.0
|
import QtQuick.Controls 2.0
|
||||||
|
|
||||||
import "Settings"
|
import "Settings"
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
// Copyright (c) 2018 Ultimaker B.V.
|
// Copyright (c) 2018 Ultimaker B.V.
|
||||||
// Cura is released under the terms of the LGPLv3 or higher.
|
// Cura is released under the terms of the LGPLv3 or higher.
|
||||||
|
|
||||||
import QtQuick 2.8
|
import QtQuick 2.7
|
||||||
import QtQuick.Controls 1.4
|
import QtQuick.Controls 1.4
|
||||||
import QtQuick.Controls.Styles 1.4
|
import QtQuick.Controls.Styles 1.4
|
||||||
import QtQuick.Layouts 1.3
|
import QtQuick.Layouts 1.3
|
||||||
|
Loading…
x
Reference in New Issue
Block a user