mirror of
https://github.com/Ultimaker/Cura.git
synced 2025-08-07 14:04:03 -06:00
Merge remote-tracking branch 'origin/master' into CURA-7290_manual_account_sync
# Conflicts: # cura/API/Account.py
This commit is contained in:
commit
b40b8e8489
1938 changed files with 5246 additions and 2008 deletions
|
@ -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
|
||||
|
|
|
@ -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) }
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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]
|
||||
|
|
|
@ -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]
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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": {
|
||||
|
|
|
@ -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)
|
59
plugins/VersionUpgrade/VersionUpgrade460to462/__init__.py
Normal file
59
plugins/VersionUpgrade/VersionUpgrade460to462/__init__.py
Normal 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}
|
|
@ -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"
|
||||
}
|
|
@ -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()]
|
|
@ -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": {
|
8
plugins/VersionUpgrade/VersionUpgrade462to47/plugin.json
Normal file
8
plugins/VersionUpgrade/VersionUpgrade462to47/plugin.json
Normal 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"
|
||||
}
|
|
@ -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"
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue