Merge branch 'master' of github.com:Ultimaker/Cura

This commit is contained in:
Jaime van Kessel 2017-05-16 17:19:58 +02:00
commit 7d5c2a9b6a
22 changed files with 131 additions and 76 deletions

View File

@ -99,6 +99,11 @@ if not MYPY:
class CuraApplication(QtApplication):
# SettingVersion represents the set of settings available in the machine/extruder definitions.
# You need to make sure that this version number needs to be increased if there is any non-backwards-compatible
# changes of the settings.
SettingVersion = 1
class ResourceTypes:
QmlFiles = Resources.UserType + 1
Firmware = Resources.UserType + 2
@ -169,11 +174,11 @@ class CuraApplication(QtApplication):
UM.VersionUpgradeManager.VersionUpgradeManager.getInstance().setCurrentVersions(
{
("quality", InstanceContainer.Version): (self.ResourceTypes.QualityInstanceContainer, "application/x-uranium-instancecontainer"),
("quality_changes", InstanceContainer.Version * 1000000 + self.SettingVersion): (self.ResourceTypes.QualityInstanceContainer, "application/x-uranium-instancecontainer"),
("machine_stack", ContainerStack.Version): (self.ResourceTypes.MachineStack, "application/x-uranium-containerstack"),
("extruder_train", ContainerStack.Version): (self.ResourceTypes.ExtruderStack, "application/x-uranium-extruderstack"),
("preferences", Preferences.Version): (Resources.Preferences, "application/x-uranium-preferences"),
("user", InstanceContainer.Version): (self.ResourceTypes.UserInstanceContainer, "application/x-uranium-instancecontainer")
("user", InstanceContainer.Version * 1000000 + self.SettingVersion): (self.ResourceTypes.UserInstanceContainer, "application/x-uranium-instancecontainer")
}
)

View File

@ -918,7 +918,8 @@ class ContainerManager(QObject):
quality_changes.setDefinition(self._container_registry.findContainers(id = "fdmprinter")[0])
else:
quality_changes.setDefinition(QualityManager.getInstance().getParentMachineDefinition(machine_definition))
quality_changes.addMetaDataEntry("setting_version", quality_changes.getDefinition().getMetaDataEntry("setting_version", default = 0))
from cura.CuraApplication import CuraApplication
quality_changes.addMetaDataEntry("setting_version", CuraApplication.SettingVersion)
return quality_changes

View File

@ -22,6 +22,8 @@ from . import GlobalStack
from .ContainerManager import ContainerManager
from .ExtruderManager import ExtruderManager
from cura.CuraApplication import CuraApplication
from UM.i18n import i18nCatalog
catalog = i18nCatalog("cura")
@ -43,7 +45,7 @@ class CuraContainerRegistry(ContainerRegistry):
if isinstance(container, InstanceContainer) and type(container) != type(self.getEmptyInstanceContainer()):
#Check against setting version of the definition.
required_setting_version = int(container.getDefinition().getMetaDataEntry("setting_version", default = 0))
required_setting_version = CuraApplication.SettingVersion
actual_setting_version = int(container.getMetaDataEntry("setting_version", default = 0))
if required_setting_version != actual_setting_version:
Logger.log("w", "Instance container {container_id} is outdated. Its setting version is {actual_setting_version} but it should be {required_setting_version}.".format(container_id = container.getId(), actual_setting_version = actual_setting_version, required_setting_version = required_setting_version))

View File

@ -9,7 +9,6 @@ from UM.Settings.ContainerRegistry import ContainerRegistry
from .GlobalStack import GlobalStack
from .ExtruderStack import ExtruderStack
from .CuraContainerStack import CuraContainerStack
from typing import Optional
@ -76,7 +75,8 @@ class CuraStackBuilder:
user_container = InstanceContainer(new_stack_id + "_user")
user_container.addMetaDataEntry("type", "user")
user_container.addMetaDataEntry("extruder", new_stack_id)
user_container.addMetaDataEntry("setting_version", machine_definition.getMetaDataEntry("setting_version", default = 0))
from cura.CuraApplication import CuraApplication
user_container.addMetaDataEntry("setting_version", CuraApplication.SettingVersion)
user_container.setDefinition(machine_definition)
stack.setUserChanges(user_container)
@ -125,7 +125,8 @@ class CuraStackBuilder:
user_container = InstanceContainer(new_stack_id + "_user")
user_container.addMetaDataEntry("type", "user")
user_container.addMetaDataEntry("machine", new_stack_id)
user_container.addMetaDataEntry("setting_version", definition.getMetaDataEntry("setting_version", default = 0))
from cura.CuraApplication import CuraApplication
user_container.addMetaDataEntry("setting_version", CuraApplication.SettingVersion)
user_container.setDefinition(definition)
stack.setUserChanges(user_container)

View File

@ -363,7 +363,8 @@ class ExtruderManager(QObject):
user_profile = InstanceContainer(extruder_stack_id + "_current_settings") # Add an empty user profile.
user_profile.addMetaDataEntry("type", "user")
user_profile.addMetaDataEntry("extruder", extruder_stack_id)
user_profile.addMetaDataEntry("setting_version", machine_definition.getMetaDataEntry("setting_version", default = 0))
from cura.CuraApplication import CuraApplication
user_profile.addMetaDataEntry("setting_version", CuraApplication.SettingVersion)
user_profile.setDefinition(machine_definition)
container_registry.addContainer(user_profile)
container_stack.addContainer(user_profile)

View File

@ -46,6 +46,12 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
self._extruder_stack_suffix = "." + ContainerRegistry.getMimeTypeForContainer(ExtruderStack).preferredSuffix
self._global_stack_suffix = "." + ContainerRegistry.getMimeTypeForContainer(GlobalStack).preferredSuffix
# Certain instance container types are ignored because we make the assumption that only we make those types
# of containers. They are:
# - quality
# - variant
self._ignored_instance_container_types = {"quality", "variant"}
self._resolve_strategies = {}
self._id_mapping = {}
@ -183,6 +189,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
num_user_settings = 0
quality_changes_conflict = False
definition_changes_conflict = False
for each_instance_container_file in instance_container_files:
container_id = self._stripFileToId(each_instance_container_file)
instance_container = InstanceContainer(container_id)
@ -208,14 +215,12 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
if definition_changes:
if definition_changes[0] != instance_container:
definition_changes_conflict = True
elif container_type == "quality":
# If the quality name is not set (either by quality or changes, set it now)
# Quality changes should always override this (as they are "on top")
if quality_name == "":
quality_name = instance_container.getName()
quality_type = instance_container.getName()
elif container_type == "user":
num_user_settings += len(instance_container._instances)
elif container_type in self._ignored_instance_container_types:
# Ignore certain instance container types
Logger.log("w", "Ignoring instance container [%s] with type [%s]", container_id, container_type)
continue
Job.yieldThread()
@ -417,13 +422,29 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
quality_and_definition_changes_instance_containers = []
for instance_container_file in instance_container_files:
container_id = self._stripFileToId(instance_container_file)
serialized = archive.open(instance_container_file).read().decode("utf-8")
# HACK! we ignore the "metadata/type = quality" instance containers!
parser = configparser.ConfigParser()
parser.read_string(serialized)
if not parser.has_option("metadata", "type"):
Logger.log("w", "Cannot find metadata/type in %s, ignoring it", instance_container_file)
continue
if parser.get("metadata", "type") == "quality":
continue
instance_container = InstanceContainer(container_id)
# Deserialize InstanceContainer by converting read data from bytes to string
instance_container.deserialize(archive.open(instance_container_file).read().decode("utf-8"))
instance_container.deserialize(serialized)
container_type = instance_container.getMetaDataEntry("type")
Job.yieldThread()
if container_type == "user":
if container_type in self._ignored_instance_container_types:
# Ignore certain instance container types
Logger.log("w", "Ignoring instance container [%s] with type [%s]", container_id, container_type)
continue
elif container_type == "user":
# Check if quality changes already exists.
user_containers = self._container_registry.findInstanceContainers(id = container_id)
if not user_containers:

View File

@ -14,7 +14,7 @@ from UM.Settings.DefinitionContainer import DefinitionContainer
from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator
from UM.Logger import Logger
from cura.Settings.CuraContainerRegistry import CuraContainerRegistry
from cura.CuraApplication import CuraApplication
from cura.Settings.ExtruderManager import ExtruderManager
import UM.i18n
@ -99,7 +99,7 @@ class MachineSettingsAction(MachineAction):
definition = container_stack.getBottom()
definition_changes_container.setDefinition(definition)
definition_changes_container.addMetaDataEntry("type", "definition_changes")
definition_changes_container.addMetaDataEntry("setting_version", definition.getMetaDataEntry("setting_version", default = 0))
definition_changes_container.addMetaDataEntry("setting_version", CuraApplication.SettingVersion)
self._container_registry.addContainer(definition_changes_container)
container_stack.definitionChanges = definition_changes_container

View File

@ -11,7 +11,7 @@ from UM.Application import Application
catalog = i18nCatalog("cura")
import UM.Settings.InstanceContainer
from cura.CuraApplication import CuraApplication
## The Ultimaker Original can have a few revisions & upgrades. This action helps with selecting them, so they are added
# as a variant.
@ -49,7 +49,7 @@ class UMOUpgradeSelection(MachineAction):
definition = global_container_stack.getBottom()
definition_changes_container.setDefinition(definition)
definition_changes_container.addMetaDataEntry("type", "definition_changes")
definition_changes_container.addMetaDataEntry("setting_version", definition.getMetaDataEntry("setting_version", default = 0))
definition_changes_container.addMetaDataEntry("setting_version", CuraApplication.SettingVersion)
UM.Settings.ContainerRegistry.ContainerRegistry.getInstance().addContainer(definition_changes_container)
# Insert definition_changes between the definition and the variant

View File

@ -142,6 +142,16 @@ class VersionUpgrade22to24(VersionUpgrade):
config.write(output)
return [filename], [output.getvalue()]
def upgradeQuality(self, serialised, filename):
config = configparser.ConfigParser(interpolation = None)
config.read_string(serialised) # Read the input string as config file.
config.set("metadata", "type", "quality_changes") # Update metadata/type to quality_changes
config.set("general", "version", "2") # Just bump the version number. That is all we need for now.
output = io.StringIO()
config.write(output)
return [filename], [output.getvalue()]
def getCfgVersion(self, serialised):
parser = configparser.ConfigParser(interpolation = None)
parser.read_string(serialised)

View File

@ -21,8 +21,8 @@ def getMetaData():
# From To Upgrade function
("machine_instance", 2000000): ("machine_stack", 3000000, upgrade.upgradeMachineInstance),
("extruder_train", 2000000): ("extruder_train", 3000000, upgrade.upgradeExtruderTrain),
("preferences", 3000000): ("preferences", 4000000, upgrade.upgradePreferences)
("preferences", 3000000): ("preferences", 4000000, upgrade.upgradePreferences),
("quality", 2000000): ("quality_changes", 2000000, upgrade.upgradeQuality),
},
"sources": {
"machine_stack": {

View File

@ -5,6 +5,7 @@ import configparser #To parse the files we need to upgrade and write the new fil
import io #To serialise configparser output to a string.
from UM.VersionUpgrade import VersionUpgrade
from cura.CuraApplication import CuraApplication
_removed_settings = { #Settings that were removed in 2.5.
"start_layers_at_same_position",
@ -86,9 +87,15 @@ class VersionUpgrade25to26(VersionUpgrade):
parser["values"][replacement] = parser["values"][replaced_setting] #Copy to replacement before removing the original!
del replaced_setting
#Change the version number in the file.
if parser.has_section("general"):
parser["general"]["setting_version"] = "1"
for each_section in ("general", "metadata"):
if not parser.has_section(each_section):
parser.add_section(each_section)
# Change the version number in the file.
parser["metadata"]["setting_version"] = str(CuraApplication.SettingVersion)
# Update version
parser["general"]["version"] = "2"
#Re-serialise the file.
output = io.StringIO()

View File

@ -20,12 +20,14 @@ def getMetaData():
"version_upgrade": {
# From To Upgrade function
("preferences", 4000000): ("preferences", 4000001, upgrade.upgradePreferences),
# NOTE: All the instance containers share the same general/version, so we have to update all of them
# if any is updated.
("quality_changes", 2000000): ("quality_changes", 2000001, upgrade.upgradeInstanceContainer),
("user", 2000000): ("user", 2000001, upgrade.upgradeInstanceContainer),
("quality", 2000000): ("quality", 2000001, upgrade.upgradeInstanceContainer),
("variant", 2000000): ("variant", 2000001, upgrade.upgradeInstanceContainer), #We can re-use upgradeContainerStack since there is nothing specific to quality, variant or user profiles being changed.
("user", 2000000): ("user", 2000001, upgrade.upgradeInstanceContainer)
},
"sources": {
"quality": {
"quality_changes": {
"get_version": upgrade.getCfgVersion,
"location": {"./quality"}
},
@ -36,7 +38,7 @@ def getMetaData():
"user": {
"get_version": upgrade.getCfgVersion,
"location": {"./user"}
}
},
}
}

View File

@ -2555,7 +2555,6 @@
"default_value": 20,
"value": "jerk_support_interface",
"minimum_value": "0.1",
"minimum_value_warning": "5",
"maximum_value_warning": "50",
"enabled": "resolveOrValue('jerk_enabled') and extruderValue(support_roof_extruder_nr, 'support_roof_enable') and support_enable",
"limit_to_extruder": "support_roof_extruder_nr",
@ -2571,7 +2570,6 @@
"default_value": 20,
"value": "jerk_support_interface",
"minimum_value": "0.1",
"minimum_value_warning": "5",
"maximum_value_warning": "50",
"enabled": "resolveOrValue('jerk_enabled') and extruderValue(support_bottom_extruder_nr, 'support_bottom_enable') and support_enable",
"limit_to_extruder": "support_bottom_extruder_nr",

View File

@ -13,10 +13,6 @@ setting_version = 1
[values]
material_print_temperature = =default_material_print_temperature + 10
material_standby_temperature = 100
prime_tower_enable = False
skin_overlap = 20
support_interface_height = 0.8
prime_tower_enable = False
speed_support_interface = =math.ceil(speed_support * 20 / 25)
jerk_support_interface = =math.ceil(jerk_support * 1 / 5)
acceleration_support_interface = =math.ceil(acceleration_support * 100 / 500 )
support_xy_distance = =round(line_width * 1.5, 2)

View File

@ -13,10 +13,6 @@ setting_version = 1
[values]
material_print_temperature = =default_material_print_temperature + 5
material_standby_temperature = 100
prime_tower_enable = False
skin_overlap = 15
support_interface_height = 0.8
prime_tower_enable = False
speed_support_interface = =math.ceil(speed_support * 20 / 25)
jerk_support_interface = =math.ceil(jerk_support * 1 / 5)
acceleration_support_interface = =math.ceil(acceleration_support * 100 / 500 )
support_xy_distance = =round(line_width * 1.5, 2)

View File

@ -11,11 +11,7 @@ material = generic_pva_ultimaker3_BB_0.4
setting_version = 1
[values]
support_infill_rate = 25
support_interface_height = 0.8
material_standby_temperature = 100
prime_tower_enable = False
speed_support_interface = =math.ceil(speed_support * 20 / 25)
jerk_support_interface = =math.ceil(jerk_support * 1 / 5)
acceleration_support_interface = =math.ceil(acceleration_support * 100 / 500 )
support_xy_distance = =round(line_width * 1.5, 2)
support_infill_rate = 25
support_interface_height = 0.8

View File

@ -11,11 +11,7 @@ material = generic_pva_ultimaker3_BB_0.4
setting_version = 1
[values]
support_infill_rate = 25
support_interface_height = 0.8
material_standby_temperature = 100
prime_tower_enable = False
speed_support_interface = =math.ceil(speed_support * 20 / 25)
jerk_support_interface = =math.ceil(jerk_support * 1 / 5)
acceleration_support_interface = =math.ceil(acceleration_support * 100 / 500 )
support_xy_distance = =round(line_width * 1.5, 2)
support_infill_rate = 25
support_interface_height = 0.8

View File

@ -75,7 +75,7 @@ support_line_width = =round(line_width * 0.4 / 0.35, 2)
support_offset = 1.5
support_pattern = triangles
support_use_towers = False
support_xy_distance = =wall_line_width_0 / 2
support_xy_distance = =round(wall_line_width_0 * 0.75, 2)
support_xy_distance_overhang = =wall_line_width_0 / 4
support_z_distance = 0
switch_extruder_prime_speed = 15

View File

@ -36,5 +36,5 @@ support_interface_skip_height = =layer_height
support_join_distance = 3
support_line_width = =round(line_width * 0.4 / 0.35, 2)
support_offset = 3
support_xy_distance = =wall_line_width_0 * 3
support_xy_distance = =round(wall_line_width_0 * 0.75, 2)
support_xy_distance_overhang = =wall_line_width_0 / 2

View File

@ -11,7 +11,9 @@ setting_version = 1
[values]
acceleration_enabled = True
acceleration_print = 4000
acceleration_support_interface = =math.ceil(acceleration_topbottom * 100 / 500)
acceleration_support = =math.ceil(acceleration_print * 2000 / 4000)
acceleration_support_interface = =math.ceil(acceleration_support * 1500 / 2000)
acceleration_support_bottom = =math.ceil(acceleration_support_interface * 100 / 1500)
brim_width = 3
cool_fan_speed = 50
cool_min_speed = 5
@ -21,7 +23,9 @@ infill_pattern = triangles
infill_wipe_dist = 0
jerk_enabled = True
jerk_print = 25
jerk_support_interface = =math.ceil(jerk_topbottom * 1 / 5)
jerk_support = =math.ceil(jerk_print * 15 / 25)
jerk_support_interface = =math.ceil(jerk_support * 10 / 15)
jerk_support_bottom = =math.ceil(jerk_support_interface * 1 / 10)
layer_height = 0.2
machine_min_cool_heat_time_window = 15
machine_nozzle_heat_up_speed = 1.5
@ -54,20 +58,24 @@ retraction_prime_speed = 15
skin_overlap = 5
speed_layer_0 = 20
speed_print = 35
speed_support_interface = =math.ceil(speed_topbottom * 15 / 20)
speed_support = =math.ceil(speed_print * 25 / 35)
speed_support_interface = =math.ceil(speed_support * 20 / 25)
speed_support_bottom = =math.ceil(speed_support_interface * 10 / 20)
speed_wall_0 = =math.ceil(speed_wall * 25 / 30)
support_angle = 60
support_bottom_height = =layer_height * 2
support_bottom_pattern = zigzag
support_bottom_stair_step_height = =layer_height
support_infill_rate = 25
support_interface_enable = True
support_interface_height = =layer_height * 5
support_interface_skip_height = =layer_height
support_join_distance = 3
support_line_width = =round(line_width * 0.4 / 0.35, 2)
support_offset = 1.5
support_pattern = triangles
support_use_towers = False
support_xy_distance = =wall_line_width_0 / 2
support_xy_distance = =round(wall_line_width_0 * 0.75, 2)
support_xy_distance_overhang = =wall_line_width_0 / 4
support_z_distance = 0
switch_extruder_prime_speed = 15

View File

@ -9,20 +9,32 @@ type = variant
setting_version = 1
[values]
cool_fan_speed_max = 100
acceleration_support = =math.ceil(acceleration_print * 2000 / 4000)
acceleration_support_interface = =math.ceil(acceleration_support * 1500 / 2000)
acceleration_support_bottom = =math.ceil(acceleration_support_interface * 100 / 1500)
cool_fan_speed_max = =cool_fan_speed
jerk_support = =math.ceil(jerk_print * 15 / 25)
jerk_support_interface = =math.ceil(jerk_support * 10 / 15)
jerk_support_bottom = =math.ceil(jerk_support_interface * 1 / 10)
machine_nozzle_heat_up_speed = 1.5
machine_nozzle_size = 0.4
material_bed_temperature = 60
material_print_temperature = 215
raft_acceleration = =acceleration_layer_0
raft_jerk = =jerk_layer_0
raft_base_speed = 20
raft_interface_speed = 20
raft_speed = 25
retraction_extrusion_window = =retraction_amount
speed_layer_0 = 20
speed_support = =math.ceil(speed_print * 25 / 35)
speed_support_interface = =math.ceil(speed_support * 20 / 25)
speed_support_bottom = =math.ceil(speed_support_interface * 10 / 20)
speed_wall_0 = =math.ceil(speed_wall * 25 / 30)
support_bottom_height = =layer_height * 2
support_bottom_pattern = zigzag
support_bottom_stair_step_height = =layer_height
support_infill_rate = 25
support_interface_enable = True
support_interface_skip_height = =layer_height
support_join_distance = 3
support_line_width = =round(line_width * 0.4 / 0.35, 2)
support_pattern = triangles
support_use_towers = False
support_xy_distance = =wall_line_width_0 * 3
support_offset = 3
support_xy_distance = =round(wall_line_width_0 * 0.75, 2)
support_xy_distance_overhang = =wall_line_width_0 / 2

View File

@ -68,11 +68,12 @@ def test_addContainerGlobalStack(container_registry, definition_container):
assert type(mock_super_add_container.call_args_list[0][0][0]) == GlobalStack
def test_addContainerGoodSettingVersion(container_registry, definition_container):
definition_container.getMetaData()["setting_version"] = 3
from cura.CuraApplication import CuraApplication
definition_container.getMetaData()["setting_version"] = CuraApplication.SettingVersion
container_registry.addContainer(definition_container)
instance = UM.Settings.InstanceContainer.InstanceContainer(container_id = "Test Instance")
instance.addMetaDataEntry("setting_version", 3)
instance.addMetaDataEntry("setting_version", CuraApplication.SettingVersion)
instance.setDefinition(definition_container)
mock_super_add_container = unittest.mock.MagicMock() #Take the role of the Uranium-ContainerRegistry where the resulting containers get registered.
@ -82,7 +83,8 @@ def test_addContainerGoodSettingVersion(container_registry, definition_container
mock_super_add_container.assert_called_once_with(instance) #The instance must have been registered now.
def test_addContainerNoSettingVersion(container_registry, definition_container):
definition_container.getMetaData()["setting_version"] = 3
from cura.CuraApplication import CuraApplication
definition_container.getMetaData()["setting_version"] = CuraApplication.SettingVersion
container_registry.addContainer(definition_container)
instance = UM.Settings.InstanceContainer.InstanceContainer(container_id = "Test Instance")
@ -96,7 +98,8 @@ def test_addContainerNoSettingVersion(container_registry, definition_container):
mock_super_add_container.assert_not_called() #Should not get passed on to UM.Settings.ContainerRegistry.addContainer, because the setting_version is interpreted as 0!
def test_addContainerBadSettingVersion(container_registry, definition_container):
definition_container.getMetaData()["setting_version"] = 3
from cura.CuraApplication import CuraApplication
definition_container.getMetaData()["setting_version"] = CuraApplication.SettingVersion
container_registry.addContainer(definition_container)
instance = UM.Settings.InstanceContainer.InstanceContainer(container_id = "Test Instance")