Merge remote-tracking branch 'origin/master' into CURA-7290_manual_account_sync

# Conflicts:
#	cura/API/Account.py
This commit is contained in:
Nino van Hooff 2020-05-12 14:59:01 +02:00
commit b40b8e8489
1938 changed files with 5246 additions and 2008 deletions

View file

@ -489,7 +489,7 @@ class CuraEngineBackend(QObject, Backend):
#
# \param source The scene node that was changed.
def _onSceneChanged(self, source: SceneNode) -> None:
if not source.callDecoration("isSliceable"):
if not source.callDecoration("isSliceable") and source != self._scene.getRoot():
return
# This case checks if the source node is a node that contains GCode. In this case the

View file

@ -43,7 +43,7 @@ UM.Dialog
TextField {
id: peak_height
objectName: "Peak_Height"
validator: RegExpValidator {regExp: /^-?\d{1,3}([\,|\.]\d*)?$/}
validator: RegExpValidator {regExp: /^\d{1,3}([\,|\.]\d*)?$/}
width: 180 * screenScaleFactor
onTextChanged: { manager.onPeakHeightChanged(text) }
}

View file

@ -50,7 +50,7 @@ class ImageReader(MeshReader):
size = max(self._ui.getWidth(), self._ui.getDepth())
return self._generateSceneNode(file_name, size, self._ui.peak_height, self._ui.base_height, self._ui.smoothing, 512, self._ui.lighter_is_higher, self._ui.use_transparency_model, self._ui.transmittance_1mm)
def _generateSceneNode(self, file_name, xz_size, peak_height, base_height, blur_iterations, max_size, lighter_is_higher, use_transparency_model, transmittance_1mm):
def _generateSceneNode(self, file_name, xz_size, height_from_base, base_height, blur_iterations, max_size, lighter_is_higher, use_transparency_model, transmittance_1mm):
scene_node = SceneNode()
mesh = MeshBuilder()
@ -68,8 +68,10 @@ class ImageReader(MeshReader):
if img.width() < 2 or img.height() < 2:
img = img.scaled(width, height, Qt.IgnoreAspectRatio)
height_from_base = max(height_from_base, 0)
base_height = max(base_height, 0)
peak_height = max(peak_height, -base_height)
peak_height = base_height + height_from_base
xz_size = max(xz_size, 1)
scale_vector = Vector(xz_size, peak_height, xz_size)

View file

@ -155,8 +155,10 @@ class ImageReaderUI(QObject):
if len(value) > 0:
try:
self.peak_height = float(value.replace(",", "."))
if self.peak_height < 0:
self.peak_height = 2.5
except ValueError: # Can happen with incomplete numbers, such as "-".
self._width = 0
self.peak_height = 2.5 # restore default
else:
self.peak_height = 0

View file

@ -108,13 +108,12 @@ class PauseAtHeight(Script):
"type": "float",
"default_value": 3.3333
},
"redo_layers":
"redo_layer":
{
"label": "Redo Layers",
"description": "Redo a number of previous layers after a pause to increases adhesion.",
"unit": "layers",
"type": "int",
"default_value": 0
"label": "Redo Layer",
"description": "Redo the last layer before the pause, to get the filament flowing again after having oozed a bit during the pause.",
"type": "bool",
"default_value": false
},
"standby_temperature":
{
@ -160,7 +159,7 @@ class PauseAtHeight(Script):
park_x = self.getSettingValueByKey("head_park_x")
park_y = self.getSettingValueByKey("head_park_y")
layers_started = False
redo_layers = self.getSettingValueByKey("redo_layers")
redo_layer = self.getSettingValueByKey("redo_layer")
standby_temperature = self.getSettingValueByKey("standby_temperature")
firmware_retract = Application.getInstance().getGlobalContainerStack().getProperty("machine_firmware_retract", "value")
control_temperatures = Application.getInstance().getGlobalContainerStack().getProperty("machine_nozzle_temp_enabled", "value")
@ -264,24 +263,23 @@ class PauseAtHeight(Script):
if current_e >= 0:
break
# include a number of previous layers
for i in range(1, redo_layers + 1):
prev_layer = data[index - i]
# Maybe redo the last layer.
if redo_layer:
prev_layer = data[index - 1]
layer = prev_layer + layer
# Get extruder's absolute position at the
# beginning of the first layer redone
# beginning of the redone layer.
# see https://github.com/nallath/PostProcessingPlugin/issues/55
if i == redo_layers:
# Get X and Y from the next layer (better position for
# the nozzle)
x, y = self.getNextXY(layer)
prev_lines = prev_layer.split("\n")
for lin in prev_lines:
new_e = self.getValue(lin, "E", current_e)
if new_e != current_e:
current_e = new_e
break
# Get X and Y from the next layer (better position for
# the nozzle)
x, y = self.getNextXY(layer)
prev_lines = prev_layer.split("\n")
for lin in prev_lines:
new_e = self.getValue(lin, "E", current_e)
if new_e != current_e:
current_e = new_e
break
prepend_gcode = ";TYPE:CUSTOM\n"
prepend_gcode += ";added code by post processing\n"
@ -364,8 +362,8 @@ class PauseAtHeight(Script):
prepend_gcode += self.putValue(M = 82) + " ; switch back to absolute E values\n"
# reset extrude value to pre pause value
prepend_gcode += self.putValue(G = 92, E = current_e) + "\n"
# reset extrude value to pre pause value
prepend_gcode += self.putValue(G = 92, E = current_e) + "\n"
layer = prepend_gcode + layer

View file

@ -77,7 +77,7 @@ class SimulationPass(RenderPass):
self._layer_shader.setUniformValue("u_max_thickness", 1)
self._layer_shader.setUniformValue("u_min_thickness", 0)
self._layer_shader.setUniformValue("u_layer_view_type", 1)
self._layer_shader.setUniformValue("u_extruder_opacity", [1, 1, 1, 1])
self._layer_shader.setUniformValue("u_extruder_opacity", [[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]])
self._layer_shader.setUniformValue("u_show_travel_moves", 0)
self._layer_shader.setUniformValue("u_show_helpers", 1)
self._layer_shader.setUniformValue("u_show_skin", 1)

View file

@ -12,6 +12,7 @@ from UM.Event import Event, KeyEvent
from UM.Job import Job
from UM.Logger import Logger
from UM.Math.Color import Color
from UM.Math.Matrix import Matrix
from UM.Mesh.MeshBuilder import MeshBuilder
from UM.Message import Message
from UM.Platform import Platform
@ -139,7 +140,7 @@ class SimulationView(CuraView):
def _resetSettings(self) -> None:
self._layer_view_type = 0 # type: int # 0 is material color, 1 is color by linetype, 2 is speed, 3 is layer thickness
self._extruder_count = 0
self._extruder_opacity = [1.0, 1.0, 1.0, 1.0]
self._extruder_opacity = [[1.0, 1.0, 1.0, 1.0], [1.0, 1.0, 1.0, 1.0], [1.0, 1.0, 1.0, 1.0], [1.0, 1.0, 1.0, 1.0]]
self._show_travel_moves = False
self._show_helpers = True
self._show_skin = True
@ -308,15 +309,17 @@ class SimulationView(CuraView):
## Set the extruder opacity
#
# \param extruder_nr 0..3
# \param extruder_nr 0..15
# \param opacity 0.0 .. 1.0
def setExtruderOpacity(self, extruder_nr: int, opacity: float) -> None:
if 0 <= extruder_nr <= 3:
self._extruder_opacity[extruder_nr] = opacity
if 0 <= extruder_nr <= 15:
self._extruder_opacity[extruder_nr // 4][extruder_nr % 4] = opacity
self.currentLayerNumChanged.emit()
def getExtruderOpacities(self)-> List[float]:
return self._extruder_opacity
def getExtruderOpacities(self) -> Matrix:
# NOTE: Extruder opacities are stored in a matrix for (minor) performance reasons (w.r.t. OpenGL/shaders).
# If more than 16 extruders are called for, this should be converted to a sampler1d.
return Matrix(self._extruder_opacity)
def setShowTravelMoves(self, show):
self._show_travel_moves = show

View file

@ -152,7 +152,7 @@ fragment41core =
u_active_extruder = 0.0
u_shade_factor = 0.60
u_layer_view_type = 0
u_extruder_opacity = [1.0, 1.0, 1.0, 1.0]
u_extruder_opacity = [[1.0, 1.0, 1.0, 1.0], [1.0, 1.0, 1.0, 1.0], [1.0, 1.0, 1.0, 1.0], [1.0, 1.0, 1.0, 1.0]]
u_show_travel_moves = 0
u_show_helpers = 1

View file

@ -11,7 +11,7 @@ vertex41core =
uniform lowp float u_max_thickness;
uniform lowp float u_min_thickness;
uniform lowp int u_layer_view_type;
uniform lowp vec4 u_extruder_opacity; // currently only for max 4 extruders, others always visible
uniform lowp mat4 u_extruder_opacity; // currently only for max 16 extruders, others always visible
uniform highp mat4 u_normalMatrix;
@ -31,7 +31,7 @@ vertex41core =
out highp vec3 v_normal;
out lowp vec2 v_line_dim;
out highp int v_extruder;
out highp vec4 v_extruder_opacity;
out highp mat4 v_extruder_opacity;
out float v_line_type;
out lowp vec4 f_color;
@ -121,7 +121,7 @@ geometry41core =
in vec3 v_normal[];
in vec2 v_line_dim[];
in int v_extruder[];
in vec4 v_extruder_opacity[];
in mat4 v_extruder_opacity[];
in float v_line_type[];
out vec4 f_color;
@ -152,7 +152,7 @@ geometry41core =
float size_x;
float size_y;
if ((v_extruder_opacity[0][v_extruder[0]] == 0.0) && (v_line_type[0] != 8) && (v_line_type[0] != 9)) {
if ((v_extruder_opacity[0][int(mod(v_extruder[0], 4))][v_extruder[0] / 4] == 0.0) && (v_line_type[0] != 8) && (v_line_type[0] != 9)) {
return;
}
// See LayerPolygon; 8 is MoveCombingType, 9 is RetractionType
@ -304,7 +304,7 @@ fragment41core =
[defaults]
u_active_extruder = 0.0
u_layer_view_type = 0
u_extruder_opacity = [1.0, 1.0, 1.0, 1.0]
u_extruder_opacity = [[1.0, 1.0, 1.0, 1.0], [1.0, 1.0, 1.0, 1.0], [1.0, 1.0, 1.0, 1.0], [1.0, 1.0, 1.0, 1.0]]
u_specularColor = [0.4, 0.4, 0.4, 1.0]
u_ambientColor = [0.3, 0.3, 0.3, 0.0]

View file

@ -6,7 +6,7 @@ vertex41core =
uniform highp mat4 u_projectionMatrix;
uniform lowp float u_active_extruder;
uniform lowp vec4 u_extruder_opacity; // currently only for max 4 extruders, others always visible
uniform lowp mat4 u_extruder_opacity; // currently only for max 16 extruders, others always visible
uniform highp mat4 u_normalMatrix;
@ -25,7 +25,7 @@ vertex41core =
out highp vec3 v_normal;
out lowp vec2 v_line_dim;
out highp int v_extruder;
out highp vec4 v_extruder_opacity;
out highp mat4 v_extruder_opacity;
out float v_line_type;
out lowp vec4 f_color;
@ -75,7 +75,7 @@ geometry41core =
in vec3 v_normal[];
in vec2 v_line_dim[];
in int v_extruder[];
in vec4 v_extruder_opacity[];
in mat4 v_extruder_opacity[];
in float v_line_type[];
out vec4 f_color;
@ -106,7 +106,7 @@ geometry41core =
float size_x;
float size_y;
if ((v_extruder_opacity[0][v_extruder[0]] == 0.0) && (v_line_type[0] != 8) && (v_line_type[0] != 9)) {
if ((v_extruder_opacity[0][int(mod(v_extruder[0], 4))][v_extruder[0] / 4] == 0.0) && (v_line_type[0] != 8) && (v_line_type[0] != 9)) {
return;
}
// See LayerPolygon; 8 is MoveCombingType, 9 is RetractionType
@ -256,7 +256,7 @@ fragment41core =
[defaults]
u_active_extruder = 0.0
u_extruder_opacity = [1.0, 1.0, 1.0, 1.0]
u_extruder_opacity = [[1.0, 1.0, 1.0, 1.0], [1.0, 1.0, 1.0, 1.0], [1.0, 1.0, 1.0, 1.0], [1.0, 1.0, 1.0, 1.0]]
u_specularColor = [0.4, 0.4, 0.4, 1.0]
u_ambientColor = [0.3, 0.3, 0.3, 0.0]

View file

@ -157,7 +157,7 @@ fragment41core =
u_active_extruder = 0.0
u_shade_factor = 0.60
u_layer_view_type = 0
u_extruder_opacity = [1.0, 1.0, 1.0, 1.0]
u_extruder_opacity = [[1.0, 1.0, 1.0, 1.0], [1.0, 1.0, 1.0, 1.0], [1.0, 1.0, 1.0, 1.0], [1.0, 1.0, 1.0, 1.0]]
u_show_travel_moves = 0
u_show_helpers = 1

View file

@ -93,8 +93,8 @@ class CloudPackageChecker(QObject):
self._application.getCuraAPI().account.setSyncState(self.SYNC_SERVICE_NAME, SyncState.SUCCESS)
def _handleCompatibilityData(self, subscribed_packages_payload: List[Dict[str, Any]]) -> None:
user_subscribed_packages = [plugin["package_id"] for plugin in subscribed_packages_payload]
user_installed_packages = self._package_manager.getUserInstalledPackages()
user_subscribed_packages = {plugin["package_id"] for plugin in subscribed_packages_payload}
user_installed_packages = self._package_manager.getAllInstalledPackageIDs()
if user_subscribed_packages == self._last_check_packages:
# nothing new here

View file

@ -105,10 +105,6 @@ class CloudOutputDeviceManager:
self._onDevicesDiscovered(new_clusters)
# Inform whether new cloud printers have been detected. If they have, the welcome wizard can close.
self._account._new_cloud_printers_detected = len(new_clusters) > 0
self._account.cloudPrintersDetectedChanged.emit(len(new_clusters) > 0)
removed_device_keys = set(self._remote_clusters.keys()) - set(online_clusters.keys())
for device_id in removed_device_keys:
self._onDiscoveredDeviceRemoved(device_id)
@ -145,10 +141,20 @@ class CloudOutputDeviceManager:
if machine_manager.getMachine(device.printerType, {self.META_CLUSTER_ID: device.key}) is None \
and machine_manager.getMachine(device.printerType, {self.META_NETWORK_KEY: cluster_data.host_name + "*"}) is None: # The host name is part of the network key.
new_devices.append(device)
elif device.getId() not in self._remote_clusters:
self._remote_clusters[device.getId()] = device
remote_clusters_added = True
# Inform the Cloud printers model about new devices.
new_devices_list_of_dicts = [{
"key": d.getId(),
"name": d.name,
"machine_type": d.printerTypeName,
"firmware_version": d.firmwareVersion} for d in new_devices]
discovered_cloud_printers_model = CuraApplication.getInstance().getDiscoveredCloudPrintersModel()
discovered_cloud_printers_model.addDiscoveredCloudPrinters(new_devices_list_of_dicts)
if not new_devices:
if remote_clusters_added:
self._connectToActiveMachine()

View file

@ -1,4 +1,4 @@
# Copyright (c) 2019 Ultimaker B.V.
# Copyright (c) 2020 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher.
import os
@ -367,11 +367,18 @@ class USBPrinterOutputDevice(PrinterOutputDevice):
self._sendCommand("M84")
def _sendNextGcodeLine(self):
if self._gcode_position >= len(self._gcode):
"""
Send the next line of g-code, at the current `_gcode_position`, via a
serial port to the printer.
If the print is done, this sets `_is_printing` to `False` as well.
"""
try:
line = self._gcode[self._gcode_position]
except IndexError: # End of print, or print got cancelled.
self._printers[0].updateActivePrintJob(None)
self._is_printing = False
return
line = self._gcode[self._gcode_position]
if ";" in line:
line = line[:line.find(";")]
@ -401,7 +408,7 @@ class USBPrinterOutputDevice(PrinterOutputDevice):
if print_job is None:
controller = GenericOutputController(self)
controller.setCanUpdateFirmware(True)
print_job = PrintJobOutputModel(output_controller=controller, name=CuraApplication.getInstance().getPrintInformation().jobName)
print_job = PrintJobOutputModel(output_controller = controller, name = CuraApplication.getInstance().getPrintInformation().jobName)
print_job.updateState("printing")
self._printers[0].updateActivePrintJob(print_job)

View file

@ -26,7 +26,7 @@ class VersionUpgrade45to46(VersionUpgrade):
parser.read_string(serialized)
# Update version number.
parser["metadata"]["setting_version"] = "12"
parser["metadata"]["setting_version"] = "13"
# Remove deleted settings from the visible settings list.
if "general" in parser and "visible_settings" in parser["general"]:
@ -54,13 +54,20 @@ class VersionUpgrade45to46(VersionUpgrade):
parser.read_string(serialized)
# Update version number.
parser["metadata"]["setting_version"] = "12"
parser["metadata"]["setting_version"] = "13"
if "values" in parser:
for removed in _removed_settings:
if removed in parser["values"]:
del parser["values"][removed]
if "meshfix_maximum_deviation" in parser["values"]:
maximum_deviation = parser["values"]["meshfix_maximum_deviation"]
if maximum_deviation.startswith("="):
maximum_deviation = maximum_deviation[1:]
maximum_deviation = "=(" + maximum_deviation + ") / 2"
parser["values"]["meshfix_maximum_deviation"] = maximum_deviation
result = io.StringIO()
parser.write(result)
return [filename], [result.getvalue()]
@ -79,7 +86,7 @@ class VersionUpgrade45to46(VersionUpgrade):
# Update version number.
if "metadata" not in parser:
parser["metadata"] = {}
parser["metadata"]["setting_version"] = "12"
parser["metadata"]["setting_version"] = "13"
result = io.StringIO()
parser.write(result)

View file

@ -14,13 +14,13 @@ def getMetaData() -> Dict[str, Any]:
return {
"version_upgrade": {
# From To Upgrade function
("preferences", 6000011): ("preferences", 6000012, upgrade.upgradePreferences),
("machine_stack", 4000011): ("machine_stack", 4000012, upgrade.upgradeStack),
("extruder_train", 4000011): ("extruder_train", 4000012, upgrade.upgradeStack),
("definition_changes", 4000011): ("definition_changes", 4000012, upgrade.upgradeInstanceContainer),
("quality_changes", 4000011): ("quality_changes", 4000012, upgrade.upgradeInstanceContainer),
("quality", 4000011): ("quality", 4000012, upgrade.upgradeInstanceContainer),
("user", 4000011): ("user", 4000012, upgrade.upgradeInstanceContainer),
("preferences", 6000011): ("preferences", 6000013, upgrade.upgradePreferences),
("machine_stack", 4000011): ("machine_stack", 4000013, upgrade.upgradeStack),
("extruder_train", 4000011): ("extruder_train", 4000013, upgrade.upgradeStack),
("definition_changes", 4000011): ("definition_changes", 4000013, upgrade.upgradeInstanceContainer),
("quality_changes", 4000011): ("quality_changes", 4000013, upgrade.upgradeInstanceContainer),
("quality", 4000011): ("quality", 4000013, upgrade.upgradeInstanceContainer),
("user", 4000011): ("user", 4000013, upgrade.upgradeInstanceContainer),
},
"sources": {
"preferences": {

View file

@ -6,8 +6,7 @@ from typing import Tuple, List
import io
from UM.VersionUpgrade import VersionUpgrade
class VersionUpgrade46to47(VersionUpgrade):
class VersionUpgrade460to462(VersionUpgrade):
def upgradePreferences(self, serialized: str, filename: str) -> Tuple[List[str], List[str]]:
"""
Upgrades preferences to have the new version number.
@ -20,7 +19,7 @@ class VersionUpgrade46to47(VersionUpgrade):
parser.read_string(serialized)
# Update version number.
parser["metadata"]["setting_version"] = "13"
parser["metadata"]["setting_version"] = "14"
result = io.StringIO()
parser.write(result)
@ -41,18 +40,19 @@ class VersionUpgrade46to47(VersionUpgrade):
parser.read_string(serialized)
# Update version number.
parser["metadata"]["setting_version"] = "13"
parser["metadata"]["setting_version"] = "14"
if "values" in parser:
# Maximum Deviation's effect was corrected. Previously the deviation
# ended up being only half of what the user had entered. This was
# fixed in Cura 4.7 so there we need to halve the deviation that the
# user had entered.
# user had entered. This halving was accidentally merged into 4.6 and had to be reverted
# back in 4.6.2.
if "meshfix_maximum_deviation" in parser["values"]:
maximum_deviation = parser["values"]["meshfix_maximum_deviation"]
if maximum_deviation.startswith("="):
maximum_deviation = maximum_deviation[1:]
maximum_deviation = "=(" + maximum_deviation + ") / 2"
maximum_deviation = "=(" + maximum_deviation + ") * 2"
parser["values"]["meshfix_maximum_deviation"] = maximum_deviation
result = io.StringIO()
@ -73,7 +73,7 @@ class VersionUpgrade46to47(VersionUpgrade):
# Update version number.
if "metadata" not in parser:
parser["metadata"] = {}
parser["metadata"]["setting_version"] = "13"
parser["metadata"]["setting_version"] = "14"
result = io.StringIO()
parser.write(result)

View file

@ -0,0 +1,59 @@
# Copyright (c) 2020 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher.
from typing import Any, Dict, TYPE_CHECKING
from . import VersionUpgrade460to462
if TYPE_CHECKING:
from UM.Application import Application
upgrade = VersionUpgrade460to462.VersionUpgrade460to462()
def getMetaData() -> Dict[str, Any]:
return {
"version_upgrade": {
# From To Upgrade function
("preferences", 6000013): ("preferences", 6000014, upgrade.upgradePreferences),
("machine_stack", 4000013): ("machine_stack", 4000014, upgrade.upgradeStack),
("extruder_train", 4000013): ("extruder_train", 4000014, upgrade.upgradeStack),
("definition_changes", 4000013): ("definition_changes", 4000014, upgrade.upgradeInstanceContainer),
("quality_changes", 4000013): ("quality_changes", 4000014, upgrade.upgradeInstanceContainer),
("quality", 4000013): ("quality", 4000014, upgrade.upgradeInstanceContainer),
("user", 4000013): ("user", 4000014, upgrade.upgradeInstanceContainer),
},
"sources": {
"preferences": {
"get_version": upgrade.getCfgVersion,
"location": {"."}
},
"machine_stack": {
"get_version": upgrade.getCfgVersion,
"location": {"./machine_instances"}
},
"extruder_train": {
"get_version": upgrade.getCfgVersion,
"location": {"./extruders"}
},
"definition_changes": {
"get_version": upgrade.getCfgVersion,
"location": {"./definition_changes"}
},
"quality_changes": {
"get_version": upgrade.getCfgVersion,
"location": {"./quality_changes"}
},
"quality": {
"get_version": upgrade.getCfgVersion,
"location": {"./quality"}
},
"user": {
"get_version": upgrade.getCfgVersion,
"location": {"./user"}
}
}
}
def register(app: "Application") -> Dict[str, Any]:
return {"version_upgrade": upgrade}

View file

@ -0,0 +1,8 @@
{
"name": "Version Upgrade 4.6.0 to 4.6.2",
"author": "Ultimaker B.V.",
"version": "1.0.0",
"description": "Upgrades configurations from Cura 4.6.0 to Cura 4.6.2.",
"api": "7.2.0",
"i18n-catalog": "cura"
}

View file

@ -0,0 +1,104 @@
# Copyright (c) 2020 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher.
import configparser
from typing import Tuple, List
import io
from UM.VersionUpgrade import VersionUpgrade
class VersionUpgrade462to47(VersionUpgrade):
def upgradePreferences(self, serialized: str, filename: str) -> Tuple[List[str], List[str]]:
"""
Upgrades preferences to have the new version number.
:param serialized: The original contents of the preferences file.
:param filename: The file name of the preferences file.
:return: A list of new file names, and a list of the new contents for
those files.
"""
parser = configparser.ConfigParser(interpolation = None)
parser.read_string(serialized)
# Update version number.
parser["metadata"]["setting_version"] = "15"
result = io.StringIO()
parser.write(result)
return [filename], [result.getvalue()]
def upgradeInstanceContainer(self, serialized: str, filename: str) -> Tuple[List[str], List[str]]:
"""
Upgrades instance containers to have the new version number.
This changes the maximum deviation setting if that setting was present
in the profile.
:param serialized: The original contents of the instance container.
:param filename: The original file name of the instance container.
:return: A list of new file names, and a list of the new contents for
those files.
"""
parser = configparser.ConfigParser(interpolation = None, comment_prefixes = ())
parser.read_string(serialized)
# Update version number.
parser["metadata"]["setting_version"] = "15"
if "values" in parser:
# Maximum Deviation's effect was corrected. Previously the deviation
# ended up being only half of what the user had entered. This was
# fixed in Cura 4.7 so there we need to halve the deviation that the
# user had entered.
#
# This got accidentally merged in Cura 4.6.0. In 4.6.2 we removed
# that. In 4.7 it's not unmerged, so there we need to revert all
# that again.
if "meshfix_maximum_deviation" in parser["values"]:
maximum_deviation = parser["values"]["meshfix_maximum_deviation"]
if maximum_deviation.startswith("="):
maximum_deviation = maximum_deviation[1:]
maximum_deviation = "=(" + maximum_deviation + ") / 2"
parser["values"]["meshfix_maximum_deviation"] = maximum_deviation
result = io.StringIO()
parser.write(result)
return [filename], [result.getvalue()]
def upgradeStack(self, serialized: str, filename: str) -> Tuple[List[str], List[str]]:
"""
Upgrades stacks to have the new version number.
:param serialized: The original contents of the stack.
:param filename: The original file name of the stack.
:return: A list of new file names, and a list of the new contents for
those files.
"""
parser = configparser.ConfigParser(interpolation = None)
parser.read_string(serialized)
# Update version number.
if "metadata" not in parser:
parser["metadata"] = {}
parser["metadata"]["setting_version"] = "15"
# Update Pause at Height script parameters if present.
if "post_processing_scripts" in parser["metadata"]:
new_scripts_entries = []
for script_str in parser["metadata"]["post_processing_scripts"].split("\n"):
if not script_str:
continue
script_str = script_str.replace(r"\\\n", "\n").replace(r"\\\\", "\\\\") # Unescape escape sequences.
script_parser = configparser.ConfigParser(interpolation=None)
script_parser.optionxform = str # type: ignore # Don't transform the setting keys as they are case-sensitive.
script_parser.read_string(script_str)
if "PauseAtHeight" in script_parser:
if "redo_layers" in script_parser["PauseAtHeight"]:
script_parser["PauseAtHeight"]["redo_layer"] = str(int(script_parser["PauseAtHeight"]["redo_layers"]) > 0)
del script_parser["PauseAtHeight"]["redo_layers"] # Has been renamed to without the S.
script_io = io.StringIO()
script_parser.write(script_io)
script_str = script_io.getvalue()
script_str = script_str.replace("\\\\", r"\\\\").replace("\n", r"\\\n") # Escape newlines because configparser sees those as section delimiters.
new_scripts_entries.append(script_str)
parser["metadata"]["post_processing_scripts"] = "\n".join(new_scripts_entries)
result = io.StringIO()
parser.write(result)
return [filename], [result.getvalue()]

View file

@ -3,24 +3,24 @@
from typing import Any, Dict, TYPE_CHECKING
from . import VersionUpgrade46to47
from . import VersionUpgrade462to47
if TYPE_CHECKING:
from UM.Application import Application
upgrade = VersionUpgrade46to47.VersionUpgrade46to47()
upgrade = VersionUpgrade462to47.VersionUpgrade462to47()
def getMetaData() -> Dict[str, Any]:
return {
"version_upgrade": {
# From To Upgrade function
("preferences", 6000012): ("preferences", 6000013, upgrade.upgradePreferences),
("machine_stack", 4000012): ("machine_stack", 4000013, upgrade.upgradeStack),
("extruder_train", 4000012): ("extruder_train", 4000013, upgrade.upgradeStack),
("definition_changes", 4000012): ("definition_changes", 4000013, upgrade.upgradeInstanceContainer),
("quality_changes", 4000012): ("quality_changes", 4000013, upgrade.upgradeInstanceContainer),
("quality", 4000012): ("quality", 4000013, upgrade.upgradeInstanceContainer),
("user", 4000012): ("user", 4000013, upgrade.upgradeInstanceContainer),
("preferences", 6000014): ("preferences", 6000015, upgrade.upgradePreferences),
("machine_stack", 4000014): ("machine_stack", 4000015, upgrade.upgradeStack),
("extruder_train", 4000014): ("extruder_train", 4000015, upgrade.upgradeStack),
("definition_changes", 4000014): ("definition_changes", 4000015, upgrade.upgradeInstanceContainer),
("quality_changes", 4000014): ("quality_changes", 4000015, upgrade.upgradeInstanceContainer),
("quality", 4000014): ("quality", 4000015, upgrade.upgradeInstanceContainer),
("user", 4000014): ("user", 4000015, upgrade.upgradeInstanceContainer),
},
"sources": {
"preferences": {

View file

@ -0,0 +1,8 @@
{
"name": "Version Upgrade 4.6.2 to 4.7",
"author": "Ultimaker B.V.",
"version": "1.0.0",
"description": "Upgrades configurations from Cura 4.6.2 to Cura 4.7.",
"api": "7.2.0",
"i18n-catalog": "cura"
}

View file

@ -1,8 +0,0 @@
{
"name": "Version Upgrade 4.6 to 4.7",
"author": "Ultimaker B.V.",
"version": "1.0.0",
"description": "Upgrades configurations from Cura 4.6 to Cura 4.7.",
"api": "7.2.0",
"i18n-catalog": "cura"
}