Merge branch 'master' into feature_better_warning_formulas

This commit is contained in:
Tim Kuipers 2016-10-04 13:43:04 +02:00
commit ed0f8c0235
18 changed files with 234 additions and 102 deletions

View file

@ -85,6 +85,9 @@ class BuildVolume(SceneNode):
# activeQualityChanged is always emitted after setActiveVariant, setActiveMaterial and setActiveQuality.
# Therefore this works.
Application.getInstance().getMachineManager().activeQualityChanged.connect(self._onStackChanged)
# This should also ways work, and it is semantically more correct,
# but it does not update the disallowed areas after material change
Application.getInstance().getMachineManager().activeStackChanged.connect(self._onStackChanged)
def _onSceneChanged(self, source):
if self._global_container_stack:

View file

@ -503,7 +503,7 @@ class CuraApplication(QtApplication):
qmlRegisterType(cura.Settings.ContainerSettingsModel, "Cura", 1, 0, "ContainerSettingsModel")
qmlRegisterType(cura.Settings.ProfilesModel, "Cura", 1, 0, "ProfilesModel")
qmlRegisterType(cura.Settings.ProfilesPageModel, "Cura", 1, 0, "ProfilesPageModel")
qmlRegisterType(cura.Settings.QualityAndUserProfilesModel, "Cura", 1, 0, "QualityAndUserProfilesModel")
qmlRegisterType(cura.Settings.MaterialSettingsVisibilityHandler, "Cura", 1, 0, "MaterialSettingsVisibilityHandler")
qmlRegisterType(cura.Settings.QualitySettingsModel, "Cura", 1, 0, "QualitySettingsModel")

View file

@ -42,7 +42,12 @@ class QualityManager:
# \return the matching quality changes containers \type{List[ContainerInstance]}
def findQualityChangesByName(self, quality_changes_name, machine_definition=None):
criteria = {"type": "quality_changes", "name": quality_changes_name}
return self._getFilteredContainersForStack(machine_definition, [], **criteria)
result = self._getFilteredContainersForStack(machine_definition, [], **criteria)
criteria = {"type": "quality_changes", "global_profile": quality_changes_name}
result.extend(self._getFilteredContainersForStack(machine_definition, [], **criteria))
return result
## Fetch the list of available quality types for this combination of machine definition and materials.
#
@ -60,6 +65,11 @@ class QualityManager:
return list(common_quality_types)
## Fetches a dict of quality types names to quality profiles for a combination of machine and material.
#
# \param machine_definition \type{DefinitionContainer} the machine definition.
# \param material \type{ContainerInstance} the material.
# \return \type{Dict[str, ContainerInstance]} the dict of suitable quality type names mapping to qualities.
def __fetchQualityTypeDictForMaterial(self, machine_definition, material):
qualities = self.findAllQualitiesForMachineMaterial(machine_definition, material)
quality_type_dict = {}
@ -87,6 +97,11 @@ class QualityManager:
result = self._getFilteredContainersForStack(machine_definition, [basic_material], **criteria)
return result[0] if result else None
## Find all suitable qualities for a combination of machine and material.
#
# \param machine_definition \type{DefinitionContainer} the machine definition.
# \param material_container \type{ContainerInstance} the material.
# \return \type{List[ContainerInstance]} the list of suitable qualities.
def findAllQualitiesForMachineMaterial(self, machine_definition, material_container):
criteria = {"type": "quality" }
result = self._getFilteredContainersForStack(machine_definition, [material_container], **criteria)
@ -95,6 +110,11 @@ class QualityManager:
result = self._getFilteredContainersForStack(machine_definition, [basic_material], **criteria)
return result
## Fetch a more basic version of a material.
#
# This tries to find a generic or basic version of the given material.
# \param material_container \type{InstanceContainer} the material
# \return \type{Option[InstanceContainer]} the basic material or None if one could not be found.
def _getBasicMaterial(self, material_container):
base_material = material_container.getMetaDataEntry("material")
if base_material:

View file

@ -467,6 +467,8 @@ class ContainerManager(QObject):
base_name = active_quality_name
unique_name = self._container_registry.uniqueName(base_name)
global_changes = None
# Go through the active stacks and create quality_changes containers from the user containers.
for stack in cura.Settings.ExtruderManager.getInstance().getActiveGlobalAndExtruderStacks():
user_container = stack.getTop()
@ -482,6 +484,11 @@ class ContainerManager(QObject):
extruder_id)
self._performMerge(new_changes, user_container)
if stack is global_stack:
global_changes = new_changes
else:
new_changes.setMetaDataEntry("global_profile", global_changes.getId())
self._container_registry.addContainer(new_changes)
stack.replaceContainer(stack.getContainerIndex(quality_changes_container), new_changes)
@ -563,9 +570,16 @@ class ContainerManager(QObject):
container_registry = self._container_registry
containers_to_rename = self._container_registry.findInstanceContainers(type = "quality_changes", name = quality_name)
containers_to_rename.extend(self._container_registry.findInstanceContainers(type = "quality_changes", global_profile = quality_name))
global_changes_id = ""
for container in containers_to_rename:
stack_id = container.getMetaDataEntry("extruder", global_stack.getId())
container_registry.renameContainer(container.getId(), new_name, self._createUniqueId(stack_id, new_name))
if "global_profile" not in container.getMetaData():
global_changes_id = container.getId()
else:
container.setMetaDataEntry("global_profile", global_changes_id)
if not containers_to_rename:
UM.Logger.log("e", "Unable to rename %s, because we could not find the profile", quality_name)
@ -628,8 +642,9 @@ class ContainerManager(QObject):
new_change_instances = []
# Handle the global stack first.
new_changes = self._createQualityChanges(quality_container, new_name, machine_definition, None)
new_change_instances.append(new_changes)
global_changes = self._createQualityChanges(quality_container, new_name, machine_definition, None)
new_changes.addMetaDataEntry("global_profile", global_changes.getId())
new_change_instances.append(global_changes)
self._container_registry.addContainer(new_changes)
# Handle the extruders if present.
@ -638,6 +653,7 @@ class ContainerManager(QObject):
for key in extruders:
value = extruders[key]
new_changes = self._createQualityChanges(quality_container, new_name, machine_definition, value)
new_changes.addMetaDataEntry("global_profile", global_changes.getId())
new_change_instances.append(new_changes)
self._container_registry.addContainer(new_changes)
@ -646,10 +662,16 @@ class ContainerManager(QObject):
# Duplicate a quality changes container
def _duplicateQualityChangesForMachineType(self, quality_changes_name, base_name, machine_definition):
new_change_instances = []
profile_index = -1
global_changes_id = ""
for container in QualityManager.getInstance().findQualityChangesByName(quality_changes_name,
machine_definition):
new_unique_id = self._createUniqueId(container.getId(), base_name)
new_container = container.duplicate(new_unique_id, base_name)
if profile_index >= 0:
new_changes.setMetaDataEntry("global_profile", global_changes_id)
else:
global_changes_id = new_unique_id
new_change_instances.append(new_container)
self._container_registry.addContainer(new_container)
@ -678,6 +700,16 @@ class ContainerManager(QObject):
duplicated_container.setDirty(True)
self._container_registry.addContainer(duplicated_container)
## Get the singleton instance for this class.
@classmethod
def getInstance(cls):
# Note: Explicit use of class name to prevent issues with inheritance.
if ContainerManager.__instance is None:
ContainerManager.__instance = cls()
return ContainerManager.__instance
__instance = None
# Factory function, used by QML
@staticmethod
def createContainerManager(engine, js_engine):

View file

@ -16,6 +16,9 @@ from UM.Platform import Platform
from UM.PluginRegistry import PluginRegistry #For getting the possible profile writers to write with.
from UM.Util import parseBool
from cura.Settings.ExtruderManager import ExtruderManager
from cura.Settings.ContainerManager import ContainerManager
from UM.i18n import i18nCatalog
catalog = i18nCatalog("cura")
@ -128,8 +131,15 @@ class CuraContainerRegistry(ContainerRegistry):
return { "status": "error", "message": catalog.i18nc("@info:status", "Failed to import profile from <filename>{0}</filename>: <message>{1}</message>", file_name, "Invalid path")}
plugin_registry = PluginRegistry.getInstance()
container_registry = ContainerRegistry.getInstance()
extension = file_name.split(".")[-1]
global_container_stack = Application.getInstance().getGlobalContainerStack()
if not global_container_stack:
return
machine_extruders = list(ExtruderManager.getInstance().getMachineExtruders(global_container_stack.getId()))
machine_extruders.sort(key = lambda k: k.getMetaDataEntry("position"))
for plugin_id, meta_data in self._getIOPlugins("profile_reader"):
if meta_data["profile_reader"][0]["extension"] != extension:
continue
@ -148,17 +158,49 @@ class CuraContainerRegistry(ContainerRegistry):
self._configureProfile(profile, name_seed)
return { "status": "ok", "message": catalog.i18nc("@info:status", "Successfully imported profile {0}", profile.getName()) }
else:
profile_index = -1
global_profile = None
for profile in profile_or_list:
extruder_id = profile.getMetaDataEntry("extruder")
if extruder_id:
profile_name = "%s_%s" % (extruder_id, name_seed)
if profile_index >= 0:
if len(machine_extruders) > profile_index:
extruder_id = machine_extruders[profile_index].getBottom().getId()
profile_name = "%s_%s" % (extruder_id, name_seed)
# Ensure the extruder profiles get non-conflicting names
# NB: these are not user-facing
if "extruder" in profile.getMetaData():
profile.setMetaDataEntry("extruder", extruder_id)
else:
profile.addMetaDataEntry("extruder", extruder_id)
if "global_profile" in profile.getMetaData():
profile.setMetaDataEntry("global_profile", global_profile.getId())
else:
profile.addMetaDataEntry("global_profile", global_profile.getId())
elif profile_index == 0:
# Importing a multiextrusion profile into a single extrusion machine; merge 1st extruder profile into global profile
profile._id = self.uniqueName("temporary_profile")
self.addContainer(profile)
ContainerManager.getInstance().mergeContainers(global_profile.getId(), profile.getId())
self.removeContainer(profile.getId())
break
else:
# The imported composite profile has a profile for an extruder that this machine does not have. Ignore this extruder-profile
break
else:
global_profile = profile
profile_name = name_seed
new_name = container_registry.uniqueName(profile_name)
new_name = self.uniqueName(profile_name)
profile.setDirty(True) # Ensure the profiles are correctly saved
if "type" in profile.getMetaData():
profile.setMetaDataEntry("type", "quality_changes")
else:
profile.addMetaDataEntry("type", "quality_changes")
self._configureProfile(profile, profile_name)
profile.setName(new_name)
profile_index += 1
return {"status": "ok", "message": catalog.i18nc("@info:status", "Successfully imported profile {0}", profile_or_list[0].getName())}
# If it hasn't returned by now, none of the plugins loaded the profile successfully.
@ -171,7 +213,7 @@ class CuraContainerRegistry(ContainerRegistry):
profile._id = new_id
if self._machineHasOwnQualities():
profile.setDefinition(self._activeDefinition())
profile.setDefinition(self._activeQualityDefinition())
if self._machineHasOwnMaterials():
profile.addMetaDataEntry("material", self._activeMaterialId())
else:
@ -192,12 +234,14 @@ class CuraContainerRegistry(ContainerRegistry):
result.append( (plugin_id, meta_data) )
return result
## Gets the active definition
# \return the active definition object or None if there is no definition
def _activeDefinition(self):
## Get the definition to use to select quality profiles for the active machine
# \return the active quality definition object or None if there is no quality definition
def _activeQualityDefinition(self):
global_container_stack = Application.getInstance().getGlobalContainerStack()
if global_container_stack:
definition = global_container_stack.getBottom()
definition_id = Application.getInstance().getMachineManager().getQualityDefinitionId(global_container_stack.getBottom())
definition = self.findDefinitionContainers(id=definition_id)[0]
if definition:
return definition
return None

View file

@ -29,6 +29,9 @@ class ExtrudersModel(UM.Qt.ListModel.ListModel):
# containers.
IndexRole = Qt.UserRole + 4
# The ID of the definition of the extruder.
DefinitionRole = Qt.UserRole + 5
## List of colours to display if there is no material or the material has no known
# colour.
defaultColors = ["#ffc924", "#86ec21", "#22eeee", "#245bff", "#9124ff", "#ff24c8"]
@ -44,6 +47,7 @@ class ExtrudersModel(UM.Qt.ListModel.ListModel):
self.addRoleName(self.NameRole, "name")
self.addRoleName(self.ColorRole, "color")
self.addRoleName(self.IndexRole, "index")
self.addRoleName(self.DefinitionRole, "definition")
self._add_global = False
self._simple_names = False
@ -51,8 +55,8 @@ class ExtrudersModel(UM.Qt.ListModel.ListModel):
self._active_extruder_stack = None
#Listen to changes.
UM.Application.getInstance().globalContainerStackChanged.connect(self._updateExtruders)
manager = ExtruderManager.getInstance()
manager.globalContainerStackDefinitionChanged.connect(self._updateExtruders) #When the global stack changes to a printer with different extruders.
self._updateExtruders()
@ -126,7 +130,8 @@ class ExtrudersModel(UM.Qt.ListModel.ListModel):
"id": global_container_stack.getId(),
"name": "Global",
"color": color,
"index": -1
"index": -1,
"definition": ""
}
items.append(item)
changed = True
@ -148,7 +153,8 @@ class ExtrudersModel(UM.Qt.ListModel.ListModel):
"id": extruder.getId(),
"name": extruder_name,
"color": color,
"index": position
"index": position,
"definition": extruder.getBottom().getId()
}
items.append(item)
changed = True

View file

@ -461,8 +461,8 @@ class MachineManager(QObject):
@pyqtProperty(str, notify=activeQualityChanged)
def activeQualityName(self):
if self._active_container_stack:
quality = self._active_container_stack.findContainer({"type": "quality_changes"})
if self._active_container_stack and self._global_container_stack:
quality = self._global_container_stack.findContainer({"type": "quality_changes"})
if quality and quality != self._empty_quality_changes_container:
return quality.getName()
quality = self._active_container_stack.findContainer({"type": "quality"})
@ -544,6 +544,7 @@ class MachineManager(QObject):
material_index = self._active_container_stack.getContainerIndex(old_material)
self._active_container_stack.replaceContainer(material_index, material_container)
Logger.log("d", "Active material changed")
material_container.nameChanged.connect(self._onMaterialNameChanged)
@ -566,10 +567,11 @@ class MachineManager(QObject):
[material_container])
if not candidate_quality:
# Fall back to a quality
new_quality_id = quality_manager.findQualityByQualityType(None,
new_quality = quality_manager.findQualityByQualityType(None,
quality_manager.getWholeMachineDefinition(machine_definition),
[material_container])
if new_quality:
new_quality_id = new_quality.getId()
else:
if not old_quality_changes:
new_quality_id = candidate_quality.getId()
@ -588,7 +590,7 @@ class MachineManager(QObject):
self.blurSettings.emit()
variant_index = self._active_container_stack.getContainerIndex(old_variant)
self._active_container_stack.replaceContainer(variant_index, containers[0])
Logger.log("d", "Active variant changed")
preferred_material = None
if old_material:
preferred_material_name = old_material.getName()

View file

@ -6,6 +6,7 @@ from UM.Settings.Models.InstanceContainersModel import InstanceContainersModel
from cura.QualityManager import QualityManager
from cura.Settings.ExtruderManager import ExtruderManager
from cura.Settings.MachineManager import MachineManager
## QML Model for listing the current list of valid quality profiles.
#
@ -15,6 +16,10 @@ class ProfilesModel(InstanceContainersModel):
Application.getInstance().globalContainerStackChanged.connect(self._update)
Application.getInstance().getMachineManager().activeVariantChanged.connect(self._update)
Application.getInstance().getMachineManager().activeStackChanged.connect(self._update)
Application.getInstance().getMachineManager().activeMaterialChanged.connect(self._update)
## Fetch the list of containers to display.
#
# See UM.Settings.Models.InstanceContainersModel._fetchInstanceContainers().

View file

@ -8,7 +8,7 @@ from cura.Settings.ProfilesModel import ProfilesModel
## QML Model for listing the current list of valid quality and quality changes profiles.
#
class ProfilesPageModel(ProfilesModel):
class QualityAndUserProfilesModel(ProfilesModel):
def __init__(self, parent = None):
super().__init__(parent)

View file

@ -25,6 +25,7 @@ class QualitySettingsModel(UM.Qt.ListModel.ListModel):
self._container_registry = UM.Settings.ContainerRegistry.getInstance()
self._extruder_id = None
self._extruder_definition_id = None
self._quality = None
self._material = None
@ -46,6 +47,17 @@ class QualitySettingsModel(UM.Qt.ListModel.ListModel):
def extruderId(self):
return self._extruder_id
def setExtruderDefinition(self, extruder_definition):
if extruder_definition != self._extruder_definition_id:
self._extruder_definition_id = extruder_definition
self._update()
self.extruderDefinitionChanged.emit()
extruderDefinitionChanged = pyqtSignal()
@pyqtProperty(str, fset = setExtruderDefinition, notify = extruderDefinitionChanged)
def extruderDefinition(self):
return self._extruder_definition_id
def setQuality(self, quality):
if quality != self._quality:
self._quality = quality
@ -138,8 +150,9 @@ class QualitySettingsModel(UM.Qt.ListModel.ListModel):
if quality_changes_container:
criteria = {"type": "quality_changes", "quality_type": quality_type, "definition": definition_id, "name": quality_changes_container.getName()}
if self._extruder_id != "":
criteria["extruder"] = self._extruder_id
if self._extruder_definition_id != "":
criteria["extruder"] = self._extruder_definition_id
criteria["name"] = "%s_%s" % (self._extruder_definition_id, quality_changes_container.getName())
else:
criteria["extruder"] = None

View file

@ -13,4 +13,4 @@ from .SettingOverrideDecorator import SettingOverrideDecorator
from .QualitySettingsModel import QualitySettingsModel
from .SettingInheritanceManager import SettingInheritanceManager
from .ProfilesModel import ProfilesModel
from .ProfilesPageModel import ProfilesPageModel
from .QualityAndUserProfilesModel import QualityAndUserProfilesModel

View file

@ -550,6 +550,7 @@
"unit": "mm",
"type": "float",
"default_value": 0.3,
"resolve": "sum(extruderValues('layer_height_0')) / len(extruderValues('layer_height_0'))",
"minimum_value": "0.001",
"minimum_value_warning": "0.1",
"maximum_value_warning": "0.8 * min(extruderValues('machine_nozzle_size'))",
@ -680,7 +681,7 @@
"minimum_value_warning": "0.4 * machine_nozzle_size",
"maximum_value_warning": "2 * machine_nozzle_size",
"type": "float",
"enabled": "extruderValue(support_interface_extruder_nr, 'support_interface_enable')",
"enabled": "support_enable and support_interface_enable",
"limit_to_extruder": "support_interface_extruder_nr",
"value": "line_width",
"settable_per_mesh": false,
@ -1655,6 +1656,7 @@
"description": "The first few layers are printed slower than the rest of the model, to get better adhesion to the build plate and improve the overall success rate of prints. The speed is gradually increased over these layers.",
"type": "int",
"default_value": 2,
"resolve": "sum(extruderValues('speed_slowdown_layers')) / len(extruderValues('speed_slowdown_layers'))",
"minimum_value": "0",
"maximum_value_warning": "1.0 / layer_height",
"settable_per_mesh": false,
@ -1690,6 +1692,7 @@
"description": "Enables adjusting the print head acceleration. Increasing the accelerations can reduce printing time at the cost of print quality.",
"type": "bool",
"default_value": false,
"resolve": "any(extruderValues('acceleration_enabled'))",
"settable_per_mesh": false,
"settable_per_extruder": false
},
@ -1702,7 +1705,7 @@
"minimum_value_warning": "100",
"maximum_value_warning": "10000",
"default_value": 3000,
"enabled": "acceleration_enabled",
"enabled": "resolveOrValue('acceleration_enabled')",
"settable_per_mesh": true,
"children": {
"acceleration_infill": {
@ -1715,7 +1718,7 @@
"maximum_value_warning": "10000",
"default_value": 3000,
"value": "acceleration_print",
"enabled": "acceleration_enabled and infill_sparse_density > 0",
"enabled": "resolveOrValue('acceleration_enabled') and infill_sparse_density > 0",
"settable_per_mesh": true
},
"acceleration_wall": {
@ -1728,7 +1731,7 @@
"maximum_value_warning": "10000",
"default_value": 3000,
"value": "acceleration_print",
"enabled": "acceleration_enabled",
"enabled": "resolveOrValue('acceleration_enabled')",
"settable_per_mesh": true,
"children": {
"acceleration_wall_0": {
@ -1741,7 +1744,7 @@
"maximum_value_warning": "10000",
"default_value": 3000,
"value": "acceleration_wall",
"enabled": "acceleration_enabled",
"enabled": "resolveOrValue('acceleration_enabled')",
"settable_per_mesh": true
},
"acceleration_wall_x": {
@ -1754,7 +1757,7 @@
"maximum_value_warning": "10000",
"default_value": 3000,
"value": "acceleration_wall",
"enabled": "acceleration_enabled",
"enabled": "resolveOrValue('acceleration_enabled')",
"settable_per_mesh": true
}
}
@ -1769,7 +1772,7 @@
"maximum_value_warning": "10000",
"default_value": 3000,
"value": "acceleration_print",
"enabled": "acceleration_enabled",
"enabled": "resolveOrValue('acceleration_enabled')",
"settable_per_mesh": true
},
"acceleration_support": {
@ -1782,7 +1785,7 @@
"maximum_value_warning": "10000",
"default_value": 3000,
"value": "acceleration_print",
"enabled": "acceleration_enabled and support_enable",
"enabled": "resolveOrValue('acceleration_enabled') and support_enable",
"settable_per_mesh": false,
"limit_to_extruder": "support_extruder_nr",
"settable_per_extruder": true,
@ -1797,7 +1800,7 @@
"minimum_value": "0.1",
"minimum_value_warning": "100",
"maximum_value_warning": "10000",
"enabled": "acceleration_enabled and support_enable",
"enabled": "resolveOrValue('acceleration_enabled') and support_enable",
"limit_to_extruder": "support_infill_extruder_nr",
"settable_per_mesh": false,
"settable_per_extruder": true
@ -1812,7 +1815,7 @@
"minimum_value": "0.1",
"minimum_value_warning": "100",
"maximum_value_warning": "10000",
"enabled": "acceleration_enabled and extruderValue(support_interface_extruder_nr, 'support_interface_enable') and support_enable",
"enabled": "resolveOrValue('acceleration_enabled') and extruderValue(support_interface_extruder_nr, 'support_interface_enable') and support_enable",
"limit_to_extruder": "support_interface_extruder_nr",
"settable_per_mesh": false,
"settable_per_extruder": true
@ -1829,7 +1832,7 @@
"maximum_value_warning": "10000",
"default_value": 3000,
"value": "acceleration_print",
"enabled": "resolveOrValue('prime_tower_enable') and acceleration_enabled",
"enabled": "resolveOrValue('prime_tower_enable') and resolveOrValue('acceleration_enabled')",
"settable_per_mesh": false
}
}
@ -1844,7 +1847,7 @@
"minimum_value_warning": "100",
"maximum_value_warning": "10000",
"value": "acceleration_print if magic_spiralize else 5000",
"enabled": "acceleration_enabled",
"enabled": "resolveOrValue('acceleration_enabled')",
"settable_per_mesh": false
},
"acceleration_layer_0": {
@ -1857,7 +1860,7 @@
"minimum_value": "0.1",
"minimum_value_warning": "100",
"maximum_value_warning": "10000",
"enabled": "acceleration_enabled",
"enabled": "resolveOrValue('acceleration_enabled')",
"settable_per_mesh": true,
"children": {
"acceleration_print_layer_0":
@ -1871,7 +1874,7 @@
"minimum_value": "0.1",
"minimum_value_warning": "100",
"maximum_value_warning": "10000",
"enabled": "acceleration_enabled",
"enabled": "resolveOrValue('acceleration_enabled')",
"settable_per_mesh": true
},
"acceleration_travel_layer_0":
@ -1885,7 +1888,7 @@
"minimum_value": "0.1",
"minimum_value_warning": "100",
"maximum_value_warning": "10000",
"enabled": "acceleration_enabled",
"enabled": "resolveOrValue('acceleration_enabled')",
"settable_per_extruder": true,
"settable_per_mesh": false
}
@ -1901,7 +1904,7 @@
"minimum_value": "0.1",
"minimum_value_warning": "100",
"maximum_value_warning": "10000",
"enabled": "acceleration_enabled",
"enabled": "resolveOrValue('acceleration_enabled')",
"settable_per_mesh": false,
"limit_to_extruder": "adhesion_extruder_nr"
},
@ -1911,6 +1914,7 @@
"description": "Enables adjusting the jerk of print head when the velocity in the X or Y axis changes. Increasing the jerk can reduce printing time at the cost of print quality.",
"type": "bool",
"default_value": false,
"resolve": "any(extruderValues('jerk_enabled'))",
"settable_per_mesh": false,
"settable_per_extruder": false
},
@ -1923,7 +1927,7 @@
"minimum_value_warning": "5",
"maximum_value_warning": "50",
"default_value": 20,
"enabled": "jerk_enabled",
"enabled": "resolveOrValue('jerk_enabled')",
"settable_per_mesh": true,
"children": {
"jerk_infill": {
@ -1936,7 +1940,7 @@
"maximum_value_warning": "50",
"default_value": 20,
"value": "jerk_print",
"enabled": "jerk_enabled and infill_sparse_density > 0",
"enabled": "resolveOrValue('jerk_enabled') and infill_sparse_density > 0",
"settable_per_mesh": true
},
"jerk_wall": {
@ -1949,7 +1953,7 @@
"maximum_value_warning": "50",
"default_value": 20,
"value": "jerk_print",
"enabled": "jerk_enabled",
"enabled": "resolveOrValue('jerk_enabled')",
"settable_per_mesh": true,
"children": {
"jerk_wall_0": {
@ -1962,7 +1966,7 @@
"maximum_value_warning": "50",
"default_value": 20,
"value": "jerk_wall",
"enabled": "jerk_enabled",
"enabled": "resolveOrValue('jerk_enabled')",
"settable_per_mesh": true
},
"jerk_wall_x": {
@ -1975,7 +1979,7 @@
"maximum_value_warning": "50",
"default_value": 20,
"value": "jerk_wall",
"enabled": "jerk_enabled",
"enabled": "resolveOrValue('jerk_enabled')",
"settable_per_mesh": true
}
}
@ -1990,7 +1994,7 @@
"maximum_value_warning": "50",
"default_value": 20,
"value": "jerk_print",
"enabled": "jerk_enabled",
"enabled": "resolveOrValue('jerk_enabled')",
"settable_per_mesh": true
},
"jerk_support": {
@ -2003,7 +2007,7 @@
"maximum_value_warning": "50",
"default_value": 20,
"value": "jerk_print",
"enabled": "jerk_enabled and support_enable",
"enabled": "resolveOrValue('jerk_enabled') and support_enable",
"settable_per_mesh": false,
"settable_per_extruder": true,
"limit_to_extruder": "support_extruder_nr",
@ -2018,7 +2022,7 @@
"minimum_value": "0.1",
"minimum_value_warning": "5",
"maximum_value_warning": "50",
"enabled": "jerk_enabled and support_enable",
"enabled": "resolveOrValue('jerk_enabled') and support_enable",
"limit_to_extruder": "support_infill_extruder_nr",
"settable_per_mesh": false,
"settable_per_extruder": true
@ -2033,7 +2037,7 @@
"minimum_value": "0.1",
"minimum_value_warning": "5",
"maximum_value_warning": "50",
"enabled": "jerk_enabled and extruderValue(support_interface_extruder_nr, 'support_interface_enable') and support_enable",
"enabled": "resolveOrValue('jerk_enabled') and extruderValue(support_interface_extruder_nr, 'support_interface_enable') and support_enable",
"limit_to_extruder": "support_interface_extruder_nr",
"settable_per_mesh": false,
"settable_per_extruder": true
@ -2050,7 +2054,7 @@
"maximum_value_warning": "50",
"default_value": 20,
"value": "jerk_print",
"enabled": "resolveOrValue('prime_tower_enable') and jerk_enabled",
"enabled": "resolveOrValue('prime_tower_enable') and resolveOrValue('jerk_enabled')",
"settable_per_mesh": false
}
}
@ -2065,7 +2069,7 @@
"minimum_value_warning": "5",
"maximum_value_warning": "50",
"value": "jerk_print if magic_spiralize else 30",
"enabled": "jerk_enabled",
"enabled": "resolveOrValue('jerk_enabled')",
"settable_per_mesh": false
},
"jerk_layer_0": {
@ -2078,7 +2082,7 @@
"minimum_value": "0.1",
"minimum_value_warning": "5",
"maximum_value_warning": "50",
"enabled": "jerk_enabled",
"enabled": "resolveOrValue('jerk_enabled')",
"settable_per_mesh": true,
"children": {
"jerk_print_layer_0":
@ -2092,7 +2096,7 @@
"minimum_value": "0.1",
"minimum_value_warning": "5",
"maximum_value_warning": "50",
"enabled": "jerk_enabled",
"enabled": "resolveOrValue('jerk_enabled')",
"settable_per_mesh": true
},
"jerk_travel_layer_0":
@ -2106,7 +2110,7 @@
"minimum_value": "0.1",
"minimum_value_warning": "5",
"maximum_value_warning": "50",
"enabled": "jerk_enabled",
"enabled": "resolveOrValue('jerk_enabled')",
"settable_per_extruder": true,
"settable_per_mesh": false
}
@ -2122,7 +2126,7 @@
"minimum_value_warning": "5",
"maximum_value_warning": "50",
"value": "jerk_layer_0",
"enabled": "jerk_enabled",
"enabled": "resolveOrValue('jerk_enabled')",
"settable_per_mesh": false,
"limit_to_extruder": "adhesion_extruder_nr"
}
@ -2148,6 +2152,7 @@
"noskin": "No Skin"
},
"default_value": "all",
"resolve": "'noskin' if 'noskin' in extruderValues('retraction_combing') else ('all' if 'all' in extruderValues('retraction_combing') else 'off')",
"settable_per_mesh": true
},
"travel_avoid_other_parts":
@ -2156,7 +2161,7 @@
"description": "The nozzle avoids already printed parts when traveling. This option is only available when combing is enabled.",
"type": "bool",
"default_value": true,
"enabled": "retraction_combing != 'off'",
"enabled": "resolveOrValue('retraction_combing') != 'off'",
"settable_per_mesh": false,
"settable_per_extruder": true
},
@ -2171,7 +2176,7 @@
"minimum_value": "0",
"minimum_value_warning": "machine_nozzle_tip_outer_diameter * 0.5",
"maximum_value_warning": "machine_nozzle_tip_outer_diameter * 5",
"enabled": "retraction_combing != 'off' and travel_avoid_other_parts",
"enabled": "resolveOrValue('retraction_combing') != 'off' and travel_avoid_other_parts",
"settable_per_mesh": false,
"settable_per_extruder": true
}
@ -2258,7 +2263,7 @@
"unit": "mm",
"type": "float",
"default_value": 0.5,
"value": "0 if resolveOrValue('adhesion_type') == 'raft' else layer_height_0",
"value": "0 if resolveOrValue('adhesion_type') == 'raft' else resolveOrValue('layer_height_0')",
"minimum_value": "0",
"maximum_value_warning": "10.0",
"settable_per_mesh": false,
@ -2273,7 +2278,7 @@
"default_value": 2,
"minimum_value": "1",
"maximum_value_warning": "10 / layer_height",
"value": "max(1, int(math.floor((cool_fan_full_at_height - layer_height_0) / layer_height) + 2))",
"value": "max(1, int(math.floor((cool_fan_full_at_height - resolveOrValue('layer_height_0')) / layer_height) + 2))",
"settable_per_mesh": false,
"settable_per_extruder": true
}
@ -2342,6 +2347,7 @@
"everywhere": "Everywhere"
},
"default_value": "everywhere",
"resolve": "'everywhere' if 'everywhere' in extruderValues('support_type') else buildplate",
"enabled": "support_enable",
"settable_per_mesh": false,
"settable_per_extruder": false
@ -2457,10 +2463,10 @@
"minimum_value": "0",
"maximum_value_warning": "machine_nozzle_size",
"default_value": 0.1,
"value": "extruderValue(support_extruder_nr, 'support_z_distance') if support_type == 'everywhere' else 0",
"value": "extruderValue(support_extruder_nr, 'support_z_distance') if resolveOrValue('support_type') == 'everywhere' else 0",
"limit_to_extruder": "support_interface_extruder_nr if support_interface_enable else support_infill_extruder_nr",
"type": "float",
"enabled": "support_enable and support_type == 'everywhere'",
"enabled": "support_enable and resolveOrValue('support_type') == 'everywhere'",
"settable_per_mesh": true
}
}
@ -3009,7 +3015,7 @@
"unit": "mm",
"type": "float",
"default_value": 0.3,
"value": "layer_height_0 * 1.2",
"value": "resolveOrValue('layer_height_0') * 1.2",
"minimum_value": "0.001",
"minimum_value_warning": "0.04",
"maximum_value_warning": "0.75 * extruderValue(adhesion_extruder_nr, 'machine_nozzle_size')",
@ -3127,7 +3133,7 @@
"minimum_value_warning": "100",
"maximum_value_warning": "10000",
"value": "acceleration_print",
"enabled": "resolveOrValue('adhesion_type') == 'raft' and acceleration_enabled",
"enabled": "resolveOrValue('adhesion_type') == 'raft' and resolveOrValue('acceleration_enabled')",
"settable_per_mesh": false,
"limit_to_extruder": "adhesion_extruder_nr",
"children": {
@ -3141,7 +3147,7 @@
"minimum_value": "0.1",
"minimum_value_warning": "100",
"maximum_value_warning": "10000",
"enabled": "resolveOrValue('adhesion_type') == 'raft' and acceleration_enabled",
"enabled": "resolveOrValue('adhesion_type') == 'raft' and resolveOrValue('acceleration_enabled')",
"settable_per_mesh": false,
"limit_to_extruder": "adhesion_extruder_nr"
},
@ -3155,7 +3161,7 @@
"minimum_value": "0.1",
"minimum_value_warning": "100",
"maximum_value_warning": "10000",
"enabled": "resolveOrValue('adhesion_type') == 'raft' and acceleration_enabled",
"enabled": "resolveOrValue('adhesion_type') == 'raft' and resolveOrValue('acceleration_enabled')",
"settable_per_mesh": false,
"limit_to_extruder": "adhesion_extruder_nr"
},
@ -3169,7 +3175,7 @@
"minimum_value": "0.1",
"minimum_value_warning": "100",
"maximum_value_warning": "10000",
"enabled": "resolveOrValue('adhesion_type') == 'raft' and acceleration_enabled",
"enabled": "resolveOrValue('adhesion_type') == 'raft' and resolveOrValue('acceleration_enabled')",
"settable_per_mesh": false,
"limit_to_extruder": "adhesion_extruder_nr"
}
@ -3185,7 +3191,7 @@
"minimum_value_warning": "5",
"maximum_value_warning": "50",
"value": "jerk_print",
"enabled": "resolveOrValue('adhesion_type') == 'raft' and jerk_enabled",
"enabled": "resolveOrValue('adhesion_type') == 'raft' and resolveOrValue('jerk_enabled')",
"settable_per_mesh": false,
"limit_to_extruder": "adhesion_extruder_nr",
"children": {
@ -3199,7 +3205,7 @@
"minimum_value": "0.1",
"minimum_value_warning": "5",
"maximum_value_warning": "100",
"enabled": "resolveOrValue('adhesion_type') == 'raft' and jerk_enabled",
"enabled": "resolveOrValue('adhesion_type') == 'raft' and resolveOrValue('jerk_enabled')",
"settable_per_mesh": false,
"limit_to_extruder": "adhesion_extruder_nr"
},
@ -3213,7 +3219,7 @@
"minimum_value": "0.1",
"minimum_value_warning": "5",
"maximum_value_warning": "50",
"enabled": "resolveOrValue('adhesion_type') == 'raft' and jerk_enabled",
"enabled": "resolveOrValue('adhesion_type') == 'raft' and resolveOrValue('jerk_enabled')",
"settable_per_mesh": false,
"limit_to_extruder": "adhesion_extruder_nr"
},
@ -3227,7 +3233,7 @@
"minimum_value": "0.1",
"minimum_value_warning": "5",
"maximum_value_warning": "50",
"enabled": "resolveOrValue('adhesion_type') == 'raft' and jerk_enabled",
"enabled": "resolveOrValue('adhesion_type') == 'raft' and resolveOrValue('jerk_enabled')",
"settable_per_mesh": false,
"limit_to_extruder": "adhesion_extruder_nr"
}
@ -3380,6 +3386,7 @@
"enabled": "resolveOrValue('prime_tower_enable')",
"default_value": 15,
"value": "15 if resolveOrValue('prime_tower_enable') else 0",
"resolve": "max(extruderValues('prime_tower_size'))",
"minimum_value": "0",
"maximum_value": "min(0.5 * machine_width, 0.5 * machine_depth)",
"minimum_value_warning": "max(extruderValues('prime_tower_line_width')) * 2",
@ -3397,8 +3404,8 @@
"default_value": 200,
"minimum_value_warning": "-1000",
"maximum_value_warning": "1000",
"maximum_value": "machine_width - 0.5 * prime_tower_size",
"minimum_value": "0.5 * prime_tower_size",
"maximum_value": "machine_width - 0.5 * resolveOrValue('prime_tower_size')",
"minimum_value": "0.5 * resolveOrValue('prime_tower_size')",
"settable_per_mesh": false,
"settable_per_extruder": false
},
@ -3412,8 +3419,8 @@
"default_value": 200,
"minimum_value_warning": "-1000",
"maximum_value_warning": "1000",
"maximum_value": "machine_depth - 0.5 * prime_tower_size",
"minimum_value": "0.5 * prime_tower_size",
"maximum_value": "machine_depth - 0.5 * resolveOrValue('prime_tower_size')",
"minimum_value": "0.5 * resolveOrValue('prime_tower_size')",
"settable_per_mesh": false,
"settable_per_extruder": false
},
@ -3438,6 +3445,7 @@
"type": "bool",
"enabled": "resolveOrValue('prime_tower_enable')",
"default_value": true,
"resolve": "any(extruderValues('prime_tower_wipe_enabled'))",
"settable_per_mesh": false,
"settable_per_extruder": false
},
@ -3457,6 +3465,7 @@
"label": "Enable Ooze Shield",
"description": "Enable exterior ooze shield. This will create a shell around the model which is likely to wipe a second nozzle if it's at the same height as the first nozzle.",
"type": "bool",
"resolve": "any(extruderValues('ooze_shield_enabled'))",
"default_value": false,
"settable_per_mesh": false,
"settable_per_extruder": false
@ -3467,8 +3476,9 @@
"description": "The maximum angle a part in the ooze shield will have. With 0 degrees being vertical, and 90 degrees being horizontal. A smaller angle leads to less failed ooze shields, but more material.",
"type": "float",
"unit": "°",
"enabled": "ooze_shield_enabled",
"enabled": "resolveOrValue('ooze_shield_enabled')",
"default_value": 60,
"resolve": "min(extruderValues('ooze_shield_angle'))",
"minimum_value": "0",
"maximum_value": "90",
"settable_per_mesh": false,
@ -3480,8 +3490,9 @@
"description": "Distance of the ooze shield from the print, in the X/Y directions.",
"type": "float",
"unit": "mm",
"enabled": "ooze_shield_enabled",
"enabled": "resolveOrValue('ooze_shield_enabled')",
"default_value": 2,
"resolve": "max(extruderValues('ooze_shield_dist'))",
"minimum_value": "0",
"maximum_value_warning": "20",
"settable_per_mesh": false,
@ -3629,6 +3640,7 @@
"minimum_value": "0",
"maximum_value_warning": "10",
"default_value": 10,
"resolve": "max(extruderValues('draft_shield_dist'))",
"enabled": "draft_shield_enabled",
"settable_per_mesh": false,
"settable_per_extruder": false
@ -3644,6 +3656,7 @@
"limited": "Limited"
},
"default_value": "full",
"resolve": "'full' if 'full' in extruderValues('draft_shield_height_limitation') else 'limited'",
"enabled": "draft_shield_enabled",
"settable_per_mesh": false,
"settable_per_extruder": false

View file

@ -144,7 +144,7 @@
"default_value": 15
},
"adhesion_type": {
"default_value": "Raft"
"default_value": "raft"
},
"skirt_brim_minimal_length": {
"default_value": 100

View file

@ -88,16 +88,13 @@
"default_value": 0
},
"skirt_line_count": {
"default_value": 3,
"enabled": "adhesion_type == \"Skirt\""
"default_value": 3
},
"skirt_gap": {
"default_value": 4,
"enabled": "adhesion_type == \"Skirt\""
"default_value": 4
},
"skirt_brim_minimal_length": {
"default_value": 200,
"enabled": "adhesion_type == \"Skirt\""
"default_value": 200
}
}
}

View file

@ -91,16 +91,13 @@
"default_value": 0
},
"skirt_line_count": {
"default_value": 3,
"enabled": "adhesion_type == \"Skirt\""
"default_value": 3
},
"skirt_gap": {
"default_value": 4,
"enabled": "adhesion_type == \"Skirt\""
"default_value": 4
},
"skirt_brim_minimal_length": {
"default_value": 200,
"enabled": "adhesion_type == \"Skirt\""
"default_value": 200
}
}
}

View file

@ -12,6 +12,7 @@ Tab
id: base
property string extruderId: "";
property string extruderDefinition: "";
property string quality: "";
property string material: "";
@ -55,7 +56,8 @@ Tab
model: Cura.QualitySettingsModel
{
extruderId: base.extruderId != "" ? base.extruderId : ""
extruderId: base.extruderId
extruderDefinition: base.extruderDefinition
quality: base.quality != null ? base.quality : ""
material: base.material != null ? base.material : ""
}

View file

@ -15,7 +15,7 @@ UM.ManagementPage
title: catalog.i18nc("@title:tab", "Profiles");
property var extrudersModel: Cura.ExtrudersModel{}
model: Cura.ProfilesPageModel { }
model: Cura.QualityAndUserProfilesModel { }
section.property: "readOnly"
section.delegate: Rectangle
@ -223,6 +223,7 @@ UM.ManagementPage
{
title: model.name;
extruderId: model.id;
extruderDefinition: model.definition;
quality: base.currentItem != null ? base.currentItem.id : "";
material: Cura.MachineManager.allActiveMaterialIds[model.id]
}
@ -335,18 +336,16 @@ UM.ManagementPage
folder: CuraApplication.getDefaultPath("dialog_profile_path")
onAccepted:
{
var profiles_to_export = [base.currentItem.id]
for(var extruder_nr in base.extrudersModel.items)
{
profiles_to_export.push(ExtruderManager.getQualityChangesIdByExtruderStackId(base.extrudersModel.items[extruder_nr].id))
}
var result = base.model.exportProfile(profiles_to_export, fileUrl, selectedNameFilter)
var containers = Cura.ContainerManager.findInstanceContainers({"type": "quality_changes", "name": base.currentItem.name})
var result = base.model.exportProfile(containers, fileUrl, selectedNameFilter)
if(result && result.status == "error")
{
messageDialog.icon = StandardIcon.Critical
messageDialog.text = result.message
messageDialog.open()
}
// else pop-up Message thing from python code
CuraApplication.setDefaultPath("dialog_profile_path", folder)
}

View file

@ -217,10 +217,9 @@ Item {
break;
}
}
if(last_entry == 4 && base.stackLevel == 0 && base.stackLevels.length == 2)
if((last_entry == 4 || last_entry == 11) && base.stackLevel == 0 && base.stackLevels.length == 2)
{
// Special case of the inherit reset. If only the definition (4th container) and the first
// Special case of the inherit reset. If only the definition (4th or 11th) container) and the first
// entry (user container) are set, we can simply remove the container.
propertyProvider.removeFromContainer(0)
}