This commit is contained in:
fieldOfView 2016-07-25 11:30:47 +02:00
commit ac0de58ecb
21 changed files with 417 additions and 10447 deletions

View file

@ -195,18 +195,18 @@ class BuildVolume(SceneNode):
minimum = Vector(min_w, min_h - 1.0, min_d), minimum = Vector(min_w, min_h - 1.0, min_d),
maximum = Vector(max_w, max_h - self._raft_thickness, max_d)) maximum = Vector(max_w, max_h - self._raft_thickness, max_d))
skirt_size = 0.0 bed_adhesion_size = 0.0
container_stack = Application.getInstance().getGlobalContainerStack() container_stack = Application.getInstance().getGlobalContainerStack()
if container_stack: if container_stack:
skirt_size = self._getSkirtSize(container_stack) bed_adhesion_size = self._getBedAdhesionSize(container_stack)
# As this works better for UM machines, we only add the disallowed_area_size for the z direction. # As this works better for UM machines, we only add the disallowed_area_size for the z direction.
# This is probably wrong in all other cases. TODO! # This is probably wrong in all other cases. TODO!
# The +1 and -1 is added as there is always a bit of extra room required to work properly. # The +1 and -1 is added as there is always a bit of extra room required to work properly.
scale_to_max_bounds = AxisAlignedBox( scale_to_max_bounds = AxisAlignedBox(
minimum = Vector(min_w + skirt_size + 1, min_h, min_d + disallowed_area_size - skirt_size + 1), minimum = Vector(min_w + bed_adhesion_size + 1, min_h, min_d + disallowed_area_size - bed_adhesion_size + 1),
maximum = Vector(max_w - skirt_size - 1, max_h - self._raft_thickness, max_d - disallowed_area_size + skirt_size - 1) maximum = Vector(max_w - bed_adhesion_size - 1, max_h - self._raft_thickness, max_d - disallowed_area_size + bed_adhesion_size - 1)
) )
Application.getInstance().getController().getScene()._maximum_bounds = scale_to_max_bounds Application.getInstance().getController().getScene()._maximum_bounds = scale_to_max_bounds
@ -311,62 +311,62 @@ class BuildVolume(SceneNode):
[prime_x - PRIME_CLEARANCE, prime_y + PRIME_CLEARANCE], [prime_x - PRIME_CLEARANCE, prime_y + PRIME_CLEARANCE],
]) ])
skirt_size = self._getSkirtSize(self._active_container_stack) bed_adhesion_size = self._getBedAdhesionSize(self._active_container_stack)
if disallowed_areas: if disallowed_areas:
# Extend every area already in the disallowed_areas with the skirt size. # Extend every area already in the disallowed_areas with the skirt size.
for area in disallowed_areas: for area in disallowed_areas:
poly = Polygon(numpy.array(area, numpy.float32)) poly = Polygon(numpy.array(area, numpy.float32))
poly = poly.getMinkowskiHull(Polygon(approximatedCircleVertices(skirt_size))) poly = poly.getMinkowskiHull(Polygon(approximatedCircleVertices(bed_adhesion_size)))
areas.append(poly) areas.append(poly)
# Add the skirt areas around the borders of the build plate. # Add the skirt areas around the borders of the build plate.
if skirt_size > 0: if bed_adhesion_size > 0:
half_machine_width = self._active_container_stack.getProperty("machine_width", "value") / 2 half_machine_width = self._active_container_stack.getProperty("machine_width", "value") / 2
half_machine_depth = self._active_container_stack.getProperty("machine_depth", "value") / 2 half_machine_depth = self._active_container_stack.getProperty("machine_depth", "value") / 2
areas.append(Polygon(numpy.array([ areas.append(Polygon(numpy.array([
[-half_machine_width, -half_machine_depth], [-half_machine_width, -half_machine_depth],
[-half_machine_width, half_machine_depth], [-half_machine_width, half_machine_depth],
[-half_machine_width + skirt_size, half_machine_depth - skirt_size], [-half_machine_width + bed_adhesion_size, half_machine_depth - bed_adhesion_size],
[-half_machine_width + skirt_size, -half_machine_depth + skirt_size] [-half_machine_width + bed_adhesion_size, -half_machine_depth + bed_adhesion_size]
], numpy.float32))) ], numpy.float32)))
areas.append(Polygon(numpy.array([ areas.append(Polygon(numpy.array([
[half_machine_width, half_machine_depth], [half_machine_width, half_machine_depth],
[half_machine_width, -half_machine_depth], [half_machine_width, -half_machine_depth],
[half_machine_width - skirt_size, -half_machine_depth + skirt_size], [half_machine_width - bed_adhesion_size, -half_machine_depth + bed_adhesion_size],
[half_machine_width - skirt_size, half_machine_depth - skirt_size] [half_machine_width - bed_adhesion_size, half_machine_depth - bed_adhesion_size]
], numpy.float32))) ], numpy.float32)))
areas.append(Polygon(numpy.array([ areas.append(Polygon(numpy.array([
[-half_machine_width, half_machine_depth], [-half_machine_width, half_machine_depth],
[half_machine_width, half_machine_depth], [half_machine_width, half_machine_depth],
[half_machine_width - skirt_size, half_machine_depth - skirt_size], [half_machine_width - bed_adhesion_size, half_machine_depth - bed_adhesion_size],
[-half_machine_width + skirt_size, half_machine_depth - skirt_size] [-half_machine_width + bed_adhesion_size, half_machine_depth - bed_adhesion_size]
], numpy.float32))) ], numpy.float32)))
areas.append(Polygon(numpy.array([ areas.append(Polygon(numpy.array([
[half_machine_width, -half_machine_depth], [half_machine_width, -half_machine_depth],
[-half_machine_width, -half_machine_depth], [-half_machine_width, -half_machine_depth],
[-half_machine_width + skirt_size, -half_machine_depth + skirt_size], [-half_machine_width + bed_adhesion_size, -half_machine_depth + bed_adhesion_size],
[half_machine_width - skirt_size, -half_machine_depth + skirt_size] [half_machine_width - bed_adhesion_size, -half_machine_depth + bed_adhesion_size]
], numpy.float32))) ], numpy.float32)))
self._disallowed_areas = areas self._disallowed_areas = areas
## Convenience function to calculate the size of the bed adhesion in directions x, y. ## Convenience function to calculate the size of the bed adhesion in directions x, y.
def _getSkirtSize(self, container_stack): def _getBedAdhesionSize(self, container_stack):
skirt_size = 0.0 skirt_size = 0.0
adhesion_type = container_stack.getProperty("adhesion_type", "value") adhesion_type = container_stack.getProperty("adhesion_type", "value")
if adhesion_type == "skirt": if adhesion_type == "skirt":
skirt_distance = container_stack.getProperty("skirt_gap", "value") skirt_distance = container_stack.getProperty("skirt_gap", "value")
skirt_line_count = container_stack.getProperty("skirt_line_count", "value") skirt_line_count = container_stack.getProperty("skirt_line_count", "value")
skirt_size = skirt_distance + (skirt_line_count * container_stack.getProperty("skirt_line_width", "value")) skirt_size = skirt_distance + (skirt_line_count * container_stack.getProperty("skirt_brim_line_width", "value"))
elif adhesion_type == "brim": elif adhesion_type == "brim":
skirt_size = container_stack.getProperty("brim_line_count", "value") * container_stack.getProperty("skirt_line_width", "value") skirt_size = container_stack.getProperty("brim_line_count", "value") * container_stack.getProperty("skirt_brim_line_width", "value")
elif adhesion_type == "raft": elif adhesion_type == "raft":
skirt_size = container_stack.getProperty("raft_margin", "value") skirt_size = container_stack.getProperty("raft_margin", "value")
@ -381,5 +381,5 @@ class BuildVolume(SceneNode):
def _clamp(self, value, min_value, max_value): def _clamp(self, value, min_value, max_value):
return max(min(value, max_value), min_value) return max(min(value, max_value), min_value)
_skirt_settings = ["adhesion_type", "skirt_gap", "skirt_line_count", "skirt_line_width", "brim_width", "brim_line_count", "raft_margin", "draft_shield_enabled", "draft_shield_dist", "xy_offset"] _skirt_settings = ["adhesion_type", "skirt_gap", "skirt_line_count", "skirt_brim_line_width", "brim_width", "brim_line_count", "raft_margin", "draft_shield_enabled", "draft_shield_dist", "xy_offset"]
_raft_settings = ["adhesion_type", "raft_base_thickness", "raft_interface_thickness", "raft_surface_layers", "raft_surface_thickness", "raft_airgap"] _raft_settings = ["adhesion_type", "raft_base_thickness", "raft_interface_thickness", "raft_surface_layers", "raft_surface_thickness", "raft_airgap"]

View file

@ -97,7 +97,8 @@ class CuraApplication(QtApplication):
SettingDefinition.addSupportedProperty("settable_per_extruder", DefinitionPropertyType.Any, default = True) SettingDefinition.addSupportedProperty("settable_per_extruder", DefinitionPropertyType.Any, default = True)
SettingDefinition.addSupportedProperty("settable_per_meshgroup", DefinitionPropertyType.Any, default = True) SettingDefinition.addSupportedProperty("settable_per_meshgroup", DefinitionPropertyType.Any, default = True)
SettingDefinition.addSupportedProperty("settable_globally", DefinitionPropertyType.Any, default = True) SettingDefinition.addSupportedProperty("settable_globally", DefinitionPropertyType.Any, default = True)
SettingDefinition.addSettingType("extruder", None, str, Validator) SettingDefinition.addSupportedProperty("global_inherits_stack", DefinitionPropertyType.Function, default = "-1")
SettingDefinition.addSettingType("extruder", int, str, Validator)
## Add the 4 types of profiles to storage. ## Add the 4 types of profiles to storage.
Resources.addStorageType(self.ResourceTypes.QualityInstanceContainer, "quality") Resources.addStorageType(self.ResourceTypes.QualityInstanceContainer, "quality")

View file

@ -22,7 +22,7 @@ class ExtruderManager(QObject):
def __init__(self, parent = None): def __init__(self, parent = None):
super().__init__(parent) super().__init__(parent)
self._extruder_trains = { } #Per machine, a dictionary of extruder container stack IDs. self._extruder_trains = { } #Per machine, a dictionary of extruder container stack IDs.
self._active_extruder_index = -1 self._active_extruder_index = 0
UM.Application.getInstance().globalContainerStackChanged.connect(self.__globalContainerStackChanged) UM.Application.getInstance().globalContainerStackChanged.connect(self.__globalContainerStackChanged)
self._addCurrentMachineExtruders() self._addCurrentMachineExtruders()
@ -41,6 +41,19 @@ class ExtruderManager(QObject):
except KeyError: # Extruder index could be -1 if the global tab is selected, or the entry doesn't exist if the machine definition is wrong. except KeyError: # Extruder index could be -1 if the global tab is selected, or the entry doesn't exist if the machine definition is wrong.
return None return None
@pyqtProperty(int, notify = extrudersChanged)
def extruderCount(self):
if not UM.Application.getInstance().getGlobalContainerStack():
return 0 # No active machine, so no extruders.
return len(self._extruder_trains[UM.Application.getInstance().getGlobalContainerStack().getId()])
@pyqtProperty("QVariantMap", notify=extrudersChanged)
def extruderIds(self):
map = {}
for position in self._extruder_trains[UM.Application.getInstance().getGlobalContainerStack().getId()]:
map[position] = self._extruder_trains[UM.Application.getInstance().getGlobalContainerStack().getId()][position].getId()
return map
## The instance of the singleton pattern. ## The instance of the singleton pattern.
# #
# It's None if the extruder manager hasn't been created yet. # It's None if the extruder manager hasn't been created yet.
@ -106,8 +119,11 @@ class ExtruderManager(QObject):
for extruder_train in extruder_trains: for extruder_train in extruder_trains:
self._extruder_trains[machine_id][extruder_train.getMetaDataEntry("position")] = extruder_train self._extruder_trains[machine_id][extruder_train.getMetaDataEntry("position")] = extruder_train
# Ensure that the extruder train stacks are linked to global stack. # Make sure the next stack is a stack that contains only the machine definition
extruder_train.setNextStack(UM.Application.getInstance().getGlobalContainerStack()) if not extruder_train.getNextStack():
shallowStack = UM.Settings.ContainerStack(machine_id + "_shallow")
shallowStack.addContainer(machine_definition)
extruder_train.setNextStack(shallowStack)
changed = True changed = True
if changed: if changed:
self.extrudersChanged.emit(machine_id) self.extrudersChanged.emit(machine_id)
@ -220,7 +236,11 @@ class ExtruderManager(QObject):
container_registry.addContainer(user_profile) container_registry.addContainer(user_profile)
container_stack.addContainer(user_profile) container_stack.addContainer(user_profile)
container_stack.setNextStack(UM.Application.getInstance().getGlobalContainerStack()) # Make sure the next stack is a stack that contains only the machine definition
if not container_stack.getNextStack():
shallowStack = UM.Settings.ContainerStack(machine_id + "_shallow")
shallowStack.addContainer(machine_definition)
container_stack.setNextStack(shallowStack)
container_registry.addContainer(container_stack) container_registry.addContainer(container_stack)

View file

@ -50,6 +50,8 @@ class MachineManager(QObject):
Preferences.getInstance().addPreference("cura/active_machine", "") Preferences.getInstance().addPreference("cura/active_machine", "")
self._global_event_keys = set()
active_machine_id = Preferences.getInstance().getValue("cura/active_machine") active_machine_id = Preferences.getInstance().getValue("cura/active_machine")
self._printer_output_devices = [] self._printer_output_devices = []
@ -58,7 +60,9 @@ class MachineManager(QObject):
if active_machine_id != "": if active_machine_id != "":
# An active machine was saved, so restore it. # An active machine was saved, so restore it.
self.setActiveMachine(active_machine_id) self.setActiveMachine(active_machine_id)
pass if self._global_container_stack and self._global_container_stack.getProperty("machine_extruder_count", "value") > 1:
# Make sure _active_container_stack is properly initiated
ExtruderManager.getInstance().setActiveExtruderIndex(0)
self._auto_change_material_hotend_flood_window = 10 # The minimum number of seconds between asking if the material or hotend on the machine should be used self._auto_change_material_hotend_flood_window = 10 # The minimum number of seconds between asking if the material or hotend on the machine should be used
self._auto_change_material_hotend_flood_time = 0 # The last timestamp (in seconds) when the user was asked about changing the material or hotend to whatis loaded on the machine self._auto_change_material_hotend_flood_time = 0 # The last timestamp (in seconds) when the user was asked about changing the material or hotend to whatis loaded on the machine
@ -197,7 +201,85 @@ class MachineManager(QObject):
def _onGlobalPropertyChanged(self, key, property_name): def _onGlobalPropertyChanged(self, key, property_name):
if property_name == "value": if property_name == "value":
## We can get recursion issues. So we store a list of keys that we are still handling to prevent this.
if key in self._global_event_keys:
return
self._global_event_keys.add(key)
self.globalValueChanged.emit() self.globalValueChanged.emit()
if self._active_container_stack and self._active_container_stack != self._global_container_stack:
# Make the global current settings mirror the stack values appropriate for this setting
if self._active_container_stack.getProperty("extruder_nr", "value") == int(self._active_container_stack.getProperty(key, "global_inherits_stack")):
new_value = self._active_container_stack.getProperty(key, "value")
self._global_container_stack.getTop().setProperty(key, "value", new_value)
# Global-only setting values should be set on all extruders and the global stack
if not self._global_container_stack.getProperty(key, "settable_per_extruder"):
extruder_stacks = list(ExtruderManager.getInstance().getMachineExtruders(self._global_container_stack.getId()))
target_stack_position = int(self._active_container_stack.getProperty(key, "global_inherits_stack"))
if target_stack_position == -1: # Prevent -1 from selecting wrong stack.
target_stack = self._active_container_stack
else:
target_stack = extruder_stacks[target_stack_position]
new_value = target_stack.getProperty(key, "value")
target_stack_has_user_value = target_stack.getTop().getInstance(key) != None
for extruder_stack in extruder_stacks:
if extruder_stack != target_stack:
if target_stack_has_user_value:
extruder_stack.getTop().setProperty(key, "value", new_value)
else:
# Remove from the value from the other stacks as well, unless the
# top value from the other stacklevels is different than the new value
for container in extruder_stack.getContainers():
if container.__class__ == UM.Settings.InstanceContainer and container.getInstance(key) != None:
if container.getProperty(key, "value") != new_value:
# It could be that the setting needs to be removed instead of updated.
temp = extruder_stack
containers = extruder_stack.getContainers()
# Ensure we have the entire 'chain'
while temp.getNextStack():
temp = temp.getNextStack()
containers.extend(temp.getContainers())
instance_needs_removal = False
if len(containers) > 1:
for index in range(1, len(containers)):
deeper_container = containers[index]
if deeper_container.getProperty(key, "value") is None:
continue # Deeper container does not have the value, so continue.
if deeper_container.getProperty(key, "value") == new_value:
# Removal will result in correct value, so do that.
# We do this to prevent the reset from showing up unneeded.
instance_needs_removal = True
break
else:
# Container has the value, but it's not the same. Stop looking.
break
if instance_needs_removal:
extruder_stack.getTop().removeInstance(key)
else:
extruder_stack.getTop().setProperty(key, "value", new_value)
else:
# Check if we really need to remove something.
if extruder_stack.getProperty(key, "value") != new_value:
extruder_stack.getTop().removeInstance(key)
break
if self._global_container_stack.getProperty(key, "value") != new_value:
self._global_container_stack.getTop().setProperty(key, "value", new_value)
self._global_event_keys.remove(key)
if property_name == "global_inherits_stack":
if self._active_container_stack and self._active_container_stack != self._global_container_stack:
# Update the global user value when the "global_inherits_stack" function points to a different stack
stack_index = int(self._active_container_stack.getProperty(key, property_name))
extruder_stacks = [stack for stack in ExtruderManager.getInstance().getMachineExtruders(self._global_container_stack.getId())]
if len(extruder_stacks) > stack_index:
new_value = extruder_stacks[stack_index].getProperty(key, "value")
if self._global_container_stack.getProperty(key, "value") != new_value:
self._global_container_stack.getTop().setProperty(key, "value", new_value)
if property_name == "validationState": if property_name == "validationState":
if self._global_stack_valid: if self._global_stack_valid:
changed_validation_state = self._active_container_stack.getProperty(key, property_name) changed_validation_state = self._active_container_stack.getProperty(key, property_name)
@ -209,7 +291,6 @@ class MachineManager(QObject):
if not has_errors: if not has_errors:
self._global_stack_valid = True self._global_stack_valid = True
self.globalValidationChanged.emit() self.globalValidationChanged.emit()
def _onGlobalContainerChanged(self): def _onGlobalContainerChanged(self):
if self._global_container_stack: if self._global_container_stack:
self._global_container_stack.nameChanged.disconnect(self._onMachineNameChanged) self._global_container_stack.nameChanged.disconnect(self._onMachineNameChanged)
@ -254,6 +335,18 @@ class MachineManager(QObject):
def _onInstanceContainersChanged(self, container): def _onInstanceContainersChanged(self, container):
container_type = container.getMetaDataEntry("type") container_type = container.getMetaDataEntry("type")
if self._active_container_stack and self._active_container_stack != self._global_container_stack:
if int(self._active_container_stack.getProperty("extruder_nr", "value")) == 0:
global_container = self._global_container_stack.findContainer({"type": container_type})
if global_container and global_container != container:
container_index = self._global_container_stack.getContainerIndex(global_container)
self._global_container_stack.replaceContainer(container_index, container)
for key in container.getAllKeys():
# Make sure the values in this profile are distributed to other stacks if necessary
self._onGlobalPropertyChanged(key, "value")
if container_type == "material": if container_type == "material":
self.activeMaterialChanged.emit() self.activeMaterialChanged.emit()
elif container_type == "variant": elif container_type == "variant":
@ -269,13 +362,14 @@ class MachineManager(QObject):
@pyqtSlot(str, str) @pyqtSlot(str, str)
def addMachine(self, name, definition_id): def addMachine(self, name, definition_id):
definitions = UM.Settings.ContainerRegistry.getInstance().findDefinitionContainers(id = definition_id) container_registry = UM.Settings.ContainerRegistry.getInstance()
definitions = container_registry.findDefinitionContainers(id = definition_id)
if definitions: if definitions:
definition = definitions[0] definition = definitions[0]
name = self._createUniqueName("machine", "", name, definition.getName()) name = self._createUniqueName("machine", "", name, definition.getName())
new_global_stack = UM.Settings.ContainerStack(name) new_global_stack = UM.Settings.ContainerStack(name)
new_global_stack.addMetaDataEntry("type", "machine") new_global_stack.addMetaDataEntry("type", "machine")
UM.Settings.ContainerRegistry.getInstance().addContainer(new_global_stack) container_registry.addContainer(new_global_stack)
variant_instance_container = self._updateVariantContainer(definition) variant_instance_container = self._updateVariantContainer(definition)
material_instance_container = self._updateMaterialContainer(definition, variant_instance_container) material_instance_container = self._updateMaterialContainer(definition, variant_instance_container)
@ -285,7 +379,7 @@ class MachineManager(QObject):
current_settings_instance_container.addMetaDataEntry("machine", name) current_settings_instance_container.addMetaDataEntry("machine", name)
current_settings_instance_container.addMetaDataEntry("type", "user") current_settings_instance_container.addMetaDataEntry("type", "user")
current_settings_instance_container.setDefinition(definitions[0]) current_settings_instance_container.setDefinition(definitions[0])
UM.Settings.ContainerRegistry.getInstance().addContainer(current_settings_instance_container) container_registry.addContainer(current_settings_instance_container)
# If a definition is found, its a list. Should only have one item. # If a definition is found, its a list. Should only have one item.
new_global_stack.addContainer(definition) new_global_stack.addContainer(definition)
@ -418,6 +512,19 @@ class MachineManager(QObject):
return True return True
return containers[0].isReadOnly() return containers[0].isReadOnly()
## Copy the value of the setting of the current extruder to all other extruders as well as the global container.
@pyqtSlot(str)
def copyValueToExtruders(self, key):
if not self._active_container_stack or self._global_container_stack.getProperty("machine_extruder_count", "value") <= 1:
return
new_value = self._active_container_stack.getProperty(key, "value")
stacks = [stack for stack in ExtruderManager.getInstance().getMachineExtruders(self._global_container_stack.getId())]
stacks.append(self._global_container_stack)
for extruder_stack in stacks:
if extruder_stack != self._active_container_stack and extruder_stack.getProperty(key, "value") != new_value:
extruder_stack.getTop().setProperty(key, "value", new_value)
@pyqtSlot(result = str) @pyqtSlot(result = str)
def newQualityContainerFromQualityAndUser(self): def newQualityContainerFromQualityAndUser(self):
new_container_id = self.duplicateContainer(self.activeQualityId) new_container_id = self.duplicateContainer(self.activeQualityId)

View file

@ -47,7 +47,7 @@
"adhesion_type": "\"skirt\" if (platform_adhesion == \"None\") else platform_adhesion.lower()", "adhesion_type": "\"skirt\" if (platform_adhesion == \"None\") else platform_adhesion.lower()",
"skirt_line_count": "skirt_line_count", "skirt_line_count": "skirt_line_count",
"skirt_gap": "skirt_gap", "skirt_gap": "skirt_gap",
"skirt_minimal_length": "skirt_minimal_length", "skirt_brim_minimal_length": "skirt_minimal_length",
"brim_line_count": "brim_line_count", "brim_line_count": "brim_line_count",
"raft_margin": "raft_margin", "raft_margin": "raft_margin",
"raft_airgap": "float(raft_airgap_all) + float(raft_airgap)", "raft_airgap": "float(raft_airgap_all) + float(raft_airgap)",

View file

@ -181,6 +181,7 @@ Item {
onLoaded: { onLoaded: {
settingLoader.item.showRevertButton = false settingLoader.item.showRevertButton = false
settingLoader.item.showInheritButton = false settingLoader.item.showInheritButton = false
settingLoader.item.showLinkedSettingIcon = false
settingLoader.item.doDepthIndentation = false settingLoader.item.doDepthIndentation = false
settingLoader.item.doQualityUserSettingEmphasis = false settingLoader.item.doQualityUserSettingEmphasis = false
} }

View file

@ -31,6 +31,9 @@ _setting_name_translations = {
"remove_overlapping_walls_enabled": "travel_compensate_overlapping_walls_enabled", "remove_overlapping_walls_enabled": "travel_compensate_overlapping_walls_enabled",
"remove_overlapping_walls_x_enabled": "travel_compensate_overlapping_walls_x_enabled", "remove_overlapping_walls_x_enabled": "travel_compensate_overlapping_walls_x_enabled",
"retraction_hop": "retraction_hop_enabled", "retraction_hop": "retraction_hop_enabled",
"skirt_line_width": "skirt_brim_line_width",
"skirt_minimal_length": "skirt_brim_minimal_length",
"skirt_speed": "skirt_brim_speed",
"speed_support_lines": "speed_support_infill" "speed_support_lines": "speed_support_infill"
} }
@ -157,6 +160,15 @@ class VersionUpgrade21to22(VersionUpgrade):
elif key == "retraction_hop": #Setting key was changed. elif key == "retraction_hop": #Setting key was changed.
del settings[key] del settings[key]
settings["retraction_hop_enabled"] = value settings["retraction_hop_enabled"] = value
elif key == "skirt_minimal_length": #Setting key was changed.
del settings[key]
settings["skirt_brim_minimal_length"] = value
elif key == "skirt_line_width": #Setting key was changed.
del settings[key]
settings["skirt_brim_line_width"] = value
elif key == "skirt_speed": #Setting key was changed.
del settings[key]
settings["skirt_brim_speed"] = value
elif key == "speed_support_lines": #Setting key was changed. elif key == "speed_support_lines": #Setting key was changed.
del settings[key] del settings[key]
settings["speed_support_infill"] = value settings["speed_support_infill"] = value

View file

@ -38,9 +38,9 @@
"speed_wall_0": { "default_value": 30 }, "speed_wall_0": { "default_value": 30 },
"speed_infill": { "default_value": 80 }, "speed_infill": { "default_value": 80 },
"speed_topbottom": { "default_value": 35 }, "speed_topbottom": { "default_value": 35 },
"skirt_speed": { "default_value": 35 }, "skirt_brim_speed": { "default_value": 35 },
"skirt_line_count": { "default_value": 4 }, "skirt_line_count": { "default_value": 4 },
"skirt_minimal_length": { "default_value": 30 }, "skirt_brim_minimal_length": { "default_value": 30 },
"skirt_gap": { "default_value": 6 }, "skirt_gap": { "default_value": 6 },
"cool_fan_full_at_height": { "default_value": 0.4 } "cool_fan_full_at_height": { "default_value": 0.4 }
} }

View file

@ -89,13 +89,13 @@
"speed_topbottom": { "speed_topbottom": {
"default_value": 35 "default_value": 35
}, },
"skirt_speed": { "skirt_brim_speed": {
"default_value": 35 "default_value": 35
}, },
"skirt_line_count": { "skirt_line_count": {
"default_value": 4 "default_value": 4
}, },
"skirt_minimal_length": { "skirt_brim_minimal_length": {
"default_value": 30 "default_value": 30
}, },
"skirt_gap": { "skirt_gap": {

View file

@ -603,10 +603,10 @@
"value": "line_width", "value": "line_width",
"settable_per_mesh": true "settable_per_mesh": true
}, },
"skirt_line_width": "skirt_brim_line_width":
{ {
"label": "Skirt Line Width", "label": "Skirt/Brim Line Width",
"description": "Width of a single skirt line.", "description": "Width of a single skirt or brim line.",
"unit": "mm", "unit": "mm",
"minimum_value": "0.0001", "minimum_value": "0.0001",
"minimum_value_warning": "0.2", "minimum_value_warning": "0.2",
@ -614,6 +614,7 @@
"default_value": 0.4, "default_value": 0.4,
"type": "float", "type": "float",
"value": "line_width", "value": "line_width",
"enabled": "adhesion_type == \"skirt\" or adhesion_type == \"brim\"",
"settable_per_mesh": false, "settable_per_mesh": false,
"settable_per_extruder": true "settable_per_extruder": true
}, },
@ -629,6 +630,7 @@
"type": "float", "type": "float",
"enabled": "support_enable", "enabled": "support_enable",
"value": "line_width", "value": "line_width",
"global_inherits_stack": "support_extruder_nr",
"settable_per_mesh": false, "settable_per_mesh": false,
"settable_per_extruder": false "settable_per_extruder": false
}, },
@ -643,6 +645,7 @@
"type": "float", "type": "float",
"enabled": "support_roof_enable", "enabled": "support_roof_enable",
"value": "line_width", "value": "line_width",
"global_inherits_stack": "support_extruder_nr",
"settable_per_mesh": false, "settable_per_mesh": false,
"settable_per_extruder": false "settable_per_extruder": false
}, },
@ -1442,6 +1445,7 @@
"maximum_value_warning": "150", "maximum_value_warning": "150",
"default_value": 60, "default_value": 60,
"value": "speed_print", "value": "speed_print",
"global_inherits_stack": "support_extruder_nr",
"enabled": "support_enable", "enabled": "support_enable",
"settable_per_mesh": false, "settable_per_mesh": false,
"settable_per_extruder": false, "settable_per_extruder": false,
@ -1458,6 +1462,7 @@
"maximum_value": "299792458000", "maximum_value": "299792458000",
"maximum_value_warning": "150", "maximum_value_warning": "150",
"value": "speed_support", "value": "speed_support",
"global_inherits_stack": "support_extruder_nr",
"enabled": "support_enable", "enabled": "support_enable",
"settable_per_mesh": false, "settable_per_mesh": false,
"settable_per_extruder": false "settable_per_extruder": false
@ -1474,6 +1479,7 @@
"maximum_value_warning": "150", "maximum_value_warning": "150",
"enabled": "support_roof_enable and support_enable", "enabled": "support_roof_enable and support_enable",
"value": "speed_support / 1.5", "value": "speed_support / 1.5",
"global_inherits_stack": "support_extruder_nr",
"settable_per_mesh": false, "settable_per_mesh": false,
"settable_per_extruder": false "settable_per_extruder": false
} }
@ -1520,9 +1526,9 @@
"maximum_value_warning": "300", "maximum_value_warning": "300",
"settable_per_mesh": true "settable_per_mesh": true
}, },
"skirt_speed": { "skirt_brim_speed": {
"label": "Skirt Speed", "label": "Skirt/Brim Speed",
"description": "The speed at which the skirt and brim are printed. Normally this is done at the initial layer speed, but sometimes you might want to print the skirt at a different speed.", "description": "The speed at which the skirt and brim are printed. Normally this is done at the initial layer speed, but sometimes you might want to print the skirt or brim at a different speed.",
"unit": "mm/s", "unit": "mm/s",
"type": "float", "type": "float",
"default_value": 30, "default_value": 30,
@ -1530,6 +1536,7 @@
"maximum_value": "299792458000", "maximum_value": "299792458000",
"maximum_value_warning": "300", "maximum_value_warning": "300",
"value": "speed_layer_0", "value": "speed_layer_0",
"enabled": "adhesion_type == \"skirt\" or adhesion_type == \"brim\"",
"settable_per_mesh": false, "settable_per_mesh": false,
"settable_per_extruder": true "settable_per_extruder": true
}, },
@ -1644,6 +1651,7 @@
"maximum_value_warning": "10000", "maximum_value_warning": "10000",
"default_value": 3000, "default_value": 3000,
"value": "acceleration_print", "value": "acceleration_print",
"global_inherits_stack": "support_extruder_nr",
"enabled": "acceleration_enabled and support_enable", "enabled": "acceleration_enabled and support_enable",
"settable_per_mesh": false, "settable_per_mesh": false,
"settable_per_extruder": false, "settable_per_extruder": false,
@ -1655,6 +1663,7 @@
"type": "float", "type": "float",
"default_value": 3000, "default_value": 3000,
"value": "acceleration_support", "value": "acceleration_support",
"global_inherits_stack": "support_extruder_nr",
"minimum_value": "0.1", "minimum_value": "0.1",
"minimum_value_warning": "100", "minimum_value_warning": "100",
"maximum_value_warning": "10000", "maximum_value_warning": "10000",
@ -1669,6 +1678,7 @@
"type": "float", "type": "float",
"default_value": 3000, "default_value": 3000,
"value": "acceleration_support", "value": "acceleration_support",
"global_inherits_stack": "support_extruder_nr",
"minimum_value": "0.1", "minimum_value": "0.1",
"minimum_value_warning": "100", "minimum_value_warning": "100",
"maximum_value_warning": "10000", "maximum_value_warning": "10000",
@ -1719,9 +1729,9 @@
"enabled": "acceleration_enabled", "enabled": "acceleration_enabled",
"settable_per_mesh": true "settable_per_mesh": true
}, },
"acceleration_skirt": { "acceleration_skirt_brim": {
"label": "Skirt Acceleration", "label": "Skirt/Brim Acceleration",
"description": "The acceleration with which the skirt and brim are printed. Normally this is done with the initial layer acceleration, but sometimes you might want to print the skirt at a different acceleration.", "description": "The acceleration with which the skirt and brim are printed. Normally this is done with the initial layer acceleration, but sometimes you might want to print the skirt or brim at a different acceleration.",
"unit": "mm/s²", "unit": "mm/s²",
"type": "float", "type": "float",
"default_value": 3000, "default_value": 3000,
@ -1832,6 +1842,7 @@
"maximum_value_warning": "50", "maximum_value_warning": "50",
"default_value": 20, "default_value": 20,
"value": "jerk_print", "value": "jerk_print",
"global_inherits_stack": "support_extruder_nr",
"enabled": "jerk_enabled and support_enable", "enabled": "jerk_enabled and support_enable",
"settable_per_mesh": false, "settable_per_mesh": false,
"settable_per_extruder": false, "settable_per_extruder": false,
@ -1843,6 +1854,7 @@
"type": "float", "type": "float",
"default_value": 20, "default_value": 20,
"value": "jerk_support", "value": "jerk_support",
"global_inherits_stack": "support_extruder_nr",
"minimum_value": "0.1", "minimum_value": "0.1",
"minimum_value_warning": "5", "minimum_value_warning": "5",
"maximum_value_warning": "50", "maximum_value_warning": "50",
@ -1857,6 +1869,7 @@
"type": "float", "type": "float",
"default_value": 20, "default_value": 20,
"value": "jerk_support", "value": "jerk_support",
"global_inherits_stack": "support_extruder_nr",
"minimum_value": "0.1", "minimum_value": "0.1",
"minimum_value_warning": "5", "minimum_value_warning": "5",
"maximum_value_warning": "50", "maximum_value_warning": "50",
@ -1907,8 +1920,8 @@
"enabled": "jerk_enabled", "enabled": "jerk_enabled",
"settable_per_mesh": true "settable_per_mesh": true
}, },
"jerk_skirt": { "jerk_skirt_brim": {
"label": "Skirt Jerk", "label": "Skirt/Brim Jerk",
"description": "The maximum instantaneous velocity change with which the skirt and brim are printed.", "description": "The maximum instantaneous velocity change with which the skirt and brim are printed.",
"unit": "mm/s", "unit": "mm/s",
"type": "float", "type": "float",
@ -2121,7 +2134,8 @@
"description": "Enable support structures. These structures support parts of the model with severe overhangs.", "description": "Enable support structures. These structures support parts of the model with severe overhangs.",
"type": "bool", "type": "bool",
"default_value": false, "default_value": false,
"settable_per_mesh": true "settable_per_mesh": true,
"settable_per_extruder": false
}, },
"support_type": "support_type":
{ {
@ -2147,6 +2161,7 @@
"minimum_value": "0", "minimum_value": "0",
"maximum_value": "90", "maximum_value": "90",
"default_value": 50, "default_value": 50,
"global_inherits_stack": "support_extruder_nr",
"enabled": "support_enable", "enabled": "support_enable",
"settable_per_mesh": true "settable_per_mesh": true
}, },
@ -2215,6 +2230,7 @@
"minimum_value": "0", "minimum_value": "0",
"maximum_value_warning": "10", "maximum_value_warning": "10",
"default_value": 0.15, "default_value": 0.15,
"global_inherits_stack": "support_extruder_nr",
"enabled": "support_enable", "enabled": "support_enable",
"settable_per_mesh": true, "settable_per_mesh": true,
"children": "children":
@ -2230,6 +2246,7 @@
"type": "float", "type": "float",
"enabled": "support_enable", "enabled": "support_enable",
"value": "support_z_distance", "value": "support_z_distance",
"global_inherits_stack": "support_extruder_nr",
"settable_per_mesh": true "settable_per_mesh": true
}, },
"support_bottom_distance": "support_bottom_distance":
@ -2241,6 +2258,7 @@
"maximum_value_warning": "10", "maximum_value_warning": "10",
"default_value": 0.1, "default_value": 0.1,
"value": "0.1 if support_type == 'everywhere' else 0", "value": "0.1 if support_type == 'everywhere' else 0",
"global_inherits_stack": "support_extruder_nr",
"type": "float", "type": "float",
"enabled": "support_enable and support_type == 'everywhere'", "enabled": "support_enable and support_type == 'everywhere'",
"settable_per_mesh": true "settable_per_mesh": true
@ -2256,6 +2274,7 @@
"minimum_value": "0", "minimum_value": "0",
"maximum_value_warning": "10", "maximum_value_warning": "10",
"default_value": 0.7, "default_value": 0.7,
"global_inherits_stack": "support_extruder_nr",
"enabled": "support_enable", "enabled": "support_enable",
"settable_per_mesh": true "settable_per_mesh": true
}, },
@ -2268,6 +2287,7 @@
"z_overrides_xy": "Z overrides X/Y" "z_overrides_xy": "Z overrides X/Y"
}, },
"default_value": "z_overrides_xy", "default_value": "z_overrides_xy",
"global_inherits_stack": "support_extruder_nr",
"enabled": "support_enable", "enabled": "support_enable",
"settable_per_mesh": true "settable_per_mesh": true
}, },
@ -2280,6 +2300,7 @@
"maximum_value_warning": "10", "maximum_value_warning": "10",
"default_value": 0.2, "default_value": 0.2,
"value": "machine_nozzle_size / 2", "value": "machine_nozzle_size / 2",
"global_inherits_stack": "support_extruder_nr",
"enabled": "support_enable and support_xy_overrides_z=='z_overrides_xy'", "enabled": "support_enable and support_xy_overrides_z=='z_overrides_xy'",
"settable_per_mesh": true "settable_per_mesh": true
}, },
@ -2290,6 +2311,7 @@
"unit": "mm", "unit": "mm",
"type": "float", "type": "float",
"default_value": 0.3, "default_value": 0.3,
"global_inherits_stack": "support_extruder_nr",
"minimum_value": "0", "minimum_value": "0",
"maximum_value_warning": "1.0", "maximum_value_warning": "1.0",
"enabled": "support_enable", "enabled": "support_enable",
@ -2302,6 +2324,7 @@
"unit": "mm", "unit": "mm",
"type": "float", "type": "float",
"default_value": 2.0, "default_value": 2.0,
"global_inherits_stack": "support_extruder_nr",
"minimum_value_warning": "0", "minimum_value_warning": "0",
"maximum_value_warning": "10", "maximum_value_warning": "10",
"enabled": "support_enable", "enabled": "support_enable",
@ -2314,6 +2337,7 @@
"unit": "mm", "unit": "mm",
"type": "float", "type": "float",
"default_value": 0.2, "default_value": 0.2,
"global_inherits_stack": "support_extruder_nr",
"minimum_value_warning": "-0.5", "minimum_value_warning": "-0.5",
"maximum_value_warning": "5.0", "maximum_value_warning": "5.0",
"enabled": "support_enable", "enabled": "support_enable",
@ -2326,6 +2350,7 @@
"unit": "mm", "unit": "mm",
"type": "float", "type": "float",
"default_value": 0.6, "default_value": 0.6,
"global_inherits_stack": "support_extruder_nr",
"minimum_value": "0", "minimum_value": "0",
"maximum_value_warning": "1.0", "maximum_value_warning": "1.0",
"enabled": "support_enable", "enabled": "support_enable",
@ -2337,6 +2362,7 @@
"description": "Generate a dense top skin at the top of the support on which the model is printed.", "description": "Generate a dense top skin at the top of the support on which the model is printed.",
"type": "bool", "type": "bool",
"default_value": false, "default_value": false,
"global_inherits_stack": "support_extruder_nr",
"enabled": "support_enable", "enabled": "support_enable",
"settable_per_mesh": true "settable_per_mesh": true
}, },
@ -2348,6 +2374,7 @@
"type": "float", "type": "float",
"default_value": 1, "default_value": 1,
"minimum_value": "0", "minimum_value": "0",
"global_inherits_stack": "support_extruder_nr",
"maximum_value_warning": "10", "maximum_value_warning": "10",
"enabled": "support_roof_enable and support_enable", "enabled": "support_roof_enable and support_enable",
"settable_per_mesh": true "settable_per_mesh": true
@ -2405,6 +2432,7 @@
"description": "Use specialized towers to support tiny overhang areas. These towers have a larger diameter than the region they support. Near the overhang the towers' diameter decreases, forming a roof.", "description": "Use specialized towers to support tiny overhang areas. These towers have a larger diameter than the region they support. Near the overhang the towers' diameter decreases, forming a roof.",
"type": "bool", "type": "bool",
"default_value": true, "default_value": true,
"global_inherits_stack": "support_extruder_nr",
"enabled": "support_enable", "enabled": "support_enable",
"settable_per_mesh": true "settable_per_mesh": true
}, },
@ -2415,6 +2443,7 @@
"unit": "mm", "unit": "mm",
"type": "float", "type": "float",
"default_value": 3.0, "default_value": 3.0,
"global_inherits_stack": "support_extruder_nr",
"minimum_value": "0", "minimum_value": "0",
"maximum_value_warning": "10", "maximum_value_warning": "10",
"enabled": "support_enable and support_use_towers", "enabled": "support_enable and support_use_towers",
@ -2427,6 +2456,7 @@
"unit": "mm", "unit": "mm",
"type": "float", "type": "float",
"default_value": 3.0, "default_value": 3.0,
"global_inherits_stack": "support_extruder_nr",
"minimum_value": "0", "minimum_value": "0",
"maximum_value_warning": "10", "maximum_value_warning": "10",
"maximum_value": "support_tower_diameter", "maximum_value": "support_tower_diameter",
@ -2442,6 +2472,7 @@
"minimum_value": "0", "minimum_value": "0",
"maximum_value": "90", "maximum_value": "90",
"default_value": 65, "default_value": 65,
"global_inherits_stack": "support_extruder_nr",
"enabled": "support_enable and support_use_towers", "enabled": "support_enable and support_use_towers",
"settable_per_mesh": true "settable_per_mesh": true
} }
@ -2521,17 +2552,17 @@
"settable_per_mesh": false, "settable_per_mesh": false,
"settable_per_extruder": true "settable_per_extruder": true
}, },
"skirt_minimal_length": "skirt_brim_minimal_length":
{ {
"label": "Skirt Minimum Length", "label": "Skirt/Brim Minimum Length",
"description": "The minimum length of the skirt. If this length is not reached by the skirt line count, more skirt lines will be added until the minimum length is reached. Note: If the line count is set to 0 this is ignored.", "description": "The minimum length of the skirt or brim. If this length is not reached by all skirt or brim lines together, more skirt or brim lines will be added until the minimum length is reached. Note: If the line count is set to 0 this is ignored.",
"unit": "mm", "unit": "mm",
"type": "float", "type": "float",
"default_value": 250, "default_value": 250,
"minimum_value": "0", "minimum_value": "0",
"minimum_value_warning": "25", "minimum_value_warning": "25",
"maximum_value_warning": "2500", "maximum_value_warning": "2500",
"enabled": "adhesion_type == \"skirt\"", "enabled": "adhesion_type == \"skirt\" or adhesion_type == \"brim\"",
"settable_per_mesh": false, "settable_per_mesh": false,
"settable_per_extruder": true "settable_per_extruder": true
}, },
@ -2557,7 +2588,7 @@
"default_value": 20, "default_value": 20,
"minimum_value": "0", "minimum_value": "0",
"maximum_value_warning": "300", "maximum_value_warning": "300",
"value": "math.ceil(brim_width / skirt_line_width)", "value": "math.ceil(brim_width / skirt_brim_line_width)",
"enabled": "adhesion_type == \"brim\"", "enabled": "adhesion_type == \"brim\"",
"settable_per_mesh": false, "settable_per_mesh": false,
"settable_per_extruder": true "settable_per_extruder": true
@ -2597,7 +2628,7 @@
"value": "raft_airgap / 2", "value": "raft_airgap / 2",
"minimum_value": "0", "minimum_value": "0",
"maximum_value_warning": "layer_height", "maximum_value_warning": "layer_height",
"enabled": "adhesion_type == 'raft'", "enabled": "adhesion_type == \"raft\"",
"settable_per_mesh": false, "settable_per_mesh": false,
"settable_per_extruder": true "settable_per_extruder": true
}, },

View file

@ -94,7 +94,7 @@
"speed_layer_0": { "speed_layer_0": {
"default_value": 20 "default_value": 20
}, },
"skirt_speed": { "skirt_brim_speed": {
"default_value": 15 "default_value": 15
}, },
"speed_slowdown_layers": { "speed_slowdown_layers": {

View file

@ -61,6 +61,6 @@
"cool_fan_speed": { "default": 0 }, "cool_fan_speed": { "default": 0 },
"skirt_line_count": { "default": 3 }, "skirt_line_count": { "default": 3 },
"skirt_gap": { "default": 4 }, "skirt_gap": { "default": 4 },
"skirt_minimal_length": { "default": 200 } "skirt_brim_minimal_length": { "default": 200 }
} }
} }

View file

@ -94,7 +94,7 @@
"default_value": 4, "default_value": 4,
"enabled": "adhesion_type == \"Skirt\"" "enabled": "adhesion_type == \"Skirt\""
}, },
"skirt_minimal_length": { "skirt_brim_minimal_length": {
"default_value": 200, "default_value": 200,
"enabled": "adhesion_type == \"Skirt\"" "enabled": "adhesion_type == \"Skirt\""
} }

View file

@ -97,7 +97,7 @@
"default_value": 4, "default_value": 4,
"enabled": "adhesion_type == \"Skirt\"" "enabled": "adhesion_type == \"Skirt\""
}, },
"skirt_minimal_length": { "skirt_brim_minimal_length": {
"default_value": 200, "default_value": 200,
"enabled": "adhesion_type == \"Skirt\"" "enabled": "adhesion_type == \"Skirt\""
} }

View file

@ -21,11 +21,13 @@ Item {
property var showRevertButton: true property var showRevertButton: true
property var showInheritButton: true property var showInheritButton: true
property var showLinkedSettingIcon: true
property var doDepthIndentation: true property var doDepthIndentation: true
property var doQualityUserSettingEmphasis: true property var doQualityUserSettingEmphasis: true
// Create properties to put property provider stuff in (bindings break in qt 5.5.1 otherwise) // Create properties to put property provider stuff in (bindings break in qt 5.5.1 otherwise)
property var state: propertyProvider.properties.state property var state: propertyProvider.properties.state
property var settablePerExtruder: propertyProvider.properties.settable_per_extruder
property var stackLevels: propertyProvider.stackLevels property var stackLevels: propertyProvider.stackLevels
property var stackLevel: stackLevels[0] property var stackLevel: stackLevels[0]
@ -132,6 +134,26 @@ Item {
verticalCenter: parent.verticalCenter verticalCenter: parent.verticalCenter
} }
UM.SimpleButton
{
id: linkedSettingIcon;
visible: base.settablePerExtruder != "True" && base.showLinkedSettingIcon
height: parent.height;
width: height;
backgroundColor: UM.Theme.getColor("setting_control");
hoverBackgroundColor: UM.Theme.getColor("setting_control")
color: UM.Theme.getColor("setting_control_button")
hoverColor: UM.Theme.getColor("setting_control_button")
iconSource: UM.Theme.getIcon("link")
onEntered: { hoverTimer.stop(); base.showTooltip(catalog.i18nc("@label", "This setting is always shared between all extruders. Changing it here will change the value for all extruders")) }
onExited: base.showTooltip(base.tooltipText);
}
UM.SimpleButton UM.SimpleButton
{ {
id: revertButton; id: revertButton;
@ -232,7 +254,6 @@ Item {
onEntered: { hoverTimer.stop(); base.showTooltip(catalog.i18nc("@label", "This setting is normally calculated, but it currently has an absolute value set.\n\nClick to restore the calculated value.")) } onEntered: { hoverTimer.stop(); base.showTooltip(catalog.i18nc("@label", "This setting is normally calculated, but it currently has an absolute value set.\n\nClick to restore the calculated value.")) }
onExited: base.showTooltip(base.tooltipText); onExited: base.showTooltip(base.tooltipText);
} }
} }
Item Item

View file

@ -34,14 +34,7 @@ ScrollView
expanded: Printer.expandedCategories expanded: Printer.expandedCategories
onExpandedChanged: Printer.setExpandedCategories(expanded) onExpandedChanged: Printer.setExpandedCategories(expanded)
filter: filter: {}
{
if(ExtruderManager.activeExtruderStackId)
{
return { "settable_per_extruder": true }
}
return { }
}
} }
delegate: Loader delegate: Loader
@ -53,7 +46,15 @@ ScrollView
Behavior on height { NumberAnimation { duration: 100 } } Behavior on height { NumberAnimation { duration: 100 } }
opacity: provider.properties.enabled == "True" ? 1 : 0 opacity: provider.properties.enabled == "True" ? 1 : 0
Behavior on opacity { NumberAnimation { duration: 100 } } Behavior on opacity { NumberAnimation { duration: 100 } }
enabled: provider.properties.enabled == "True" enabled:
{
if(!ExtruderManager.activeExtruderStackId && ExtruderManager.extruderCount > 0)
{
// disable all controls on the global tab, except categories
return model.type == "category"
}
return provider.properties.enabled == "True"
}
property var definition: model property var definition: model
property var settingDefinitionsModel: definitionsModel property var settingDefinitionsModel: definitionsModel
@ -88,20 +89,59 @@ ScrollView
} }
} }
// Binding to ensure that the right containerstack ID is set for the provider.
// This ensures that if a setting has a global_inherits_stack id (for instance; Support speed points to the
// extruder that actually prints the support, as that is the setting we need to use to calculate the value)
Binding
{
target: provider
property: "containerStackId"
value:
{
if(inheritStackProvider.properties.global_inherits_stack == -1 || inheritStackProvider.properties.global_inherits_stack == null)
{
if( ExtruderManager.activeExtruderStackId)
{
return ExtruderManager.activeExtruderStackId
}
else
{
return Cura.MachineManager.activeMachineId
}
}
return ExtruderManager.extruderIds[String(inheritStackProvider.properties.global_inherits_stack)]
}
}
// Specialty provider that only watches global_inherits (we cant filter on what property changed we get events
// so we bypass that to make a dedicated provider.
UM.SettingPropertyProvider
{
id: inheritStackProvider
containerStackId: Cura.MachineManager.activeMachineId
key: model.key
watchedProperties: [ "global_inherits_stack"]
}
UM.SettingPropertyProvider UM.SettingPropertyProvider
{ {
id: provider id: provider
containerStackId: ExtruderManager.activeExtruderStackId ? ExtruderManager.activeExtruderStackId : Cura.MachineManager.activeMachineId containerStackId: delegate.stackId
key: model.key ? model.key : "" key: model.key ? model.key : ""
watchedProperties: [ "value", "enabled", "state", "validationState" ] watchedProperties: [ "value", "enabled", "state", "validationState", "settable_per_extruder" ]
storeIndex: 0 storeIndex: 0
} }
Connections Connections
{ {
target: item target: item
onContextMenuRequested: { contextMenu.key = model.key; contextMenu.popup() } onContextMenuRequested:
{
contextMenu.key = model.key;
contextMenu.provider = provider
contextMenu.popup();
}
onShowTooltip: base.showTooltip(delegate, { x: 0, y: delegate.height / 2 }, text) onShowTooltip: base.showTooltip(delegate, { x: 0, y: delegate.height / 2 }, text)
onHideTooltip: base.hideTooltip() onHideTooltip: base.hideTooltip()
} }
@ -133,9 +173,24 @@ ScrollView
Menu Menu
{ {
id: contextMenu; id: contextMenu
property string key; property string key
property var provider
MenuItem
{
//: Settings context menu action
text: catalog.i18nc("@action:menu", "Copy value to all extruders")
visible: machineExtruderCount.properties.value > 1
enabled: contextMenu.provider.properties.settable_per_extruder != "False"
onTriggered: Cura.MachineManager.copyValueToExtruders(contextMenu.key)
}
MenuSeparator
{
visible: machineExtruderCount.properties.value > 1
}
MenuItem MenuItem
{ {
@ -151,5 +206,15 @@ ScrollView
onTriggered: Cura.Actions.configureSettingVisibility.trigger(contextMenu); onTriggered: Cura.Actions.configureSettingVisibility.trigger(contextMenu);
} }
} }
UM.SettingPropertyProvider
{
id: machineExtruderCount
containerStackId: Cura.MachineManager.activeMachineId
key: "machine_extruder_count"
watchedProperties: [ "value" ]
storeIndex: 0
}
} }
} }

View file

@ -84,15 +84,15 @@ Column
orientation: ListView.Horizontal orientation: ListView.Horizontal
model: Cura.ExtrudersModel { id: extrudersModel; addGlobal: true } model: Cura.ExtrudersModel { id: extrudersModel; addGlobal: false }
Connections Connections
{ {
target: Cura.MachineManager target: Cura.MachineManager
onGlobalContainerChanged: onGlobalContainerChanged:
{ {
base.currentExtruderIndex = -1; forceActiveFocus() // Changing focus applies the currently-being-typed values so it can change the displayed setting values.
forceActiveFocus() base.currentExtruderIndex = (machineExtruderCount.properties.value == 1) ? -1 : 0;
ExtruderManager.setActiveExtruderIndex(base.currentExtruderIndex); ExtruderManager.setActiveExtruderIndex(base.currentExtruderIndex);
} }
} }
@ -110,7 +110,7 @@ Column
onClicked: onClicked:
{ {
forceActiveFocus() //Changing focus applies the currently-being-typed values so it can change the displayed setting values. forceActiveFocus() // Changing focus applies the currently-being-typed values so it can change the displayed setting values.
base.currentExtruderIndex = index; base.currentExtruderIndex = index;
ExtruderManager.setActiveExtruderIndex(index); ExtruderManager.setActiveExtruderIndex(index);
} }
@ -258,6 +258,8 @@ Column
{ {
id: globalProfileSelection id: globalProfileSelection
text: Cura.MachineManager.activeQualityName text: Cura.MachineManager.activeQualityName
enabled: !extrudersList.visible || base.currentExtruderIndex > -1
width: parent.width * 0.55 + UM.Theme.getSize("default_margin").width width: parent.width * 0.55 + UM.Theme.getSize("default_margin").width
height: UM.Theme.getSize("setting_control").height height: UM.Theme.getSize("setting_control").height
tooltip: Cura.MachineManager.activeQualityName tooltip: Cura.MachineManager.activeQualityName

View file

@ -19,6 +19,7 @@ Item
property Action configureSettings; property Action configureSettings;
property variant minimumPrintTime: PrintInformation.minimumPrintTime; property variant minimumPrintTime: PrintInformation.minimumPrintTime;
property variant maximumPrintTime: PrintInformation.maximumPrintTime; property variant maximumPrintTime: PrintInformation.maximumPrintTime;
property bool settingsEnabled: ExtruderManager.activeExtruderStackId || ExtruderManager.extruderCount == 0
Component.onCompleted: PrintInformation.enabled = true Component.onCompleted: PrintInformation.enabled = true
Component.onDestruction: PrintInformation.enabled = false Component.onDestruction: PrintInformation.enabled = false
@ -81,7 +82,11 @@ Item
height: width height: width
border.color: { border.color: {
if(infillListView.activeIndex == index) if(!base.settingsEnabled)
{
return UM.Theme.getColor("setting_control_disabled_border")
}
else if(infillListView.activeIndex == index)
{ {
return UM.Theme.getColor("setting_control_selected") return UM.Theme.getColor("setting_control_selected")
} }
@ -92,7 +97,17 @@ Item
return UM.Theme.getColor("setting_control_border") return UM.Theme.getColor("setting_control_border")
} }
border.width: UM.Theme.getSize("default_lining").width border.width: UM.Theme.getSize("default_lining").width
color: infillListView.activeIndex == index ? UM.Theme.getColor("setting_control_selected") : "transparent" color: {
if(infillListView.activeIndex == index)
{
if(!base.settingsEnabled)
{
return UM.Theme.getColor("setting_control_disabled_text")
}
return UM.Theme.getColor("setting_control_selected")
}
return "transparent"
}
UM.RecolorImage { UM.RecolorImage {
id: infillIcon id: infillIcon
@ -102,13 +117,24 @@ Item
sourceSize.width: width sourceSize.width: width
sourceSize.height: width sourceSize.height: width
source: UM.Theme.getIcon(model.icon); source: UM.Theme.getIcon(model.icon);
color: (infillListView.activeIndex == index) ? UM.Theme.getColor("text_white") : UM.Theme.getColor("text") color: {
if(infillListView.activeIndex == index)
{
return UM.Theme.getColor("text_reversed")
}
if(!base.settingsEnabled)
{
return UM.Theme.getColor("setting_control_disabled_text")
}
return UM.Theme.getColor("text")
}
} }
MouseArea { MouseArea {
id: infillMouseArea id: infillMouseArea
anchors.fill: parent anchors.fill: parent
hoverEnabled: true hoverEnabled: true
enabled: base.settingsEnabled
onClicked: { onClicked: {
if (infillListView.activeIndex != index) if (infillListView.activeIndex != index)
{ {
@ -206,6 +232,7 @@ Item
//: Setting enable skirt adhesion checkbox //: Setting enable skirt adhesion checkbox
text: catalog.i18nc("@option:check", "Print Brim"); text: catalog.i18nc("@option:check", "Print Brim");
style: UM.Theme.styles.checkbox; style: UM.Theme.styles.checkbox;
enabled: base.settingsEnabled
checked: platformAdhesionType.properties.value == "brim" checked: platformAdhesionType.properties.value == "brim"
@ -213,6 +240,7 @@ Item
id: brimMouseArea id: brimMouseArea
anchors.fill: parent anchors.fill: parent
hoverEnabled: true hoverEnabled: true
enabled: base.settingsEnabled
onClicked: onClicked:
{ {
platformAdhesionType.setPropertyValue("value", !parent.checked ? "brim" : "skirt") platformAdhesionType.setPropertyValue("value", !parent.checked ? "brim" : "skirt")
@ -254,12 +282,14 @@ Item
//: Setting enable support checkbox //: Setting enable support checkbox
text: catalog.i18nc("@option:check", "Print Support Structure"); text: catalog.i18nc("@option:check", "Print Support Structure");
style: UM.Theme.styles.checkbox; style: UM.Theme.styles.checkbox;
enabled: base.settingsEnabled
checked: supportEnabled.properties.value == "True" checked: supportEnabled.properties.value == "True"
MouseArea { MouseArea {
id: supportMouseArea id: supportMouseArea
anchors.fill: parent anchors.fill: parent
hoverEnabled: true hoverEnabled: true
enabled: base.settingsEnabled
onClicked: onClicked:
{ {
supportEnabled.setPropertyValue("value", !parent.checked) supportEnabled.setPropertyValue("value", !parent.checked)
@ -288,6 +318,7 @@ Item
width: parent.width / 100 * 45 width: parent.width / 100 * 45
style: UM.Theme.styles.combobox style: UM.Theme.styles.combobox
enabled: base.settingsEnabled
property alias _hovered: supportExtruderMouseArea.containsMouse property alias _hovered: supportExtruderMouseArea.containsMouse
currentIndex: supportEnabled.properties.value == "True" ? parseFloat(supportExtruderNr.properties.value) + 1 : 0 currentIndex: supportEnabled.properties.value == "True" ? parseFloat(supportExtruderNr.properties.value) + 1 : 0
@ -303,6 +334,7 @@ Item
id: supportExtruderMouseArea id: supportExtruderMouseArea
anchors.fill: parent anchors.fill: parent
hoverEnabled: true hoverEnabled: true
enabled: base.settingsEnabled
acceptedButtons: Qt.NoButton acceptedButtons: Qt.NoButton
onEntered: onEntered:
{ {
@ -382,7 +414,7 @@ Item
{ {
id: platformAdhesionType id: platformAdhesionType
containerStackId: Cura.MachineManager.activeMachineId containerStackId: Cura.MachineManager.activeStackId
key: "adhesion_type" key: "adhesion_type"
watchedProperties: [ "value" ] watchedProperties: [ "value" ]
storeIndex: 0 storeIndex: 0
@ -392,7 +424,7 @@ Item
{ {
id: supportEnabled id: supportEnabled
containerStackId: Cura.MachineManager.activeMachineId containerStackId: Cura.MachineManager.activeStackId
key: "support_enable" key: "support_enable"
watchedProperties: [ "value" ] watchedProperties: [ "value" ]
storeIndex: 0 storeIndex: 0
@ -412,7 +444,7 @@ Item
{ {
id: supportExtruderNr id: supportExtruderNr
containerStackId: Cura.MachineManager.activeMachineId containerStackId: Cura.MachineManager.activeStackId
key: "support_extruder_nr" key: "support_extruder_nr"
watchedProperties: [ "value" ] watchedProperties: [ "value" ]
storeIndex: 0 storeIndex: 0

View file

@ -0,0 +1,43 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.2"
id="Layer_1"
x="0px"
y="0px"
viewBox="0 0 250 250"
xml:space="preserve"
inkscape:version="0.91 r13725"
sodipodi:docname="link.svg"><metadata
id="metadata4192"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
id="defs4190" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1148"
id="namedview4188"
showgrid="false"
inkscape:zoom="0.58272057"
inkscape:cx="218.22031"
inkscape:cy="76.27121"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="Layer_1" /><path
inkscape:connector-curvature="0"
d="m 29.41175,183.82353 q 0,-6.12745 4.28922,-10.41667 l 31.86274,-31.86274 q 4.28922,-4.28921 10.41667,-4.28921 6.43382,0 11.02941,4.90196 -0.45956,0.45956 -2.91054,2.83394 -2.45098,2.37439 -3.2935,3.29351 -0.84253,0.91912 -2.2978,2.91054 -1.45527,1.99142 -1.99142,3.90625 -0.53615,1.91483 -0.53615,4.21262 0,6.12745 4.28921,10.41666 4.28922,4.28922 10.41667,4.28922 2.29779,0 4.21261,-0.53615 1.91483,-0.53616 3.90625,-1.99143 1.99143,-1.45527 2.91054,-2.29779 0.91912,-0.84252 3.29351,-3.2935 2.37439,-2.45098 2.83395,-2.91054 5.05514,4.74877 5.05514,11.18259 0,6.12746 -4.28921,10.41667 l -31.55637,31.70956 q -4.13603,4.13603 -10.41666,4.13603 -6.12746,0 -10.41667,-3.98284 l -22.51838,-22.3652 q -4.28922,-4.28922 -4.28922,-10.26348 z M 137.1017,75.827207 q 0,-6.12745 4.28922,-10.41666 l 31.55637,-31.70956 q 4.28922,-4.28922 10.41667,-4.28922 5.97426,0 10.41667,4.13603 l 22.51838,22.3652 q 4.28921,4.28921 4.28921,10.26348 0,6.12745 -4.28921,10.41667 l -31.86275,31.862743 q -4.13603,4.13603 -10.41666,4.13603 -6.43383,0 -11.02942,-4.74877 0.45956,-0.45956 2.91054,-2.83395 2.45098,-2.37439 3.29351,-3.2935 0.84252,-0.91912 2.29779,-2.910543 1.45527,-1.99143 1.99142,-3.90625 0.53616,-1.91483 0.53616,-4.21263 0,-6.12745 -4.28922,-10.41666 -4.28922,-4.28922 -10.41667,-4.28922 -2.29779,0 -4.21262,0.53615 -1.91483,0.53616 -3.90626,1.99142 -1.99141,1.45527 -2.91053,2.2978 -0.91912,0.84252 -3.29351,3.2935 -2.37438,2.45098 -2.83394,2.91054 -5.05515,-4.74877 -5.05515,-11.1826 z M 0,183.82353 q 0,18.38235 13.02082,31.09681 l 22.51838,22.3652 Q 48.25366,250 66.63602,250 q 18.53554,0 31.24999,-13.02083 l 31.55638,-31.70956 q 12.71446,-12.71446 12.71446,-31.09682 0,-18.8419 -13.48039,-32.01592 l 13.48039,-13.48039 q 13.17402,13.48039 31.86275,13.48039 18.38235,0 31.25,-12.86764 l 31.86274,-31.862753 q 12.86765,-12.86765 12.86765,-31.25 0,-18.38235 -13.02083,-31.09681 L 214.46077,12.714457 Q 201.74631,-2.8e-6 183.36396,-2.8e-6 q -18.53554,0 -31.25,13.0208298 l -31.55637,31.70957 q -12.71447,12.71446 -12.71447,31.09681 0,18.84192 13.4804,32.015943 l -13.4804,13.48039 Q 94.6691,107.84315 75.98038,107.84315 q -18.38235,0 -31.25,12.86764 L 12.86763,152.57354 Q 0,165.44118 0,183.82353 Z"
id="path4173" /></svg>

After

Width:  |  Height:  |  Size: 3.6 KiB

File diff suppressed because it is too large Load diff

Before

Width:  |  Height:  |  Size: 762 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

Before After
Before After

View file

@ -56,7 +56,7 @@
"text_inactive": [174, 174, 174, 255], "text_inactive": [174, 174, 174, 255],
"text_hover": [70, 84, 113, 255], "text_hover": [70, 84, 113, 255],
"text_pressed": [12, 169, 227, 255], "text_pressed": [12, 169, 227, 255],
"text_white": [255, 255, 255, 255], "text_reversed": [255, 255, 255, 255],
"text_subtext": [70, 84, 113, 255], "text_subtext": [70, 84, 113, 255],
"error": [255, 140, 0, 255], "error": [255, 140, 0, 255],