mirror of
https://github.com/Ultimaker/Cura.git
synced 2025-07-16 03:07:53 -06:00
Merge pull request #1243 from fieldOfView/feature_material_cost
Implement material cost
This commit is contained in:
commit
a8efde9450
6 changed files with 242 additions and 54 deletions
|
@ -129,6 +129,19 @@ UM.PreferencesPage
|
|||
currentIndex -= 1;
|
||||
}
|
||||
}
|
||||
|
||||
Label
|
||||
{
|
||||
id: currencyLabel
|
||||
text: catalog.i18nc("@label","Currency:")
|
||||
anchors.verticalCenter: languageComboBox.verticalCenter
|
||||
}
|
||||
TextField
|
||||
{
|
||||
id: currencyField
|
||||
text: UM.Preferences.getValue("cura/currency")
|
||||
onTextChanged: UM.Preferences.setValue("cura/currency", text)
|
||||
}
|
||||
}
|
||||
|
||||
Label
|
||||
|
|
|
@ -15,14 +15,19 @@ TabView
|
|||
property QtObject properties;
|
||||
|
||||
property bool editingEnabled: false;
|
||||
property string currency: UM.Preferences.getValue("general/currency") ? UM.Preferences.getValue("general/currency") : "€"
|
||||
property string currency: UM.Preferences.getValue("cura/currency") ? UM.Preferences.getValue("cura/currency") : "€"
|
||||
property real firstColumnWidth: width * 0.45
|
||||
property real secondColumnWidth: width * 0.45
|
||||
property string containerId: ""
|
||||
property var materialPreferenceValues: UM.Preferences.getValue("cura/material_settings") ? JSON.parse(UM.Preferences.getValue("cura/material_settings")) : {}
|
||||
|
||||
property double spoolLength: calculateSpoolLength()
|
||||
property real costPerMeter: calculateCostPerMeter()
|
||||
|
||||
Tab
|
||||
{
|
||||
title: catalog.i18nc("@title","Information")
|
||||
|
||||
anchors
|
||||
{
|
||||
leftMargin: UM.Theme.getSize("default_margin").width
|
||||
|
@ -35,6 +40,7 @@ TabView
|
|||
{
|
||||
anchors.fill: parent
|
||||
horizontalScrollBarPolicy: Qt.ScrollBarAlwaysOff
|
||||
flickableItem.flickableDirection: Flickable.VerticalFlick
|
||||
|
||||
Flow
|
||||
{
|
||||
|
@ -112,64 +118,78 @@ TabView
|
|||
Label { width: base.firstColumnWidth; height: parent.rowHeight; verticalAlignment: Qt.AlignVCenter; text: catalog.i18nc("@label", "Density") }
|
||||
ReadOnlySpinBox
|
||||
{
|
||||
width: base.secondColumnWidth;
|
||||
value: properties.density;
|
||||
id: densitySpinBox
|
||||
width: base.secondColumnWidth
|
||||
value: properties.density
|
||||
decimals: 2
|
||||
suffix: "g/cm³"
|
||||
suffix: " g/cm³"
|
||||
stepSize: 0.01
|
||||
readOnly: !base.editingEnabled;
|
||||
readOnly: !base.editingEnabled
|
||||
|
||||
onEditingFinished: base.setMetaDataEntry("properties/density", properties.density, value)
|
||||
onValueChanged: updateCostPerMeter()
|
||||
}
|
||||
|
||||
Label { width: base.firstColumnWidth; height: parent.rowHeight; verticalAlignment: Qt.AlignVCenter; text: catalog.i18nc("@label", "Diameter") }
|
||||
ReadOnlySpinBox
|
||||
{
|
||||
width: base.secondColumnWidth;
|
||||
value: properties.diameter;
|
||||
id: diameterSpinBox
|
||||
width: base.secondColumnWidth
|
||||
value: properties.diameter
|
||||
decimals: 2
|
||||
suffix: "mm"
|
||||
suffix: " mm"
|
||||
stepSize: 0.01
|
||||
readOnly: !base.editingEnabled;
|
||||
readOnly: !base.editingEnabled
|
||||
|
||||
onEditingFinished: base.setMetaDataEntry("properties/diameter", properties.diameter, value)
|
||||
onValueChanged: updateCostPerMeter()
|
||||
}
|
||||
|
||||
Label { width: base.firstColumnWidth; height: parent.rowHeight; verticalAlignment: Qt.AlignVCenter; text: catalog.i18nc("@label", "Filament Cost") }
|
||||
SpinBox
|
||||
{
|
||||
width: base.secondColumnWidth;
|
||||
value: properties.spool_cost;
|
||||
prefix: base.currency
|
||||
enabled: false
|
||||
id: spoolCostSpinBox
|
||||
width: base.secondColumnWidth
|
||||
value: base.getMaterialPreferenceValue(properties.guid, "spool_cost")
|
||||
prefix: base.currency + " "
|
||||
decimals: 2
|
||||
maximumValue: 1000
|
||||
|
||||
onEditingFinished: base.setMaterialPreferenceValue(properties.guid, "spool_cost", parseFloat(value))
|
||||
onValueChanged: updateCostPerMeter()
|
||||
}
|
||||
|
||||
Label { width: base.firstColumnWidth; height: parent.rowHeight; verticalAlignment: Qt.AlignVCenter; text: catalog.i18nc("@label", "Filament weight") }
|
||||
SpinBox
|
||||
{
|
||||
width: base.secondColumnWidth;
|
||||
value: properties.spool_weight;
|
||||
suffix: "g";
|
||||
stepSize: 10
|
||||
enabled: false
|
||||
id: spoolWeightSpinBox
|
||||
width: base.secondColumnWidth
|
||||
value: base.getMaterialPreferenceValue(properties.guid, "spool_weight")
|
||||
suffix: " g"
|
||||
stepSize: 100
|
||||
decimals: 0
|
||||
maximumValue: 10000
|
||||
|
||||
onEditingFinished: base.setMaterialPreferenceValue(properties.guid, "spool_weight", parseFloat(value))
|
||||
onValueChanged: updateCostPerMeter()
|
||||
}
|
||||
|
||||
Label { width: base.firstColumnWidth; height: parent.rowHeight; verticalAlignment: Qt.AlignVCenter; text: catalog.i18nc("@label", "Filament length") }
|
||||
SpinBox
|
||||
Label
|
||||
{
|
||||
width: base.secondColumnWidth;
|
||||
value: parseFloat(properties.spool_length);
|
||||
suffix: "m";
|
||||
enabled: false
|
||||
width: base.secondColumnWidth
|
||||
text: "~ %1 m".arg(Math.round(base.spoolLength))
|
||||
verticalAlignment: Qt.AlignVCenter
|
||||
height: parent.rowHeight
|
||||
}
|
||||
|
||||
Label { width: base.firstColumnWidth; height: parent.rowHeight; verticalAlignment: Qt.AlignVCenter; text: catalog.i18nc("@label", "Cost per Meter (Approx.)") }
|
||||
SpinBox
|
||||
Label { width: base.firstColumnWidth; height: parent.rowHeight; verticalAlignment: Qt.AlignVCenter; text: catalog.i18nc("@label", "Cost per Meter") }
|
||||
Label
|
||||
{
|
||||
width: base.secondColumnWidth;
|
||||
value: parseFloat(properties.cost_per_meter);
|
||||
suffix: catalog.i18nc("@label", "%1/m".arg(base.currency));
|
||||
enabled: false
|
||||
width: base.secondColumnWidth
|
||||
text: "~ %1 %2/m".arg(base.costPerMeter.toFixed(2)).arg(base.currency)
|
||||
verticalAlignment: Qt.AlignVCenter
|
||||
height: parent.rowHeight
|
||||
}
|
||||
|
||||
Item { width: parent.width; height: UM.Theme.getSize("default_margin").height }
|
||||
|
@ -200,6 +220,12 @@ TabView
|
|||
onEditingFinished: base.setMetaDataEntry("adhesion_info", properties.adhesion_info, text)
|
||||
}
|
||||
}
|
||||
|
||||
function updateCostPerMeter()
|
||||
{
|
||||
base.spoolLength = calculateSpoolLength(diameterSpinBox.value, densitySpinBox.value, spoolWeightSpinBox.value);
|
||||
base.costPerMeter = calculateCostPerMeter(spoolCostSpinBox.value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -259,6 +285,44 @@ TabView
|
|||
}
|
||||
}
|
||||
|
||||
function calculateSpoolLength(diameter, density, spoolWeight)
|
||||
{
|
||||
if(!diameter)
|
||||
{
|
||||
diameter = properties.diameter;
|
||||
}
|
||||
if(!density)
|
||||
{
|
||||
density = properties.density;
|
||||
}
|
||||
if(!spoolWeight)
|
||||
{
|
||||
spoolWeight = base.getMaterialPreferenceValue(properties.guid, "spool_weight");
|
||||
}
|
||||
|
||||
if (diameter == 0 || density == 0 || spoolWeight == 0)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
var area = Math.PI * Math.pow(diameter / 2, 2); // in mm2
|
||||
var volume = (spoolWeight / density); // in cm3
|
||||
return volume / area; // in m
|
||||
}
|
||||
|
||||
function calculateCostPerMeter(spoolCost)
|
||||
{
|
||||
if(!spoolCost)
|
||||
{
|
||||
spoolCost = base.getMaterialPreferenceValue(properties.guid, "spool_cost");
|
||||
}
|
||||
|
||||
if (spoolLength == 0)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
return spoolCost / spoolLength;
|
||||
}
|
||||
|
||||
// Tiny convenience function to check if a value really changed before trying to set it.
|
||||
function setMetaDataEntry(entry_name, old_value, new_value)
|
||||
{
|
||||
|
@ -268,6 +332,32 @@ TabView
|
|||
}
|
||||
}
|
||||
|
||||
function setMaterialPreferenceValue(material_guid, entry_name, new_value)
|
||||
{
|
||||
if(!(material_guid in materialPreferenceValues))
|
||||
{
|
||||
materialPreferenceValues[material_guid] = {};
|
||||
}
|
||||
if(entry_name in materialPreferenceValues[material_guid] && materialPreferenceValues[material_guid][entry_name] == new_value)
|
||||
{
|
||||
// value has not changed
|
||||
return
|
||||
}
|
||||
materialPreferenceValues[material_guid][entry_name] = new_value;
|
||||
|
||||
// store preference
|
||||
UM.Preferences.setValue("cura/material_settings", JSON.stringify(materialPreferenceValues));
|
||||
}
|
||||
|
||||
function getMaterialPreferenceValue(material_guid, entry_name)
|
||||
{
|
||||
if(material_guid in materialPreferenceValues && entry_name in materialPreferenceValues[material_guid])
|
||||
{
|
||||
return materialPreferenceValues[material_guid][entry_name];
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
function setName(old_value, new_value)
|
||||
{
|
||||
if(old_value != new_value)
|
||||
|
|
|
@ -185,17 +185,6 @@ UM.ManagementPage
|
|||
height: childrenRect.height
|
||||
|
||||
Label { text: materialProperties.name; font: UM.Theme.getFont("large"); }
|
||||
Button
|
||||
{
|
||||
id: editButton
|
||||
anchors.right: parent.right;
|
||||
text: catalog.i18nc("@action:button", "Edit");
|
||||
iconName: "document-edit";
|
||||
|
||||
enabled: base.currentItem != null && !base.currentItem.readOnly
|
||||
|
||||
checkable: enabled
|
||||
}
|
||||
}
|
||||
|
||||
MaterialView
|
||||
|
@ -209,7 +198,7 @@ UM.ManagementPage
|
|||
bottom: parent.bottom
|
||||
}
|
||||
|
||||
editingEnabled: editButton.checkable && editButton.checked;
|
||||
editingEnabled: base.currentItem != null && !base.currentItem.readOnly
|
||||
|
||||
properties: materialProperties
|
||||
containerId: base.currentItem != null ? base.currentItem.id : ""
|
||||
|
@ -219,6 +208,7 @@ UM.ManagementPage
|
|||
{
|
||||
id: materialProperties
|
||||
|
||||
property string guid: "00000000-0000-0000-0000-000000000000"
|
||||
property string name: "Unknown";
|
||||
property string profile_type: "Unknown";
|
||||
property string supplier: "Unknown";
|
||||
|
@ -344,6 +334,7 @@ UM.ManagementPage
|
|||
return
|
||||
}
|
||||
materialProperties.name = currentItem.name;
|
||||
materialProperties.guid = Cura.ContainerManager.getContainerMetaDataEntry(base.currentItem.id, "GUID");
|
||||
|
||||
if(currentItem.metadata != undefined && currentItem.metadata != null)
|
||||
{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue