Merge branch '3.0'

This commit is contained in:
Ghostkeeper 2017-09-22 09:55:05 +02:00
commit 12ccc8abe0
No known key found for this signature in database
GPG Key ID: C5F96EE2BC0F7E75
9 changed files with 69 additions and 68 deletions

View File

@ -61,8 +61,6 @@ class QualityManager:
machine_definition = global_stack.definition
result = self.findAllQualityChangesForMachine(machine_definition)
for extruder in self.findAllExtruderDefinitionsForMachine(machine_definition):
result.extend(self.findAllQualityChangesForExtruder(extruder))
result = [quality_change for quality_change in result if quality_change.getName() == quality_changes_name]
return result
@ -151,7 +149,7 @@ class QualityManager:
else:
definition_id = "fdmprinter"
filter_dict = { "type": "quality_changes", "extruder": None, "definition": definition_id }
filter_dict = { "type": "quality_changes", "definition": definition_id }
quality_changes_list = ContainerRegistry.getInstance().findInstanceContainers(**filter_dict)
return quality_changes_list

View File

@ -965,7 +965,7 @@ class MachineManager(QObject):
if container_type == "quality":
stack.quality.nameChanged.disconnect(self._onQualityNameChanged)
stack.setQuality(container, postpone_emit = postpone_emit)
stack.qualityChanges.nameChanged.connect(self._onQualityNameChanged)
stack.quality.nameChanged.connect(self._onQualityNameChanged)
elif container_type == "quality_changes" or container_type is None:
# If the container is an empty container, we need to change the quality_changes.
# Quality can never be set to empty.

View File

@ -75,6 +75,7 @@ class ProfilesModel(InstanceContainersModel):
# The actual list of quality profiles come from the first extruder in the extruder list.
result = QualityManager.getInstance().findAllQualitiesForMachineAndMaterials(global_stack_definition,
materials)
for quality in QualityManager.getInstance().findAllUsableQualitiesForMachineAndExtruders(
global_container_stack, extruder_stacks):
if quality not in result:

View File

@ -25,21 +25,30 @@ class QualityAndUserProfilesModel(ProfilesModel):
machine_definition = quality_manager.getParentMachineDefinition(global_container_stack.getBottom())
quality_changes_list = quality_manager.findAllQualityChangesForMachine(machine_definition)
# Detecting if the machine has multiple extrusion
multiple_extrusion = False
# Get the list of extruders and place the selected extruder at the front of the list.
extruder_manager = ExtruderManager.getInstance()
active_extruder = extruder_manager.getActiveExtruderStack()
extruder_stacks = extruder_manager.getActiveExtruderStacks()
if active_extruder in extruder_stacks:
multiple_extrusion = True
extruder_stacks.remove(active_extruder)
extruder_stacks = [active_extruder] + extruder_stacks
# Fetch the list of useable qualities across all extruders.
# The actual list of quality profiles come from the first extruder in the extruder list.
quality_list = QualityManager.getInstance().findAllUsableQualitiesForMachineAndExtruders(global_container_stack,
quality_list = quality_manager.findAllUsableQualitiesForMachineAndExtruders(global_container_stack,
extruder_stacks)
# Filter the quality_change by the list of available quality_types
quality_type_set = set([x.getMetaDataEntry("quality_type") for x in quality_list])
filtered_quality_changes = [qc for qc in quality_changes_list if qc.getMetaDataEntry("quality_type") in quality_type_set and qc.getMetaDataEntry("extruder") is None]
if multiple_extrusion:
# If the printer has multiple extruders then quality changes related to the current extruder are kept
filtered_quality_changes = [qc for qc in quality_changes_list if qc.getMetaDataEntry("quality_type") in quality_type_set and qc.getMetaDataEntry("extruder") == active_extruder.definition.getId()]
else:
# If not, the quality changes of the global stack are selected
filtered_quality_changes = [qc for qc in quality_changes_list if qc.getMetaDataEntry("quality_type") in quality_type_set]
return quality_list + filtered_quality_changes

View File

@ -12,12 +12,12 @@ from UM.Mesh.MeshBuilder import MeshBuilder
from UM.Mesh.MeshReader import MeshReader
from UM.Scene.GroupDecorator import GroupDecorator
from cura.Settings.SettingOverrideDecorator import SettingOverrideDecorator
from cura.ZOffsetDecorator import ZOffsetDecorator
from UM.Application import Application
from cura.Settings.ExtruderManager import ExtruderManager
from cura.QualityManager import QualityManager
from UM.Scene.SceneNode import SceneNode
from cura.SliceableObjectDecorator import SliceableObjectDecorator
from cura.ZOffsetDecorator import ZOffsetDecorator
MYPY = False
@ -105,8 +105,8 @@ class ThreeMFReader(MeshReader):
# Add the setting override decorator, so we can add settings to this node.
if settings:
um_node.addDecorator(SettingOverrideDecorator())
global_container_stack = Application.getInstance().getGlobalContainerStack()
global_container_stack = Application.getInstance().getGlobalContainerStack()
# Ensure the correct next container for the SettingOverride decorator is set.
if global_container_stack:
multi_extrusion = global_container_stack.getProperty("machine_extruder_count", "value") > 1
@ -144,15 +144,12 @@ class ThreeMFReader(MeshReader):
if len(um_node.getChildren()) > 0:
group_decorator = GroupDecorator()
um_node.addDecorator(group_decorator)
um_node.setSelectable(True)
if um_node.getMeshData():
# Assuming that all nodes with mesh data are printable objects
# affects (auto) slicing
sliceable_decorator = SliceableObjectDecorator()
um_node.addDecorator(sliceable_decorator)
return um_node
def read(self, file_name):
@ -172,18 +169,10 @@ class ThreeMFReader(MeshReader):
transform_matrix = Matrix()
mesh_data = um_node.getMeshData()
if mesh_data is not None:
extents = mesh_data.getExtents()
center_vector = Vector(extents.center.x, extents.center.y, extents.center.z)
# If the object in a saved project is below the bed, keep it that way
if extents.minimum.z < 0.0:
um_node.addDecorator(ZOffsetDecorator())
um_node.callDecoration("setZOffset", extents.minimum.z)
transform_matrix.setByTranslation(center_vector)
transform_matrix.multiply(um_node.getLocalTransformation())
um_node.setTransformation(transform_matrix)
@ -215,6 +204,13 @@ class ThreeMFReader(MeshReader):
# Pre multiply the transformation with the loaded transformation, so the data is handled correctly.
um_node.setTransformation(um_node.getLocalTransformation().preMultiply(transformation_matrix))
# Check if the model is positioned below the build plate and honor that when loading project files.
if um_node.getMeshData() is not None:
minimum_z_value = um_node.getMeshData().getExtents(um_node.getWorldTransformation()).minimum.y # y is z in transformation coordinates
if minimum_z_value < 0:
um_node.addDecorator(ZOffsetDecorator())
um_node.callDecoration("setZOffset", minimum_z_value)
result.append(um_node)
except Exception:

View File

@ -195,8 +195,8 @@ class CuraEngineBackend(QObject, Backend):
self.backendStateChange.emit(BackendState.Done)
Logger.log("w", "Slice unnecessary, nothing has changed that needs reslicing.")
return
Application.getInstance().getPrintInformation().setToZeroPrintInformation()
if Application.getInstance().getPrintInformation():
Application.getInstance().getPrintInformation().setToZeroPrintInformation()
self._stored_layer_data = []
self._stored_optimized_layer_data = []

View File

@ -342,7 +342,7 @@ Item
{
id: slider
width: handleSize
height: parent.height - 2*UM.Theme.getSize("slider_layerview_margin").height
height: UM.Theme.getSize("layerview_menu_size").height
anchors.top: parent.bottom
anchors.topMargin: UM.Theme.getSize("slider_layerview_margin").height
anchors.right: layerViewMenu.right

View File

@ -53,7 +53,7 @@ Item
Component.onCompleted:
{
qualityRow.updateAvailableTotalTicks()
qualityRow.updateQualitySliderProperties()
}
Connections
@ -61,17 +61,10 @@ Item
target: Cura.MachineManager
onActiveQualityChanged:
{
qualityRow.updateAvailableTotalTicks()
qualityRow.updateQualitySliderProperties()
}
}
/*
Component.onCompleted:
{
updateCurrentQualityIndex();
updateBar();
}
*/
id: qualityRow
@ -84,7 +77,7 @@ Item
property var sliderAvailableMax : 0
property var sliderMarginRight : 0
function updateAvailableTotalTicks()
function updateQualitySliderProperties()
{
qualityRow.totalTicks = Cura.ProfilesModel.rowCount() - 1 // minus one, because slider starts from 0
@ -142,12 +135,6 @@ Item
qualityRow.sliderAvailableMin = availableMin
qualityRow.sliderAvailableMax = availableMax
//console.log("==>>FIND.availableMin: " + availableMin)
//console.log("==>>FIND.availableMax: " + availableMax)
//console.log("==>>FIND.qualitySliderSelectedValue: " + qualitySliderSelectedValue)
//console.log("==>>FIND.sliderMarginRightVALUE: "+ sliderMarginRight)
}
height: UM.Theme.getSize("sidebar_margin").height
@ -179,10 +166,8 @@ Item
anchors.top: parent.top
anchors.topMargin: UM.Theme.getSize("sidebar_margin").height / 2
color: UM.Theme.getColor("text")
text:
{
return Cura.ProfilesModel.getItem(index).layer_height_without_unit
}
text: Cura.ProfilesModel.getItem(index).layer_height_without_unit
width: 1
x:
{
@ -213,7 +198,7 @@ Item
height: 2
color: UM.Theme.getColor("quality_slider_unavailable")
//radius: parent.radius
y: 9
anchors.verticalCenter: qualityRowSlider.verticalCenter
x: 0
}
@ -248,26 +233,24 @@ Item
value: qualityRow.qualitySliderSelectedValue
width:{
return qualityRow.qualitySliderStep * (qualityRow.availableTotalTicks)
}
width: qualityRow.qualitySliderStep * (qualityRow.availableTotalTicks)
anchors.right: parent.right
anchors.rightMargin:{
return qualityRow.sliderMarginRight
}
anchors.rightMargin: qualityRow.sliderMarginRight
style: SliderStyle
{
//Draw Available line
groove: Rectangle {
implicitHeight: 2
anchors.verticalCenter: qualityRowSlider.verticalCenter
color: UM.Theme.getColor("quality_slider_available")
radius: 1
}
handle: Item {
Rectangle {
id: qualityhandleButton
anchors.verticalCenter: qualityRowSlider.verticalCenter
anchors.centerIn: parent
color: control.enabled ? UM.Theme.getColor("quality_slider_available") : UM.Theme.getColor("quality_slider_unavailable")
implicitWidth: 10
@ -334,7 +317,7 @@ Item
id: infillCellLeft
anchors.top: qualityRow.bottom
anchors.topMargin: UM.Theme.getSize("sidebar_margin").height
anchors.topMargin: UM.Theme.getSize("sidebar_margin").height * 2
anchors.left: parent.left
width: UM.Theme.getSize("sidebar").width * .45 - UM.Theme.getSize("sidebar_margin").width
@ -386,6 +369,8 @@ Item
anchors.top: selectedInfillRateText.bottom
anchors.left: parent.left
anchors.right: infillIcon.left
anchors.rightMargin: UM.Theme.getSize("sidebar_margin").width
height: UM.Theme.getSize("sidebar_margin").height
width: infillCellRight.width - UM.Theme.getSize("sidebar_margin").width - style.handleWidth
@ -442,19 +427,23 @@ Item
}
}
Item
Rectangle
{
width: (infillCellRight.width / 5) - (UM.Theme.getSize("sidebar_margin").width)
id: infillIcon
width: (parent.width / 5) - (UM.Theme.getSize("sidebar_margin").width)
height: width
anchors.right: infillCellRight.right
anchors.top: infillSlider.top
anchors.right: parent.right
anchors.top: parent.top
anchors.topMargin: UM.Theme.getSize("sidebar_margin").height / 2
// we loop over all density icons and only show the one that has the current density and steps
Repeater
{
id: infillIconList
model: infillModel
anchors.fill: parent
property int activeIndex: {
for (var i = 0; i < infillModel.count; i++) {
@ -472,21 +461,21 @@ Item
return -1
}
Item {
Rectangle
{
anchors.fill: parent
visible: infillIconList.activeIndex == index
Rectangle {
border.width: UM.Theme.getSize("default_lining").width
border.color: UM.Theme.getColor("quality_slider_available")
UM.RecolorImage {
anchors.fill: parent
visible: infillIconList.activeIndex == index
UM.RecolorImage {
id: infillIcon
anchors.fill: parent
sourceSize.width: width
sourceSize.height: width
source: UM.Theme.getIcon(model.icon)
color: UM.Theme.getColor("quality_slider_available")
}
anchors.margins: 2
sourceSize.width: width
sourceSize.height: width
source: UM.Theme.getIcon(model.icon)
color: UM.Theme.getColor("quality_slider_unavailable")
}
}
}

View File

@ -34,7 +34,15 @@ Item
Button
{
text: model.name
iconSource: UM.Theme.getIcon(model.icon);
iconSource:
{
var result = UM.Theme.getIcon(model.icon)
if(result == "")
{
return model.location + "/" + model.icon
}
return result
}
checkable: true;
checked: model.active;