Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/Ultimaker/Cura.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGhostkeeper <Ghostkeeper@users.noreply.github.com>2017-01-24 17:54:57 +0300
committerGitHub <noreply@github.com>2017-01-24 17:54:57 +0300
commita8efde94507169745e338af4b8531c4d0ba2022c (patch)
tree4808b62449235a1d916d6f442d5b3faa5fef9a95 /cura/PrintInformation.py
parentb284e8508a06ceb6e557246ecbb212770fcdeb3a (diff)
parent6f06e9b3202b08b681d33f13be32a01cfc8e14e8 (diff)
Merge pull request #1243 from fieldOfView/feature_material_cost
Implement material cost
Diffstat (limited to 'cura/PrintInformation.py')
-rw-r--r--cura/PrintInformation.py67
1 files changed, 65 insertions, 2 deletions
diff --git a/cura/PrintInformation.py b/cura/PrintInformation.py
index 7834ef77bd..769df189c5 100644
--- a/cura/PrintInformation.py
+++ b/cura/PrintInformation.py
@@ -7,12 +7,14 @@ from UM.FlameProfiler import pyqtSlot
from UM.Application import Application
from UM.Qt.Duration import Duration
from UM.Preferences import Preferences
+from UM.Settings import ContainerRegistry
import cura.Settings.ExtruderManager
import math
import os.path
import unicodedata
+import json
from UM.i18n import i18nCatalog
catalog = i18nCatalog("cura")
@@ -52,6 +54,7 @@ class PrintInformation(QObject):
self._material_lengths = []
self._material_weights = []
+ self._material_costs = []
self._pre_sliced = False
@@ -65,6 +68,12 @@ class PrintInformation(QObject):
Application.getInstance().globalContainerStackChanged.connect(self._setAbbreviatedMachineName)
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()
preSlicedChanged = pyqtSignal()
@@ -93,28 +102,82 @@ class PrintInformation(QObject):
def materialWeights(self):
return self._material_weights
+ materialCostsChanged = pyqtSignal()
+
+ @pyqtProperty("QVariantList", notify = materialCostsChanged)
+ def materialCosts(self):
+ return self._material_costs
+
def _onPrintDurationMessage(self, total_time, material_amounts):
self._current_print_time.setDuration(total_time)
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
r = Application.getInstance().getGlobalContainerStack().getProperty("material_diameter", "value") / 2
self._material_lengths = []
self._material_weights = []
+ self._material_costs = []
+
+ material_preference_values = json.loads(Preferences.getInstance().getValue("cura/material_settings"))
+
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
# list comprehension filtering to solve this for us.
+ material = None
if extruder_stacks: # Multi extrusion machine
extruder_stack = [extruder for extruder in extruder_stacks if extruder.getMetaDataEntry("position") == str(index)][0]
density = extruder_stack.getMetaDataEntry("properties", {}).get("density", 0)
+ material = extruder_stack.findContainer({"type": "material"})
else: # Machine with no extruder stacks
density = Application.getInstance().getGlobalContainerStack().getMetaDataEntry("properties", {}).get("density", 0)
+ material = Application.getInstance().getGlobalContainerStack().findContainer({"type": "material"})
+
+ weight = float(amount) * float(density) / 1000
+ cost = 0
+ if material:
+ material_guid = material.getMetaDataEntry("GUID")
+ if material_guid in material_preference_values:
+ material_values = material_preference_values[material_guid]
+
+ 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)
- self._material_weights.append(float(amount) * float(density) / 1000)
+ if weight_per_spool != 0:
+ cost = cost_per_spool * weight / weight_per_spool
+ else:
+ cost = 0
+
+ self._material_weights.append(weight)
self._material_lengths.append(round((amount / (math.pi * r ** 2)) / 1000, 2))
+ self._material_costs.append(cost)
+
self.materialLengthsChanged.emit()
self.materialWeightsChanged.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)
def setJobName(self, name):