mirror of
https://github.com/Ultimaker/Cura.git
synced 2025-07-25 07:33:57 -06:00
Update material costs in slice info area when changing material settings
(without reslicing)
This commit is contained in:
parent
c48f02a7eb
commit
6f06e9b320
1 changed files with 39 additions and 4 deletions
|
@ -6,6 +6,7 @@ from PyQt5.QtCore import QObject, pyqtSignal, pyqtProperty, pyqtSlot
|
||||||
from UM.Application import Application
|
from UM.Application import Application
|
||||||
from UM.Qt.Duration import Duration
|
from UM.Qt.Duration import Duration
|
||||||
from UM.Preferences import Preferences
|
from UM.Preferences import Preferences
|
||||||
|
from UM.Settings import ContainerRegistry
|
||||||
|
|
||||||
import cura.Settings.ExtruderManager
|
import cura.Settings.ExtruderManager
|
||||||
|
|
||||||
|
@ -61,6 +62,12 @@ class PrintInformation(QObject):
|
||||||
Application.getInstance().globalContainerStackChanged.connect(self._setAbbreviatedMachineName)
|
Application.getInstance().globalContainerStackChanged.connect(self._setAbbreviatedMachineName)
|
||||||
Application.getInstance().fileLoaded.connect(self.setJobName)
|
Application.getInstance().fileLoaded.connect(self.setJobName)
|
||||||
|
|
||||||
|
Preferences.getInstance().preferenceChanged.connect(self._onPreferencesChanged)
|
||||||
|
|
||||||
|
self._active_material_container = None
|
||||||
|
Application.getInstance().getMachineManager().activeMaterialChanged.connect(self._onActiveMaterialChanged)
|
||||||
|
self._onActiveMaterialChanged()
|
||||||
|
|
||||||
currentPrintTimeChanged = pyqtSignal()
|
currentPrintTimeChanged = pyqtSignal()
|
||||||
|
|
||||||
@pyqtProperty(Duration, notify = currentPrintTimeChanged)
|
@pyqtProperty(Duration, notify = currentPrintTimeChanged)
|
||||||
|
@ -89,6 +96,10 @@ class PrintInformation(QObject):
|
||||||
self._current_print_time.setDuration(total_time)
|
self._current_print_time.setDuration(total_time)
|
||||||
self.currentPrintTimeChanged.emit()
|
self.currentPrintTimeChanged.emit()
|
||||||
|
|
||||||
|
self._material_amounts = material_amounts
|
||||||
|
self._calculateInformation()
|
||||||
|
|
||||||
|
def _calculateInformation(self):
|
||||||
# Material amount is sent as an amount of mm^3, so calculate length from that
|
# Material amount is sent as an amount of mm^3, so calculate length from that
|
||||||
r = Application.getInstance().getGlobalContainerStack().getProperty("material_diameter", "value") / 2
|
r = Application.getInstance().getGlobalContainerStack().getProperty("material_diameter", "value") / 2
|
||||||
self._material_lengths = []
|
self._material_lengths = []
|
||||||
|
@ -98,7 +109,7 @@ class PrintInformation(QObject):
|
||||||
material_preference_values = json.loads(Preferences.getInstance().getValue("cura/material_settings"))
|
material_preference_values = json.loads(Preferences.getInstance().getValue("cura/material_settings"))
|
||||||
|
|
||||||
extruder_stacks = list(cura.Settings.ExtruderManager.getInstance().getMachineExtruders(Application.getInstance().getGlobalContainerStack().getId()))
|
extruder_stacks = list(cura.Settings.ExtruderManager.getInstance().getMachineExtruders(Application.getInstance().getGlobalContainerStack().getId()))
|
||||||
for index, amount in enumerate(material_amounts):
|
for index, amount in enumerate(self._material_amounts):
|
||||||
## Find the right extruder stack. As the list isn't sorted because it's a annoying generator, we do some
|
## Find the right extruder stack. As the list isn't sorted because it's a annoying generator, we do some
|
||||||
# list comprehension filtering to solve this for us.
|
# list comprehension filtering to solve this for us.
|
||||||
material = None
|
material = None
|
||||||
|
@ -115,10 +126,15 @@ class PrintInformation(QObject):
|
||||||
if material:
|
if material:
|
||||||
material_guid = material.getMetaDataEntry("GUID")
|
material_guid = material.getMetaDataEntry("GUID")
|
||||||
if material_guid in material_preference_values:
|
if material_guid in material_preference_values:
|
||||||
weight_per_spool = float(material_preference_values[material_guid]["spool_weight"])
|
material_values = material_preference_values[material_guid]
|
||||||
cost_per_spool = float(material_preference_values[material_guid]["spool_cost"])
|
|
||||||
|
|
||||||
cost = cost_per_spool * weight / weight_per_spool
|
weight_per_spool = float(material_values["spool_weight"] if material_values and "spool_weight" in material_values else 0)
|
||||||
|
cost_per_spool = float(material_values["spool_cost"] if material_values and "spool_cost" in material_values else 0)
|
||||||
|
|
||||||
|
if weight_per_spool != 0:
|
||||||
|
cost = cost_per_spool * weight / weight_per_spool
|
||||||
|
else:
|
||||||
|
cost = 0
|
||||||
|
|
||||||
self._material_weights.append(weight)
|
self._material_weights.append(weight)
|
||||||
self._material_lengths.append(round((amount / (math.pi * r ** 2)) / 1000, 2))
|
self._material_lengths.append(round((amount / (math.pi * r ** 2)) / 1000, 2))
|
||||||
|
@ -128,6 +144,25 @@ class PrintInformation(QObject):
|
||||||
self.materialWeightsChanged.emit()
|
self.materialWeightsChanged.emit()
|
||||||
self.materialCostsChanged.emit()
|
self.materialCostsChanged.emit()
|
||||||
|
|
||||||
|
def _onPreferencesChanged(self, preference):
|
||||||
|
if preference != "cura/material_settings":
|
||||||
|
return
|
||||||
|
|
||||||
|
self._calculateInformation()
|
||||||
|
|
||||||
|
def _onActiveMaterialChanged(self):
|
||||||
|
if self._active_material_container:
|
||||||
|
self._active_material_container.metaDataChanged.disconnect(self._onMaterialMetaDataChanged)
|
||||||
|
|
||||||
|
active_material_id = Application.getInstance().getMachineManager().activeMaterialId
|
||||||
|
self._active_material_container = ContainerRegistry.getInstance().findInstanceContainers(id=active_material_id)[0]
|
||||||
|
|
||||||
|
if self._active_material_container:
|
||||||
|
self._active_material_container.metaDataChanged.connect(self._onMaterialMetaDataChanged)
|
||||||
|
|
||||||
|
def _onMaterialMetaDataChanged(self):
|
||||||
|
self._calculateInformation()
|
||||||
|
|
||||||
@pyqtSlot(str)
|
@pyqtSlot(str)
|
||||||
def setJobName(self, name):
|
def setJobName(self, name):
|
||||||
# Ensure that we don't use entire path but only filename
|
# Ensure that we don't use entire path but only filename
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue