From ac6ad5ec6c255b0c4983fd3498383d70876a01ff Mon Sep 17 00:00:00 2001 From: Victor Larchenko Date: Tue, 11 Oct 2016 16:25:51 +0600 Subject: [PATCH 01/75] T466: Added plugin --- plugins/GCODEReader/GCODEReader.py | 40 ++++++++++++++++++++++++++++++ plugins/GCODEReader/__init__.py | 32 ++++++++++++++++++++++++ 2 files changed, 72 insertions(+) create mode 100644 plugins/GCODEReader/GCODEReader.py create mode 100644 plugins/GCODEReader/__init__.py diff --git a/plugins/GCODEReader/GCODEReader.py b/plugins/GCODEReader/GCODEReader.py new file mode 100644 index 0000000000..ce6fd9075e --- /dev/null +++ b/plugins/GCODEReader/GCODEReader.py @@ -0,0 +1,40 @@ +# Copyright (c) 2015 Ultimaker B.V. +# Copyright (c) 2013 David Braam +# Uranium is released under the terms of the AGPLv3 or higher. + +from UM.Mesh.MeshReader import MeshReader +from UM.Mesh.MeshBuilder import MeshBuilder +import os +from UM.Scene.SceneNode import SceneNode +from UM.Math.Vector import Vector + +from UM.Job import Job + +class GCODEReader(MeshReader): + def __init__(self): + super(GCODEReader, self).__init__() + self._supported_extensions = [".gcode", ".g"] + + def read(self, file_name): + scene_node = None + + extension = os.path.splitext(file_name)[1] + if extension.lower() in self._supported_extensions: + scene_node = SceneNode() + + mesh_builder = MeshBuilder() + mesh_builder.setFileName(file_name) + + mesh_builder.addCube( + width=5, + height=5, + depth=5, + center=Vector(0, 2.5, 0) + ) + + scene_node.setMeshData(mesh_builder.build()) + + scene_node.setEnabled(False) + scene_node.setSelectable(False) + + return scene_node diff --git a/plugins/GCODEReader/__init__.py b/plugins/GCODEReader/__init__.py new file mode 100644 index 0000000000..f1572c077f --- /dev/null +++ b/plugins/GCODEReader/__init__.py @@ -0,0 +1,32 @@ +# Copyright (c) 2015 Ultimaker B.V. +# Uranium is released under the terms of the AGPLv3 or higher. + +#Shoopdawoop +from . import GCODEReader + +from UM.i18n import i18nCatalog +i18n_catalog = i18nCatalog("uranium") + +def getMetaData(): + return { + "plugin": { + "name": i18n_catalog.i18nc("@label", "GCODE Reader"), + "author": "Victor Larchenko", + "version": "1.0", + "description": i18n_catalog.i18nc("@info:whatsthis", "Makes it possbile to read GCODE files."), + "api": 3 + }, + "mesh_reader": [ + { + "extension": "gcode", + "description": i18n_catalog.i18nc("@item:inlistbox", "GCODE File") + }, + { + "extension": "g", + "description": i18n_catalog.i18nc("@item:inlistbox", "GCODE File") + } + ] + } + +def register(app): + return { "mesh_reader": GCODEReader.GCODEReader() } From b9514527dd4ce0a5da7834af338eb804a1399b57 Mon Sep 17 00:00:00 2001 From: Victor Larchenko Date: Tue, 11 Oct 2016 17:20:55 +0600 Subject: [PATCH 02/75] T466: Added test line --- plugins/GCODEReader/GCODEReader.py | 75 +++++++++++++++++++++++++----- plugins/LayerView/LayerPass.py | 8 +++- 2 files changed, 71 insertions(+), 12 deletions(-) diff --git a/plugins/GCODEReader/GCODEReader.py b/plugins/GCODEReader/GCODEReader.py index ce6fd9075e..683355c9a3 100644 --- a/plugins/GCODEReader/GCODEReader.py +++ b/plugins/GCODEReader/GCODEReader.py @@ -7,6 +7,15 @@ from UM.Mesh.MeshBuilder import MeshBuilder import os from UM.Scene.SceneNode import SceneNode from UM.Math.Vector import Vector +from UM.Math.AxisAlignedBox import AxisAlignedBox +from UM.Application import Application + +from cura import LayerDataBuilder +from cura import LayerDataDecorator +from cura import LayerPolygon + +import numpy + from UM.Job import Job @@ -22,19 +31,63 @@ class GCODEReader(MeshReader): if extension.lower() in self._supported_extensions: scene_node = SceneNode() - mesh_builder = MeshBuilder() - mesh_builder.setFileName(file_name) + # mesh_builder = MeshBuilder() + # mesh_builder.setFileName(file_name) + # + # mesh_builder.addCube( + # width=5, + # height=5, + # depth=5, + # center=Vector(0, 2.5, 0) + # ) + # + # scene_node.setMeshData(mesh_builder.build()) - mesh_builder.addCube( - width=5, - height=5, - depth=5, - center=Vector(0, 2.5, 0) - ) + def getBoundingBox(): + return AxisAlignedBox(minimum=Vector(0, 0, 0), maximum=Vector(10, 10, 10)) - scene_node.setMeshData(mesh_builder.build()) + scene_node.getBoundingBox = getBoundingBox + scene_node.gcode = True - scene_node.setEnabled(False) - scene_node.setSelectable(False) + layer_data = LayerDataBuilder.LayerDataBuilder() + layer_count = 1 + for id in range(layer_count): + layer_data.addLayer(id) + this_layer = layer_data.getLayer(id) + layer_data.setLayerHeight(id, 1) + layer_data.setLayerThickness(id, 1) + + extruder = 1 + line_types = numpy.empty((1, 1), numpy.int32) + line_types[0, 0] = 6 + line_widths = numpy.empty((1, 1), numpy.int32) + line_widths[0, 0] = 1 + points = numpy.empty((2, 3), numpy.float32) + points[0, 0] = 0 + points[0, 1] = 0 + points[0, 2] = 0 + points[1, 0] = 10 + points[1, 1] = 10 + points[1, 2] = 10 + + this_poly = LayerPolygon.LayerPolygon(layer_data, extruder, line_types, points, line_widths) + this_poly.buildCache() + + this_layer.polygons.append(this_poly) + + layer_mesh = layer_data.build() + decorator = LayerDataDecorator.LayerDataDecorator() + decorator.setLayerData(layer_mesh) + scene_node.addDecorator(decorator) + + scene_node_parent = Application.getInstance().getBuildVolume() + scene_node.setParent(scene_node_parent) + + view = Application.getInstance().getController().getActiveView() + if view.getPluginId() == "LayerView": + view.resetLayerData() + + #scene_node.setEnabled(False) + #scene_node.setSelectable(False) return scene_node diff --git a/plugins/LayerView/LayerPass.py b/plugins/LayerView/LayerPass.py index 8ff2eb16ec..cf3e5cd89a 100644 --- a/plugins/LayerView/LayerPass.py +++ b/plugins/LayerView/LayerPass.py @@ -45,10 +45,16 @@ class LayerPass(RenderPass): tool_handle_batch = RenderBatch(self._tool_handle_shader, type = RenderBatch.RenderType.Overlay) for node in DepthFirstIterator(self._scene.getRoot()): + flag = False + try: + flag = node.gcode + except AttributeError: + pass + if isinstance(node, ToolHandle): tool_handle_batch.addItem(node.getWorldTransformation(), mesh = node.getSolidMesh()) - elif isinstance(node, SceneNode) and node.getMeshData() and node.isVisible(): + elif isinstance(node, SceneNode) and (node.getMeshData() or flag) and node.isVisible(): layer_data = node.callDecoration("getLayerData") if not layer_data: continue From 65f3495a29ec30c5dc7a56e1d8cb5cfeb9794f32 Mon Sep 17 00:00:00 2001 From: Victor Larchenko Date: Wed, 12 Oct 2016 12:08:00 +0600 Subject: [PATCH 03/75] T466: Added pausing of backend work --- plugins/CuraEngineBackend/CuraEngineBackend.py | 5 ++++- plugins/GCODEReader/GCODEReader.py | 10 ++++++++++ plugins/LayerView/LayerPass.py | 7 +------ plugins/LayerView/LayerView.py | 8 +++++++- resources/qml/SaveButton.qml | 6 ++++++ 5 files changed, 28 insertions(+), 8 deletions(-) diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index b2df2563d0..4e1b2f6841 100644 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -69,6 +69,8 @@ class CuraEngineBackend(Backend): self._scene = Application.getInstance().getController().getScene() self._scene.sceneChanged.connect(self._onSceneChanged) + self._pauseSlicing = False + # Workaround to disable layer view processing if layer view is not active. self._layer_view_active = False Application.getInstance().getController().activeViewChanged.connect(self._onActiveViewChanged) @@ -399,7 +401,8 @@ class CuraEngineBackend(Backend): # # This indicates that we should probably re-slice soon. def _onChanged(self, *args, **kwargs): - self._change_timer.start() + if not self._pauseSlicing: + self._change_timer.start() ## Called when the back-end connects to the front-end. def _onBackendConnected(self): diff --git a/plugins/GCODEReader/GCODEReader.py b/plugins/GCODEReader/GCODEReader.py index 683355c9a3..6001edca67 100644 --- a/plugins/GCODEReader/GCODEReader.py +++ b/plugins/GCODEReader/GCODEReader.py @@ -48,6 +48,16 @@ class GCODEReader(MeshReader): scene_node.getBoundingBox = getBoundingBox scene_node.gcode = True + backend = Application.getInstance().getBackend() + backend._pauseSlicing = True + backend.backendStateChange.emit(0) + + mesh_builder = MeshBuilder() + mesh_builder.setFileName(file_name) + + mesh_builder.addCube(10,10,10) + + scene_node.setMeshData(mesh_builder.build()) layer_data = LayerDataBuilder.LayerDataBuilder() layer_count = 1 diff --git a/plugins/LayerView/LayerPass.py b/plugins/LayerView/LayerPass.py index cf3e5cd89a..287f3c3539 100644 --- a/plugins/LayerView/LayerPass.py +++ b/plugins/LayerView/LayerPass.py @@ -45,16 +45,11 @@ class LayerPass(RenderPass): tool_handle_batch = RenderBatch(self._tool_handle_shader, type = RenderBatch.RenderType.Overlay) for node in DepthFirstIterator(self._scene.getRoot()): - flag = False - try: - flag = node.gcode - except AttributeError: - pass if isinstance(node, ToolHandle): tool_handle_batch.addItem(node.getWorldTransformation(), mesh = node.getSolidMesh()) - elif isinstance(node, SceneNode) and (node.getMeshData() or flag) and node.isVisible(): + elif isinstance(node, SceneNode) and (node.getMeshData()) and node.isVisible(): layer_data = node.callDecoration("getLayerData") if not layer_data: continue diff --git a/plugins/LayerView/LayerView.py b/plugins/LayerView/LayerView.py index 50c13194f7..0736fe6dac 100644 --- a/plugins/LayerView/LayerView.py +++ b/plugins/LayerView/LayerView.py @@ -118,8 +118,14 @@ class LayerView(View): if type(node) is ConvexHullNode and not Selection.isSelected(node.getWatchedNode()): continue + flag = False + try: + flag = node.gcode + except AttributeError: + pass + if not node.render(renderer): - if node.getMeshData() and node.isVisible(): + if node.getMeshData() and node.isVisible() and not flag: renderer.queueNode(node, transparent = True, shader = self._ghost_shader) def setLayer(self, value): diff --git a/resources/qml/SaveButton.qml b/resources/qml/SaveButton.qml index 9b63fccf94..a25aae7a5e 100644 --- a/resources/qml/SaveButton.qml +++ b/resources/qml/SaveButton.qml @@ -14,6 +14,7 @@ Rectangle { property real progress: UM.Backend.progress; property int backendState: UM.Backend.state; + property bool backendPaused: UM.Backend.paused; property bool activity: Printer.getPlatformActivity; property int totalHeight: childrenRect.height + UM.Theme.getSize("default_margin").height property string fileBaseName @@ -24,6 +25,11 @@ Rectangle { return catalog.i18nc("@label:PrintjobStatus", "Please load a 3d model"); } + if (backendPaused) + { + return catalog.i18nc("@label:PrintjobStatus", "Slicing temporary disabled"); + } + switch(base.backendState) { case 1: From 8aa3b1b38cb367ba736f485b63345772df0d2b1a Mon Sep 17 00:00:00 2001 From: Victor Larchenko Date: Wed, 12 Oct 2016 14:23:12 +0600 Subject: [PATCH 04/75] T466: Added basic file loading and parsing --- plugins/GCODEReader/GCODEReader.py | 138 +++++++++++++++++++++++------ plugins/LayerView/LayerView.py | 8 +- 2 files changed, 110 insertions(+), 36 deletions(-) diff --git a/plugins/GCODEReader/GCODEReader.py b/plugins/GCODEReader/GCODEReader.py index 6001edca67..fc5c0c45ac 100644 --- a/plugins/GCODEReader/GCODEReader.py +++ b/plugins/GCODEReader/GCODEReader.py @@ -24,6 +24,36 @@ class GCODEReader(MeshReader): super(GCODEReader, self).__init__() self._supported_extensions = [".gcode", ".g"] + def getInt(self, line, code): + n = line.find(code) + 1 + if n < 1: + return None + m = line.find(' ', n) + m2 = line.find(';', n) + if m < 0: + m = m2 + try: + if m < 0: + return int(line[n:]) + return int(line[n:m]) + except: + return None + + def getFloat(self, line, code): + n = line.find(code) + 1 + if n < 1: + return None + m = line.find(' ', n) + m2 = line.find(';', n) + if m < 0: + m = m2 + try: + if m < 0: + return float(line[n:]) + return float(line[n:m]) + except: + return None + def read(self, file_name): scene_node = None @@ -43,48 +73,90 @@ class GCODEReader(MeshReader): # # scene_node.setMeshData(mesh_builder.build()) - def getBoundingBox(): - return AxisAlignedBox(minimum=Vector(0, 0, 0), maximum=Vector(10, 10, 10)) - - scene_node.getBoundingBox = getBoundingBox + # scene_node.getBoundingBox = getBoundingBox scene_node.gcode = True backend = Application.getInstance().getBackend() backend._pauseSlicing = True backend.backendStateChange.emit(0) - mesh_builder = MeshBuilder() - mesh_builder.setFileName(file_name) - - mesh_builder.addCube(10,10,10) - - scene_node.setMeshData(mesh_builder.build()) + file = open(file_name, "r") layer_data = LayerDataBuilder.LayerDataBuilder() - layer_count = 1 - for id in range(layer_count): - layer_data.addLayer(id) - this_layer = layer_data.getLayer(id) - layer_data.setLayerHeight(id, 1) - layer_data.setLayerThickness(id, 1) - extruder = 1 - line_types = numpy.empty((1, 1), numpy.int32) - line_types[0, 0] = 6 - line_widths = numpy.empty((1, 1), numpy.int32) - line_widths[0, 0] = 1 - points = numpy.empty((2, 3), numpy.float32) - points[0, 0] = 0 - points[0, 1] = 0 - points[0, 2] = 0 - points[1, 0] = 10 - points[1, 1] = 10 - points[1, 2] = 10 + layer_id = 0 - this_poly = LayerPolygon.LayerPolygon(layer_data, extruder, line_types, points, line_widths) + layer_data.addLayer(layer_id) + this_layer = layer_data.getLayer(layer_id) + layer_data.setLayerHeight(layer_id, 0) + layer_data.setLayerThickness(layer_id, 0.1) + + current_extruder = 1 + current_path = [] + current_x = 0 + current_y = 0 + current_z = 0 + + def CreatePolygon(): + count = len(current_path) + line_types = numpy.empty((count-1, 1), numpy.int32) + line_types[:, 0] = 1 + line_widths = numpy.empty((count-1, 1), numpy.int32) + line_widths[:, 0] = 1 + points = numpy.empty((count, 3), numpy.float32) + i = 0 + for point in current_path: + points[i, 0] = point[0] + points[i, 1] = point[1] + points[i, 2] = point[2] + i += 1 + + this_poly = LayerPolygon.LayerPolygon(layer_data, current_extruder, line_types, points, line_widths) this_poly.buildCache() this_layer.polygons.append(this_poly) + current_path.clear() + + # current_path.append([0, 0, 0]) + # current_path.append([10, 10, 10]) + # while file.readable(): + for line in file: + if len(line) == 0: + continue + if line[0] == ";": + continue + G = self.getInt(line, "G") + if G: + if G == 0 or G == 1: + x = self.getFloat(line, "X") + y = self.getFloat(line, "Y") + z = self.getFloat(line, "Z") + e = self.getFloat(line, "E") + if x: + current_x = x + if y: + current_y = y + if z: + current_z = z + if e and e > 0: + current_path.append([current_x, current_z, -current_y]) + else: + if len(current_path) > 1: + CreatePolygon() + elif G == 92: + x = self.getFloat(line, "X") + y = self.getFloat(line, "Y") + z = self.getFloat(line, "Z") + if x: + current_x += x + if y: + current_y += y + if z: + current_z += z + + if len(current_path) > 1: + CreatePolygon() + layer_mesh = layer_data.build() decorator = LayerDataDecorator.LayerDataDecorator() decorator.setLayerData(layer_mesh) @@ -93,6 +165,14 @@ class GCODEReader(MeshReader): scene_node_parent = Application.getInstance().getBuildVolume() scene_node.setParent(scene_node_parent) + mesh_builder = MeshBuilder() + mesh_builder.setFileName(file_name) + + mesh_builder.addCube(10, 10, 10, Vector(0, -5, 0)) + + scene_node.setMeshData(mesh_builder.build()) + scene_node.setPosition(Vector(0,0,0)) + view = Application.getInstance().getController().getActiveView() if view.getPluginId() == "LayerView": view.resetLayerData() diff --git a/plugins/LayerView/LayerView.py b/plugins/LayerView/LayerView.py index 0736fe6dac..50c13194f7 100644 --- a/plugins/LayerView/LayerView.py +++ b/plugins/LayerView/LayerView.py @@ -118,14 +118,8 @@ class LayerView(View): if type(node) is ConvexHullNode and not Selection.isSelected(node.getWatchedNode()): continue - flag = False - try: - flag = node.gcode - except AttributeError: - pass - if not node.render(renderer): - if node.getMeshData() and node.isVisible() and not flag: + if node.getMeshData() and node.isVisible(): renderer.queueNode(node, transparent = True, shader = self._ghost_shader) def setLayer(self, value): From eb649511a75e7d24ca450a39889c987c9f05e731 Mon Sep 17 00:00:00 2001 From: Victor Larchenko Date: Wed, 12 Oct 2016 15:12:17 +0600 Subject: [PATCH 05/75] T466: Improved parsing --- plugins/GCODEReader/GCODEReader.py | 48 ++++++++++++++++++++---------- 1 file changed, 33 insertions(+), 15 deletions(-) diff --git a/plugins/GCODEReader/GCODEReader.py b/plugins/GCODEReader/GCODEReader.py index fc5c0c45ac..0254eb5a98 100644 --- a/plugins/GCODEReader/GCODEReader.py +++ b/plugins/GCODEReader/GCODEReader.py @@ -29,9 +29,9 @@ class GCODEReader(MeshReader): if n < 1: return None m = line.find(' ', n) - m2 = line.find(';', n) - if m < 0: - m = m2 + # m2 = line.find(';', n) + # if m < 0: + # m = m2 try: if m < 0: return int(line[n:]) @@ -44,9 +44,9 @@ class GCODEReader(MeshReader): if n < 1: return None m = line.find(' ', n) - m2 = line.find(';', n) - if m < 0: - m = m2 + # m2 = line.find(';', n) + # if m < 0: + # m = m2 try: if m < 0: return float(line[n:]) @@ -95,6 +95,7 @@ class GCODEReader(MeshReader): current_x = 0 current_y = 0 current_z = 0 + current_e = 0 def CreatePolygon(): count = len(current_path) @@ -126,32 +127,49 @@ class GCODEReader(MeshReader): if line[0] == ";": continue G = self.getInt(line, "G") - if G: + if G is not None: if G == 0 or G == 1: x = self.getFloat(line, "X") y = self.getFloat(line, "Y") z = self.getFloat(line, "Z") e = self.getFloat(line, "E") - if x: + if x is not None: current_x = x - if y: + if y is not None: current_y = y - if z: + if z is not None: current_z = z - if e and e > 0: - current_path.append([current_x, current_z, -current_y]) + if e is not None: + if e >= current_e: + current_path.append([current_x, current_z, -current_y]) + else: + if len(current_path) > 1: + CreatePolygon() + else: + current_path.clear() + current_e = e else: if len(current_path) > 1: CreatePolygon() + else: + current_path.clear() + elif G == 28: + x = self.getFloat(line, "X") + y = self.getFloat(line, "Y") + if x is not None: + current_x += x + if y is not None: + current_y += y + current_z = 0 elif G == 92: x = self.getFloat(line, "X") y = self.getFloat(line, "Y") z = self.getFloat(line, "Z") - if x: + if x is not None: current_x += x - if y: + if y is not None: current_y += y - if z: + if z is not None: current_z += z if len(current_path) > 1: From 0a75c3d19b582b391b059936215d2fbb7d757038 Mon Sep 17 00:00:00 2001 From: Victor Larchenko Date: Wed, 12 Oct 2016 16:17:14 +0600 Subject: [PATCH 06/75] T466: Fixed infill parsing bug and moved model to center --- plugins/GCODEReader/GCODEReader.py | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/plugins/GCODEReader/GCODEReader.py b/plugins/GCODEReader/GCODEReader.py index 0254eb5a98..b63268ce7f 100644 --- a/plugins/GCODEReader/GCODEReader.py +++ b/plugins/GCODEReader/GCODEReader.py @@ -140,7 +140,7 @@ class GCODEReader(MeshReader): if z is not None: current_z = z if e is not None: - if e >= current_e: + if e > current_e: current_path.append([current_x, current_z, -current_y]) else: if len(current_path) > 1: @@ -151,15 +151,15 @@ class GCODEReader(MeshReader): else: if len(current_path) > 1: CreatePolygon() - else: + elif G == 1: current_path.clear() elif G == 28: x = self.getFloat(line, "X") y = self.getFloat(line, "Y") if x is not None: - current_x += x + current_x = x if y is not None: - current_y += y + current_y = y current_z = 0 elif G == 92: x = self.getFloat(line, "X") @@ -189,13 +189,18 @@ class GCODEReader(MeshReader): mesh_builder.addCube(10, 10, 10, Vector(0, -5, 0)) scene_node.setMeshData(mesh_builder.build()) - scene_node.setPosition(Vector(0,0,0)) + + settings = Application.getInstance().getGlobalContainerStack() + machine_width = settings.getProperty("machine_width", "value") + machine_depth = settings.getProperty("machine_depth", "value") + + scene_node.setPosition(Vector(-machine_width/2, 0, machine_depth/2)) view = Application.getInstance().getController().getActiveView() if view.getPluginId() == "LayerView": view.resetLayerData() - #scene_node.setEnabled(False) + scene_node.setEnabled(False) #scene_node.setSelectable(False) return scene_node From 333e5012685f82372580e7bd65e0cda2d3e2c92b Mon Sep 17 00:00:00 2001 From: Victor Larchenko Date: Thu, 13 Oct 2016 16:55:24 +0600 Subject: [PATCH 07/75] T466: Removed cube, Changed label, Added clearing of scene --- cura/CuraApplication.py | 4 +- .../ProcessSlicedLayersJob.py | 2 +- plugins/GCODEReader/GCODEReader.py | 38 ++++++++++++++----- plugins/LayerView/LayerPass.py | 2 +- plugins/LayerView/LayerView.py | 2 +- 5 files changed, 34 insertions(+), 14 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 2ab7837352..ee5fdfea2a 100644 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -581,7 +581,7 @@ class CuraApplication(QtApplication): count = 0 scene_bounding_box = None for node in DepthFirstIterator(self.getController().getScene().getRoot()): - if type(node) is not SceneNode or not node.getMeshData(): + if type(node) is not SceneNode or (not node.getMeshData() and not hasattr(node, "gcode")): continue count += 1 @@ -712,7 +712,7 @@ class CuraApplication(QtApplication): for node in DepthFirstIterator(self.getController().getScene().getRoot()): if type(node) is not SceneNode: continue - if not node.getMeshData() and not node.callDecoration("isGroup"): + if (not node.getMeshData() and not hasattr(node, "gcode")) and not node.callDecoration("isGroup"): continue # Node that doesnt have a mesh and is not a group. if node.getParent() and node.getParent().callDecoration("isGroup"): continue # Grouped nodes don't need resetting as their parent (the group) is resetted) diff --git a/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py b/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py index c4e9554b2c..206a3e83e8 100644 --- a/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py +++ b/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py @@ -60,7 +60,7 @@ class ProcessSlicedLayersJob(Job): for node in DepthFirstIterator(self._scene.getRoot()): if node.callDecoration("getLayerData"): node.getParent().removeChild(node) - break + # break if self._abort_requested: if self._progress: self._progress.hide() diff --git a/plugins/GCODEReader/GCODEReader.py b/plugins/GCODEReader/GCODEReader.py index b63268ce7f..abaefdadbd 100644 --- a/plugins/GCODEReader/GCODEReader.py +++ b/plugins/GCODEReader/GCODEReader.py @@ -4,11 +4,15 @@ from UM.Mesh.MeshReader import MeshReader from UM.Mesh.MeshBuilder import MeshBuilder +from UM.Mesh.MeshData import MeshData import os from UM.Scene.SceneNode import SceneNode +from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator from UM.Math.Vector import Vector +from UM.Math.Color import Color from UM.Math.AxisAlignedBox import AxisAlignedBox from UM.Application import Application +from UM.Preferences import Preferences from cura import LayerDataBuilder from cura import LayerDataDecorator @@ -59,6 +63,14 @@ class GCODEReader(MeshReader): extension = os.path.splitext(file_name)[1] if extension.lower() in self._supported_extensions: + scene = Application.getInstance().getController().getScene() + if getattr(scene, "gcode_list"): + setattr(scene, "gcode_list", None) + for node in DepthFirstIterator(scene.getRoot()): + if node.callDecoration("getLayerData"): + node.getParent().removeChild(node) + Application.getInstance().deleteAll() + scene_node = SceneNode() # mesh_builder = MeshBuilder() @@ -73,11 +85,14 @@ class GCODEReader(MeshReader): # # scene_node.setMeshData(mesh_builder.build()) - # scene_node.getBoundingBox = getBoundingBox + def getBoundingBox(): + return AxisAlignedBox(minimum=Vector(0, 0, 0), maximum=Vector(10, 10, 10)) + + scene_node.getBoundingBox = getBoundingBox scene_node.gcode = True - backend = Application.getInstance().getBackend() - backend._pauseSlicing = True - backend.backendStateChange.emit(0) + # backend = Application.getInstance().getBackend() + # backend._pauseSlicing = True + # backend.backendStateChange.emit(0) file = open(file_name, "r") @@ -183,12 +198,17 @@ class GCODEReader(MeshReader): scene_node_parent = Application.getInstance().getBuildVolume() scene_node.setParent(scene_node_parent) - mesh_builder = MeshBuilder() - mesh_builder.setFileName(file_name) + # mesh_builder = MeshBuilder() + # mesh_builder.setFileName(file_name) + # + # mesh_builder.addCube(10, 10, 10, Vector(0, -5, 0)) - mesh_builder.addCube(10, 10, 10, Vector(0, -5, 0)) + # scene_node.setMeshData(mesh_builder.build()) + # scene_node.setMeshData(MeshData(file_name=file_name)) - scene_node.setMeshData(mesh_builder.build()) + # Application.getInstance().getPrintInformation().JobName(file_name) + + Preferences.getInstance().setValue("cura/jobname_prefix", False) settings = Application.getInstance().getGlobalContainerStack() machine_width = settings.getProperty("machine_width", "value") @@ -200,7 +220,7 @@ class GCODEReader(MeshReader): if view.getPluginId() == "LayerView": view.resetLayerData() - scene_node.setEnabled(False) + # scene_node.setEnabled(False) #scene_node.setSelectable(False) return scene_node diff --git a/plugins/LayerView/LayerPass.py b/plugins/LayerView/LayerPass.py index 287f3c3539..9e610b68d2 100644 --- a/plugins/LayerView/LayerPass.py +++ b/plugins/LayerView/LayerPass.py @@ -49,7 +49,7 @@ class LayerPass(RenderPass): if isinstance(node, ToolHandle): tool_handle_batch.addItem(node.getWorldTransformation(), mesh = node.getSolidMesh()) - elif isinstance(node, SceneNode) and (node.getMeshData()) and node.isVisible(): + elif isinstance(node, SceneNode) and (node.getMeshData() or hasattr(node, "gcode")) and node.isVisible(): layer_data = node.callDecoration("getLayerData") if not layer_data: continue diff --git a/plugins/LayerView/LayerView.py b/plugins/LayerView/LayerView.py index 50c13194f7..0bae9c891c 100644 --- a/plugins/LayerView/LayerView.py +++ b/plugins/LayerView/LayerView.py @@ -119,7 +119,7 @@ class LayerView(View): continue if not node.render(renderer): - if node.getMeshData() and node.isVisible(): + if (node.getMeshData()) and node.isVisible(): renderer.queueNode(node, transparent = True, shader = self._ghost_shader) def setLayer(self, value): From 41a698959bd1c6a9e0a2d9bd6889e2f4b3744f40 Mon Sep 17 00:00:00 2001 From: Victor Larchenko Date: Thu, 13 Oct 2016 17:11:32 +0600 Subject: [PATCH 08/75] T466: Hiding backend label --- plugins/GCODEReader/GCODEReader.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/plugins/GCODEReader/GCODEReader.py b/plugins/GCODEReader/GCODEReader.py index abaefdadbd..cbf630f8d5 100644 --- a/plugins/GCODEReader/GCODEReader.py +++ b/plugins/GCODEReader/GCODEReader.py @@ -90,9 +90,10 @@ class GCODEReader(MeshReader): scene_node.getBoundingBox = getBoundingBox scene_node.gcode = True - # backend = Application.getInstance().getBackend() + backend = Application.getInstance().getBackend() # backend._pauseSlicing = True - # backend.backendStateChange.emit(0) + # backend.close() + backend.backendStateChange.emit(0) file = open(file_name, "r") From 2b3f46f49eeadd41b07b2b1a82754ac41098c022 Mon Sep 17 00:00:00 2001 From: Victor Larchenko Date: Thu, 13 Oct 2016 17:30:20 +0600 Subject: [PATCH 09/75] T466: Added correct models switching --- plugins/GCODEReader/GCODEReader.py | 43 +++++++++++++++++++++--------- 1 file changed, 30 insertions(+), 13 deletions(-) diff --git a/plugins/GCODEReader/GCODEReader.py b/plugins/GCODEReader/GCODEReader.py index cbf630f8d5..ca4a9c475c 100644 --- a/plugins/GCODEReader/GCODEReader.py +++ b/plugins/GCODEReader/GCODEReader.py @@ -58,17 +58,34 @@ class GCODEReader(MeshReader): except: return None + def onSceneChanged(self, obj): + scene = Application.getInstance().getController().getScene() + + def findAny(): + for node in DepthFirstIterator(scene.getRoot()): + if hasattr(node, "gcode"): + return True + return False + + if not findAny(): + # Preferences.getInstance().setValue("cura/jobname_prefix", True) + backend = Application.getInstance().getBackend() + backend._pauseSlicing = False + else: + backend = Application.getInstance().getBackend() + backend._pauseSlicing = True + backend.backendStateChange.emit(1) + def read(self, file_name): scene_node = None extension = os.path.splitext(file_name)[1] if extension.lower() in self._supported_extensions: scene = Application.getInstance().getController().getScene() - if getattr(scene, "gcode_list"): - setattr(scene, "gcode_list", None) - for node in DepthFirstIterator(scene.getRoot()): - if node.callDecoration("getLayerData"): - node.getParent().removeChild(node) + scene.sceneChanged.connect(self.onSceneChanged) + # for node in DepthFirstIterator(scene.getRoot()): + # if node.callDecoration("getLayerData"): + # node.getParent().removeChild(node) Application.getInstance().deleteAll() scene_node = SceneNode() @@ -91,9 +108,9 @@ class GCODEReader(MeshReader): scene_node.getBoundingBox = getBoundingBox scene_node.gcode = True backend = Application.getInstance().getBackend() - # backend._pauseSlicing = True + backend._pauseSlicing = True # backend.close() - backend.backendStateChange.emit(0) + backend.backendStateChange.emit(1) file = open(file_name, "r") @@ -199,6 +216,12 @@ class GCODEReader(MeshReader): scene_node_parent = Application.getInstance().getBuildVolume() scene_node.setParent(scene_node_parent) + settings = Application.getInstance().getGlobalContainerStack() + machine_width = settings.getProperty("machine_width", "value") + machine_depth = settings.getProperty("machine_depth", "value") + + scene_node.setPosition(Vector(-machine_width / 2, 0, machine_depth / 2)) + # mesh_builder = MeshBuilder() # mesh_builder.setFileName(file_name) # @@ -211,12 +234,6 @@ class GCODEReader(MeshReader): Preferences.getInstance().setValue("cura/jobname_prefix", False) - settings = Application.getInstance().getGlobalContainerStack() - machine_width = settings.getProperty("machine_width", "value") - machine_depth = settings.getProperty("machine_depth", "value") - - scene_node.setPosition(Vector(-machine_width/2, 0, machine_depth/2)) - view = Application.getInstance().getController().getActiveView() if view.getPluginId() == "LayerView": view.resetLayerData() From 3ee83f26c32b859a8e429f5bd80062b1061287b0 Mon Sep 17 00:00:00 2001 From: Victor Larchenko Date: Thu, 13 Oct 2016 17:32:43 +0600 Subject: [PATCH 10/75] T466: Added correct models switching --- plugins/GCODEReader/GCODEReader.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/GCODEReader/GCODEReader.py b/plugins/GCODEReader/GCODEReader.py index ca4a9c475c..8bbe7ad89e 100644 --- a/plugins/GCODEReader/GCODEReader.py +++ b/plugins/GCODEReader/GCODEReader.py @@ -109,7 +109,7 @@ class GCODEReader(MeshReader): scene_node.gcode = True backend = Application.getInstance().getBackend() backend._pauseSlicing = True - # backend.close() + backend.close() backend.backendStateChange.emit(1) file = open(file_name, "r") From d7b4296cfc9deb40a7a3a3d18a367928d4402fbd Mon Sep 17 00:00:00 2001 From: Victor Larchenko Date: Fri, 14 Oct 2016 16:17:46 +0600 Subject: [PATCH 11/75] T466: Added correct prefix --- plugins/GCODEReader/GCODEReader.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/GCODEReader/GCODEReader.py b/plugins/GCODEReader/GCODEReader.py index 8bbe7ad89e..5769959983 100644 --- a/plugins/GCODEReader/GCODEReader.py +++ b/plugins/GCODEReader/GCODEReader.py @@ -230,9 +230,9 @@ class GCODEReader(MeshReader): # scene_node.setMeshData(mesh_builder.build()) # scene_node.setMeshData(MeshData(file_name=file_name)) - # Application.getInstance().getPrintInformation().JobName(file_name) + Application.getInstance().getPrintInformation()._abbr_machine = "Pre-sliced" - Preferences.getInstance().setValue("cura/jobname_prefix", False) + Preferences.getInstance().setValue("cura/jobname_prefix", True) view = Application.getInstance().getController().getActiveView() if view.getPluginId() == "LayerView": From 2ee5e2cb0b306a912f78d8037a48c5392d1d9f5f Mon Sep 17 00:00:00 2001 From: Victor Larchenko Date: Fri, 14 Oct 2016 17:06:53 +0600 Subject: [PATCH 12/75] T466: Added hiding of properties menu --- cura/CuraApplication.py | 15 +++++++++++++++ plugins/GCODEReader/GCODEReader.py | 9 ++++++++- resources/qml/Sidebar.qml | 7 ++++--- 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index ee5fdfea2a..c5db2b01e7 100644 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -1007,3 +1007,18 @@ class CuraApplication(QtApplication): @pyqtSlot(str) def log(self, msg): Logger.log("d", msg) + + _hide_settings = False + + HideSettingsChanged = pyqtSignal(bool) + + @pyqtSlot(bool) + def setHideSettings(self, hide): + self._hide_settings = hide + self.HideSettingsChanged.emit(hide) + + @pyqtProperty(bool, notify=HideSettingsChanged) + def hideSettings(self): + return self._hide_settings + + diff --git a/plugins/GCODEReader/GCODEReader.py b/plugins/GCODEReader/GCODEReader.py index 5769959983..8305061a59 100644 --- a/plugins/GCODEReader/GCODEReader.py +++ b/plugins/GCODEReader/GCODEReader.py @@ -71,10 +71,14 @@ class GCODEReader(MeshReader): # Preferences.getInstance().setValue("cura/jobname_prefix", True) backend = Application.getInstance().getBackend() backend._pauseSlicing = False + Application.getInstance().setHideSettings(False) + #Application.getInstance().getPrintInformation()._setAbbreviatedMachineName() else: backend = Application.getInstance().getBackend() backend._pauseSlicing = True backend.backendStateChange.emit(1) + Application.getInstance().getPrintInformation()._abbr_machine = "Pre-sliced" + Application.getInstance().setHideSettings(True) def read(self, file_name): scene_node = None @@ -213,6 +217,8 @@ class GCODEReader(MeshReader): decorator.setLayerData(layer_mesh) scene_node.addDecorator(decorator) + Application.getInstance().getPrintInformation()._abbr_machine = "Pre-sliced" + scene_node_parent = Application.getInstance().getBuildVolume() scene_node.setParent(scene_node_parent) @@ -230,10 +236,11 @@ class GCODEReader(MeshReader): # scene_node.setMeshData(mesh_builder.build()) # scene_node.setMeshData(MeshData(file_name=file_name)) - Application.getInstance().getPrintInformation()._abbr_machine = "Pre-sliced" + Preferences.getInstance().setValue("cura/jobname_prefix", True) + view = Application.getInstance().getController().getActiveView() if view.getPluginId() == "LayerView": view.resetLayerData() diff --git a/resources/qml/Sidebar.qml b/resources/qml/Sidebar.qml index d97b69e801..234e139791 100644 --- a/resources/qml/Sidebar.qml +++ b/resources/qml/Sidebar.qml @@ -16,6 +16,7 @@ Rectangle property int currentModeIndex; property bool monitoringPrint: false + property bool hideSettings: Printer.hideSettings Connections { target: Printer @@ -296,7 +297,7 @@ Rectangle width: parent.width * 0.45 - 2 * UM.Theme.getSize("default_margin").width font: UM.Theme.getFont("large") color: UM.Theme.getColor("text") - visible: !monitoringPrint + visible: !monitoringPrint && !hideSettings elide: Text.ElideRight } @@ -308,7 +309,7 @@ Rectangle anchors.rightMargin: UM.Theme.getSize("default_margin").width anchors.top: headerSeparator.bottom anchors.topMargin: UM.Theme.getSize("default_margin").height - visible: !monitoringPrint + visible: !monitoringPrint && !hideSettings Component{ id: wizardDelegate Button { @@ -432,7 +433,7 @@ Rectangle anchors.topMargin: UM.Theme.getSize("default_margin").height anchors.left: base.left anchors.right: base.right - visible: !monitoringPrint + visible: !monitoringPrint && !hideSettings delegate: StackViewDelegate { From 64d7bb0c2a6250633212040720ba6cf00d5170a7 Mon Sep 17 00:00:00 2001 From: Victor Larchenko Date: Fri, 14 Oct 2016 18:08:33 +0600 Subject: [PATCH 13/75] T466: Added ability to print loaded gcode --- .gitignore | 0 CHANGES | 0 CMakeLists.txt | 0 CPackConfig.cmake | 0 LICENSE | 0 README.md | 0 build.sh | 0 cura.desktop.in | 0 cura.sharedmimeinfo | 0 cura/BuildVolume.py | 0 cura/CameraAnimation.py | 0 cura/CameraImageProvider.py | 0 cura/ConvexHullDecorator.py | 0 cura/ConvexHullNode.py | 0 cura/CrashHandler.py | 0 cura/CuraActions.py | 0 cura/CuraApplication.py | 0 cura/CuraSplashScreen.py | 0 cura/CuraVersion.py.in | 0 cura/Layer.py | 0 cura/LayerData.py | 0 cura/LayerDataBuilder.py | 0 cura/LayerDataDecorator.py | 0 cura/LayerPolygon.py | 0 cura/MachineAction.py | 0 cura/MachineActionManager.py | 0 cura/OneAtATimeIterator.py | 0 cura/PlatformPhysics.py | 0 cura/PlatformPhysicsOperation.py | 0 cura/PrintInformation.py | 0 cura/PrinterOutputDevice.py | 0 cura/ProfileReader.py | 0 cura/ProfileWriter.py | 0 cura/SetParentOperation.py | 0 cura/Settings/ContainerManager.py | 0 cura/Settings/ContainerSettingsModel.py | 0 cura/Settings/CuraContainerRegistry.py | 0 cura/Settings/ExtruderManager.py | 0 cura/Settings/ExtrudersModel.py | 0 cura/Settings/MachineManager.py | 0 cura/Settings/MaterialSettingsVisibilityHandler.py | 0 cura/Settings/QualitySettingsModel.py | 0 cura/Settings/SettingInheritanceManager.py | 0 cura/Settings/SettingOverrideDecorator.py | 0 cura/Settings/__init__.py | 0 cura/ZOffsetDecorator.py | 0 cura/__init__.py | 0 icons/cura-128.png | Bin icons/cura-32.png | Bin icons/cura-48.png | Bin icons/cura-64.png | Bin icons/cura.icns | Bin icons/cura.ico | Bin installer.nsi | 0 plugins/3MFReader/ThreeMFReader.py | 0 plugins/3MFReader/__init__.py | 0 plugins/AutoSave/AutoSave.py | 0 plugins/AutoSave/__init__.py | 0 plugins/ChangeLogPlugin/ChangeLog.py | 0 plugins/ChangeLogPlugin/ChangeLog.qml | 0 plugins/ChangeLogPlugin/ChangeLog.txt | 0 plugins/ChangeLogPlugin/__init__.py | 0 plugins/CuraEngineBackend/Cura.proto | 0 plugins/CuraEngineBackend/CuraEngineBackend.py | 0 plugins/CuraEngineBackend/ProcessGCodeJob.py | 0 plugins/CuraEngineBackend/ProcessSlicedLayersJob.py | 0 plugins/CuraEngineBackend/StartSliceJob.py | 0 plugins/CuraEngineBackend/__init__.py | 0 plugins/CuraProfileReader/CuraProfileReader.py | 0 plugins/CuraProfileReader/__init__.py | 0 plugins/CuraProfileWriter/CuraProfileWriter.py | 0 plugins/CuraProfileWriter/__init__.py | 0 plugins/GCODEReader/GCODEReader.py | 8 +++++++- plugins/GCODEReader/__init__.py | 0 plugins/GCodeProfileReader/GCodeProfileReader.py | 0 plugins/GCodeProfileReader/__init__.py | 0 plugins/GCodeWriter/GCodeWriter.py | 0 plugins/GCodeWriter/__init__.py | 0 plugins/ImageReader/ConfigUI.qml | 0 plugins/ImageReader/ImageReader.py | 0 plugins/ImageReader/ImageReaderUI.py | 0 plugins/ImageReader/__init__.py | 0 plugins/LayerView/LayerPass.py | 0 plugins/LayerView/LayerView.py | 0 plugins/LayerView/LayerView.qml | 0 plugins/LayerView/LayerViewProxy.py | 0 plugins/LayerView/__init__.py | 0 plugins/LayerView/layerview_composite.shader | 0 plugins/LegacyProfileReader/DictionaryOfDoom.json | 0 plugins/LegacyProfileReader/LegacyProfileReader.py | 0 plugins/LegacyProfileReader/__init__.py | 0 .../MachineSettingsAction/MachineSettingsAction.py | 0 .../MachineSettingsAction/MachineSettingsAction.qml | 0 plugins/MachineSettingsAction/__init__.py | 0 plugins/PerObjectSettingsTool/PerObjectCategory.qml | 0 plugins/PerObjectSettingsTool/PerObjectItem.qml | 0 .../PerObjectSettingVisibilityHandler.py | 0 .../PerObjectSettingsPanel.qml | 0 .../PerObjectSettingsTool/PerObjectSettingsTool.py | 0 plugins/PerObjectSettingsTool/__init__.py | 0 .../LinuxRemovableDrivePlugin.py | 0 .../OSXRemovableDrivePlugin.py | 0 .../RemovableDriveOutputDevice.py | 0 .../RemovableDrivePlugin.py | 0 .../WindowsRemovableDrivePlugin.py | 0 plugins/RemovableDriveOutputDevice/__init__.py | 0 plugins/SolidView/SolidView.py | 0 plugins/SolidView/__init__.py | 0 plugins/USBPrinting/FirmwareUpdateWindow.qml | 0 plugins/USBPrinting/USBPrinterOutputDevice.py | 0 .../USBPrinting/USBPrinterOutputDeviceManager.py | 0 plugins/USBPrinting/__init__.py | 0 plugins/USBPrinting/avr_isp/__init__.py | 0 plugins/USBPrinting/avr_isp/chipDB.py | 0 plugins/USBPrinting/avr_isp/intelHex.py | 0 plugins/USBPrinting/avr_isp/ispBase.py | 0 plugins/USBPrinting/avr_isp/stk500v2.py | 0 .../BedLevelMachineAction.py | 0 .../BedLevelMachineAction.qml | 0 .../UMOCheckupMachineAction.py | 0 .../UMOCheckupMachineAction.qml | 0 .../UltimakerMachineActions/UMOUpgradeSelection.py | 0 .../UMOUpgradeSelectionMachineAction.qml | 0 .../UpgradeFirmwareMachineAction.py | 0 .../UpgradeFirmwareMachineAction.qml | 0 plugins/UltimakerMachineActions/__init__.py | 0 .../VersionUpgrade21to22/MachineInstance.py | 0 .../VersionUpgrade21to22/Preferences.py | 0 .../VersionUpgrade/VersionUpgrade21to22/Profile.py | 0 .../VersionUpgrade21to22/VersionUpgrade21to22.py | 0 .../VersionUpgrade/VersionUpgrade21to22/__init__.py | 0 plugins/X3DReader/X3DReader.py | 0 plugins/X3DReader/__init__.py | 0 plugins/XRayView/XRayPass.py | 0 plugins/XRayView/XRayView.py | 0 plugins/XRayView/__init__.py | 0 plugins/XRayView/xray.shader | 0 plugins/XRayView/xray_composite.shader | 0 plugins/XmlMaterialProfile/XmlMaterialProfile.py | 0 plugins/XmlMaterialProfile/__init__.py | 0 pytest.ini | 0 resources/definitions/bq_hephestos.def.json | 0 resources/definitions/bq_hephestos_2.def.json | 0 resources/definitions/bq_hephestos_xl.def.json | 0 resources/definitions/bq_witbox.def.json | 0 resources/definitions/bq_witbox_2.def.json | 0 resources/definitions/custom.def.json | 0 resources/definitions/fdmextruder.def.json | 0 resources/definitions/fdmprinter.def.json | 0 resources/definitions/grr_neo.def.json | 0 resources/definitions/innovo_inventor.def.json | 0 resources/definitions/kossel_mini.def.json | 0 resources/definitions/m180.def.json | 0 resources/definitions/maker_starter.def.json | 0 .../definitions/mankati_fullscale_xt_plus.def.json | 0 resources/definitions/mendel90.def.json | 0 resources/definitions/printrbot_simple.def.json | 0 resources/definitions/prusa_i3.def.json | 0 resources/definitions/prusa_i3_mk2.def.json | 0 resources/definitions/prusa_i3_xl.def.json | 0 resources/definitions/rigidbot.def.json | 0 resources/definitions/rigidbot_big.def.json | 0 resources/definitions/ultimaker.def.json | 0 resources/definitions/ultimaker2.def.json | 0 resources/definitions/ultimaker2_extended.def.json | 0 .../definitions/ultimaker2_extended_plus.def.json | 0 resources/definitions/ultimaker2_go.def.json | 0 resources/definitions/ultimaker2_plus.def.json | 0 resources/definitions/ultimaker_original.def.json | 0 .../definitions/ultimaker_original_dual.def.json | 0 .../definitions/ultimaker_original_plus.def.json | 0 resources/definitions/uniqbot_one.def.json | 0 .../extruders/ultimaker_original_dual_1st.def.json | 0 .../extruders/ultimaker_original_dual_2nd.def.json | 0 resources/i18n/cura.pot | 0 resources/i18n/de/cura.po | 0 resources/i18n/en/cura.po | 0 resources/i18n/es/cura.po | 0 resources/i18n/fdmextruder.def.json.pot | 0 resources/i18n/fdmprinter.def.json.pot | 0 resources/i18n/fi/cura.po | 0 resources/i18n/fr/cura.po | 0 resources/i18n/it/cura.po | 0 resources/i18n/nl/cura.po | 0 resources/images/MakerStarterbackplate.png | Bin .../images/Ultimaker2ExtendedPlusbackplate.png | Bin resources/images/Ultimaker2Extendedbackplate.png | Bin resources/images/Ultimaker2Gobackplate.png | Bin resources/images/Ultimaker2Plusbackplate.png | Bin resources/images/Ultimaker2backplate.png | Bin resources/images/UltimakerPlusbackplate.png | Bin resources/images/cura-icon.png | Bin resources/images/cura.png | Bin resources/meshes/UltimakerRobot_support.stl | Bin resources/meshes/bq_hephestos_2_platform.stl | Bin resources/meshes/bq_hephestos_platform.stl | Bin resources/meshes/bq_witbox_platform.stl | Bin resources/meshes/grr_neo_platform.stl | Bin resources/meshes/inventor_platform.stl | Bin resources/meshes/kossel_platform.stl | 0 resources/meshes/makerstarter_platform.stl | Bin .../meshes/mankati_fullscale_xt_plus_platform.stl | Bin resources/meshes/mendel90_platform.stl | 0 .../meshes/printrbot_simple_metal_platform.stl | Bin resources/meshes/prusai3_platform.stl | 0 resources/meshes/prusai3_xl_platform.stl | 0 resources/meshes/rigidbot_platform.stl | Bin resources/meshes/rigidbotbig_platform.stl | Bin resources/meshes/ultimaker2_platform.obj | 0 resources/meshes/ultimaker2go_platform.obj | 0 resources/meshes/ultimaker_platform.stl | Bin resources/qml/AboutDialog.qml | 0 resources/qml/Actions.qml | 0 resources/qml/AddMachineDialog.qml | 0 resources/qml/Cura.qml | 0 resources/qml/EngineLog.qml | 0 resources/qml/JobSpecs.qml | 0 resources/qml/MachineAction.qml | 0 resources/qml/Menus/MaterialMenu.qml | 0 resources/qml/Menus/NozzleMenu.qml | 0 resources/qml/Menus/PrinterMenu.qml | 0 resources/qml/Menus/ProfileMenu.qml | 0 resources/qml/Menus/RecentFilesMenu.qml | 0 resources/qml/Menus/ViewMenu.qml | 0 resources/qml/MonitorButton.qml | 0 resources/qml/Preferences/GeneralPage.qml | 0 resources/qml/Preferences/MachinesPage.qml | 0 resources/qml/Preferences/MaterialView.qml | 0 resources/qml/Preferences/MaterialsPage.qml | 0 resources/qml/Preferences/ProfileTab.qml | 0 resources/qml/Preferences/ProfilesPage.qml | 0 resources/qml/Preferences/ReadOnlySpinBox.qml | 0 resources/qml/Preferences/ReadOnlyTextArea.qml | 0 resources/qml/Preferences/ReadOnlyTextField.qml | 0 resources/qml/Preferences/SettingVisibilityPage.qml | 0 resources/qml/PrintMonitor.qml | 0 resources/qml/SaveButton.qml | 0 resources/qml/Settings/SettingCategory.qml | 0 resources/qml/Settings/SettingCheckBox.qml | 0 resources/qml/Settings/SettingComboBox.qml | 0 resources/qml/Settings/SettingExtruder.qml | 0 resources/qml/Settings/SettingItem.qml | 0 resources/qml/Settings/SettingTextField.qml | 0 resources/qml/Settings/SettingUnknown.qml | 0 resources/qml/Settings/SettingView.qml | 0 resources/qml/Sidebar.qml | 0 resources/qml/SidebarAdvanced.qml | 0 resources/qml/SidebarContents.qml | 0 resources/qml/SidebarHeader.qml | 0 resources/qml/SidebarSimple.qml | 0 resources/qml/SidebarTooltip.qml | 0 resources/qml/Toolbar.qml | 0 resources/quality/high.inst.cfg | 0 resources/quality/low.inst.cfg | 0 resources/quality/normal.inst.cfg | 0 .../ultimaker2_plus/pla_0.25_normal.inst.cfg | 0 .../quality/ultimaker2_plus/pla_0.4_fast.inst.cfg | 0 .../quality/ultimaker2_plus/pla_0.4_high.inst.cfg | 0 .../quality/ultimaker2_plus/pla_0.4_normal.inst.cfg | 0 .../quality/ultimaker2_plus/pla_0.6_normal.inst.cfg | 0 .../quality/ultimaker2_plus/pla_0.8_normal.inst.cfg | 0 .../ultimaker2_plus/um2p_abs_0.25_normal.inst.cfg | 0 .../ultimaker2_plus/um2p_abs_0.4_fast.inst.cfg | 0 .../ultimaker2_plus/um2p_abs_0.4_high.inst.cfg | 0 .../ultimaker2_plus/um2p_abs_0.4_normal.inst.cfg | 0 .../ultimaker2_plus/um2p_abs_0.6_normal.inst.cfg | 0 .../ultimaker2_plus/um2p_abs_0.8_normal.inst.cfg | 0 .../ultimaker2_plus/um2p_cpe_0.25_normal.inst.cfg | 0 .../ultimaker2_plus/um2p_cpe_0.4_fast.inst.cfg | 0 .../ultimaker2_plus/um2p_cpe_0.4_high.inst.cfg | 0 .../ultimaker2_plus/um2p_cpe_0.4_normal.inst.cfg | 0 .../ultimaker2_plus/um2p_cpe_0.6_normal.inst.cfg | 0 .../ultimaker2_plus/um2p_cpe_0.8_normal.inst.cfg | 0 .../ultimaker2_plus/um2p_cpep_0.4_draft.inst.cfg | 0 .../ultimaker2_plus/um2p_cpep_0.4_normal.inst.cfg | 0 .../ultimaker2_plus/um2p_cpep_0.6_draft.inst.cfg | 0 .../ultimaker2_plus/um2p_cpep_0.6_normal.inst.cfg | 0 .../ultimaker2_plus/um2p_cpep_0.8_draft.inst.cfg | 0 .../ultimaker2_plus/um2p_cpep_0.8_normal.inst.cfg | 0 .../ultimaker2_plus/um2p_nylon_0.25_high.inst.cfg | 0 .../ultimaker2_plus/um2p_nylon_0.25_normal.inst.cfg | 0 .../ultimaker2_plus/um2p_nylon_0.4_fast.inst.cfg | 0 .../ultimaker2_plus/um2p_nylon_0.4_normal.inst.cfg | 0 .../ultimaker2_plus/um2p_nylon_0.6_fast.inst.cfg | 0 .../ultimaker2_plus/um2p_nylon_0.6_normal.inst.cfg | 0 .../ultimaker2_plus/um2p_nylon_0.8_draft.inst.cfg | 0 .../ultimaker2_plus/um2p_nylon_0.8_normal.inst.cfg | 0 .../ultimaker2_plus/um2p_pc_0.25_high.inst.cfg | 0 .../ultimaker2_plus/um2p_pc_0.25_normal.inst.cfg | 0 .../ultimaker2_plus/um2p_pc_0.4_fast.inst.cfg | 0 .../ultimaker2_plus/um2p_pc_0.4_normal.inst.cfg | 0 .../ultimaker2_plus/um2p_pc_0.6_fast.inst.cfg | 0 .../ultimaker2_plus/um2p_pc_0.6_normal.inst.cfg | 0 .../ultimaker2_plus/um2p_pc_0.8_draft.inst.cfg | 0 .../ultimaker2_plus/um2p_pc_0.8_normal.inst.cfg | 0 .../ultimaker2_plus/um2p_tpu_0.25_high.inst.cfg | 0 .../ultimaker2_plus/um2p_tpu_0.4_normal.inst.cfg | 0 .../ultimaker2_plus/um2p_tpu_0.6_fast.inst.cfg | 0 resources/shaders/grid.shader | 0 resources/shaders/overhang.shader | 0 resources/shaders/striped.shader | 0 resources/shaders/transparent_object.shader | 0 resources/themes/cura/fonts/LICENSE.txt | 0 resources/themes/cura/fonts/OpenSans-Bold.ttf | Bin resources/themes/cura/fonts/OpenSans-BoldItalic.ttf | Bin resources/themes/cura/fonts/OpenSans-Italic.ttf | Bin resources/themes/cura/fonts/OpenSans-Light.ttf | Bin .../themes/cura/fonts/OpenSans-LightItalic.ttf | Bin resources/themes/cura/fonts/OpenSans-Regular.ttf | Bin resources/themes/cura/fonts/OpenSans-Semibold.ttf | Bin .../themes/cura/fonts/OpenSans-SemiboldItalic.ttf | Bin resources/themes/cura/icons/application.svg | 0 resources/themes/cura/icons/arrow_bottom.svg | 0 resources/themes/cura/icons/arrow_left.svg | 0 resources/themes/cura/icons/arrow_right.svg | 0 resources/themes/cura/icons/arrow_top.svg | 0 resources/themes/cura/icons/basic.svg | 0 resources/themes/cura/icons/category_adhesion.svg | 0 resources/themes/cura/icons/category_blackmagic.svg | 0 resources/themes/cura/icons/category_cool.svg | 0 resources/themes/cura/icons/category_dual.svg | 0 .../themes/cura/icons/category_experimental.svg | 0 resources/themes/cura/icons/category_fixes.svg | 0 resources/themes/cura/icons/category_infill.svg | 0 .../themes/cura/icons/category_layer_height.svg | 0 resources/themes/cura/icons/category_machine.svg | 0 resources/themes/cura/icons/category_material.svg | 0 resources/themes/cura/icons/category_shell.svg | 0 resources/themes/cura/icons/category_shield.svg | 0 resources/themes/cura/icons/category_speed.svg | 0 resources/themes/cura/icons/category_support.svg | 0 resources/themes/cura/icons/category_travel.svg | 0 resources/themes/cura/icons/category_unknown.svg | 0 resources/themes/cura/icons/check.svg | 0 resources/themes/cura/icons/cross1.svg | 0 resources/themes/cura/icons/cross2.svg | 0 resources/themes/cura/icons/dense.svg | 0 resources/themes/cura/icons/dot.svg | 0 resources/themes/cura/icons/hollow.svg | 0 resources/themes/cura/icons/link.svg | 0 resources/themes/cura/icons/load.svg | 0 resources/themes/cura/icons/minus.svg | 0 resources/themes/cura/icons/mirror.svg | 0 resources/themes/cura/icons/notice.svg | 0 resources/themes/cura/icons/pencil.svg | 0 resources/themes/cura/icons/plugin.svg | 0 resources/themes/cura/icons/plus.svg | 0 resources/themes/cura/icons/print_time.svg | 0 resources/themes/cura/icons/printsetup.svg | 0 resources/themes/cura/icons/quick.svg | 0 resources/themes/cura/icons/reset.svg | 0 resources/themes/cura/icons/rotate.svg | 0 resources/themes/cura/icons/rotate_layflat.svg | 0 resources/themes/cura/icons/rotate_reset.svg | 0 resources/themes/cura/icons/scale.svg | 0 resources/themes/cura/icons/scale_max.svg | 0 resources/themes/cura/icons/scale_reset.svg | 0 resources/themes/cura/icons/setting_per_object.svg | 0 resources/themes/cura/icons/settings.svg | 0 resources/themes/cura/icons/solid.svg | 0 resources/themes/cura/icons/sparse.svg | 0 resources/themes/cura/icons/star.svg | 0 resources/themes/cura/icons/tab_monitor.svg | 0 resources/themes/cura/icons/tab_monitor_busy.svg | 0 .../themes/cura/icons/tab_monitor_connected.svg | 0 resources/themes/cura/icons/tab_monitor_offline.svg | 0 resources/themes/cura/icons/tab_monitor_paused.svg | 0 resources/themes/cura/icons/tab_monitor_stopped.svg | 0 resources/themes/cura/icons/tab_monitor_unknown.svg | 0 resources/themes/cura/icons/tab_settings.svg | 0 resources/themes/cura/icons/translate.svg | 0 resources/themes/cura/icons/ulti.svg | 0 resources/themes/cura/icons/view_layer.svg | 0 resources/themes/cura/icons/view_normal.svg | 0 resources/themes/cura/icons/view_xray.svg | 0 resources/themes/cura/icons/viewmode.svg | 0 resources/themes/cura/icons/warning.svg | 0 resources/themes/cura/images/logo.svg | 0 resources/themes/cura/styles.qml | 0 resources/themes/cura/theme.json | 0 .../variants/ultimaker2_extended_plus_0.25.inst.cfg | 0 .../variants/ultimaker2_extended_plus_0.4.inst.cfg | 0 .../variants/ultimaker2_extended_plus_0.6.inst.cfg | 0 .../variants/ultimaker2_extended_plus_0.8.inst.cfg | 0 resources/variants/ultimaker2_plus_0.25.inst.cfg | 0 resources/variants/ultimaker2_plus_0.4.inst.cfg | 0 resources/variants/ultimaker2_plus_0.6.inst.cfg | 0 resources/variants/ultimaker2_plus_0.8.inst.cfg | 0 setup.py | 0 tests/TestMachineAction.py | 0 390 files changed, 7 insertions(+), 1 deletion(-) mode change 100644 => 100755 .gitignore mode change 100644 => 100755 CHANGES mode change 100644 => 100755 CMakeLists.txt mode change 100644 => 100755 CPackConfig.cmake mode change 100644 => 100755 LICENSE mode change 100644 => 100755 README.md mode change 100644 => 100755 build.sh mode change 100644 => 100755 cura.desktop.in mode change 100644 => 100755 cura.sharedmimeinfo mode change 100644 => 100755 cura/BuildVolume.py mode change 100644 => 100755 cura/CameraAnimation.py mode change 100644 => 100755 cura/CameraImageProvider.py mode change 100644 => 100755 cura/ConvexHullDecorator.py mode change 100644 => 100755 cura/ConvexHullNode.py mode change 100644 => 100755 cura/CrashHandler.py mode change 100644 => 100755 cura/CuraActions.py mode change 100644 => 100755 cura/CuraApplication.py mode change 100644 => 100755 cura/CuraSplashScreen.py mode change 100644 => 100755 cura/CuraVersion.py.in mode change 100644 => 100755 cura/Layer.py mode change 100644 => 100755 cura/LayerData.py mode change 100644 => 100755 cura/LayerDataBuilder.py mode change 100644 => 100755 cura/LayerDataDecorator.py mode change 100644 => 100755 cura/LayerPolygon.py mode change 100644 => 100755 cura/MachineAction.py mode change 100644 => 100755 cura/MachineActionManager.py mode change 100644 => 100755 cura/OneAtATimeIterator.py mode change 100644 => 100755 cura/PlatformPhysics.py mode change 100644 => 100755 cura/PlatformPhysicsOperation.py mode change 100644 => 100755 cura/PrintInformation.py mode change 100644 => 100755 cura/PrinterOutputDevice.py mode change 100644 => 100755 cura/ProfileReader.py mode change 100644 => 100755 cura/ProfileWriter.py mode change 100644 => 100755 cura/SetParentOperation.py mode change 100644 => 100755 cura/Settings/ContainerManager.py mode change 100644 => 100755 cura/Settings/ContainerSettingsModel.py mode change 100644 => 100755 cura/Settings/CuraContainerRegistry.py mode change 100644 => 100755 cura/Settings/ExtruderManager.py mode change 100644 => 100755 cura/Settings/ExtrudersModel.py mode change 100644 => 100755 cura/Settings/MachineManager.py mode change 100644 => 100755 cura/Settings/MaterialSettingsVisibilityHandler.py mode change 100644 => 100755 cura/Settings/QualitySettingsModel.py mode change 100644 => 100755 cura/Settings/SettingInheritanceManager.py mode change 100644 => 100755 cura/Settings/SettingOverrideDecorator.py mode change 100644 => 100755 cura/Settings/__init__.py mode change 100644 => 100755 cura/ZOffsetDecorator.py mode change 100644 => 100755 cura/__init__.py mode change 100644 => 100755 icons/cura-128.png mode change 100644 => 100755 icons/cura-32.png mode change 100644 => 100755 icons/cura-48.png mode change 100644 => 100755 icons/cura-64.png mode change 100644 => 100755 icons/cura.icns mode change 100644 => 100755 icons/cura.ico mode change 100644 => 100755 installer.nsi mode change 100644 => 100755 plugins/3MFReader/ThreeMFReader.py mode change 100644 => 100755 plugins/3MFReader/__init__.py mode change 100644 => 100755 plugins/AutoSave/AutoSave.py mode change 100644 => 100755 plugins/AutoSave/__init__.py mode change 100644 => 100755 plugins/ChangeLogPlugin/ChangeLog.py mode change 100644 => 100755 plugins/ChangeLogPlugin/ChangeLog.qml mode change 100644 => 100755 plugins/ChangeLogPlugin/ChangeLog.txt mode change 100644 => 100755 plugins/ChangeLogPlugin/__init__.py mode change 100644 => 100755 plugins/CuraEngineBackend/Cura.proto mode change 100644 => 100755 plugins/CuraEngineBackend/CuraEngineBackend.py mode change 100644 => 100755 plugins/CuraEngineBackend/ProcessGCodeJob.py mode change 100644 => 100755 plugins/CuraEngineBackend/ProcessSlicedLayersJob.py mode change 100644 => 100755 plugins/CuraEngineBackend/StartSliceJob.py mode change 100644 => 100755 plugins/CuraEngineBackend/__init__.py mode change 100644 => 100755 plugins/CuraProfileReader/CuraProfileReader.py mode change 100644 => 100755 plugins/CuraProfileReader/__init__.py mode change 100644 => 100755 plugins/CuraProfileWriter/CuraProfileWriter.py mode change 100644 => 100755 plugins/CuraProfileWriter/__init__.py mode change 100644 => 100755 plugins/GCODEReader/GCODEReader.py mode change 100644 => 100755 plugins/GCODEReader/__init__.py mode change 100644 => 100755 plugins/GCodeProfileReader/GCodeProfileReader.py mode change 100644 => 100755 plugins/GCodeProfileReader/__init__.py mode change 100644 => 100755 plugins/GCodeWriter/GCodeWriter.py mode change 100644 => 100755 plugins/GCodeWriter/__init__.py mode change 100644 => 100755 plugins/ImageReader/ConfigUI.qml mode change 100644 => 100755 plugins/ImageReader/ImageReader.py mode change 100644 => 100755 plugins/ImageReader/ImageReaderUI.py mode change 100644 => 100755 plugins/ImageReader/__init__.py mode change 100644 => 100755 plugins/LayerView/LayerPass.py mode change 100644 => 100755 plugins/LayerView/LayerView.py mode change 100644 => 100755 plugins/LayerView/LayerView.qml mode change 100644 => 100755 plugins/LayerView/LayerViewProxy.py mode change 100644 => 100755 plugins/LayerView/__init__.py mode change 100644 => 100755 plugins/LayerView/layerview_composite.shader mode change 100644 => 100755 plugins/LegacyProfileReader/DictionaryOfDoom.json mode change 100644 => 100755 plugins/LegacyProfileReader/LegacyProfileReader.py mode change 100644 => 100755 plugins/LegacyProfileReader/__init__.py mode change 100644 => 100755 plugins/MachineSettingsAction/MachineSettingsAction.py mode change 100644 => 100755 plugins/MachineSettingsAction/MachineSettingsAction.qml mode change 100644 => 100755 plugins/MachineSettingsAction/__init__.py mode change 100644 => 100755 plugins/PerObjectSettingsTool/PerObjectCategory.qml mode change 100644 => 100755 plugins/PerObjectSettingsTool/PerObjectItem.qml mode change 100644 => 100755 plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py mode change 100644 => 100755 plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml mode change 100644 => 100755 plugins/PerObjectSettingsTool/PerObjectSettingsTool.py mode change 100644 => 100755 plugins/PerObjectSettingsTool/__init__.py mode change 100644 => 100755 plugins/RemovableDriveOutputDevice/LinuxRemovableDrivePlugin.py mode change 100644 => 100755 plugins/RemovableDriveOutputDevice/OSXRemovableDrivePlugin.py mode change 100644 => 100755 plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py mode change 100644 => 100755 plugins/RemovableDriveOutputDevice/RemovableDrivePlugin.py mode change 100644 => 100755 plugins/RemovableDriveOutputDevice/WindowsRemovableDrivePlugin.py mode change 100644 => 100755 plugins/RemovableDriveOutputDevice/__init__.py mode change 100644 => 100755 plugins/SolidView/SolidView.py mode change 100644 => 100755 plugins/SolidView/__init__.py mode change 100644 => 100755 plugins/USBPrinting/FirmwareUpdateWindow.qml mode change 100644 => 100755 plugins/USBPrinting/USBPrinterOutputDevice.py mode change 100644 => 100755 plugins/USBPrinting/USBPrinterOutputDeviceManager.py mode change 100644 => 100755 plugins/USBPrinting/__init__.py mode change 100644 => 100755 plugins/USBPrinting/avr_isp/__init__.py mode change 100644 => 100755 plugins/USBPrinting/avr_isp/chipDB.py mode change 100644 => 100755 plugins/USBPrinting/avr_isp/intelHex.py mode change 100644 => 100755 plugins/USBPrinting/avr_isp/ispBase.py mode change 100644 => 100755 plugins/USBPrinting/avr_isp/stk500v2.py mode change 100644 => 100755 plugins/UltimakerMachineActions/BedLevelMachineAction.py mode change 100644 => 100755 plugins/UltimakerMachineActions/BedLevelMachineAction.qml mode change 100644 => 100755 plugins/UltimakerMachineActions/UMOCheckupMachineAction.py mode change 100644 => 100755 plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml mode change 100644 => 100755 plugins/UltimakerMachineActions/UMOUpgradeSelection.py mode change 100644 => 100755 plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml mode change 100644 => 100755 plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.py mode change 100644 => 100755 plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml mode change 100644 => 100755 plugins/UltimakerMachineActions/__init__.py mode change 100644 => 100755 plugins/VersionUpgrade/VersionUpgrade21to22/MachineInstance.py mode change 100644 => 100755 plugins/VersionUpgrade/VersionUpgrade21to22/Preferences.py mode change 100644 => 100755 plugins/VersionUpgrade/VersionUpgrade21to22/Profile.py mode change 100644 => 100755 plugins/VersionUpgrade/VersionUpgrade21to22/VersionUpgrade21to22.py mode change 100644 => 100755 plugins/VersionUpgrade/VersionUpgrade21to22/__init__.py mode change 100644 => 100755 plugins/X3DReader/X3DReader.py mode change 100644 => 100755 plugins/X3DReader/__init__.py mode change 100644 => 100755 plugins/XRayView/XRayPass.py mode change 100644 => 100755 plugins/XRayView/XRayView.py mode change 100644 => 100755 plugins/XRayView/__init__.py mode change 100644 => 100755 plugins/XRayView/xray.shader mode change 100644 => 100755 plugins/XRayView/xray_composite.shader mode change 100644 => 100755 plugins/XmlMaterialProfile/XmlMaterialProfile.py mode change 100644 => 100755 plugins/XmlMaterialProfile/__init__.py mode change 100644 => 100755 pytest.ini mode change 100644 => 100755 resources/definitions/bq_hephestos.def.json mode change 100644 => 100755 resources/definitions/bq_hephestos_2.def.json mode change 100644 => 100755 resources/definitions/bq_hephestos_xl.def.json mode change 100644 => 100755 resources/definitions/bq_witbox.def.json mode change 100644 => 100755 resources/definitions/bq_witbox_2.def.json mode change 100644 => 100755 resources/definitions/custom.def.json mode change 100644 => 100755 resources/definitions/fdmextruder.def.json mode change 100644 => 100755 resources/definitions/fdmprinter.def.json mode change 100644 => 100755 resources/definitions/grr_neo.def.json mode change 100644 => 100755 resources/definitions/innovo_inventor.def.json mode change 100644 => 100755 resources/definitions/kossel_mini.def.json mode change 100644 => 100755 resources/definitions/m180.def.json mode change 100644 => 100755 resources/definitions/maker_starter.def.json mode change 100644 => 100755 resources/definitions/mankati_fullscale_xt_plus.def.json mode change 100644 => 100755 resources/definitions/mendel90.def.json mode change 100644 => 100755 resources/definitions/printrbot_simple.def.json mode change 100644 => 100755 resources/definitions/prusa_i3.def.json mode change 100644 => 100755 resources/definitions/prusa_i3_mk2.def.json mode change 100644 => 100755 resources/definitions/prusa_i3_xl.def.json mode change 100644 => 100755 resources/definitions/rigidbot.def.json mode change 100644 => 100755 resources/definitions/rigidbot_big.def.json mode change 100644 => 100755 resources/definitions/ultimaker.def.json mode change 100644 => 100755 resources/definitions/ultimaker2.def.json mode change 100644 => 100755 resources/definitions/ultimaker2_extended.def.json mode change 100644 => 100755 resources/definitions/ultimaker2_extended_plus.def.json mode change 100644 => 100755 resources/definitions/ultimaker2_go.def.json mode change 100644 => 100755 resources/definitions/ultimaker2_plus.def.json mode change 100644 => 100755 resources/definitions/ultimaker_original.def.json mode change 100644 => 100755 resources/definitions/ultimaker_original_dual.def.json mode change 100644 => 100755 resources/definitions/ultimaker_original_plus.def.json mode change 100644 => 100755 resources/definitions/uniqbot_one.def.json mode change 100644 => 100755 resources/extruders/ultimaker_original_dual_1st.def.json mode change 100644 => 100755 resources/extruders/ultimaker_original_dual_2nd.def.json mode change 100644 => 100755 resources/i18n/cura.pot mode change 100644 => 100755 resources/i18n/de/cura.po mode change 100644 => 100755 resources/i18n/en/cura.po mode change 100644 => 100755 resources/i18n/es/cura.po mode change 100644 => 100755 resources/i18n/fdmextruder.def.json.pot mode change 100644 => 100755 resources/i18n/fdmprinter.def.json.pot mode change 100644 => 100755 resources/i18n/fi/cura.po mode change 100644 => 100755 resources/i18n/fr/cura.po mode change 100644 => 100755 resources/i18n/it/cura.po mode change 100644 => 100755 resources/i18n/nl/cura.po mode change 100644 => 100755 resources/images/MakerStarterbackplate.png mode change 100644 => 100755 resources/images/Ultimaker2ExtendedPlusbackplate.png mode change 100644 => 100755 resources/images/Ultimaker2Extendedbackplate.png mode change 100644 => 100755 resources/images/Ultimaker2Gobackplate.png mode change 100644 => 100755 resources/images/Ultimaker2Plusbackplate.png mode change 100644 => 100755 resources/images/Ultimaker2backplate.png mode change 100644 => 100755 resources/images/UltimakerPlusbackplate.png mode change 100644 => 100755 resources/images/cura-icon.png mode change 100644 => 100755 resources/images/cura.png mode change 100644 => 100755 resources/meshes/UltimakerRobot_support.stl mode change 100644 => 100755 resources/meshes/bq_hephestos_2_platform.stl mode change 100644 => 100755 resources/meshes/bq_hephestos_platform.stl mode change 100644 => 100755 resources/meshes/bq_witbox_platform.stl mode change 100644 => 100755 resources/meshes/grr_neo_platform.stl mode change 100644 => 100755 resources/meshes/inventor_platform.stl mode change 100644 => 100755 resources/meshes/kossel_platform.stl mode change 100644 => 100755 resources/meshes/makerstarter_platform.stl mode change 100644 => 100755 resources/meshes/mankati_fullscale_xt_plus_platform.stl mode change 100644 => 100755 resources/meshes/mendel90_platform.stl mode change 100644 => 100755 resources/meshes/printrbot_simple_metal_platform.stl mode change 100644 => 100755 resources/meshes/prusai3_platform.stl mode change 100644 => 100755 resources/meshes/prusai3_xl_platform.stl mode change 100644 => 100755 resources/meshes/rigidbot_platform.stl mode change 100644 => 100755 resources/meshes/rigidbotbig_platform.stl mode change 100644 => 100755 resources/meshes/ultimaker2_platform.obj mode change 100644 => 100755 resources/meshes/ultimaker2go_platform.obj mode change 100644 => 100755 resources/meshes/ultimaker_platform.stl mode change 100644 => 100755 resources/qml/AboutDialog.qml mode change 100644 => 100755 resources/qml/Actions.qml mode change 100644 => 100755 resources/qml/AddMachineDialog.qml mode change 100644 => 100755 resources/qml/Cura.qml mode change 100644 => 100755 resources/qml/EngineLog.qml mode change 100644 => 100755 resources/qml/JobSpecs.qml mode change 100644 => 100755 resources/qml/MachineAction.qml mode change 100644 => 100755 resources/qml/Menus/MaterialMenu.qml mode change 100644 => 100755 resources/qml/Menus/NozzleMenu.qml mode change 100644 => 100755 resources/qml/Menus/PrinterMenu.qml mode change 100644 => 100755 resources/qml/Menus/ProfileMenu.qml mode change 100644 => 100755 resources/qml/Menus/RecentFilesMenu.qml mode change 100644 => 100755 resources/qml/Menus/ViewMenu.qml mode change 100644 => 100755 resources/qml/MonitorButton.qml mode change 100644 => 100755 resources/qml/Preferences/GeneralPage.qml mode change 100644 => 100755 resources/qml/Preferences/MachinesPage.qml mode change 100644 => 100755 resources/qml/Preferences/MaterialView.qml mode change 100644 => 100755 resources/qml/Preferences/MaterialsPage.qml mode change 100644 => 100755 resources/qml/Preferences/ProfileTab.qml mode change 100644 => 100755 resources/qml/Preferences/ProfilesPage.qml mode change 100644 => 100755 resources/qml/Preferences/ReadOnlySpinBox.qml mode change 100644 => 100755 resources/qml/Preferences/ReadOnlyTextArea.qml mode change 100644 => 100755 resources/qml/Preferences/ReadOnlyTextField.qml mode change 100644 => 100755 resources/qml/Preferences/SettingVisibilityPage.qml mode change 100644 => 100755 resources/qml/PrintMonitor.qml mode change 100644 => 100755 resources/qml/SaveButton.qml mode change 100644 => 100755 resources/qml/Settings/SettingCategory.qml mode change 100644 => 100755 resources/qml/Settings/SettingCheckBox.qml mode change 100644 => 100755 resources/qml/Settings/SettingComboBox.qml mode change 100644 => 100755 resources/qml/Settings/SettingExtruder.qml mode change 100644 => 100755 resources/qml/Settings/SettingItem.qml mode change 100644 => 100755 resources/qml/Settings/SettingTextField.qml mode change 100644 => 100755 resources/qml/Settings/SettingUnknown.qml mode change 100644 => 100755 resources/qml/Settings/SettingView.qml mode change 100644 => 100755 resources/qml/Sidebar.qml mode change 100644 => 100755 resources/qml/SidebarAdvanced.qml mode change 100644 => 100755 resources/qml/SidebarContents.qml mode change 100644 => 100755 resources/qml/SidebarHeader.qml mode change 100644 => 100755 resources/qml/SidebarSimple.qml mode change 100644 => 100755 resources/qml/SidebarTooltip.qml mode change 100644 => 100755 resources/qml/Toolbar.qml mode change 100644 => 100755 resources/quality/high.inst.cfg mode change 100644 => 100755 resources/quality/low.inst.cfg mode change 100644 => 100755 resources/quality/normal.inst.cfg mode change 100644 => 100755 resources/quality/ultimaker2_plus/pla_0.25_normal.inst.cfg mode change 100644 => 100755 resources/quality/ultimaker2_plus/pla_0.4_fast.inst.cfg mode change 100644 => 100755 resources/quality/ultimaker2_plus/pla_0.4_high.inst.cfg mode change 100644 => 100755 resources/quality/ultimaker2_plus/pla_0.4_normal.inst.cfg mode change 100644 => 100755 resources/quality/ultimaker2_plus/pla_0.6_normal.inst.cfg mode change 100644 => 100755 resources/quality/ultimaker2_plus/pla_0.8_normal.inst.cfg mode change 100644 => 100755 resources/quality/ultimaker2_plus/um2p_abs_0.25_normal.inst.cfg mode change 100644 => 100755 resources/quality/ultimaker2_plus/um2p_abs_0.4_fast.inst.cfg mode change 100644 => 100755 resources/quality/ultimaker2_plus/um2p_abs_0.4_high.inst.cfg mode change 100644 => 100755 resources/quality/ultimaker2_plus/um2p_abs_0.4_normal.inst.cfg mode change 100644 => 100755 resources/quality/ultimaker2_plus/um2p_abs_0.6_normal.inst.cfg mode change 100644 => 100755 resources/quality/ultimaker2_plus/um2p_abs_0.8_normal.inst.cfg mode change 100644 => 100755 resources/quality/ultimaker2_plus/um2p_cpe_0.25_normal.inst.cfg mode change 100644 => 100755 resources/quality/ultimaker2_plus/um2p_cpe_0.4_fast.inst.cfg mode change 100644 => 100755 resources/quality/ultimaker2_plus/um2p_cpe_0.4_high.inst.cfg mode change 100644 => 100755 resources/quality/ultimaker2_plus/um2p_cpe_0.4_normal.inst.cfg mode change 100644 => 100755 resources/quality/ultimaker2_plus/um2p_cpe_0.6_normal.inst.cfg mode change 100644 => 100755 resources/quality/ultimaker2_plus/um2p_cpe_0.8_normal.inst.cfg mode change 100644 => 100755 resources/quality/ultimaker2_plus/um2p_cpep_0.4_draft.inst.cfg mode change 100644 => 100755 resources/quality/ultimaker2_plus/um2p_cpep_0.4_normal.inst.cfg mode change 100644 => 100755 resources/quality/ultimaker2_plus/um2p_cpep_0.6_draft.inst.cfg mode change 100644 => 100755 resources/quality/ultimaker2_plus/um2p_cpep_0.6_normal.inst.cfg mode change 100644 => 100755 resources/quality/ultimaker2_plus/um2p_cpep_0.8_draft.inst.cfg mode change 100644 => 100755 resources/quality/ultimaker2_plus/um2p_cpep_0.8_normal.inst.cfg mode change 100644 => 100755 resources/quality/ultimaker2_plus/um2p_nylon_0.25_high.inst.cfg mode change 100644 => 100755 resources/quality/ultimaker2_plus/um2p_nylon_0.25_normal.inst.cfg mode change 100644 => 100755 resources/quality/ultimaker2_plus/um2p_nylon_0.4_fast.inst.cfg mode change 100644 => 100755 resources/quality/ultimaker2_plus/um2p_nylon_0.4_normal.inst.cfg mode change 100644 => 100755 resources/quality/ultimaker2_plus/um2p_nylon_0.6_fast.inst.cfg mode change 100644 => 100755 resources/quality/ultimaker2_plus/um2p_nylon_0.6_normal.inst.cfg mode change 100644 => 100755 resources/quality/ultimaker2_plus/um2p_nylon_0.8_draft.inst.cfg mode change 100644 => 100755 resources/quality/ultimaker2_plus/um2p_nylon_0.8_normal.inst.cfg mode change 100644 => 100755 resources/quality/ultimaker2_plus/um2p_pc_0.25_high.inst.cfg mode change 100644 => 100755 resources/quality/ultimaker2_plus/um2p_pc_0.25_normal.inst.cfg mode change 100644 => 100755 resources/quality/ultimaker2_plus/um2p_pc_0.4_fast.inst.cfg mode change 100644 => 100755 resources/quality/ultimaker2_plus/um2p_pc_0.4_normal.inst.cfg mode change 100644 => 100755 resources/quality/ultimaker2_plus/um2p_pc_0.6_fast.inst.cfg mode change 100644 => 100755 resources/quality/ultimaker2_plus/um2p_pc_0.6_normal.inst.cfg mode change 100644 => 100755 resources/quality/ultimaker2_plus/um2p_pc_0.8_draft.inst.cfg mode change 100644 => 100755 resources/quality/ultimaker2_plus/um2p_pc_0.8_normal.inst.cfg mode change 100644 => 100755 resources/quality/ultimaker2_plus/um2p_tpu_0.25_high.inst.cfg mode change 100644 => 100755 resources/quality/ultimaker2_plus/um2p_tpu_0.4_normal.inst.cfg mode change 100644 => 100755 resources/quality/ultimaker2_plus/um2p_tpu_0.6_fast.inst.cfg mode change 100644 => 100755 resources/shaders/grid.shader mode change 100644 => 100755 resources/shaders/overhang.shader mode change 100644 => 100755 resources/shaders/striped.shader mode change 100644 => 100755 resources/shaders/transparent_object.shader mode change 100644 => 100755 resources/themes/cura/fonts/LICENSE.txt mode change 100644 => 100755 resources/themes/cura/fonts/OpenSans-Bold.ttf mode change 100644 => 100755 resources/themes/cura/fonts/OpenSans-BoldItalic.ttf mode change 100644 => 100755 resources/themes/cura/fonts/OpenSans-Italic.ttf mode change 100644 => 100755 resources/themes/cura/fonts/OpenSans-Light.ttf mode change 100644 => 100755 resources/themes/cura/fonts/OpenSans-LightItalic.ttf mode change 100644 => 100755 resources/themes/cura/fonts/OpenSans-Regular.ttf mode change 100644 => 100755 resources/themes/cura/fonts/OpenSans-Semibold.ttf mode change 100644 => 100755 resources/themes/cura/fonts/OpenSans-SemiboldItalic.ttf mode change 100644 => 100755 resources/themes/cura/icons/application.svg mode change 100644 => 100755 resources/themes/cura/icons/arrow_bottom.svg mode change 100644 => 100755 resources/themes/cura/icons/arrow_left.svg mode change 100644 => 100755 resources/themes/cura/icons/arrow_right.svg mode change 100644 => 100755 resources/themes/cura/icons/arrow_top.svg mode change 100644 => 100755 resources/themes/cura/icons/basic.svg mode change 100644 => 100755 resources/themes/cura/icons/category_adhesion.svg mode change 100644 => 100755 resources/themes/cura/icons/category_blackmagic.svg mode change 100644 => 100755 resources/themes/cura/icons/category_cool.svg mode change 100644 => 100755 resources/themes/cura/icons/category_dual.svg mode change 100644 => 100755 resources/themes/cura/icons/category_experimental.svg mode change 100644 => 100755 resources/themes/cura/icons/category_fixes.svg mode change 100644 => 100755 resources/themes/cura/icons/category_infill.svg mode change 100644 => 100755 resources/themes/cura/icons/category_layer_height.svg mode change 100644 => 100755 resources/themes/cura/icons/category_machine.svg mode change 100644 => 100755 resources/themes/cura/icons/category_material.svg mode change 100644 => 100755 resources/themes/cura/icons/category_shell.svg mode change 100644 => 100755 resources/themes/cura/icons/category_shield.svg mode change 100644 => 100755 resources/themes/cura/icons/category_speed.svg mode change 100644 => 100755 resources/themes/cura/icons/category_support.svg mode change 100644 => 100755 resources/themes/cura/icons/category_travel.svg mode change 100644 => 100755 resources/themes/cura/icons/category_unknown.svg mode change 100644 => 100755 resources/themes/cura/icons/check.svg mode change 100644 => 100755 resources/themes/cura/icons/cross1.svg mode change 100644 => 100755 resources/themes/cura/icons/cross2.svg mode change 100644 => 100755 resources/themes/cura/icons/dense.svg mode change 100644 => 100755 resources/themes/cura/icons/dot.svg mode change 100644 => 100755 resources/themes/cura/icons/hollow.svg mode change 100644 => 100755 resources/themes/cura/icons/link.svg mode change 100644 => 100755 resources/themes/cura/icons/load.svg mode change 100644 => 100755 resources/themes/cura/icons/minus.svg mode change 100644 => 100755 resources/themes/cura/icons/mirror.svg mode change 100644 => 100755 resources/themes/cura/icons/notice.svg mode change 100644 => 100755 resources/themes/cura/icons/pencil.svg mode change 100644 => 100755 resources/themes/cura/icons/plugin.svg mode change 100644 => 100755 resources/themes/cura/icons/plus.svg mode change 100644 => 100755 resources/themes/cura/icons/print_time.svg mode change 100644 => 100755 resources/themes/cura/icons/printsetup.svg mode change 100644 => 100755 resources/themes/cura/icons/quick.svg mode change 100644 => 100755 resources/themes/cura/icons/reset.svg mode change 100644 => 100755 resources/themes/cura/icons/rotate.svg mode change 100644 => 100755 resources/themes/cura/icons/rotate_layflat.svg mode change 100644 => 100755 resources/themes/cura/icons/rotate_reset.svg mode change 100644 => 100755 resources/themes/cura/icons/scale.svg mode change 100644 => 100755 resources/themes/cura/icons/scale_max.svg mode change 100644 => 100755 resources/themes/cura/icons/scale_reset.svg mode change 100644 => 100755 resources/themes/cura/icons/setting_per_object.svg mode change 100644 => 100755 resources/themes/cura/icons/settings.svg mode change 100644 => 100755 resources/themes/cura/icons/solid.svg mode change 100644 => 100755 resources/themes/cura/icons/sparse.svg mode change 100644 => 100755 resources/themes/cura/icons/star.svg mode change 100644 => 100755 resources/themes/cura/icons/tab_monitor.svg mode change 100644 => 100755 resources/themes/cura/icons/tab_monitor_busy.svg mode change 100644 => 100755 resources/themes/cura/icons/tab_monitor_connected.svg mode change 100644 => 100755 resources/themes/cura/icons/tab_monitor_offline.svg mode change 100644 => 100755 resources/themes/cura/icons/tab_monitor_paused.svg mode change 100644 => 100755 resources/themes/cura/icons/tab_monitor_stopped.svg mode change 100644 => 100755 resources/themes/cura/icons/tab_monitor_unknown.svg mode change 100644 => 100755 resources/themes/cura/icons/tab_settings.svg mode change 100644 => 100755 resources/themes/cura/icons/translate.svg mode change 100644 => 100755 resources/themes/cura/icons/ulti.svg mode change 100644 => 100755 resources/themes/cura/icons/view_layer.svg mode change 100644 => 100755 resources/themes/cura/icons/view_normal.svg mode change 100644 => 100755 resources/themes/cura/icons/view_xray.svg mode change 100644 => 100755 resources/themes/cura/icons/viewmode.svg mode change 100644 => 100755 resources/themes/cura/icons/warning.svg mode change 100644 => 100755 resources/themes/cura/images/logo.svg mode change 100644 => 100755 resources/themes/cura/styles.qml mode change 100644 => 100755 resources/themes/cura/theme.json mode change 100644 => 100755 resources/variants/ultimaker2_extended_plus_0.25.inst.cfg mode change 100644 => 100755 resources/variants/ultimaker2_extended_plus_0.4.inst.cfg mode change 100644 => 100755 resources/variants/ultimaker2_extended_plus_0.6.inst.cfg mode change 100644 => 100755 resources/variants/ultimaker2_extended_plus_0.8.inst.cfg mode change 100644 => 100755 resources/variants/ultimaker2_plus_0.25.inst.cfg mode change 100644 => 100755 resources/variants/ultimaker2_plus_0.4.inst.cfg mode change 100644 => 100755 resources/variants/ultimaker2_plus_0.6.inst.cfg mode change 100644 => 100755 resources/variants/ultimaker2_plus_0.8.inst.cfg mode change 100644 => 100755 setup.py mode change 100644 => 100755 tests/TestMachineAction.py diff --git a/.gitignore b/.gitignore old mode 100644 new mode 100755 diff --git a/CHANGES b/CHANGES old mode 100644 new mode 100755 diff --git a/CMakeLists.txt b/CMakeLists.txt old mode 100644 new mode 100755 diff --git a/CPackConfig.cmake b/CPackConfig.cmake old mode 100644 new mode 100755 diff --git a/LICENSE b/LICENSE old mode 100644 new mode 100755 diff --git a/README.md b/README.md old mode 100644 new mode 100755 diff --git a/build.sh b/build.sh old mode 100644 new mode 100755 diff --git a/cura.desktop.in b/cura.desktop.in old mode 100644 new mode 100755 diff --git a/cura.sharedmimeinfo b/cura.sharedmimeinfo old mode 100644 new mode 100755 diff --git a/cura/BuildVolume.py b/cura/BuildVolume.py old mode 100644 new mode 100755 diff --git a/cura/CameraAnimation.py b/cura/CameraAnimation.py old mode 100644 new mode 100755 diff --git a/cura/CameraImageProvider.py b/cura/CameraImageProvider.py old mode 100644 new mode 100755 diff --git a/cura/ConvexHullDecorator.py b/cura/ConvexHullDecorator.py old mode 100644 new mode 100755 diff --git a/cura/ConvexHullNode.py b/cura/ConvexHullNode.py old mode 100644 new mode 100755 diff --git a/cura/CrashHandler.py b/cura/CrashHandler.py old mode 100644 new mode 100755 diff --git a/cura/CuraActions.py b/cura/CuraActions.py old mode 100644 new mode 100755 diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py old mode 100644 new mode 100755 diff --git a/cura/CuraSplashScreen.py b/cura/CuraSplashScreen.py old mode 100644 new mode 100755 diff --git a/cura/CuraVersion.py.in b/cura/CuraVersion.py.in old mode 100644 new mode 100755 diff --git a/cura/Layer.py b/cura/Layer.py old mode 100644 new mode 100755 diff --git a/cura/LayerData.py b/cura/LayerData.py old mode 100644 new mode 100755 diff --git a/cura/LayerDataBuilder.py b/cura/LayerDataBuilder.py old mode 100644 new mode 100755 diff --git a/cura/LayerDataDecorator.py b/cura/LayerDataDecorator.py old mode 100644 new mode 100755 diff --git a/cura/LayerPolygon.py b/cura/LayerPolygon.py old mode 100644 new mode 100755 diff --git a/cura/MachineAction.py b/cura/MachineAction.py old mode 100644 new mode 100755 diff --git a/cura/MachineActionManager.py b/cura/MachineActionManager.py old mode 100644 new mode 100755 diff --git a/cura/OneAtATimeIterator.py b/cura/OneAtATimeIterator.py old mode 100644 new mode 100755 diff --git a/cura/PlatformPhysics.py b/cura/PlatformPhysics.py old mode 100644 new mode 100755 diff --git a/cura/PlatformPhysicsOperation.py b/cura/PlatformPhysicsOperation.py old mode 100644 new mode 100755 diff --git a/cura/PrintInformation.py b/cura/PrintInformation.py old mode 100644 new mode 100755 diff --git a/cura/PrinterOutputDevice.py b/cura/PrinterOutputDevice.py old mode 100644 new mode 100755 diff --git a/cura/ProfileReader.py b/cura/ProfileReader.py old mode 100644 new mode 100755 diff --git a/cura/ProfileWriter.py b/cura/ProfileWriter.py old mode 100644 new mode 100755 diff --git a/cura/SetParentOperation.py b/cura/SetParentOperation.py old mode 100644 new mode 100755 diff --git a/cura/Settings/ContainerManager.py b/cura/Settings/ContainerManager.py old mode 100644 new mode 100755 diff --git a/cura/Settings/ContainerSettingsModel.py b/cura/Settings/ContainerSettingsModel.py old mode 100644 new mode 100755 diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py old mode 100644 new mode 100755 diff --git a/cura/Settings/ExtruderManager.py b/cura/Settings/ExtruderManager.py old mode 100644 new mode 100755 diff --git a/cura/Settings/ExtrudersModel.py b/cura/Settings/ExtrudersModel.py old mode 100644 new mode 100755 diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py old mode 100644 new mode 100755 diff --git a/cura/Settings/MaterialSettingsVisibilityHandler.py b/cura/Settings/MaterialSettingsVisibilityHandler.py old mode 100644 new mode 100755 diff --git a/cura/Settings/QualitySettingsModel.py b/cura/Settings/QualitySettingsModel.py old mode 100644 new mode 100755 diff --git a/cura/Settings/SettingInheritanceManager.py b/cura/Settings/SettingInheritanceManager.py old mode 100644 new mode 100755 diff --git a/cura/Settings/SettingOverrideDecorator.py b/cura/Settings/SettingOverrideDecorator.py old mode 100644 new mode 100755 diff --git a/cura/Settings/__init__.py b/cura/Settings/__init__.py old mode 100644 new mode 100755 diff --git a/cura/ZOffsetDecorator.py b/cura/ZOffsetDecorator.py old mode 100644 new mode 100755 diff --git a/cura/__init__.py b/cura/__init__.py old mode 100644 new mode 100755 diff --git a/icons/cura-128.png b/icons/cura-128.png old mode 100644 new mode 100755 diff --git a/icons/cura-32.png b/icons/cura-32.png old mode 100644 new mode 100755 diff --git a/icons/cura-48.png b/icons/cura-48.png old mode 100644 new mode 100755 diff --git a/icons/cura-64.png b/icons/cura-64.png old mode 100644 new mode 100755 diff --git a/icons/cura.icns b/icons/cura.icns old mode 100644 new mode 100755 diff --git a/icons/cura.ico b/icons/cura.ico old mode 100644 new mode 100755 diff --git a/installer.nsi b/installer.nsi old mode 100644 new mode 100755 diff --git a/plugins/3MFReader/ThreeMFReader.py b/plugins/3MFReader/ThreeMFReader.py old mode 100644 new mode 100755 diff --git a/plugins/3MFReader/__init__.py b/plugins/3MFReader/__init__.py old mode 100644 new mode 100755 diff --git a/plugins/AutoSave/AutoSave.py b/plugins/AutoSave/AutoSave.py old mode 100644 new mode 100755 diff --git a/plugins/AutoSave/__init__.py b/plugins/AutoSave/__init__.py old mode 100644 new mode 100755 diff --git a/plugins/ChangeLogPlugin/ChangeLog.py b/plugins/ChangeLogPlugin/ChangeLog.py old mode 100644 new mode 100755 diff --git a/plugins/ChangeLogPlugin/ChangeLog.qml b/plugins/ChangeLogPlugin/ChangeLog.qml old mode 100644 new mode 100755 diff --git a/plugins/ChangeLogPlugin/ChangeLog.txt b/plugins/ChangeLogPlugin/ChangeLog.txt old mode 100644 new mode 100755 diff --git a/plugins/ChangeLogPlugin/__init__.py b/plugins/ChangeLogPlugin/__init__.py old mode 100644 new mode 100755 diff --git a/plugins/CuraEngineBackend/Cura.proto b/plugins/CuraEngineBackend/Cura.proto old mode 100644 new mode 100755 diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py old mode 100644 new mode 100755 diff --git a/plugins/CuraEngineBackend/ProcessGCodeJob.py b/plugins/CuraEngineBackend/ProcessGCodeJob.py old mode 100644 new mode 100755 diff --git a/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py b/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py old mode 100644 new mode 100755 diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py old mode 100644 new mode 100755 diff --git a/plugins/CuraEngineBackend/__init__.py b/plugins/CuraEngineBackend/__init__.py old mode 100644 new mode 100755 diff --git a/plugins/CuraProfileReader/CuraProfileReader.py b/plugins/CuraProfileReader/CuraProfileReader.py old mode 100644 new mode 100755 diff --git a/plugins/CuraProfileReader/__init__.py b/plugins/CuraProfileReader/__init__.py old mode 100644 new mode 100755 diff --git a/plugins/CuraProfileWriter/CuraProfileWriter.py b/plugins/CuraProfileWriter/CuraProfileWriter.py old mode 100644 new mode 100755 diff --git a/plugins/CuraProfileWriter/__init__.py b/plugins/CuraProfileWriter/__init__.py old mode 100644 new mode 100755 diff --git a/plugins/GCODEReader/GCODEReader.py b/plugins/GCODEReader/GCODEReader.py old mode 100644 new mode 100755 index 8305061a59..edc634a091 --- a/plugins/GCODEReader/GCODEReader.py +++ b/plugins/GCODEReader/GCODEReader.py @@ -76,7 +76,7 @@ class GCODEReader(MeshReader): else: backend = Application.getInstance().getBackend() backend._pauseSlicing = True - backend.backendStateChange.emit(1) + backend.backendStateChange.emit(3) Application.getInstance().getPrintInformation()._abbr_machine = "Pre-sliced" Application.getInstance().setHideSettings(True) @@ -116,6 +116,9 @@ class GCODEReader(MeshReader): backend.close() backend.backendStateChange.emit(1) + glist = getattr(Application.getInstance().getController().getScene(), "gcode_list") + glist.clear() + file = open(file_name, "r") layer_data = LayerDataBuilder.LayerDataBuilder() @@ -159,6 +162,7 @@ class GCODEReader(MeshReader): # current_path.append([10, 10, 10]) # while file.readable(): for line in file: + glist.append(line) if len(line) == 0: continue if line[0] == ";": @@ -241,6 +245,8 @@ class GCODEReader(MeshReader): Preferences.getInstance().setValue("cura/jobname_prefix", True) + + view = Application.getInstance().getController().getActiveView() if view.getPluginId() == "LayerView": view.resetLayerData() diff --git a/plugins/GCODEReader/__init__.py b/plugins/GCODEReader/__init__.py old mode 100644 new mode 100755 diff --git a/plugins/GCodeProfileReader/GCodeProfileReader.py b/plugins/GCodeProfileReader/GCodeProfileReader.py old mode 100644 new mode 100755 diff --git a/plugins/GCodeProfileReader/__init__.py b/plugins/GCodeProfileReader/__init__.py old mode 100644 new mode 100755 diff --git a/plugins/GCodeWriter/GCodeWriter.py b/plugins/GCodeWriter/GCodeWriter.py old mode 100644 new mode 100755 diff --git a/plugins/GCodeWriter/__init__.py b/plugins/GCodeWriter/__init__.py old mode 100644 new mode 100755 diff --git a/plugins/ImageReader/ConfigUI.qml b/plugins/ImageReader/ConfigUI.qml old mode 100644 new mode 100755 diff --git a/plugins/ImageReader/ImageReader.py b/plugins/ImageReader/ImageReader.py old mode 100644 new mode 100755 diff --git a/plugins/ImageReader/ImageReaderUI.py b/plugins/ImageReader/ImageReaderUI.py old mode 100644 new mode 100755 diff --git a/plugins/ImageReader/__init__.py b/plugins/ImageReader/__init__.py old mode 100644 new mode 100755 diff --git a/plugins/LayerView/LayerPass.py b/plugins/LayerView/LayerPass.py old mode 100644 new mode 100755 diff --git a/plugins/LayerView/LayerView.py b/plugins/LayerView/LayerView.py old mode 100644 new mode 100755 diff --git a/plugins/LayerView/LayerView.qml b/plugins/LayerView/LayerView.qml old mode 100644 new mode 100755 diff --git a/plugins/LayerView/LayerViewProxy.py b/plugins/LayerView/LayerViewProxy.py old mode 100644 new mode 100755 diff --git a/plugins/LayerView/__init__.py b/plugins/LayerView/__init__.py old mode 100644 new mode 100755 diff --git a/plugins/LayerView/layerview_composite.shader b/plugins/LayerView/layerview_composite.shader old mode 100644 new mode 100755 diff --git a/plugins/LegacyProfileReader/DictionaryOfDoom.json b/plugins/LegacyProfileReader/DictionaryOfDoom.json old mode 100644 new mode 100755 diff --git a/plugins/LegacyProfileReader/LegacyProfileReader.py b/plugins/LegacyProfileReader/LegacyProfileReader.py old mode 100644 new mode 100755 diff --git a/plugins/LegacyProfileReader/__init__.py b/plugins/LegacyProfileReader/__init__.py old mode 100644 new mode 100755 diff --git a/plugins/MachineSettingsAction/MachineSettingsAction.py b/plugins/MachineSettingsAction/MachineSettingsAction.py old mode 100644 new mode 100755 diff --git a/plugins/MachineSettingsAction/MachineSettingsAction.qml b/plugins/MachineSettingsAction/MachineSettingsAction.qml old mode 100644 new mode 100755 diff --git a/plugins/MachineSettingsAction/__init__.py b/plugins/MachineSettingsAction/__init__.py old mode 100644 new mode 100755 diff --git a/plugins/PerObjectSettingsTool/PerObjectCategory.qml b/plugins/PerObjectSettingsTool/PerObjectCategory.qml old mode 100644 new mode 100755 diff --git a/plugins/PerObjectSettingsTool/PerObjectItem.qml b/plugins/PerObjectSettingsTool/PerObjectItem.qml old mode 100644 new mode 100755 diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py b/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py old mode 100644 new mode 100755 diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml old mode 100644 new mode 100755 diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingsTool.py b/plugins/PerObjectSettingsTool/PerObjectSettingsTool.py old mode 100644 new mode 100755 diff --git a/plugins/PerObjectSettingsTool/__init__.py b/plugins/PerObjectSettingsTool/__init__.py old mode 100644 new mode 100755 diff --git a/plugins/RemovableDriveOutputDevice/LinuxRemovableDrivePlugin.py b/plugins/RemovableDriveOutputDevice/LinuxRemovableDrivePlugin.py old mode 100644 new mode 100755 diff --git a/plugins/RemovableDriveOutputDevice/OSXRemovableDrivePlugin.py b/plugins/RemovableDriveOutputDevice/OSXRemovableDrivePlugin.py old mode 100644 new mode 100755 diff --git a/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py b/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py old mode 100644 new mode 100755 diff --git a/plugins/RemovableDriveOutputDevice/RemovableDrivePlugin.py b/plugins/RemovableDriveOutputDevice/RemovableDrivePlugin.py old mode 100644 new mode 100755 diff --git a/plugins/RemovableDriveOutputDevice/WindowsRemovableDrivePlugin.py b/plugins/RemovableDriveOutputDevice/WindowsRemovableDrivePlugin.py old mode 100644 new mode 100755 diff --git a/plugins/RemovableDriveOutputDevice/__init__.py b/plugins/RemovableDriveOutputDevice/__init__.py old mode 100644 new mode 100755 diff --git a/plugins/SolidView/SolidView.py b/plugins/SolidView/SolidView.py old mode 100644 new mode 100755 diff --git a/plugins/SolidView/__init__.py b/plugins/SolidView/__init__.py old mode 100644 new mode 100755 diff --git a/plugins/USBPrinting/FirmwareUpdateWindow.qml b/plugins/USBPrinting/FirmwareUpdateWindow.qml old mode 100644 new mode 100755 diff --git a/plugins/USBPrinting/USBPrinterOutputDevice.py b/plugins/USBPrinting/USBPrinterOutputDevice.py old mode 100644 new mode 100755 diff --git a/plugins/USBPrinting/USBPrinterOutputDeviceManager.py b/plugins/USBPrinting/USBPrinterOutputDeviceManager.py old mode 100644 new mode 100755 diff --git a/plugins/USBPrinting/__init__.py b/plugins/USBPrinting/__init__.py old mode 100644 new mode 100755 diff --git a/plugins/USBPrinting/avr_isp/__init__.py b/plugins/USBPrinting/avr_isp/__init__.py old mode 100644 new mode 100755 diff --git a/plugins/USBPrinting/avr_isp/chipDB.py b/plugins/USBPrinting/avr_isp/chipDB.py old mode 100644 new mode 100755 diff --git a/plugins/USBPrinting/avr_isp/intelHex.py b/plugins/USBPrinting/avr_isp/intelHex.py old mode 100644 new mode 100755 diff --git a/plugins/USBPrinting/avr_isp/ispBase.py b/plugins/USBPrinting/avr_isp/ispBase.py old mode 100644 new mode 100755 diff --git a/plugins/USBPrinting/avr_isp/stk500v2.py b/plugins/USBPrinting/avr_isp/stk500v2.py old mode 100644 new mode 100755 diff --git a/plugins/UltimakerMachineActions/BedLevelMachineAction.py b/plugins/UltimakerMachineActions/BedLevelMachineAction.py old mode 100644 new mode 100755 diff --git a/plugins/UltimakerMachineActions/BedLevelMachineAction.qml b/plugins/UltimakerMachineActions/BedLevelMachineAction.qml old mode 100644 new mode 100755 diff --git a/plugins/UltimakerMachineActions/UMOCheckupMachineAction.py b/plugins/UltimakerMachineActions/UMOCheckupMachineAction.py old mode 100644 new mode 100755 diff --git a/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml b/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml old mode 100644 new mode 100755 diff --git a/plugins/UltimakerMachineActions/UMOUpgradeSelection.py b/plugins/UltimakerMachineActions/UMOUpgradeSelection.py old mode 100644 new mode 100755 diff --git a/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml b/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml old mode 100644 new mode 100755 diff --git a/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.py b/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.py old mode 100644 new mode 100755 diff --git a/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml b/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml old mode 100644 new mode 100755 diff --git a/plugins/UltimakerMachineActions/__init__.py b/plugins/UltimakerMachineActions/__init__.py old mode 100644 new mode 100755 diff --git a/plugins/VersionUpgrade/VersionUpgrade21to22/MachineInstance.py b/plugins/VersionUpgrade/VersionUpgrade21to22/MachineInstance.py old mode 100644 new mode 100755 diff --git a/plugins/VersionUpgrade/VersionUpgrade21to22/Preferences.py b/plugins/VersionUpgrade/VersionUpgrade21to22/Preferences.py old mode 100644 new mode 100755 diff --git a/plugins/VersionUpgrade/VersionUpgrade21to22/Profile.py b/plugins/VersionUpgrade/VersionUpgrade21to22/Profile.py old mode 100644 new mode 100755 diff --git a/plugins/VersionUpgrade/VersionUpgrade21to22/VersionUpgrade21to22.py b/plugins/VersionUpgrade/VersionUpgrade21to22/VersionUpgrade21to22.py old mode 100644 new mode 100755 diff --git a/plugins/VersionUpgrade/VersionUpgrade21to22/__init__.py b/plugins/VersionUpgrade/VersionUpgrade21to22/__init__.py old mode 100644 new mode 100755 diff --git a/plugins/X3DReader/X3DReader.py b/plugins/X3DReader/X3DReader.py old mode 100644 new mode 100755 diff --git a/plugins/X3DReader/__init__.py b/plugins/X3DReader/__init__.py old mode 100644 new mode 100755 diff --git a/plugins/XRayView/XRayPass.py b/plugins/XRayView/XRayPass.py old mode 100644 new mode 100755 diff --git a/plugins/XRayView/XRayView.py b/plugins/XRayView/XRayView.py old mode 100644 new mode 100755 diff --git a/plugins/XRayView/__init__.py b/plugins/XRayView/__init__.py old mode 100644 new mode 100755 diff --git a/plugins/XRayView/xray.shader b/plugins/XRayView/xray.shader old mode 100644 new mode 100755 diff --git a/plugins/XRayView/xray_composite.shader b/plugins/XRayView/xray_composite.shader old mode 100644 new mode 100755 diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py old mode 100644 new mode 100755 diff --git a/plugins/XmlMaterialProfile/__init__.py b/plugins/XmlMaterialProfile/__init__.py old mode 100644 new mode 100755 diff --git a/pytest.ini b/pytest.ini old mode 100644 new mode 100755 diff --git a/resources/definitions/bq_hephestos.def.json b/resources/definitions/bq_hephestos.def.json old mode 100644 new mode 100755 diff --git a/resources/definitions/bq_hephestos_2.def.json b/resources/definitions/bq_hephestos_2.def.json old mode 100644 new mode 100755 diff --git a/resources/definitions/bq_hephestos_xl.def.json b/resources/definitions/bq_hephestos_xl.def.json old mode 100644 new mode 100755 diff --git a/resources/definitions/bq_witbox.def.json b/resources/definitions/bq_witbox.def.json old mode 100644 new mode 100755 diff --git a/resources/definitions/bq_witbox_2.def.json b/resources/definitions/bq_witbox_2.def.json old mode 100644 new mode 100755 diff --git a/resources/definitions/custom.def.json b/resources/definitions/custom.def.json old mode 100644 new mode 100755 diff --git a/resources/definitions/fdmextruder.def.json b/resources/definitions/fdmextruder.def.json old mode 100644 new mode 100755 diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json old mode 100644 new mode 100755 diff --git a/resources/definitions/grr_neo.def.json b/resources/definitions/grr_neo.def.json old mode 100644 new mode 100755 diff --git a/resources/definitions/innovo_inventor.def.json b/resources/definitions/innovo_inventor.def.json old mode 100644 new mode 100755 diff --git a/resources/definitions/kossel_mini.def.json b/resources/definitions/kossel_mini.def.json old mode 100644 new mode 100755 diff --git a/resources/definitions/m180.def.json b/resources/definitions/m180.def.json old mode 100644 new mode 100755 diff --git a/resources/definitions/maker_starter.def.json b/resources/definitions/maker_starter.def.json old mode 100644 new mode 100755 diff --git a/resources/definitions/mankati_fullscale_xt_plus.def.json b/resources/definitions/mankati_fullscale_xt_plus.def.json old mode 100644 new mode 100755 diff --git a/resources/definitions/mendel90.def.json b/resources/definitions/mendel90.def.json old mode 100644 new mode 100755 diff --git a/resources/definitions/printrbot_simple.def.json b/resources/definitions/printrbot_simple.def.json old mode 100644 new mode 100755 diff --git a/resources/definitions/prusa_i3.def.json b/resources/definitions/prusa_i3.def.json old mode 100644 new mode 100755 diff --git a/resources/definitions/prusa_i3_mk2.def.json b/resources/definitions/prusa_i3_mk2.def.json old mode 100644 new mode 100755 diff --git a/resources/definitions/prusa_i3_xl.def.json b/resources/definitions/prusa_i3_xl.def.json old mode 100644 new mode 100755 diff --git a/resources/definitions/rigidbot.def.json b/resources/definitions/rigidbot.def.json old mode 100644 new mode 100755 diff --git a/resources/definitions/rigidbot_big.def.json b/resources/definitions/rigidbot_big.def.json old mode 100644 new mode 100755 diff --git a/resources/definitions/ultimaker.def.json b/resources/definitions/ultimaker.def.json old mode 100644 new mode 100755 diff --git a/resources/definitions/ultimaker2.def.json b/resources/definitions/ultimaker2.def.json old mode 100644 new mode 100755 diff --git a/resources/definitions/ultimaker2_extended.def.json b/resources/definitions/ultimaker2_extended.def.json old mode 100644 new mode 100755 diff --git a/resources/definitions/ultimaker2_extended_plus.def.json b/resources/definitions/ultimaker2_extended_plus.def.json old mode 100644 new mode 100755 diff --git a/resources/definitions/ultimaker2_go.def.json b/resources/definitions/ultimaker2_go.def.json old mode 100644 new mode 100755 diff --git a/resources/definitions/ultimaker2_plus.def.json b/resources/definitions/ultimaker2_plus.def.json old mode 100644 new mode 100755 diff --git a/resources/definitions/ultimaker_original.def.json b/resources/definitions/ultimaker_original.def.json old mode 100644 new mode 100755 diff --git a/resources/definitions/ultimaker_original_dual.def.json b/resources/definitions/ultimaker_original_dual.def.json old mode 100644 new mode 100755 diff --git a/resources/definitions/ultimaker_original_plus.def.json b/resources/definitions/ultimaker_original_plus.def.json old mode 100644 new mode 100755 diff --git a/resources/definitions/uniqbot_one.def.json b/resources/definitions/uniqbot_one.def.json old mode 100644 new mode 100755 diff --git a/resources/extruders/ultimaker_original_dual_1st.def.json b/resources/extruders/ultimaker_original_dual_1st.def.json old mode 100644 new mode 100755 diff --git a/resources/extruders/ultimaker_original_dual_2nd.def.json b/resources/extruders/ultimaker_original_dual_2nd.def.json old mode 100644 new mode 100755 diff --git a/resources/i18n/cura.pot b/resources/i18n/cura.pot old mode 100644 new mode 100755 diff --git a/resources/i18n/de/cura.po b/resources/i18n/de/cura.po old mode 100644 new mode 100755 diff --git a/resources/i18n/en/cura.po b/resources/i18n/en/cura.po old mode 100644 new mode 100755 diff --git a/resources/i18n/es/cura.po b/resources/i18n/es/cura.po old mode 100644 new mode 100755 diff --git a/resources/i18n/fdmextruder.def.json.pot b/resources/i18n/fdmextruder.def.json.pot old mode 100644 new mode 100755 diff --git a/resources/i18n/fdmprinter.def.json.pot b/resources/i18n/fdmprinter.def.json.pot old mode 100644 new mode 100755 diff --git a/resources/i18n/fi/cura.po b/resources/i18n/fi/cura.po old mode 100644 new mode 100755 diff --git a/resources/i18n/fr/cura.po b/resources/i18n/fr/cura.po old mode 100644 new mode 100755 diff --git a/resources/i18n/it/cura.po b/resources/i18n/it/cura.po old mode 100644 new mode 100755 diff --git a/resources/i18n/nl/cura.po b/resources/i18n/nl/cura.po old mode 100644 new mode 100755 diff --git a/resources/images/MakerStarterbackplate.png b/resources/images/MakerStarterbackplate.png old mode 100644 new mode 100755 diff --git a/resources/images/Ultimaker2ExtendedPlusbackplate.png b/resources/images/Ultimaker2ExtendedPlusbackplate.png old mode 100644 new mode 100755 diff --git a/resources/images/Ultimaker2Extendedbackplate.png b/resources/images/Ultimaker2Extendedbackplate.png old mode 100644 new mode 100755 diff --git a/resources/images/Ultimaker2Gobackplate.png b/resources/images/Ultimaker2Gobackplate.png old mode 100644 new mode 100755 diff --git a/resources/images/Ultimaker2Plusbackplate.png b/resources/images/Ultimaker2Plusbackplate.png old mode 100644 new mode 100755 diff --git a/resources/images/Ultimaker2backplate.png b/resources/images/Ultimaker2backplate.png old mode 100644 new mode 100755 diff --git a/resources/images/UltimakerPlusbackplate.png b/resources/images/UltimakerPlusbackplate.png old mode 100644 new mode 100755 diff --git a/resources/images/cura-icon.png b/resources/images/cura-icon.png old mode 100644 new mode 100755 diff --git a/resources/images/cura.png b/resources/images/cura.png old mode 100644 new mode 100755 diff --git a/resources/meshes/UltimakerRobot_support.stl b/resources/meshes/UltimakerRobot_support.stl old mode 100644 new mode 100755 diff --git a/resources/meshes/bq_hephestos_2_platform.stl b/resources/meshes/bq_hephestos_2_platform.stl old mode 100644 new mode 100755 diff --git a/resources/meshes/bq_hephestos_platform.stl b/resources/meshes/bq_hephestos_platform.stl old mode 100644 new mode 100755 diff --git a/resources/meshes/bq_witbox_platform.stl b/resources/meshes/bq_witbox_platform.stl old mode 100644 new mode 100755 diff --git a/resources/meshes/grr_neo_platform.stl b/resources/meshes/grr_neo_platform.stl old mode 100644 new mode 100755 diff --git a/resources/meshes/inventor_platform.stl b/resources/meshes/inventor_platform.stl old mode 100644 new mode 100755 diff --git a/resources/meshes/kossel_platform.stl b/resources/meshes/kossel_platform.stl old mode 100644 new mode 100755 diff --git a/resources/meshes/makerstarter_platform.stl b/resources/meshes/makerstarter_platform.stl old mode 100644 new mode 100755 diff --git a/resources/meshes/mankati_fullscale_xt_plus_platform.stl b/resources/meshes/mankati_fullscale_xt_plus_platform.stl old mode 100644 new mode 100755 diff --git a/resources/meshes/mendel90_platform.stl b/resources/meshes/mendel90_platform.stl old mode 100644 new mode 100755 diff --git a/resources/meshes/printrbot_simple_metal_platform.stl b/resources/meshes/printrbot_simple_metal_platform.stl old mode 100644 new mode 100755 diff --git a/resources/meshes/prusai3_platform.stl b/resources/meshes/prusai3_platform.stl old mode 100644 new mode 100755 diff --git a/resources/meshes/prusai3_xl_platform.stl b/resources/meshes/prusai3_xl_platform.stl old mode 100644 new mode 100755 diff --git a/resources/meshes/rigidbot_platform.stl b/resources/meshes/rigidbot_platform.stl old mode 100644 new mode 100755 diff --git a/resources/meshes/rigidbotbig_platform.stl b/resources/meshes/rigidbotbig_platform.stl old mode 100644 new mode 100755 diff --git a/resources/meshes/ultimaker2_platform.obj b/resources/meshes/ultimaker2_platform.obj old mode 100644 new mode 100755 diff --git a/resources/meshes/ultimaker2go_platform.obj b/resources/meshes/ultimaker2go_platform.obj old mode 100644 new mode 100755 diff --git a/resources/meshes/ultimaker_platform.stl b/resources/meshes/ultimaker_platform.stl old mode 100644 new mode 100755 diff --git a/resources/qml/AboutDialog.qml b/resources/qml/AboutDialog.qml old mode 100644 new mode 100755 diff --git a/resources/qml/Actions.qml b/resources/qml/Actions.qml old mode 100644 new mode 100755 diff --git a/resources/qml/AddMachineDialog.qml b/resources/qml/AddMachineDialog.qml old mode 100644 new mode 100755 diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml old mode 100644 new mode 100755 diff --git a/resources/qml/EngineLog.qml b/resources/qml/EngineLog.qml old mode 100644 new mode 100755 diff --git a/resources/qml/JobSpecs.qml b/resources/qml/JobSpecs.qml old mode 100644 new mode 100755 diff --git a/resources/qml/MachineAction.qml b/resources/qml/MachineAction.qml old mode 100644 new mode 100755 diff --git a/resources/qml/Menus/MaterialMenu.qml b/resources/qml/Menus/MaterialMenu.qml old mode 100644 new mode 100755 diff --git a/resources/qml/Menus/NozzleMenu.qml b/resources/qml/Menus/NozzleMenu.qml old mode 100644 new mode 100755 diff --git a/resources/qml/Menus/PrinterMenu.qml b/resources/qml/Menus/PrinterMenu.qml old mode 100644 new mode 100755 diff --git a/resources/qml/Menus/ProfileMenu.qml b/resources/qml/Menus/ProfileMenu.qml old mode 100644 new mode 100755 diff --git a/resources/qml/Menus/RecentFilesMenu.qml b/resources/qml/Menus/RecentFilesMenu.qml old mode 100644 new mode 100755 diff --git a/resources/qml/Menus/ViewMenu.qml b/resources/qml/Menus/ViewMenu.qml old mode 100644 new mode 100755 diff --git a/resources/qml/MonitorButton.qml b/resources/qml/MonitorButton.qml old mode 100644 new mode 100755 diff --git a/resources/qml/Preferences/GeneralPage.qml b/resources/qml/Preferences/GeneralPage.qml old mode 100644 new mode 100755 diff --git a/resources/qml/Preferences/MachinesPage.qml b/resources/qml/Preferences/MachinesPage.qml old mode 100644 new mode 100755 diff --git a/resources/qml/Preferences/MaterialView.qml b/resources/qml/Preferences/MaterialView.qml old mode 100644 new mode 100755 diff --git a/resources/qml/Preferences/MaterialsPage.qml b/resources/qml/Preferences/MaterialsPage.qml old mode 100644 new mode 100755 diff --git a/resources/qml/Preferences/ProfileTab.qml b/resources/qml/Preferences/ProfileTab.qml old mode 100644 new mode 100755 diff --git a/resources/qml/Preferences/ProfilesPage.qml b/resources/qml/Preferences/ProfilesPage.qml old mode 100644 new mode 100755 diff --git a/resources/qml/Preferences/ReadOnlySpinBox.qml b/resources/qml/Preferences/ReadOnlySpinBox.qml old mode 100644 new mode 100755 diff --git a/resources/qml/Preferences/ReadOnlyTextArea.qml b/resources/qml/Preferences/ReadOnlyTextArea.qml old mode 100644 new mode 100755 diff --git a/resources/qml/Preferences/ReadOnlyTextField.qml b/resources/qml/Preferences/ReadOnlyTextField.qml old mode 100644 new mode 100755 diff --git a/resources/qml/Preferences/SettingVisibilityPage.qml b/resources/qml/Preferences/SettingVisibilityPage.qml old mode 100644 new mode 100755 diff --git a/resources/qml/PrintMonitor.qml b/resources/qml/PrintMonitor.qml old mode 100644 new mode 100755 diff --git a/resources/qml/SaveButton.qml b/resources/qml/SaveButton.qml old mode 100644 new mode 100755 diff --git a/resources/qml/Settings/SettingCategory.qml b/resources/qml/Settings/SettingCategory.qml old mode 100644 new mode 100755 diff --git a/resources/qml/Settings/SettingCheckBox.qml b/resources/qml/Settings/SettingCheckBox.qml old mode 100644 new mode 100755 diff --git a/resources/qml/Settings/SettingComboBox.qml b/resources/qml/Settings/SettingComboBox.qml old mode 100644 new mode 100755 diff --git a/resources/qml/Settings/SettingExtruder.qml b/resources/qml/Settings/SettingExtruder.qml old mode 100644 new mode 100755 diff --git a/resources/qml/Settings/SettingItem.qml b/resources/qml/Settings/SettingItem.qml old mode 100644 new mode 100755 diff --git a/resources/qml/Settings/SettingTextField.qml b/resources/qml/Settings/SettingTextField.qml old mode 100644 new mode 100755 diff --git a/resources/qml/Settings/SettingUnknown.qml b/resources/qml/Settings/SettingUnknown.qml old mode 100644 new mode 100755 diff --git a/resources/qml/Settings/SettingView.qml b/resources/qml/Settings/SettingView.qml old mode 100644 new mode 100755 diff --git a/resources/qml/Sidebar.qml b/resources/qml/Sidebar.qml old mode 100644 new mode 100755 diff --git a/resources/qml/SidebarAdvanced.qml b/resources/qml/SidebarAdvanced.qml old mode 100644 new mode 100755 diff --git a/resources/qml/SidebarContents.qml b/resources/qml/SidebarContents.qml old mode 100644 new mode 100755 diff --git a/resources/qml/SidebarHeader.qml b/resources/qml/SidebarHeader.qml old mode 100644 new mode 100755 diff --git a/resources/qml/SidebarSimple.qml b/resources/qml/SidebarSimple.qml old mode 100644 new mode 100755 diff --git a/resources/qml/SidebarTooltip.qml b/resources/qml/SidebarTooltip.qml old mode 100644 new mode 100755 diff --git a/resources/qml/Toolbar.qml b/resources/qml/Toolbar.qml old mode 100644 new mode 100755 diff --git a/resources/quality/high.inst.cfg b/resources/quality/high.inst.cfg old mode 100644 new mode 100755 diff --git a/resources/quality/low.inst.cfg b/resources/quality/low.inst.cfg old mode 100644 new mode 100755 diff --git a/resources/quality/normal.inst.cfg b/resources/quality/normal.inst.cfg old mode 100644 new mode 100755 diff --git a/resources/quality/ultimaker2_plus/pla_0.25_normal.inst.cfg b/resources/quality/ultimaker2_plus/pla_0.25_normal.inst.cfg old mode 100644 new mode 100755 diff --git a/resources/quality/ultimaker2_plus/pla_0.4_fast.inst.cfg b/resources/quality/ultimaker2_plus/pla_0.4_fast.inst.cfg old mode 100644 new mode 100755 diff --git a/resources/quality/ultimaker2_plus/pla_0.4_high.inst.cfg b/resources/quality/ultimaker2_plus/pla_0.4_high.inst.cfg old mode 100644 new mode 100755 diff --git a/resources/quality/ultimaker2_plus/pla_0.4_normal.inst.cfg b/resources/quality/ultimaker2_plus/pla_0.4_normal.inst.cfg old mode 100644 new mode 100755 diff --git a/resources/quality/ultimaker2_plus/pla_0.6_normal.inst.cfg b/resources/quality/ultimaker2_plus/pla_0.6_normal.inst.cfg old mode 100644 new mode 100755 diff --git a/resources/quality/ultimaker2_plus/pla_0.8_normal.inst.cfg b/resources/quality/ultimaker2_plus/pla_0.8_normal.inst.cfg old mode 100644 new mode 100755 diff --git a/resources/quality/ultimaker2_plus/um2p_abs_0.25_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_abs_0.25_normal.inst.cfg old mode 100644 new mode 100755 diff --git a/resources/quality/ultimaker2_plus/um2p_abs_0.4_fast.inst.cfg b/resources/quality/ultimaker2_plus/um2p_abs_0.4_fast.inst.cfg old mode 100644 new mode 100755 diff --git a/resources/quality/ultimaker2_plus/um2p_abs_0.4_high.inst.cfg b/resources/quality/ultimaker2_plus/um2p_abs_0.4_high.inst.cfg old mode 100644 new mode 100755 diff --git a/resources/quality/ultimaker2_plus/um2p_abs_0.4_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_abs_0.4_normal.inst.cfg old mode 100644 new mode 100755 diff --git a/resources/quality/ultimaker2_plus/um2p_abs_0.6_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_abs_0.6_normal.inst.cfg old mode 100644 new mode 100755 diff --git a/resources/quality/ultimaker2_plus/um2p_abs_0.8_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_abs_0.8_normal.inst.cfg old mode 100644 new mode 100755 diff --git a/resources/quality/ultimaker2_plus/um2p_cpe_0.25_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_cpe_0.25_normal.inst.cfg old mode 100644 new mode 100755 diff --git a/resources/quality/ultimaker2_plus/um2p_cpe_0.4_fast.inst.cfg b/resources/quality/ultimaker2_plus/um2p_cpe_0.4_fast.inst.cfg old mode 100644 new mode 100755 diff --git a/resources/quality/ultimaker2_plus/um2p_cpe_0.4_high.inst.cfg b/resources/quality/ultimaker2_plus/um2p_cpe_0.4_high.inst.cfg old mode 100644 new mode 100755 diff --git a/resources/quality/ultimaker2_plus/um2p_cpe_0.4_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_cpe_0.4_normal.inst.cfg old mode 100644 new mode 100755 diff --git a/resources/quality/ultimaker2_plus/um2p_cpe_0.6_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_cpe_0.6_normal.inst.cfg old mode 100644 new mode 100755 diff --git a/resources/quality/ultimaker2_plus/um2p_cpe_0.8_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_cpe_0.8_normal.inst.cfg old mode 100644 new mode 100755 diff --git a/resources/quality/ultimaker2_plus/um2p_cpep_0.4_draft.inst.cfg b/resources/quality/ultimaker2_plus/um2p_cpep_0.4_draft.inst.cfg old mode 100644 new mode 100755 diff --git a/resources/quality/ultimaker2_plus/um2p_cpep_0.4_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_cpep_0.4_normal.inst.cfg old mode 100644 new mode 100755 diff --git a/resources/quality/ultimaker2_plus/um2p_cpep_0.6_draft.inst.cfg b/resources/quality/ultimaker2_plus/um2p_cpep_0.6_draft.inst.cfg old mode 100644 new mode 100755 diff --git a/resources/quality/ultimaker2_plus/um2p_cpep_0.6_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_cpep_0.6_normal.inst.cfg old mode 100644 new mode 100755 diff --git a/resources/quality/ultimaker2_plus/um2p_cpep_0.8_draft.inst.cfg b/resources/quality/ultimaker2_plus/um2p_cpep_0.8_draft.inst.cfg old mode 100644 new mode 100755 diff --git a/resources/quality/ultimaker2_plus/um2p_cpep_0.8_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_cpep_0.8_normal.inst.cfg old mode 100644 new mode 100755 diff --git a/resources/quality/ultimaker2_plus/um2p_nylon_0.25_high.inst.cfg b/resources/quality/ultimaker2_plus/um2p_nylon_0.25_high.inst.cfg old mode 100644 new mode 100755 diff --git a/resources/quality/ultimaker2_plus/um2p_nylon_0.25_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_nylon_0.25_normal.inst.cfg old mode 100644 new mode 100755 diff --git a/resources/quality/ultimaker2_plus/um2p_nylon_0.4_fast.inst.cfg b/resources/quality/ultimaker2_plus/um2p_nylon_0.4_fast.inst.cfg old mode 100644 new mode 100755 diff --git a/resources/quality/ultimaker2_plus/um2p_nylon_0.4_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_nylon_0.4_normal.inst.cfg old mode 100644 new mode 100755 diff --git a/resources/quality/ultimaker2_plus/um2p_nylon_0.6_fast.inst.cfg b/resources/quality/ultimaker2_plus/um2p_nylon_0.6_fast.inst.cfg old mode 100644 new mode 100755 diff --git a/resources/quality/ultimaker2_plus/um2p_nylon_0.6_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_nylon_0.6_normal.inst.cfg old mode 100644 new mode 100755 diff --git a/resources/quality/ultimaker2_plus/um2p_nylon_0.8_draft.inst.cfg b/resources/quality/ultimaker2_plus/um2p_nylon_0.8_draft.inst.cfg old mode 100644 new mode 100755 diff --git a/resources/quality/ultimaker2_plus/um2p_nylon_0.8_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_nylon_0.8_normal.inst.cfg old mode 100644 new mode 100755 diff --git a/resources/quality/ultimaker2_plus/um2p_pc_0.25_high.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pc_0.25_high.inst.cfg old mode 100644 new mode 100755 diff --git a/resources/quality/ultimaker2_plus/um2p_pc_0.25_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pc_0.25_normal.inst.cfg old mode 100644 new mode 100755 diff --git a/resources/quality/ultimaker2_plus/um2p_pc_0.4_fast.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pc_0.4_fast.inst.cfg old mode 100644 new mode 100755 diff --git a/resources/quality/ultimaker2_plus/um2p_pc_0.4_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pc_0.4_normal.inst.cfg old mode 100644 new mode 100755 diff --git a/resources/quality/ultimaker2_plus/um2p_pc_0.6_fast.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pc_0.6_fast.inst.cfg old mode 100644 new mode 100755 diff --git a/resources/quality/ultimaker2_plus/um2p_pc_0.6_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pc_0.6_normal.inst.cfg old mode 100644 new mode 100755 diff --git a/resources/quality/ultimaker2_plus/um2p_pc_0.8_draft.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pc_0.8_draft.inst.cfg old mode 100644 new mode 100755 diff --git a/resources/quality/ultimaker2_plus/um2p_pc_0.8_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pc_0.8_normal.inst.cfg old mode 100644 new mode 100755 diff --git a/resources/quality/ultimaker2_plus/um2p_tpu_0.25_high.inst.cfg b/resources/quality/ultimaker2_plus/um2p_tpu_0.25_high.inst.cfg old mode 100644 new mode 100755 diff --git a/resources/quality/ultimaker2_plus/um2p_tpu_0.4_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_tpu_0.4_normal.inst.cfg old mode 100644 new mode 100755 diff --git a/resources/quality/ultimaker2_plus/um2p_tpu_0.6_fast.inst.cfg b/resources/quality/ultimaker2_plus/um2p_tpu_0.6_fast.inst.cfg old mode 100644 new mode 100755 diff --git a/resources/shaders/grid.shader b/resources/shaders/grid.shader old mode 100644 new mode 100755 diff --git a/resources/shaders/overhang.shader b/resources/shaders/overhang.shader old mode 100644 new mode 100755 diff --git a/resources/shaders/striped.shader b/resources/shaders/striped.shader old mode 100644 new mode 100755 diff --git a/resources/shaders/transparent_object.shader b/resources/shaders/transparent_object.shader old mode 100644 new mode 100755 diff --git a/resources/themes/cura/fonts/LICENSE.txt b/resources/themes/cura/fonts/LICENSE.txt old mode 100644 new mode 100755 diff --git a/resources/themes/cura/fonts/OpenSans-Bold.ttf b/resources/themes/cura/fonts/OpenSans-Bold.ttf old mode 100644 new mode 100755 diff --git a/resources/themes/cura/fonts/OpenSans-BoldItalic.ttf b/resources/themes/cura/fonts/OpenSans-BoldItalic.ttf old mode 100644 new mode 100755 diff --git a/resources/themes/cura/fonts/OpenSans-Italic.ttf b/resources/themes/cura/fonts/OpenSans-Italic.ttf old mode 100644 new mode 100755 diff --git a/resources/themes/cura/fonts/OpenSans-Light.ttf b/resources/themes/cura/fonts/OpenSans-Light.ttf old mode 100644 new mode 100755 diff --git a/resources/themes/cura/fonts/OpenSans-LightItalic.ttf b/resources/themes/cura/fonts/OpenSans-LightItalic.ttf old mode 100644 new mode 100755 diff --git a/resources/themes/cura/fonts/OpenSans-Regular.ttf b/resources/themes/cura/fonts/OpenSans-Regular.ttf old mode 100644 new mode 100755 diff --git a/resources/themes/cura/fonts/OpenSans-Semibold.ttf b/resources/themes/cura/fonts/OpenSans-Semibold.ttf old mode 100644 new mode 100755 diff --git a/resources/themes/cura/fonts/OpenSans-SemiboldItalic.ttf b/resources/themes/cura/fonts/OpenSans-SemiboldItalic.ttf old mode 100644 new mode 100755 diff --git a/resources/themes/cura/icons/application.svg b/resources/themes/cura/icons/application.svg old mode 100644 new mode 100755 diff --git a/resources/themes/cura/icons/arrow_bottom.svg b/resources/themes/cura/icons/arrow_bottom.svg old mode 100644 new mode 100755 diff --git a/resources/themes/cura/icons/arrow_left.svg b/resources/themes/cura/icons/arrow_left.svg old mode 100644 new mode 100755 diff --git a/resources/themes/cura/icons/arrow_right.svg b/resources/themes/cura/icons/arrow_right.svg old mode 100644 new mode 100755 diff --git a/resources/themes/cura/icons/arrow_top.svg b/resources/themes/cura/icons/arrow_top.svg old mode 100644 new mode 100755 diff --git a/resources/themes/cura/icons/basic.svg b/resources/themes/cura/icons/basic.svg old mode 100644 new mode 100755 diff --git a/resources/themes/cura/icons/category_adhesion.svg b/resources/themes/cura/icons/category_adhesion.svg old mode 100644 new mode 100755 diff --git a/resources/themes/cura/icons/category_blackmagic.svg b/resources/themes/cura/icons/category_blackmagic.svg old mode 100644 new mode 100755 diff --git a/resources/themes/cura/icons/category_cool.svg b/resources/themes/cura/icons/category_cool.svg old mode 100644 new mode 100755 diff --git a/resources/themes/cura/icons/category_dual.svg b/resources/themes/cura/icons/category_dual.svg old mode 100644 new mode 100755 diff --git a/resources/themes/cura/icons/category_experimental.svg b/resources/themes/cura/icons/category_experimental.svg old mode 100644 new mode 100755 diff --git a/resources/themes/cura/icons/category_fixes.svg b/resources/themes/cura/icons/category_fixes.svg old mode 100644 new mode 100755 diff --git a/resources/themes/cura/icons/category_infill.svg b/resources/themes/cura/icons/category_infill.svg old mode 100644 new mode 100755 diff --git a/resources/themes/cura/icons/category_layer_height.svg b/resources/themes/cura/icons/category_layer_height.svg old mode 100644 new mode 100755 diff --git a/resources/themes/cura/icons/category_machine.svg b/resources/themes/cura/icons/category_machine.svg old mode 100644 new mode 100755 diff --git a/resources/themes/cura/icons/category_material.svg b/resources/themes/cura/icons/category_material.svg old mode 100644 new mode 100755 diff --git a/resources/themes/cura/icons/category_shell.svg b/resources/themes/cura/icons/category_shell.svg old mode 100644 new mode 100755 diff --git a/resources/themes/cura/icons/category_shield.svg b/resources/themes/cura/icons/category_shield.svg old mode 100644 new mode 100755 diff --git a/resources/themes/cura/icons/category_speed.svg b/resources/themes/cura/icons/category_speed.svg old mode 100644 new mode 100755 diff --git a/resources/themes/cura/icons/category_support.svg b/resources/themes/cura/icons/category_support.svg old mode 100644 new mode 100755 diff --git a/resources/themes/cura/icons/category_travel.svg b/resources/themes/cura/icons/category_travel.svg old mode 100644 new mode 100755 diff --git a/resources/themes/cura/icons/category_unknown.svg b/resources/themes/cura/icons/category_unknown.svg old mode 100644 new mode 100755 diff --git a/resources/themes/cura/icons/check.svg b/resources/themes/cura/icons/check.svg old mode 100644 new mode 100755 diff --git a/resources/themes/cura/icons/cross1.svg b/resources/themes/cura/icons/cross1.svg old mode 100644 new mode 100755 diff --git a/resources/themes/cura/icons/cross2.svg b/resources/themes/cura/icons/cross2.svg old mode 100644 new mode 100755 diff --git a/resources/themes/cura/icons/dense.svg b/resources/themes/cura/icons/dense.svg old mode 100644 new mode 100755 diff --git a/resources/themes/cura/icons/dot.svg b/resources/themes/cura/icons/dot.svg old mode 100644 new mode 100755 diff --git a/resources/themes/cura/icons/hollow.svg b/resources/themes/cura/icons/hollow.svg old mode 100644 new mode 100755 diff --git a/resources/themes/cura/icons/link.svg b/resources/themes/cura/icons/link.svg old mode 100644 new mode 100755 diff --git a/resources/themes/cura/icons/load.svg b/resources/themes/cura/icons/load.svg old mode 100644 new mode 100755 diff --git a/resources/themes/cura/icons/minus.svg b/resources/themes/cura/icons/minus.svg old mode 100644 new mode 100755 diff --git a/resources/themes/cura/icons/mirror.svg b/resources/themes/cura/icons/mirror.svg old mode 100644 new mode 100755 diff --git a/resources/themes/cura/icons/notice.svg b/resources/themes/cura/icons/notice.svg old mode 100644 new mode 100755 diff --git a/resources/themes/cura/icons/pencil.svg b/resources/themes/cura/icons/pencil.svg old mode 100644 new mode 100755 diff --git a/resources/themes/cura/icons/plugin.svg b/resources/themes/cura/icons/plugin.svg old mode 100644 new mode 100755 diff --git a/resources/themes/cura/icons/plus.svg b/resources/themes/cura/icons/plus.svg old mode 100644 new mode 100755 diff --git a/resources/themes/cura/icons/print_time.svg b/resources/themes/cura/icons/print_time.svg old mode 100644 new mode 100755 diff --git a/resources/themes/cura/icons/printsetup.svg b/resources/themes/cura/icons/printsetup.svg old mode 100644 new mode 100755 diff --git a/resources/themes/cura/icons/quick.svg b/resources/themes/cura/icons/quick.svg old mode 100644 new mode 100755 diff --git a/resources/themes/cura/icons/reset.svg b/resources/themes/cura/icons/reset.svg old mode 100644 new mode 100755 diff --git a/resources/themes/cura/icons/rotate.svg b/resources/themes/cura/icons/rotate.svg old mode 100644 new mode 100755 diff --git a/resources/themes/cura/icons/rotate_layflat.svg b/resources/themes/cura/icons/rotate_layflat.svg old mode 100644 new mode 100755 diff --git a/resources/themes/cura/icons/rotate_reset.svg b/resources/themes/cura/icons/rotate_reset.svg old mode 100644 new mode 100755 diff --git a/resources/themes/cura/icons/scale.svg b/resources/themes/cura/icons/scale.svg old mode 100644 new mode 100755 diff --git a/resources/themes/cura/icons/scale_max.svg b/resources/themes/cura/icons/scale_max.svg old mode 100644 new mode 100755 diff --git a/resources/themes/cura/icons/scale_reset.svg b/resources/themes/cura/icons/scale_reset.svg old mode 100644 new mode 100755 diff --git a/resources/themes/cura/icons/setting_per_object.svg b/resources/themes/cura/icons/setting_per_object.svg old mode 100644 new mode 100755 diff --git a/resources/themes/cura/icons/settings.svg b/resources/themes/cura/icons/settings.svg old mode 100644 new mode 100755 diff --git a/resources/themes/cura/icons/solid.svg b/resources/themes/cura/icons/solid.svg old mode 100644 new mode 100755 diff --git a/resources/themes/cura/icons/sparse.svg b/resources/themes/cura/icons/sparse.svg old mode 100644 new mode 100755 diff --git a/resources/themes/cura/icons/star.svg b/resources/themes/cura/icons/star.svg old mode 100644 new mode 100755 diff --git a/resources/themes/cura/icons/tab_monitor.svg b/resources/themes/cura/icons/tab_monitor.svg old mode 100644 new mode 100755 diff --git a/resources/themes/cura/icons/tab_monitor_busy.svg b/resources/themes/cura/icons/tab_monitor_busy.svg old mode 100644 new mode 100755 diff --git a/resources/themes/cura/icons/tab_monitor_connected.svg b/resources/themes/cura/icons/tab_monitor_connected.svg old mode 100644 new mode 100755 diff --git a/resources/themes/cura/icons/tab_monitor_offline.svg b/resources/themes/cura/icons/tab_monitor_offline.svg old mode 100644 new mode 100755 diff --git a/resources/themes/cura/icons/tab_monitor_paused.svg b/resources/themes/cura/icons/tab_monitor_paused.svg old mode 100644 new mode 100755 diff --git a/resources/themes/cura/icons/tab_monitor_stopped.svg b/resources/themes/cura/icons/tab_monitor_stopped.svg old mode 100644 new mode 100755 diff --git a/resources/themes/cura/icons/tab_monitor_unknown.svg b/resources/themes/cura/icons/tab_monitor_unknown.svg old mode 100644 new mode 100755 diff --git a/resources/themes/cura/icons/tab_settings.svg b/resources/themes/cura/icons/tab_settings.svg old mode 100644 new mode 100755 diff --git a/resources/themes/cura/icons/translate.svg b/resources/themes/cura/icons/translate.svg old mode 100644 new mode 100755 diff --git a/resources/themes/cura/icons/ulti.svg b/resources/themes/cura/icons/ulti.svg old mode 100644 new mode 100755 diff --git a/resources/themes/cura/icons/view_layer.svg b/resources/themes/cura/icons/view_layer.svg old mode 100644 new mode 100755 diff --git a/resources/themes/cura/icons/view_normal.svg b/resources/themes/cura/icons/view_normal.svg old mode 100644 new mode 100755 diff --git a/resources/themes/cura/icons/view_xray.svg b/resources/themes/cura/icons/view_xray.svg old mode 100644 new mode 100755 diff --git a/resources/themes/cura/icons/viewmode.svg b/resources/themes/cura/icons/viewmode.svg old mode 100644 new mode 100755 diff --git a/resources/themes/cura/icons/warning.svg b/resources/themes/cura/icons/warning.svg old mode 100644 new mode 100755 diff --git a/resources/themes/cura/images/logo.svg b/resources/themes/cura/images/logo.svg old mode 100644 new mode 100755 diff --git a/resources/themes/cura/styles.qml b/resources/themes/cura/styles.qml old mode 100644 new mode 100755 diff --git a/resources/themes/cura/theme.json b/resources/themes/cura/theme.json old mode 100644 new mode 100755 diff --git a/resources/variants/ultimaker2_extended_plus_0.25.inst.cfg b/resources/variants/ultimaker2_extended_plus_0.25.inst.cfg old mode 100644 new mode 100755 diff --git a/resources/variants/ultimaker2_extended_plus_0.4.inst.cfg b/resources/variants/ultimaker2_extended_plus_0.4.inst.cfg old mode 100644 new mode 100755 diff --git a/resources/variants/ultimaker2_extended_plus_0.6.inst.cfg b/resources/variants/ultimaker2_extended_plus_0.6.inst.cfg old mode 100644 new mode 100755 diff --git a/resources/variants/ultimaker2_extended_plus_0.8.inst.cfg b/resources/variants/ultimaker2_extended_plus_0.8.inst.cfg old mode 100644 new mode 100755 diff --git a/resources/variants/ultimaker2_plus_0.25.inst.cfg b/resources/variants/ultimaker2_plus_0.25.inst.cfg old mode 100644 new mode 100755 diff --git a/resources/variants/ultimaker2_plus_0.4.inst.cfg b/resources/variants/ultimaker2_plus_0.4.inst.cfg old mode 100644 new mode 100755 diff --git a/resources/variants/ultimaker2_plus_0.6.inst.cfg b/resources/variants/ultimaker2_plus_0.6.inst.cfg old mode 100644 new mode 100755 diff --git a/resources/variants/ultimaker2_plus_0.8.inst.cfg b/resources/variants/ultimaker2_plus_0.8.inst.cfg old mode 100644 new mode 100755 diff --git a/setup.py b/setup.py old mode 100644 new mode 100755 diff --git a/tests/TestMachineAction.py b/tests/TestMachineAction.py old mode 100644 new mode 100755 From 8987aa20485120486fd5b0900106de31ea96e3e2 Mon Sep 17 00:00:00 2001 From: Victor Larchenko Date: Fri, 14 Oct 2016 19:09:44 +0600 Subject: [PATCH 14/75] T466: Revert the previous commit since it messed up the file rights. --- .gitignore | 0 CHANGES | 0 CMakeLists.txt | 0 CPackConfig.cmake | 0 LICENSE | 0 README.md | 0 build.sh | 0 cura.desktop.in | 0 cura.sharedmimeinfo | 0 cura/BuildVolume.py | 0 cura/CameraAnimation.py | 0 cura/CameraImageProvider.py | 0 cura/ConvexHullDecorator.py | 0 cura/ConvexHullNode.py | 0 cura/CrashHandler.py | 0 cura/CuraActions.py | 0 cura/CuraApplication.py | 0 cura/CuraSplashScreen.py | 0 cura/CuraVersion.py.in | 0 cura/Layer.py | 0 cura/LayerData.py | 0 cura/LayerDataBuilder.py | 0 cura/LayerDataDecorator.py | 0 cura/LayerPolygon.py | 0 cura/MachineAction.py | 0 cura/MachineActionManager.py | 0 cura/OneAtATimeIterator.py | 0 cura/PlatformPhysics.py | 0 cura/PlatformPhysicsOperation.py | 0 cura/PrintInformation.py | 0 cura/PrinterOutputDevice.py | 0 cura/ProfileReader.py | 0 cura/ProfileWriter.py | 0 cura/SetParentOperation.py | 0 cura/Settings/ContainerManager.py | 0 cura/Settings/ContainerSettingsModel.py | 0 cura/Settings/CuraContainerRegistry.py | 0 cura/Settings/ExtruderManager.py | 0 cura/Settings/ExtrudersModel.py | 0 cura/Settings/MachineManager.py | 0 cura/Settings/MaterialSettingsVisibilityHandler.py | 0 cura/Settings/QualitySettingsModel.py | 0 cura/Settings/SettingInheritanceManager.py | 0 cura/Settings/SettingOverrideDecorator.py | 0 cura/Settings/__init__.py | 0 cura/ZOffsetDecorator.py | 0 cura/__init__.py | 0 icons/cura-128.png | Bin icons/cura-32.png | Bin icons/cura-48.png | Bin icons/cura-64.png | Bin icons/cura.icns | Bin icons/cura.ico | Bin installer.nsi | 0 plugins/3MFReader/ThreeMFReader.py | 0 plugins/3MFReader/__init__.py | 0 plugins/AutoSave/AutoSave.py | 0 plugins/AutoSave/__init__.py | 0 plugins/ChangeLogPlugin/ChangeLog.py | 0 plugins/ChangeLogPlugin/ChangeLog.qml | 0 plugins/ChangeLogPlugin/ChangeLog.txt | 0 plugins/ChangeLogPlugin/__init__.py | 0 plugins/CuraEngineBackend/Cura.proto | 0 plugins/CuraEngineBackend/CuraEngineBackend.py | 0 plugins/CuraEngineBackend/ProcessGCodeJob.py | 0 plugins/CuraEngineBackend/ProcessSlicedLayersJob.py | 0 plugins/CuraEngineBackend/StartSliceJob.py | 0 plugins/CuraEngineBackend/__init__.py | 0 plugins/CuraProfileReader/CuraProfileReader.py | 0 plugins/CuraProfileReader/__init__.py | 0 plugins/CuraProfileWriter/CuraProfileWriter.py | 0 plugins/CuraProfileWriter/__init__.py | 0 plugins/GCODEReader/GCODEReader.py | 8 +------- plugins/GCODEReader/__init__.py | 0 plugins/GCodeProfileReader/GCodeProfileReader.py | 0 plugins/GCodeProfileReader/__init__.py | 0 plugins/GCodeWriter/GCodeWriter.py | 0 plugins/GCodeWriter/__init__.py | 0 plugins/ImageReader/ConfigUI.qml | 0 plugins/ImageReader/ImageReader.py | 0 plugins/ImageReader/ImageReaderUI.py | 0 plugins/ImageReader/__init__.py | 0 plugins/LayerView/LayerPass.py | 0 plugins/LayerView/LayerView.py | 0 plugins/LayerView/LayerView.qml | 0 plugins/LayerView/LayerViewProxy.py | 0 plugins/LayerView/__init__.py | 0 plugins/LayerView/layerview_composite.shader | 0 plugins/LegacyProfileReader/DictionaryOfDoom.json | 0 plugins/LegacyProfileReader/LegacyProfileReader.py | 0 plugins/LegacyProfileReader/__init__.py | 0 .../MachineSettingsAction/MachineSettingsAction.py | 0 .../MachineSettingsAction/MachineSettingsAction.qml | 0 plugins/MachineSettingsAction/__init__.py | 0 plugins/PerObjectSettingsTool/PerObjectCategory.qml | 0 plugins/PerObjectSettingsTool/PerObjectItem.qml | 0 .../PerObjectSettingVisibilityHandler.py | 0 .../PerObjectSettingsPanel.qml | 0 .../PerObjectSettingsTool/PerObjectSettingsTool.py | 0 plugins/PerObjectSettingsTool/__init__.py | 0 .../LinuxRemovableDrivePlugin.py | 0 .../OSXRemovableDrivePlugin.py | 0 .../RemovableDriveOutputDevice.py | 0 .../RemovableDrivePlugin.py | 0 .../WindowsRemovableDrivePlugin.py | 0 plugins/RemovableDriveOutputDevice/__init__.py | 0 plugins/SolidView/SolidView.py | 0 plugins/SolidView/__init__.py | 0 plugins/USBPrinting/FirmwareUpdateWindow.qml | 0 plugins/USBPrinting/USBPrinterOutputDevice.py | 0 .../USBPrinting/USBPrinterOutputDeviceManager.py | 0 plugins/USBPrinting/__init__.py | 0 plugins/USBPrinting/avr_isp/__init__.py | 0 plugins/USBPrinting/avr_isp/chipDB.py | 0 plugins/USBPrinting/avr_isp/intelHex.py | 0 plugins/USBPrinting/avr_isp/ispBase.py | 0 plugins/USBPrinting/avr_isp/stk500v2.py | 0 .../BedLevelMachineAction.py | 0 .../BedLevelMachineAction.qml | 0 .../UMOCheckupMachineAction.py | 0 .../UMOCheckupMachineAction.qml | 0 .../UltimakerMachineActions/UMOUpgradeSelection.py | 0 .../UMOUpgradeSelectionMachineAction.qml | 0 .../UpgradeFirmwareMachineAction.py | 0 .../UpgradeFirmwareMachineAction.qml | 0 plugins/UltimakerMachineActions/__init__.py | 0 .../VersionUpgrade21to22/MachineInstance.py | 0 .../VersionUpgrade21to22/Preferences.py | 0 .../VersionUpgrade/VersionUpgrade21to22/Profile.py | 0 .../VersionUpgrade21to22/VersionUpgrade21to22.py | 0 .../VersionUpgrade/VersionUpgrade21to22/__init__.py | 0 plugins/X3DReader/X3DReader.py | 0 plugins/X3DReader/__init__.py | 0 plugins/XRayView/XRayPass.py | 0 plugins/XRayView/XRayView.py | 0 plugins/XRayView/__init__.py | 0 plugins/XRayView/xray.shader | 0 plugins/XRayView/xray_composite.shader | 0 plugins/XmlMaterialProfile/XmlMaterialProfile.py | 0 plugins/XmlMaterialProfile/__init__.py | 0 pytest.ini | 0 resources/definitions/bq_hephestos.def.json | 0 resources/definitions/bq_hephestos_2.def.json | 0 resources/definitions/bq_hephestos_xl.def.json | 0 resources/definitions/bq_witbox.def.json | 0 resources/definitions/bq_witbox_2.def.json | 0 resources/definitions/custom.def.json | 0 resources/definitions/fdmextruder.def.json | 0 resources/definitions/fdmprinter.def.json | 0 resources/definitions/grr_neo.def.json | 0 resources/definitions/innovo_inventor.def.json | 0 resources/definitions/kossel_mini.def.json | 0 resources/definitions/m180.def.json | 0 resources/definitions/maker_starter.def.json | 0 .../definitions/mankati_fullscale_xt_plus.def.json | 0 resources/definitions/mendel90.def.json | 0 resources/definitions/printrbot_simple.def.json | 0 resources/definitions/prusa_i3.def.json | 0 resources/definitions/prusa_i3_mk2.def.json | 0 resources/definitions/prusa_i3_xl.def.json | 0 resources/definitions/rigidbot.def.json | 0 resources/definitions/rigidbot_big.def.json | 0 resources/definitions/ultimaker.def.json | 0 resources/definitions/ultimaker2.def.json | 0 resources/definitions/ultimaker2_extended.def.json | 0 .../definitions/ultimaker2_extended_plus.def.json | 0 resources/definitions/ultimaker2_go.def.json | 0 resources/definitions/ultimaker2_plus.def.json | 0 resources/definitions/ultimaker_original.def.json | 0 .../definitions/ultimaker_original_dual.def.json | 0 .../definitions/ultimaker_original_plus.def.json | 0 resources/definitions/uniqbot_one.def.json | 0 .../extruders/ultimaker_original_dual_1st.def.json | 0 .../extruders/ultimaker_original_dual_2nd.def.json | 0 resources/i18n/cura.pot | 0 resources/i18n/de/cura.po | 0 resources/i18n/en/cura.po | 0 resources/i18n/es/cura.po | 0 resources/i18n/fdmextruder.def.json.pot | 0 resources/i18n/fdmprinter.def.json.pot | 0 resources/i18n/fi/cura.po | 0 resources/i18n/fr/cura.po | 0 resources/i18n/it/cura.po | 0 resources/i18n/nl/cura.po | 0 resources/images/MakerStarterbackplate.png | Bin .../images/Ultimaker2ExtendedPlusbackplate.png | Bin resources/images/Ultimaker2Extendedbackplate.png | Bin resources/images/Ultimaker2Gobackplate.png | Bin resources/images/Ultimaker2Plusbackplate.png | Bin resources/images/Ultimaker2backplate.png | Bin resources/images/UltimakerPlusbackplate.png | Bin resources/images/cura-icon.png | Bin resources/images/cura.png | Bin resources/meshes/UltimakerRobot_support.stl | Bin resources/meshes/bq_hephestos_2_platform.stl | Bin resources/meshes/bq_hephestos_platform.stl | Bin resources/meshes/bq_witbox_platform.stl | Bin resources/meshes/grr_neo_platform.stl | Bin resources/meshes/inventor_platform.stl | Bin resources/meshes/kossel_platform.stl | 0 resources/meshes/makerstarter_platform.stl | Bin .../meshes/mankati_fullscale_xt_plus_platform.stl | Bin resources/meshes/mendel90_platform.stl | 0 .../meshes/printrbot_simple_metal_platform.stl | Bin resources/meshes/prusai3_platform.stl | 0 resources/meshes/prusai3_xl_platform.stl | 0 resources/meshes/rigidbot_platform.stl | Bin resources/meshes/rigidbotbig_platform.stl | Bin resources/meshes/ultimaker2_platform.obj | 0 resources/meshes/ultimaker2go_platform.obj | 0 resources/meshes/ultimaker_platform.stl | Bin resources/qml/AboutDialog.qml | 0 resources/qml/Actions.qml | 0 resources/qml/AddMachineDialog.qml | 0 resources/qml/Cura.qml | 0 resources/qml/EngineLog.qml | 0 resources/qml/JobSpecs.qml | 0 resources/qml/MachineAction.qml | 0 resources/qml/Menus/MaterialMenu.qml | 0 resources/qml/Menus/NozzleMenu.qml | 0 resources/qml/Menus/PrinterMenu.qml | 0 resources/qml/Menus/ProfileMenu.qml | 0 resources/qml/Menus/RecentFilesMenu.qml | 0 resources/qml/Menus/ViewMenu.qml | 0 resources/qml/MonitorButton.qml | 0 resources/qml/Preferences/GeneralPage.qml | 0 resources/qml/Preferences/MachinesPage.qml | 0 resources/qml/Preferences/MaterialView.qml | 0 resources/qml/Preferences/MaterialsPage.qml | 0 resources/qml/Preferences/ProfileTab.qml | 0 resources/qml/Preferences/ProfilesPage.qml | 0 resources/qml/Preferences/ReadOnlySpinBox.qml | 0 resources/qml/Preferences/ReadOnlyTextArea.qml | 0 resources/qml/Preferences/ReadOnlyTextField.qml | 0 resources/qml/Preferences/SettingVisibilityPage.qml | 0 resources/qml/PrintMonitor.qml | 0 resources/qml/SaveButton.qml | 0 resources/qml/Settings/SettingCategory.qml | 0 resources/qml/Settings/SettingCheckBox.qml | 0 resources/qml/Settings/SettingComboBox.qml | 0 resources/qml/Settings/SettingExtruder.qml | 0 resources/qml/Settings/SettingItem.qml | 0 resources/qml/Settings/SettingTextField.qml | 0 resources/qml/Settings/SettingUnknown.qml | 0 resources/qml/Settings/SettingView.qml | 0 resources/qml/Sidebar.qml | 0 resources/qml/SidebarAdvanced.qml | 0 resources/qml/SidebarContents.qml | 0 resources/qml/SidebarHeader.qml | 0 resources/qml/SidebarSimple.qml | 0 resources/qml/SidebarTooltip.qml | 0 resources/qml/Toolbar.qml | 0 resources/quality/high.inst.cfg | 0 resources/quality/low.inst.cfg | 0 resources/quality/normal.inst.cfg | 0 .../ultimaker2_plus/pla_0.25_normal.inst.cfg | 0 .../quality/ultimaker2_plus/pla_0.4_fast.inst.cfg | 0 .../quality/ultimaker2_plus/pla_0.4_high.inst.cfg | 0 .../quality/ultimaker2_plus/pla_0.4_normal.inst.cfg | 0 .../quality/ultimaker2_plus/pla_0.6_normal.inst.cfg | 0 .../quality/ultimaker2_plus/pla_0.8_normal.inst.cfg | 0 .../ultimaker2_plus/um2p_abs_0.25_normal.inst.cfg | 0 .../ultimaker2_plus/um2p_abs_0.4_fast.inst.cfg | 0 .../ultimaker2_plus/um2p_abs_0.4_high.inst.cfg | 0 .../ultimaker2_plus/um2p_abs_0.4_normal.inst.cfg | 0 .../ultimaker2_plus/um2p_abs_0.6_normal.inst.cfg | 0 .../ultimaker2_plus/um2p_abs_0.8_normal.inst.cfg | 0 .../ultimaker2_plus/um2p_cpe_0.25_normal.inst.cfg | 0 .../ultimaker2_plus/um2p_cpe_0.4_fast.inst.cfg | 0 .../ultimaker2_plus/um2p_cpe_0.4_high.inst.cfg | 0 .../ultimaker2_plus/um2p_cpe_0.4_normal.inst.cfg | 0 .../ultimaker2_plus/um2p_cpe_0.6_normal.inst.cfg | 0 .../ultimaker2_plus/um2p_cpe_0.8_normal.inst.cfg | 0 .../ultimaker2_plus/um2p_cpep_0.4_draft.inst.cfg | 0 .../ultimaker2_plus/um2p_cpep_0.4_normal.inst.cfg | 0 .../ultimaker2_plus/um2p_cpep_0.6_draft.inst.cfg | 0 .../ultimaker2_plus/um2p_cpep_0.6_normal.inst.cfg | 0 .../ultimaker2_plus/um2p_cpep_0.8_draft.inst.cfg | 0 .../ultimaker2_plus/um2p_cpep_0.8_normal.inst.cfg | 0 .../ultimaker2_plus/um2p_nylon_0.25_high.inst.cfg | 0 .../ultimaker2_plus/um2p_nylon_0.25_normal.inst.cfg | 0 .../ultimaker2_plus/um2p_nylon_0.4_fast.inst.cfg | 0 .../ultimaker2_plus/um2p_nylon_0.4_normal.inst.cfg | 0 .../ultimaker2_plus/um2p_nylon_0.6_fast.inst.cfg | 0 .../ultimaker2_plus/um2p_nylon_0.6_normal.inst.cfg | 0 .../ultimaker2_plus/um2p_nylon_0.8_draft.inst.cfg | 0 .../ultimaker2_plus/um2p_nylon_0.8_normal.inst.cfg | 0 .../ultimaker2_plus/um2p_pc_0.25_high.inst.cfg | 0 .../ultimaker2_plus/um2p_pc_0.25_normal.inst.cfg | 0 .../ultimaker2_plus/um2p_pc_0.4_fast.inst.cfg | 0 .../ultimaker2_plus/um2p_pc_0.4_normal.inst.cfg | 0 .../ultimaker2_plus/um2p_pc_0.6_fast.inst.cfg | 0 .../ultimaker2_plus/um2p_pc_0.6_normal.inst.cfg | 0 .../ultimaker2_plus/um2p_pc_0.8_draft.inst.cfg | 0 .../ultimaker2_plus/um2p_pc_0.8_normal.inst.cfg | 0 .../ultimaker2_plus/um2p_tpu_0.25_high.inst.cfg | 0 .../ultimaker2_plus/um2p_tpu_0.4_normal.inst.cfg | 0 .../ultimaker2_plus/um2p_tpu_0.6_fast.inst.cfg | 0 resources/shaders/grid.shader | 0 resources/shaders/overhang.shader | 0 resources/shaders/striped.shader | 0 resources/shaders/transparent_object.shader | 0 resources/themes/cura/fonts/LICENSE.txt | 0 resources/themes/cura/fonts/OpenSans-Bold.ttf | Bin resources/themes/cura/fonts/OpenSans-BoldItalic.ttf | Bin resources/themes/cura/fonts/OpenSans-Italic.ttf | Bin resources/themes/cura/fonts/OpenSans-Light.ttf | Bin .../themes/cura/fonts/OpenSans-LightItalic.ttf | Bin resources/themes/cura/fonts/OpenSans-Regular.ttf | Bin resources/themes/cura/fonts/OpenSans-Semibold.ttf | Bin .../themes/cura/fonts/OpenSans-SemiboldItalic.ttf | Bin resources/themes/cura/icons/application.svg | 0 resources/themes/cura/icons/arrow_bottom.svg | 0 resources/themes/cura/icons/arrow_left.svg | 0 resources/themes/cura/icons/arrow_right.svg | 0 resources/themes/cura/icons/arrow_top.svg | 0 resources/themes/cura/icons/basic.svg | 0 resources/themes/cura/icons/category_adhesion.svg | 0 resources/themes/cura/icons/category_blackmagic.svg | 0 resources/themes/cura/icons/category_cool.svg | 0 resources/themes/cura/icons/category_dual.svg | 0 .../themes/cura/icons/category_experimental.svg | 0 resources/themes/cura/icons/category_fixes.svg | 0 resources/themes/cura/icons/category_infill.svg | 0 .../themes/cura/icons/category_layer_height.svg | 0 resources/themes/cura/icons/category_machine.svg | 0 resources/themes/cura/icons/category_material.svg | 0 resources/themes/cura/icons/category_shell.svg | 0 resources/themes/cura/icons/category_shield.svg | 0 resources/themes/cura/icons/category_speed.svg | 0 resources/themes/cura/icons/category_support.svg | 0 resources/themes/cura/icons/category_travel.svg | 0 resources/themes/cura/icons/category_unknown.svg | 0 resources/themes/cura/icons/check.svg | 0 resources/themes/cura/icons/cross1.svg | 0 resources/themes/cura/icons/cross2.svg | 0 resources/themes/cura/icons/dense.svg | 0 resources/themes/cura/icons/dot.svg | 0 resources/themes/cura/icons/hollow.svg | 0 resources/themes/cura/icons/link.svg | 0 resources/themes/cura/icons/load.svg | 0 resources/themes/cura/icons/minus.svg | 0 resources/themes/cura/icons/mirror.svg | 0 resources/themes/cura/icons/notice.svg | 0 resources/themes/cura/icons/pencil.svg | 0 resources/themes/cura/icons/plugin.svg | 0 resources/themes/cura/icons/plus.svg | 0 resources/themes/cura/icons/print_time.svg | 0 resources/themes/cura/icons/printsetup.svg | 0 resources/themes/cura/icons/quick.svg | 0 resources/themes/cura/icons/reset.svg | 0 resources/themes/cura/icons/rotate.svg | 0 resources/themes/cura/icons/rotate_layflat.svg | 0 resources/themes/cura/icons/rotate_reset.svg | 0 resources/themes/cura/icons/scale.svg | 0 resources/themes/cura/icons/scale_max.svg | 0 resources/themes/cura/icons/scale_reset.svg | 0 resources/themes/cura/icons/setting_per_object.svg | 0 resources/themes/cura/icons/settings.svg | 0 resources/themes/cura/icons/solid.svg | 0 resources/themes/cura/icons/sparse.svg | 0 resources/themes/cura/icons/star.svg | 0 resources/themes/cura/icons/tab_monitor.svg | 0 resources/themes/cura/icons/tab_monitor_busy.svg | 0 .../themes/cura/icons/tab_monitor_connected.svg | 0 resources/themes/cura/icons/tab_monitor_offline.svg | 0 resources/themes/cura/icons/tab_monitor_paused.svg | 0 resources/themes/cura/icons/tab_monitor_stopped.svg | 0 resources/themes/cura/icons/tab_monitor_unknown.svg | 0 resources/themes/cura/icons/tab_settings.svg | 0 resources/themes/cura/icons/translate.svg | 0 resources/themes/cura/icons/ulti.svg | 0 resources/themes/cura/icons/view_layer.svg | 0 resources/themes/cura/icons/view_normal.svg | 0 resources/themes/cura/icons/view_xray.svg | 0 resources/themes/cura/icons/viewmode.svg | 0 resources/themes/cura/icons/warning.svg | 0 resources/themes/cura/images/logo.svg | 0 resources/themes/cura/styles.qml | 0 resources/themes/cura/theme.json | 0 .../variants/ultimaker2_extended_plus_0.25.inst.cfg | 0 .../variants/ultimaker2_extended_plus_0.4.inst.cfg | 0 .../variants/ultimaker2_extended_plus_0.6.inst.cfg | 0 .../variants/ultimaker2_extended_plus_0.8.inst.cfg | 0 resources/variants/ultimaker2_plus_0.25.inst.cfg | 0 resources/variants/ultimaker2_plus_0.4.inst.cfg | 0 resources/variants/ultimaker2_plus_0.6.inst.cfg | 0 resources/variants/ultimaker2_plus_0.8.inst.cfg | 0 setup.py | 0 tests/TestMachineAction.py | 0 390 files changed, 1 insertion(+), 7 deletions(-) mode change 100755 => 100644 .gitignore mode change 100755 => 100644 CHANGES mode change 100755 => 100644 CMakeLists.txt mode change 100755 => 100644 CPackConfig.cmake mode change 100755 => 100644 LICENSE mode change 100755 => 100644 README.md mode change 100755 => 100644 build.sh mode change 100755 => 100644 cura.desktop.in mode change 100755 => 100644 cura.sharedmimeinfo mode change 100755 => 100644 cura/BuildVolume.py mode change 100755 => 100644 cura/CameraAnimation.py mode change 100755 => 100644 cura/CameraImageProvider.py mode change 100755 => 100644 cura/ConvexHullDecorator.py mode change 100755 => 100644 cura/ConvexHullNode.py mode change 100755 => 100644 cura/CrashHandler.py mode change 100755 => 100644 cura/CuraActions.py mode change 100755 => 100644 cura/CuraApplication.py mode change 100755 => 100644 cura/CuraSplashScreen.py mode change 100755 => 100644 cura/CuraVersion.py.in mode change 100755 => 100644 cura/Layer.py mode change 100755 => 100644 cura/LayerData.py mode change 100755 => 100644 cura/LayerDataBuilder.py mode change 100755 => 100644 cura/LayerDataDecorator.py mode change 100755 => 100644 cura/LayerPolygon.py mode change 100755 => 100644 cura/MachineAction.py mode change 100755 => 100644 cura/MachineActionManager.py mode change 100755 => 100644 cura/OneAtATimeIterator.py mode change 100755 => 100644 cura/PlatformPhysics.py mode change 100755 => 100644 cura/PlatformPhysicsOperation.py mode change 100755 => 100644 cura/PrintInformation.py mode change 100755 => 100644 cura/PrinterOutputDevice.py mode change 100755 => 100644 cura/ProfileReader.py mode change 100755 => 100644 cura/ProfileWriter.py mode change 100755 => 100644 cura/SetParentOperation.py mode change 100755 => 100644 cura/Settings/ContainerManager.py mode change 100755 => 100644 cura/Settings/ContainerSettingsModel.py mode change 100755 => 100644 cura/Settings/CuraContainerRegistry.py mode change 100755 => 100644 cura/Settings/ExtruderManager.py mode change 100755 => 100644 cura/Settings/ExtrudersModel.py mode change 100755 => 100644 cura/Settings/MachineManager.py mode change 100755 => 100644 cura/Settings/MaterialSettingsVisibilityHandler.py mode change 100755 => 100644 cura/Settings/QualitySettingsModel.py mode change 100755 => 100644 cura/Settings/SettingInheritanceManager.py mode change 100755 => 100644 cura/Settings/SettingOverrideDecorator.py mode change 100755 => 100644 cura/Settings/__init__.py mode change 100755 => 100644 cura/ZOffsetDecorator.py mode change 100755 => 100644 cura/__init__.py mode change 100755 => 100644 icons/cura-128.png mode change 100755 => 100644 icons/cura-32.png mode change 100755 => 100644 icons/cura-48.png mode change 100755 => 100644 icons/cura-64.png mode change 100755 => 100644 icons/cura.icns mode change 100755 => 100644 icons/cura.ico mode change 100755 => 100644 installer.nsi mode change 100755 => 100644 plugins/3MFReader/ThreeMFReader.py mode change 100755 => 100644 plugins/3MFReader/__init__.py mode change 100755 => 100644 plugins/AutoSave/AutoSave.py mode change 100755 => 100644 plugins/AutoSave/__init__.py mode change 100755 => 100644 plugins/ChangeLogPlugin/ChangeLog.py mode change 100755 => 100644 plugins/ChangeLogPlugin/ChangeLog.qml mode change 100755 => 100644 plugins/ChangeLogPlugin/ChangeLog.txt mode change 100755 => 100644 plugins/ChangeLogPlugin/__init__.py mode change 100755 => 100644 plugins/CuraEngineBackend/Cura.proto mode change 100755 => 100644 plugins/CuraEngineBackend/CuraEngineBackend.py mode change 100755 => 100644 plugins/CuraEngineBackend/ProcessGCodeJob.py mode change 100755 => 100644 plugins/CuraEngineBackend/ProcessSlicedLayersJob.py mode change 100755 => 100644 plugins/CuraEngineBackend/StartSliceJob.py mode change 100755 => 100644 plugins/CuraEngineBackend/__init__.py mode change 100755 => 100644 plugins/CuraProfileReader/CuraProfileReader.py mode change 100755 => 100644 plugins/CuraProfileReader/__init__.py mode change 100755 => 100644 plugins/CuraProfileWriter/CuraProfileWriter.py mode change 100755 => 100644 plugins/CuraProfileWriter/__init__.py mode change 100755 => 100644 plugins/GCODEReader/GCODEReader.py mode change 100755 => 100644 plugins/GCODEReader/__init__.py mode change 100755 => 100644 plugins/GCodeProfileReader/GCodeProfileReader.py mode change 100755 => 100644 plugins/GCodeProfileReader/__init__.py mode change 100755 => 100644 plugins/GCodeWriter/GCodeWriter.py mode change 100755 => 100644 plugins/GCodeWriter/__init__.py mode change 100755 => 100644 plugins/ImageReader/ConfigUI.qml mode change 100755 => 100644 plugins/ImageReader/ImageReader.py mode change 100755 => 100644 plugins/ImageReader/ImageReaderUI.py mode change 100755 => 100644 plugins/ImageReader/__init__.py mode change 100755 => 100644 plugins/LayerView/LayerPass.py mode change 100755 => 100644 plugins/LayerView/LayerView.py mode change 100755 => 100644 plugins/LayerView/LayerView.qml mode change 100755 => 100644 plugins/LayerView/LayerViewProxy.py mode change 100755 => 100644 plugins/LayerView/__init__.py mode change 100755 => 100644 plugins/LayerView/layerview_composite.shader mode change 100755 => 100644 plugins/LegacyProfileReader/DictionaryOfDoom.json mode change 100755 => 100644 plugins/LegacyProfileReader/LegacyProfileReader.py mode change 100755 => 100644 plugins/LegacyProfileReader/__init__.py mode change 100755 => 100644 plugins/MachineSettingsAction/MachineSettingsAction.py mode change 100755 => 100644 plugins/MachineSettingsAction/MachineSettingsAction.qml mode change 100755 => 100644 plugins/MachineSettingsAction/__init__.py mode change 100755 => 100644 plugins/PerObjectSettingsTool/PerObjectCategory.qml mode change 100755 => 100644 plugins/PerObjectSettingsTool/PerObjectItem.qml mode change 100755 => 100644 plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py mode change 100755 => 100644 plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml mode change 100755 => 100644 plugins/PerObjectSettingsTool/PerObjectSettingsTool.py mode change 100755 => 100644 plugins/PerObjectSettingsTool/__init__.py mode change 100755 => 100644 plugins/RemovableDriveOutputDevice/LinuxRemovableDrivePlugin.py mode change 100755 => 100644 plugins/RemovableDriveOutputDevice/OSXRemovableDrivePlugin.py mode change 100755 => 100644 plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py mode change 100755 => 100644 plugins/RemovableDriveOutputDevice/RemovableDrivePlugin.py mode change 100755 => 100644 plugins/RemovableDriveOutputDevice/WindowsRemovableDrivePlugin.py mode change 100755 => 100644 plugins/RemovableDriveOutputDevice/__init__.py mode change 100755 => 100644 plugins/SolidView/SolidView.py mode change 100755 => 100644 plugins/SolidView/__init__.py mode change 100755 => 100644 plugins/USBPrinting/FirmwareUpdateWindow.qml mode change 100755 => 100644 plugins/USBPrinting/USBPrinterOutputDevice.py mode change 100755 => 100644 plugins/USBPrinting/USBPrinterOutputDeviceManager.py mode change 100755 => 100644 plugins/USBPrinting/__init__.py mode change 100755 => 100644 plugins/USBPrinting/avr_isp/__init__.py mode change 100755 => 100644 plugins/USBPrinting/avr_isp/chipDB.py mode change 100755 => 100644 plugins/USBPrinting/avr_isp/intelHex.py mode change 100755 => 100644 plugins/USBPrinting/avr_isp/ispBase.py mode change 100755 => 100644 plugins/USBPrinting/avr_isp/stk500v2.py mode change 100755 => 100644 plugins/UltimakerMachineActions/BedLevelMachineAction.py mode change 100755 => 100644 plugins/UltimakerMachineActions/BedLevelMachineAction.qml mode change 100755 => 100644 plugins/UltimakerMachineActions/UMOCheckupMachineAction.py mode change 100755 => 100644 plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml mode change 100755 => 100644 plugins/UltimakerMachineActions/UMOUpgradeSelection.py mode change 100755 => 100644 plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml mode change 100755 => 100644 plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.py mode change 100755 => 100644 plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml mode change 100755 => 100644 plugins/UltimakerMachineActions/__init__.py mode change 100755 => 100644 plugins/VersionUpgrade/VersionUpgrade21to22/MachineInstance.py mode change 100755 => 100644 plugins/VersionUpgrade/VersionUpgrade21to22/Preferences.py mode change 100755 => 100644 plugins/VersionUpgrade/VersionUpgrade21to22/Profile.py mode change 100755 => 100644 plugins/VersionUpgrade/VersionUpgrade21to22/VersionUpgrade21to22.py mode change 100755 => 100644 plugins/VersionUpgrade/VersionUpgrade21to22/__init__.py mode change 100755 => 100644 plugins/X3DReader/X3DReader.py mode change 100755 => 100644 plugins/X3DReader/__init__.py mode change 100755 => 100644 plugins/XRayView/XRayPass.py mode change 100755 => 100644 plugins/XRayView/XRayView.py mode change 100755 => 100644 plugins/XRayView/__init__.py mode change 100755 => 100644 plugins/XRayView/xray.shader mode change 100755 => 100644 plugins/XRayView/xray_composite.shader mode change 100755 => 100644 plugins/XmlMaterialProfile/XmlMaterialProfile.py mode change 100755 => 100644 plugins/XmlMaterialProfile/__init__.py mode change 100755 => 100644 pytest.ini mode change 100755 => 100644 resources/definitions/bq_hephestos.def.json mode change 100755 => 100644 resources/definitions/bq_hephestos_2.def.json mode change 100755 => 100644 resources/definitions/bq_hephestos_xl.def.json mode change 100755 => 100644 resources/definitions/bq_witbox.def.json mode change 100755 => 100644 resources/definitions/bq_witbox_2.def.json mode change 100755 => 100644 resources/definitions/custom.def.json mode change 100755 => 100644 resources/definitions/fdmextruder.def.json mode change 100755 => 100644 resources/definitions/fdmprinter.def.json mode change 100755 => 100644 resources/definitions/grr_neo.def.json mode change 100755 => 100644 resources/definitions/innovo_inventor.def.json mode change 100755 => 100644 resources/definitions/kossel_mini.def.json mode change 100755 => 100644 resources/definitions/m180.def.json mode change 100755 => 100644 resources/definitions/maker_starter.def.json mode change 100755 => 100644 resources/definitions/mankati_fullscale_xt_plus.def.json mode change 100755 => 100644 resources/definitions/mendel90.def.json mode change 100755 => 100644 resources/definitions/printrbot_simple.def.json mode change 100755 => 100644 resources/definitions/prusa_i3.def.json mode change 100755 => 100644 resources/definitions/prusa_i3_mk2.def.json mode change 100755 => 100644 resources/definitions/prusa_i3_xl.def.json mode change 100755 => 100644 resources/definitions/rigidbot.def.json mode change 100755 => 100644 resources/definitions/rigidbot_big.def.json mode change 100755 => 100644 resources/definitions/ultimaker.def.json mode change 100755 => 100644 resources/definitions/ultimaker2.def.json mode change 100755 => 100644 resources/definitions/ultimaker2_extended.def.json mode change 100755 => 100644 resources/definitions/ultimaker2_extended_plus.def.json mode change 100755 => 100644 resources/definitions/ultimaker2_go.def.json mode change 100755 => 100644 resources/definitions/ultimaker2_plus.def.json mode change 100755 => 100644 resources/definitions/ultimaker_original.def.json mode change 100755 => 100644 resources/definitions/ultimaker_original_dual.def.json mode change 100755 => 100644 resources/definitions/ultimaker_original_plus.def.json mode change 100755 => 100644 resources/definitions/uniqbot_one.def.json mode change 100755 => 100644 resources/extruders/ultimaker_original_dual_1st.def.json mode change 100755 => 100644 resources/extruders/ultimaker_original_dual_2nd.def.json mode change 100755 => 100644 resources/i18n/cura.pot mode change 100755 => 100644 resources/i18n/de/cura.po mode change 100755 => 100644 resources/i18n/en/cura.po mode change 100755 => 100644 resources/i18n/es/cura.po mode change 100755 => 100644 resources/i18n/fdmextruder.def.json.pot mode change 100755 => 100644 resources/i18n/fdmprinter.def.json.pot mode change 100755 => 100644 resources/i18n/fi/cura.po mode change 100755 => 100644 resources/i18n/fr/cura.po mode change 100755 => 100644 resources/i18n/it/cura.po mode change 100755 => 100644 resources/i18n/nl/cura.po mode change 100755 => 100644 resources/images/MakerStarterbackplate.png mode change 100755 => 100644 resources/images/Ultimaker2ExtendedPlusbackplate.png mode change 100755 => 100644 resources/images/Ultimaker2Extendedbackplate.png mode change 100755 => 100644 resources/images/Ultimaker2Gobackplate.png mode change 100755 => 100644 resources/images/Ultimaker2Plusbackplate.png mode change 100755 => 100644 resources/images/Ultimaker2backplate.png mode change 100755 => 100644 resources/images/UltimakerPlusbackplate.png mode change 100755 => 100644 resources/images/cura-icon.png mode change 100755 => 100644 resources/images/cura.png mode change 100755 => 100644 resources/meshes/UltimakerRobot_support.stl mode change 100755 => 100644 resources/meshes/bq_hephestos_2_platform.stl mode change 100755 => 100644 resources/meshes/bq_hephestos_platform.stl mode change 100755 => 100644 resources/meshes/bq_witbox_platform.stl mode change 100755 => 100644 resources/meshes/grr_neo_platform.stl mode change 100755 => 100644 resources/meshes/inventor_platform.stl mode change 100755 => 100644 resources/meshes/kossel_platform.stl mode change 100755 => 100644 resources/meshes/makerstarter_platform.stl mode change 100755 => 100644 resources/meshes/mankati_fullscale_xt_plus_platform.stl mode change 100755 => 100644 resources/meshes/mendel90_platform.stl mode change 100755 => 100644 resources/meshes/printrbot_simple_metal_platform.stl mode change 100755 => 100644 resources/meshes/prusai3_platform.stl mode change 100755 => 100644 resources/meshes/prusai3_xl_platform.stl mode change 100755 => 100644 resources/meshes/rigidbot_platform.stl mode change 100755 => 100644 resources/meshes/rigidbotbig_platform.stl mode change 100755 => 100644 resources/meshes/ultimaker2_platform.obj mode change 100755 => 100644 resources/meshes/ultimaker2go_platform.obj mode change 100755 => 100644 resources/meshes/ultimaker_platform.stl mode change 100755 => 100644 resources/qml/AboutDialog.qml mode change 100755 => 100644 resources/qml/Actions.qml mode change 100755 => 100644 resources/qml/AddMachineDialog.qml mode change 100755 => 100644 resources/qml/Cura.qml mode change 100755 => 100644 resources/qml/EngineLog.qml mode change 100755 => 100644 resources/qml/JobSpecs.qml mode change 100755 => 100644 resources/qml/MachineAction.qml mode change 100755 => 100644 resources/qml/Menus/MaterialMenu.qml mode change 100755 => 100644 resources/qml/Menus/NozzleMenu.qml mode change 100755 => 100644 resources/qml/Menus/PrinterMenu.qml mode change 100755 => 100644 resources/qml/Menus/ProfileMenu.qml mode change 100755 => 100644 resources/qml/Menus/RecentFilesMenu.qml mode change 100755 => 100644 resources/qml/Menus/ViewMenu.qml mode change 100755 => 100644 resources/qml/MonitorButton.qml mode change 100755 => 100644 resources/qml/Preferences/GeneralPage.qml mode change 100755 => 100644 resources/qml/Preferences/MachinesPage.qml mode change 100755 => 100644 resources/qml/Preferences/MaterialView.qml mode change 100755 => 100644 resources/qml/Preferences/MaterialsPage.qml mode change 100755 => 100644 resources/qml/Preferences/ProfileTab.qml mode change 100755 => 100644 resources/qml/Preferences/ProfilesPage.qml mode change 100755 => 100644 resources/qml/Preferences/ReadOnlySpinBox.qml mode change 100755 => 100644 resources/qml/Preferences/ReadOnlyTextArea.qml mode change 100755 => 100644 resources/qml/Preferences/ReadOnlyTextField.qml mode change 100755 => 100644 resources/qml/Preferences/SettingVisibilityPage.qml mode change 100755 => 100644 resources/qml/PrintMonitor.qml mode change 100755 => 100644 resources/qml/SaveButton.qml mode change 100755 => 100644 resources/qml/Settings/SettingCategory.qml mode change 100755 => 100644 resources/qml/Settings/SettingCheckBox.qml mode change 100755 => 100644 resources/qml/Settings/SettingComboBox.qml mode change 100755 => 100644 resources/qml/Settings/SettingExtruder.qml mode change 100755 => 100644 resources/qml/Settings/SettingItem.qml mode change 100755 => 100644 resources/qml/Settings/SettingTextField.qml mode change 100755 => 100644 resources/qml/Settings/SettingUnknown.qml mode change 100755 => 100644 resources/qml/Settings/SettingView.qml mode change 100755 => 100644 resources/qml/Sidebar.qml mode change 100755 => 100644 resources/qml/SidebarAdvanced.qml mode change 100755 => 100644 resources/qml/SidebarContents.qml mode change 100755 => 100644 resources/qml/SidebarHeader.qml mode change 100755 => 100644 resources/qml/SidebarSimple.qml mode change 100755 => 100644 resources/qml/SidebarTooltip.qml mode change 100755 => 100644 resources/qml/Toolbar.qml mode change 100755 => 100644 resources/quality/high.inst.cfg mode change 100755 => 100644 resources/quality/low.inst.cfg mode change 100755 => 100644 resources/quality/normal.inst.cfg mode change 100755 => 100644 resources/quality/ultimaker2_plus/pla_0.25_normal.inst.cfg mode change 100755 => 100644 resources/quality/ultimaker2_plus/pla_0.4_fast.inst.cfg mode change 100755 => 100644 resources/quality/ultimaker2_plus/pla_0.4_high.inst.cfg mode change 100755 => 100644 resources/quality/ultimaker2_plus/pla_0.4_normal.inst.cfg mode change 100755 => 100644 resources/quality/ultimaker2_plus/pla_0.6_normal.inst.cfg mode change 100755 => 100644 resources/quality/ultimaker2_plus/pla_0.8_normal.inst.cfg mode change 100755 => 100644 resources/quality/ultimaker2_plus/um2p_abs_0.25_normal.inst.cfg mode change 100755 => 100644 resources/quality/ultimaker2_plus/um2p_abs_0.4_fast.inst.cfg mode change 100755 => 100644 resources/quality/ultimaker2_plus/um2p_abs_0.4_high.inst.cfg mode change 100755 => 100644 resources/quality/ultimaker2_plus/um2p_abs_0.4_normal.inst.cfg mode change 100755 => 100644 resources/quality/ultimaker2_plus/um2p_abs_0.6_normal.inst.cfg mode change 100755 => 100644 resources/quality/ultimaker2_plus/um2p_abs_0.8_normal.inst.cfg mode change 100755 => 100644 resources/quality/ultimaker2_plus/um2p_cpe_0.25_normal.inst.cfg mode change 100755 => 100644 resources/quality/ultimaker2_plus/um2p_cpe_0.4_fast.inst.cfg mode change 100755 => 100644 resources/quality/ultimaker2_plus/um2p_cpe_0.4_high.inst.cfg mode change 100755 => 100644 resources/quality/ultimaker2_plus/um2p_cpe_0.4_normal.inst.cfg mode change 100755 => 100644 resources/quality/ultimaker2_plus/um2p_cpe_0.6_normal.inst.cfg mode change 100755 => 100644 resources/quality/ultimaker2_plus/um2p_cpe_0.8_normal.inst.cfg mode change 100755 => 100644 resources/quality/ultimaker2_plus/um2p_cpep_0.4_draft.inst.cfg mode change 100755 => 100644 resources/quality/ultimaker2_plus/um2p_cpep_0.4_normal.inst.cfg mode change 100755 => 100644 resources/quality/ultimaker2_plus/um2p_cpep_0.6_draft.inst.cfg mode change 100755 => 100644 resources/quality/ultimaker2_plus/um2p_cpep_0.6_normal.inst.cfg mode change 100755 => 100644 resources/quality/ultimaker2_plus/um2p_cpep_0.8_draft.inst.cfg mode change 100755 => 100644 resources/quality/ultimaker2_plus/um2p_cpep_0.8_normal.inst.cfg mode change 100755 => 100644 resources/quality/ultimaker2_plus/um2p_nylon_0.25_high.inst.cfg mode change 100755 => 100644 resources/quality/ultimaker2_plus/um2p_nylon_0.25_normal.inst.cfg mode change 100755 => 100644 resources/quality/ultimaker2_plus/um2p_nylon_0.4_fast.inst.cfg mode change 100755 => 100644 resources/quality/ultimaker2_plus/um2p_nylon_0.4_normal.inst.cfg mode change 100755 => 100644 resources/quality/ultimaker2_plus/um2p_nylon_0.6_fast.inst.cfg mode change 100755 => 100644 resources/quality/ultimaker2_plus/um2p_nylon_0.6_normal.inst.cfg mode change 100755 => 100644 resources/quality/ultimaker2_plus/um2p_nylon_0.8_draft.inst.cfg mode change 100755 => 100644 resources/quality/ultimaker2_plus/um2p_nylon_0.8_normal.inst.cfg mode change 100755 => 100644 resources/quality/ultimaker2_plus/um2p_pc_0.25_high.inst.cfg mode change 100755 => 100644 resources/quality/ultimaker2_plus/um2p_pc_0.25_normal.inst.cfg mode change 100755 => 100644 resources/quality/ultimaker2_plus/um2p_pc_0.4_fast.inst.cfg mode change 100755 => 100644 resources/quality/ultimaker2_plus/um2p_pc_0.4_normal.inst.cfg mode change 100755 => 100644 resources/quality/ultimaker2_plus/um2p_pc_0.6_fast.inst.cfg mode change 100755 => 100644 resources/quality/ultimaker2_plus/um2p_pc_0.6_normal.inst.cfg mode change 100755 => 100644 resources/quality/ultimaker2_plus/um2p_pc_0.8_draft.inst.cfg mode change 100755 => 100644 resources/quality/ultimaker2_plus/um2p_pc_0.8_normal.inst.cfg mode change 100755 => 100644 resources/quality/ultimaker2_plus/um2p_tpu_0.25_high.inst.cfg mode change 100755 => 100644 resources/quality/ultimaker2_plus/um2p_tpu_0.4_normal.inst.cfg mode change 100755 => 100644 resources/quality/ultimaker2_plus/um2p_tpu_0.6_fast.inst.cfg mode change 100755 => 100644 resources/shaders/grid.shader mode change 100755 => 100644 resources/shaders/overhang.shader mode change 100755 => 100644 resources/shaders/striped.shader mode change 100755 => 100644 resources/shaders/transparent_object.shader mode change 100755 => 100644 resources/themes/cura/fonts/LICENSE.txt mode change 100755 => 100644 resources/themes/cura/fonts/OpenSans-Bold.ttf mode change 100755 => 100644 resources/themes/cura/fonts/OpenSans-BoldItalic.ttf mode change 100755 => 100644 resources/themes/cura/fonts/OpenSans-Italic.ttf mode change 100755 => 100644 resources/themes/cura/fonts/OpenSans-Light.ttf mode change 100755 => 100644 resources/themes/cura/fonts/OpenSans-LightItalic.ttf mode change 100755 => 100644 resources/themes/cura/fonts/OpenSans-Regular.ttf mode change 100755 => 100644 resources/themes/cura/fonts/OpenSans-Semibold.ttf mode change 100755 => 100644 resources/themes/cura/fonts/OpenSans-SemiboldItalic.ttf mode change 100755 => 100644 resources/themes/cura/icons/application.svg mode change 100755 => 100644 resources/themes/cura/icons/arrow_bottom.svg mode change 100755 => 100644 resources/themes/cura/icons/arrow_left.svg mode change 100755 => 100644 resources/themes/cura/icons/arrow_right.svg mode change 100755 => 100644 resources/themes/cura/icons/arrow_top.svg mode change 100755 => 100644 resources/themes/cura/icons/basic.svg mode change 100755 => 100644 resources/themes/cura/icons/category_adhesion.svg mode change 100755 => 100644 resources/themes/cura/icons/category_blackmagic.svg mode change 100755 => 100644 resources/themes/cura/icons/category_cool.svg mode change 100755 => 100644 resources/themes/cura/icons/category_dual.svg mode change 100755 => 100644 resources/themes/cura/icons/category_experimental.svg mode change 100755 => 100644 resources/themes/cura/icons/category_fixes.svg mode change 100755 => 100644 resources/themes/cura/icons/category_infill.svg mode change 100755 => 100644 resources/themes/cura/icons/category_layer_height.svg mode change 100755 => 100644 resources/themes/cura/icons/category_machine.svg mode change 100755 => 100644 resources/themes/cura/icons/category_material.svg mode change 100755 => 100644 resources/themes/cura/icons/category_shell.svg mode change 100755 => 100644 resources/themes/cura/icons/category_shield.svg mode change 100755 => 100644 resources/themes/cura/icons/category_speed.svg mode change 100755 => 100644 resources/themes/cura/icons/category_support.svg mode change 100755 => 100644 resources/themes/cura/icons/category_travel.svg mode change 100755 => 100644 resources/themes/cura/icons/category_unknown.svg mode change 100755 => 100644 resources/themes/cura/icons/check.svg mode change 100755 => 100644 resources/themes/cura/icons/cross1.svg mode change 100755 => 100644 resources/themes/cura/icons/cross2.svg mode change 100755 => 100644 resources/themes/cura/icons/dense.svg mode change 100755 => 100644 resources/themes/cura/icons/dot.svg mode change 100755 => 100644 resources/themes/cura/icons/hollow.svg mode change 100755 => 100644 resources/themes/cura/icons/link.svg mode change 100755 => 100644 resources/themes/cura/icons/load.svg mode change 100755 => 100644 resources/themes/cura/icons/minus.svg mode change 100755 => 100644 resources/themes/cura/icons/mirror.svg mode change 100755 => 100644 resources/themes/cura/icons/notice.svg mode change 100755 => 100644 resources/themes/cura/icons/pencil.svg mode change 100755 => 100644 resources/themes/cura/icons/plugin.svg mode change 100755 => 100644 resources/themes/cura/icons/plus.svg mode change 100755 => 100644 resources/themes/cura/icons/print_time.svg mode change 100755 => 100644 resources/themes/cura/icons/printsetup.svg mode change 100755 => 100644 resources/themes/cura/icons/quick.svg mode change 100755 => 100644 resources/themes/cura/icons/reset.svg mode change 100755 => 100644 resources/themes/cura/icons/rotate.svg mode change 100755 => 100644 resources/themes/cura/icons/rotate_layflat.svg mode change 100755 => 100644 resources/themes/cura/icons/rotate_reset.svg mode change 100755 => 100644 resources/themes/cura/icons/scale.svg mode change 100755 => 100644 resources/themes/cura/icons/scale_max.svg mode change 100755 => 100644 resources/themes/cura/icons/scale_reset.svg mode change 100755 => 100644 resources/themes/cura/icons/setting_per_object.svg mode change 100755 => 100644 resources/themes/cura/icons/settings.svg mode change 100755 => 100644 resources/themes/cura/icons/solid.svg mode change 100755 => 100644 resources/themes/cura/icons/sparse.svg mode change 100755 => 100644 resources/themes/cura/icons/star.svg mode change 100755 => 100644 resources/themes/cura/icons/tab_monitor.svg mode change 100755 => 100644 resources/themes/cura/icons/tab_monitor_busy.svg mode change 100755 => 100644 resources/themes/cura/icons/tab_monitor_connected.svg mode change 100755 => 100644 resources/themes/cura/icons/tab_monitor_offline.svg mode change 100755 => 100644 resources/themes/cura/icons/tab_monitor_paused.svg mode change 100755 => 100644 resources/themes/cura/icons/tab_monitor_stopped.svg mode change 100755 => 100644 resources/themes/cura/icons/tab_monitor_unknown.svg mode change 100755 => 100644 resources/themes/cura/icons/tab_settings.svg mode change 100755 => 100644 resources/themes/cura/icons/translate.svg mode change 100755 => 100644 resources/themes/cura/icons/ulti.svg mode change 100755 => 100644 resources/themes/cura/icons/view_layer.svg mode change 100755 => 100644 resources/themes/cura/icons/view_normal.svg mode change 100755 => 100644 resources/themes/cura/icons/view_xray.svg mode change 100755 => 100644 resources/themes/cura/icons/viewmode.svg mode change 100755 => 100644 resources/themes/cura/icons/warning.svg mode change 100755 => 100644 resources/themes/cura/images/logo.svg mode change 100755 => 100644 resources/themes/cura/styles.qml mode change 100755 => 100644 resources/themes/cura/theme.json mode change 100755 => 100644 resources/variants/ultimaker2_extended_plus_0.25.inst.cfg mode change 100755 => 100644 resources/variants/ultimaker2_extended_plus_0.4.inst.cfg mode change 100755 => 100644 resources/variants/ultimaker2_extended_plus_0.6.inst.cfg mode change 100755 => 100644 resources/variants/ultimaker2_extended_plus_0.8.inst.cfg mode change 100755 => 100644 resources/variants/ultimaker2_plus_0.25.inst.cfg mode change 100755 => 100644 resources/variants/ultimaker2_plus_0.4.inst.cfg mode change 100755 => 100644 resources/variants/ultimaker2_plus_0.6.inst.cfg mode change 100755 => 100644 resources/variants/ultimaker2_plus_0.8.inst.cfg mode change 100755 => 100644 setup.py mode change 100755 => 100644 tests/TestMachineAction.py diff --git a/.gitignore b/.gitignore old mode 100755 new mode 100644 diff --git a/CHANGES b/CHANGES old mode 100755 new mode 100644 diff --git a/CMakeLists.txt b/CMakeLists.txt old mode 100755 new mode 100644 diff --git a/CPackConfig.cmake b/CPackConfig.cmake old mode 100755 new mode 100644 diff --git a/LICENSE b/LICENSE old mode 100755 new mode 100644 diff --git a/README.md b/README.md old mode 100755 new mode 100644 diff --git a/build.sh b/build.sh old mode 100755 new mode 100644 diff --git a/cura.desktop.in b/cura.desktop.in old mode 100755 new mode 100644 diff --git a/cura.sharedmimeinfo b/cura.sharedmimeinfo old mode 100755 new mode 100644 diff --git a/cura/BuildVolume.py b/cura/BuildVolume.py old mode 100755 new mode 100644 diff --git a/cura/CameraAnimation.py b/cura/CameraAnimation.py old mode 100755 new mode 100644 diff --git a/cura/CameraImageProvider.py b/cura/CameraImageProvider.py old mode 100755 new mode 100644 diff --git a/cura/ConvexHullDecorator.py b/cura/ConvexHullDecorator.py old mode 100755 new mode 100644 diff --git a/cura/ConvexHullNode.py b/cura/ConvexHullNode.py old mode 100755 new mode 100644 diff --git a/cura/CrashHandler.py b/cura/CrashHandler.py old mode 100755 new mode 100644 diff --git a/cura/CuraActions.py b/cura/CuraActions.py old mode 100755 new mode 100644 diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py old mode 100755 new mode 100644 diff --git a/cura/CuraSplashScreen.py b/cura/CuraSplashScreen.py old mode 100755 new mode 100644 diff --git a/cura/CuraVersion.py.in b/cura/CuraVersion.py.in old mode 100755 new mode 100644 diff --git a/cura/Layer.py b/cura/Layer.py old mode 100755 new mode 100644 diff --git a/cura/LayerData.py b/cura/LayerData.py old mode 100755 new mode 100644 diff --git a/cura/LayerDataBuilder.py b/cura/LayerDataBuilder.py old mode 100755 new mode 100644 diff --git a/cura/LayerDataDecorator.py b/cura/LayerDataDecorator.py old mode 100755 new mode 100644 diff --git a/cura/LayerPolygon.py b/cura/LayerPolygon.py old mode 100755 new mode 100644 diff --git a/cura/MachineAction.py b/cura/MachineAction.py old mode 100755 new mode 100644 diff --git a/cura/MachineActionManager.py b/cura/MachineActionManager.py old mode 100755 new mode 100644 diff --git a/cura/OneAtATimeIterator.py b/cura/OneAtATimeIterator.py old mode 100755 new mode 100644 diff --git a/cura/PlatformPhysics.py b/cura/PlatformPhysics.py old mode 100755 new mode 100644 diff --git a/cura/PlatformPhysicsOperation.py b/cura/PlatformPhysicsOperation.py old mode 100755 new mode 100644 diff --git a/cura/PrintInformation.py b/cura/PrintInformation.py old mode 100755 new mode 100644 diff --git a/cura/PrinterOutputDevice.py b/cura/PrinterOutputDevice.py old mode 100755 new mode 100644 diff --git a/cura/ProfileReader.py b/cura/ProfileReader.py old mode 100755 new mode 100644 diff --git a/cura/ProfileWriter.py b/cura/ProfileWriter.py old mode 100755 new mode 100644 diff --git a/cura/SetParentOperation.py b/cura/SetParentOperation.py old mode 100755 new mode 100644 diff --git a/cura/Settings/ContainerManager.py b/cura/Settings/ContainerManager.py old mode 100755 new mode 100644 diff --git a/cura/Settings/ContainerSettingsModel.py b/cura/Settings/ContainerSettingsModel.py old mode 100755 new mode 100644 diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py old mode 100755 new mode 100644 diff --git a/cura/Settings/ExtruderManager.py b/cura/Settings/ExtruderManager.py old mode 100755 new mode 100644 diff --git a/cura/Settings/ExtrudersModel.py b/cura/Settings/ExtrudersModel.py old mode 100755 new mode 100644 diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py old mode 100755 new mode 100644 diff --git a/cura/Settings/MaterialSettingsVisibilityHandler.py b/cura/Settings/MaterialSettingsVisibilityHandler.py old mode 100755 new mode 100644 diff --git a/cura/Settings/QualitySettingsModel.py b/cura/Settings/QualitySettingsModel.py old mode 100755 new mode 100644 diff --git a/cura/Settings/SettingInheritanceManager.py b/cura/Settings/SettingInheritanceManager.py old mode 100755 new mode 100644 diff --git a/cura/Settings/SettingOverrideDecorator.py b/cura/Settings/SettingOverrideDecorator.py old mode 100755 new mode 100644 diff --git a/cura/Settings/__init__.py b/cura/Settings/__init__.py old mode 100755 new mode 100644 diff --git a/cura/ZOffsetDecorator.py b/cura/ZOffsetDecorator.py old mode 100755 new mode 100644 diff --git a/cura/__init__.py b/cura/__init__.py old mode 100755 new mode 100644 diff --git a/icons/cura-128.png b/icons/cura-128.png old mode 100755 new mode 100644 diff --git a/icons/cura-32.png b/icons/cura-32.png old mode 100755 new mode 100644 diff --git a/icons/cura-48.png b/icons/cura-48.png old mode 100755 new mode 100644 diff --git a/icons/cura-64.png b/icons/cura-64.png old mode 100755 new mode 100644 diff --git a/icons/cura.icns b/icons/cura.icns old mode 100755 new mode 100644 diff --git a/icons/cura.ico b/icons/cura.ico old mode 100755 new mode 100644 diff --git a/installer.nsi b/installer.nsi old mode 100755 new mode 100644 diff --git a/plugins/3MFReader/ThreeMFReader.py b/plugins/3MFReader/ThreeMFReader.py old mode 100755 new mode 100644 diff --git a/plugins/3MFReader/__init__.py b/plugins/3MFReader/__init__.py old mode 100755 new mode 100644 diff --git a/plugins/AutoSave/AutoSave.py b/plugins/AutoSave/AutoSave.py old mode 100755 new mode 100644 diff --git a/plugins/AutoSave/__init__.py b/plugins/AutoSave/__init__.py old mode 100755 new mode 100644 diff --git a/plugins/ChangeLogPlugin/ChangeLog.py b/plugins/ChangeLogPlugin/ChangeLog.py old mode 100755 new mode 100644 diff --git a/plugins/ChangeLogPlugin/ChangeLog.qml b/plugins/ChangeLogPlugin/ChangeLog.qml old mode 100755 new mode 100644 diff --git a/plugins/ChangeLogPlugin/ChangeLog.txt b/plugins/ChangeLogPlugin/ChangeLog.txt old mode 100755 new mode 100644 diff --git a/plugins/ChangeLogPlugin/__init__.py b/plugins/ChangeLogPlugin/__init__.py old mode 100755 new mode 100644 diff --git a/plugins/CuraEngineBackend/Cura.proto b/plugins/CuraEngineBackend/Cura.proto old mode 100755 new mode 100644 diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py old mode 100755 new mode 100644 diff --git a/plugins/CuraEngineBackend/ProcessGCodeJob.py b/plugins/CuraEngineBackend/ProcessGCodeJob.py old mode 100755 new mode 100644 diff --git a/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py b/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py old mode 100755 new mode 100644 diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py old mode 100755 new mode 100644 diff --git a/plugins/CuraEngineBackend/__init__.py b/plugins/CuraEngineBackend/__init__.py old mode 100755 new mode 100644 diff --git a/plugins/CuraProfileReader/CuraProfileReader.py b/plugins/CuraProfileReader/CuraProfileReader.py old mode 100755 new mode 100644 diff --git a/plugins/CuraProfileReader/__init__.py b/plugins/CuraProfileReader/__init__.py old mode 100755 new mode 100644 diff --git a/plugins/CuraProfileWriter/CuraProfileWriter.py b/plugins/CuraProfileWriter/CuraProfileWriter.py old mode 100755 new mode 100644 diff --git a/plugins/CuraProfileWriter/__init__.py b/plugins/CuraProfileWriter/__init__.py old mode 100755 new mode 100644 diff --git a/plugins/GCODEReader/GCODEReader.py b/plugins/GCODEReader/GCODEReader.py old mode 100755 new mode 100644 index edc634a091..8305061a59 --- a/plugins/GCODEReader/GCODEReader.py +++ b/plugins/GCODEReader/GCODEReader.py @@ -76,7 +76,7 @@ class GCODEReader(MeshReader): else: backend = Application.getInstance().getBackend() backend._pauseSlicing = True - backend.backendStateChange.emit(3) + backend.backendStateChange.emit(1) Application.getInstance().getPrintInformation()._abbr_machine = "Pre-sliced" Application.getInstance().setHideSettings(True) @@ -116,9 +116,6 @@ class GCODEReader(MeshReader): backend.close() backend.backendStateChange.emit(1) - glist = getattr(Application.getInstance().getController().getScene(), "gcode_list") - glist.clear() - file = open(file_name, "r") layer_data = LayerDataBuilder.LayerDataBuilder() @@ -162,7 +159,6 @@ class GCODEReader(MeshReader): # current_path.append([10, 10, 10]) # while file.readable(): for line in file: - glist.append(line) if len(line) == 0: continue if line[0] == ";": @@ -245,8 +241,6 @@ class GCODEReader(MeshReader): Preferences.getInstance().setValue("cura/jobname_prefix", True) - - view = Application.getInstance().getController().getActiveView() if view.getPluginId() == "LayerView": view.resetLayerData() diff --git a/plugins/GCODEReader/__init__.py b/plugins/GCODEReader/__init__.py old mode 100755 new mode 100644 diff --git a/plugins/GCodeProfileReader/GCodeProfileReader.py b/plugins/GCodeProfileReader/GCodeProfileReader.py old mode 100755 new mode 100644 diff --git a/plugins/GCodeProfileReader/__init__.py b/plugins/GCodeProfileReader/__init__.py old mode 100755 new mode 100644 diff --git a/plugins/GCodeWriter/GCodeWriter.py b/plugins/GCodeWriter/GCodeWriter.py old mode 100755 new mode 100644 diff --git a/plugins/GCodeWriter/__init__.py b/plugins/GCodeWriter/__init__.py old mode 100755 new mode 100644 diff --git a/plugins/ImageReader/ConfigUI.qml b/plugins/ImageReader/ConfigUI.qml old mode 100755 new mode 100644 diff --git a/plugins/ImageReader/ImageReader.py b/plugins/ImageReader/ImageReader.py old mode 100755 new mode 100644 diff --git a/plugins/ImageReader/ImageReaderUI.py b/plugins/ImageReader/ImageReaderUI.py old mode 100755 new mode 100644 diff --git a/plugins/ImageReader/__init__.py b/plugins/ImageReader/__init__.py old mode 100755 new mode 100644 diff --git a/plugins/LayerView/LayerPass.py b/plugins/LayerView/LayerPass.py old mode 100755 new mode 100644 diff --git a/plugins/LayerView/LayerView.py b/plugins/LayerView/LayerView.py old mode 100755 new mode 100644 diff --git a/plugins/LayerView/LayerView.qml b/plugins/LayerView/LayerView.qml old mode 100755 new mode 100644 diff --git a/plugins/LayerView/LayerViewProxy.py b/plugins/LayerView/LayerViewProxy.py old mode 100755 new mode 100644 diff --git a/plugins/LayerView/__init__.py b/plugins/LayerView/__init__.py old mode 100755 new mode 100644 diff --git a/plugins/LayerView/layerview_composite.shader b/plugins/LayerView/layerview_composite.shader old mode 100755 new mode 100644 diff --git a/plugins/LegacyProfileReader/DictionaryOfDoom.json b/plugins/LegacyProfileReader/DictionaryOfDoom.json old mode 100755 new mode 100644 diff --git a/plugins/LegacyProfileReader/LegacyProfileReader.py b/plugins/LegacyProfileReader/LegacyProfileReader.py old mode 100755 new mode 100644 diff --git a/plugins/LegacyProfileReader/__init__.py b/plugins/LegacyProfileReader/__init__.py old mode 100755 new mode 100644 diff --git a/plugins/MachineSettingsAction/MachineSettingsAction.py b/plugins/MachineSettingsAction/MachineSettingsAction.py old mode 100755 new mode 100644 diff --git a/plugins/MachineSettingsAction/MachineSettingsAction.qml b/plugins/MachineSettingsAction/MachineSettingsAction.qml old mode 100755 new mode 100644 diff --git a/plugins/MachineSettingsAction/__init__.py b/plugins/MachineSettingsAction/__init__.py old mode 100755 new mode 100644 diff --git a/plugins/PerObjectSettingsTool/PerObjectCategory.qml b/plugins/PerObjectSettingsTool/PerObjectCategory.qml old mode 100755 new mode 100644 diff --git a/plugins/PerObjectSettingsTool/PerObjectItem.qml b/plugins/PerObjectSettingsTool/PerObjectItem.qml old mode 100755 new mode 100644 diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py b/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py old mode 100755 new mode 100644 diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml old mode 100755 new mode 100644 diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingsTool.py b/plugins/PerObjectSettingsTool/PerObjectSettingsTool.py old mode 100755 new mode 100644 diff --git a/plugins/PerObjectSettingsTool/__init__.py b/plugins/PerObjectSettingsTool/__init__.py old mode 100755 new mode 100644 diff --git a/plugins/RemovableDriveOutputDevice/LinuxRemovableDrivePlugin.py b/plugins/RemovableDriveOutputDevice/LinuxRemovableDrivePlugin.py old mode 100755 new mode 100644 diff --git a/plugins/RemovableDriveOutputDevice/OSXRemovableDrivePlugin.py b/plugins/RemovableDriveOutputDevice/OSXRemovableDrivePlugin.py old mode 100755 new mode 100644 diff --git a/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py b/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py old mode 100755 new mode 100644 diff --git a/plugins/RemovableDriveOutputDevice/RemovableDrivePlugin.py b/plugins/RemovableDriveOutputDevice/RemovableDrivePlugin.py old mode 100755 new mode 100644 diff --git a/plugins/RemovableDriveOutputDevice/WindowsRemovableDrivePlugin.py b/plugins/RemovableDriveOutputDevice/WindowsRemovableDrivePlugin.py old mode 100755 new mode 100644 diff --git a/plugins/RemovableDriveOutputDevice/__init__.py b/plugins/RemovableDriveOutputDevice/__init__.py old mode 100755 new mode 100644 diff --git a/plugins/SolidView/SolidView.py b/plugins/SolidView/SolidView.py old mode 100755 new mode 100644 diff --git a/plugins/SolidView/__init__.py b/plugins/SolidView/__init__.py old mode 100755 new mode 100644 diff --git a/plugins/USBPrinting/FirmwareUpdateWindow.qml b/plugins/USBPrinting/FirmwareUpdateWindow.qml old mode 100755 new mode 100644 diff --git a/plugins/USBPrinting/USBPrinterOutputDevice.py b/plugins/USBPrinting/USBPrinterOutputDevice.py old mode 100755 new mode 100644 diff --git a/plugins/USBPrinting/USBPrinterOutputDeviceManager.py b/plugins/USBPrinting/USBPrinterOutputDeviceManager.py old mode 100755 new mode 100644 diff --git a/plugins/USBPrinting/__init__.py b/plugins/USBPrinting/__init__.py old mode 100755 new mode 100644 diff --git a/plugins/USBPrinting/avr_isp/__init__.py b/plugins/USBPrinting/avr_isp/__init__.py old mode 100755 new mode 100644 diff --git a/plugins/USBPrinting/avr_isp/chipDB.py b/plugins/USBPrinting/avr_isp/chipDB.py old mode 100755 new mode 100644 diff --git a/plugins/USBPrinting/avr_isp/intelHex.py b/plugins/USBPrinting/avr_isp/intelHex.py old mode 100755 new mode 100644 diff --git a/plugins/USBPrinting/avr_isp/ispBase.py b/plugins/USBPrinting/avr_isp/ispBase.py old mode 100755 new mode 100644 diff --git a/plugins/USBPrinting/avr_isp/stk500v2.py b/plugins/USBPrinting/avr_isp/stk500v2.py old mode 100755 new mode 100644 diff --git a/plugins/UltimakerMachineActions/BedLevelMachineAction.py b/plugins/UltimakerMachineActions/BedLevelMachineAction.py old mode 100755 new mode 100644 diff --git a/plugins/UltimakerMachineActions/BedLevelMachineAction.qml b/plugins/UltimakerMachineActions/BedLevelMachineAction.qml old mode 100755 new mode 100644 diff --git a/plugins/UltimakerMachineActions/UMOCheckupMachineAction.py b/plugins/UltimakerMachineActions/UMOCheckupMachineAction.py old mode 100755 new mode 100644 diff --git a/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml b/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml old mode 100755 new mode 100644 diff --git a/plugins/UltimakerMachineActions/UMOUpgradeSelection.py b/plugins/UltimakerMachineActions/UMOUpgradeSelection.py old mode 100755 new mode 100644 diff --git a/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml b/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml old mode 100755 new mode 100644 diff --git a/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.py b/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.py old mode 100755 new mode 100644 diff --git a/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml b/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml old mode 100755 new mode 100644 diff --git a/plugins/UltimakerMachineActions/__init__.py b/plugins/UltimakerMachineActions/__init__.py old mode 100755 new mode 100644 diff --git a/plugins/VersionUpgrade/VersionUpgrade21to22/MachineInstance.py b/plugins/VersionUpgrade/VersionUpgrade21to22/MachineInstance.py old mode 100755 new mode 100644 diff --git a/plugins/VersionUpgrade/VersionUpgrade21to22/Preferences.py b/plugins/VersionUpgrade/VersionUpgrade21to22/Preferences.py old mode 100755 new mode 100644 diff --git a/plugins/VersionUpgrade/VersionUpgrade21to22/Profile.py b/plugins/VersionUpgrade/VersionUpgrade21to22/Profile.py old mode 100755 new mode 100644 diff --git a/plugins/VersionUpgrade/VersionUpgrade21to22/VersionUpgrade21to22.py b/plugins/VersionUpgrade/VersionUpgrade21to22/VersionUpgrade21to22.py old mode 100755 new mode 100644 diff --git a/plugins/VersionUpgrade/VersionUpgrade21to22/__init__.py b/plugins/VersionUpgrade/VersionUpgrade21to22/__init__.py old mode 100755 new mode 100644 diff --git a/plugins/X3DReader/X3DReader.py b/plugins/X3DReader/X3DReader.py old mode 100755 new mode 100644 diff --git a/plugins/X3DReader/__init__.py b/plugins/X3DReader/__init__.py old mode 100755 new mode 100644 diff --git a/plugins/XRayView/XRayPass.py b/plugins/XRayView/XRayPass.py old mode 100755 new mode 100644 diff --git a/plugins/XRayView/XRayView.py b/plugins/XRayView/XRayView.py old mode 100755 new mode 100644 diff --git a/plugins/XRayView/__init__.py b/plugins/XRayView/__init__.py old mode 100755 new mode 100644 diff --git a/plugins/XRayView/xray.shader b/plugins/XRayView/xray.shader old mode 100755 new mode 100644 diff --git a/plugins/XRayView/xray_composite.shader b/plugins/XRayView/xray_composite.shader old mode 100755 new mode 100644 diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py old mode 100755 new mode 100644 diff --git a/plugins/XmlMaterialProfile/__init__.py b/plugins/XmlMaterialProfile/__init__.py old mode 100755 new mode 100644 diff --git a/pytest.ini b/pytest.ini old mode 100755 new mode 100644 diff --git a/resources/definitions/bq_hephestos.def.json b/resources/definitions/bq_hephestos.def.json old mode 100755 new mode 100644 diff --git a/resources/definitions/bq_hephestos_2.def.json b/resources/definitions/bq_hephestos_2.def.json old mode 100755 new mode 100644 diff --git a/resources/definitions/bq_hephestos_xl.def.json b/resources/definitions/bq_hephestos_xl.def.json old mode 100755 new mode 100644 diff --git a/resources/definitions/bq_witbox.def.json b/resources/definitions/bq_witbox.def.json old mode 100755 new mode 100644 diff --git a/resources/definitions/bq_witbox_2.def.json b/resources/definitions/bq_witbox_2.def.json old mode 100755 new mode 100644 diff --git a/resources/definitions/custom.def.json b/resources/definitions/custom.def.json old mode 100755 new mode 100644 diff --git a/resources/definitions/fdmextruder.def.json b/resources/definitions/fdmextruder.def.json old mode 100755 new mode 100644 diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json old mode 100755 new mode 100644 diff --git a/resources/definitions/grr_neo.def.json b/resources/definitions/grr_neo.def.json old mode 100755 new mode 100644 diff --git a/resources/definitions/innovo_inventor.def.json b/resources/definitions/innovo_inventor.def.json old mode 100755 new mode 100644 diff --git a/resources/definitions/kossel_mini.def.json b/resources/definitions/kossel_mini.def.json old mode 100755 new mode 100644 diff --git a/resources/definitions/m180.def.json b/resources/definitions/m180.def.json old mode 100755 new mode 100644 diff --git a/resources/definitions/maker_starter.def.json b/resources/definitions/maker_starter.def.json old mode 100755 new mode 100644 diff --git a/resources/definitions/mankati_fullscale_xt_plus.def.json b/resources/definitions/mankati_fullscale_xt_plus.def.json old mode 100755 new mode 100644 diff --git a/resources/definitions/mendel90.def.json b/resources/definitions/mendel90.def.json old mode 100755 new mode 100644 diff --git a/resources/definitions/printrbot_simple.def.json b/resources/definitions/printrbot_simple.def.json old mode 100755 new mode 100644 diff --git a/resources/definitions/prusa_i3.def.json b/resources/definitions/prusa_i3.def.json old mode 100755 new mode 100644 diff --git a/resources/definitions/prusa_i3_mk2.def.json b/resources/definitions/prusa_i3_mk2.def.json old mode 100755 new mode 100644 diff --git a/resources/definitions/prusa_i3_xl.def.json b/resources/definitions/prusa_i3_xl.def.json old mode 100755 new mode 100644 diff --git a/resources/definitions/rigidbot.def.json b/resources/definitions/rigidbot.def.json old mode 100755 new mode 100644 diff --git a/resources/definitions/rigidbot_big.def.json b/resources/definitions/rigidbot_big.def.json old mode 100755 new mode 100644 diff --git a/resources/definitions/ultimaker.def.json b/resources/definitions/ultimaker.def.json old mode 100755 new mode 100644 diff --git a/resources/definitions/ultimaker2.def.json b/resources/definitions/ultimaker2.def.json old mode 100755 new mode 100644 diff --git a/resources/definitions/ultimaker2_extended.def.json b/resources/definitions/ultimaker2_extended.def.json old mode 100755 new mode 100644 diff --git a/resources/definitions/ultimaker2_extended_plus.def.json b/resources/definitions/ultimaker2_extended_plus.def.json old mode 100755 new mode 100644 diff --git a/resources/definitions/ultimaker2_go.def.json b/resources/definitions/ultimaker2_go.def.json old mode 100755 new mode 100644 diff --git a/resources/definitions/ultimaker2_plus.def.json b/resources/definitions/ultimaker2_plus.def.json old mode 100755 new mode 100644 diff --git a/resources/definitions/ultimaker_original.def.json b/resources/definitions/ultimaker_original.def.json old mode 100755 new mode 100644 diff --git a/resources/definitions/ultimaker_original_dual.def.json b/resources/definitions/ultimaker_original_dual.def.json old mode 100755 new mode 100644 diff --git a/resources/definitions/ultimaker_original_plus.def.json b/resources/definitions/ultimaker_original_plus.def.json old mode 100755 new mode 100644 diff --git a/resources/definitions/uniqbot_one.def.json b/resources/definitions/uniqbot_one.def.json old mode 100755 new mode 100644 diff --git a/resources/extruders/ultimaker_original_dual_1st.def.json b/resources/extruders/ultimaker_original_dual_1st.def.json old mode 100755 new mode 100644 diff --git a/resources/extruders/ultimaker_original_dual_2nd.def.json b/resources/extruders/ultimaker_original_dual_2nd.def.json old mode 100755 new mode 100644 diff --git a/resources/i18n/cura.pot b/resources/i18n/cura.pot old mode 100755 new mode 100644 diff --git a/resources/i18n/de/cura.po b/resources/i18n/de/cura.po old mode 100755 new mode 100644 diff --git a/resources/i18n/en/cura.po b/resources/i18n/en/cura.po old mode 100755 new mode 100644 diff --git a/resources/i18n/es/cura.po b/resources/i18n/es/cura.po old mode 100755 new mode 100644 diff --git a/resources/i18n/fdmextruder.def.json.pot b/resources/i18n/fdmextruder.def.json.pot old mode 100755 new mode 100644 diff --git a/resources/i18n/fdmprinter.def.json.pot b/resources/i18n/fdmprinter.def.json.pot old mode 100755 new mode 100644 diff --git a/resources/i18n/fi/cura.po b/resources/i18n/fi/cura.po old mode 100755 new mode 100644 diff --git a/resources/i18n/fr/cura.po b/resources/i18n/fr/cura.po old mode 100755 new mode 100644 diff --git a/resources/i18n/it/cura.po b/resources/i18n/it/cura.po old mode 100755 new mode 100644 diff --git a/resources/i18n/nl/cura.po b/resources/i18n/nl/cura.po old mode 100755 new mode 100644 diff --git a/resources/images/MakerStarterbackplate.png b/resources/images/MakerStarterbackplate.png old mode 100755 new mode 100644 diff --git a/resources/images/Ultimaker2ExtendedPlusbackplate.png b/resources/images/Ultimaker2ExtendedPlusbackplate.png old mode 100755 new mode 100644 diff --git a/resources/images/Ultimaker2Extendedbackplate.png b/resources/images/Ultimaker2Extendedbackplate.png old mode 100755 new mode 100644 diff --git a/resources/images/Ultimaker2Gobackplate.png b/resources/images/Ultimaker2Gobackplate.png old mode 100755 new mode 100644 diff --git a/resources/images/Ultimaker2Plusbackplate.png b/resources/images/Ultimaker2Plusbackplate.png old mode 100755 new mode 100644 diff --git a/resources/images/Ultimaker2backplate.png b/resources/images/Ultimaker2backplate.png old mode 100755 new mode 100644 diff --git a/resources/images/UltimakerPlusbackplate.png b/resources/images/UltimakerPlusbackplate.png old mode 100755 new mode 100644 diff --git a/resources/images/cura-icon.png b/resources/images/cura-icon.png old mode 100755 new mode 100644 diff --git a/resources/images/cura.png b/resources/images/cura.png old mode 100755 new mode 100644 diff --git a/resources/meshes/UltimakerRobot_support.stl b/resources/meshes/UltimakerRobot_support.stl old mode 100755 new mode 100644 diff --git a/resources/meshes/bq_hephestos_2_platform.stl b/resources/meshes/bq_hephestos_2_platform.stl old mode 100755 new mode 100644 diff --git a/resources/meshes/bq_hephestos_platform.stl b/resources/meshes/bq_hephestos_platform.stl old mode 100755 new mode 100644 diff --git a/resources/meshes/bq_witbox_platform.stl b/resources/meshes/bq_witbox_platform.stl old mode 100755 new mode 100644 diff --git a/resources/meshes/grr_neo_platform.stl b/resources/meshes/grr_neo_platform.stl old mode 100755 new mode 100644 diff --git a/resources/meshes/inventor_platform.stl b/resources/meshes/inventor_platform.stl old mode 100755 new mode 100644 diff --git a/resources/meshes/kossel_platform.stl b/resources/meshes/kossel_platform.stl old mode 100755 new mode 100644 diff --git a/resources/meshes/makerstarter_platform.stl b/resources/meshes/makerstarter_platform.stl old mode 100755 new mode 100644 diff --git a/resources/meshes/mankati_fullscale_xt_plus_platform.stl b/resources/meshes/mankati_fullscale_xt_plus_platform.stl old mode 100755 new mode 100644 diff --git a/resources/meshes/mendel90_platform.stl b/resources/meshes/mendel90_platform.stl old mode 100755 new mode 100644 diff --git a/resources/meshes/printrbot_simple_metal_platform.stl b/resources/meshes/printrbot_simple_metal_platform.stl old mode 100755 new mode 100644 diff --git a/resources/meshes/prusai3_platform.stl b/resources/meshes/prusai3_platform.stl old mode 100755 new mode 100644 diff --git a/resources/meshes/prusai3_xl_platform.stl b/resources/meshes/prusai3_xl_platform.stl old mode 100755 new mode 100644 diff --git a/resources/meshes/rigidbot_platform.stl b/resources/meshes/rigidbot_platform.stl old mode 100755 new mode 100644 diff --git a/resources/meshes/rigidbotbig_platform.stl b/resources/meshes/rigidbotbig_platform.stl old mode 100755 new mode 100644 diff --git a/resources/meshes/ultimaker2_platform.obj b/resources/meshes/ultimaker2_platform.obj old mode 100755 new mode 100644 diff --git a/resources/meshes/ultimaker2go_platform.obj b/resources/meshes/ultimaker2go_platform.obj old mode 100755 new mode 100644 diff --git a/resources/meshes/ultimaker_platform.stl b/resources/meshes/ultimaker_platform.stl old mode 100755 new mode 100644 diff --git a/resources/qml/AboutDialog.qml b/resources/qml/AboutDialog.qml old mode 100755 new mode 100644 diff --git a/resources/qml/Actions.qml b/resources/qml/Actions.qml old mode 100755 new mode 100644 diff --git a/resources/qml/AddMachineDialog.qml b/resources/qml/AddMachineDialog.qml old mode 100755 new mode 100644 diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml old mode 100755 new mode 100644 diff --git a/resources/qml/EngineLog.qml b/resources/qml/EngineLog.qml old mode 100755 new mode 100644 diff --git a/resources/qml/JobSpecs.qml b/resources/qml/JobSpecs.qml old mode 100755 new mode 100644 diff --git a/resources/qml/MachineAction.qml b/resources/qml/MachineAction.qml old mode 100755 new mode 100644 diff --git a/resources/qml/Menus/MaterialMenu.qml b/resources/qml/Menus/MaterialMenu.qml old mode 100755 new mode 100644 diff --git a/resources/qml/Menus/NozzleMenu.qml b/resources/qml/Menus/NozzleMenu.qml old mode 100755 new mode 100644 diff --git a/resources/qml/Menus/PrinterMenu.qml b/resources/qml/Menus/PrinterMenu.qml old mode 100755 new mode 100644 diff --git a/resources/qml/Menus/ProfileMenu.qml b/resources/qml/Menus/ProfileMenu.qml old mode 100755 new mode 100644 diff --git a/resources/qml/Menus/RecentFilesMenu.qml b/resources/qml/Menus/RecentFilesMenu.qml old mode 100755 new mode 100644 diff --git a/resources/qml/Menus/ViewMenu.qml b/resources/qml/Menus/ViewMenu.qml old mode 100755 new mode 100644 diff --git a/resources/qml/MonitorButton.qml b/resources/qml/MonitorButton.qml old mode 100755 new mode 100644 diff --git a/resources/qml/Preferences/GeneralPage.qml b/resources/qml/Preferences/GeneralPage.qml old mode 100755 new mode 100644 diff --git a/resources/qml/Preferences/MachinesPage.qml b/resources/qml/Preferences/MachinesPage.qml old mode 100755 new mode 100644 diff --git a/resources/qml/Preferences/MaterialView.qml b/resources/qml/Preferences/MaterialView.qml old mode 100755 new mode 100644 diff --git a/resources/qml/Preferences/MaterialsPage.qml b/resources/qml/Preferences/MaterialsPage.qml old mode 100755 new mode 100644 diff --git a/resources/qml/Preferences/ProfileTab.qml b/resources/qml/Preferences/ProfileTab.qml old mode 100755 new mode 100644 diff --git a/resources/qml/Preferences/ProfilesPage.qml b/resources/qml/Preferences/ProfilesPage.qml old mode 100755 new mode 100644 diff --git a/resources/qml/Preferences/ReadOnlySpinBox.qml b/resources/qml/Preferences/ReadOnlySpinBox.qml old mode 100755 new mode 100644 diff --git a/resources/qml/Preferences/ReadOnlyTextArea.qml b/resources/qml/Preferences/ReadOnlyTextArea.qml old mode 100755 new mode 100644 diff --git a/resources/qml/Preferences/ReadOnlyTextField.qml b/resources/qml/Preferences/ReadOnlyTextField.qml old mode 100755 new mode 100644 diff --git a/resources/qml/Preferences/SettingVisibilityPage.qml b/resources/qml/Preferences/SettingVisibilityPage.qml old mode 100755 new mode 100644 diff --git a/resources/qml/PrintMonitor.qml b/resources/qml/PrintMonitor.qml old mode 100755 new mode 100644 diff --git a/resources/qml/SaveButton.qml b/resources/qml/SaveButton.qml old mode 100755 new mode 100644 diff --git a/resources/qml/Settings/SettingCategory.qml b/resources/qml/Settings/SettingCategory.qml old mode 100755 new mode 100644 diff --git a/resources/qml/Settings/SettingCheckBox.qml b/resources/qml/Settings/SettingCheckBox.qml old mode 100755 new mode 100644 diff --git a/resources/qml/Settings/SettingComboBox.qml b/resources/qml/Settings/SettingComboBox.qml old mode 100755 new mode 100644 diff --git a/resources/qml/Settings/SettingExtruder.qml b/resources/qml/Settings/SettingExtruder.qml old mode 100755 new mode 100644 diff --git a/resources/qml/Settings/SettingItem.qml b/resources/qml/Settings/SettingItem.qml old mode 100755 new mode 100644 diff --git a/resources/qml/Settings/SettingTextField.qml b/resources/qml/Settings/SettingTextField.qml old mode 100755 new mode 100644 diff --git a/resources/qml/Settings/SettingUnknown.qml b/resources/qml/Settings/SettingUnknown.qml old mode 100755 new mode 100644 diff --git a/resources/qml/Settings/SettingView.qml b/resources/qml/Settings/SettingView.qml old mode 100755 new mode 100644 diff --git a/resources/qml/Sidebar.qml b/resources/qml/Sidebar.qml old mode 100755 new mode 100644 diff --git a/resources/qml/SidebarAdvanced.qml b/resources/qml/SidebarAdvanced.qml old mode 100755 new mode 100644 diff --git a/resources/qml/SidebarContents.qml b/resources/qml/SidebarContents.qml old mode 100755 new mode 100644 diff --git a/resources/qml/SidebarHeader.qml b/resources/qml/SidebarHeader.qml old mode 100755 new mode 100644 diff --git a/resources/qml/SidebarSimple.qml b/resources/qml/SidebarSimple.qml old mode 100755 new mode 100644 diff --git a/resources/qml/SidebarTooltip.qml b/resources/qml/SidebarTooltip.qml old mode 100755 new mode 100644 diff --git a/resources/qml/Toolbar.qml b/resources/qml/Toolbar.qml old mode 100755 new mode 100644 diff --git a/resources/quality/high.inst.cfg b/resources/quality/high.inst.cfg old mode 100755 new mode 100644 diff --git a/resources/quality/low.inst.cfg b/resources/quality/low.inst.cfg old mode 100755 new mode 100644 diff --git a/resources/quality/normal.inst.cfg b/resources/quality/normal.inst.cfg old mode 100755 new mode 100644 diff --git a/resources/quality/ultimaker2_plus/pla_0.25_normal.inst.cfg b/resources/quality/ultimaker2_plus/pla_0.25_normal.inst.cfg old mode 100755 new mode 100644 diff --git a/resources/quality/ultimaker2_plus/pla_0.4_fast.inst.cfg b/resources/quality/ultimaker2_plus/pla_0.4_fast.inst.cfg old mode 100755 new mode 100644 diff --git a/resources/quality/ultimaker2_plus/pla_0.4_high.inst.cfg b/resources/quality/ultimaker2_plus/pla_0.4_high.inst.cfg old mode 100755 new mode 100644 diff --git a/resources/quality/ultimaker2_plus/pla_0.4_normal.inst.cfg b/resources/quality/ultimaker2_plus/pla_0.4_normal.inst.cfg old mode 100755 new mode 100644 diff --git a/resources/quality/ultimaker2_plus/pla_0.6_normal.inst.cfg b/resources/quality/ultimaker2_plus/pla_0.6_normal.inst.cfg old mode 100755 new mode 100644 diff --git a/resources/quality/ultimaker2_plus/pla_0.8_normal.inst.cfg b/resources/quality/ultimaker2_plus/pla_0.8_normal.inst.cfg old mode 100755 new mode 100644 diff --git a/resources/quality/ultimaker2_plus/um2p_abs_0.25_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_abs_0.25_normal.inst.cfg old mode 100755 new mode 100644 diff --git a/resources/quality/ultimaker2_plus/um2p_abs_0.4_fast.inst.cfg b/resources/quality/ultimaker2_plus/um2p_abs_0.4_fast.inst.cfg old mode 100755 new mode 100644 diff --git a/resources/quality/ultimaker2_plus/um2p_abs_0.4_high.inst.cfg b/resources/quality/ultimaker2_plus/um2p_abs_0.4_high.inst.cfg old mode 100755 new mode 100644 diff --git a/resources/quality/ultimaker2_plus/um2p_abs_0.4_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_abs_0.4_normal.inst.cfg old mode 100755 new mode 100644 diff --git a/resources/quality/ultimaker2_plus/um2p_abs_0.6_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_abs_0.6_normal.inst.cfg old mode 100755 new mode 100644 diff --git a/resources/quality/ultimaker2_plus/um2p_abs_0.8_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_abs_0.8_normal.inst.cfg old mode 100755 new mode 100644 diff --git a/resources/quality/ultimaker2_plus/um2p_cpe_0.25_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_cpe_0.25_normal.inst.cfg old mode 100755 new mode 100644 diff --git a/resources/quality/ultimaker2_plus/um2p_cpe_0.4_fast.inst.cfg b/resources/quality/ultimaker2_plus/um2p_cpe_0.4_fast.inst.cfg old mode 100755 new mode 100644 diff --git a/resources/quality/ultimaker2_plus/um2p_cpe_0.4_high.inst.cfg b/resources/quality/ultimaker2_plus/um2p_cpe_0.4_high.inst.cfg old mode 100755 new mode 100644 diff --git a/resources/quality/ultimaker2_plus/um2p_cpe_0.4_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_cpe_0.4_normal.inst.cfg old mode 100755 new mode 100644 diff --git a/resources/quality/ultimaker2_plus/um2p_cpe_0.6_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_cpe_0.6_normal.inst.cfg old mode 100755 new mode 100644 diff --git a/resources/quality/ultimaker2_plus/um2p_cpe_0.8_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_cpe_0.8_normal.inst.cfg old mode 100755 new mode 100644 diff --git a/resources/quality/ultimaker2_plus/um2p_cpep_0.4_draft.inst.cfg b/resources/quality/ultimaker2_plus/um2p_cpep_0.4_draft.inst.cfg old mode 100755 new mode 100644 diff --git a/resources/quality/ultimaker2_plus/um2p_cpep_0.4_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_cpep_0.4_normal.inst.cfg old mode 100755 new mode 100644 diff --git a/resources/quality/ultimaker2_plus/um2p_cpep_0.6_draft.inst.cfg b/resources/quality/ultimaker2_plus/um2p_cpep_0.6_draft.inst.cfg old mode 100755 new mode 100644 diff --git a/resources/quality/ultimaker2_plus/um2p_cpep_0.6_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_cpep_0.6_normal.inst.cfg old mode 100755 new mode 100644 diff --git a/resources/quality/ultimaker2_plus/um2p_cpep_0.8_draft.inst.cfg b/resources/quality/ultimaker2_plus/um2p_cpep_0.8_draft.inst.cfg old mode 100755 new mode 100644 diff --git a/resources/quality/ultimaker2_plus/um2p_cpep_0.8_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_cpep_0.8_normal.inst.cfg old mode 100755 new mode 100644 diff --git a/resources/quality/ultimaker2_plus/um2p_nylon_0.25_high.inst.cfg b/resources/quality/ultimaker2_plus/um2p_nylon_0.25_high.inst.cfg old mode 100755 new mode 100644 diff --git a/resources/quality/ultimaker2_plus/um2p_nylon_0.25_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_nylon_0.25_normal.inst.cfg old mode 100755 new mode 100644 diff --git a/resources/quality/ultimaker2_plus/um2p_nylon_0.4_fast.inst.cfg b/resources/quality/ultimaker2_plus/um2p_nylon_0.4_fast.inst.cfg old mode 100755 new mode 100644 diff --git a/resources/quality/ultimaker2_plus/um2p_nylon_0.4_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_nylon_0.4_normal.inst.cfg old mode 100755 new mode 100644 diff --git a/resources/quality/ultimaker2_plus/um2p_nylon_0.6_fast.inst.cfg b/resources/quality/ultimaker2_plus/um2p_nylon_0.6_fast.inst.cfg old mode 100755 new mode 100644 diff --git a/resources/quality/ultimaker2_plus/um2p_nylon_0.6_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_nylon_0.6_normal.inst.cfg old mode 100755 new mode 100644 diff --git a/resources/quality/ultimaker2_plus/um2p_nylon_0.8_draft.inst.cfg b/resources/quality/ultimaker2_plus/um2p_nylon_0.8_draft.inst.cfg old mode 100755 new mode 100644 diff --git a/resources/quality/ultimaker2_plus/um2p_nylon_0.8_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_nylon_0.8_normal.inst.cfg old mode 100755 new mode 100644 diff --git a/resources/quality/ultimaker2_plus/um2p_pc_0.25_high.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pc_0.25_high.inst.cfg old mode 100755 new mode 100644 diff --git a/resources/quality/ultimaker2_plus/um2p_pc_0.25_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pc_0.25_normal.inst.cfg old mode 100755 new mode 100644 diff --git a/resources/quality/ultimaker2_plus/um2p_pc_0.4_fast.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pc_0.4_fast.inst.cfg old mode 100755 new mode 100644 diff --git a/resources/quality/ultimaker2_plus/um2p_pc_0.4_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pc_0.4_normal.inst.cfg old mode 100755 new mode 100644 diff --git a/resources/quality/ultimaker2_plus/um2p_pc_0.6_fast.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pc_0.6_fast.inst.cfg old mode 100755 new mode 100644 diff --git a/resources/quality/ultimaker2_plus/um2p_pc_0.6_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pc_0.6_normal.inst.cfg old mode 100755 new mode 100644 diff --git a/resources/quality/ultimaker2_plus/um2p_pc_0.8_draft.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pc_0.8_draft.inst.cfg old mode 100755 new mode 100644 diff --git a/resources/quality/ultimaker2_plus/um2p_pc_0.8_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_pc_0.8_normal.inst.cfg old mode 100755 new mode 100644 diff --git a/resources/quality/ultimaker2_plus/um2p_tpu_0.25_high.inst.cfg b/resources/quality/ultimaker2_plus/um2p_tpu_0.25_high.inst.cfg old mode 100755 new mode 100644 diff --git a/resources/quality/ultimaker2_plus/um2p_tpu_0.4_normal.inst.cfg b/resources/quality/ultimaker2_plus/um2p_tpu_0.4_normal.inst.cfg old mode 100755 new mode 100644 diff --git a/resources/quality/ultimaker2_plus/um2p_tpu_0.6_fast.inst.cfg b/resources/quality/ultimaker2_plus/um2p_tpu_0.6_fast.inst.cfg old mode 100755 new mode 100644 diff --git a/resources/shaders/grid.shader b/resources/shaders/grid.shader old mode 100755 new mode 100644 diff --git a/resources/shaders/overhang.shader b/resources/shaders/overhang.shader old mode 100755 new mode 100644 diff --git a/resources/shaders/striped.shader b/resources/shaders/striped.shader old mode 100755 new mode 100644 diff --git a/resources/shaders/transparent_object.shader b/resources/shaders/transparent_object.shader old mode 100755 new mode 100644 diff --git a/resources/themes/cura/fonts/LICENSE.txt b/resources/themes/cura/fonts/LICENSE.txt old mode 100755 new mode 100644 diff --git a/resources/themes/cura/fonts/OpenSans-Bold.ttf b/resources/themes/cura/fonts/OpenSans-Bold.ttf old mode 100755 new mode 100644 diff --git a/resources/themes/cura/fonts/OpenSans-BoldItalic.ttf b/resources/themes/cura/fonts/OpenSans-BoldItalic.ttf old mode 100755 new mode 100644 diff --git a/resources/themes/cura/fonts/OpenSans-Italic.ttf b/resources/themes/cura/fonts/OpenSans-Italic.ttf old mode 100755 new mode 100644 diff --git a/resources/themes/cura/fonts/OpenSans-Light.ttf b/resources/themes/cura/fonts/OpenSans-Light.ttf old mode 100755 new mode 100644 diff --git a/resources/themes/cura/fonts/OpenSans-LightItalic.ttf b/resources/themes/cura/fonts/OpenSans-LightItalic.ttf old mode 100755 new mode 100644 diff --git a/resources/themes/cura/fonts/OpenSans-Regular.ttf b/resources/themes/cura/fonts/OpenSans-Regular.ttf old mode 100755 new mode 100644 diff --git a/resources/themes/cura/fonts/OpenSans-Semibold.ttf b/resources/themes/cura/fonts/OpenSans-Semibold.ttf old mode 100755 new mode 100644 diff --git a/resources/themes/cura/fonts/OpenSans-SemiboldItalic.ttf b/resources/themes/cura/fonts/OpenSans-SemiboldItalic.ttf old mode 100755 new mode 100644 diff --git a/resources/themes/cura/icons/application.svg b/resources/themes/cura/icons/application.svg old mode 100755 new mode 100644 diff --git a/resources/themes/cura/icons/arrow_bottom.svg b/resources/themes/cura/icons/arrow_bottom.svg old mode 100755 new mode 100644 diff --git a/resources/themes/cura/icons/arrow_left.svg b/resources/themes/cura/icons/arrow_left.svg old mode 100755 new mode 100644 diff --git a/resources/themes/cura/icons/arrow_right.svg b/resources/themes/cura/icons/arrow_right.svg old mode 100755 new mode 100644 diff --git a/resources/themes/cura/icons/arrow_top.svg b/resources/themes/cura/icons/arrow_top.svg old mode 100755 new mode 100644 diff --git a/resources/themes/cura/icons/basic.svg b/resources/themes/cura/icons/basic.svg old mode 100755 new mode 100644 diff --git a/resources/themes/cura/icons/category_adhesion.svg b/resources/themes/cura/icons/category_adhesion.svg old mode 100755 new mode 100644 diff --git a/resources/themes/cura/icons/category_blackmagic.svg b/resources/themes/cura/icons/category_blackmagic.svg old mode 100755 new mode 100644 diff --git a/resources/themes/cura/icons/category_cool.svg b/resources/themes/cura/icons/category_cool.svg old mode 100755 new mode 100644 diff --git a/resources/themes/cura/icons/category_dual.svg b/resources/themes/cura/icons/category_dual.svg old mode 100755 new mode 100644 diff --git a/resources/themes/cura/icons/category_experimental.svg b/resources/themes/cura/icons/category_experimental.svg old mode 100755 new mode 100644 diff --git a/resources/themes/cura/icons/category_fixes.svg b/resources/themes/cura/icons/category_fixes.svg old mode 100755 new mode 100644 diff --git a/resources/themes/cura/icons/category_infill.svg b/resources/themes/cura/icons/category_infill.svg old mode 100755 new mode 100644 diff --git a/resources/themes/cura/icons/category_layer_height.svg b/resources/themes/cura/icons/category_layer_height.svg old mode 100755 new mode 100644 diff --git a/resources/themes/cura/icons/category_machine.svg b/resources/themes/cura/icons/category_machine.svg old mode 100755 new mode 100644 diff --git a/resources/themes/cura/icons/category_material.svg b/resources/themes/cura/icons/category_material.svg old mode 100755 new mode 100644 diff --git a/resources/themes/cura/icons/category_shell.svg b/resources/themes/cura/icons/category_shell.svg old mode 100755 new mode 100644 diff --git a/resources/themes/cura/icons/category_shield.svg b/resources/themes/cura/icons/category_shield.svg old mode 100755 new mode 100644 diff --git a/resources/themes/cura/icons/category_speed.svg b/resources/themes/cura/icons/category_speed.svg old mode 100755 new mode 100644 diff --git a/resources/themes/cura/icons/category_support.svg b/resources/themes/cura/icons/category_support.svg old mode 100755 new mode 100644 diff --git a/resources/themes/cura/icons/category_travel.svg b/resources/themes/cura/icons/category_travel.svg old mode 100755 new mode 100644 diff --git a/resources/themes/cura/icons/category_unknown.svg b/resources/themes/cura/icons/category_unknown.svg old mode 100755 new mode 100644 diff --git a/resources/themes/cura/icons/check.svg b/resources/themes/cura/icons/check.svg old mode 100755 new mode 100644 diff --git a/resources/themes/cura/icons/cross1.svg b/resources/themes/cura/icons/cross1.svg old mode 100755 new mode 100644 diff --git a/resources/themes/cura/icons/cross2.svg b/resources/themes/cura/icons/cross2.svg old mode 100755 new mode 100644 diff --git a/resources/themes/cura/icons/dense.svg b/resources/themes/cura/icons/dense.svg old mode 100755 new mode 100644 diff --git a/resources/themes/cura/icons/dot.svg b/resources/themes/cura/icons/dot.svg old mode 100755 new mode 100644 diff --git a/resources/themes/cura/icons/hollow.svg b/resources/themes/cura/icons/hollow.svg old mode 100755 new mode 100644 diff --git a/resources/themes/cura/icons/link.svg b/resources/themes/cura/icons/link.svg old mode 100755 new mode 100644 diff --git a/resources/themes/cura/icons/load.svg b/resources/themes/cura/icons/load.svg old mode 100755 new mode 100644 diff --git a/resources/themes/cura/icons/minus.svg b/resources/themes/cura/icons/minus.svg old mode 100755 new mode 100644 diff --git a/resources/themes/cura/icons/mirror.svg b/resources/themes/cura/icons/mirror.svg old mode 100755 new mode 100644 diff --git a/resources/themes/cura/icons/notice.svg b/resources/themes/cura/icons/notice.svg old mode 100755 new mode 100644 diff --git a/resources/themes/cura/icons/pencil.svg b/resources/themes/cura/icons/pencil.svg old mode 100755 new mode 100644 diff --git a/resources/themes/cura/icons/plugin.svg b/resources/themes/cura/icons/plugin.svg old mode 100755 new mode 100644 diff --git a/resources/themes/cura/icons/plus.svg b/resources/themes/cura/icons/plus.svg old mode 100755 new mode 100644 diff --git a/resources/themes/cura/icons/print_time.svg b/resources/themes/cura/icons/print_time.svg old mode 100755 new mode 100644 diff --git a/resources/themes/cura/icons/printsetup.svg b/resources/themes/cura/icons/printsetup.svg old mode 100755 new mode 100644 diff --git a/resources/themes/cura/icons/quick.svg b/resources/themes/cura/icons/quick.svg old mode 100755 new mode 100644 diff --git a/resources/themes/cura/icons/reset.svg b/resources/themes/cura/icons/reset.svg old mode 100755 new mode 100644 diff --git a/resources/themes/cura/icons/rotate.svg b/resources/themes/cura/icons/rotate.svg old mode 100755 new mode 100644 diff --git a/resources/themes/cura/icons/rotate_layflat.svg b/resources/themes/cura/icons/rotate_layflat.svg old mode 100755 new mode 100644 diff --git a/resources/themes/cura/icons/rotate_reset.svg b/resources/themes/cura/icons/rotate_reset.svg old mode 100755 new mode 100644 diff --git a/resources/themes/cura/icons/scale.svg b/resources/themes/cura/icons/scale.svg old mode 100755 new mode 100644 diff --git a/resources/themes/cura/icons/scale_max.svg b/resources/themes/cura/icons/scale_max.svg old mode 100755 new mode 100644 diff --git a/resources/themes/cura/icons/scale_reset.svg b/resources/themes/cura/icons/scale_reset.svg old mode 100755 new mode 100644 diff --git a/resources/themes/cura/icons/setting_per_object.svg b/resources/themes/cura/icons/setting_per_object.svg old mode 100755 new mode 100644 diff --git a/resources/themes/cura/icons/settings.svg b/resources/themes/cura/icons/settings.svg old mode 100755 new mode 100644 diff --git a/resources/themes/cura/icons/solid.svg b/resources/themes/cura/icons/solid.svg old mode 100755 new mode 100644 diff --git a/resources/themes/cura/icons/sparse.svg b/resources/themes/cura/icons/sparse.svg old mode 100755 new mode 100644 diff --git a/resources/themes/cura/icons/star.svg b/resources/themes/cura/icons/star.svg old mode 100755 new mode 100644 diff --git a/resources/themes/cura/icons/tab_monitor.svg b/resources/themes/cura/icons/tab_monitor.svg old mode 100755 new mode 100644 diff --git a/resources/themes/cura/icons/tab_monitor_busy.svg b/resources/themes/cura/icons/tab_monitor_busy.svg old mode 100755 new mode 100644 diff --git a/resources/themes/cura/icons/tab_monitor_connected.svg b/resources/themes/cura/icons/tab_monitor_connected.svg old mode 100755 new mode 100644 diff --git a/resources/themes/cura/icons/tab_monitor_offline.svg b/resources/themes/cura/icons/tab_monitor_offline.svg old mode 100755 new mode 100644 diff --git a/resources/themes/cura/icons/tab_monitor_paused.svg b/resources/themes/cura/icons/tab_monitor_paused.svg old mode 100755 new mode 100644 diff --git a/resources/themes/cura/icons/tab_monitor_stopped.svg b/resources/themes/cura/icons/tab_monitor_stopped.svg old mode 100755 new mode 100644 diff --git a/resources/themes/cura/icons/tab_monitor_unknown.svg b/resources/themes/cura/icons/tab_monitor_unknown.svg old mode 100755 new mode 100644 diff --git a/resources/themes/cura/icons/tab_settings.svg b/resources/themes/cura/icons/tab_settings.svg old mode 100755 new mode 100644 diff --git a/resources/themes/cura/icons/translate.svg b/resources/themes/cura/icons/translate.svg old mode 100755 new mode 100644 diff --git a/resources/themes/cura/icons/ulti.svg b/resources/themes/cura/icons/ulti.svg old mode 100755 new mode 100644 diff --git a/resources/themes/cura/icons/view_layer.svg b/resources/themes/cura/icons/view_layer.svg old mode 100755 new mode 100644 diff --git a/resources/themes/cura/icons/view_normal.svg b/resources/themes/cura/icons/view_normal.svg old mode 100755 new mode 100644 diff --git a/resources/themes/cura/icons/view_xray.svg b/resources/themes/cura/icons/view_xray.svg old mode 100755 new mode 100644 diff --git a/resources/themes/cura/icons/viewmode.svg b/resources/themes/cura/icons/viewmode.svg old mode 100755 new mode 100644 diff --git a/resources/themes/cura/icons/warning.svg b/resources/themes/cura/icons/warning.svg old mode 100755 new mode 100644 diff --git a/resources/themes/cura/images/logo.svg b/resources/themes/cura/images/logo.svg old mode 100755 new mode 100644 diff --git a/resources/themes/cura/styles.qml b/resources/themes/cura/styles.qml old mode 100755 new mode 100644 diff --git a/resources/themes/cura/theme.json b/resources/themes/cura/theme.json old mode 100755 new mode 100644 diff --git a/resources/variants/ultimaker2_extended_plus_0.25.inst.cfg b/resources/variants/ultimaker2_extended_plus_0.25.inst.cfg old mode 100755 new mode 100644 diff --git a/resources/variants/ultimaker2_extended_plus_0.4.inst.cfg b/resources/variants/ultimaker2_extended_plus_0.4.inst.cfg old mode 100755 new mode 100644 diff --git a/resources/variants/ultimaker2_extended_plus_0.6.inst.cfg b/resources/variants/ultimaker2_extended_plus_0.6.inst.cfg old mode 100755 new mode 100644 diff --git a/resources/variants/ultimaker2_extended_plus_0.8.inst.cfg b/resources/variants/ultimaker2_extended_plus_0.8.inst.cfg old mode 100755 new mode 100644 diff --git a/resources/variants/ultimaker2_plus_0.25.inst.cfg b/resources/variants/ultimaker2_plus_0.25.inst.cfg old mode 100755 new mode 100644 diff --git a/resources/variants/ultimaker2_plus_0.4.inst.cfg b/resources/variants/ultimaker2_plus_0.4.inst.cfg old mode 100755 new mode 100644 diff --git a/resources/variants/ultimaker2_plus_0.6.inst.cfg b/resources/variants/ultimaker2_plus_0.6.inst.cfg old mode 100755 new mode 100644 diff --git a/resources/variants/ultimaker2_plus_0.8.inst.cfg b/resources/variants/ultimaker2_plus_0.8.inst.cfg old mode 100755 new mode 100644 diff --git a/setup.py b/setup.py old mode 100755 new mode 100644 diff --git a/tests/TestMachineAction.py b/tests/TestMachineAction.py old mode 100755 new mode 100644 From aa81cc090b18a02e3c06906eb7137c2f810546c1 Mon Sep 17 00:00:00 2001 From: Victor Larchenko Date: Fri, 14 Oct 2016 18:57:39 +0600 Subject: [PATCH 15/75] T466: Added ability to print loaded gcode --- plugins/GCODEReader/GCODEReader.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/plugins/GCODEReader/GCODEReader.py b/plugins/GCODEReader/GCODEReader.py index 8305061a59..fd8d3c9f08 100644 --- a/plugins/GCODEReader/GCODEReader.py +++ b/plugins/GCODEReader/GCODEReader.py @@ -76,7 +76,7 @@ class GCODEReader(MeshReader): else: backend = Application.getInstance().getBackend() backend._pauseSlicing = True - backend.backendStateChange.emit(1) + backend.backendStateChange.emit(3) Application.getInstance().getPrintInformation()._abbr_machine = "Pre-sliced" Application.getInstance().setHideSettings(True) @@ -116,6 +116,9 @@ class GCODEReader(MeshReader): backend.close() backend.backendStateChange.emit(1) + glist = getattr(Application.getInstance().getController().getScene(), "gcode_list") + glist.clear() + file = open(file_name, "r") layer_data = LayerDataBuilder.LayerDataBuilder() @@ -159,6 +162,7 @@ class GCODEReader(MeshReader): # current_path.append([10, 10, 10]) # while file.readable(): for line in file: + glist.append(line) if len(line) == 0: continue if line[0] == ";": From 38d42a78858b047a8a91da3af2aeca86d7da2948 Mon Sep 17 00:00:00 2001 From: Victor Larchenko Date: Sun, 16 Oct 2016 13:30:16 +0600 Subject: [PATCH 16/75] T466: Added multilayer parsing for speed issues --- plugins/GCODEReader/GCODEReader.py | 60 +++++++++++++++++++++--------- 1 file changed, 42 insertions(+), 18 deletions(-) diff --git a/plugins/GCODEReader/GCODEReader.py b/plugins/GCODEReader/GCODEReader.py index fd8d3c9f08..519222c8ec 100644 --- a/plugins/GCODEReader/GCODEReader.py +++ b/plugins/GCODEReader/GCODEReader.py @@ -123,13 +123,6 @@ class GCODEReader(MeshReader): layer_data = LayerDataBuilder.LayerDataBuilder() - layer_id = 0 - - layer_data.addLayer(layer_id) - this_layer = layer_data.getLayer(layer_id) - layer_data.setLayerHeight(layer_id, 0) - layer_data.setLayerThickness(layer_id, 0.1) - current_extruder = 1 current_path = [] current_x = 0 @@ -137,18 +130,47 @@ class GCODEReader(MeshReader): current_z = 0 current_e = 0 + layers = [] + for line in file: + glist.append(line) + if len(line) == 0: + continue + if line[0] == ";": + continue + G = self.getInt(line, "G") + if G is not None: + if G == 0 or G == 1: + z = self.getFloat(line, "Z") + if z is not None and z not in layers and z >= 0: + layers.append(z) + layers.sort() + file.seek(0) + + for layer in layers: + layer_id = layers.index(layer) + layer_data.addLayer(layer_id) + layer_data.setLayerHeight(layer_id, layer) + layer_data.setLayerThickness(layer_id, 0.25) + def CreatePolygon(): + try: + this_layer = layer_data.getLayer(layers.index(current_path[0][1])) + except ValueError: + current_path.clear() + return count = len(current_path) line_types = numpy.empty((count-1, 1), numpy.int32) line_types[:, 0] = 1 line_widths = numpy.empty((count-1, 1), numpy.int32) - line_widths[:, 0] = 1 + line_widths[:, 0] = 0.5 points = numpy.empty((count, 3), numpy.float32) i = 0 for point in current_path: points[i, 0] = point[0] points[i, 1] = point[1] points[i, 2] = point[2] + if i > 0: + line_types[i-1] = point[3] i += 1 this_poly = LayerPolygon.LayerPolygon(layer_data, current_extruder, line_types, points, line_widths) @@ -158,11 +180,7 @@ class GCODEReader(MeshReader): current_path.clear() - # current_path.append([0, 0, 0]) - # current_path.append([10, 10, 10]) - # while file.readable(): for line in file: - glist.append(line) if len(line) == 0: continue if line[0] == ";": @@ -174,26 +192,32 @@ class GCODEReader(MeshReader): y = self.getFloat(line, "Y") z = self.getFloat(line, "Z") e = self.getFloat(line, "E") + z_changed = False if x is not None: current_x = x if y is not None: current_y = y if z is not None: + if not current_z == z: + z_changed = True current_z = z if e is not None: if e > current_e: - current_path.append([current_x, current_z, -current_y]) + current_path.append([current_x, current_z, -current_y, 1]) else: - if len(current_path) > 1: - CreatePolygon() - else: - current_path.clear() + current_path.append([current_x, current_z, -current_y, 0]) current_e = e else: + # if G == 0: + # current_path.append([current_x, current_z, -current_y, 6]) + # else: + current_path.append([current_x, current_z, -current_y, 0]) + if z_changed: if len(current_path) > 1: CreatePolygon() - elif G == 1: + else: current_path.clear() + elif G == 28: x = self.getFloat(line, "X") y = self.getFloat(line, "Y") From 4ba8033c2aa4f8e009720193a92204772c90910c Mon Sep 17 00:00:00 2001 From: Victor Larchenko Date: Fri, 21 Oct 2016 13:47:14 +0600 Subject: [PATCH 17/75] T553: Resetting layer slider to max --- plugins/GCODEReader/GCODEReader.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/GCODEReader/GCODEReader.py b/plugins/GCODEReader/GCODEReader.py index 519222c8ec..868fa1e430 100644 --- a/plugins/GCODEReader/GCODEReader.py +++ b/plugins/GCODEReader/GCODEReader.py @@ -272,6 +272,8 @@ class GCODEReader(MeshReader): view = Application.getInstance().getController().getActiveView() if view.getPluginId() == "LayerView": view.resetLayerData() + view.setLayer(999999) + view.calculateMaxLayers() # scene_node.setEnabled(False) #scene_node.setSelectable(False) From 9da00563e544d0a3391f2336aee4f10e31aa4af4 Mon Sep 17 00:00:00 2001 From: Victor Larchenko Date: Fri, 21 Oct 2016 15:26:34 +0600 Subject: [PATCH 18/75] T553: Fixed job name --- cura/PrintInformation.py | 8 +++-- plugins/GCODEReader/GCODEReader.py | 52 +++++++++++++++--------------- 2 files changed, 32 insertions(+), 28 deletions(-) diff --git a/cura/PrintInformation.py b/cura/PrintInformation.py index b65101ecc7..fa0b43993e 100644 --- a/cura/PrintInformation.py +++ b/cura/PrintInformation.py @@ -49,6 +49,8 @@ class PrintInformation(QObject): self._material_lengths = [] self._material_weights = [] + self._pre_sliced = False + self._backend = Application.getInstance().getBackend() if self._backend: self._backend.printDurationMessage.connect(self._onPrintDurationMessage) @@ -122,7 +124,9 @@ class PrintInformation(QObject): def createJobName(self, base_name): base_name = self._stripAccents(base_name) self._setAbbreviatedMachineName() - if Preferences.getInstance().getValue("cura/jobname_prefix"): + if self._pre_sliced: + return "Pre-sliced_" + base_name + elif Preferences.getInstance().getValue("cura/jobname_prefix"): return self._abbr_machine + "_" + base_name else: return base_name @@ -150,4 +154,4 @@ class PrintInformation(QObject): ## Utility method that strips accents from characters (eg: â -> a) def _stripAccents(self, str): - return ''.join(char for char in unicodedata.normalize('NFD', str) if unicodedata.category(char) != 'Mn') \ No newline at end of file + return ''.join(char for char in unicodedata.normalize('NFD', str) if unicodedata.category(char) != 'Mn') diff --git a/plugins/GCODEReader/GCODEReader.py b/plugins/GCODEReader/GCODEReader.py index 868fa1e430..55802e5c16 100644 --- a/plugins/GCODEReader/GCODEReader.py +++ b/plugins/GCODEReader/GCODEReader.py @@ -58,35 +58,33 @@ class GCODEReader(MeshReader): except: return None - def onSceneChanged(self, obj): - scene = Application.getInstance().getController().getScene() + def parent_changed(self, node): + if node.getParent() is None: + scene = Application.getInstance().getController().getScene() - def findAny(): - for node in DepthFirstIterator(scene.getRoot()): - if hasattr(node, "gcode"): - return True - return False + def findAny(): + for node1 in DepthFirstIterator(scene.getRoot()): + if hasattr(node1, "gcode") and getattr(node1, "gcode") is True: + return True + return False - if not findAny(): - # Preferences.getInstance().setValue("cura/jobname_prefix", True) backend = Application.getInstance().getBackend() - backend._pauseSlicing = False - Application.getInstance().setHideSettings(False) - #Application.getInstance().getPrintInformation()._setAbbreviatedMachineName() - else: - backend = Application.getInstance().getBackend() - backend._pauseSlicing = True - backend.backendStateChange.emit(3) - Application.getInstance().getPrintInformation()._abbr_machine = "Pre-sliced" - Application.getInstance().setHideSettings(True) + if not findAny(): + backend._pauseSlicing = False + Application.getInstance().setHideSettings(False) + Application.getInstance().getPrintInformation()._pre_sliced = False + else: + backend._pauseSlicing = True + backend.backendStateChange.emit(3) + Application.getInstance().getPrintInformation()._pre_sliced = True + Application.getInstance().setHideSettings(True) + def read(self, file_name): scene_node = None extension = os.path.splitext(file_name)[1] if extension.lower() in self._supported_extensions: - scene = Application.getInstance().getController().getScene() - scene.sceneChanged.connect(self.onSceneChanged) # for node in DepthFirstIterator(scene.getRoot()): # if node.callDecoration("getLayerData"): # node.getParent().removeChild(node) @@ -245,7 +243,12 @@ class GCODEReader(MeshReader): decorator.setLayerData(layer_mesh) scene_node.addDecorator(decorator) - Application.getInstance().getPrintInformation()._abbr_machine = "Pre-sliced" + Application.getInstance().getPrintInformation()._pre_sliced = True + + + + + scene_node.parentChanged.connect(self.parent_changed) scene_node_parent = Application.getInstance().getBuildVolume() scene_node.setParent(scene_node_parent) @@ -256,6 +259,8 @@ class GCODEReader(MeshReader): scene_node.setPosition(Vector(-machine_width / 2, 0, machine_depth / 2)) + + # mesh_builder = MeshBuilder() # mesh_builder.setFileName(file_name) # @@ -264,11 +269,6 @@ class GCODEReader(MeshReader): # scene_node.setMeshData(mesh_builder.build()) # scene_node.setMeshData(MeshData(file_name=file_name)) - - - Preferences.getInstance().setValue("cura/jobname_prefix", True) - - view = Application.getInstance().getController().getActiveView() if view.getPluginId() == "LayerView": view.resetLayerData() From 84add5be84f7ef95d438c047dc8a4231a4eda51c Mon Sep 17 00:00:00 2001 From: Victor Larchenko Date: Fri, 21 Oct 2016 16:06:28 +0600 Subject: [PATCH 19/75] T466: Added disabling of view button --- cura/PrintInformation.py | 10 ++++++++++ plugins/GCODEReader/GCODEReader.py | 4 ++-- resources/qml/Cura.qml | 3 ++- resources/qml/Menus/ViewMenu.qml | 1 + 4 files changed, 15 insertions(+), 3 deletions(-) diff --git a/cura/PrintInformation.py b/cura/PrintInformation.py index fa0b43993e..4379ec72ca 100644 --- a/cura/PrintInformation.py +++ b/cura/PrintInformation.py @@ -63,6 +63,16 @@ class PrintInformation(QObject): currentPrintTimeChanged = pyqtSignal() + preSlicedChanged = pyqtSignal() + + @pyqtProperty(bool, notify=preSlicedChanged) + def isPreSliced(self): + return self._pre_sliced + + def setPreSliced(self, pre_sliced): + self._pre_sliced = pre_sliced + self.preSlicedChanged.emit() + @pyqtProperty(Duration, notify = currentPrintTimeChanged) def currentPrintTime(self): return self._current_print_time diff --git a/plugins/GCODEReader/GCODEReader.py b/plugins/GCODEReader/GCODEReader.py index 55802e5c16..4b13f03220 100644 --- a/plugins/GCODEReader/GCODEReader.py +++ b/plugins/GCODEReader/GCODEReader.py @@ -72,11 +72,11 @@ class GCODEReader(MeshReader): if not findAny(): backend._pauseSlicing = False Application.getInstance().setHideSettings(False) - Application.getInstance().getPrintInformation()._pre_sliced = False + Application.getInstance().getPrintInformation().setPreSliced(False) else: backend._pauseSlicing = True backend.backendStateChange.emit(3) - Application.getInstance().getPrintInformation()._pre_sliced = True + Application.getInstance().getPrintInformation().setPreSliced(True) Application.getInstance().setHideSettings(True) diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index 314f3b7443..e4843f7eb5 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -406,7 +406,8 @@ UM.MainWindow iconSource: UM.Theme.getIcon("viewmode"); style: UM.Theme.styles.tool_button; - tooltip: ''; + tooltip: ""; + enabled: !PrintInformation.isPreSliced menu: ViewMenu { } } diff --git a/resources/qml/Menus/ViewMenu.qml b/resources/qml/Menus/ViewMenu.qml index 74579932e0..dc9cbe7501 100644 --- a/resources/qml/Menus/ViewMenu.qml +++ b/resources/qml/Menus/ViewMenu.qml @@ -11,6 +11,7 @@ Menu { title: catalog.i18nc("@title:menu menubar:toplevel", "&View"); id: menu + enabled: !PrintInformation.isPreSliced Instantiator { model: UM.ViewModel { } From 1f84ad70842aa191e34cd92df04a9970aa317cd0 Mon Sep 17 00:00:00 2001 From: Victor Larchenko Date: Fri, 21 Oct 2016 16:13:27 +0600 Subject: [PATCH 20/75] T466: Added explanation text on settings panel --- resources/qml/Sidebar.qml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/qml/Sidebar.qml b/resources/qml/Sidebar.qml index 234e139791..44cad11d09 100644 --- a/resources/qml/Sidebar.qml +++ b/resources/qml/Sidebar.qml @@ -289,7 +289,7 @@ Rectangle Label { id: settingsModeLabel - text: catalog.i18nc("@label:listbox", "Print Setup"); + text: !hideSettings ? catalog.i18nc("@label:listbox", "Print Setup") : catalog.i18nc("@label:listbox","Not possible to modify slicing settings or re-slice\nwhile a GCODE file is open"); anchors.left: parent.left anchors.leftMargin: UM.Theme.getSize("default_margin").width; anchors.top: headerSeparator.bottom @@ -297,7 +297,7 @@ Rectangle width: parent.width * 0.45 - 2 * UM.Theme.getSize("default_margin").width font: UM.Theme.getFont("large") color: UM.Theme.getColor("text") - visible: !monitoringPrint && !hideSettings + visible: !monitoringPrint elide: Text.ElideRight } From b4a7173a6160c25f75a4df8482d040c4d4219c03 Mon Sep 17 00:00:00 2001 From: Victor Larchenko Date: Sun, 23 Oct 2016 14:53:25 +0600 Subject: [PATCH 21/75] T466: Only one gcode file can be loaded at a time, and deleting previous gcode file when loading non-gcode file Merge changes : Only call backgroundItem.hasMesh if/on an imported model (skips if only curaprofiles get loaded) --- cura/CuraApplication.py | 51 +++++++++++++++++++++++++ plugins/GCODEReader/GCODEReader.py | 2 + resources/qml/Cura.qml | 24 ++++++------ resources/qml/Menus/RecentFilesMenu.qml | 2 +- 4 files changed, 67 insertions(+), 12 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index c5db2b01e7..b53b351ac2 100644 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -19,6 +19,9 @@ from UM.SaveFile import SaveFile from UM.Scene.Selection import Selection from UM.Scene.GroupDecorator import GroupDecorator from UM.Settings.Validator import Validator +from types import MethodType + +from UM.Qt.Bindings.MeshFileHandlerProxy import MeshFileHandlerProxy from UM.Operations.AddSceneNodeOperation import AddSceneNodeOperation from UM.Operations.RemoveSceneNodeOperation import RemoveSceneNodeOperation @@ -535,6 +538,54 @@ class CuraApplication(QtApplication): qmlRegisterType(QUrl.fromLocalFile(path), "Cura", 1, 0, type_name) + loadingFiles = [] + + @pyqtSlot(QUrl) + def loadFile(self, file): + scene = self.getController().getScene() + + def findAny(): + for node1 in DepthFirstIterator(scene.getRoot()): + if hasattr(node1, "gcode") and getattr(node1, "gcode") is True: + return True + return False + if findAny(): + self.deleteAll() + + if not file.isValid(): + return + + supported_extensions = [".gcode", ".g"] + + f = file.toLocalFile() + + if len(self.loadingFiles) > 0: + extension = os.path.splitext(f)[1] + if extension.lower() in supported_extensions: + return + extension = os.path.splitext(self.loadingFiles[0])[1] + if extension.lower() in supported_extensions: + return + + self.loadingFiles.append(f) + + job = ReadMeshJob(f) + job.finished.connect(self._readMeshFinished) + job.start() + + def _readMeshFinished(self, job): + node = job.getResult() + if node != None: + filename = job.getFileName() + node.setSelectable(True) + node.setName(filename) + self.loadingFiles.remove(filename) + + op = AddSceneNodeOperation(node, self.getController().getScene().getRoot()) + op.push() + + self.getController().getScene().sceneChanged.emit(node) + def onSelectionChanged(self): if Selection.hasSelection(): if self.getController().getActiveTool(): diff --git a/plugins/GCODEReader/GCODEReader.py b/plugins/GCODEReader/GCODEReader.py index 4b13f03220..1420a9d081 100644 --- a/plugins/GCODEReader/GCODEReader.py +++ b/plugins/GCODEReader/GCODEReader.py @@ -14,11 +14,13 @@ from UM.Math.AxisAlignedBox import AxisAlignedBox from UM.Application import Application from UM.Preferences import Preferences + from cura import LayerDataBuilder from cura import LayerDataDecorator from cura import LayerPolygon import numpy +from types import MethodType from UM.Job import Job diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index e4843f7eb5..4a6a780305 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -269,16 +269,16 @@ UM.MainWindow if(drop.urls.length > 0) { // Import models + var imported_model = -1; for(var i in drop.urls) { // There is no endsWith in this version of JS... if ((drop.urls[i].length <= 12) || (drop.urls[i].substring(drop.urls[i].length-12) !== ".curaprofile")) { // Drop an object - UM.MeshFileHandler.readLocalFile(drop.urls[i]); - if (i == drop.urls.length - 1) + Printer.loadFile(drop.urls[i]); + if (imported_model == -1) { - var meshName = backgroundItem.getMeshName(drop.urls[i].toString()); - backgroundItem.hasMesh(decodeURIComponent(meshName)); + imported_model = i; } } } @@ -297,6 +297,11 @@ UM.MainWindow } messageDialog.open() } + if (imported_model != -1) + { + var meshName = backgroundItem.getMeshName(drop.urls[imported_model].toString()) + backgroundItem.hasMesh(decodeURIComponent(meshName)) + } } } } @@ -732,14 +737,11 @@ UM.MainWindow for(var i in fileUrls) { - UM.MeshFileHandler.readLocalFile(fileUrls[i]) - - if (i == fileUrls.length - 1) - { - var meshName = backgroundItem.getMeshName(fileUrls.toString()) - backgroundItem.hasMesh(decodeURIComponent(meshName)) - } + Printer.loadFile(fileUrls[i]) } + + var meshName = backgroundItem.getMeshName(fileUrls[0].toString()) + backgroundItem.hasMesh(decodeURIComponent(meshName)) } } diff --git a/resources/qml/Menus/RecentFilesMenu.qml b/resources/qml/Menus/RecentFilesMenu.qml index c47fc5715b..4453be6887 100644 --- a/resources/qml/Menus/RecentFilesMenu.qml +++ b/resources/qml/Menus/RecentFilesMenu.qml @@ -26,7 +26,7 @@ Menu return (index + 1) + ". " + path.slice(path.lastIndexOf("/") + 1); } onTriggered: { - UM.MeshFileHandler.readLocalFile(modelData); + Printer.loadFile(modelData); var meshName = backgroundItem.getMeshName(modelData.toString()) backgroundItem.hasMesh(decodeURIComponent(meshName)) } From b24d5ef12be57de9aadfdebaf97a69b50421723c Mon Sep 17 00:00:00 2001 From: Victor Larchenko Date: Sun, 23 Oct 2016 15:03:53 +0600 Subject: [PATCH 22/75] T466: Ignoring top layers option for gcode files --- plugins/LayerView/LayerPass.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/LayerView/LayerPass.py b/plugins/LayerView/LayerPass.py index 9e610b68d2..a8a2b7ba7e 100644 --- a/plugins/LayerView/LayerPass.py +++ b/plugins/LayerView/LayerPass.py @@ -55,7 +55,7 @@ class LayerPass(RenderPass): continue # Render all layers below a certain number as line mesh instead of vertices. - if self._layerview._current_layer_num - self._layerview._solid_layers > -1 and not self._layerview._only_show_top_layers: + if self._layerview._current_layer_num - self._layerview._solid_layers > -1 and (not self._layerview._only_show_top_layers or hasattr(node, "gcode")): start = 0 end = 0 element_counts = layer_data.getElementCounts() From 5d0c598622bc394cbb27b46341397af999d5a869 Mon Sep 17 00:00:00 2001 From: Victor Larchenko Date: Tue, 25 Oct 2016 16:38:25 +0600 Subject: [PATCH 23/75] T466: Cleaned code --- cura/CuraApplication.py | 3 -- .../ProcessSlicedLayersJob.py | 1 - plugins/GCODEReader/GCODEReader.py | 50 +------------------ 3 files changed, 1 insertion(+), 53 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index b53b351ac2..547999f142 100644 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -19,9 +19,6 @@ from UM.SaveFile import SaveFile from UM.Scene.Selection import Selection from UM.Scene.GroupDecorator import GroupDecorator from UM.Settings.Validator import Validator -from types import MethodType - -from UM.Qt.Bindings.MeshFileHandlerProxy import MeshFileHandlerProxy from UM.Operations.AddSceneNodeOperation import AddSceneNodeOperation from UM.Operations.RemoveSceneNodeOperation import RemoveSceneNodeOperation diff --git a/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py b/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py index 206a3e83e8..490690bd27 100644 --- a/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py +++ b/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py @@ -60,7 +60,6 @@ class ProcessSlicedLayersJob(Job): for node in DepthFirstIterator(self._scene.getRoot()): if node.callDecoration("getLayerData"): node.getParent().removeChild(node) - # break if self._abort_requested: if self._progress: self._progress.hide() diff --git a/plugins/GCODEReader/GCODEReader.py b/plugins/GCODEReader/GCODEReader.py index 1420a9d081..0e4c82674c 100644 --- a/plugins/GCODEReader/GCODEReader.py +++ b/plugins/GCODEReader/GCODEReader.py @@ -3,16 +3,12 @@ # Uranium is released under the terms of the AGPLv3 or higher. from UM.Mesh.MeshReader import MeshReader -from UM.Mesh.MeshBuilder import MeshBuilder -from UM.Mesh.MeshData import MeshData import os from UM.Scene.SceneNode import SceneNode from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator from UM.Math.Vector import Vector -from UM.Math.Color import Color from UM.Math.AxisAlignedBox import AxisAlignedBox from UM.Application import Application -from UM.Preferences import Preferences from cura import LayerDataBuilder @@ -20,11 +16,8 @@ from cura import LayerDataDecorator from cura import LayerPolygon import numpy -from types import MethodType -from UM.Job import Job - class GCODEReader(MeshReader): def __init__(self): super(GCODEReader, self).__init__() @@ -35,9 +28,6 @@ class GCODEReader(MeshReader): if n < 1: return None m = line.find(' ', n) - # m2 = line.find(';', n) - # if m < 0: - # m = m2 try: if m < 0: return int(line[n:]) @@ -50,9 +40,6 @@ class GCODEReader(MeshReader): if n < 1: return None m = line.find(' ', n) - # m2 = line.find(';', n) - # if m < 0: - # m = m2 try: if m < 0: return float(line[n:]) @@ -81,31 +68,15 @@ class GCODEReader(MeshReader): Application.getInstance().getPrintInformation().setPreSliced(True) Application.getInstance().setHideSettings(True) - def read(self, file_name): scene_node = None extension = os.path.splitext(file_name)[1] if extension.lower() in self._supported_extensions: - # for node in DepthFirstIterator(scene.getRoot()): - # if node.callDecoration("getLayerData"): - # node.getParent().removeChild(node) Application.getInstance().deleteAll() scene_node = SceneNode() - # mesh_builder = MeshBuilder() - # mesh_builder.setFileName(file_name) - # - # mesh_builder.addCube( - # width=5, - # height=5, - # depth=5, - # center=Vector(0, 2.5, 0) - # ) - # - # scene_node.setMeshData(mesh_builder.build()) - def getBoundingBox(): return AxisAlignedBox(minimum=Vector(0, 0, 0), maximum=Vector(10, 10, 10)) @@ -208,10 +179,7 @@ class GCODEReader(MeshReader): current_path.append([current_x, current_z, -current_y, 0]) current_e = e else: - # if G == 0: - # current_path.append([current_x, current_z, -current_y, 6]) - # else: - current_path.append([current_x, current_z, -current_y, 0]) + current_path.append([current_x, current_z, -current_y, 0]) if z_changed: if len(current_path) > 1: CreatePolygon() @@ -247,9 +215,6 @@ class GCODEReader(MeshReader): Application.getInstance().getPrintInformation()._pre_sliced = True - - - scene_node.parentChanged.connect(self.parent_changed) scene_node_parent = Application.getInstance().getBuildVolume() @@ -261,23 +226,10 @@ class GCODEReader(MeshReader): scene_node.setPosition(Vector(-machine_width / 2, 0, machine_depth / 2)) - - - # mesh_builder = MeshBuilder() - # mesh_builder.setFileName(file_name) - # - # mesh_builder.addCube(10, 10, 10, Vector(0, -5, 0)) - - # scene_node.setMeshData(mesh_builder.build()) - # scene_node.setMeshData(MeshData(file_name=file_name)) - view = Application.getInstance().getController().getActiveView() if view.getPluginId() == "LayerView": view.resetLayerData() view.setLayer(999999) view.calculateMaxLayers() - # scene_node.setEnabled(False) - #scene_node.setSelectable(False) - return scene_node From d7120e24d08a35cee9b99355afecef124c464c8c Mon Sep 17 00:00:00 2001 From: Victor Larchenko Date: Thu, 3 Nov 2016 16:12:11 +0600 Subject: [PATCH 24/75] T466: Automatic switch to LayerView --- cura/CuraApplication.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 547999f142..dbbbb7e4f8 100644 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -555,14 +555,15 @@ class CuraApplication(QtApplication): supported_extensions = [".gcode", ".g"] f = file.toLocalFile() - + extension = os.path.splitext(f)[1] if len(self.loadingFiles) > 0: - extension = os.path.splitext(f)[1] if extension.lower() in supported_extensions: return extension = os.path.splitext(self.loadingFiles[0])[1] if extension.lower() in supported_extensions: return + elif extension.lower() in supported_extensions: + self.getController().setActiveView("LayerView") self.loadingFiles.append(f) From ba9d7fa1e2f4bbd77f3c31d7e265873874e5acd0 Mon Sep 17 00:00:00 2001 From: Victor Larchenko Date: Thu, 3 Nov 2016 16:39:20 +0600 Subject: [PATCH 25/75] T466: Fixed one at a time printing --- plugins/GCODEReader/GCODEReader.py | 43 ++++++++++++------------------ 1 file changed, 17 insertions(+), 26 deletions(-) diff --git a/plugins/GCODEReader/GCODEReader.py b/plugins/GCODEReader/GCODEReader.py index 0e4c82674c..9346c8cc4f 100644 --- a/plugins/GCODEReader/GCODEReader.py +++ b/plugins/GCODEReader/GCODEReader.py @@ -100,35 +100,24 @@ class GCODEReader(MeshReader): current_y = 0 current_z = 0 current_e = 0 - - layers = [] - for line in file: - glist.append(line) - if len(line) == 0: - continue - if line[0] == ";": - continue - G = self.getInt(line, "G") - if G is not None: - if G == 0 or G == 1: - z = self.getFloat(line, "Z") - if z is not None and z not in layers and z >= 0: - layers.append(z) - layers.sort() - file.seek(0) - - for layer in layers: - layer_id = layers.index(layer) - layer_data.addLayer(layer_id) - layer_data.setLayerHeight(layer_id, layer) - layer_data.setLayerThickness(layer_id, 0.25) + current_layer = 0 def CreatePolygon(): + countvalid = False + for point in current_path: + if point[3] > 0: + countvalid += 1 + if countvalid < 2: + current_path.clear() + return False try: - this_layer = layer_data.getLayer(layers.index(current_path[0][1])) + layer_data.addLayer(current_layer) + layer_data.setLayerHeight(current_layer, current_path[0][1]) + layer_data.setLayerThickness(current_layer, 0.25) + this_layer = layer_data.getLayer(current_layer) except ValueError: current_path.clear() - return + return False count = len(current_path) line_types = numpy.empty((count-1, 1), numpy.int32) line_types[:, 0] = 1 @@ -150,6 +139,7 @@ class GCODEReader(MeshReader): this_layer.polygons.append(this_poly) current_path.clear() + return True for line in file: if len(line) == 0: @@ -181,8 +171,9 @@ class GCODEReader(MeshReader): else: current_path.append([current_x, current_z, -current_y, 0]) if z_changed: - if len(current_path) > 1: - CreatePolygon() + if len(current_path) > 1 and current_z > 0: + if CreatePolygon(): + current_layer += 1 else: current_path.clear() From 2d2b8601a02fd0b66c4c57364e07c97b6203973d Mon Sep 17 00:00:00 2001 From: Victor Larchenko Date: Thu, 3 Nov 2016 17:14:15 +0600 Subject: [PATCH 26/75] T466: Added progress indicator --- plugins/GCODEReader/GCODEReader.py | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/plugins/GCODEReader/GCODEReader.py b/plugins/GCODEReader/GCODEReader.py index 9346c8cc4f..80d0e45260 100644 --- a/plugins/GCODEReader/GCODEReader.py +++ b/plugins/GCODEReader/GCODEReader.py @@ -9,6 +9,10 @@ from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator from UM.Math.Vector import Vector from UM.Math.AxisAlignedBox import AxisAlignedBox from UM.Application import Application +from UM.Message import Message + +from UM.i18n import i18nCatalog +catalog = i18nCatalog("cura") from cura import LayerDataBuilder @@ -16,6 +20,7 @@ from cura import LayerDataDecorator from cura import LayerPolygon import numpy +import math class GCODEReader(MeshReader): @@ -92,6 +97,14 @@ class GCODEReader(MeshReader): file = open(file_name, "r") + file_lines = 0 + current_line = 0 + for line in file: + file_lines += 1 + file.seek(0) + + file_step = math.floor(file_lines / 100) + layer_data = LayerDataBuilder.LayerDataBuilder() current_extruder = 1 @@ -102,6 +115,10 @@ class GCODEReader(MeshReader): current_e = 0 current_layer = 0 + message = Message(catalog.i18nc("@info:status", "Parsing GCODE"), lifetime=0, dismissable=False) + message.setProgress(0) + message.show() + def CreatePolygon(): countvalid = False for point in current_path: @@ -142,6 +159,10 @@ class GCODEReader(MeshReader): return True for line in file: + current_line += 1 + if current_line % file_step == 0: + # print(current_line/file_lines*100) + message.setProgress(math.floor(current_line/file_lines*100)) if len(line) == 0: continue if line[0] == ";": @@ -204,6 +225,8 @@ class GCODEReader(MeshReader): decorator.setLayerData(layer_mesh) scene_node.addDecorator(decorator) + message.hide() + Application.getInstance().getPrintInformation()._pre_sliced = True scene_node.parentChanged.connect(self.parent_changed) From 529c47c690f175954717c78bfaec1170d820606b Mon Sep 17 00:00:00 2001 From: Victor Larchenko Date: Sat, 5 Nov 2016 15:39:21 +0600 Subject: [PATCH 27/75] T466: Fixed crash on small files --- plugins/GCODEReader/GCODEReader.py | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/GCODEReader/GCODEReader.py b/plugins/GCODEReader/GCODEReader.py index 80d0e45260..ba70975a15 100644 --- a/plugins/GCODEReader/GCODEReader.py +++ b/plugins/GCODEReader/GCODEReader.py @@ -104,6 +104,7 @@ class GCODEReader(MeshReader): file.seek(0) file_step = math.floor(file_lines / 100) + file_step = 1 if file_step < 1 else file_step layer_data = LayerDataBuilder.LayerDataBuilder() From a8dcdef4dd76191bf1ae2ec54aea9b650a54a8d6 Mon Sep 17 00:00:00 2001 From: Victor Larchenko Date: Sat, 5 Nov 2016 15:46:22 +0600 Subject: [PATCH 28/75] T466: Renamed *.g file label --- plugins/GCODEReader/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/GCODEReader/__init__.py b/plugins/GCODEReader/__init__.py index f1572c077f..8c0e493eb6 100644 --- a/plugins/GCODEReader/__init__.py +++ b/plugins/GCODEReader/__init__.py @@ -23,7 +23,7 @@ def getMetaData(): }, { "extension": "g", - "description": i18n_catalog.i18nc("@item:inlistbox", "GCODE File") + "description": i18n_catalog.i18nc("@item:inlistbox", "G File") } ] } From 1932437b07a53e904209c8001869a4c1305421cf Mon Sep 17 00:00:00 2001 From: Victor Larchenko Date: Sat, 5 Nov 2016 16:05:43 +0600 Subject: [PATCH 29/75] T466: Added logging --- plugins/GCODEReader/GCODEReader.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/plugins/GCODEReader/GCODEReader.py b/plugins/GCODEReader/GCODEReader.py index ba70975a15..0a2b6463a5 100644 --- a/plugins/GCODEReader/GCODEReader.py +++ b/plugins/GCODEReader/GCODEReader.py @@ -10,6 +10,7 @@ from UM.Math.Vector import Vector from UM.Math.AxisAlignedBox import AxisAlignedBox from UM.Application import Application from UM.Message import Message +from UM.Logger import Logger from UM.i18n import i18nCatalog catalog = i18nCatalog("cura") @@ -78,6 +79,7 @@ class GCODEReader(MeshReader): extension = os.path.splitext(file_name)[1] if extension.lower() in self._supported_extensions: + Logger.log("d", "Preparing to load %s" % file_name) Application.getInstance().deleteAll() scene_node = SceneNode() @@ -95,6 +97,8 @@ class GCODEReader(MeshReader): glist = getattr(Application.getInstance().getController().getScene(), "gcode_list") glist.clear() + Logger.log("d", "Opening file %s" % file_name) + file = open(file_name, "r") file_lines = 0 @@ -120,6 +124,8 @@ class GCODEReader(MeshReader): message.setProgress(0) message.show() + Logger.log("d", "Parsing %s" % file_name) + def CreatePolygon(): countvalid = False for point in current_path: @@ -162,7 +168,6 @@ class GCODEReader(MeshReader): for line in file: current_line += 1 if current_line % file_step == 0: - # print(current_line/file_lines*100) message.setProgress(math.floor(current_line/file_lines*100)) if len(line) == 0: continue @@ -219,15 +224,20 @@ class GCODEReader(MeshReader): current_z += z if len(current_path) > 1: - CreatePolygon() + if CreatePolygon(): + current_layer += 1 layer_mesh = layer_data.build() decorator = LayerDataDecorator.LayerDataDecorator() decorator.setLayerData(layer_mesh) scene_node.addDecorator(decorator) + Logger.log("d", "Finished parsing %s" % file_name) message.hide() + if current_layer == 0: + Logger.log("w", "File %s don't contain any valid layers" % file_name) + Application.getInstance().getPrintInformation()._pre_sliced = True scene_node.parentChanged.connect(self.parent_changed) @@ -247,4 +257,6 @@ class GCODEReader(MeshReader): view.setLayer(999999) view.calculateMaxLayers() + Logger.log("d", "Loaded %s" % file_name) + return scene_node From 0f835a240db181cb9f4a6b94be3635dd6e910f5d Mon Sep 17 00:00:00 2001 From: Victor Larchenko Date: Sat, 5 Nov 2016 16:23:36 +0600 Subject: [PATCH 30/75] T466: Added ability to cancel parsing --- plugins/GCODEReader/GCODEReader.py | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/plugins/GCODEReader/GCODEReader.py b/plugins/GCODEReader/GCODEReader.py index 0a2b6463a5..b8f1f8efa3 100644 --- a/plugins/GCODEReader/GCODEReader.py +++ b/plugins/GCODEReader/GCODEReader.py @@ -28,6 +28,9 @@ class GCODEReader(MeshReader): def __init__(self): super(GCODEReader, self).__init__() self._supported_extensions = [".gcode", ".g"] + Application.getInstance().hideMessageSignal.connect(self.onHideMessage) + self.cancelled = False + self.message = None def getInt(self, line, code): n = line.find(code) + 1 @@ -53,6 +56,10 @@ class GCODEReader(MeshReader): except: return None + def onHideMessage(self, m): + if m == self.message: + self.cancelled = True + def parent_changed(self, node): if node.getParent() is None: scene = Application.getInstance().getController().getScene() @@ -80,6 +87,7 @@ class GCODEReader(MeshReader): extension = os.path.splitext(file_name)[1] if extension.lower() in self._supported_extensions: Logger.log("d", "Preparing to load %s" % file_name) + self.cancelled = False Application.getInstance().deleteAll() scene_node = SceneNode() @@ -120,9 +128,9 @@ class GCODEReader(MeshReader): current_e = 0 current_layer = 0 - message = Message(catalog.i18nc("@info:status", "Parsing GCODE"), lifetime=0, dismissable=False) - message.setProgress(0) - message.show() + self.message = Message(catalog.i18nc("@info:status", "Parsing GCODE"), lifetime=0) + self.message.setProgress(0) + self.message.show() Logger.log("d", "Parsing %s" % file_name) @@ -166,9 +174,12 @@ class GCODEReader(MeshReader): return True for line in file: + if self.cancelled: + Logger.log("w", "Parsing %s cancelled" % file_name) + return None current_line += 1 if current_line % file_step == 0: - message.setProgress(math.floor(current_line/file_lines*100)) + self.message.setProgress(math.floor(current_line/file_lines*100)) if len(line) == 0: continue if line[0] == ";": @@ -233,7 +244,7 @@ class GCODEReader(MeshReader): scene_node.addDecorator(decorator) Logger.log("d", "Finished parsing %s" % file_name) - message.hide() + self.message.hide() if current_layer == 0: Logger.log("w", "File %s don't contain any valid layers" % file_name) From 5441f1889c64cb903465f6751963b128f8d6e819 Mon Sep 17 00:00:00 2001 From: Victor Larchenko Date: Sat, 5 Nov 2016 16:39:01 +0600 Subject: [PATCH 31/75] T466: Added support of retraction moves --- plugins/GCODEReader/GCODEReader.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/GCODEReader/GCODEReader.py b/plugins/GCODEReader/GCODEReader.py index b8f1f8efa3..430c3f6052 100644 --- a/plugins/GCODEReader/GCODEReader.py +++ b/plugins/GCODEReader/GCODEReader.py @@ -202,9 +202,9 @@ class GCODEReader(MeshReader): current_z = z if e is not None: if e > current_e: - current_path.append([current_x, current_z, -current_y, 1]) + current_path.append([current_x, current_z, -current_y, 1]) # extrusion else: - current_path.append([current_x, current_z, -current_y, 0]) + current_path.append([current_x, current_z, -current_y, 2]) # retraction current_e = e else: current_path.append([current_x, current_z, -current_y, 0]) From 87eb1e44f4ea001e96177b8c4e31363f706ba8f3 Mon Sep 17 00:00:00 2001 From: nickthetait Date: Tue, 8 Nov 2016 14:15:35 -0700 Subject: [PATCH 32/75] Update labeling for T466 --- cura/PrintInformation.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/PrintInformation.py b/cura/PrintInformation.py index 4379ec72ca..442b9ce846 100644 --- a/cura/PrintInformation.py +++ b/cura/PrintInformation.py @@ -135,7 +135,7 @@ class PrintInformation(QObject): base_name = self._stripAccents(base_name) self._setAbbreviatedMachineName() if self._pre_sliced: - return "Pre-sliced_" + base_name + return "Pre-sliced file " + base_name elif Preferences.getInstance().getValue("cura/jobname_prefix"): return self._abbr_machine + "_" + base_name else: From 9120a336023600a22964b982bce195d99d7e3aa9 Mon Sep 17 00:00:00 2001 From: nickthetait Date: Tue, 8 Nov 2016 14:55:28 -0700 Subject: [PATCH 33/75] Improve grammar of a log message T466 --- plugins/GCODEReader/GCODEReader.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/GCODEReader/GCODEReader.py b/plugins/GCODEReader/GCODEReader.py index 430c3f6052..4e4f4de824 100644 --- a/plugins/GCODEReader/GCODEReader.py +++ b/plugins/GCODEReader/GCODEReader.py @@ -247,7 +247,7 @@ class GCODEReader(MeshReader): self.message.hide() if current_layer == 0: - Logger.log("w", "File %s don't contain any valid layers" % file_name) + Logger.log("w", "File %s doesn't contain any valid layers" % file_name) Application.getInstance().getPrintInformation()._pre_sliced = True From ec12b901d101aa6b0858e71b15a74c8aec8018c3 Mon Sep 17 00:00:00 2001 From: nickthetait Date: Tue, 8 Nov 2016 15:05:59 -0700 Subject: [PATCH 34/75] Rename to be consistent with other plugins T466 --- .../GCODEReader.py => GCodeReader/GCodeReader.py} | 4 ++-- plugins/{GCODEReader => GCodeReader}/__init__.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) rename plugins/{GCODEReader/GCODEReader.py => GCodeReader/GCodeReader.py} (99%) rename plugins/{GCODEReader => GCodeReader}/__init__.py (91%) diff --git a/plugins/GCODEReader/GCODEReader.py b/plugins/GCodeReader/GCodeReader.py similarity index 99% rename from plugins/GCODEReader/GCODEReader.py rename to plugins/GCodeReader/GCodeReader.py index 4e4f4de824..68dece113e 100644 --- a/plugins/GCODEReader/GCODEReader.py +++ b/plugins/GCodeReader/GCodeReader.py @@ -24,9 +24,9 @@ import numpy import math -class GCODEReader(MeshReader): +class GCodeReader(MeshReader): def __init__(self): - super(GCODEReader, self).__init__() + super(GCodeReader, self).__init__() self._supported_extensions = [".gcode", ".g"] Application.getInstance().hideMessageSignal.connect(self.onHideMessage) self.cancelled = False diff --git a/plugins/GCODEReader/__init__.py b/plugins/GCodeReader/__init__.py similarity index 91% rename from plugins/GCODEReader/__init__.py rename to plugins/GCodeReader/__init__.py index 8c0e493eb6..2f372f3cd2 100644 --- a/plugins/GCODEReader/__init__.py +++ b/plugins/GCodeReader/__init__.py @@ -2,7 +2,7 @@ # Uranium is released under the terms of the AGPLv3 or higher. #Shoopdawoop -from . import GCODEReader +from . import GCodeReader from UM.i18n import i18nCatalog i18n_catalog = i18nCatalog("uranium") @@ -29,4 +29,4 @@ def getMetaData(): } def register(app): - return { "mesh_reader": GCODEReader.GCODEReader() } + return { "mesh_reader": GCodeReader.GCodeReader() } From 79f54a16f6766339b01f7b980f571555beac560e Mon Sep 17 00:00:00 2001 From: nickthetait Date: Tue, 8 Nov 2016 15:25:58 -0700 Subject: [PATCH 35/75] Update copyright information --- plugins/GCodeReader/GCodeReader.py | 5 ++--- plugins/GCodeReader/__init__.py | 5 ++--- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/plugins/GCodeReader/GCodeReader.py b/plugins/GCodeReader/GCodeReader.py index 68dece113e..f084f1d7db 100644 --- a/plugins/GCodeReader/GCodeReader.py +++ b/plugins/GCodeReader/GCodeReader.py @@ -1,6 +1,5 @@ -# Copyright (c) 2015 Ultimaker B.V. -# Copyright (c) 2013 David Braam -# Uranium is released under the terms of the AGPLv3 or higher. +# Copyright (c) 2016 Aleph Objects, Inc. +# Cura is released under the terms of the AGPLv3 or higher. from UM.Mesh.MeshReader import MeshReader import os diff --git a/plugins/GCodeReader/__init__.py b/plugins/GCodeReader/__init__.py index 2f372f3cd2..39246072f9 100644 --- a/plugins/GCodeReader/__init__.py +++ b/plugins/GCodeReader/__init__.py @@ -1,7 +1,6 @@ -# Copyright (c) 2015 Ultimaker B.V. -# Uranium is released under the terms of the AGPLv3 or higher. +# Copyright (c) 2016 Aleph Objects, Inc. +# Cura is released under the terms of the AGPLv3 or higher. -#Shoopdawoop from . import GCodeReader from UM.i18n import i18nCatalog From b576e4a7bdf566b5a608e0fb4bbe22784b1ac29f Mon Sep 17 00:00:00 2001 From: nickthetait Date: Tue, 8 Nov 2016 15:27:40 -0700 Subject: [PATCH 36/75] Improve description of plugin for T466 --- plugins/GCodeReader/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/GCodeReader/__init__.py b/plugins/GCodeReader/__init__.py index 39246072f9..4bb3d787bb 100644 --- a/plugins/GCodeReader/__init__.py +++ b/plugins/GCodeReader/__init__.py @@ -12,7 +12,7 @@ def getMetaData(): "name": i18n_catalog.i18nc("@label", "GCODE Reader"), "author": "Victor Larchenko", "version": "1.0", - "description": i18n_catalog.i18nc("@info:whatsthis", "Makes it possbile to read GCODE files."), + "description": i18n_catalog.i18nc("@info:whatsthis", "Allows displaying GCODE files."), "api": 3 }, "mesh_reader": [ From 2b2eec5643dc21e10b949aae2c9c2e5907e97029 Mon Sep 17 00:00:00 2001 From: Victor Larchenko Date: Wed, 9 Nov 2016 13:58:47 +0600 Subject: [PATCH 37/75] T466: Removed nested functions --- plugins/GCodeReader/GCodeReader.py | 119 +++++++++++++++-------------- 1 file changed, 60 insertions(+), 59 deletions(-) diff --git a/plugins/GCodeReader/GCodeReader.py b/plugins/GCodeReader/GCodeReader.py index f084f1d7db..8502c044c4 100644 --- a/plugins/GCodeReader/GCodeReader.py +++ b/plugins/GCodeReader/GCodeReader.py @@ -31,7 +31,8 @@ class GCodeReader(MeshReader): self.cancelled = False self.message = None - def getInt(self, line, code): + @staticmethod + def getInt(line, code): n = line.find(code) + 1 if n < 1: return None @@ -43,7 +44,8 @@ class GCodeReader(MeshReader): except: return None - def getFloat(self, line, code): + @staticmethod + def getFloat(line, code): n = line.find(code) + 1 if n < 1: return None @@ -59,18 +61,18 @@ class GCodeReader(MeshReader): if m == self.message: self.cancelled = True - def parent_changed(self, node): + @staticmethod + def onParentChanged(node): if node.getParent() is None: scene = Application.getInstance().getController().getScene() - def findAny(): - for node1 in DepthFirstIterator(scene.getRoot()): - if hasattr(node1, "gcode") and getattr(node1, "gcode") is True: - return True - return False + isAny = False + for node1 in DepthFirstIterator(scene.getRoot()): + if hasattr(node1, "gcode") and getattr(node1, "gcode") is True: + isAny = True backend = Application.getInstance().getBackend() - if not findAny(): + if not isAny: backend._pauseSlicing = False Application.getInstance().setHideSettings(False) Application.getInstance().getPrintInformation().setPreSliced(False) @@ -80,6 +82,50 @@ class GCodeReader(MeshReader): Application.getInstance().getPrintInformation().setPreSliced(True) Application.getInstance().setHideSettings(True) + @staticmethod + def getNullBoundingBox(): + return AxisAlignedBox(minimum=Vector(0, 0, 0), maximum=Vector(10, 10, 10)) + + @staticmethod + def createPolygon(layer_data, path, layer_id, extruder): + countvalid = 0 + for point in path: + if point[3] > 0: + countvalid += 1 + if countvalid < 2: + path.clear() + return False + try: + layer_data.addLayer(layer_id) + layer_data.setLayerHeight(layer_id, path[0][1]) + layer_data.setLayerThickness(layer_id, 0.25) + this_layer = layer_data.getLayer(layer_id) + except ValueError: + path.clear() + return False + count = len(path) + line_types = numpy.empty((count - 1, 1), numpy.int32) + line_types[:, 0] = 1 + line_widths = numpy.empty((count - 1, 1), numpy.int32) + line_widths[:, 0] = 0.5 + points = numpy.empty((count, 3), numpy.float32) + i = 0 + for point in path: + points[i, 0] = point[0] + points[i, 1] = point[1] + points[i, 2] = point[2] + if i > 0: + line_types[i - 1] = point[3] + i += 1 + + this_poly = LayerPolygon.LayerPolygon(layer_data, extruder, line_types, points, line_widths) + this_poly.buildCache() + + this_layer.polygons.append(this_poly) + + path.clear() + return True + def read(self, file_name): scene_node = None @@ -90,11 +136,7 @@ class GCodeReader(MeshReader): Application.getInstance().deleteAll() scene_node = SceneNode() - - def getBoundingBox(): - return AxisAlignedBox(minimum=Vector(0, 0, 0), maximum=Vector(10, 10, 10)) - - scene_node.getBoundingBox = getBoundingBox + scene_node.getBoundingBox = self.getNullBoundingBox scene_node.gcode = True backend = Application.getInstance().getBackend() backend._pauseSlicing = True @@ -114,9 +156,7 @@ class GCodeReader(MeshReader): file_lines += 1 file.seek(0) - file_step = math.floor(file_lines / 100) - file_step = 1 if file_step < 1 else file_step - + file_step = max(math.floor(file_lines / 100), 1) layer_data = LayerDataBuilder.LayerDataBuilder() current_extruder = 1 @@ -133,45 +173,6 @@ class GCodeReader(MeshReader): Logger.log("d", "Parsing %s" % file_name) - def CreatePolygon(): - countvalid = False - for point in current_path: - if point[3] > 0: - countvalid += 1 - if countvalid < 2: - current_path.clear() - return False - try: - layer_data.addLayer(current_layer) - layer_data.setLayerHeight(current_layer, current_path[0][1]) - layer_data.setLayerThickness(current_layer, 0.25) - this_layer = layer_data.getLayer(current_layer) - except ValueError: - current_path.clear() - return False - count = len(current_path) - line_types = numpy.empty((count-1, 1), numpy.int32) - line_types[:, 0] = 1 - line_widths = numpy.empty((count-1, 1), numpy.int32) - line_widths[:, 0] = 0.5 - points = numpy.empty((count, 3), numpy.float32) - i = 0 - for point in current_path: - points[i, 0] = point[0] - points[i, 1] = point[1] - points[i, 2] = point[2] - if i > 0: - line_types[i-1] = point[3] - i += 1 - - this_poly = LayerPolygon.LayerPolygon(layer_data, current_extruder, line_types, points, line_widths) - this_poly.buildCache() - - this_layer.polygons.append(this_poly) - - current_path.clear() - return True - for line in file: if self.cancelled: Logger.log("w", "Parsing %s cancelled" % file_name) @@ -209,7 +210,7 @@ class GCodeReader(MeshReader): current_path.append([current_x, current_z, -current_y, 0]) if z_changed: if len(current_path) > 1 and current_z > 0: - if CreatePolygon(): + if self.createPolygon(layer_data, current_path, current_layer, current_extruder): current_layer += 1 else: current_path.clear() @@ -234,7 +235,7 @@ class GCodeReader(MeshReader): current_z += z if len(current_path) > 1: - if CreatePolygon(): + if self.createPolygon(layer_data, current_path, current_layer, current_extruder): current_layer += 1 layer_mesh = layer_data.build() @@ -250,7 +251,7 @@ class GCodeReader(MeshReader): Application.getInstance().getPrintInformation()._pre_sliced = True - scene_node.parentChanged.connect(self.parent_changed) + scene_node.parentChanged.connect(self.onParentChanged) scene_node_parent = Application.getInstance().getBuildVolume() scene_node.setParent(scene_node_parent) From be3a945fb029a64976b71e1b55734cfe9f5828a0 Mon Sep 17 00:00:00 2001 From: Victor Larchenko Date: Wed, 9 Nov 2016 14:53:23 +0600 Subject: [PATCH 38/75] T466: Fixed Nothing to slice bug --- cura/CuraApplication.py | 11 ++-- .../CuraEngineBackend/CuraEngineBackend.py | 5 +- plugins/GCodeReader/GCodeReader.py | 60 ++++++++----------- 3 files changed, 33 insertions(+), 43 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index dbbbb7e4f8..0a552428af 100644 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -541,13 +541,10 @@ class CuraApplication(QtApplication): def loadFile(self, file): scene = self.getController().getScene() - def findAny(): - for node1 in DepthFirstIterator(scene.getRoot()): - if hasattr(node1, "gcode") and getattr(node1, "gcode") is True: - return True - return False - if findAny(): - self.deleteAll() + for node1 in DepthFirstIterator(scene.getRoot()): + if hasattr(node1, "gcode") and getattr(node1, "gcode") is True: + self.deleteAll() + break if not file.isValid(): return diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index 4e1b2f6841..3737976175 100644 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -152,6 +152,8 @@ class CuraEngineBackend(Backend): ## Perform a slice of the scene. def slice(self): Logger.log("d", "Starting slice job...") + if self._pauseSlicing: + return self._slice_start_time = time() if not self._enabled or not self._global_container_stack: # We shouldn't be slicing. # try again in a short time @@ -395,7 +397,8 @@ class CuraEngineBackend(Backend): ## Manually triggers a reslice def forceSlice(self): - self._change_timer.start() + if not self._pauseSlicing: + self._change_timer.start() ## Called when anything has changed to the stuff that needs to be sliced. # diff --git a/plugins/GCodeReader/GCodeReader.py b/plugins/GCodeReader/GCodeReader.py index 8502c044c4..1fcd615c5e 100644 --- a/plugins/GCodeReader/GCodeReader.py +++ b/plugins/GCodeReader/GCodeReader.py @@ -31,6 +31,8 @@ class GCodeReader(MeshReader): self.cancelled = False self.message = None + self.scene_node = None + @staticmethod def getInt(line, code): n = line.find(code) + 1 @@ -61,26 +63,17 @@ class GCodeReader(MeshReader): if m == self.message: self.cancelled = True - @staticmethod - def onParentChanged(node): - if node.getParent() is None: - scene = Application.getInstance().getController().getScene() - - isAny = False - for node1 in DepthFirstIterator(scene.getRoot()): - if hasattr(node1, "gcode") and getattr(node1, "gcode") is True: - isAny = True - - backend = Application.getInstance().getBackend() - if not isAny: - backend._pauseSlicing = False - Application.getInstance().setHideSettings(False) - Application.getInstance().getPrintInformation().setPreSliced(False) - else: - backend._pauseSlicing = True - backend.backendStateChange.emit(3) - Application.getInstance().getPrintInformation().setPreSliced(True) - Application.getInstance().setHideSettings(True) + def onParentChanged(self, node): + backend = Application.getInstance().getBackend() + if self.scene_node is not None and self.scene_node.getParent() is None: + self.scene_node = None + backend._pauseSlicing = False + Application.getInstance().setHideSettings(False) + Application.getInstance().getPrintInformation().setPreSliced(False) + else: + backend._pauseSlicing = True + Application.getInstance().getPrintInformation().setPreSliced(True) + Application.getInstance().setHideSettings(True) @staticmethod def getNullBoundingBox(): @@ -127,21 +120,21 @@ class GCodeReader(MeshReader): return True def read(self, file_name): - scene_node = None - extension = os.path.splitext(file_name)[1] if extension.lower() in self._supported_extensions: Logger.log("d", "Preparing to load %s" % file_name) self.cancelled = False Application.getInstance().deleteAll() - scene_node = SceneNode() - scene_node.getBoundingBox = self.getNullBoundingBox - scene_node.gcode = True + self.scene_node = SceneNode() + self.scene_node.getBoundingBox = self.getNullBoundingBox + self.scene_node.gcode = True + self.scene_node.parentChanged.connect(self.onParentChanged) + backend = Application.getInstance().getBackend() backend._pauseSlicing = True backend.close() - backend.backendStateChange.emit(1) + backend.backendStateChange.emit(3) glist = getattr(Application.getInstance().getController().getScene(), "gcode_list") glist.clear() @@ -241,7 +234,9 @@ class GCodeReader(MeshReader): layer_mesh = layer_data.build() decorator = LayerDataDecorator.LayerDataDecorator() decorator.setLayerData(layer_mesh) - scene_node.addDecorator(decorator) + + self.scene_node.removeDecorator("LayerDataDecorator") + self.scene_node.addDecorator(decorator) Logger.log("d", "Finished parsing %s" % file_name) self.message.hide() @@ -249,18 +244,13 @@ class GCodeReader(MeshReader): if current_layer == 0: Logger.log("w", "File %s doesn't contain any valid layers" % file_name) - Application.getInstance().getPrintInformation()._pre_sliced = True - - scene_node.parentChanged.connect(self.onParentChanged) - - scene_node_parent = Application.getInstance().getBuildVolume() - scene_node.setParent(scene_node_parent) + Application.getInstance().getPrintInformation().setPreSliced(True) settings = Application.getInstance().getGlobalContainerStack() machine_width = settings.getProperty("machine_width", "value") machine_depth = settings.getProperty("machine_depth", "value") - scene_node.setPosition(Vector(-machine_width / 2, 0, machine_depth / 2)) + self.scene_node.setPosition(Vector(-machine_width / 2, 0, machine_depth / 2)) view = Application.getInstance().getController().getActiveView() if view.getPluginId() == "LayerView": @@ -270,4 +260,4 @@ class GCodeReader(MeshReader): Logger.log("d", "Loaded %s" % file_name) - return scene_node + return self.scene_node From 1139b31900c174adb976eadc5662163d182088d2 Mon Sep 17 00:00:00 2001 From: Victor Larchenko Date: Wed, 9 Nov 2016 15:02:15 +0600 Subject: [PATCH 39/75] T466: Shortened long filenames --- cura/PrintInformation.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cura/PrintInformation.py b/cura/PrintInformation.py index 442b9ce846..92aeb17ea0 100644 --- a/cura/PrintInformation.py +++ b/cura/PrintInformation.py @@ -134,6 +134,8 @@ class PrintInformation(QObject): def createJobName(self, base_name): base_name = self._stripAccents(base_name) self._setAbbreviatedMachineName() + if len(base_name) > 100: + base_name = "%s..." % base_name[:100] if self._pre_sliced: return "Pre-sliced file " + base_name elif Preferences.getInstance().getValue("cura/jobname_prefix"): From cb1b9770fd2660437027799d001730d1417abac0 Mon Sep 17 00:00:00 2001 From: Victor Larchenko Date: Wed, 9 Nov 2016 15:41:47 +0600 Subject: [PATCH 40/75] T466: Added support of multiextrudion --- plugins/GCodeReader/GCodeReader.py | 39 ++++++++++++++++++++++++------ 1 file changed, 32 insertions(+), 7 deletions(-) diff --git a/plugins/GCodeReader/GCodeReader.py b/plugins/GCodeReader/GCodeReader.py index 1fcd615c5e..54af0d5dae 100644 --- a/plugins/GCodeReader/GCodeReader.py +++ b/plugins/GCodeReader/GCodeReader.py @@ -80,7 +80,7 @@ class GCodeReader(MeshReader): return AxisAlignedBox(minimum=Vector(0, 0, 0), maximum=Vector(10, 10, 10)) @staticmethod - def createPolygon(layer_data, path, layer_id, extruder): + def createPolygon(layer_data, path, layer_id, extruder, extruder_offsets): countvalid = 0 for point in path: if point[3] > 0: @@ -104,11 +104,14 @@ class GCodeReader(MeshReader): points = numpy.empty((count, 3), numpy.float32) i = 0 for point in path: - points[i, 0] = point[0] - points[i, 1] = point[1] + points[i, 0] = point[0] + extruder_offsets[extruder]['x'] + points[i, 1] = point[1] + extruder_offsets[extruder]['y'] points[i, 2] = point[2] if i > 0: - line_types[i - 1] = point[3] + if point[3] == 1: + line_types[i - 1] = extruder + 1 + else: + line_types[i - 1] = point[3] i += 1 this_poly = LayerPolygon.LayerPolygon(layer_data, extruder, line_types, points, line_widths) @@ -152,7 +155,8 @@ class GCodeReader(MeshReader): file_step = max(math.floor(file_lines / 100), 1) layer_data = LayerDataBuilder.LayerDataBuilder() - current_extruder = 1 + current_extruder = 0 + extruder_offsets = {0: {'x': 0, 'y': 0}} current_path = [] current_x = 0 current_y = 0 @@ -203,7 +207,7 @@ class GCodeReader(MeshReader): current_path.append([current_x, current_z, -current_y, 0]) if z_changed: if len(current_path) > 1 and current_z > 0: - if self.createPolygon(layer_data, current_path, current_layer, current_extruder): + if self.createPolygon(layer_data, current_path, current_layer, current_extruder, extruder_offsets): current_layer += 1 else: current_path.clear() @@ -226,9 +230,30 @@ class GCodeReader(MeshReader): current_y += y if z is not None: current_z += z + elif G == 10: + x = self.getFloat(line, "X") + y = self.getFloat(line, "Y") + p = self.getInt(line, "P") + if p is not None: + if extruder_offsets.get(p, None) is None: + extruder_offsets[p] = {'x': 0, 'y': 0} + print(p, type(p)) + if x is not None: + extruder_offsets[p]['x'] = x + if y is not None: + extruder_offsets[p]['y'] = y + + T = self.getInt(line, "T") + if T is not None: + current_extruder = T + if len(current_path) > 1 and current_z > 0: + if self.createPolygon(layer_data, current_path, current_layer, current_extruder, extruder_offsets): + current_layer += 1 + else: + current_path.clear() if len(current_path) > 1: - if self.createPolygon(layer_data, current_path, current_layer, current_extruder): + if self.createPolygon(layer_data, current_path, current_layer, current_extruder, extruder_offsets): current_layer += 1 layer_mesh = layer_data.build() From 2948e99fe8988feb0fd036416b2cfc47d4dc3282 Mon Sep 17 00:00:00 2001 From: Victor Larchenko Date: Thu, 10 Nov 2016 16:13:26 +0600 Subject: [PATCH 41/75] T466: Removed dual extrusion offsets, the second extruder shown as another color --- plugins/GCodeReader/GCodeReader.py | 25 ++++++------------------- 1 file changed, 6 insertions(+), 19 deletions(-) diff --git a/plugins/GCodeReader/GCodeReader.py b/plugins/GCodeReader/GCodeReader.py index 54af0d5dae..cf7d16c5a4 100644 --- a/plugins/GCodeReader/GCodeReader.py +++ b/plugins/GCodeReader/GCodeReader.py @@ -80,7 +80,7 @@ class GCodeReader(MeshReader): return AxisAlignedBox(minimum=Vector(0, 0, 0), maximum=Vector(10, 10, 10)) @staticmethod - def createPolygon(layer_data, path, layer_id, extruder, extruder_offsets): + def createPolygon(layer_data, path, layer_id, extruder): countvalid = 0 for point in path: if point[3] > 0: @@ -104,8 +104,8 @@ class GCodeReader(MeshReader): points = numpy.empty((count, 3), numpy.float32) i = 0 for point in path: - points[i, 0] = point[0] + extruder_offsets[extruder]['x'] - points[i, 1] = point[1] + extruder_offsets[extruder]['y'] + points[i, 0] = point[0] + points[i, 1] = point[1] points[i, 2] = point[2] if i > 0: if point[3] == 1: @@ -156,7 +156,6 @@ class GCodeReader(MeshReader): layer_data = LayerDataBuilder.LayerDataBuilder() current_extruder = 0 - extruder_offsets = {0: {'x': 0, 'y': 0}} current_path = [] current_x = 0 current_y = 0 @@ -207,7 +206,7 @@ class GCodeReader(MeshReader): current_path.append([current_x, current_z, -current_y, 0]) if z_changed: if len(current_path) > 1 and current_z > 0: - if self.createPolygon(layer_data, current_path, current_layer, current_extruder, extruder_offsets): + if self.createPolygon(layer_data, current_path, current_layer, current_extruder): current_layer += 1 else: current_path.clear() @@ -230,30 +229,18 @@ class GCodeReader(MeshReader): current_y += y if z is not None: current_z += z - elif G == 10: - x = self.getFloat(line, "X") - y = self.getFloat(line, "Y") - p = self.getInt(line, "P") - if p is not None: - if extruder_offsets.get(p, None) is None: - extruder_offsets[p] = {'x': 0, 'y': 0} - print(p, type(p)) - if x is not None: - extruder_offsets[p]['x'] = x - if y is not None: - extruder_offsets[p]['y'] = y T = self.getInt(line, "T") if T is not None: current_extruder = T if len(current_path) > 1 and current_z > 0: - if self.createPolygon(layer_data, current_path, current_layer, current_extruder, extruder_offsets): + if self.createPolygon(layer_data, current_path, current_layer, current_extruder): current_layer += 1 else: current_path.clear() if len(current_path) > 1: - if self.createPolygon(layer_data, current_path, current_layer, current_extruder, extruder_offsets): + if self.createPolygon(layer_data, current_path, current_layer, current_extruder): current_layer += 1 layer_mesh = layer_data.build() From ce9251b5a6cb486d3b5620f91f0c5fd8d20f7fb7 Mon Sep 17 00:00:00 2001 From: Victor Larchenko Date: Thu, 10 Nov 2016 16:56:45 +0600 Subject: [PATCH 42/75] T466: Fixed show only top layers bug --- plugins/GCodeReader/GCodeReader.py | 2 +- plugins/LayerView/LayerPass.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/GCodeReader/GCodeReader.py b/plugins/GCodeReader/GCodeReader.py index cf7d16c5a4..72e97465f4 100644 --- a/plugins/GCodeReader/GCodeReader.py +++ b/plugins/GCodeReader/GCodeReader.py @@ -99,7 +99,7 @@ class GCodeReader(MeshReader): count = len(path) line_types = numpy.empty((count - 1, 1), numpy.int32) line_types[:, 0] = 1 - line_widths = numpy.empty((count - 1, 1), numpy.int32) + line_widths = numpy.empty((count - 1, 1), numpy.float32) line_widths[:, 0] = 0.5 points = numpy.empty((count, 3), numpy.float32) i = 0 diff --git a/plugins/LayerView/LayerPass.py b/plugins/LayerView/LayerPass.py index a8a2b7ba7e..9e610b68d2 100644 --- a/plugins/LayerView/LayerPass.py +++ b/plugins/LayerView/LayerPass.py @@ -55,7 +55,7 @@ class LayerPass(RenderPass): continue # Render all layers below a certain number as line mesh instead of vertices. - if self._layerview._current_layer_num - self._layerview._solid_layers > -1 and (not self._layerview._only_show_top_layers or hasattr(node, "gcode")): + if self._layerview._current_layer_num - self._layerview._solid_layers > -1 and not self._layerview._only_show_top_layers: start = 0 end = 0 element_counts = layer_data.getElementCounts() From 1631045d7ab94fca0eb984d7978b8015f4427442 Mon Sep 17 00:00:00 2001 From: Victor Larchenko Date: Tue, 22 Nov 2016 15:12:37 +0600 Subject: [PATCH 43/75] D5: Refactoring --- cura/CuraApplication.py | 55 +++++++++++++------ cura/PrintInformation.py | 9 +-- .../CuraEngineBackend/CuraEngineBackend.py | 17 ++++-- .../ProcessSlicedLayersJob.py | 1 + plugins/GCodeReader/GCodeReader.py | 8 +-- plugins/GCodeReader/__init__.py | 8 +-- resources/qml/Cura.qml | 2 +- resources/qml/Menus/ViewMenu.qml | 2 +- resources/qml/SaveButton.qml | 8 +-- resources/qml/Sidebar.qml | 2 +- 10 files changed, 69 insertions(+), 43 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 0a552428af..58dd3d8bc4 100644 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -19,6 +19,7 @@ from UM.SaveFile import SaveFile from UM.Scene.Selection import Selection from UM.Scene.GroupDecorator import GroupDecorator from UM.Settings.Validator import Validator +from UM.Message import Message from UM.Operations.AddSceneNodeOperation import AddSceneNodeOperation from UM.Operations.RemoveSceneNodeOperation import RemoveSceneNodeOperation @@ -32,6 +33,7 @@ from UM.Settings.ContainerRegistry import ContainerRegistry from UM.Settings.SettingFunction import SettingFunction from UM.i18n import i18nCatalog +catalog = i18nCatalog("cura") from . import PlatformPhysics from . import BuildVolume @@ -289,6 +291,8 @@ class CuraApplication(QtApplication): self._recent_files.append(QUrl.fromLocalFile(f)) + self.changeLayerViewSignal.connect(self.changeToLayerView) + def _onEngineCreated(self): self._engine.addImageProvider("camera", CameraImageProvider.CameraImageProvider()) @@ -536,31 +540,45 @@ class CuraApplication(QtApplication): qmlRegisterType(QUrl.fromLocalFile(path), "Cura", 1, 0, type_name) loadingFiles = [] + non_sliceable_extensions = [".gcode", ".g"] + + changeLayerViewSignal = pyqtSignal() + + def changeToLayerView(self): + self.getController().setActiveView("LayerView") @pyqtSlot(QUrl) def loadFile(self, file): scene = self.getController().getScene() - for node1 in DepthFirstIterator(scene.getRoot()): - if hasattr(node1, "gcode") and getattr(node1, "gcode") is True: - self.deleteAll() - break - if not file.isValid(): return - supported_extensions = [".gcode", ".g"] + for node in DepthFirstIterator(scene.getRoot()): + if hasattr(node, "gcode") and getattr(node, "gcode") is True: + self.deleteAll() + break f = file.toLocalFile() extension = os.path.splitext(f)[1] + filename = os.path.basename(f) if len(self.loadingFiles) > 0: - if extension.lower() in supported_extensions: + # If a non-slicable file is already being loaded, we prevent loading of any further non-slicable files + if extension.lower() in self.non_sliceable_extensions: + message = Message( + catalog.i18nc("@info:status", "Only one G-code file can be loaded at a time. Skipped importing {0}", + filename)) + message.show() return + # If file being loaded is non-slicable file, then prevent loading of any other files extension = os.path.splitext(self.loadingFiles[0])[1] - if extension.lower() in supported_extensions: + if extension.lower() in self.non_sliceable_extensions: + message = Message( + catalog.i18nc("@info:status", + "Can't open any other file if G-code is loading. Skipped importing {0}", + filename)) + message.show() return - elif extension.lower() in supported_extensions: - self.getController().setActiveView("LayerView") self.loadingFiles.append(f) @@ -570,11 +588,16 @@ class CuraApplication(QtApplication): def _readMeshFinished(self, job): node = job.getResult() + filename = job.getFileName() + self.loadingFiles.remove(filename) + if node != None: - filename = job.getFileName() node.setSelectable(True) - node.setName(filename) - self.loadingFiles.remove(filename) + node.setName(os.path.basename(filename)) + + extension = os.path.splitext(filename)[1] + if extension.lower() in self.non_sliceable_extensions: + self.changeLayerViewSignal.emit() op = AddSceneNodeOperation(node, self.getController().getScene().getRoot()) op.push() @@ -1056,14 +1079,14 @@ class CuraApplication(QtApplication): _hide_settings = False - HideSettingsChanged = pyqtSignal(bool) + hideSettingsChanged = pyqtSignal(bool) @pyqtSlot(bool) def setHideSettings(self, hide): self._hide_settings = hide - self.HideSettingsChanged.emit(hide) + self.hideSettingsChanged.emit(hide) - @pyqtProperty(bool, notify=HideSettingsChanged) + @pyqtProperty(bool, fset=setHideSettings, notify=hideSettingsChanged) def hideSettings(self): return self._hide_settings diff --git a/cura/PrintInformation.py b/cura/PrintInformation.py index 92aeb17ea0..8fa7c48840 100644 --- a/cura/PrintInformation.py +++ b/cura/PrintInformation.py @@ -13,6 +13,9 @@ import math import os.path import unicodedata +from UM.i18n import i18nCatalog +catalog = i18nCatalog("cura") + ## A class for processing and calculating minimum, current and maximum print time as well as managing the job name # # This class contains all the logic relating to calculation and slicing for the @@ -66,7 +69,7 @@ class PrintInformation(QObject): preSlicedChanged = pyqtSignal() @pyqtProperty(bool, notify=preSlicedChanged) - def isPreSliced(self): + def preSliced(self): return self._pre_sliced def setPreSliced(self, pre_sliced): @@ -134,10 +137,8 @@ class PrintInformation(QObject): def createJobName(self, base_name): base_name = self._stripAccents(base_name) self._setAbbreviatedMachineName() - if len(base_name) > 100: - base_name = "%s..." % base_name[:100] if self._pre_sliced: - return "Pre-sliced file " + base_name + return catalog.i18nc("@label", "Pre-sliced file {0}", base_name) elif Preferences.getInstance().getValue("cura/jobname_prefix"): return self._abbr_machine + "_" + base_name else: diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index 3737976175..5524fd8d7b 100644 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -69,7 +69,7 @@ class CuraEngineBackend(Backend): self._scene = Application.getInstance().getController().getScene() self._scene.sceneChanged.connect(self._onSceneChanged) - self._pauseSlicing = False + self._pause_slicing = False # Workaround to disable layer view processing if layer view is not active. self._layer_view_active = False @@ -116,6 +116,7 @@ class CuraEngineBackend(Backend): self.backendQuit.connect(self._onBackendQuit) self.backendConnected.connect(self._onBackendConnected) + self.backendStateChange.connect(self._onBackendStateChanged) # When a tool operation is in progress, don't slice. So we need to listen for tool operations. Application.getInstance().getController().toolOperationStarted.connect(self._onToolOperationStarted) @@ -152,7 +153,7 @@ class CuraEngineBackend(Backend): ## Perform a slice of the scene. def slice(self): Logger.log("d", "Starting slice job...") - if self._pauseSlicing: + if self._pause_slicing: return self._slice_start_time = time() if not self._enabled or not self._global_container_stack: # We shouldn't be slicing. @@ -187,6 +188,12 @@ class CuraEngineBackend(Backend): self._start_slice_job.start() self._start_slice_job.finished.connect(self._onStartSliceCompleted) + def _onBackendStateChanged(self, state): + if state == BackendState.SlicingDisabled: + self._pause_slicing = True + else: + self._pause_slicing = False + ## Terminate the engine process. def _terminate(self): self._slicing = False @@ -397,15 +404,13 @@ class CuraEngineBackend(Backend): ## Manually triggers a reslice def forceSlice(self): - if not self._pauseSlicing: - self._change_timer.start() + self._change_timer.start() ## Called when anything has changed to the stuff that needs to be sliced. # # This indicates that we should probably re-slice soon. def _onChanged(self, *args, **kwargs): - if not self._pauseSlicing: - self._change_timer.start() + self._change_timer.start() ## Called when the back-end connects to the front-end. def _onBackendConnected(self): diff --git a/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py b/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py index 490690bd27..c4e9554b2c 100644 --- a/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py +++ b/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py @@ -60,6 +60,7 @@ class ProcessSlicedLayersJob(Job): for node in DepthFirstIterator(self._scene.getRoot()): if node.callDecoration("getLayerData"): node.getParent().removeChild(node) + break if self._abort_requested: if self._progress: self._progress.hide() diff --git a/plugins/GCodeReader/GCodeReader.py b/plugins/GCodeReader/GCodeReader.py index 72e97465f4..09e5495b94 100644 --- a/plugins/GCodeReader/GCodeReader.py +++ b/plugins/GCodeReader/GCodeReader.py @@ -10,6 +10,7 @@ from UM.Math.AxisAlignedBox import AxisAlignedBox from UM.Application import Application from UM.Message import Message from UM.Logger import Logger +from UM.Backend.Backend import BackendState from UM.i18n import i18nCatalog catalog = i18nCatalog("cura") @@ -67,11 +68,11 @@ class GCodeReader(MeshReader): backend = Application.getInstance().getBackend() if self.scene_node is not None and self.scene_node.getParent() is None: self.scene_node = None - backend._pauseSlicing = False + backend.backendStateChange.emit(BackendState.NotStarted) Application.getInstance().setHideSettings(False) Application.getInstance().getPrintInformation().setPreSliced(False) else: - backend._pauseSlicing = True + backend.backendStateChange.emit(BackendState.SlicingDisabled) Application.getInstance().getPrintInformation().setPreSliced(True) Application.getInstance().setHideSettings(True) @@ -135,9 +136,8 @@ class GCodeReader(MeshReader): self.scene_node.parentChanged.connect(self.onParentChanged) backend = Application.getInstance().getBackend() - backend._pauseSlicing = True backend.close() - backend.backendStateChange.emit(3) + backend.backendStateChange.emit(BackendState.SlicingDisabled) glist = getattr(Application.getInstance().getController().getScene(), "gcode_list") glist.clear() diff --git a/plugins/GCodeReader/__init__.py b/plugins/GCodeReader/__init__.py index 4bb3d787bb..7e543d6624 100644 --- a/plugins/GCodeReader/__init__.py +++ b/plugins/GCodeReader/__init__.py @@ -4,21 +4,21 @@ from . import GCodeReader from UM.i18n import i18nCatalog -i18n_catalog = i18nCatalog("uranium") +i18n_catalog = i18nCatalog("cura") def getMetaData(): return { "plugin": { - "name": i18n_catalog.i18nc("@label", "GCODE Reader"), + "name": i18n_catalog.i18nc("@label", "G-code Reader"), "author": "Victor Larchenko", "version": "1.0", - "description": i18n_catalog.i18nc("@info:whatsthis", "Allows displaying GCODE files."), + "description": i18n_catalog.i18nc("@info:whatsthis", "Allows loading and displaying G-code files."), "api": 3 }, "mesh_reader": [ { "extension": "gcode", - "description": i18n_catalog.i18nc("@item:inlistbox", "GCODE File") + "description": i18n_catalog.i18nc("@item:inlistbox", "G-code File") }, { "extension": "g", diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index 4a6a780305..c1fa773816 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -412,7 +412,7 @@ UM.MainWindow style: UM.Theme.styles.tool_button; tooltip: ""; - enabled: !PrintInformation.isPreSliced + enabled: !PrintInformation.preSliced menu: ViewMenu { } } diff --git a/resources/qml/Menus/ViewMenu.qml b/resources/qml/Menus/ViewMenu.qml index dc9cbe7501..859620692e 100644 --- a/resources/qml/Menus/ViewMenu.qml +++ b/resources/qml/Menus/ViewMenu.qml @@ -11,7 +11,7 @@ Menu { title: catalog.i18nc("@title:menu menubar:toplevel", "&View"); id: menu - enabled: !PrintInformation.isPreSliced + enabled: !PrintInformation.preSliced Instantiator { model: UM.ViewModel { } diff --git a/resources/qml/SaveButton.qml b/resources/qml/SaveButton.qml index a25aae7a5e..843ac19837 100644 --- a/resources/qml/SaveButton.qml +++ b/resources/qml/SaveButton.qml @@ -14,7 +14,6 @@ Rectangle { property real progress: UM.Backend.progress; property int backendState: UM.Backend.state; - property bool backendPaused: UM.Backend.paused; property bool activity: Printer.getPlatformActivity; property int totalHeight: childrenRect.height + UM.Theme.getSize("default_margin").height property string fileBaseName @@ -25,11 +24,6 @@ Rectangle { return catalog.i18nc("@label:PrintjobStatus", "Please load a 3d model"); } - if (backendPaused) - { - return catalog.i18nc("@label:PrintjobStatus", "Slicing temporary disabled"); - } - switch(base.backendState) { case 1: @@ -40,6 +34,8 @@ Rectangle { return catalog.i18nc("@label:PrintjobStatus %1 is target operation","Ready to %1").arg(UM.OutputDeviceManager.activeDeviceShortDescription); case 4: return catalog.i18nc("@label:PrintjobStatus", "Unable to Slice"); + case 5: + return catalog.i18nc("@label:PrintjobStatus", "Slicing unavailable"); default: return ""; } diff --git a/resources/qml/Sidebar.qml b/resources/qml/Sidebar.qml index 44cad11d09..202bfd070c 100644 --- a/resources/qml/Sidebar.qml +++ b/resources/qml/Sidebar.qml @@ -289,7 +289,7 @@ Rectangle Label { id: settingsModeLabel - text: !hideSettings ? catalog.i18nc("@label:listbox", "Print Setup") : catalog.i18nc("@label:listbox","Not possible to modify slicing settings or re-slice\nwhile a GCODE file is open"); + text: !hideSettings ? catalog.i18nc("@label:listbox", "Print Setup") : catalog.i18nc("@label:listbox","Print Setup disabled\nG-code files cannot be modified"); anchors.left: parent.left anchors.leftMargin: UM.Theme.getSize("default_margin").width; anchors.top: headerSeparator.bottom From cd7979e3019b1bc1c8ca58e68be345bffee470aa Mon Sep 17 00:00:00 2001 From: Victor Larchenko Date: Tue, 22 Nov 2016 16:30:56 +0600 Subject: [PATCH 44/75] D5: Refactoring --- cura/CuraApplication.py | 4 + .../ProcessSlicedLayersJob.py | 1 - plugins/GCodeReader/GCodeReader.py | 202 +++++++++--------- 3 files changed, 102 insertions(+), 105 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 58dd3d8bc4..7cc4be3a9e 100644 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -546,6 +546,10 @@ class CuraApplication(QtApplication): def changeToLayerView(self): self.getController().setActiveView("LayerView") + view = self.getController().getActiveView() + view.resetLayerData() + view.setLayer(999999) + view.calculateMaxLayers() @pyqtSlot(QUrl) def loadFile(self, file): diff --git a/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py b/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py index c4e9554b2c..490690bd27 100644 --- a/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py +++ b/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py @@ -60,7 +60,6 @@ class ProcessSlicedLayersJob(Job): for node in DepthFirstIterator(self._scene.getRoot()): if node.callDecoration("getLayerData"): node.getParent().removeChild(node) - break if self._abort_requested: if self._progress: self._progress.hide() diff --git a/plugins/GCodeReader/GCodeReader.py b/plugins/GCodeReader/GCodeReader.py index 09e5495b94..c7b8f806f0 100644 --- a/plugins/GCodeReader/GCodeReader.py +++ b/plugins/GCodeReader/GCodeReader.py @@ -18,7 +18,7 @@ catalog = i18nCatalog("cura") from cura import LayerDataBuilder from cura import LayerDataDecorator -from cura import LayerPolygon +from cura.LayerPolygon import LayerPolygon import numpy import math @@ -28,66 +28,66 @@ class GCodeReader(MeshReader): def __init__(self): super(GCodeReader, self).__init__() self._supported_extensions = [".gcode", ".g"] - Application.getInstance().hideMessageSignal.connect(self.onHideMessage) - self.cancelled = False - self.message = None + Application.getInstance().hideMessageSignal.connect(self._onHideMessage) + self._cancelled = False + self._message = None - self.scene_node = None + self._scene_node = None @staticmethod - def getInt(line, code): - n = line.find(code) + 1 + def _getValue(line, code): + n = line.find(code) + len(code) if n < 1: return None m = line.find(' ', n) try: if m < 0: - return int(line[n:]) - return int(line[n:m]) + return line[n:] + return line[n:m] except: return None - @staticmethod - def getFloat(line, code): - n = line.find(code) + 1 - if n < 1: - return None - m = line.find(' ', n) + def _getInt(self, line, code): + value = self._getValue(line, code) try: - if m < 0: - return float(line[n:]) - return float(line[n:m]) + return int(value) except: return None - def onHideMessage(self, m): - if m == self.message: - self.cancelled = True + def _getFloat(self, line, code): + value = self._getValue(line, code) + try: + return float(value) + except: + return None - def onParentChanged(self, node): + def _onHideMessage(self, message): + if message == self._message: + self._cancelled = True + + def _onParentChanged(self, node): backend = Application.getInstance().getBackend() - if self.scene_node is not None and self.scene_node.getParent() is None: - self.scene_node = None + if self._scene_node is not None and self._scene_node.getParent() is None: + self._scene_node = None backend.backendStateChange.emit(BackendState.NotStarted) Application.getInstance().setHideSettings(False) Application.getInstance().getPrintInformation().setPreSliced(False) - else: - backend.backendStateChange.emit(BackendState.SlicingDisabled) - Application.getInstance().getPrintInformation().setPreSliced(True) - Application.getInstance().setHideSettings(True) + # else: + # backend.backendStateChange.emit(BackendState.SlicingDisabled) + # Application.getInstance().getPrintInformation().setPreSliced(True) + # Application.getInstance().setHideSettings(True) @staticmethod - def getNullBoundingBox(): + def _getNullBoundingBox(): return AxisAlignedBox(minimum=Vector(0, 0, 0), maximum=Vector(10, 10, 10)) @staticmethod - def createPolygon(layer_data, path, layer_id, extruder): + def _createPolygon(layer_data, path, layer_id, extruder): countvalid = 0 for point in path: if point[3] > 0: countvalid += 1 if countvalid < 2: - path.clear() return False try: layer_data.addLayer(layer_id) @@ -95,57 +95,51 @@ class GCodeReader(MeshReader): layer_data.setLayerThickness(layer_id, 0.25) this_layer = layer_data.getLayer(layer_id) except ValueError: - path.clear() return False count = len(path) line_types = numpy.empty((count - 1, 1), numpy.int32) - line_types[:, 0] = 1 line_widths = numpy.empty((count - 1, 1), numpy.float32) line_widths[:, 0] = 0.5 points = numpy.empty((count, 3), numpy.float32) i = 0 for point in path: points[i, 0] = point[0] - points[i, 1] = point[1] - points[i, 2] = point[2] + points[i, 1] = point[2] + points[i, 2] = -point[1] if i > 0: - if point[3] == 1: + if point[3] == LayerPolygon.Inset0Type: line_types[i - 1] = extruder + 1 else: line_types[i - 1] = point[3] i += 1 - this_poly = LayerPolygon.LayerPolygon(layer_data, extruder, line_types, points, line_widths) + this_poly = LayerPolygon(layer_data, extruder, line_types, points, line_widths) this_poly.buildCache() this_layer.polygons.append(this_poly) - - path.clear() return True def read(self, file_name): - extension = os.path.splitext(file_name)[1] - if extension.lower() in self._supported_extensions: - Logger.log("d", "Preparing to load %s" % file_name) - self.cancelled = False - Application.getInstance().deleteAll() + Logger.log("d", "Preparing to load %s" % file_name) + self._cancelled = False - self.scene_node = SceneNode() - self.scene_node.getBoundingBox = self.getNullBoundingBox - self.scene_node.gcode = True - self.scene_node.parentChanged.connect(self.onParentChanged) + self._scene_node = SceneNode() + self._scene_node.getBoundingBox = self._getNullBoundingBox # Manually set bounding box, because mesh doesn't have mesh data + self._scene_node.gcode = True + self._scene_node.parentChanged.connect(self._onParentChanged) - backend = Application.getInstance().getBackend() - backend.close() - backend.backendStateChange.emit(BackendState.SlicingDisabled) + backend = Application.getInstance().getBackend() + backend.close() + backend.backendStateChange.emit(BackendState.SlicingDisabled) - glist = getattr(Application.getInstance().getController().getScene(), "gcode_list") - glist.clear() + glist = [] + Application.getInstance().getController().getScene().gcode_list = glist - Logger.log("d", "Opening file %s" % file_name) + Logger.log("d", "Opening file %s" % file_name) - file = open(file_name, "r") + layer_data_builder = LayerDataBuilder.LayerDataBuilder() + with open(file_name, "r") as file: file_lines = 0 current_line = 0 for line in file: @@ -153,7 +147,6 @@ class GCodeReader(MeshReader): file.seek(0) file_step = max(math.floor(file_lines / 100), 1) - layer_data = LayerDataBuilder.LayerDataBuilder() current_extruder = 0 current_path = [] @@ -163,30 +156,30 @@ class GCodeReader(MeshReader): current_e = 0 current_layer = 0 - self.message = Message(catalog.i18nc("@info:status", "Parsing GCODE"), lifetime=0) - self.message.setProgress(0) - self.message.show() + self._message = Message(catalog.i18nc("@info:status", "Parsing GCODE"), lifetime=0) + self._message.setProgress(0) + self._message.show() Logger.log("d", "Parsing %s" % file_name) for line in file: - if self.cancelled: + if self._cancelled: Logger.log("w", "Parsing %s cancelled" % file_name) return None current_line += 1 if current_line % file_step == 0: - self.message.setProgress(math.floor(current_line/file_lines*100)) + self._message.setProgress(math.floor(current_line / file_lines * 100)) if len(line) == 0: continue if line[0] == ";": continue - G = self.getInt(line, "G") + G = self._getInt(line, "G") if G is not None: if G == 0 or G == 1: - x = self.getFloat(line, "X") - y = self.getFloat(line, "Y") - z = self.getFloat(line, "Z") - e = self.getFloat(line, "E") + x = self._getFloat(line, "X") + y = self._getFloat(line, "Y") + z = self._getFloat(line, "Z") + e = self._getFloat(line, "E") z_changed = False if x is not None: current_x = x @@ -198,78 +191,79 @@ class GCodeReader(MeshReader): current_z = z if e is not None: if e > current_e: - current_path.append([current_x, current_z, -current_y, 1]) # extrusion + current_path.append([current_x, current_y, current_z, LayerPolygon.Inset0Type]) # extrusion else: - current_path.append([current_x, current_z, -current_y, 2]) # retraction + current_path.append([current_x, current_y, current_z, LayerPolygon.MoveRetractionType]) # retraction current_e = e else: - current_path.append([current_x, current_z, -current_y, 0]) + current_path.append([current_x, current_y, current_z, LayerPolygon.NoneType]) if z_changed: if len(current_path) > 1 and current_z > 0: - if self.createPolygon(layer_data, current_path, current_layer, current_extruder): + if self._createPolygon(layer_data_builder, current_path, current_layer, current_extruder): current_layer += 1 + current_path.clear() else: current_path.clear() elif G == 28: - x = self.getFloat(line, "X") - y = self.getFloat(line, "Y") + x = self._getFloat(line, "X") + y = self._getFloat(line, "Y") if x is not None: current_x = x if y is not None: current_y = y current_z = 0 elif G == 92: - x = self.getFloat(line, "X") - y = self.getFloat(line, "Y") - z = self.getFloat(line, "Z") + x = self._getFloat(line, "X") + y = self._getFloat(line, "Y") + z = self._getFloat(line, "Z") + e = self._getFloat(line, "E") if x is not None: - current_x += x + current_x = x if y is not None: - current_y += y + current_y = y if z is not None: - current_z += z + current_z = z + if e is not None: + current_e = e - T = self.getInt(line, "T") + T = self._getInt(line, "T") if T is not None: current_extruder = T if len(current_path) > 1 and current_z > 0: - if self.createPolygon(layer_data, current_path, current_layer, current_extruder): + if self._createPolygon(layer_data_builder, current_path, current_layer, current_extruder): current_layer += 1 + current_path.clear() else: current_path.clear() - if len(current_path) > 1: - if self.createPolygon(layer_data, current_path, current_layer, current_extruder): + if len(current_path) > 1 and current_z > 0: + if self._createPolygon(layer_data_builder, current_path, current_layer, current_extruder): current_layer += 1 + current_path.clear() - layer_mesh = layer_data.build() - decorator = LayerDataDecorator.LayerDataDecorator() - decorator.setLayerData(layer_mesh) + layer_mesh = layer_data_builder.build() + decorator = LayerDataDecorator.LayerDataDecorator() + decorator.setLayerData(layer_mesh) - self.scene_node.removeDecorator("LayerDataDecorator") - self.scene_node.addDecorator(decorator) + self._scene_node.removeDecorator("LayerDataDecorator") + self._scene_node.addDecorator(decorator) - Logger.log("d", "Finished parsing %s" % file_name) - self.message.hide() + Logger.log("d", "Finished parsing %s" % file_name) + self._message.hide() - if current_layer == 0: - Logger.log("w", "File %s doesn't contain any valid layers" % file_name) + if current_layer == 0: + Logger.log("w", "File %s doesn't contain any valid layers" % file_name) - Application.getInstance().getPrintInformation().setPreSliced(True) + Application.getInstance().getPrintInformation().setPreSliced(True) + Application.getInstance().setHideSettings(True) - settings = Application.getInstance().getGlobalContainerStack() - machine_width = settings.getProperty("machine_width", "value") - machine_depth = settings.getProperty("machine_depth", "value") + settings = Application.getInstance().getGlobalContainerStack() + machine_width = settings.getProperty("machine_width", "value") + machine_depth = settings.getProperty("machine_depth", "value") - self.scene_node.setPosition(Vector(-machine_width / 2, 0, machine_depth / 2)) + self._scene_node.setPosition(Vector(-machine_width / 2, 0, machine_depth / 2)) - view = Application.getInstance().getController().getActiveView() - if view.getPluginId() == "LayerView": - view.resetLayerData() - view.setLayer(999999) - view.calculateMaxLayers() + Logger.log("d", "Loaded %s" % file_name) - Logger.log("d", "Loaded %s" % file_name) - - return self.scene_node + return self._scene_node From c18b3149da3a344fc4d77e269752353b651f1718 Mon Sep 17 00:00:00 2001 From: Victor Larchenko Date: Wed, 23 Nov 2016 11:32:18 +0600 Subject: [PATCH 45/75] D5: Moved loading files code --- cura/CuraApplication.py | 60 ------------------- .../CuraEngineBackend/CuraEngineBackend.py | 7 +++ plugins/GCodeReader/GCodeReader.py | 30 +++++----- resources/qml/Cura.qml | 4 +- resources/qml/Menus/RecentFilesMenu.qml | 2 +- 5 files changed, 24 insertions(+), 79 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 7cc4be3a9e..44a1f4d8a0 100644 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -539,9 +539,6 @@ class CuraApplication(QtApplication): qmlRegisterType(QUrl.fromLocalFile(path), "Cura", 1, 0, type_name) - loadingFiles = [] - non_sliceable_extensions = [".gcode", ".g"] - changeLayerViewSignal = pyqtSignal() def changeToLayerView(self): @@ -551,63 +548,6 @@ class CuraApplication(QtApplication): view.setLayer(999999) view.calculateMaxLayers() - @pyqtSlot(QUrl) - def loadFile(self, file): - scene = self.getController().getScene() - - if not file.isValid(): - return - - for node in DepthFirstIterator(scene.getRoot()): - if hasattr(node, "gcode") and getattr(node, "gcode") is True: - self.deleteAll() - break - - f = file.toLocalFile() - extension = os.path.splitext(f)[1] - filename = os.path.basename(f) - if len(self.loadingFiles) > 0: - # If a non-slicable file is already being loaded, we prevent loading of any further non-slicable files - if extension.lower() in self.non_sliceable_extensions: - message = Message( - catalog.i18nc("@info:status", "Only one G-code file can be loaded at a time. Skipped importing {0}", - filename)) - message.show() - return - # If file being loaded is non-slicable file, then prevent loading of any other files - extension = os.path.splitext(self.loadingFiles[0])[1] - if extension.lower() in self.non_sliceable_extensions: - message = Message( - catalog.i18nc("@info:status", - "Can't open any other file if G-code is loading. Skipped importing {0}", - filename)) - message.show() - return - - self.loadingFiles.append(f) - - job = ReadMeshJob(f) - job.finished.connect(self._readMeshFinished) - job.start() - - def _readMeshFinished(self, job): - node = job.getResult() - filename = job.getFileName() - self.loadingFiles.remove(filename) - - if node != None: - node.setSelectable(True) - node.setName(os.path.basename(filename)) - - extension = os.path.splitext(filename)[1] - if extension.lower() in self.non_sliceable_extensions: - self.changeLayerViewSignal.emit() - - op = AddSceneNodeOperation(node, self.getController().getScene().getRoot()) - op.push() - - self.getController().getScene().sceneChanged.emit(node) - def onSelectionChanged(self): if Selection.hasSelection(): if self.getController().getActiveTool(): diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index 5524fd8d7b..31e35aa778 100644 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -188,6 +188,13 @@ class CuraEngineBackend(Backend): self._start_slice_job.start() self._start_slice_job.finished.connect(self._onStartSliceCompleted) + def pauseSlicing(self): + self.close() + self.backendStateChange.emit(BackendState.SlicingDisabled) + + def continueSlicing(self): + self.backendStateChange.emit(BackendState.NotStarted) + def _onBackendStateChanged(self, state): if state == BackendState.SlicingDisabled: self._pause_slicing = True diff --git a/plugins/GCodeReader/GCodeReader.py b/plugins/GCodeReader/GCodeReader.py index c7b8f806f0..66a2dfa6b6 100644 --- a/plugins/GCodeReader/GCodeReader.py +++ b/plugins/GCodeReader/GCodeReader.py @@ -22,6 +22,7 @@ from cura.LayerPolygon import LayerPolygon import numpy import math +import re class GCodeReader(MeshReader): @@ -39,7 +40,9 @@ class GCodeReader(MeshReader): n = line.find(code) + len(code) if n < 1: return None - m = line.find(' ', n) + pattern = re.compile("[;\s]") + match = pattern.search(line, n) + m = match.start() if math is not None else -1 try: if m < 0: return line[n:] @@ -66,23 +69,18 @@ class GCodeReader(MeshReader): self._cancelled = True def _onParentChanged(self, node): - backend = Application.getInstance().getBackend() if self._scene_node is not None and self._scene_node.getParent() is None: self._scene_node = None - backend.backendStateChange.emit(BackendState.NotStarted) + Application.getInstance().getBackend().continueSlicing() Application.getInstance().setHideSettings(False) Application.getInstance().getPrintInformation().setPreSliced(False) - # else: - # backend.backendStateChange.emit(BackendState.SlicingDisabled) - # Application.getInstance().getPrintInformation().setPreSliced(True) - # Application.getInstance().setHideSettings(True) @staticmethod def _getNullBoundingBox(): return AxisAlignedBox(minimum=Vector(0, 0, 0), maximum=Vector(10, 10, 10)) @staticmethod - def _createPolygon(layer_data, path, layer_id, extruder): + def _createPolygon(layer_data, path, layer_id, extruder, thickness): countvalid = 0 for point in path: if point[3] > 0: @@ -92,7 +90,7 @@ class GCodeReader(MeshReader): try: layer_data.addLayer(layer_id) layer_data.setLayerHeight(layer_id, path[0][1]) - layer_data.setLayerThickness(layer_id, 0.25) + layer_data.setLayerThickness(layer_id, thickness) this_layer = layer_data.getLayer(layer_id) except ValueError: return False @@ -128,9 +126,7 @@ class GCodeReader(MeshReader): self._scene_node.gcode = True self._scene_node.parentChanged.connect(self._onParentChanged) - backend = Application.getInstance().getBackend() - backend.close() - backend.backendStateChange.emit(BackendState.SlicingDisabled) + Application.getInstance().getBackend().pauseSlicing() glist = [] Application.getInstance().getController().getScene().gcode_list = glist @@ -155,6 +151,7 @@ class GCodeReader(MeshReader): current_z = 0 current_e = 0 current_layer = 0 + prev_z = 0 self._message = Message(catalog.i18nc("@info:status", "Parsing GCODE"), lifetime=0) self._message.setProgress(0) @@ -188,6 +185,7 @@ class GCodeReader(MeshReader): if z is not None: if not current_z == z: z_changed = True + prev_z = current_z current_z = z if e is not None: if e > current_e: @@ -196,10 +194,10 @@ class GCodeReader(MeshReader): current_path.append([current_x, current_y, current_z, LayerPolygon.MoveRetractionType]) # retraction current_e = e else: - current_path.append([current_x, current_y, current_z, LayerPolygon.NoneType]) + current_path.append([current_x, current_y, current_z, LayerPolygon.MoveCombingType]) if z_changed: if len(current_path) > 1 and current_z > 0: - if self._createPolygon(layer_data_builder, current_path, current_layer, current_extruder): + if self._createPolygon(layer_data_builder, current_path, current_layer, current_extruder, math.fabs(current_z - prev_z)): current_layer += 1 current_path.clear() else: @@ -231,14 +229,14 @@ class GCodeReader(MeshReader): if T is not None: current_extruder = T if len(current_path) > 1 and current_z > 0: - if self._createPolygon(layer_data_builder, current_path, current_layer, current_extruder): + if self._createPolygon(layer_data_builder, current_path, current_layer, current_extruder, math.fabs(current_z - prev_z)): current_layer += 1 current_path.clear() else: current_path.clear() if len(current_path) > 1 and current_z > 0: - if self._createPolygon(layer_data_builder, current_path, current_layer, current_extruder): + if self._createPolygon(layer_data_builder, current_path, current_layer, current_extruder, math.fabs(current_z - prev_z)): current_layer += 1 current_path.clear() diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index c1fa773816..8eb3cf850e 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -275,7 +275,7 @@ UM.MainWindow // There is no endsWith in this version of JS... if ((drop.urls[i].length <= 12) || (drop.urls[i].substring(drop.urls[i].length-12) !== ".curaprofile")) { // Drop an object - Printer.loadFile(drop.urls[i]); + UM.MeshFileHandler.readLocalFile(drop.urls[i]); if (imported_model == -1) { imported_model = i; @@ -737,7 +737,7 @@ UM.MainWindow for(var i in fileUrls) { - Printer.loadFile(fileUrls[i]) + UM.MeshFileHandler.readLocalFile(fileUrls[i]) } var meshName = backgroundItem.getMeshName(fileUrls[0].toString()) diff --git a/resources/qml/Menus/RecentFilesMenu.qml b/resources/qml/Menus/RecentFilesMenu.qml index 4453be6887..c47fc5715b 100644 --- a/resources/qml/Menus/RecentFilesMenu.qml +++ b/resources/qml/Menus/RecentFilesMenu.qml @@ -26,7 +26,7 @@ Menu return (index + 1) + ". " + path.slice(path.lastIndexOf("/") + 1); } onTriggered: { - Printer.loadFile(modelData); + UM.MeshFileHandler.readLocalFile(modelData); var meshName = backgroundItem.getMeshName(modelData.toString()) backgroundItem.hasMesh(decodeURIComponent(meshName)) } From 897f01150b016a3b27a5f1a56290f9b68fd7fa91 Mon Sep 17 00:00:00 2001 From: Victor Larchenko Date: Wed, 23 Nov 2016 11:37:57 +0600 Subject: [PATCH 46/75] D5: Added class documentation --- plugins/GCodeReader/GCodeReader.py | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/GCodeReader/GCodeReader.py b/plugins/GCodeReader/GCodeReader.py index 66a2dfa6b6..2583634354 100644 --- a/plugins/GCodeReader/GCodeReader.py +++ b/plugins/GCodeReader/GCodeReader.py @@ -25,6 +25,7 @@ import math import re +# Class for loading and parsing G-code files class GCodeReader(MeshReader): def __init__(self): super(GCodeReader, self).__init__() From a795323e5ffe63f69731d6bf2dc4487f5c093309 Mon Sep 17 00:00:00 2001 From: Victor Larchenko Date: Thu, 24 Nov 2016 14:30:49 +0600 Subject: [PATCH 47/75] D5: Added cura-generated gcode coloring --- plugins/GCodeReader/GCodeReader.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/plugins/GCodeReader/GCodeReader.py b/plugins/GCodeReader/GCodeReader.py index 2583634354..a147603892 100644 --- a/plugins/GCodeReader/GCodeReader.py +++ b/plugins/GCodeReader/GCodeReader.py @@ -98,6 +98,7 @@ class GCodeReader(MeshReader): count = len(path) line_types = numpy.empty((count - 1, 1), numpy.int32) line_widths = numpy.empty((count - 1, 1), numpy.float32) + # TODO: need to calculate actual line width based on E values line_widths[:, 0] = 0.5 points = numpy.empty((count, 3), numpy.float32) i = 0 @@ -151,6 +152,7 @@ class GCodeReader(MeshReader): current_y = 0 current_z = 0 current_e = 0 + current_block = LayerPolygon.Inset0Type current_layer = 0 prev_z = 0 @@ -169,6 +171,20 @@ class GCodeReader(MeshReader): self._message.setProgress(math.floor(current_line / file_lines * 100)) if len(line) == 0: continue + if line.find(";TYPE:") == 0: + type = line[6:].strip() + if type == "WALL-INNER": + current_block = LayerPolygon.InsetXType + elif type == "WALL-OUTER": + current_block = LayerPolygon.Inset0Type + elif type == "SKIN": + current_block = LayerPolygon.SkinType + elif type == "SKIRT": + current_block = LayerPolygon.SkirtType + elif type == "SUPPORT": + current_block = LayerPolygon.SupportType + elif type == "FILL": + current_block = LayerPolygon.InfillType if line[0] == ";": continue G = self._getInt(line, "G") @@ -190,7 +206,7 @@ class GCodeReader(MeshReader): current_z = z if e is not None: if e > current_e: - current_path.append([current_x, current_y, current_z, LayerPolygon.Inset0Type]) # extrusion + current_path.append([current_x, current_y, current_z, current_block]) # extrusion else: current_path.append([current_x, current_y, current_z, LayerPolygon.MoveRetractionType]) # retraction current_e = e From 002b3139e64c6dba87138070094c86e53293d6b7 Mon Sep 17 00:00:00 2001 From: Victor Larchenko Date: Thu, 24 Nov 2016 14:31:48 +0600 Subject: [PATCH 48/75] D5: Fixed dual extrusion colors --- plugins/GCodeReader/GCodeReader.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/plugins/GCodeReader/GCodeReader.py b/plugins/GCodeReader/GCodeReader.py index a147603892..af3536c6f1 100644 --- a/plugins/GCodeReader/GCodeReader.py +++ b/plugins/GCodeReader/GCodeReader.py @@ -107,10 +107,7 @@ class GCodeReader(MeshReader): points[i, 1] = point[2] points[i, 2] = -point[1] if i > 0: - if point[3] == LayerPolygon.Inset0Type: - line_types[i - 1] = extruder + 1 - else: - line_types[i - 1] = point[3] + line_types[i - 1] = point[3] i += 1 this_poly = LayerPolygon(layer_data, extruder, line_types, points, line_widths) From 4aa59950ca438e9a93788e9144321c89abbe8da8 Mon Sep 17 00:00:00 2001 From: Victor Larchenko Date: Sun, 27 Nov 2016 14:05:25 +0600 Subject: [PATCH 49/75] D5: Added decorator --- cura/CuraApplication.py | 17 ++++++++-- plugins/3MFReader/ThreeMFReader.py | 5 ++- .../CuraEngineBackend/CuraEngineBackend.py | 6 +++- .../ProcessSlicedLayersJob.py | 1 + plugins/GCodeReader/GCodeReader.py | 32 ++++++------------- plugins/LayerView/LayerPass.py | 2 +- plugins/X3DReader/X3DReader.py | 3 ++ 7 files changed, 39 insertions(+), 27 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 44a1f4d8a0..4e611cf680 100644 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -593,9 +593,12 @@ class CuraApplication(QtApplication): def updatePlatformActivity(self, node = None): count = 0 scene_bounding_box = None + should_pause = False for node in DepthFirstIterator(self.getController().getScene().getRoot()): - if type(node) is not SceneNode or (not node.getMeshData() and not hasattr(node, "gcode")): + if type(node) is not SceneNode or (not node.getMeshData() and not node.callDecoration("shouldBlockSlicing")): continue + if node.callDecoration("shouldBlockSlicing"): + should_pause = True count += 1 if not scene_bounding_box: @@ -605,6 +608,16 @@ class CuraApplication(QtApplication): if other_bb is not None: scene_bounding_box = scene_bounding_box + node.getBoundingBox() + if not should_pause: + self.getBackend().continueSlicing() + self.setHideSettings(False) + if self.getPrintInformation(): + self.getPrintInformation().setPreSliced(False) + else: + self.getBackend().pauseSlicing() + self.setHideSettings(True) + self.getPrintInformation().setPreSliced(True) + if not scene_bounding_box: scene_bounding_box = AxisAlignedBox.Null @@ -725,7 +738,7 @@ class CuraApplication(QtApplication): for node in DepthFirstIterator(self.getController().getScene().getRoot()): if type(node) is not SceneNode: continue - if (not node.getMeshData() and not hasattr(node, "gcode")) and not node.callDecoration("isGroup"): + if (not node.getMeshData() and node.callDecoration("isSliceable")) and not node.callDecoration("isGroup"): continue # Node that doesnt have a mesh and is not a group. if node.getParent() and node.getParent().callDecoration("isGroup"): continue # Grouped nodes don't need resetting as their parent (the group) is resetted) diff --git a/plugins/3MFReader/ThreeMFReader.py b/plugins/3MFReader/ThreeMFReader.py index 397a63c194..97134bf676 100644 --- a/plugins/3MFReader/ThreeMFReader.py +++ b/plugins/3MFReader/ThreeMFReader.py @@ -14,6 +14,7 @@ from cura.Settings.SettingOverrideDecorator import SettingOverrideDecorator from UM.Application import Application from cura.Settings.ExtruderManager import ExtruderManager from cura.QualityManager import QualityManager +from UM.Scene.SliceableObjectDecorator import SliceableObjectDecorator import os.path import zipfile @@ -234,6 +235,8 @@ class ThreeMFReader(MeshReader): except Exception as e: Logger.log("e", "An exception occurred in 3mf reader: %s", e) + sliceable_decorator = SliceableObjectDecorator() + result.addDecorator(sliceable_decorator) return result ## Create a scale vector based on a unit string. @@ -263,4 +266,4 @@ class ThreeMFReader(MeshReader): Logger.log("w", "Unrecognised unit %s used. Assuming mm instead", unit) scale = 1 - return Vector(scale, scale, scale) \ No newline at end of file + return Vector(scale, scale, scale) diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index 31e35aa778..b77b5da5bd 100644 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -188,14 +188,18 @@ class CuraEngineBackend(Backend): self._start_slice_job.start() self._start_slice_job.finished.connect(self._onStartSliceCompleted) + _last_state = BackendState.NotStarted + def pauseSlicing(self): self.close() self.backendStateChange.emit(BackendState.SlicingDisabled) def continueSlicing(self): - self.backendStateChange.emit(BackendState.NotStarted) + if self._last_state == BackendState.SlicingDisabled: + self.backendStateChange.emit(BackendState.NotStarted) def _onBackendStateChanged(self, state): + self._last_state = state if state == BackendState.SlicingDisabled: self._pause_slicing = True else: diff --git a/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py b/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py index 490690bd27..c4e9554b2c 100644 --- a/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py +++ b/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py @@ -60,6 +60,7 @@ class ProcessSlicedLayersJob(Job): for node in DepthFirstIterator(self._scene.getRoot()): if node.callDecoration("getLayerData"): node.getParent().removeChild(node) + break if self._abort_requested: if self._progress: self._progress.hide() diff --git a/plugins/GCodeReader/GCodeReader.py b/plugins/GCodeReader/GCodeReader.py index af3536c6f1..461f4f70b3 100644 --- a/plugins/GCodeReader/GCodeReader.py +++ b/plugins/GCodeReader/GCodeReader.py @@ -19,6 +19,7 @@ catalog = i18nCatalog("cura") from cura import LayerDataBuilder from cura import LayerDataDecorator from cura.LayerPolygon import LayerPolygon +from UM.Scene.SliceableObjectDecorator import SliceableObjectDecorator import numpy import math @@ -34,8 +35,6 @@ class GCodeReader(MeshReader): self._cancelled = False self._message = None - self._scene_node = None - @staticmethod def _getValue(line, code): n = line.find(code) + len(code) @@ -69,13 +68,6 @@ class GCodeReader(MeshReader): if message == self._message: self._cancelled = True - def _onParentChanged(self, node): - if self._scene_node is not None and self._scene_node.getParent() is None: - self._scene_node = None - Application.getInstance().getBackend().continueSlicing() - Application.getInstance().setHideSettings(False) - Application.getInstance().getPrintInformation().setPreSliced(False) - @staticmethod def _getNullBoundingBox(): return AxisAlignedBox(minimum=Vector(0, 0, 0), maximum=Vector(10, 10, 10)) @@ -120,12 +112,8 @@ class GCodeReader(MeshReader): Logger.log("d", "Preparing to load %s" % file_name) self._cancelled = False - self._scene_node = SceneNode() - self._scene_node.getBoundingBox = self._getNullBoundingBox # Manually set bounding box, because mesh doesn't have mesh data - self._scene_node.gcode = True - self._scene_node.parentChanged.connect(self._onParentChanged) - - Application.getInstance().getBackend().pauseSlicing() + scene_node = SceneNode() + scene_node.getBoundingBox = self._getNullBoundingBox # Manually set bounding box, because mesh doesn't have mesh data glist = [] Application.getInstance().getController().getScene().gcode_list = glist @@ -257,9 +245,12 @@ class GCodeReader(MeshReader): layer_mesh = layer_data_builder.build() decorator = LayerDataDecorator.LayerDataDecorator() decorator.setLayerData(layer_mesh) + scene_node.addDecorator(decorator) - self._scene_node.removeDecorator("LayerDataDecorator") - self._scene_node.addDecorator(decorator) + sliceable_decorator = SliceableObjectDecorator() + sliceable_decorator.setBlockSlicing(True) + sliceable_decorator.setSliceable(False) + scene_node.addDecorator(sliceable_decorator) Logger.log("d", "Finished parsing %s" % file_name) self._message.hide() @@ -267,15 +258,12 @@ class GCodeReader(MeshReader): if current_layer == 0: Logger.log("w", "File %s doesn't contain any valid layers" % file_name) - Application.getInstance().getPrintInformation().setPreSliced(True) - Application.getInstance().setHideSettings(True) - settings = Application.getInstance().getGlobalContainerStack() machine_width = settings.getProperty("machine_width", "value") machine_depth = settings.getProperty("machine_depth", "value") - self._scene_node.setPosition(Vector(-machine_width / 2, 0, machine_depth / 2)) + scene_node.setPosition(Vector(-machine_width / 2, 0, machine_depth / 2)) Logger.log("d", "Loaded %s" % file_name) - return self._scene_node + return scene_node diff --git a/plugins/LayerView/LayerPass.py b/plugins/LayerView/LayerPass.py index 9e610b68d2..ca895619a3 100644 --- a/plugins/LayerView/LayerPass.py +++ b/plugins/LayerView/LayerPass.py @@ -49,7 +49,7 @@ class LayerPass(RenderPass): if isinstance(node, ToolHandle): tool_handle_batch.addItem(node.getWorldTransformation(), mesh = node.getSolidMesh()) - elif isinstance(node, SceneNode) and (node.getMeshData() or hasattr(node, "gcode")) and node.isVisible(): + elif isinstance(node, SceneNode) and (node.getMeshData() or not node.callDecoration("isSliceable")) and node.isVisible(): layer_data = node.callDecoration("getLayerData") if not layer_data: continue diff --git a/plugins/X3DReader/X3DReader.py b/plugins/X3DReader/X3DReader.py index ba31c9ea86..16b8a6a5ae 100644 --- a/plugins/X3DReader/X3DReader.py +++ b/plugins/X3DReader/X3DReader.py @@ -10,6 +10,7 @@ from UM.Scene.SceneNode import SceneNode from UM.Job import Job from math import pi, sin, cos, sqrt import numpy +from UM.Scene.SliceableObjectDecorator import SliceableObjectDecorator try: import xml.etree.cElementTree as ET @@ -96,6 +97,8 @@ class X3DReader(MeshReader): Logger.logException("e", "Exception in X3D reader") return None + sliceable_decorator = SliceableObjectDecorator() + node.addDecorator(sliceable_decorator) return node # ------------------------- XML tree traversal From e6ebd225d37b3d2b4a3421c86cb9a6742eef9886 Mon Sep 17 00:00:00 2001 From: Victor Larchenko Date: Mon, 28 Nov 2016 14:24:19 +0600 Subject: [PATCH 50/75] D5: Added support of printers with center is zero parameter --- plugins/GCodeReader/GCodeReader.py | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/plugins/GCodeReader/GCodeReader.py b/plugins/GCodeReader/GCodeReader.py index 461f4f70b3..3de7f1f5e0 100644 --- a/plugins/GCodeReader/GCodeReader.py +++ b/plugins/GCodeReader/GCodeReader.py @@ -140,6 +140,7 @@ class GCodeReader(MeshReader): current_block = LayerPolygon.Inset0Type current_layer = 0 prev_z = 0 + center_is_zero = False self._message = Message(catalog.i18nc("@info:status", "Parsing GCODE"), lifetime=0) self._message.setProgress(0) @@ -173,11 +174,15 @@ class GCodeReader(MeshReader): if line[0] == ";": continue G = self._getInt(line, "G") + x = self._getFloat(line, "X") + y = self._getFloat(line, "Y") + z = self._getFloat(line, "Z") + if x is not None and x < 0: + center_is_zero = True + if y is not None and y < 0: + center_is_zero = True if G is not None: if G == 0 or G == 1: - x = self._getFloat(line, "X") - y = self._getFloat(line, "Y") - z = self._getFloat(line, "Z") e = self._getFloat(line, "E") z_changed = False if x is not None: @@ -206,17 +211,12 @@ class GCodeReader(MeshReader): current_path.clear() elif G == 28: - x = self._getFloat(line, "X") - y = self._getFloat(line, "Y") if x is not None: current_x = x if y is not None: current_y = y current_z = 0 elif G == 92: - x = self._getFloat(line, "X") - y = self._getFloat(line, "Y") - z = self._getFloat(line, "Z") e = self._getFloat(line, "E") if x is not None: current_x = x @@ -262,7 +262,8 @@ class GCodeReader(MeshReader): machine_width = settings.getProperty("machine_width", "value") machine_depth = settings.getProperty("machine_depth", "value") - scene_node.setPosition(Vector(-machine_width / 2, 0, machine_depth / 2)) + if not center_is_zero: + scene_node.setPosition(Vector(-machine_width / 2, 0, machine_depth / 2)) Logger.log("d", "Loaded %s" % file_name) From 60eb83d9205f09df5a4dd64e6a399e6b70cc8658 Mon Sep 17 00:00:00 2001 From: Victor Larchenko Date: Wed, 30 Nov 2016 12:02:21 +0600 Subject: [PATCH 51/75] D5: Refactored main cycle --- plugins/GCodeReader/GCodeReader.py | 194 ++++++++++++++++------------- 1 file changed, 104 insertions(+), 90 deletions(-) diff --git a/plugins/GCodeReader/GCodeReader.py b/plugins/GCodeReader/GCodeReader.py index 3de7f1f5e0..dc91af756c 100644 --- a/plugins/GCodeReader/GCodeReader.py +++ b/plugins/GCodeReader/GCodeReader.py @@ -34,6 +34,16 @@ class GCodeReader(MeshReader): Application.getInstance().hideMessageSignal.connect(self._onHideMessage) self._cancelled = False self._message = None + self._clearValues() + self._scene_node = None + + def _clearValues(self): + self._extruder = 0 + self._layer_type = LayerPolygon.Inset0Type + self._layer = 0 + self._prev_z = 0 + self._layer_data_builder = LayerDataBuilder.LayerDataBuilder() + self._center_is_zero = False @staticmethod def _getValue(line, code): @@ -72,8 +82,7 @@ class GCodeReader(MeshReader): def _getNullBoundingBox(): return AxisAlignedBox(minimum=Vector(0, 0, 0), maximum=Vector(10, 10, 10)) - @staticmethod - def _createPolygon(layer_data, path, layer_id, extruder, thickness): + def _createPolygon(self, current_z, path): countvalid = 0 for point in path: if point[3] > 0: @@ -81,10 +90,10 @@ class GCodeReader(MeshReader): if countvalid < 2: return False try: - layer_data.addLayer(layer_id) - layer_data.setLayerHeight(layer_id, path[0][1]) - layer_data.setLayerThickness(layer_id, thickness) - this_layer = layer_data.getLayer(layer_id) + self._layer_data_builder.addLayer(self._layer) + self._layer_data_builder.setLayerHeight(self._layer, path[0][1]) + self._layer_data_builder.setLayerThickness(self._layer, math.fabs(current_z - self._prev_z)) + this_layer = self._layer_data_builder.getLayer(self._layer) except ValueError: return False count = len(path) @@ -102,12 +111,81 @@ class GCodeReader(MeshReader): line_types[i - 1] = point[3] i += 1 - this_poly = LayerPolygon(layer_data, extruder, line_types, points, line_widths) + this_poly = LayerPolygon(self._layer_data_builder, self._extruder, line_types, points, line_widths) this_poly.buildCache() this_layer.polygons.append(this_poly) return True + def _gCode0(self, position, params, path): + x, y, z, e = position + xp, yp, zp, ep = params + x, y = xp if xp is not None else x, yp if yp is not None else y + z_changed = False + if zp is not None: + if z != zp: + z_changed = True + self._prev_z = z + z = zp + if ep is not None: + if ep > e: + path.append([x, y, z, self._layer_type]) # extrusion + else: + path.append([x, y, z, LayerPolygon.MoveRetractionType]) # retraction + e = ep + else: + path.append([x, y, z, LayerPolygon.MoveCombingType]) + if z_changed: + if len(path) > 1 and z > 0: + if self._createPolygon(z, path): + self._layer += 1 + path.clear() + else: + path.clear() + return x, y, z, e + + def _gCode28(self, position, params, path): + x, y, z, e = position + xp, yp, zp, ep = params + return xp if xp is not None else x,\ + yp if yp is not None else y,\ + 0,\ + e + + def _gCode92(self, position, params, path): + x, y, z, e = position + xp, yp, zp, ep = params + return xp if xp is not None else x,\ + yp if yp is not None else y,\ + zp if zp is not None else z,\ + ep if ep is not None else e + + _g_code_map = {0: _gCode0, 1: _gCode0, 28: _gCode28, 92: _gCode92} + + def _processGCode(self, G, line, position, path): + func = self._g_code_map.get(G, None) + x = self._getFloat(line, "X") + y = self._getFloat(line, "Y") + z = self._getFloat(line, "Z") + e = self._getFloat(line, "E") + if x is not None and x < 0: + self._center_is_zero = True + if y is not None and y < 0: + self._center_is_zero = True + if func is not None: + params = (x, y, z, e) + return func(self, position, params, path) + return position + + def _processTCode(self, T, line, position, path): + self._extruder = T + if len(path) > 1 and position[2] > 0: + if self._createPolygon(position[2], path): + self._layer += 1 + path.clear() + else: + path.clear() + def read(self, file_name): Logger.log("d", "Preparing to load %s" % file_name) self._cancelled = False @@ -120,8 +198,6 @@ class GCodeReader(MeshReader): Logger.log("d", "Opening file %s" % file_name) - layer_data_builder = LayerDataBuilder.LayerDataBuilder() - with open(file_name, "r") as file: file_lines = 0 current_line = 0 @@ -131,16 +207,7 @@ class GCodeReader(MeshReader): file_step = max(math.floor(file_lines / 100), 1) - current_extruder = 0 - current_path = [] - current_x = 0 - current_y = 0 - current_z = 0 - current_e = 0 - current_block = LayerPolygon.Inset0Type - current_layer = 0 - prev_z = 0 - center_is_zero = False + self._clearValues() self._message = Message(catalog.i18nc("@info:status", "Parsing GCODE"), lifetime=0) self._message.setProgress(0) @@ -148,6 +215,9 @@ class GCodeReader(MeshReader): Logger.log("d", "Parsing %s" % file_name) + current_position = (0, 0, 0, 0) # x, y, z, e + current_path = [] + for line in file: if self._cancelled: Logger.log("w", "Parsing %s cancelled" % file_name) @@ -160,89 +230,33 @@ class GCodeReader(MeshReader): if line.find(";TYPE:") == 0: type = line[6:].strip() if type == "WALL-INNER": - current_block = LayerPolygon.InsetXType + self._layer_type = LayerPolygon.InsetXType elif type == "WALL-OUTER": - current_block = LayerPolygon.Inset0Type + self._layer_type = LayerPolygon.Inset0Type elif type == "SKIN": - current_block = LayerPolygon.SkinType + self._layer_type = LayerPolygon.SkinType elif type == "SKIRT": - current_block = LayerPolygon.SkirtType + self._layer_type = LayerPolygon.SkirtType elif type == "SUPPORT": - current_block = LayerPolygon.SupportType + self._layer_type = LayerPolygon.SupportType elif type == "FILL": - current_block = LayerPolygon.InfillType + self._layer_type = LayerPolygon.InfillType if line[0] == ";": continue + G = self._getInt(line, "G") - x = self._getFloat(line, "X") - y = self._getFloat(line, "Y") - z = self._getFloat(line, "Z") - if x is not None and x < 0: - center_is_zero = True - if y is not None and y < 0: - center_is_zero = True if G is not None: - if G == 0 or G == 1: - e = self._getFloat(line, "E") - z_changed = False - if x is not None: - current_x = x - if y is not None: - current_y = y - if z is not None: - if not current_z == z: - z_changed = True - prev_z = current_z - current_z = z - if e is not None: - if e > current_e: - current_path.append([current_x, current_y, current_z, current_block]) # extrusion - else: - current_path.append([current_x, current_y, current_z, LayerPolygon.MoveRetractionType]) # retraction - current_e = e - else: - current_path.append([current_x, current_y, current_z, LayerPolygon.MoveCombingType]) - if z_changed: - if len(current_path) > 1 and current_z > 0: - if self._createPolygon(layer_data_builder, current_path, current_layer, current_extruder, math.fabs(current_z - prev_z)): - current_layer += 1 - current_path.clear() - else: - current_path.clear() - - elif G == 28: - if x is not None: - current_x = x - if y is not None: - current_y = y - current_z = 0 - elif G == 92: - e = self._getFloat(line, "E") - if x is not None: - current_x = x - if y is not None: - current_y = y - if z is not None: - current_z = z - if e is not None: - current_e = e - + current_position = self._processGCode(G, line, current_position, current_path) T = self._getInt(line, "T") if T is not None: - current_extruder = T - if len(current_path) > 1 and current_z > 0: - if self._createPolygon(layer_data_builder, current_path, current_layer, current_extruder, math.fabs(current_z - prev_z)): - current_layer += 1 - current_path.clear() - else: - current_path.clear() + self._processTCode(T, line, current_position, current_path) - if len(current_path) > 1 and current_z > 0: - if self._createPolygon(layer_data_builder, current_path, current_layer, current_extruder, math.fabs(current_z - prev_z)): - current_layer += 1 + if len(current_path) > 1 and current_position[2] > 0: + if self._createPolygon(current_position[2], current_path): + self._layer += 1 current_path.clear() - layer_mesh = layer_data_builder.build() + layer_mesh = self._layer_data_builder.build() decorator = LayerDataDecorator.LayerDataDecorator() decorator.setLayerData(layer_mesh) scene_node.addDecorator(decorator) @@ -255,14 +269,14 @@ class GCodeReader(MeshReader): Logger.log("d", "Finished parsing %s" % file_name) self._message.hide() - if current_layer == 0: + if self._layer == 0: Logger.log("w", "File %s doesn't contain any valid layers" % file_name) settings = Application.getInstance().getGlobalContainerStack() machine_width = settings.getProperty("machine_width", "value") machine_depth = settings.getProperty("machine_depth", "value") - if not center_is_zero: + if not self._center_is_zero: scene_node.setPosition(Vector(-machine_width / 2, 0, machine_depth / 2)) Logger.log("d", "Loaded %s" % file_name) From ba372f69a74f70e8ed1579de3d2c4de3b33739f9 Mon Sep 17 00:00:00 2001 From: Victor Larchenko Date: Tue, 6 Dec 2016 16:57:17 +0600 Subject: [PATCH 52/75] D6: Refactoring --- cura/CuraApplication.py | 19 ++++--- .../CuraEngineBackend/CuraEngineBackend.py | 13 ++--- plugins/GCodeReader/GCodeReader.py | 54 ++++++++++--------- 3 files changed, 41 insertions(+), 45 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 4e611cf680..3676756a32 100644 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -20,6 +20,7 @@ from UM.Scene.Selection import Selection from UM.Scene.GroupDecorator import GroupDecorator from UM.Settings.Validator import Validator from UM.Message import Message +from UM.i18n import i18nCatalog from UM.Operations.AddSceneNodeOperation import AddSceneNodeOperation from UM.Operations.RemoveSceneNodeOperation import RemoveSceneNodeOperation @@ -32,9 +33,6 @@ from UM.Settings.SettingDefinition import SettingDefinition, DefinitionPropertyT from UM.Settings.ContainerRegistry import ContainerRegistry from UM.Settings.SettingFunction import SettingFunction -from UM.i18n import i18nCatalog -catalog = i18nCatalog("cura") - from . import PlatformPhysics from . import BuildVolume from . import CameraAnimation @@ -608,15 +606,16 @@ class CuraApplication(QtApplication): if other_bb is not None: scene_bounding_box = scene_bounding_box + node.getBoundingBox() - if not should_pause: - self.getBackend().continueSlicing() - self.setHideSettings(False) - if self.getPrintInformation(): - self.getPrintInformation().setPreSliced(False) - else: + print_information = self.getPrintInformation() + if should_pause: self.getBackend().pauseSlicing() self.setHideSettings(True) - self.getPrintInformation().setPreSliced(True) + print_information.setPreSliced(True) + else: + self.getBackend().continueSlicing() + self.setHideSettings(False) + if print_information: + print_information.setPreSliced(False) if not scene_bounding_box: scene_bounding_box = AxisAlignedBox.Null diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index b77b5da5bd..db5e256d81 100644 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -116,7 +116,6 @@ class CuraEngineBackend(Backend): self.backendQuit.connect(self._onBackendQuit) self.backendConnected.connect(self._onBackendConnected) - self.backendStateChange.connect(self._onBackendStateChanged) # When a tool operation is in progress, don't slice. So we need to listen for tool operations. Application.getInstance().getController().toolOperationStarted.connect(self._onToolOperationStarted) @@ -188,22 +187,16 @@ class CuraEngineBackend(Backend): self._start_slice_job.start() self._start_slice_job.finished.connect(self._onStartSliceCompleted) - _last_state = BackendState.NotStarted def pauseSlicing(self): self.close() + self._pause_slicing = True self.backendStateChange.emit(BackendState.SlicingDisabled) def continueSlicing(self): - if self._last_state == BackendState.SlicingDisabled: - self.backendStateChange.emit(BackendState.NotStarted) - - def _onBackendStateChanged(self, state): - self._last_state = state - if state == BackendState.SlicingDisabled: - self._pause_slicing = True - else: + if self._pause_slicing: self._pause_slicing = False + self.backendStateChange.emit(BackendState.NotStarted) ## Terminate the engine process. def _terminate(self): diff --git a/plugins/GCodeReader/GCodeReader.py b/plugins/GCodeReader/GCodeReader.py index dc91af756c..e05985bab5 100644 --- a/plugins/GCodeReader/GCodeReader.py +++ b/plugins/GCodeReader/GCodeReader.py @@ -47,12 +47,13 @@ class GCodeReader(MeshReader): @staticmethod def _getValue(line, code): - n = line.find(code) + len(code) - if n < 1: + n = line.find(code) + if n < 0: return None + n += len(code) pattern = re.compile("[;\s]") match = pattern.search(line, n) - m = match.start() if math is not None else -1 + m = match.start() if match is not None else -1 try: if m < 0: return line[n:] @@ -91,7 +92,7 @@ class GCodeReader(MeshReader): return False try: self._layer_data_builder.addLayer(self._layer) - self._layer_data_builder.setLayerHeight(self._layer, path[0][1]) + self._layer_data_builder.setLayerHeight(self._layer, path[0][2]) self._layer_data_builder.setLayerThickness(self._layer, math.fabs(current_z - self._prev_z)) this_layer = self._layer_data_builder.getLayer(self._layer) except ValueError: @@ -120,7 +121,8 @@ class GCodeReader(MeshReader): def _gCode0(self, position, params, path): x, y, z, e = position xp, yp, zp, ep = params - x, y = xp if xp is not None else x, yp if yp is not None else y + x = xp if xp is not None else x + y = yp if yp is not None else y z_changed = False if zp is not None: if z != zp: @@ -142,39 +144,37 @@ class GCodeReader(MeshReader): path.clear() else: path.clear() - return x, y, z, e + return (x, y, z, e) def _gCode28(self, position, params, path): x, y, z, e = position xp, yp, zp, ep = params - return xp if xp is not None else x,\ - yp if yp is not None else y,\ - 0,\ - e + return (xp if xp is not None else x, + yp if yp is not None else y, + 0, + e) def _gCode92(self, position, params, path): x, y, z, e = position xp, yp, zp, ep = params - return xp if xp is not None else x,\ - yp if yp is not None else y,\ - zp if zp is not None else z,\ - ep if ep is not None else e + return (xp if xp is not None else x, + yp if yp is not None else y, + zp if zp is not None else z, + ep if ep is not None else e) - _g_code_map = {0: _gCode0, 1: _gCode0, 28: _gCode28, 92: _gCode92} + _gCode1 = _gCode0 def _processGCode(self, G, line, position, path): - func = self._g_code_map.get(G, None) + func = getattr(self, "_gCode%s" % G, None) x = self._getFloat(line, "X") y = self._getFloat(line, "Y") z = self._getFloat(line, "Z") e = self._getFloat(line, "E") - if x is not None and x < 0: - self._center_is_zero = True - if y is not None and y < 0: - self._center_is_zero = True if func is not None: + if (x is not None and x < 0) or (y is not None and y < 0): + self._center_is_zero = True params = (x, y, z, e) - return func(self, position, params, path) + return func(position, params, path) return position def _processTCode(self, T, line, position, path): @@ -186,6 +186,8 @@ class GCodeReader(MeshReader): else: path.clear() + _type_keyword = ";TYPE:" + def read(self, file_name): Logger.log("d", "Preparing to load %s" % file_name) self._cancelled = False @@ -194,7 +196,7 @@ class GCodeReader(MeshReader): scene_node.getBoundingBox = self._getNullBoundingBox # Manually set bounding box, because mesh doesn't have mesh data glist = [] - Application.getInstance().getController().getScene().gcode_list = glist + Logger.log("d", "Opening file %s" % file_name) @@ -209,7 +211,7 @@ class GCodeReader(MeshReader): self._clearValues() - self._message = Message(catalog.i18nc("@info:status", "Parsing GCODE"), lifetime=0) + self._message = Message(catalog.i18nc("@info:status", "Parsing G-code"), lifetime=0) self._message.setProgress(0) self._message.show() @@ -227,8 +229,8 @@ class GCodeReader(MeshReader): self._message.setProgress(math.floor(current_line / file_lines * 100)) if len(line) == 0: continue - if line.find(";TYPE:") == 0: - type = line[6:].strip() + if line.find(self._type_keyword) == 0: + type = line[len(self._type_keyword):].strip() if type == "WALL-INNER": self._layer_type = LayerPolygon.InsetXType elif type == "WALL-OUTER": @@ -266,6 +268,8 @@ class GCodeReader(MeshReader): sliceable_decorator.setSliceable(False) scene_node.addDecorator(sliceable_decorator) + Application.getInstance().getController().getScene().gcode_list = glist + Logger.log("d", "Finished parsing %s" % file_name) self._message.hide() From afc9b71279b12e01b666bab8918a16e317a4eea7 Mon Sep 17 00:00:00 2001 From: Victor Larchenko Date: Wed, 7 Dec 2016 11:56:38 +0600 Subject: [PATCH 53/75] D6: Fixed dual extrusion E value --- plugins/GCodeReader/GCodeReader.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/plugins/GCodeReader/GCodeReader.py b/plugins/GCodeReader/GCodeReader.py index e05985bab5..15c75b6ec2 100644 --- a/plugins/GCodeReader/GCodeReader.py +++ b/plugins/GCodeReader/GCodeReader.py @@ -130,11 +130,11 @@ class GCodeReader(MeshReader): self._prev_z = z z = zp if ep is not None: - if ep > e: + if ep > e[self._extruder]: path.append([x, y, z, self._layer_type]) # extrusion else: path.append([x, y, z, LayerPolygon.MoveRetractionType]) # retraction - e = ep + e[self._extruder] = ep else: path.append([x, y, z, LayerPolygon.MoveCombingType]) if z_changed: @@ -157,10 +157,12 @@ class GCodeReader(MeshReader): def _gCode92(self, position, params, path): x, y, z, e = position xp, yp, zp, ep = params + if ep is not None: + e[self._extruder] = ep return (xp if xp is not None else x, yp if yp is not None else y, zp if zp is not None else z, - ep if ep is not None else e) + e) _gCode1 = _gCode0 @@ -217,7 +219,7 @@ class GCodeReader(MeshReader): Logger.log("d", "Parsing %s" % file_name) - current_position = (0, 0, 0, 0) # x, y, z, e + current_position = (0, 0, 0, [0, 0]) # x, y, z, e current_path = [] for line in file: From 26fe0ddbb5882665c0d73532bf786442518f44ef Mon Sep 17 00:00:00 2001 From: Victor Larchenko Date: Fri, 9 Dec 2016 14:47:13 +0600 Subject: [PATCH 54/75] D6: Refactoring --- cura/CuraApplication.py | 15 -------- plugins/GCodeReader/GCodeReader.py | 57 +++++++++++++++--------------- resources/qml/Sidebar.qml | 2 +- 3 files changed, 29 insertions(+), 45 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 3676756a32..679911bb0a 100644 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -609,11 +609,9 @@ class CuraApplication(QtApplication): print_information = self.getPrintInformation() if should_pause: self.getBackend().pauseSlicing() - self.setHideSettings(True) print_information.setPreSliced(True) else: self.getBackend().continueSlicing() - self.setHideSettings(False) if print_information: print_information.setPreSliced(False) @@ -1033,17 +1031,4 @@ class CuraApplication(QtApplication): def log(self, msg): Logger.log("d", msg) - _hide_settings = False - - hideSettingsChanged = pyqtSignal(bool) - - @pyqtSlot(bool) - def setHideSettings(self, hide): - self._hide_settings = hide - self.hideSettingsChanged.emit(hide) - - @pyqtProperty(bool, fset=setHideSettings, notify=hideSettingsChanged) - def hideSettings(self): - return self._hide_settings - diff --git a/plugins/GCodeReader/GCodeReader.py b/plugins/GCodeReader/GCodeReader.py index 15c75b6ec2..ef278a0019 100644 --- a/plugins/GCodeReader/GCodeReader.py +++ b/plugins/GCodeReader/GCodeReader.py @@ -24,6 +24,7 @@ from UM.Scene.SliceableObjectDecorator import SliceableObjectDecorator import numpy import math import re +from collections import namedtuple # Class for loading and parsing G-code files @@ -36,12 +37,13 @@ class GCodeReader(MeshReader): self._message = None self._clearValues() self._scene_node = None + self._position = namedtuple('Position', ['x', 'y', 'z', 'e']) def _clearValues(self): self._extruder = 0 self._layer_type = LayerPolygon.Inset0Type self._layer = 0 - self._prev_z = 0 + self._previous_z = 0 self._layer_data_builder = LayerDataBuilder.LayerDataBuilder() self._center_is_zero = False @@ -93,7 +95,7 @@ class GCodeReader(MeshReader): try: self._layer_data_builder.addLayer(self._layer) self._layer_data_builder.setLayerHeight(self._layer, path[0][2]) - self._layer_data_builder.setLayerThickness(self._layer, math.fabs(current_z - self._prev_z)) + self._layer_data_builder.setLayerThickness(self._layer, math.fabs(current_z - self._previous_z)) this_layer = self._layer_data_builder.getLayer(self._layer) except ValueError: return False @@ -120,21 +122,20 @@ class GCodeReader(MeshReader): def _gCode0(self, position, params, path): x, y, z, e = position - xp, yp, zp, ep = params - x = xp if xp is not None else x - y = yp if yp is not None else y + x = params.x if params.x is not None else x + y = params.y if params.y is not None else y z_changed = False - if zp is not None: - if z != zp: + if params.z is not None: + if z != params.z: z_changed = True - self._prev_z = z - z = zp - if ep is not None: - if ep > e[self._extruder]: + self._previous_z = z + z = params.z + if params.e is not None: + if params.e > e[self._extruder]: path.append([x, y, z, self._layer_type]) # extrusion else: path.append([x, y, z, LayerPolygon.MoveRetractionType]) # retraction - e[self._extruder] = ep + e[self._extruder] = params.e else: path.append([x, y, z, LayerPolygon.MoveCombingType]) if z_changed: @@ -144,25 +145,23 @@ class GCodeReader(MeshReader): path.clear() else: path.clear() - return (x, y, z, e) + return self._position(x, y, z, e) def _gCode28(self, position, params, path): - x, y, z, e = position - xp, yp, zp, ep = params - return (xp if xp is not None else x, - yp if yp is not None else y, + return self._position( + params.x if params.x is not None else position.x, + params.y if params.y is not None else position.y, 0, - e) + position.e) def _gCode92(self, position, params, path): - x, y, z, e = position - xp, yp, zp, ep = params - if ep is not None: - e[self._extruder] = ep - return (xp if xp is not None else x, - yp if yp is not None else y, - zp if zp is not None else z, - e) + if params.e is not None: + position.e[self._extruder] = params.e + return self._position( + params.x if params.x is not None else position.x, + params.y if params.y is not None else position.y, + params.z if params.z is not None else position.z, + position.e) _gCode1 = _gCode0 @@ -175,7 +174,7 @@ class GCodeReader(MeshReader): if func is not None: if (x is not None and x < 0) or (y is not None and y < 0): self._center_is_zero = True - params = (x, y, z, e) + params = self._position(x, y, z, e) return func(position, params, path) return position @@ -219,12 +218,12 @@ class GCodeReader(MeshReader): Logger.log("d", "Parsing %s" % file_name) - current_position = (0, 0, 0, [0, 0]) # x, y, z, e + current_position = self._position(0, 0, 0, [0, 0]) current_path = [] for line in file: if self._cancelled: - Logger.log("w", "Parsing %s cancelled" % file_name) + Logger.log("i", "Parsing %s cancelled" % file_name) return None current_line += 1 if current_line % file_step == 0: diff --git a/resources/qml/Sidebar.qml b/resources/qml/Sidebar.qml index 202bfd070c..ecbe64b26a 100644 --- a/resources/qml/Sidebar.qml +++ b/resources/qml/Sidebar.qml @@ -16,7 +16,7 @@ Rectangle property int currentModeIndex; property bool monitoringPrint: false - property bool hideSettings: Printer.hideSettings + property bool hideSettings: PrintInformation.preSliced Connections { target: Printer From 3605403314ff68dab3d8535b3ee659de87f21df6 Mon Sep 17 00:00:00 2001 From: Victor Larchenko Date: Fri, 9 Dec 2016 15:09:53 +0600 Subject: [PATCH 55/75] D6: Moved file loading code --- cura/CuraApplication.py | 64 +++++++++++++++++++ .../CuraEngineBackend/CuraEngineBackend.py | 2 +- plugins/GCodeReader/GCodeReader.py | 2 +- resources/qml/Cura.qml | 4 +- resources/qml/Menus/RecentFilesMenu.qml | 2 +- 5 files changed, 69 insertions(+), 5 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 679911bb0a..6297efb747 100644 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -1031,4 +1031,68 @@ class CuraApplication(QtApplication): def log(self, msg): Logger.log("d", msg) + _loading_files = [] + _non_sliceable_extensions = [".gcode", ".g"] + + @pyqtSlot(QUrl) + def readLocalFile(self, file): + if not file.isValid(): + return + + scene = self.getController().getScene() + + for node in DepthFirstIterator(scene.getRoot()): + if node.callDecoration("shouldBlockSlicing"): + self.deleteAll() + break + + f = file.toLocalFile() + extension = os.path.splitext(f)[1] + filename = os.path.basename(f) + if len(self._loading_files) > 0: + # If a non-slicable file is already being loaded, we prevent loading of any further non-slicable files + if extension.lower() in self._non_sliceable_extensions: + message = Message( + self._i18n_catalog.i18nc("@info:status", + "Only one G-code file can be loaded at a time. Skipped importing {0}", + filename)) + message.show() + return + # If file being loaded is non-slicable file, then prevent loading of any other files + extension = os.path.splitext(self._loading_files[0])[1] + if extension.lower() in self._non_sliceable_extensions: + message = Message( + self._i18n_catalog.i18nc("@info:status", + "Can't open any other file if G-code is loading. Skipped importing {0}", + filename)) + message.show() + return + + self._loading_files.append(f) + if extension in self._non_sliceable_extensions: + self.deleteAll() + + job = ReadMeshJob(f) + job.finished.connect(self._readMeshFinished) + job.start() + + def _readMeshFinished(self, job): + node = job.getResult() + filename = job.getFileName() + self._loading_files.remove(filename) + + if node != None: + node.setSelectable(True) + node.setName(os.path.basename(filename)) + + extension = os.path.splitext(filename)[1] + if extension.lower() in self._non_sliceable_extensions: + self.changeLayerViewSignal.emit() + + scene = self.getController().getScene() + + op = AddSceneNodeOperation(node, scene.getRoot()) + op.push() + + scene.sceneChanged.emit(node) diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index db5e256d81..44009ae1de 100644 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -191,7 +191,7 @@ class CuraEngineBackend(Backend): def pauseSlicing(self): self.close() self._pause_slicing = True - self.backendStateChange.emit(BackendState.SlicingDisabled) + self.backendStateChange.emit(BackendState.Disabled) def continueSlicing(self): if self._pause_slicing: diff --git a/plugins/GCodeReader/GCodeReader.py b/plugins/GCodeReader/GCodeReader.py index ef278a0019..e9aea36fae 100644 --- a/plugins/GCodeReader/GCodeReader.py +++ b/plugins/GCodeReader/GCodeReader.py @@ -223,7 +223,7 @@ class GCodeReader(MeshReader): for line in file: if self._cancelled: - Logger.log("i", "Parsing %s cancelled" % file_name) + Logger.log("d", "Parsing %s cancelled" % file_name) return None current_line += 1 if current_line % file_step == 0: diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index 8eb3cf850e..1383338144 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -275,7 +275,7 @@ UM.MainWindow // There is no endsWith in this version of JS... if ((drop.urls[i].length <= 12) || (drop.urls[i].substring(drop.urls[i].length-12) !== ".curaprofile")) { // Drop an object - UM.MeshFileHandler.readLocalFile(drop.urls[i]); + Printer.readLocalFile(drop.urls[i]); if (imported_model == -1) { imported_model = i; @@ -737,7 +737,7 @@ UM.MainWindow for(var i in fileUrls) { - UM.MeshFileHandler.readLocalFile(fileUrls[i]) + Printer.readLocalFile(fileUrls[i]) } var meshName = backgroundItem.getMeshName(fileUrls[0].toString()) diff --git a/resources/qml/Menus/RecentFilesMenu.qml b/resources/qml/Menus/RecentFilesMenu.qml index c47fc5715b..866b06ccbb 100644 --- a/resources/qml/Menus/RecentFilesMenu.qml +++ b/resources/qml/Menus/RecentFilesMenu.qml @@ -26,7 +26,7 @@ Menu return (index + 1) + ". " + path.slice(path.lastIndexOf("/") + 1); } onTriggered: { - UM.MeshFileHandler.readLocalFile(modelData); + Printer.readLocalFile(modelData); var meshName = backgroundItem.getMeshName(modelData.toString()) backgroundItem.hasMesh(decodeURIComponent(meshName)) } From 620a3891da3da7f9dd6007236ae2ea5eb5833156 Mon Sep 17 00:00:00 2001 From: Victor Larchenko Date: Fri, 9 Dec 2016 15:26:37 +0600 Subject: [PATCH 56/75] D6: Moved decorator to cura --- cura/CuraApplication.py | 11 +++++++++++ cura/SliceableObjectDecorator.py | 21 +++++++++++++++++++++ plugins/3MFReader/ThreeMFReader.py | 18 ++++++++---------- plugins/GCodeReader/GCodeReader.py | 23 +++++++---------------- plugins/X3DReader/X3DReader.py | 15 +++++++-------- 5 files changed, 54 insertions(+), 34 deletions(-) create mode 100644 cura/SliceableObjectDecorator.py diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 6297efb747..028a8bf85e 100644 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -28,6 +28,7 @@ from UM.Operations.GroupedOperation import GroupedOperation from UM.Operations.SetTransformOperation import SetTransformOperation from UM.Operations.TranslateOperation import TranslateOperation from cura.SetParentOperation import SetParentOperation +from cura.SliceableObjectDecorator import SliceableObjectDecorator from UM.Settings.SettingDefinition import SettingDefinition, DefinitionPropertyType from UM.Settings.ContainerRegistry import ContainerRegistry @@ -1088,6 +1089,16 @@ class CuraApplication(QtApplication): extension = os.path.splitext(filename)[1] if extension.lower() in self._non_sliceable_extensions: self.changeLayerViewSignal.emit() + sliceable_decorator = SliceableObjectDecorator() + sliceable_decorator.setBlockSlicing(True) + sliceable_decorator.setSliceable(False) + node.addDecorator(sliceable_decorator) + else: + sliceable_decorator = SliceableObjectDecorator() + sliceable_decorator.setBlockSlicing(False) + sliceable_decorator.setSliceable(True) + node.addDecorator(sliceable_decorator) + scene = self.getController().getScene() diff --git a/cura/SliceableObjectDecorator.py b/cura/SliceableObjectDecorator.py new file mode 100644 index 0000000000..12dbbcb751 --- /dev/null +++ b/cura/SliceableObjectDecorator.py @@ -0,0 +1,21 @@ +from UM.Scene.SceneNodeDecorator import SceneNodeDecorator + + +## Simple decorator to indicate a scene node is sliceable or not. +class SliceableObjectDecorator(SceneNodeDecorator): + def __init__(self): + super().__init__() + self._sliceable = True + self._block_slicing = False + + def isSliceable(self): + return self._sliceable + + def setSliceable(self, sliceable): + self._sliceable = sliceable + + def shouldBlockSlicing(self): + return self._block_slicing + + def setBlockSlicing(self, block_slicing): + self._block_slicing = block_slicing diff --git a/plugins/3MFReader/ThreeMFReader.py b/plugins/3MFReader/ThreeMFReader.py index 97134bf676..ee4e1daab4 100644 --- a/plugins/3MFReader/ThreeMFReader.py +++ b/plugins/3MFReader/ThreeMFReader.py @@ -1,23 +1,23 @@ # Copyright (c) 2015 Ultimaker B.V. # Cura is released under the terms of the AGPLv3 or higher. -from UM.Mesh.MeshReader import MeshReader -from UM.Mesh.MeshBuilder import MeshBuilder +import math +import os.path +import zipfile + +from UM.Job import Job from UM.Logger import Logger from UM.Math.Matrix import Matrix from UM.Math.Vector import Vector -from UM.Scene.SceneNode import SceneNode +from UM.Mesh.MeshBuilder import MeshBuilder +from UM.Mesh.MeshReader import MeshReader from UM.Scene.GroupDecorator import GroupDecorator import UM.Application -from UM.Job import Job from cura.Settings.SettingOverrideDecorator import SettingOverrideDecorator from UM.Application import Application from cura.Settings.ExtruderManager import ExtruderManager from cura.QualityManager import QualityManager -from UM.Scene.SliceableObjectDecorator import SliceableObjectDecorator - -import os.path -import zipfile +from UM.Scene.SceneNode import SceneNode try: import xml.etree.cElementTree as ET @@ -235,8 +235,6 @@ class ThreeMFReader(MeshReader): except Exception as e: Logger.log("e", "An exception occurred in 3mf reader: %s", e) - sliceable_decorator = SliceableObjectDecorator() - result.addDecorator(sliceable_decorator) return result ## Create a scale vector based on a unit string. diff --git a/plugins/GCodeReader/GCodeReader.py b/plugins/GCodeReader/GCodeReader.py index e9aea36fae..22a2463724 100644 --- a/plugins/GCodeReader/GCodeReader.py +++ b/plugins/GCodeReader/GCodeReader.py @@ -1,25 +1,22 @@ # Copyright (c) 2016 Aleph Objects, Inc. # Cura is released under the terms of the AGPLv3 or higher. -from UM.Mesh.MeshReader import MeshReader -import os -from UM.Scene.SceneNode import SceneNode -from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator -from UM.Math.Vector import Vector -from UM.Math.AxisAlignedBox import AxisAlignedBox from UM.Application import Application -from UM.Message import Message from UM.Logger import Logger -from UM.Backend.Backend import BackendState - +from UM.Math.AxisAlignedBox import AxisAlignedBox +from UM.Math.Vector import Vector +from UM.Mesh.MeshReader import MeshReader +from UM.Message import Message +from UM.Scene.SceneNode import SceneNode from UM.i18n import i18nCatalog + catalog = i18nCatalog("cura") from cura import LayerDataBuilder from cura import LayerDataDecorator from cura.LayerPolygon import LayerPolygon -from UM.Scene.SliceableObjectDecorator import SliceableObjectDecorator +from cura.SliceableObjectDecorator import SliceableObjectDecorator import numpy import math @@ -263,12 +260,6 @@ class GCodeReader(MeshReader): decorator = LayerDataDecorator.LayerDataDecorator() decorator.setLayerData(layer_mesh) scene_node.addDecorator(decorator) - - sliceable_decorator = SliceableObjectDecorator() - sliceable_decorator.setBlockSlicing(True) - sliceable_decorator.setSliceable(False) - scene_node.addDecorator(sliceable_decorator) - Application.getInstance().getController().getScene().gcode_list = glist Logger.log("d", "Finished parsing %s" % file_name) diff --git a/plugins/X3DReader/X3DReader.py b/plugins/X3DReader/X3DReader.py index 16b8a6a5ae..0a81e98d0d 100644 --- a/plugins/X3DReader/X3DReader.py +++ b/plugins/X3DReader/X3DReader.py @@ -1,16 +1,17 @@ # Contributed by Seva Alekseyev with National Institutes of Health, 2016 # Cura is released under the terms of the AGPLv3 or higher. -from UM.Mesh.MeshReader import MeshReader -from UM.Mesh.MeshBuilder import MeshBuilder +from math import pi, sin, cos, sqrt + +import numpy + +from UM.Job import Job from UM.Logger import Logger from UM.Math.Matrix import Matrix from UM.Math.Vector import Vector +from UM.Mesh.MeshBuilder import MeshBuilder +from UM.Mesh.MeshReader import MeshReader from UM.Scene.SceneNode import SceneNode -from UM.Job import Job -from math import pi, sin, cos, sqrt -import numpy -from UM.Scene.SliceableObjectDecorator import SliceableObjectDecorator try: import xml.etree.cElementTree as ET @@ -97,8 +98,6 @@ class X3DReader(MeshReader): Logger.logException("e", "Exception in X3D reader") return None - sliceable_decorator = SliceableObjectDecorator() - node.addDecorator(sliceable_decorator) return node # ------------------------- XML tree traversal From fecf23d66d099f8192ef2b9e41c182b82b9a8680 Mon Sep 17 00:00:00 2001 From: Victor Larchenko Date: Fri, 9 Dec 2016 15:42:00 +0600 Subject: [PATCH 57/75] D6: Moved extensions to plugin metadata --- cura/CuraApplication.py | 11 +++++------ plugins/GCodeReader/__init__.py | 2 ++ 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 028a8bf85e..8e93b1b7ad 100644 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -1033,7 +1033,7 @@ class CuraApplication(QtApplication): Logger.log("d", msg) _loading_files = [] - _non_sliceable_extensions = [".gcode", ".g"] + non_sliceable_extensions = [] @pyqtSlot(QUrl) def readLocalFile(self, file): @@ -1052,7 +1052,7 @@ class CuraApplication(QtApplication): filename = os.path.basename(f) if len(self._loading_files) > 0: # If a non-slicable file is already being loaded, we prevent loading of any further non-slicable files - if extension.lower() in self._non_sliceable_extensions: + if extension.lower() in self.non_sliceable_extensions: message = Message( self._i18n_catalog.i18nc("@info:status", "Only one G-code file can be loaded at a time. Skipped importing {0}", @@ -1061,7 +1061,7 @@ class CuraApplication(QtApplication): return # If file being loaded is non-slicable file, then prevent loading of any other files extension = os.path.splitext(self._loading_files[0])[1] - if extension.lower() in self._non_sliceable_extensions: + if extension.lower() in self.non_sliceable_extensions: message = Message( self._i18n_catalog.i18nc("@info:status", "Can't open any other file if G-code is loading. Skipped importing {0}", @@ -1070,7 +1070,7 @@ class CuraApplication(QtApplication): return self._loading_files.append(f) - if extension in self._non_sliceable_extensions: + if extension in self.non_sliceable_extensions: self.deleteAll() job = ReadMeshJob(f) @@ -1087,7 +1087,7 @@ class CuraApplication(QtApplication): node.setName(os.path.basename(filename)) extension = os.path.splitext(filename)[1] - if extension.lower() in self._non_sliceable_extensions: + if extension.lower() in self.non_sliceable_extensions: self.changeLayerViewSignal.emit() sliceable_decorator = SliceableObjectDecorator() sliceable_decorator.setBlockSlicing(True) @@ -1099,7 +1099,6 @@ class CuraApplication(QtApplication): sliceable_decorator.setSliceable(True) node.addDecorator(sliceable_decorator) - scene = self.getController().getScene() op = AddSceneNodeOperation(node, scene.getRoot()) diff --git a/plugins/GCodeReader/__init__.py b/plugins/GCodeReader/__init__.py index 7e543d6624..cdf1b063aa 100644 --- a/plugins/GCodeReader/__init__.py +++ b/plugins/GCodeReader/__init__.py @@ -28,4 +28,6 @@ def getMetaData(): } def register(app): + app.non_sliceable_extensions.append(".gcode") + app.non_sliceable_extensions.append(".g") return { "mesh_reader": GCodeReader.GCodeReader() } From 90f7cebbbbf2bbb5678a3fc0d92801c8d5930593 Mon Sep 17 00:00:00 2001 From: Victor Larchenko Date: Mon, 12 Dec 2016 12:45:46 +0600 Subject: [PATCH 58/75] D6: Fixed gcode loading to scene while undo/redo --- cura/CuraApplication.py | 3 +++ cura/GCodeListDecorator.py | 13 +++++++++++++ plugins/GCodeReader/GCodeReader.py | 8 ++++++-- resources/qml/SaveButton.qml | 4 ++-- 4 files changed, 24 insertions(+), 4 deletions(-) create mode 100644 cura/GCodeListDecorator.py diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 8e93b1b7ad..cf6284bf86 100644 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -598,6 +598,9 @@ class CuraApplication(QtApplication): continue if node.callDecoration("shouldBlockSlicing"): should_pause = True + gcode_list = node.callDecoration("gCodeList") + if gcode_list is not None: + self.getController().getScene().gcode_list = gcode_list count += 1 if not scene_bounding_box: diff --git a/cura/GCodeListDecorator.py b/cura/GCodeListDecorator.py new file mode 100644 index 0000000000..9c103db84f --- /dev/null +++ b/cura/GCodeListDecorator.py @@ -0,0 +1,13 @@ +from UM.Scene.SceneNodeDecorator import SceneNodeDecorator + + +class GCodeListDecorator(SceneNodeDecorator): + def __init__(self): + super().__init__() + self._gcode_list = [] + + def gCodeList(self): + return self._gcode_list + + def setGCodeList(self, list): + self._gcode_list = list diff --git a/plugins/GCodeReader/GCodeReader.py b/plugins/GCodeReader/GCodeReader.py index 22a2463724..4ca0be0000 100644 --- a/plugins/GCodeReader/GCodeReader.py +++ b/plugins/GCodeReader/GCodeReader.py @@ -16,7 +16,7 @@ catalog = i18nCatalog("cura") from cura import LayerDataBuilder from cura import LayerDataDecorator from cura.LayerPolygon import LayerPolygon -from cura.SliceableObjectDecorator import SliceableObjectDecorator +from cura.GCodeListDecorator import GCodeListDecorator import numpy import math @@ -203,6 +203,7 @@ class GCodeReader(MeshReader): current_line = 0 for line in file: file_lines += 1 + glist.append(line) file.seek(0) file_step = max(math.floor(file_lines / 100), 1) @@ -260,7 +261,10 @@ class GCodeReader(MeshReader): decorator = LayerDataDecorator.LayerDataDecorator() decorator.setLayerData(layer_mesh) scene_node.addDecorator(decorator) - Application.getInstance().getController().getScene().gcode_list = glist + + gcode_list_decorator = GCodeListDecorator() + gcode_list_decorator.setGCodeList(glist) + scene_node.addDecorator(gcode_list_decorator) Logger.log("d", "Finished parsing %s" % file_name) self._message.hide() diff --git a/resources/qml/SaveButton.qml b/resources/qml/SaveButton.qml index 843ac19837..323123e9a7 100644 --- a/resources/qml/SaveButton.qml +++ b/resources/qml/SaveButton.qml @@ -106,7 +106,7 @@ Rectangle { id: saveToButton tooltip: UM.OutputDeviceManager.activeDeviceDescription; - enabled: base.backendState == 3 && base.activity == true + enabled: (base.backendState == 3 || base.backendState == 5) && base.activity == true height: UM.Theme.getSize("save_button_save_to_button").height anchors.top: parent.top @@ -181,7 +181,7 @@ Rectangle { anchors.rightMargin: UM.Theme.getSize("default_margin").width width: UM.Theme.getSize("save_button_save_to_button").height height: UM.Theme.getSize("save_button_save_to_button").height - enabled: base.backendState == 3 && base.activity == true + enabled: (base.backendState == 3 || base.backendState == 5) && base.activity == true visible: devicesModel.deviceCount > 1 From 647c2f15ba16926619b0aea52ba0503201529172 Mon Sep 17 00:00:00 2001 From: Victor Larchenko Date: Mon, 12 Dec 2016 13:10:02 +0600 Subject: [PATCH 59/75] D6: Changed Decorator --- cura/CuraApplication.py | 14 ++++++-------- cura/SliceableObjectDecorator.py | 7 ------- plugins/LayerView/LayerPass.py | 2 +- 3 files changed, 7 insertions(+), 16 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index cf6284bf86..f25fbe19bc 100644 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -594,9 +594,9 @@ class CuraApplication(QtApplication): scene_bounding_box = None should_pause = False for node in DepthFirstIterator(self.getController().getScene().getRoot()): - if type(node) is not SceneNode or (not node.getMeshData() and not node.callDecoration("shouldBlockSlicing")): + if type(node) is not SceneNode or (not node.getMeshData() and node.callDecoration("isSliceable") is None): continue - if node.callDecoration("shouldBlockSlicing"): + if node.callDecoration("isSliceable") is False: should_pause = True gcode_list = node.callDecoration("gCodeList") if gcode_list is not None: @@ -613,7 +613,8 @@ class CuraApplication(QtApplication): print_information = self.getPrintInformation() if should_pause: self.getBackend().pauseSlicing() - print_information.setPreSliced(True) + if print_information: + print_information.setPreSliced(True) else: self.getBackend().continueSlicing() if print_information: @@ -739,7 +740,7 @@ class CuraApplication(QtApplication): for node in DepthFirstIterator(self.getController().getScene().getRoot()): if type(node) is not SceneNode: continue - if (not node.getMeshData() and node.callDecoration("isSliceable")) and not node.callDecoration("isGroup"): + if (not node.getMeshData() and node.callDecoration("isSliceable") is None) and not node.callDecoration("isGroup"): continue # Node that doesnt have a mesh and is not a group. if node.getParent() and node.getParent().callDecoration("isGroup"): continue # Grouped nodes don't need resetting as their parent (the group) is resetted) @@ -1046,7 +1047,7 @@ class CuraApplication(QtApplication): scene = self.getController().getScene() for node in DepthFirstIterator(scene.getRoot()): - if node.callDecoration("shouldBlockSlicing"): + if node.callDecoration("isSliceable") is False: self.deleteAll() break @@ -1093,13 +1094,10 @@ class CuraApplication(QtApplication): if extension.lower() in self.non_sliceable_extensions: self.changeLayerViewSignal.emit() sliceable_decorator = SliceableObjectDecorator() - sliceable_decorator.setBlockSlicing(True) sliceable_decorator.setSliceable(False) node.addDecorator(sliceable_decorator) else: sliceable_decorator = SliceableObjectDecorator() - sliceable_decorator.setBlockSlicing(False) - sliceable_decorator.setSliceable(True) node.addDecorator(sliceable_decorator) scene = self.getController().getScene() diff --git a/cura/SliceableObjectDecorator.py b/cura/SliceableObjectDecorator.py index 12dbbcb751..7fa3ca37f2 100644 --- a/cura/SliceableObjectDecorator.py +++ b/cura/SliceableObjectDecorator.py @@ -6,16 +6,9 @@ class SliceableObjectDecorator(SceneNodeDecorator): def __init__(self): super().__init__() self._sliceable = True - self._block_slicing = False def isSliceable(self): return self._sliceable def setSliceable(self, sliceable): self._sliceable = sliceable - - def shouldBlockSlicing(self): - return self._block_slicing - - def setBlockSlicing(self, block_slicing): - self._block_slicing = block_slicing diff --git a/plugins/LayerView/LayerPass.py b/plugins/LayerView/LayerPass.py index ca895619a3..4a494a3436 100644 --- a/plugins/LayerView/LayerPass.py +++ b/plugins/LayerView/LayerPass.py @@ -49,7 +49,7 @@ class LayerPass(RenderPass): if isinstance(node, ToolHandle): tool_handle_batch.addItem(node.getWorldTransformation(), mesh = node.getSolidMesh()) - elif isinstance(node, SceneNode) and (node.getMeshData() or not node.callDecoration("isSliceable")) and node.isVisible(): + elif isinstance(node, SceneNode) and (node.getMeshData() or node.callDecoration("isSliceable") is False) and node.isVisible(): layer_data = node.callDecoration("getLayerData") if not layer_data: continue From 67ab0cab4160f56e3e0ecb239d7cc8ce540fc8f3 Mon Sep 17 00:00:00 2001 From: Victor Larchenko Date: Tue, 13 Dec 2016 13:39:09 +0600 Subject: [PATCH 60/75] D6: Changed decorator and swapping to LayerView --- cura/BlockSlicingDecorator.py | 9 +++++ cura/CuraApplication.py | 58 ++++++++++++++--------------- cura/GCodeListDecorator.py | 2 +- cura/NonSliceableObjectDecorator.py | 9 +++++ cura/SliceableObjectDecorator.py | 7 +--- plugins/GCodeReader/__init__.py | 4 +- plugins/LayerView/LayerPass.py | 2 +- 7 files changed, 50 insertions(+), 41 deletions(-) create mode 100644 cura/BlockSlicingDecorator.py create mode 100644 cura/NonSliceableObjectDecorator.py diff --git a/cura/BlockSlicingDecorator.py b/cura/BlockSlicingDecorator.py new file mode 100644 index 0000000000..669d69b09f --- /dev/null +++ b/cura/BlockSlicingDecorator.py @@ -0,0 +1,9 @@ +from UM.Scene.SceneNodeDecorator import SceneNodeDecorator + + +class BlockSlicingDecorator(SceneNodeDecorator): + def __init__(self): + super().__init__() + + def isBlockSlicing(self): + return True diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index f25fbe19bc..a9cafd4fc6 100644 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -29,6 +29,7 @@ from UM.Operations.SetTransformOperation import SetTransformOperation from UM.Operations.TranslateOperation import TranslateOperation from cura.SetParentOperation import SetParentOperation from cura.SliceableObjectDecorator import SliceableObjectDecorator +from cura.BlockSlicingDecorator import BlockSlicingDecorator from UM.Settings.SettingDefinition import SettingDefinition, DefinitionPropertyType from UM.Settings.ContainerRegistry import ContainerRegistry @@ -136,6 +137,9 @@ class CuraApplication(QtApplication): } ) + self._currently_loading_files = [] + self._non_sliceable_extensions = [] + self._machine_action_manager = MachineActionManager.MachineActionManager() self._machine_manager = None # This is initialized on demand. self._setting_inheritance_manager = None @@ -290,8 +294,6 @@ class CuraApplication(QtApplication): self._recent_files.append(QUrl.fromLocalFile(f)) - self.changeLayerViewSignal.connect(self.changeToLayerView) - def _onEngineCreated(self): self._engine.addImageProvider("camera", CameraImageProvider.CameraImageProvider()) @@ -538,15 +540,6 @@ class CuraApplication(QtApplication): qmlRegisterType(QUrl.fromLocalFile(path), "Cura", 1, 0, type_name) - changeLayerViewSignal = pyqtSignal() - - def changeToLayerView(self): - self.getController().setActiveView("LayerView") - view = self.getController().getActiveView() - view.resetLayerData() - view.setLayer(999999) - view.calculateMaxLayers() - def onSelectionChanged(self): if Selection.hasSelection(): if self.getController().getActiveTool(): @@ -594,11 +587,11 @@ class CuraApplication(QtApplication): scene_bounding_box = None should_pause = False for node in DepthFirstIterator(self.getController().getScene().getRoot()): - if type(node) is not SceneNode or (not node.getMeshData() and node.callDecoration("isSliceable") is None): + if type(node) is not SceneNode or (not node.getMeshData() and not node.callDecoration("isBlockSlicing")): continue - if node.callDecoration("isSliceable") is False: + if node.callDecoration("isBlockSlicing"): should_pause = True - gcode_list = node.callDecoration("gCodeList") + gcode_list = node.callDecoration("getGCodeList") if gcode_list is not None: self.getController().getScene().gcode_list = gcode_list @@ -740,7 +733,7 @@ class CuraApplication(QtApplication): for node in DepthFirstIterator(self.getController().getScene().getRoot()): if type(node) is not SceneNode: continue - if (not node.getMeshData() and node.callDecoration("isSliceable") is None) and not node.callDecoration("isGroup"): + if (not node.getMeshData() and not node.callDecoration("isBlockSlicing")) and not node.callDecoration("isGroup"): continue # Node that doesnt have a mesh and is not a group. if node.getParent() and node.getParent().callDecoration("isGroup"): continue # Grouped nodes don't need resetting as their parent (the group) is resetted) @@ -1036,9 +1029,6 @@ class CuraApplication(QtApplication): def log(self, msg): Logger.log("d", msg) - _loading_files = [] - non_sliceable_extensions = [] - @pyqtSlot(QUrl) def readLocalFile(self, file): if not file.isValid(): @@ -1047,16 +1037,16 @@ class CuraApplication(QtApplication): scene = self.getController().getScene() for node in DepthFirstIterator(scene.getRoot()): - if node.callDecoration("isSliceable") is False: + if node.callDecoration("isBlockSlicing"): self.deleteAll() break f = file.toLocalFile() extension = os.path.splitext(f)[1] filename = os.path.basename(f) - if len(self._loading_files) > 0: + if len(self._currently_loading_files) > 0: # If a non-slicable file is already being loaded, we prevent loading of any further non-slicable files - if extension.lower() in self.non_sliceable_extensions: + if extension.lower() in self._non_sliceable_extensions: message = Message( self._i18n_catalog.i18nc("@info:status", "Only one G-code file can be loaded at a time. Skipped importing {0}", @@ -1064,8 +1054,8 @@ class CuraApplication(QtApplication): message.show() return # If file being loaded is non-slicable file, then prevent loading of any other files - extension = os.path.splitext(self._loading_files[0])[1] - if extension.lower() in self.non_sliceable_extensions: + extension = os.path.splitext(self._currently_loading_files[0])[1] + if extension.lower() in self._non_sliceable_extensions: message = Message( self._i18n_catalog.i18nc("@info:status", "Can't open any other file if G-code is loading. Skipped importing {0}", @@ -1073,8 +1063,8 @@ class CuraApplication(QtApplication): message.show() return - self._loading_files.append(f) - if extension in self.non_sliceable_extensions: + self._currently_loading_files.append(f) + if extension in self._non_sliceable_extensions: self.deleteAll() job = ReadMeshJob(f) @@ -1084,18 +1074,22 @@ class CuraApplication(QtApplication): def _readMeshFinished(self, job): node = job.getResult() filename = job.getFileName() - self._loading_files.remove(filename) + self._currently_loading_files.remove(filename) if node != None: node.setSelectable(True) node.setName(os.path.basename(filename)) extension = os.path.splitext(filename)[1] - if extension.lower() in self.non_sliceable_extensions: - self.changeLayerViewSignal.emit() - sliceable_decorator = SliceableObjectDecorator() - sliceable_decorator.setSliceable(False) - node.addDecorator(sliceable_decorator) + if extension.lower() in self._non_sliceable_extensions: + self.getController().setActiveView("LayerView") + view = self.getController().getActiveView() + view.resetLayerData() + view.setLayer(9999999) + view.calculateMaxLayers() + + block_slicing_decorator = BlockSlicingDecorator() + node.addDecorator(block_slicing_decorator) else: sliceable_decorator = SliceableObjectDecorator() node.addDecorator(sliceable_decorator) @@ -1107,3 +1101,5 @@ class CuraApplication(QtApplication): scene.sceneChanged.emit(node) + def addNonSliceableExtension(self, extension): + self._non_sliceable_extensions.append(extension) diff --git a/cura/GCodeListDecorator.py b/cura/GCodeListDecorator.py index 9c103db84f..72ff975108 100644 --- a/cura/GCodeListDecorator.py +++ b/cura/GCodeListDecorator.py @@ -6,7 +6,7 @@ class GCodeListDecorator(SceneNodeDecorator): super().__init__() self._gcode_list = [] - def gCodeList(self): + def getGCodeList(self): return self._gcode_list def setGCodeList(self, list): diff --git a/cura/NonSliceableObjectDecorator.py b/cura/NonSliceableObjectDecorator.py new file mode 100644 index 0000000000..1f1a08e075 --- /dev/null +++ b/cura/NonSliceableObjectDecorator.py @@ -0,0 +1,9 @@ +from UM.Scene.SceneNodeDecorator import SceneNodeDecorator + + +class NonSliceableObjectDecorator(SceneNodeDecorator): + def __init__(self): + super().__init__() + + def isNonSliceable(self): + return True diff --git a/cura/SliceableObjectDecorator.py b/cura/SliceableObjectDecorator.py index 7fa3ca37f2..315149a3cf 100644 --- a/cura/SliceableObjectDecorator.py +++ b/cura/SliceableObjectDecorator.py @@ -1,14 +1,9 @@ from UM.Scene.SceneNodeDecorator import SceneNodeDecorator -## Simple decorator to indicate a scene node is sliceable or not. class SliceableObjectDecorator(SceneNodeDecorator): def __init__(self): super().__init__() - self._sliceable = True def isSliceable(self): - return self._sliceable - - def setSliceable(self, sliceable): - self._sliceable = sliceable + return True diff --git a/plugins/GCodeReader/__init__.py b/plugins/GCodeReader/__init__.py index cdf1b063aa..2ff412e757 100644 --- a/plugins/GCodeReader/__init__.py +++ b/plugins/GCodeReader/__init__.py @@ -28,6 +28,6 @@ def getMetaData(): } def register(app): - app.non_sliceable_extensions.append(".gcode") - app.non_sliceable_extensions.append(".g") + app.addNonSliceableExtension(".gcode") + app.addNonSliceableExtension(".g") return { "mesh_reader": GCodeReader.GCodeReader() } diff --git a/plugins/LayerView/LayerPass.py b/plugins/LayerView/LayerPass.py index 4a494a3436..9bc67efc58 100644 --- a/plugins/LayerView/LayerPass.py +++ b/plugins/LayerView/LayerPass.py @@ -49,7 +49,7 @@ class LayerPass(RenderPass): if isinstance(node, ToolHandle): tool_handle_batch.addItem(node.getWorldTransformation(), mesh = node.getSolidMesh()) - elif isinstance(node, SceneNode) and (node.getMeshData() or node.callDecoration("isSliceable") is False) and node.isVisible(): + elif isinstance(node, SceneNode) and (node.getMeshData() or node.callDecoration("isBlockSlicing")) and node.isVisible(): layer_data = node.callDecoration("getLayerData") if not layer_data: continue From b967f045fe2e0342fd4629066f1764d5482454c5 Mon Sep 17 00:00:00 2001 From: Victor Larchenko Date: Tue, 13 Dec 2016 13:41:00 +0600 Subject: [PATCH 61/75] D6: Removed unused file --- cura/NonSliceableObjectDecorator.py | 9 --------- 1 file changed, 9 deletions(-) delete mode 100644 cura/NonSliceableObjectDecorator.py diff --git a/cura/NonSliceableObjectDecorator.py b/cura/NonSliceableObjectDecorator.py deleted file mode 100644 index 1f1a08e075..0000000000 --- a/cura/NonSliceableObjectDecorator.py +++ /dev/null @@ -1,9 +0,0 @@ -from UM.Scene.SceneNodeDecorator import SceneNodeDecorator - - -class NonSliceableObjectDecorator(SceneNodeDecorator): - def __init__(self): - super().__init__() - - def isNonSliceable(self): - return True From cb428c70de5cd79e3f652a5eeba944c038bc8e7e Mon Sep 17 00:00:00 2001 From: Victor Larchenko Date: Tue, 13 Dec 2016 13:58:33 +0600 Subject: [PATCH 62/75] D6: Moved backend pausing to itself --- cura/CuraApplication.py | 18 +-------------- .../CuraEngineBackend/CuraEngineBackend.py | 22 +++++++++++++++++++ 2 files changed, 23 insertions(+), 17 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index a9cafd4fc6..45221738be 100644 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -585,16 +585,10 @@ class CuraApplication(QtApplication): def updatePlatformActivity(self, node = None): count = 0 scene_bounding_box = None - should_pause = False for node in DepthFirstIterator(self.getController().getScene().getRoot()): if type(node) is not SceneNode or (not node.getMeshData() and not node.callDecoration("isBlockSlicing")): continue - if node.callDecoration("isBlockSlicing"): - should_pause = True - gcode_list = node.callDecoration("getGCodeList") - if gcode_list is not None: - self.getController().getScene().gcode_list = gcode_list - + count += 1 if not scene_bounding_box: scene_bounding_box = node.getBoundingBox() @@ -603,16 +597,6 @@ class CuraApplication(QtApplication): if other_bb is not None: scene_bounding_box = scene_bounding_box + node.getBoundingBox() - print_information = self.getPrintInformation() - if should_pause: - self.getBackend().pauseSlicing() - if print_information: - print_information.setPreSliced(True) - else: - self.getBackend().continueSlicing() - if print_information: - print_information.setPreSliced(False) - if not scene_bounding_box: scene_bounding_box = AxisAlignedBox.Null diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index 44009ae1de..93e2bd7c68 100644 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -12,6 +12,8 @@ from UM.PluginRegistry import PluginRegistry from UM.Resources import Resources from UM.Settings.Validator import ValidatorState #To find if a setting is in an error state. We can't slice then. from UM.Platform import Platform +from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator + import cura.Settings @@ -313,6 +315,26 @@ class CuraEngineBackend(Backend): if source is self._scene.getRoot(): return + application = Application.getInstance() + + should_pause = False + for node in DepthFirstIterator(self._scene.getRoot()): + if node.callDecoration("isBlockSlicing"): + should_pause = True + gcode_list = node.callDecoration("getGCodeList") + if gcode_list is not None: + self._scene.gcode_list = gcode_list + + print_information = application.getPrintInformation() + if should_pause: + self.pauseSlicing() + if print_information: + print_information.setPreSliced(True) + else: + self.continueSlicing() + if print_information: + print_information.setPreSliced(False) + if source.getMeshData() is None: return From 9e85d6c8941a303edc2b99a076d17f4298cc4978 Mon Sep 17 00:00:00 2001 From: Youness Alaoui Date: Fri, 16 Dec 2016 12:59:37 -0500 Subject: [PATCH 63/75] Fix GCodeReader-feature related _readMeshfinished to match changes upstream. The job.getResult() now returns a list of nodes now, so we need to loop over those nodes instead of taking it as a single node value. --- cura/CuraApplication.py | 4 ++-- plugins/3MFReader/ThreeMFReader.py | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 45221738be..54f4cf3057 100644 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -1056,11 +1056,11 @@ class CuraApplication(QtApplication): job.start() def _readMeshFinished(self, job): - node = job.getResult() + nodes = job.getResult() filename = job.getFileName() self._currently_loading_files.remove(filename) - if node != None: + for node in nodes: node.setSelectable(True) node.setName(os.path.basename(filename)) diff --git a/plugins/3MFReader/ThreeMFReader.py b/plugins/3MFReader/ThreeMFReader.py index ee4e1daab4..e9f0e28511 100644 --- a/plugins/3MFReader/ThreeMFReader.py +++ b/plugins/3MFReader/ThreeMFReader.py @@ -1,7 +1,6 @@ # Copyright (c) 2015 Ultimaker B.V. # Cura is released under the terms of the AGPLv3 or higher. -import math import os.path import zipfile From 485e81731f455a48d8a74f8562a2426e0a9c5a64 Mon Sep 17 00:00:00 2001 From: Victor Larchenko Date: Mon, 19 Dec 2016 10:10:51 +0600 Subject: [PATCH 64/75] D6: Fixed file naming, removed spaces and fixed decoration calls --- cura/BlockSlicingDecorator.py | 2 +- cura/CuraApplication.py | 13 ++++++++++--- cura/GCodeListDecorator.py | 2 +- plugins/CuraEngineBackend/CuraEngineBackend.py | 7 ------- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/cura/BlockSlicingDecorator.py b/cura/BlockSlicingDecorator.py index 669d69b09f..3fc0015836 100644 --- a/cura/BlockSlicingDecorator.py +++ b/cura/BlockSlicingDecorator.py @@ -4,6 +4,6 @@ from UM.Scene.SceneNodeDecorator import SceneNodeDecorator class BlockSlicingDecorator(SceneNodeDecorator): def __init__(self): super().__init__() - + def isBlockSlicing(self): return True diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 54f4cf3057..73cf50b214 100644 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -585,10 +585,13 @@ class CuraApplication(QtApplication): def updatePlatformActivity(self, node = None): count = 0 scene_bounding_box = None + is_block_slicing_node = False for node in DepthFirstIterator(self.getController().getScene().getRoot()): - if type(node) is not SceneNode or (not node.getMeshData() and not node.callDecoration("isBlockSlicing")): + if type(node) is not SceneNode or (not node.getMeshData() and not node.callDecoration("getLayerData")): continue - + if node.callDecoration("isBlockSlicing"): + is_block_slicing_node = True + count += 1 if not scene_bounding_box: scene_bounding_box = node.getBoundingBox() @@ -597,6 +600,10 @@ class CuraApplication(QtApplication): if other_bb is not None: scene_bounding_box = scene_bounding_box + node.getBoundingBox() + print_information = self.getPrintInformation() + if print_information: + print_information.setPreSliced(is_block_slicing_node) + if not scene_bounding_box: scene_bounding_box = AxisAlignedBox.Null @@ -717,7 +724,7 @@ class CuraApplication(QtApplication): for node in DepthFirstIterator(self.getController().getScene().getRoot()): if type(node) is not SceneNode: continue - if (not node.getMeshData() and not node.callDecoration("isBlockSlicing")) and not node.callDecoration("isGroup"): + if (not node.getMeshData() and not node.callDecoration("getLayerData")) and not node.callDecoration("isGroup"): continue # Node that doesnt have a mesh and is not a group. if node.getParent() and node.getParent().callDecoration("isGroup"): continue # Grouped nodes don't need resetting as their parent (the group) is resetted) diff --git a/cura/GCodeListDecorator.py b/cura/GCodeListDecorator.py index 72ff975108..5738d0a7f2 100644 --- a/cura/GCodeListDecorator.py +++ b/cura/GCodeListDecorator.py @@ -5,7 +5,7 @@ class GCodeListDecorator(SceneNodeDecorator): def __init__(self): super().__init__() self._gcode_list = [] - + def getGCodeList(self): return self._gcode_list diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index 93e2bd7c68..cf53475fb4 100644 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -315,8 +315,6 @@ class CuraEngineBackend(Backend): if source is self._scene.getRoot(): return - application = Application.getInstance() - should_pause = False for node in DepthFirstIterator(self._scene.getRoot()): if node.callDecoration("isBlockSlicing"): @@ -325,15 +323,10 @@ class CuraEngineBackend(Backend): if gcode_list is not None: self._scene.gcode_list = gcode_list - print_information = application.getPrintInformation() if should_pause: self.pauseSlicing() - if print_information: - print_information.setPreSliced(True) else: self.continueSlicing() - if print_information: - print_information.setPreSliced(False) if source.getMeshData() is None: return From f8874bfe21ac27d28816053c5e73c1978487a8d3 Mon Sep 17 00:00:00 2001 From: Victor Larchenko Date: Tue, 20 Dec 2016 14:12:33 +0600 Subject: [PATCH 65/75] D6: Fixed multi-extrusion --- plugins/GCodeReader/GCodeReader.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/plugins/GCodeReader/GCodeReader.py b/plugins/GCodeReader/GCodeReader.py index 4ca0be0000..4aa7e92a45 100644 --- a/plugins/GCodeReader/GCodeReader.py +++ b/plugins/GCodeReader/GCodeReader.py @@ -177,12 +177,15 @@ class GCodeReader(MeshReader): def _processTCode(self, T, line, position, path): self._extruder = T + if self._extruder + 1 > len(position.e): + position.e.extend([0] * (self._extruder - len(position.e) + 1)) if len(path) > 1 and position[2] > 0: if self._createPolygon(position[2], path): self._layer += 1 path.clear() else: path.clear() + return position _type_keyword = ";TYPE:" @@ -216,7 +219,7 @@ class GCodeReader(MeshReader): Logger.log("d", "Parsing %s" % file_name) - current_position = self._position(0, 0, 0, [0, 0]) + current_position = self._position(0, 0, 0, [0]) current_path = [] for line in file: @@ -250,7 +253,7 @@ class GCodeReader(MeshReader): current_position = self._processGCode(G, line, current_position, current_path) T = self._getInt(line, "T") if T is not None: - self._processTCode(T, line, current_position, current_path) + current_position = self._processTCode(T, line, current_position, current_path) if len(current_path) > 1 and current_position[2] > 0: if self._createPolygon(current_position[2], current_path): From 02f47361f1f4bfcf508faf50f2e6a0bb79d02292 Mon Sep 17 00:00:00 2001 From: Peter Hamberg Date: Wed, 4 Jan 2017 07:35:41 +0100 Subject: [PATCH 66/75] Correct y axis print head size for printrbot simple Print head size settings for printrbot simple had y min and y max mixed up, making "print one at a time" always print in the wrong order. --- resources/definitions/printrbot_simple.def.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/resources/definitions/printrbot_simple.def.json b/resources/definitions/printrbot_simple.def.json index 80801363c4..b1af5f3baa 100644 --- a/resources/definitions/printrbot_simple.def.json +++ b/resources/definitions/printrbot_simple.def.json @@ -26,10 +26,10 @@ "machine_nozzle_cool_down_speed": { "default_value": 2 }, "machine_head_with_fans_polygon": { "default_value": [ - [ 55, -20 ], - [ 55, 99999 ], - [ -49, 99999 ], - [ -49, -20 ] + [-49, 20], + [-49, -99999], + [55, 20], + [55, -99999] ] }, "gantry_height": { "default_value": 99999 }, From 33cd386556717111e5bc35331bf2428b10f7d72c Mon Sep 17 00:00:00 2001 From: Victor Larchenko Date: Thu, 5 Jan 2017 13:43:08 +0600 Subject: [PATCH 67/75] D6: Fixed layers and line widths --- cura/SliceableObjectDecorator.py | 3 ++ plugins/GCodeReader/GCodeReader.py | 44 ++++++++++++++++++++---------- 2 files changed, 33 insertions(+), 14 deletions(-) diff --git a/cura/SliceableObjectDecorator.py b/cura/SliceableObjectDecorator.py index 315149a3cf..1cb589d9c6 100644 --- a/cura/SliceableObjectDecorator.py +++ b/cura/SliceableObjectDecorator.py @@ -7,3 +7,6 @@ class SliceableObjectDecorator(SceneNodeDecorator): def isSliceable(self): return True + + def __deepcopy__(self, memo): + return type(self)() diff --git a/plugins/GCodeReader/GCodeReader.py b/plugins/GCodeReader/GCodeReader.py index 4aa7e92a45..894783c07d 100644 --- a/plugins/GCodeReader/GCodeReader.py +++ b/plugins/GCodeReader/GCodeReader.py @@ -100,7 +100,7 @@ class GCodeReader(MeshReader): line_types = numpy.empty((count - 1, 1), numpy.int32) line_widths = numpy.empty((count - 1, 1), numpy.float32) # TODO: need to calculate actual line width based on E values - line_widths[:, 0] = 0.5 + line_widths[:, 0] = 0.4 points = numpy.empty((count, 3), numpy.float32) i = 0 for point in path: @@ -109,6 +109,8 @@ class GCodeReader(MeshReader): points[i, 2] = -point[1] if i > 0: line_types[i - 1] = point[3] + if point[3] in [LayerPolygon.MoveCombingType, LayerPolygon.MoveRetractionType]: + line_widths[i - 1] = 0.2 i += 1 this_poly = LayerPolygon(self._layer_data_builder, self._extruder, line_types, points, line_widths) @@ -136,12 +138,13 @@ class GCodeReader(MeshReader): else: path.append([x, y, z, LayerPolygon.MoveCombingType]) if z_changed: - if len(path) > 1 and z > 0: - if self._createPolygon(z, path): - self._layer += 1 - path.clear() - else: - path.clear() + if not self._is_layers_in_file: + if not self._is_layers_in_file and len(path) > 1 and z > 0: + if self._createPolygon(z, path): + self._layer += 1 + path.clear() + else: + path.clear() return self._position(x, y, z, e) def _gCode28(self, position, params, path): @@ -179,15 +182,17 @@ class GCodeReader(MeshReader): self._extruder = T if self._extruder + 1 > len(position.e): position.e.extend([0] * (self._extruder - len(position.e) + 1)) - if len(path) > 1 and position[2] > 0: - if self._createPolygon(position[2], path): - self._layer += 1 - path.clear() - else: - path.clear() + if not self._is_layers_in_file: + if len(path) > 1 and position[2] > 0: + if self._createPolygon(position[2], path): + self._layer += 1 + path.clear() + else: + path.clear() return position _type_keyword = ";TYPE:" + _layer_keyword = ";LAYER:" def read(self, file_name): Logger.log("d", "Preparing to load %s" % file_name) @@ -197,6 +202,7 @@ class GCodeReader(MeshReader): scene_node.getBoundingBox = self._getNullBoundingBox # Manually set bounding box, because mesh doesn't have mesh data glist = [] + self._is_layers_in_file = False Logger.log("d", "Opening file %s" % file_name) @@ -207,6 +213,8 @@ class GCodeReader(MeshReader): for line in file: file_lines += 1 glist.append(line) + if not self._is_layers_in_file and line[:len(self._layer_keyword)] == self._layer_keyword: + self._is_layers_in_file = True file.seek(0) file_step = max(math.floor(file_lines / 100), 1) @@ -245,6 +253,14 @@ class GCodeReader(MeshReader): self._layer_type = LayerPolygon.SupportType elif type == "FILL": self._layer_type = LayerPolygon.InfillType + if self._is_layers_in_file and line[:len(self._layer_keyword)] == self._layer_keyword: + try: + layer_number = int(line[len(self._layer_keyword):]) + self._createPolygon(current_position[2], current_path) + current_path.clear() + self._layer = layer_number + except: + pass if line[0] == ";": continue @@ -255,7 +271,7 @@ class GCodeReader(MeshReader): if T is not None: current_position = self._processTCode(T, line, current_position, current_path) - if len(current_path) > 1 and current_position[2] > 0: + if not self._is_layers_in_file and len(current_path) > 1 and current_position[2] > 0: if self._createPolygon(current_position[2], current_path): self._layer += 1 current_path.clear() From ad95f94d408f8023e91533217da452f122fbc1ef Mon Sep 17 00:00:00 2001 From: Youness Alaoui Date: Thu, 5 Jan 2017 13:04:56 -0500 Subject: [PATCH 68/75] Remove redundant check --- plugins/GCodeReader/GCodeReader.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/GCodeReader/GCodeReader.py b/plugins/GCodeReader/GCodeReader.py index 894783c07d..34ea91a727 100644 --- a/plugins/GCodeReader/GCodeReader.py +++ b/plugins/GCodeReader/GCodeReader.py @@ -139,7 +139,7 @@ class GCodeReader(MeshReader): path.append([x, y, z, LayerPolygon.MoveCombingType]) if z_changed: if not self._is_layers_in_file: - if not self._is_layers_in_file and len(path) > 1 and z > 0: + if len(path) > 1 and z > 0: if self._createPolygon(z, path): self._layer += 1 path.clear() From f095e9050f03af4a6e3a74c4e7309723f59b2aa0 Mon Sep 17 00:00:00 2001 From: Youness Alaoui Date: Thu, 5 Jan 2017 13:14:33 -0500 Subject: [PATCH 69/75] T466: Hide the search icon from printer setup When in custom mode in the printer setup pane and a gcode file gets loaded the search icon needs to disappear as well. Reported by @GhostKeeper, and fix provided by @victor9999 --- resources/qml/Sidebar.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/Sidebar.qml b/resources/qml/Sidebar.qml index ecbe64b26a..a3f792d137 100644 --- a/resources/qml/Sidebar.qml +++ b/resources/qml/Sidebar.qml @@ -385,7 +385,7 @@ Rectangle height: settingsModeSelection.height width: visible ? height : 0 - visible: !monitoringPrint && modesListModel.get(base.currentModeIndex) != undefined && modesListModel.get(base.currentModeIndex).showFilterButton + visible: !monitoringPrint && !hideSettings && modesListModel.get(base.currentModeIndex) != undefined && modesListModel.get(base.currentModeIndex).showFilterButton opacity: visible ? 1 : 0 onClicked: sidebarContents.currentItem.toggleFilterField() From 4d0a0e5ad127bdc02ace85d9de97022eb4a3ad58 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 6 Jan 2017 13:21:47 +0100 Subject: [PATCH 70/75] Added support mesh and anti overhang mesh to exclude list in settingview CURA-3177 --- resources/qml/Settings/SettingView.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/Settings/SettingView.qml b/resources/qml/Settings/SettingView.qml index 6af3985527..24022891c3 100644 --- a/resources/qml/Settings/SettingView.qml +++ b/resources/qml/Settings/SettingView.qml @@ -167,7 +167,7 @@ Item id: definitionsModel; containerId: Cura.MachineManager.activeDefinitionId visibilityHandler: UM.SettingPreferenceVisibilityHandler { } - exclude: ["machine_settings", "command_line_settings", "infill_mesh", "infill_mesh_order"] // TODO: infill_mesh settigns are excluded hardcoded, but should be based on the fact that settable_globally, settable_per_meshgroup and settable_per_extruder are false. + exclude: ["machine_settings", "command_line_settings", "infill_mesh", "infill_mesh_order", "support_mesh", "anti_overhang_mesh"] // TODO: infill_mesh settigns are excluded hardcoded, but should be based on the fact that settable_globally, settable_per_meshgroup and settable_per_extruder are false. expanded: Printer.expandedCategories onExpandedChanged: { From 8b21efb18bddb0554b2e51c9929adec12a627803 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 6 Jan 2017 15:37:21 +0100 Subject: [PATCH 71/75] Correct description of Support Z Distance setting It's rounded up, not down. Contributes to issue CURA-2364. --- resources/definitions/fdmprinter.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index e463cb2802..c87a2f9b9e 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -2815,7 +2815,7 @@ "support_z_distance": { "label": "Support Z Distance", - "description": "Distance from the top/bottom of the support structure to the print. This gap provides clearance to remove the supports after the model is printed. This value is rounded down to a multiple of the layer height.", + "description": "Distance from the top/bottom of the support structure to the print. This gap provides clearance to remove the supports after the model is printed. This value is rounded up to a multiple of the layer height.", "unit": "mm", "type": "float", "minimum_value": "0", From 007494de08939c2f64cb11155c3db65dbb6a4723 Mon Sep 17 00:00:00 2001 From: Ruslan Popov Date: Fri, 6 Jan 2017 23:31:47 +0300 Subject: [PATCH 72/75] Added Russian translation. --- resources/i18n/ru/cura.po | 3546 ++++++++++++++ resources/i18n/ru/fdmextruder.def.json.po | 2417 +++++++++ resources/i18n/ru/fdmprinter.def.json.po | 5395 +++++++++++++++++++++ 3 files changed, 11358 insertions(+) create mode 100644 resources/i18n/ru/cura.po create mode 100644 resources/i18n/ru/fdmextruder.def.json.po create mode 100644 resources/i18n/ru/fdmprinter.def.json.po diff --git a/resources/i18n/ru/cura.po b/resources/i18n/ru/cura.po new file mode 100644 index 0000000000..b81f82e8ea --- /dev/null +++ b/resources/i18n/ru/cura.po @@ -0,0 +1,3546 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-01-05 21:35+0300\n" +"PO-Revision-Date: 2017-01-06 23:45+0300\n" +"Last-Translator: Ruslan Popov \n" +"Language-Team: \n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.8.11\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/__init__.py:12 +msgctxt "@label" +msgid "Machine Settings action" +msgstr "Параметры принтера действие" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/__init__.py:15 +msgctxt "@info:whatsthis" +msgid "" +"Provides a way to change machine settings (such as build volume, nozzle " +"size, etc)" +msgstr "" +"Предоставляет возможность изменения параметров принтера (такие как рабочий " +"объём, диаметр сопла и так далее)" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:22 +msgctxt "@action" +msgid "Machine Settings" +msgstr "Параметры принтера" + +#: /home/ruben/Projects/Cura/plugins/XRayView/__init__.py:12 +msgctxt "@label" +msgid "X-Ray View" +msgstr "Просмотр в рентгене" + +#: /home/ruben/Projects/Cura/plugins/XRayView/__init__.py:15 +msgctxt "@info:whatsthis" +msgid "Provides the X-Ray view." +msgstr "Предоставляет рентгеновский вид." + +#: /home/ruben/Projects/Cura/plugins/XRayView/__init__.py:19 +msgctxt "@item:inlistbox" +msgid "X-Ray" +msgstr "Рентген" + +#: /home/ruben/Projects/Cura/plugins/X3DReader/__init__.py:11 +msgctxt "@label" +msgid "X3D Reader" +msgstr "Чтение X3D" + +#: /home/ruben/Projects/Cura/plugins/X3DReader/__init__.py:14 +msgctxt "@info:whatsthis" +msgid "Provides support for reading X3D files." +msgstr "Предоставляет поддержку для чтения X3D файлов." + +#: /home/ruben/Projects/Cura/plugins/X3DReader/__init__.py:20 +msgctxt "@item:inlistbox" +msgid "X3D File" +msgstr "Файл X3D" + +#: /home/ruben/Projects/Cura/plugins/GCodeWriter/__init__.py:12 +msgctxt "@label" +msgid "GCode Writer" +msgstr "Запись GCode" + +#: /home/ruben/Projects/Cura/plugins/GCodeWriter/__init__.py:15 +msgctxt "@info:whatsthis" +msgid "Writes GCode to a file." +msgstr "Записывает GCode в файл." + +#: /home/ruben/Projects/Cura/plugins/GCodeWriter/__init__.py:22 +msgctxt "@item:inlistbox" +msgid "GCode File" +msgstr "Файл GCode" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/__init__.py:13 +msgctxt "@label" +msgid "Doodle3D" +msgstr "Doodle3D" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/__init__.py:17 +msgctxt "@info:whatsthis" +msgid "Accepts G-Code and sends them over WiFi to a Doodle3D WiFi-Box." +msgstr "Принимает G-Code и отправляет его через WiFi на Doodle3D WiFi-Box." + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/PrinterConnection.py:36 +msgctxt "@item:inmenu" +msgid "Doodle3D printing" +msgstr " Печать Doodle3D" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/PrinterConnection.py:37 +msgctxt "@action:button Preceded by 'Ready to'." +msgid "Print with Doodle3D" +msgstr "Печать через Doodle3D" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/PrinterConnection.py:38 +msgctxt "@info:tooltip" +msgid "Print with " +msgstr "Печать через" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D.py:49 +msgctxt "@title:menu" +msgid "Doodle3D" +msgstr "Doodle3D" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/Doodle3D.py:50 +msgctxt "@item:inlistbox" +msgid "Enable Scan devices..." +msgstr "Активировать сканеры..." + +#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/__init__.py:12 +#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.qml:18 +msgctxt "@label" +msgid "Changelog" +msgstr "Журнал изменений" + +#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/__init__.py:15 +msgctxt "@info:whatsthis" +msgid "Shows changes since latest checked version." +msgstr "Показывает изменения со времени последней отмеченной версии." + +#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:35 +msgctxt "@item:inmenu" +msgid "Show Changelog" +msgstr "Показать журнал изменений" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/__init__.py:13 +msgctxt "@label" +msgid "USB printing" +msgstr "Печать через USB" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/__init__.py:17 +msgctxt "@info:whatsthis" +msgid "" +"Accepts G-Code and sends them to a printer. Plugin can also update firmware." +msgstr "" +"Принимает G-Code и отправляет его на принтер. Плагин также может обновлять " +"прошивку." + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:26 +msgctxt "@item:inmenu" +msgid "USB printing" +msgstr "USB печать" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:27 +msgctxt "@action:button Preceded by 'Ready to'." +msgid "Print via USB" +msgstr "Печатать через USB" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:28 +msgctxt "@info:tooltip" +msgid "Print via USB" +msgstr "Печатать через USB" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:30 +msgctxt "@info:status" +msgid "Connected via USB" +msgstr "Подключено через USB" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:142 +msgctxt "@info:status" +msgid "Unable to start a new job because the printer is busy or not connected." +msgstr "" +"Невозможно запустить новое задание, потому что принтер занят или не " +"подключен." + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:440 +msgctxt "@info:status" +msgid "" +"Unable to start a new job because the printer does not support usb printing." +msgstr "" +"Невозможно запустить новую задачу так как принтер не поддерживает печать " +"через USB." + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:111 +msgctxt "@info" +msgid "Unable to update firmware because there are no printers connected." +msgstr "Невозможно обновить прошивку, не найдены подключенные принтеры." + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDeviceManager.py:125 +#, python-format +msgctxt "@info" +msgid "Could not find firmware required for the printer at %s." +msgstr "Не могу найти прошивку, подходящую для принтера в %s." + +#: /home/ruben/Projects/Cura/plugins/X3GWriter/__init__.py:15 +msgctxt "X3G Writer Plugin Description" +msgid "Writes X3G to a file" +msgstr "Записывает X3G в файл" + +#: /home/ruben/Projects/Cura/plugins/X3GWriter/__init__.py:22 +msgctxt "X3G Writer File Description" +msgid "X3G File" +msgstr "X3G файл" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:23 +msgctxt "@action:button Preceded by 'Ready to'." +msgid "Save to Removable Drive" +msgstr "Сохранить на внешний носитель" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:24 +#, python-brace-format +msgctxt "@item:inlistbox" +msgid "Save to Removable Drive {0}" +msgstr "Сохранить на внешний носитель {0}" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:88 +#, python-brace-format +msgctxt "@info:progress" +msgid "Saving to Removable Drive {0}" +msgstr "Сохранение на внешний носитель {0}" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:98 +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:101 +#, python-brace-format +msgctxt "@info:status" +msgid "Could not save to {0}: {1}" +msgstr "Не могу сохранить {0}: {1}" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:137 +#, python-brace-format +msgctxt "@info:status" +msgid "Saved to Removable Drive {0} as {1}" +msgstr "Сохранено на внешний носитель {0} как {1}" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:138 +msgctxt "@action:button" +msgid "Eject" +msgstr "Извлечь" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:138 +#, python-brace-format +msgctxt "@action" +msgid "Eject removable device {0}" +msgstr "Извлекает внешний носитель {0}" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:143 +#, python-brace-format +msgctxt "@info:status" +msgid "Could not save to removable drive {0}: {1}" +msgstr "Невозможно сохранить на внешний носитель {0}: {1}" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:153 +#, python-brace-format +msgctxt "@info:status" +msgid "Ejected {0}. You can now safely remove the drive." +msgstr "Извлечено {0}. Вы можете теперь безопасно извлечь носитель." + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:155 +#, python-brace-format +msgctxt "@info:status" +msgid "Failed to eject {0}. Another program may be using the drive." +msgstr "" +"Невозможно извлечь {0}. Другая программа может использовать это устройство?" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/__init__.py:12 +msgctxt "@label" +msgid "Removable Drive Output Device Plugin" +msgstr "Плагин для работы с внешним носителем" + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/__init__.py:14 +msgctxt "@info:whatsthis" +msgid "Provides removable drive hotplugging and writing support." +msgstr "Предоставляет поддержку для подключения и записи на внешний носитель." + +#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/WindowsRemovableDrivePlugin.py:69 +msgctxt "@item:intext" +msgid "Removable Drive" +msgstr "Внешний носитель" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/__init__.py:13 +msgctxt "@info:whatsthis" +msgid "Manages network connections to Ultimaker 3 printers" +msgstr "Управляет сетевыми соединениями на принтерах Ultimaker" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:103 +msgctxt "@action:button Preceded by 'Ready to'." +msgid "Print over network" +msgstr "Печать через сеть" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:104 +msgctxt "@properties:tooltip" +msgid "Print over network" +msgstr "Печать через сеть" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:153 +msgctxt "@info:status" +msgid "" +"Access to the printer requested. Please approve the request on the printer" +msgstr "Запрошен доступ к принтеру. Пожалуйста, подтвердите запрос к принтеру." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:154 +msgctxt "@info:status" +msgid "" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:155 +msgctxt "@action:button" +msgid "Retry" +msgstr "Повторить" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:155 +msgctxt "@info:tooltip" +msgid "Re-send the access request" +msgstr "Послать запрос доступа ещё раз" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:157 +msgctxt "@info:status" +msgid "Access to the printer accepted" +msgstr "Доступ к принтеру получен" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:158 +msgctxt "@info:status" +msgid "No access to print with this printer. Unable to send print job." +msgstr "" +"Нет доступа к использованию этого принтера. Невозможно отправить задачу на " +"печать." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:28 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:72 +msgctxt "@action:button" +msgid "Request Access" +msgstr "Запросить доступ" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:159 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:27 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:71 +msgctxt "@info:tooltip" +msgid "Send access request to the printer" +msgstr "Отправить запрос на доступ к принтеру" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:274 +#, python-brace-format +msgctxt "@info:status" +msgid "" +"Connected over the network to {0}. Please approve the access request on the " +"printer." +msgstr "" +"Подключен через сеть к {0}. Пожалуйста, подтвердите запрос доступа к " +"принтеру." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:281 +#, python-brace-format +msgctxt "@info:status" +msgid "Connected over the network to {0}." +msgstr "Подключен через сеть к {0}." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:294 +#, python-brace-format +msgctxt "@info:status" +msgid "Connected over the network to {0}. No access to control the printer." +msgstr "Подключен через сеть к {0}. Нет доступа к управлению принтером." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:299 +msgctxt "@info:status" +msgid "Access request was denied on the printer." +msgstr "Запрос доступа к принтеру был отклонён." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:302 +msgctxt "@info:status" +msgid "Access request failed due to a timeout." +msgstr "Запрос доступа был неудачен из-за таймаута." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:367 +msgctxt "@info:status" +msgid "The connection with the network was lost." +msgstr "Соединение с сетью было потеряно." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:398 +msgctxt "@info:status" +msgid "" +"The connection with the printer was lost. Check your printer to see if it is " +"connected." +msgstr "" +"Соединение с принтером было потеряно. Проверьте свой принтер, подключен ли " +"он." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:520 +msgctxt "@info:status" +msgid "" +"Unable to start a new print job because the printer is busy. Please check " +"the printer." +msgstr "" +"Невозможно запустить новую задачу на печать так как принтер занят. " +"Пожалуйста, проверьте принтер." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:525 +#, python-format +msgctxt "@info:status" +msgid "" +"Unable to start a new print job, printer is busy. Current printer status is " +"%s." +msgstr "" +"Невозможно запустить новую задачу на печать, принтер занят. Текущий статус " +"принтера %s." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:546 +#, python-brace-format +msgctxt "@info:status" +msgid "Unable to start a new print job. No PrinterCore loaded in slot {0}" +msgstr "" +"Невозможно запустить новую задачу на печать. PrinterCore не был загружен в " +"слот {0}" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:553 +#, python-brace-format +msgctxt "@info:status" +msgid "Unable to start a new print job. No material loaded in slot {0}" +msgstr "" +"Невозможно запустить новую задачу на печать. Материал не загружен в слот {0}" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:564 +#, python-brace-format +msgctxt "@label" +msgid "Not enough material for spool {0}." +msgstr "Недостаточно материала в катушке {0}." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:574 +#, python-brace-format +msgctxt "@label" +msgid "" +"Different print core (Cura: {0}, Printer: {1}) selected for extruder {2}" +msgstr "" +"Разные ядра печати (Cura: {0}, Принтер: {1}) выбраны для экструдера {2}" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:588 +#, python-brace-format +msgctxt "@label" +msgid "Different material (Cura: {0}, Printer: {1}) selected for extruder {2}" +msgstr "Разный материал (Cura: {0}, Принтер: {1}) выбран для экструдера {2}" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:596 +#, python-brace-format +msgctxt "@label" +msgid "" +"Print core {0} is not properly calibrated. XY calibration needs to be " +"performed on the printer." +msgstr "" +"Ядро печати {0} не откалибровано. Необходимо выполнить XY калибровку для " +"принтера." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:599 +msgctxt "@label" +msgid "Are you sure you wish to print with the selected configuration?" +msgstr "" +"Вы уверены, что желаете печатать с использованием выбранной конфигурации?" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:600 +msgctxt "@label" +msgid "" +"There is a mismatch between the configuration or calibration of the printer " +"and Cura. For the best result, always slice for the PrintCores and materials " +"that are inserted in your printer." +msgstr "" +"Есть несовпадение между конфигурацией или калибровкой принтера и Cura. Для " +"лучшего результата, всегда производите слайсинг для ядер и материала, " +"которые установлены в вашем принтере." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:606 +msgctxt "@window:title" +msgid "Mismatched configuration" +msgstr "Несовпадение конфигурации" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:702 +msgctxt "@info:status" +msgid "Sending data to printer" +msgstr "Отправка данных на принтер" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:703 +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/SettingsWindow.qml:46 +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/ControlWindow.qml:73 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:350 +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:191 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:377 +#: /home/ruben/Projects/Cura/resources/qml/MultiplyObjectOptions.qml:61 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:259 +msgctxt "@action:button" +msgid "Cancel" +msgstr "Отмена" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:749 +msgctxt "@info:status" +msgid "Unable to send data to printer. Is another job still active?" +msgstr "Невозможно отправить данные на принтер. Другая задача всё ещё активна?" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:873 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:191 +msgctxt "@label:MonitorStatus" +msgid "Aborting print..." +msgstr "Прерывание печати…" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:879 +msgctxt "@label:MonitorStatus" +msgid "Print aborted. Please check the printer" +msgstr "Печать прервана. Пожалуйста, проверьте принтер" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:885 +msgctxt "@label:MonitorStatus" +msgid "Pausing print..." +msgstr "Печать приостановлена..." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:887 +msgctxt "@label:MonitorStatus" +msgid "Resuming print..." +msgstr "Печать возобновлена..." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1019 +msgctxt "@window:title" +msgid "Sync with your printer" +msgstr "Синхронизация с вашим принтером" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1021 +msgctxt "@label" +msgid "Would you like to use your current printer configuration in Cura?" +msgstr "Желаете использовать текущую конфигурацию принтера в Cura?" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py:1023 +msgctxt "@label" +msgid "" +"The print cores and/or materials on your printer differ from those within " +"your current project. For the best result, always slice for the print cores " +"and materials that are inserted in your printer." +msgstr "" +"Модуль PrintCore и/или материал в вашем принтере отличается от тех, что вы " +"используете в текущем проекте. Для наилучшего результата всегда указывайте " +"правильный модуль PrintCore и материалы, которые вставлены в ваш принтер." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.py:19 +msgctxt "@action" +msgid "Connect via Network" +msgstr "Подключиться через сеть" + +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.py:24 +msgid "Modify G-Code" +msgstr "Изменить G-код" + +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/__init__.py:12 +msgctxt "@label" +msgid "Post Processing" +msgstr "Пост обработка" + +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/__init__.py:16 +msgctxt "Description of plugin" +msgid "Extension that allows for user created scripts for post processing" +msgstr "" +"Расширения, которые позволяют пользователю создавать скрипты для пост " +"обработки" + +#: /home/ruben/Projects/Cura/plugins/AutoSave/__init__.py:12 +msgctxt "@label" +msgid "Auto Save" +msgstr "Автосохранение" + +#: /home/ruben/Projects/Cura/plugins/AutoSave/__init__.py:15 +msgctxt "@info:whatsthis" +msgid "Automatically saves Preferences, Machines and Profiles after changes." +msgstr "" +"Автоматически сохраняет настройки, принтеры и профили после внесения " +"изменений." + +#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/__init__.py:10 +msgctxt "@label" +msgid "Slice info" +msgstr "Информация о нарезке модели" + +#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/__init__.py:13 +msgctxt "@info:whatsthis" +msgid "Submits anonymous slice info. Can be disabled through preferences." +msgstr "" +"Отправляет анонимную информацию о нарезке моделей. Может быть отключено " +"через настройки." + +#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:74 +msgctxt "@info" +msgid "" +"Cura collects anonymised slicing statistics. You can disable this in " +"preferences" +msgstr "" +"Cura собирает анонимную статистику о нарезке модели. Вы можете отключить это " +"в настройках." + +#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:75 +msgctxt "@action:button" +msgid "Dismiss" +msgstr "Отменить" + +#: /home/ruben/Projects/Cura/plugins/XmlMaterialProfile/__init__.py:13 +msgctxt "@label" +msgid "Material Profiles" +msgstr "Профили материалов" + +#: /home/ruben/Projects/Cura/plugins/XmlMaterialProfile/__init__.py:16 +msgctxt "@info:whatsthis" +msgid "Provides capabilities to read and write XML-based material profiles." +msgstr "" +"Предоставляет возможности по чтению и записи профилей материалов в виде XML." + +#: /home/ruben/Projects/Cura/plugins/LegacyProfileReader/__init__.py:12 +msgctxt "@label" +msgid "Legacy Cura Profile Reader" +msgstr "Чтение устаревших профилей Cura" + +#: /home/ruben/Projects/Cura/plugins/LegacyProfileReader/__init__.py:15 +msgctxt "@info:whatsthis" +msgid "Provides support for importing profiles from legacy Cura versions." +msgstr "" +"Предоставляет поддержку для импортирования профилей из устаревших версий " +"Cura." + +#: /home/ruben/Projects/Cura/plugins/LegacyProfileReader/__init__.py:21 +msgctxt "@item:inlistbox" +msgid "Cura 15.04 profiles" +msgstr "Профили Cura 15.04" + +#: /home/ruben/Projects/Cura/plugins/GCodeProfileReader/__init__.py:12 +msgctxt "@label" +msgid "GCode Profile Reader" +msgstr "Чтение профиля из GCode" + +#: /home/ruben/Projects/Cura/plugins/GCodeProfileReader/__init__.py:15 +msgctxt "@info:whatsthis" +msgid "Provides support for importing profiles from g-code files." +msgstr "Предоставляет поддержку для импортирования профилей из GCode файлов." + +#: /home/ruben/Projects/Cura/plugins/GCodeProfileReader/__init__.py:21 +msgctxt "@item:inlistbox" +msgid "G-code File" +msgstr "Файл G-code" + +#: /home/ruben/Projects/Cura/plugins/LayerView/__init__.py:13 +msgctxt "@label" +msgid "Layer View" +msgstr "Просмотр слоёв" + +#: /home/ruben/Projects/Cura/plugins/LayerView/__init__.py:16 +msgctxt "@info:whatsthis" +msgid "Provides the Layer view." +msgstr "Предоставляет послойный просмотр." + +#: /home/ruben/Projects/Cura/plugins/LayerView/__init__.py:20 +msgctxt "@item:inlistbox" +msgid "Layers" +msgstr "Слои" + +#: /home/ruben/Projects/Cura/plugins/LayerView/LayerView.py:70 +msgctxt "@info:status" +msgid "Cura does not accurately display layers when Wire Printing is enabled" +msgstr "" +"Cura не аккуратно отображает слоя при использовании печати через провод" + +#: /home/ruben/Projects/Cura/plugins/VersionUpgrade/VersionUpgrade21to22/__init__.py:14 +msgctxt "@label" +msgid "Version Upgrade 2.1 to 2.2" +msgstr "Обновление версии 2.1 до 2.2" + +#: /home/ruben/Projects/Cura/plugins/VersionUpgrade/VersionUpgrade21to22/__init__.py:17 +msgctxt "@info:whatsthis" +msgid "Upgrades configurations from Cura 2.1 to Cura 2.2." +msgstr "Обновляет настройки с Cura 2.1 до Cura 2.2." + +#: /home/ruben/Projects/Cura/plugins/VersionUpgrade/VersionUpgrade22to24/__init__.py:14 +msgctxt "@label" +msgid "Version Upgrade 2.2 to 2.4" +msgstr "Обновление версии с 2.2 на 2.4" + +#: /home/ruben/Projects/Cura/plugins/VersionUpgrade/VersionUpgrade22to24/__init__.py:17 +msgctxt "@info:whatsthis" +msgid "Upgrades configurations from Cura 2.2 to Cura 2.4." +msgstr "Обновляет конфигурацию с версии Cura 2.2 до Cura 2.4" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:12 +msgctxt "@label" +msgid "Image Reader" +msgstr "Чтение изображений" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:15 +msgctxt "@info:whatsthis" +msgid "Enables ability to generate printable geometry from 2D image files." +msgstr "" +"Обеспечивает возможность генерировать печатаемую геометрию из файлов " +"двухмерных изображений." + +#: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:21 +msgctxt "@item:inlistbox" +msgid "JPG Image" +msgstr "JPG изображение" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:25 +msgctxt "@item:inlistbox" +msgid "JPEG Image" +msgstr "JPEG изображение" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:29 +msgctxt "@item:inlistbox" +msgid "PNG Image" +msgstr "PNG изображение" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:33 +msgctxt "@item:inlistbox" +msgid "BMP Image" +msgstr "BMP изображение" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:37 +msgctxt "@item:inlistbox" +msgid "GIF Image" +msgstr "GIF изображение" + +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:237 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:76 +msgctxt "@info:status" +msgid "" +"The selected material is incompatible with the selected machine or " +"configuration." +msgstr "" +"Выбранный материал несовместим с выбранным принтером или конфигурацией." + +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:258 +#, python-brace-format +msgctxt "@info:status" +msgid "" +"Unable to slice with the current settings. The following settings have " +"errors: {0}" +msgstr "" +"Не могу выполнить слайсинг на текущих настройках. Проверьте следующие " +"настройки: {0}" + +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:267 +msgctxt "@info:status" +msgid "" +"Unable to slice because the prime tower or prime position(s) are invalid." +msgstr "Слайсинг невозможен так как черновая башня или её позиция неверные." + +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:275 +msgctxt "@info:status" +msgid "" +"Nothing to slice because none of the models fit the build volume. Please " +"scale or rotate models to fit." +msgstr "" +"Нечего нарезать, так как ни одна модель не попадает в объём принтера. " +"Пожалуйста, отмасштабируйте или поверните модель." + +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/__init__.py:13 +msgctxt "@label" +msgid "CuraEngine Backend" +msgstr "Движок CuraEngine" + +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/__init__.py:15 +msgctxt "@info:whatsthis" +msgid "Provides the link to the CuraEngine slicing backend." +msgstr "Предоставляет интерфейс к движку CuraEngine." + +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:47 +#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:188 +msgctxt "@info:status" +msgid "Processing Layers" +msgstr "Обработка слоёв" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/__init__.py:14 +msgctxt "@label" +msgid "Per Model Settings Tool" +msgstr "Инструмент для настройки каждой модели" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/__init__.py:17 +msgctxt "@info:whatsthis" +msgid "Provides the Per Model Settings." +msgstr "Предоставляет параметры для каждой модели." + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/__init__.py:21 +msgctxt "@label" +msgid "Per Model Settings" +msgstr "Параметры модели" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/__init__.py:22 +msgctxt "@info:tooltip" +msgid "Configure Per Model Settings" +msgstr "Правка параметров модели" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:153 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:519 +msgctxt "@title:tab" +msgid "Recommended" +msgstr "Рекомендованная" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:155 +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:525 +msgctxt "@title:tab" +msgid "Custom" +msgstr "Своя" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/__init__.py:19 +msgctxt "@label" +msgid "3MF Reader" +msgstr "Чтение 3MF" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/__init__.py:22 +msgctxt "@info:whatsthis" +msgid "Provides support for reading 3MF files." +msgstr "Предоставляет поддержку для чтения 3MF файлов." + +#: /home/ruben/Projects/Cura/plugins/3MFReader/__init__.py:28 +#: /home/ruben/Projects/Cura/plugins/3MFReader/__init__.py:35 +msgctxt "@item:inlistbox" +msgid "3MF File" +msgstr "Файл 3MF" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:60 +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1051 +msgctxt "@label" +msgid "Nozzle" +msgstr "Сопло" + +#: /home/ruben/Projects/Cura/plugins/SolidView/__init__.py:12 +msgctxt "@label" +msgid "Solid View" +msgstr "Обзор" + +#: /home/ruben/Projects/Cura/plugins/SolidView/__init__.py:15 +msgctxt "@info:whatsthis" +msgid "Provides a normal solid mesh view." +msgstr "Предоставляет просмотр твёрдого тела." + +#: /home/ruben/Projects/Cura/plugins/SolidView/__init__.py:19 +msgctxt "@item:inmenu" +msgid "Solid" +msgstr "Твёрдое тело" + +#: /home/ruben/Projects/Cura/plugins/CuraProfileWriter/__init__.py:12 +msgctxt "@label" +msgid "Cura Profile Writer" +msgstr "Запись профиля Cura" + +#: /home/ruben/Projects/Cura/plugins/CuraProfileWriter/__init__.py:15 +msgctxt "@info:whatsthis" +msgid "Provides support for exporting Cura profiles." +msgstr "Предоставляет поддержку для экспорта профилей Cura." + +#: /home/ruben/Projects/Cura/plugins/CuraProfileWriter/__init__.py:21 +#: /home/ruben/Projects/Cura/plugins/CuraProfileReader/__init__.py:21 +msgctxt "@item:inlistbox" +msgid "Cura Profile" +msgstr "Профиль Cura" + +#: /home/ruben/Projects/Cura/plugins/3MFWriter/__init__.py:13 +msgctxt "@label" +msgid "3MF Writer" +msgstr "Запись 3MF" + +#: /home/ruben/Projects/Cura/plugins/3MFWriter/__init__.py:16 +msgctxt "@info:whatsthis" +msgid "Provides support for writing 3MF files." +msgstr "Предоставляет возможность записи 3MF файлов." + +#: /home/ruben/Projects/Cura/plugins/3MFWriter/__init__.py:22 +msgctxt "@item:inlistbox" +msgid "3MF file" +msgstr "3MF файл" + +#: /home/ruben/Projects/Cura/plugins/3MFWriter/__init__.py:30 +msgctxt "@item:inlistbox" +msgid "Cura Project 3MF file" +msgstr "3MF файл проекта Cura" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/__init__.py:15 +msgctxt "@label" +msgid "Ultimaker machine actions" +msgstr "Дополнительные возможности Ultimaker" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/__init__.py:18 +msgctxt "@info:whatsthis" +msgid "" +"Provides machine actions for Ultimaker machines (such as bed leveling " +"wizard, selecting upgrades, etc)" +msgstr "" +"Предоставляет дополнительные возможности для принтеров Ultimaker (такие как " +"мастер выравнивания стола, выбора обновления и так далее)" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelection.py:15 +msgctxt "@action" +msgid "Select upgrades" +msgstr "Выбор обновлений" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.py:11 +msgctxt "@action" +msgid "Upgrade Firmware" +msgstr "Обновление прошивки" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.py:14 +msgctxt "@action" +msgid "Checkup" +msgstr "Проверка" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.py:15 +msgctxt "@action" +msgid "Level build plate" +msgstr "Выравнивание стола" + +#: /home/ruben/Projects/Cura/plugins/CuraProfileReader/__init__.py:12 +msgctxt "@label" +msgid "Cura Profile Reader" +msgstr "Чтение профиля Cura" + +#: /home/ruben/Projects/Cura/plugins/CuraProfileReader/__init__.py:15 +msgctxt "@info:whatsthis" +msgid "Provides support for importing Cura profiles." +msgstr "Предоставляет поддержку для импорта профилей Cura." + +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:316 +msgctxt "@item:material" +msgid "No material loaded" +msgstr "Материал не загружен" + +#: /home/ruben/Projects/Cura/cura/PrinterOutputDevice.py:323 +msgctxt "@item:material" +msgid "Unknown material" +msgstr "Неизвестный материал" + +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:344 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:82 +msgctxt "@title:window" +msgid "File Already Exists" +msgstr "Файл уже существует" + +#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:345 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:83 +#, python-brace-format +msgctxt "@label" +msgid "" +"The file {0} already exists. Are you sure you want to " +"overwrite it?" +msgstr "" +"Файл {0} уже существует. Вы желаете его перезаписать?" + +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:928 +msgctxt "@label" +msgid "You made changes to the following setting(s)/override(s):" +msgstr "Вы изменили следующие настройки:" + +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:945 +msgctxt "@window:title" +msgid "Switched profiles" +msgstr "Переключены профили" + +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:948 +#, python-format +msgctxt "@label" +msgid "" +"Do you want to transfer your %d changed setting(s)/override(s) to this " +"profile?" +msgstr "Желаете перенести ваши %d изменений настроек в этот профиль?" + +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:951 +msgctxt "@label" +msgid "" +"If you transfer your settings they will override settings in the profile. If " +"you don't transfer these settings, they will be lost." +msgstr "" +"При переносе ваших настроек они переопределять настройки в данном профиле. " +"При отказе от переноса, ваши изменения будут потеряны." + +#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1252 +msgctxt "@info:status" +msgid "" +"Unable to find a quality profile for this combination. Default settings will " +"be used instead." +msgstr "" +"Невозможно найти профиль качества для этой комбинации. Будут использованы " +"параметры по умолчанию." + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:113 +#, python-brace-format +msgctxt "@info:status" +msgid "" +"Failed to export profile to {0}: {1}" +msgstr "" +"Невозможно экспортировать профиль в {0}: {1}" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:118 +#, python-brace-format +msgctxt "@info:status" +msgid "" +"Failed to export profile to {0}: Writer plugin reported " +"failure." +msgstr "" +"Невозможно экспортировать профиль в {0}: Плагин записи " +"уведомил об ошибке." + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:121 +#, python-brace-format +msgctxt "@info:status" +msgid "Exported profile to {0}" +msgstr "Экспортирование профиля в {0}" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:147 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:169 +#, python-brace-format +msgctxt "@info:status" +msgid "" +"Failed to import profile from {0}: {1}" +msgstr "" +"Невозможно импортировать профиль из {0}: {1}" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:176 +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:210 +#, python-brace-format +msgctxt "@info:status" +msgid "Successfully imported profile {0}" +msgstr "Успешно импортирован профиль {0}" + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:213 +#, python-brace-format +msgctxt "@info:status" +msgid "Profile {0} has an unknown file type or is corrupted." +msgstr "Профиль {0} имеет неизвестный тип файла или повреждён." + +#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:219 +msgctxt "@label" +msgid "Custom profile" +msgstr "Собственный профиль" + +#: /home/ruben/Projects/Cura/cura/BuildVolume.py:90 +msgctxt "@info:status" +msgid "" +"The build volume height has been reduced due to the value of the \"Print " +"Sequence\" setting to prevent the gantry from colliding with printed models." +msgstr "" +"Высота печатаемого объёма была уменьшена до значения параметра " +"\"Последовательность печати\", чтобы предотвратить касание портала за " +"напечатанные детали." + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:47 +msgctxt "@title:window" +msgid "Oops!" +msgstr "Ой!" + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:74 +msgctxt "@label" +msgid "" +"

A fatal exception has occurred that we could not recover from!

\n" +"

We hope this picture of a kitten helps you recover from the shock." +"

\n" +"

Please use the information below to post a bug report at http://github.com/Ultimaker/Cura/" +"issues

\n" +" " +msgstr "" +"

Произошла неожиданная ошибка и мы не смогли её обработать!

\n" +"

Мы надеемся, что картинка с котёнком поможет вам оправиться от " +"шока.

\n" +"

Пожалуйста, используйте информацию ниже для создания отчёта об " +"ошибке на http://github." +"com/Ultimaker/Cura/issues

\n" +" " + +#: /home/ruben/Projects/Cura/cura/CrashHandler.py:97 +msgctxt "@action:button" +msgid "Open Web Page" +msgstr "Открыть веб страницу" + +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:183 +msgctxt "@info:progress" +msgid "Loading machines..." +msgstr "Загрузка принтеров..." + +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:413 +msgctxt "@info:progress" +msgid "Setting up scene..." +msgstr "Настройка сцены..." + +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:447 +msgctxt "@info:progress" +msgid "Loading interface..." +msgstr "Загрузка интерфейса..." + +#: /home/ruben/Projects/Cura/cura/CuraApplication.py:578 +#, python-format +msgctxt "@info" +msgid "%(width).1f x %(depth).1f x %(height).1f mm" +msgstr "%(width).1f x %(depth).1f x %(height).1f мм" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:27 +msgctxt "@title" +msgid "Machine Settings" +msgstr "Параметры принтера" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:38 +msgctxt "@label" +msgid "Please enter the correct settings for your printer below:" +msgstr "Пожалуйста, введите правильные параметры для вашего принтера:" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:63 +msgctxt "@label" +msgid "Printer Settings" +msgstr "Параметры принтера" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:74 +msgctxt "@label" +msgid "X (Width)" +msgstr "X (Ширина)" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:85 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:101 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:117 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:273 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:289 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:305 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:321 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:341 +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:363 +msgctxt "@label" +msgid "mm" +msgstr "мм" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:90 +msgctxt "@label" +msgid "Y (Depth)" +msgstr "Y (Глубина)" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:106 +msgctxt "@label" +msgid "Z (Height)" +msgstr "Z (Высота)" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:129 +msgctxt "@label" +msgid "Build Plate Shape" +msgstr "Форма стола" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:176 +msgctxt "@option:check" +msgid "Machine Center is Zero" +msgstr "Ноль в центре стола" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:187 +msgctxt "@option:check" +msgid "Heated Bed" +msgstr "Нагреваемый стол" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:199 +msgctxt "@label" +msgid "GCode Flavor" +msgstr "Вариант G-кода" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:251 +msgctxt "@label" +msgid "Printhead Settings" +msgstr "Параметры головы" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:262 +msgctxt "@label" +msgid "X min" +msgstr "X минимум" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:278 +msgctxt "@label" +msgid "Y min" +msgstr "Y минимум" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:294 +msgctxt "@label" +msgid "X max" +msgstr "X максимум" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:310 +msgctxt "@label" +msgid "Y max" +msgstr "Y максимум" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:330 +msgctxt "@label" +msgid "Gantry height" +msgstr "Высота портала" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:350 +msgctxt "@label" +msgid "Nozzle size" +msgstr "Диаметр сопла" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:382 +msgctxt "@label" +msgid "Start Gcode" +msgstr "Начало G-кода" + +#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:406 +msgctxt "@label" +msgid "End Gcode" +msgstr "Конец G-кода" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/SettingsWindow.qml:20 +msgctxt "@title:window" +msgid "Doodle3D Settings" +msgstr "Настройки Doodle3D" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/SettingsWindow.qml:53 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:245 +msgctxt "@action:button" +msgid "Save" +msgstr "Сохранить" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/ControlWindow.qml:23 +msgctxt "@title:window" +msgid "Print to: %1" +msgstr "Печатать на: %1" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/ControlWindow.qml:40 +msgctxt "@label" +msgid "Extruder Temperature: %1/%2°C" +msgstr "Температура экструдера: %1/%2°C" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/ControlWindow.qml:45 +msgctxt "@label" +msgid "" +msgstr "" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/ControlWindow.qml:46 +msgctxt "@label" +msgid "Bed Temperature: %1/%2°C" +msgstr "Температура стола: %1/%2°C" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/ControlWindow.qml:64 +msgctxt "@label" +msgid "%1" +msgstr "%1" + +#: /home/ruben/Projects/Cura/plugins/Doodle3D-cura-plugin/ControlWindow.qml:82 +msgctxt "@action:button" +msgid "Print" +msgstr "Печать" + +#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.qml:37 +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:105 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:55 +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:446 +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:433 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:120 +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:138 +#: /home/ruben/Projects/Cura/resources/qml/EngineLog.qml:38 +msgctxt "@action:button" +msgid "Close" +msgstr "Закрыть" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:20 +msgctxt "@title:window" +msgid "Firmware Update" +msgstr "Обновление прошивки" + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:40 +msgctxt "@label" +msgid "Firmware update completed." +msgstr "Обновление прошивки завершено." + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:45 +msgctxt "@label" +msgid "Starting firmware update, this may take a while." +msgstr "Запуск обновления прошивки, это может занять некоторое время." + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:50 +msgctxt "@label" +msgid "Updating firmware." +msgstr "Обновление прошивки." + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:59 +msgctxt "@label" +msgid "Firmware update failed due to an unknown error." +msgstr "Обновление прошивки не удалось из-за неизвестной ошибки." + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:62 +msgctxt "@label" +msgid "Firmware update failed due to an communication error." +msgstr "Обновление прошивки не удалось из-за ошибки связи." + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:65 +msgctxt "@label" +msgid "Firmware update failed due to an input/output error." +msgstr "Обновление прошивки не удалось из-за ошибки ввода-вывода." + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:68 +msgctxt "@label" +msgid "Firmware update failed due to missing firmware." +msgstr "Обновление прошивки не удалось из-за её отстутствия." + +#: /home/ruben/Projects/Cura/plugins/USBPrinting/FirmwareUpdateWindow.qml:71 +msgctxt "@label" +msgid "Unknown error code: %1" +msgstr "Неизвестный код ошибки: %1" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:57 +msgctxt "@title:window" +msgid "Connect to Networked Printer" +msgstr "Подключение к сетевому принтеру" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:67 +msgctxt "@label" +msgid "" +"To print directly to your printer over the network, please make sure your " +"printer is connected to the network using a network cable or by connecting " +"your printer to your WIFI network. If you don't connect Cura with your " +"printer, you can still use a USB drive to transfer g-code files to your " +"printer.\n" +"\n" +"Select your printer from the list below:" +msgstr "" +"Для печати на вашем принтере через сеть, пожалуйста, удостоверьтесь, что ваш " +"принтер подключен к сети с помощью кабеля или через WiFi. Если вы не " +"подключили Cura к вашему принтеру, вы по прежнему можете использовать USB " +"флешку для переноса G-Code файлов на ваш принтер.\n" +"\n" +"Укажите ваш принтер в списке ниже:" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:77 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:44 +msgctxt "@action:button" +msgid "Add" +msgstr "Добавить" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:87 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:192 +msgctxt "@action:button" +msgid "Edit" +msgstr "Правка" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:98 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:50 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:95 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:155 +msgctxt "@action:button" +msgid "Remove" +msgstr "Удалить" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:106 +msgctxt "@action:button" +msgid "Refresh" +msgstr "Обновить" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:198 +msgctxt "@label" +msgid "" +"If your printer is not listed, read the network-printing " +"troubleshooting guide" +msgstr "" +"Если ваш принтер отсутствует в списке, обратитесь к руководству " +"по решению проблем с сетевой печатью" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:225 +msgctxt "@label" +msgid "Type" +msgstr "Тип" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:237 +msgctxt "@label" +msgid "Ultimaker 3" +msgstr "Ultimaker 3" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:240 +msgctxt "@label" +msgid "Ultimaker 3 Extended" +msgstr "Ultimaker 3 Расширенный" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:243 +msgctxt "@label" +msgid "Unknown" +msgstr "Неизвестный" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:256 +msgctxt "@label" +msgid "Firmware version" +msgstr "Версия прошивки" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:268 +msgctxt "@label" +msgid "Address" +msgstr "Адрес" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:282 +msgctxt "@label" +msgid "The printer at this address has not yet responded." +msgstr "Принтер по этому адресу ещё не отвечал." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:287 +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:38 +msgctxt "@action:button" +msgid "Connect" +msgstr "Подключить" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:301 +msgctxt "@title:window" +msgid "Printer Address" +msgstr "Адрес принтера" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:331 +msgctxt "@alabel" +msgid "Enter the IP address or hostname of your printer on the network." +msgstr "Введите IP адрес принтера или его имя в сети." + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml:358 +msgctxt "@action:button" +msgid "Ok" +msgstr "Ok" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:37 +msgctxt "@info:tooltip" +msgid "Connect to a printer" +msgstr "Подключение к принтеру" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:116 +msgctxt "@info:tooltip" +msgid "Load the configuration of the printer into Cura" +msgstr "Загрузка конфигурации принтера в Cura" + +#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/UM3InfoComponents.qml:117 +msgctxt "@action:button" +msgid "Activate Configuration" +msgstr "Активировать конфигурацию" + +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:18 +msgctxt "@title:window" +msgid "Post Processing Plugin" +msgstr "Плагин пост обработки" + +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:49 +msgctxt "@label" +msgid "Post Processing Scripts" +msgstr "Скрипты пост-обработки" + +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:218 +msgctxt "@action" +msgid "Add a script" +msgstr "Добавить скрипт" + +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:264 +msgctxt "@label" +msgid "Settings" +msgstr "Параметры" + +#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:456 +msgctxt "@info:tooltip" +msgid "Change active post-processing scripts" +msgstr "Изменить активные скрипты пост-обработки" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:21 +msgctxt "@title:window" +msgid "Convert Image..." +msgstr "Преобразование изображения..." + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:35 +msgctxt "@info:tooltip" +msgid "The maximum distance of each pixel from \"Base.\"" +msgstr "Максимальная дистанция каждого пикселя от \"Основания\"." + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:40 +msgctxt "@action:label" +msgid "Height (mm)" +msgstr "Высота (мм)" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:58 +msgctxt "@info:tooltip" +msgid "The base height from the build plate in millimeters." +msgstr "Высота основания от стола в миллиметрах." + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:63 +msgctxt "@action:label" +msgid "Base (mm)" +msgstr "Основание (мм)" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:81 +msgctxt "@info:tooltip" +msgid "The width in millimeters on the build plate." +msgstr "Ширина в миллиметрах на столе." + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:86 +msgctxt "@action:label" +msgid "Width (mm)" +msgstr "Ширина (мм)" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:105 +msgctxt "@info:tooltip" +msgid "The depth in millimeters on the build plate" +msgstr "Глубина в миллиметрах на столе" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:110 +msgctxt "@action:label" +msgid "Depth (mm)" +msgstr "Глубина (мм)" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:128 +msgctxt "@info:tooltip" +msgid "" +"By default, white pixels represent high points on the mesh and black pixels " +"represent low points on the mesh. Change this option to reverse the behavior " +"such that black pixels represent high points on the mesh and white pixels " +"represent low points on the mesh." +msgstr "" +"По умолчанию, светлые пиксели представлены высокими точками на объекте, а " +"тёмные пиксели представлены низкими точками на объекте. Измените эту опцию " +"для изменения данного поведения, таким образом тёмные пиксели будут " +"представлены высокими точками, а светлые - низкими." + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:141 +msgctxt "@item:inlistbox" +msgid "Lighter is higher" +msgstr "Светлые выше" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:141 +msgctxt "@item:inlistbox" +msgid "Darker is higher" +msgstr "Тёмные выше" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:151 +msgctxt "@info:tooltip" +msgid "The amount of smoothing to apply to the image." +msgstr "Величина сглаживания для применения к изображению." + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:156 +msgctxt "@action:label" +msgid "Smoothing" +msgstr "Сглаживание" + +#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:184 +#: /home/ruben/Projects/Cura/resources/qml/MultiplyObjectOptions.qml:55 +msgctxt "@action:button" +msgid "OK" +msgstr "OK" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:34 +msgctxt "@label Followed by extruder selection drop-down." +msgid "Print model with" +msgstr "Печатать модель экструдером" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:284 +msgctxt "@action:button" +msgid "Select settings" +msgstr "Выберите параметры" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:324 +msgctxt "@title:window" +msgid "Select Settings to Customize for this model" +msgstr "Выберите параметр для изменения этой модели" + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:348 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/SettingVisibilityPage.qml:91 +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:73 +msgctxt "@label:textbox" +msgid "Filter..." +msgstr "Фильтр..." + +#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:372 +msgctxt "@label:checkbox" +msgid "Show all" +msgstr "Показать всё" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:13 +msgctxt "@title:window" +msgid "Open Project" +msgstr "Открытие проекта" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:60 +msgctxt "@action:ComboBox option" +msgid "Update existing" +msgstr "Обновить существующий" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:61 +msgctxt "@action:ComboBox option" +msgid "Create new" +msgstr "Создать новый" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:72 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:78 +msgctxt "@action:title" +msgid "Summary - Cura Project" +msgstr "Сводка - Проект Cura" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:94 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:96 +msgctxt "@action:label" +msgid "Printer settings" +msgstr "Параметры принтера" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:110 +msgctxt "@info:tooltip" +msgid "How should the conflict in the machine be resolved?" +msgstr "Как следует решать конфликт в принтере?" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:130 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:105 +msgctxt "@action:label" +msgid "Type" +msgstr "Тип" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:146 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:203 +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:295 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:120 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:196 +msgctxt "@action:label" +msgid "Name" +msgstr "Название" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:167 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:172 +msgctxt "@action:label" +msgid "Profile settings" +msgstr "Параметры профиля" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:183 +msgctxt "@info:tooltip" +msgid "How should the conflict in the profile be resolved?" +msgstr "Как следует решать конфликт в профиле?" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:218 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:180 +msgctxt "@action:label" +msgid "Not in profile" +msgstr "Вне профиля" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:223 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:185 +msgctxt "@action:label" +msgid "%1 override" +msgid_plural "%1 overrides" +msgstr[0] "%1 перекрыт" +msgstr[1] "%1 перекрыто" +msgstr[2] "%1 перекрыто" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:234 +msgctxt "@action:label" +msgid "Derivative from" +msgstr "Производное от" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:239 +msgctxt "@action:label" +msgid "%1, %2 override" +msgid_plural "%1, %2 overrides" +msgstr[0] "%1, %2 перекрыто" +msgstr[1] "%1, %2 перекрыто" +msgstr[2] "%1, %2 перекрыто" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:255 +msgctxt "@action:label" +msgid "Material settings" +msgstr "Параметры материала" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:271 +msgctxt "@info:tooltip" +msgid "How should the conflict in the material be resolved?" +msgstr "Как следует решать конфликт в материале?" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:314 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:215 +msgctxt "@action:label" +msgid "Setting visibility" +msgstr "Видимость параметров" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:323 +msgctxt "@action:label" +msgid "Mode" +msgstr "Режим" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:338 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:224 +msgctxt "@action:label" +msgid "Visible settings:" +msgstr "Видимые параметры:" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:343 +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:229 +msgctxt "@action:label" +msgid "%1 out of %2" +msgstr "%1 из %2" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:369 +msgctxt "@action:warning" +msgid "Loading a project will clear all models on the buildplate" +msgstr "Загрузка проекта уберёт все модели со стола" + +#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:388 +msgctxt "@action:button" +msgid "Open" +msgstr "Открыть" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:27 +msgctxt "@title" +msgid "Build Plate Leveling" +msgstr "Выравнивание стола" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:38 +msgctxt "@label" +msgid "" +"To make sure your prints will come out great, you can now adjust your " +"buildplate. When you click 'Move to Next Position' the nozzle will move to " +"the different positions that can be adjusted." +msgstr "" +"Сейчас вы можете отрегулировать ваш стол, чтобы быть уверенным в качестве " +"последующей печати. При нажатии на кнопку «Перейти к следующей позиции» " +"сопло перейдёт на другую позиции, которую можно будет отрегулировать." + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:47 +msgctxt "@label" +msgid "" +"For every position; insert a piece of paper under the nozzle and adjust the " +"print build plate height. The print build plate height is right when the " +"paper is slightly gripped by the tip of the nozzle." +msgstr "" +"Для каждой позиции, вставьте кусок бумаги под сопло и отрегулируйте высоту " +"стола. Когда кончик сопла немного прижимает бумагу к столу, значит вы " +"выставили правильную высоту стола." + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:62 +msgctxt "@action:button" +msgid "Start Build Plate Leveling" +msgstr "Начало выравнивания стола" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:74 +msgctxt "@action:button" +msgid "Move to Next Position" +msgstr "Перейти к следующей позиции" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml:27 +msgctxt "@title" +msgid "Upgrade Firmware" +msgstr "Обновление прошивки" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml:38 +msgctxt "@label" +msgid "" +"Firmware is the piece of software running directly on your 3D printer. This " +"firmware controls the step motors, regulates the temperature and ultimately " +"makes your printer work." +msgstr "" +"Прошивка является программным обеспечением, которое работает на плате вашего " +"3D принтера. Прошивка управляет шаговыми моторами, регулирует температуру и, " +"в конечном счёте, обеспечивает работу вашего принтера." + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml:48 +msgctxt "@label" +msgid "" +"The firmware shipping with new printers works, but new versions tend to have " +"more features and improvements." +msgstr "" +"Прошивка, поставляемая с новыми Ultimaker, работает, но обновления " +"предоставляют больше возможностей и усовершенствований." + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml:62 +msgctxt "@action:button" +msgid "Automatically upgrade Firmware" +msgstr "Автоматическое обновление прошивки" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml:72 +msgctxt "@action:button" +msgid "Upload custom Firmware" +msgstr "Залить собственную прошивку" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml:83 +msgctxt "@title:window" +msgid "Select custom firmware" +msgstr "Выбрать собственную прошивку" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:25 +msgctxt "@title" +msgid "Select Printer Upgrades" +msgstr "Выбор обновлённых частей" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:37 +msgctxt "@label" +msgid "Please select any upgrades made to this Ultimaker Original" +msgstr "" +"Пожалуйста, укажите любые изменений, внесённый в оригинальный Ultimaker" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:45 +msgctxt "@label" +msgid "Heated Build Plate (official kit or self-built)" +msgstr "Нагреваемый стол (официальный набор или самодельный)" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:27 +msgctxt "@title" +msgid "Check Printer" +msgstr "Проверка принтера" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:39 +msgctxt "@label" +msgid "" +"It's a good idea to do a few sanity checks on your Ultimaker. You can skip " +"this step if you know your machine is functional" +msgstr "" +"Хорошей идеей будет выполнить несколько проверок вашего Ultimaker. Вы можете " +"пропустить этот шаг, если уверены в функциональности своего принтера" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:53 +msgctxt "@action:button" +msgid "Start Printer Check" +msgstr "Начать проверку принтера" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:80 +msgctxt "@label" +msgid "Connection: " +msgstr "Соединение: " + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:89 +msgctxt "@info:status" +msgid "Connected" +msgstr "Подключен" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:89 +msgctxt "@info:status" +msgid "Not connected" +msgstr "Не подключен" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:99 +msgctxt "@label" +msgid "Min endstop X: " +msgstr "Минимальный концевик на оси X: " + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:109 +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:130 +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:151 +msgctxt "@info:status" +msgid "Works" +msgstr "Работает" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:109 +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:130 +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:151 +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:173 +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:234 +msgctxt "@info:status" +msgid "Not checked" +msgstr "Не проверен" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:120 +msgctxt "@label" +msgid "Min endstop Y: " +msgstr "Минимальный концевик на оси Y: " + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:141 +msgctxt "@label" +msgid "Min endstop Z: " +msgstr "Минимальный концевик на оси Z: " + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:163 +msgctxt "@label" +msgid "Nozzle temperature check: " +msgstr "Проверка температуры сопла: " + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:187 +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:248 +msgctxt "@action:button" +msgid "Stop Heating" +msgstr "Завершение нагрева" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:187 +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:248 +msgctxt "@action:button" +msgid "Start Heating" +msgstr "Начало нагрева" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:223 +msgctxt "@label" +msgid "Build plate temperature check:" +msgstr "Проверка температуры стола:" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:234 +msgctxt "@info:status" +msgid "Checked" +msgstr "Проверена" + +#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml:284 +msgctxt "@label" +msgid "Everything is in order! You're done with your CheckUp." +msgstr "Всё в порядке! Проверка завершена." + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:90 +msgctxt "@label:MonitorStatus" +msgid "Not connected to a printer" +msgstr "Не подключен к принтеру" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:92 +msgctxt "@label:MonitorStatus" +msgid "Printer does not accept commands" +msgstr "Принтер не принимает команды" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:98 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:189 +msgctxt "@label:MonitorStatus" +msgid "In maintenance. Please check the printer" +msgstr "В режиме обслуживания. Пожалуйста, проверьте принтер" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:103 +msgctxt "@label:MonitorStatus" +msgid "Lost connection with the printer" +msgstr "Потеряно соединение с принтером" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:105 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:179 +msgctxt "@label:MonitorStatus" +msgid "Printing..." +msgstr "Печать..." + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:108 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:181 +msgctxt "@label:MonitorStatus" +msgid "Paused" +msgstr "Приостановлен" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:111 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:183 +msgctxt "@label:MonitorStatus" +msgid "Preparing..." +msgstr "Подготовка..." + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:113 +msgctxt "@label:MonitorStatus" +msgid "Please remove the print" +msgstr "Пожалуйста, удалите напечатанное" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:239 +msgctxt "@label:" +msgid "Resume" +msgstr "Продолжить" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:243 +msgctxt "@label:" +msgid "Pause" +msgstr "Пауза" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:272 +msgctxt "@label:" +msgid "Abort Print" +msgstr "О печати" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:282 +msgctxt "@window:title" +msgid "Abort print" +msgstr "О печати" + +#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:284 +msgctxt "@label" +msgid "Are you sure you want to abort the print?" +msgstr "Вы уверены, что желаете прервать печать?" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:25 +msgctxt "@title" +msgid "Information" +msgstr "Информация" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:47 +msgctxt "@label" +msgid "Display Name" +msgstr "Отображаемое имя" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:57 +msgctxt "@label" +msgid "Brand" +msgstr "Брэнд" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:67 +msgctxt "@label" +msgid "Material Type" +msgstr "Тип материала" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:76 +msgctxt "@label" +msgid "Color" +msgstr "Цвет" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:110 +msgctxt "@label" +msgid "Properties" +msgstr "Свойства" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:112 +msgctxt "@label" +msgid "Density" +msgstr "Плотность" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:125 +msgctxt "@label" +msgid "Diameter" +msgstr "Диаметр" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:138 +msgctxt "@label" +msgid "Filament Cost" +msgstr "Стоимость материала" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:147 +msgctxt "@label" +msgid "Filament weight" +msgstr "Вес материала" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:157 +msgctxt "@label" +msgid "Filament length" +msgstr "Длина материала" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:166 +msgctxt "@label" +msgid "Cost per Meter (Approx.)" +msgstr "Стоимость метра (приблизительно)" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:171 +msgctxt "@label" +msgid "%1/m" +msgstr "%1/м" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:177 +msgctxt "@label" +msgid "Description" +msgstr "Описание" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:190 +msgctxt "@label" +msgid "Adhesion Information" +msgstr "Информация об адгезии" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialView.qml:208 +msgctxt "@label" +msgid "Print settings" +msgstr "Параметры печати" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/SettingVisibilityPage.qml:14 +msgctxt "@title:tab" +msgid "Setting Visibility" +msgstr "Видимость настроек" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/SettingVisibilityPage.qml:44 +msgctxt "@label:textbox" +msgid "Check all" +msgstr "Выбрать все" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:53 +msgctxt "@title:column" +msgid "Setting" +msgstr "Параметр" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:60 +msgctxt "@title:column" +msgid "Profile" +msgstr "Профиль" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:67 +msgctxt "@title:column" +msgid "Current" +msgstr "Текущий" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:75 +msgctxt "@title:column" +msgid "Unit" +msgstr "Единица" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:14 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:496 +msgctxt "@title:tab" +msgid "General" +msgstr "Общее" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:72 +msgctxt "@label" +msgid "Interface" +msgstr "Интерфейс" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:81 +msgctxt "@label" +msgid "Language:" +msgstr "Язык:" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:138 +msgctxt "@label" +msgid "" +"You will need to restart the application for language changes to have effect." +msgstr "" +"Вам потребуется перезапустить приложение для переключения интерфейса на " +"выбранный язык." + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:153 +msgctxt "@label" +msgid "Viewport behavior" +msgstr "Поведение окна" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:161 +msgctxt "@info:tooltip" +msgid "" +"Highlight unsupported areas of the model in red. Without support these areas " +"will not print properly." +msgstr "" +"Подсвечивать красным области модели, требующие поддержек. Без поддержек эти " +"области не будут напечатаны правильно." + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:170 +msgctxt "@option:check" +msgid "Display overhang" +msgstr "Отобразить нависания" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:177 +msgctxt "@info:tooltip" +msgid "" +"Moves the camera so the model is in the center of the view when an model is " +"selected" +msgstr "" +"Перемещать камеру так, чтобы модель при выборе помещалась в центр экрана" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:182 +msgctxt "@action:button" +msgid "Center camera when item is selected" +msgstr "Центрировать камеру на выбранном объекте" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:191 +msgctxt "@info:tooltip" +msgid "" +"Should models on the platform be moved so that they no longer intersect?" +msgstr "" +"Следует ли размещать модели на столе так, чтобы они больше не пересекались." + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:196 +msgctxt "@option:check" +msgid "Ensure models are kept apart" +msgstr "Удостовериться, что модели размещены рядом" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:204 +msgctxt "@info:tooltip" +msgid "Should models on the platform be moved down to touch the build plate?" +msgstr "Следует ли опустить модели на стол?" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:209 +msgctxt "@option:check" +msgid "Automatically drop models to the build plate" +msgstr "Автоматически опускать модели на стол" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:218 +msgctxt "@info:tooltip" +msgid "" +"Display 5 top layers in layer view or only the top-most layer. Rendering 5 " +"layers takes longer, but may show more information." +msgstr "" +"Показывать пять верхних слов в режиме послойного просмотра или только самый " +"верхний слой. Отображение 5 слоёв занимает больше времени, но предоставляет " +"больше информации." + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:223 +msgctxt "@action:button" +msgid "Display five top layers in layer view" +msgstr "Показать пять верхних слоёв в режиме послойного просмотра" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:241 +msgctxt "@info:tooltip" +msgid "Should only the top layers be displayed in layerview?" +msgstr "" +"Следует ли отображать только верхние слои в режиме послойного просмотра?" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:246 +msgctxt "@option:check" +msgid "Only display top layer(s) in layer view" +msgstr "Показывать только верхние слои в режиме послойного просмотра" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:262 +msgctxt "@label" +msgid "Opening files" +msgstr "Открытие файлов" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:268 +msgctxt "@info:tooltip" +msgid "Should models be scaled to the build volume if they are too large?" +msgstr "" +"Масштабировать ли модели для размещения внутри печатаемого объёма, если они " +"не влезают в него?" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:273 +msgctxt "@option:check" +msgid "Scale large models" +msgstr "Масштабировать большие модели" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:282 +msgctxt "@info:tooltip" +msgid "" +"An model may appear extremely small if its unit is for example in meters " +"rather than millimeters. Should these models be scaled up?" +msgstr "" +"Модель может показаться очень маленькой, если её размерность задана в " +"метрах, а не миллиметрах. Следует ли мастштабировать такие модели?" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:287 +msgctxt "@option:check" +msgid "Scale extremely small models" +msgstr "Масштабировать очень маленькие модели" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:296 +msgctxt "@info:tooltip" +msgid "" +"Should a prefix based on the printer name be added to the print job name " +"automatically?" +msgstr "" +"Надо ли автоматически добавлять префикс, основанный на имени принтера, к " +"названию задачи на печать?" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:301 +msgctxt "@option:check" +msgid "Add machine prefix to job name" +msgstr "Добавить префикс принтера к имени задачи" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:310 +msgctxt "@info:tooltip" +msgid "Should a summary be shown when saving a project file?" +msgstr "Показывать сводку при сохранении файла проекта?" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:314 +msgctxt "@option:check" +msgid "Show summary dialog when saving project" +msgstr "Показывать сводки при сохранении проекта" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:332 +msgctxt "@label" +msgid "Privacy" +msgstr "Приватность" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:339 +msgctxt "@info:tooltip" +msgid "Should Cura check for updates when the program is started?" +msgstr "Должна ли Cura проверять обновления программы при старте?" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:344 +msgctxt "@option:check" +msgid "Check for updates on start" +msgstr "Проверять обновления при старте" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:354 +msgctxt "@info:tooltip" +msgid "" +"Should anonymous data about your print be sent to Ultimaker? Note, no " +"models, IP addresses or other personally identifiable information is sent or " +"stored." +msgstr "" +"Можно ли отправлять анонимную информацию о вашей печати в Ultimaker? Следует " +"отметить, что ни модели, ни IP адреса и никакая другая персональная " +"информация не будет отправлена или сохранена." + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:359 +msgctxt "@option:check" +msgid "Send (anonymous) print information" +msgstr "Отправлять (анонимно) информацию о печати" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:15 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:501 +msgctxt "@title:tab" +msgid "Printers" +msgstr "Принтеры" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:37 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:51 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:128 +msgctxt "@action:button" +msgid "Activate" +msgstr "Активировать" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:57 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:102 +msgctxt "@action:button" +msgid "Rename" +msgstr "Переименовать" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:146 +msgctxt "@label" +msgid "Printer type:" +msgstr "Имя принтера:" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:154 +msgctxt "@label" +msgid "Connection:" +msgstr "Соединение:" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:159 +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:32 +msgctxt "@info:status" +msgid "The printer is not connected." +msgstr "Принтер не подключен." + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:165 +msgctxt "@label" +msgid "State:" +msgstr "Состояние:" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:185 +msgctxt "@label:MonitorStatus" +msgid "Waiting for someone to clear the build plate" +msgstr "Ожидаем, чтобы кто-нибудь освободил стол" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:194 +msgctxt "@label:MonitorStatus" +msgid "Waiting for a printjob" +msgstr "Ожидаем задание на печать" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:15 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:505 +msgctxt "@title:tab" +msgid "Profiles" +msgstr "Профили" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:29 +msgctxt "@label" +msgid "Protected profiles" +msgstr "Защищённые профили" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:29 +msgctxt "@label" +msgid "Custom profiles" +msgstr "Собственные профили" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:64 +msgctxt "@label" +msgid "Create" +msgstr "Создать" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:80 +msgctxt "@label" +msgid "Duplicate" +msgstr "Дублировать" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:113 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:162 +msgctxt "@action:button" +msgid "Import" +msgstr "Импорт" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:119 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:169 +msgctxt "@action:button" +msgid "Export" +msgstr "Экспорт" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:126 +msgctxt "@label %1 is printer name" +msgid "Printer: %1" +msgstr "Принтер: %1" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:165 +msgctxt "@action:button" +msgid "Update profile with current settings/overrides" +msgstr "Обновить профиль текущими параметрами" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:173 +msgctxt "@action:button" +msgid "Discard current changes" +msgstr "Сбросить текущие параметры" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:190 +msgctxt "@action:label" +msgid "" +"This profile uses the defaults specified by the printer, so it has no " +"settings/overrides in the list below." +msgstr "" +"Данный профиль использует настройки принтера по умолчанию, поэтому список " +"ниже пуст." + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:197 +msgctxt "@action:label" +msgid "Your current settings match the selected profile." +msgstr "Ваши текущие параметры совпадают с выбранным профилем." + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:215 +msgctxt "@title:tab" +msgid "Global Settings" +msgstr "Общие параметры" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:258 +msgctxt "@title:window" +msgid "Rename Profile" +msgstr "Переименовать профиль" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:271 +msgctxt "@title:window" +msgid "Create Profile" +msgstr "Создать профиль" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:285 +msgctxt "@title:window" +msgid "Duplicate Profile" +msgstr "Скопировать профиль" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:299 +msgctxt "@window:title" +msgid "Import Profile" +msgstr "Импортировать профиль" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:307 +msgctxt "@title:window" +msgid "Import Profile" +msgstr "Импортировать профиль" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:335 +msgctxt "@title:window" +msgid "Export Profile" +msgstr "Экспортировать профиль" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:15 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:503 +msgctxt "@title:tab" +msgid "Materials" +msgstr "Материалы" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:107 +msgctxt "" +"@action:label %1 is printer name, %2 is how this printer names variants, %3 " +"is variant name" +msgid "Printer: %1, %2: %3" +msgstr "Принтер: %1, %2: %3" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:111 +msgctxt "@action:label %1 is printer name" +msgid "Printer: %1" +msgstr "Принтер: %1" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:135 +msgctxt "@action:button" +msgid "Duplicate" +msgstr "Дублировать" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:267 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:275 +msgctxt "@title:window" +msgid "Import Material" +msgstr "Импортировать материал" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:276 +msgctxt "@info:status" +msgid "" +"Could not import material %1: %2" +msgstr "" +"Не могу импортировать материал %1: %2" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:280 +msgctxt "@info:status" +msgid "Successfully imported material %1" +msgstr "Успешно импортированный материал %1" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:299 +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:314 +msgctxt "@title:window" +msgid "Export Material" +msgstr "Экспортировать материал" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:318 +msgctxt "@info:status" +msgid "" +"Failed to export material to %1: %2" +msgstr "" +"Не могу экспортировать материал %1: %2" + +#: /home/ruben/Projects/Cura/resources/qml/Preferences/MaterialsPage.qml:324 +msgctxt "@info:status" +msgid "Successfully exported material to %1" +msgstr "Материал успешно экспортирован в %1" + +#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:18 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:816 +msgctxt "@title:window" +msgid "Add Printer" +msgstr "Добавление принтера" + +#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:182 +msgctxt "@label" +msgid "Printer Name:" +msgstr "Имя принтера:" + +#: /home/ruben/Projects/Cura/resources/qml/AddMachineDialog.qml:205 +msgctxt "@action:button" +msgid "Add Printer" +msgstr "Добавить принтер" + +#: /home/ruben/Projects/Cura/resources/qml/JobSpecs.qml:176 +msgctxt "@label" +msgid "00h 00min" +msgstr "00ч 00мин" + +#: /home/ruben/Projects/Cura/resources/qml/JobSpecs.qml:212 +msgctxt "@label" +msgid "%1 m / ~ %2 g" +msgstr "%1 м / ~ %1 г" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:15 +msgctxt "@title:window" +msgid "About Cura" +msgstr "О Cura" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:56 +msgctxt "@label" +msgid "End-to-end solution for fused filament 3D printing." +msgstr "Полное решение для 3D печати филаментом." + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:69 +msgctxt "@info:credit" +msgid "" +"Cura is developed by Ultimaker B.V. in cooperation with the community.\n" +"Cura proudly uses the following open source projects:" +msgstr "" +"Cura разработана компанией Ultimaker B.V. совместно с сообществом.\n" +"Cura использует следующие проекты с открытым исходным кодом:" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:114 +msgctxt "@label" +msgid "Graphical user interface" +msgstr "Графический интерфейс пользователя" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:115 +msgctxt "@label" +msgid "Application framework" +msgstr "Фреймворк приложения" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:116 +msgctxt "@label" +msgid "GCode generator" +msgstr "GCode генератор" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:117 +msgctxt "@label" +msgid "Interprocess communication library" +msgstr "Библиотека межпроцессного взаимодействия" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:119 +msgctxt "@label" +msgid "Programming language" +msgstr "Язык программирования" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:120 +msgctxt "@label" +msgid "GUI framework" +msgstr "Фреймворк GUI" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:121 +msgctxt "@label" +msgid "GUI framework bindings" +msgstr "Фреймворк GUI, интерфейс" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:122 +msgctxt "@label" +msgid "C/C++ Binding library" +msgstr "C/C++ библиотека интерфейса" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:123 +msgctxt "@label" +msgid "Data interchange format" +msgstr "Формат обмена данными" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:124 +msgctxt "@label" +msgid "Support library for scientific computing " +msgstr "Поддерживает библиотеку для научных вычислений" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:125 +msgctxt "@label" +msgid "Support library for faster math" +msgstr "Поддерживает библиотеку для быстрых расчётов" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:126 +msgctxt "@label" +msgid "Support library for handling STL files" +msgstr "Поддерживает библиотеку для работы с STL файлами" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:127 +msgctxt "@label" +msgid "Serial communication library" +msgstr "Библиотека последовательного интерфейса" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:128 +msgctxt "@label" +msgid "ZeroConf discovery library" +msgstr "Библиотека ZeroConf" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:129 +msgctxt "@label" +msgid "Polygon clipping library" +msgstr "Библиотека обрезки полигонов" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:130 +msgctxt "@label" +msgid "Font" +msgstr "Шрифт" + +#: /home/ruben/Projects/Cura/resources/qml/AboutDialog.qml:131 +msgctxt "@label" +msgid "SVG icons" +msgstr "Иконки SVG" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:348 +msgctxt "@action:menu" +msgid "Copy value to all extruders" +msgstr "Скопировать значение для всех экструдеров" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:363 +msgctxt "@action:menu" +msgid "Hide this setting" +msgstr "Спрятать этот параметр" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:373 +msgctxt "@action:menu" +msgid "Don't show this setting" +msgstr "Не показывать этот параметр" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:377 +msgctxt "@action:menu" +msgid "Keep this setting visible" +msgstr "Оставить этот параметр видимым" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:396 +msgctxt "@action:menu" +msgid "Configure setting visiblity..." +msgstr "Настроить видимость параметров..." + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingCategory.qml:93 +msgctxt "@label" +msgid "" +"Some hidden settings use values different from their normal calculated " +"value.\n" +"\n" +"Click to make these settings visible." +msgstr "" +"Некоторые из скрытых параметров используют значения, отличающиеся о их " +"вычисленных значений.\n" +"\n" +"Щёлкните. чтобы сделать эти параметры видимыми." + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:60 +msgctxt "@label Header for list of settings." +msgid "Affects" +msgstr "Влияет на" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:65 +msgctxt "@label Header for list of settings." +msgid "Affected By" +msgstr "Зависит от" + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:157 +msgctxt "@label" +msgid "" +"This setting is always shared between all extruders. Changing it here will " +"change the value for all extruders" +msgstr "" +"Этот параметр всегда действует на все экструдеры. Его изменение повлияет на " +"все экструдеры." + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:160 +msgctxt "@label" +msgid "The value is resolved from per-extruder values " +msgstr "Значение получается из параметров каждого экструдера " + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:188 +msgctxt "@label" +msgid "" +"This setting has a value that is different from the profile.\n" +"\n" +"Click to restore the value of the profile." +msgstr "" +"Значение этого параметра отличается от значения в профиле.\n" +"\n" +"Щёлкните для восстановления значения из профиля." + +#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:288 +msgctxt "@label" +msgid "" +"This setting is normally calculated, but it currently has an absolute value " +"set.\n" +"\n" +"Click to restore the calculated value." +msgstr "" +"Обычно это значение вычисляется, но в настоящий момент было установлено " +"явно.\n" +"\n" +"Щёлкните для восстановления вычисленного значения." + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:162 +msgctxt "@tooltip" +msgid "" +"Print Setup

Edit or review the settings for the active print " +"job." +msgstr "" +"Настройка печати

Отредактируйте или просмотрите параметры " +"для активной задачи на печать." + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:220 +msgctxt "@tooltip" +msgid "" +"Print Monitor

Monitor the state of the connected printer and " +"the print job in progress." +msgstr "" +"Монитор печати

Отслеживайте состояние подключенного принтера " +"и прогресс задачи на печать." + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:273 +msgctxt "@label:listbox" +msgid "Print Setup" +msgstr "Настройка печати" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:397 +msgctxt "@label" +msgid "Printer Monitor" +msgstr "Монитор принтера" + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:520 +msgctxt "@tooltip" +msgid "" +"Recommended Print Setup

Print with the recommended settings " +"for the selected printer, material and quality." +msgstr "" +"Рекомендованные параметры печати

Печатайте с " +"рекомендованными параметрами для выбранных принтера, материала и качества." + +#: /home/ruben/Projects/Cura/resources/qml/Sidebar.qml:526 +msgctxt "@tooltip" +msgid "" +"Custom Print Setup

Print with finegrained control over every " +"last bit of the slicing process." +msgstr "" +"Свои параметры печати

Печатайте с полным контролем над " +"каждой особенностью процесса слайсинга." + +#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:26 +msgctxt "@title:menuitem %1 is the automatically selected material" +msgid "Automatic: %1" +msgstr "Автоматически: %1" + +#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:12 +msgctxt "@title:menu menubar:toplevel" +msgid "&View" +msgstr "Вид" + +#: /home/ruben/Projects/Cura/resources/qml/Menus/NozzleMenu.qml:26 +msgctxt "@title:menuitem %1 is the value from the printer" +msgid "Automatic: %1" +msgstr "Автоматически: %1" + +#: /home/ruben/Projects/Cura/resources/qml/Menus/RecentFilesMenu.qml:13 +msgctxt "@title:menu menubar:file" +msgid "Open &Recent" +msgstr "Открыть недавние" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:43 +msgctxt "@label" +msgid "Temperatures" +msgstr "Температуры" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:51 +msgctxt "@label" +msgid "Hotend" +msgstr "Голова" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:61 +msgctxt "@label" +msgid "Build plate" +msgstr "Стол" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:69 +msgctxt "@label" +msgid "Active print" +msgstr "Идёт печать" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:74 +msgctxt "@label" +msgid "Job Name" +msgstr "Имя задачи" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:80 +msgctxt "@label" +msgid "Printing Time" +msgstr "Время печати" + +#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:86 +msgctxt "@label" +msgid "Estimated time left" +msgstr "Осталось примерно" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:63 +msgctxt "@action:inmenu" +msgid "Toggle Fu&ll Screen" +msgstr "Полный экран" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:70 +msgctxt "@action:inmenu menubar:edit" +msgid "&Undo" +msgstr "Отмена" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:80 +msgctxt "@action:inmenu menubar:edit" +msgid "&Redo" +msgstr "Возврат" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:90 +msgctxt "@action:inmenu menubar:file" +msgid "&Quit" +msgstr "Выход" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:98 +msgctxt "@action:inmenu" +msgid "Configure Cura..." +msgstr "Настроить Cura…" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:105 +msgctxt "@action:inmenu menubar:printer" +msgid "&Add Printer..." +msgstr "Добавить принтер..." + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:111 +msgctxt "@action:inmenu menubar:printer" +msgid "Manage Pr&inters..." +msgstr "Управление принтерами..." + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:118 +msgctxt "@action:inmenu" +msgid "Manage Materials..." +msgstr "Управление материалами…" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:126 +msgctxt "@action:inmenu menubar:profile" +msgid "&Update profile with current settings/overrides" +msgstr "Обновить профиль, используя текущие параметры" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:134 +msgctxt "@action:inmenu menubar:profile" +msgid "&Discard current changes" +msgstr "Сбросить текущие параметры" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:146 +msgctxt "@action:inmenu menubar:profile" +msgid "&Create profile from current settings/overrides..." +msgstr "Создать профиль из текущих параметров…" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:152 +msgctxt "@action:inmenu menubar:profile" +msgid "Manage Profiles..." +msgstr "Управление профилями..." + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:159 +msgctxt "@action:inmenu menubar:help" +msgid "Show Online &Documentation" +msgstr "Показать онлайн документацию" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:167 +msgctxt "@action:inmenu menubar:help" +msgid "Report a &Bug" +msgstr "Отправить отчёт об ошибке" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:175 +msgctxt "@action:inmenu menubar:help" +msgid "&About..." +msgstr "О Cura" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:182 +msgctxt "@action:inmenu menubar:edit" +msgid "Delete &Selection" +msgstr "Удалить выделенное" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:192 +msgctxt "@action:inmenu" +msgid "Delete Model" +msgstr "Удалить модель" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:200 +msgctxt "@action:inmenu" +msgid "Ce&nter Model on Platform" +msgstr "Поместить модель по центру" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:206 +msgctxt "@action:inmenu menubar:edit" +msgid "&Group Models" +msgstr "Сгруппировать модели" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:216 +msgctxt "@action:inmenu menubar:edit" +msgid "Ungroup Models" +msgstr "Разгруппировать модели" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:226 +msgctxt "@action:inmenu menubar:edit" +msgid "&Merge Models" +msgstr "Объединить модели" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:236 +msgctxt "@action:inmenu" +msgid "&Multiply Model..." +msgstr "Дублировать модель..." + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:243 +msgctxt "@action:inmenu menubar:edit" +msgid "&Select All Models" +msgstr "Выбрать все модели" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:253 +msgctxt "@action:inmenu menubar:edit" +msgid "&Clear Build Plate" +msgstr "Очистить стол" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:263 +msgctxt "@action:inmenu menubar:file" +msgid "Re&load All Models" +msgstr "Перезагрузить все модели" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:271 +msgctxt "@action:inmenu menubar:edit" +msgid "Reset All Model Positions" +msgstr "Сбросить позиции всех моделей" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:278 +msgctxt "@action:inmenu menubar:edit" +msgid "Reset All Model &Transformations" +msgstr "Сбросить преобразования всех моделей" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:285 +msgctxt "@action:inmenu menubar:file" +msgid "&Open File..." +msgstr "Открыть файл..." + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:293 +msgctxt "@action:inmenu menubar:file" +msgid "&Open Project..." +msgstr "Открыть проекта..." + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:299 +msgctxt "@action:inmenu menubar:help" +msgid "Show Engine &Log..." +msgstr "Показать журнал движка..." + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:307 +msgctxt "@action:inmenu menubar:help" +msgid "Show Configuration Folder" +msgstr "Показать конфигурационный каталог" + +#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:314 +msgctxt "@action:menu" +msgid "Configure setting visibility..." +msgstr "Видимость параметров…" + +#: /home/ruben/Projects/Cura/resources/qml/MultiplyObjectOptions.qml:15 +msgctxt "@title:window" +msgid "Multiply Model" +msgstr "Дублировать модель" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:24 +msgctxt "@label:PrintjobStatus" +msgid "Please load a 3d model" +msgstr "Пожалуйста, загрузите 3D модель" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:30 +msgctxt "@label:PrintjobStatus" +msgid "Preparing to slice..." +msgstr "Подготовка к нарезке на слои..." + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:32 +msgctxt "@label:PrintjobStatus" +msgid "Slicing..." +msgstr "Нарезка на слои..." + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:34 +msgctxt "@label:PrintjobStatus %1 is target operation" +msgid "Ready to %1" +msgstr "Готов к %1" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:36 +msgctxt "@label:PrintjobStatus" +msgid "Unable to Slice" +msgstr "Невозможно нарезать" + +#: /home/ruben/Projects/Cura/resources/qml/SaveButton.qml:175 +msgctxt "@info:tooltip" +msgid "Select the active output device" +msgstr "Выберите активное целевое устройство" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:19 +msgctxt "@title:window" +msgid "Cura" +msgstr "Cura" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:68 +msgctxt "@title:menu menubar:toplevel" +msgid "&File" +msgstr "Файл" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:86 +msgctxt "@action:inmenu menubar:file" +msgid "&Save Selection to File" +msgstr "Сохранить выделенное в файл" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:94 +msgctxt "@title:menu menubar:file" +msgid "Save &All" +msgstr "Сохранить всё" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:114 +msgctxt "@title:menu menubar:file" +msgid "Save project" +msgstr "Сохранить проект" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:137 +msgctxt "@title:menu menubar:toplevel" +msgid "&Edit" +msgstr "Правка" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:153 +msgctxt "@title:menu" +msgid "&View" +msgstr "Вид" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:158 +msgctxt "@title:menu" +msgid "&Settings" +msgstr "Параметры" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:160 +msgctxt "@title:menu menubar:toplevel" +msgid "&Printer" +msgstr "Принтер" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:170 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:182 +msgctxt "@title:menu" +msgid "&Material" +msgstr "Материал" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:171 +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:183 +msgctxt "@title:menu" +msgid "&Profile" +msgstr "Профиль" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:175 +msgctxt "@action:inmenu" +msgid "Set as Active Extruder" +msgstr "Установить как активный экструдер" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:193 +msgctxt "@title:menu menubar:toplevel" +msgid "E&xtensions" +msgstr "Расширения" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:226 +msgctxt "@title:menu menubar:toplevel" +msgid "P&references" +msgstr "Настройки" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:234 +msgctxt "@title:menu menubar:toplevel" +msgid "&Help" +msgstr "Справка" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:332 +msgctxt "@action:button" +msgid "Open File" +msgstr "Открыть файл" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:405 +msgctxt "@action:button" +msgid "View Mode" +msgstr "Режим просмотра" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:499 +msgctxt "@title:tab" +msgid "Settings" +msgstr "Параметры" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:718 +msgctxt "@title:window" +msgid "Open file" +msgstr "Открыть файл" + +#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:756 +msgctxt "@title:window" +msgid "Open workspace" +msgstr "Открыть рабочее пространство" + +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:14 +msgctxt "@title:window" +msgid "Save Project" +msgstr "Сохранить проект" + +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:142 +msgctxt "@action:label" +msgid "Extruder %1" +msgstr "Экструдер %1" + +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:152 +msgctxt "@action:label" +msgid "%1 & material" +msgstr "%1 и материал" + +#: /home/ruben/Projects/Cura/resources/qml/WorkspaceSummaryDialog.qml:236 +msgctxt "@action:label" +msgid "Don't show project summary on save again" +msgstr "Больше не показывать сводку по проекту" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:40 +msgctxt "@label" +msgid "Infill" +msgstr "Заполнение" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:184 +msgctxt "@label" +msgid "Hollow" +msgstr "Пустота" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:188 +msgctxt "@label" +msgid "No (0%) infill will leave your model hollow at the cost of low strength" +msgstr "" +"Отсутствие (0%) заполнения сделает вашу модель полой и минимально прочной" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:192 +msgctxt "@label" +msgid "Light" +msgstr "Лёгкое" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:196 +msgctxt "@label" +msgid "Light (20%) infill will give your model an average strength" +msgstr "Лёгкое (20%) заполнение придаст вашей модели среднюю прочность" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:200 +msgctxt "@label" +msgid "Dense" +msgstr "Плотное" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:204 +msgctxt "@label" +msgid "Dense (50%) infill will give your model an above average strength" +msgstr "Плотное (50%) заполнение придаст вашей модели прочность выше среднего" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:208 +msgctxt "@label" +msgid "Solid" +msgstr "Твёрдое" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:212 +msgctxt "@label" +msgid "Solid (100%) infill will make your model completely solid" +msgstr "Твёрдое (100%) заполнение сделает вашу модель полностью твёрдой." + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:235 +msgctxt "@label" +msgid "Enable Support" +msgstr "Разрешить поддержки" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:266 +msgctxt "@label" +msgid "" +"Enable support structures. These structures support parts of the model with " +"severe overhangs." +msgstr "" +"Разрешить печать поддержек. Такие структуры поддерживают части моделей со " +"значительными нависаниями." + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:283 +msgctxt "@label" +msgid "Support Extruder" +msgstr "Экструдер поддержек" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:357 +msgctxt "@label" +msgid "" +"Select which extruder to use for support. This will build up supporting " +"structures below the model to prevent the model from sagging or printing in " +"mid air." +msgstr "" +"Выбирает какой экструдер следует использовать для поддержек. Будут созданы " +"поддерживающие структуры под моделью для предотвращения проседания краёв или " +"печати в воздухе." + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:382 +msgctxt "@label" +msgid "Build Plate Adhesion" +msgstr "Тип прилипания к столу" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:428 +msgctxt "@label" +msgid "" +"Enable printing a brim or raft. This will add a flat area around or under " +"your object which is easy to cut off afterwards." +msgstr "" +"Разрешает печать каймы или подложки. Это добавляет плоскую область вокруг " +"или под вашим объектом, которую легко удалить после печати." + +#: /home/ruben/Projects/Cura/resources/qml/SidebarSimple.qml:481 +msgctxt "@label" +msgid "" +"Need help improving your prints? Read the Ultimaker " +"Troubleshooting Guides" +msgstr "" +"Нужна помощь с улучшением качества печати? Прочитайте Руководства Ultimaker по решению проблем" + +#: /home/ruben/Projects/Cura/resources/qml/EngineLog.qml:15 +msgctxt "@title:window" +msgid "Engine Log" +msgstr "Журнал движка" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:185 +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:193 +msgctxt "@label" +msgid "Material" +msgstr "Материал" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:278 +msgctxt "@label" +msgid "Profile:" +msgstr "Профиль:" + +#: /home/ruben/Projects/Cura/resources/qml/SidebarHeader.qml:329 +msgctxt "@tooltip" +msgid "" +"Some setting/override values are different from the values stored in the " +"profile.\n" +"\n" +"Click to open the profile manager." +msgstr "" +"Значения некоторых параметров отличаются от значений профиля.\n" +"\n" +"Нажмите для открытия менеджера профилей." + +#~ msgctxt "@label" +#~ msgid "" +#~ "

A fatal exception has occurred that we could not recover from!

Please use the information below to post a bug report at http://github.com/Ultimaker/" +#~ "Cura/issues

" +#~ msgstr "" +#~ "

Произошла неожиданная ошибка и мы не смогли его обработать!

Пожалуйста, используйте информацию ниже для создания отчёта об " +#~ "ошибке на http://" +#~ "github.com/Ultimaker/Cura/issues

" + +#~ msgctxt "@info:status" +#~ msgid "Profile {0} has an unknown file type." +#~ msgstr "Профиль {0} имеет неизвестный тип файла." + +#~ msgctxt "@info:status" +#~ msgid "" +#~ "The selected material is imcompatible with the selected machine or " +#~ "configuration." +#~ msgstr "" +#~ "Выбранный материал несовместим с указанным принтером или конфигурацией." + +#~ msgctxt "@label" +#~ msgid "You made changes to the following setting(s):" +#~ msgstr "Вы сделали изменения следующих настроек:" + +#~ msgctxt "@label" +#~ msgid "Do you want to transfer your changed settings to this profile?" +#~ msgstr "Вы желаете перенести свои изменения параметров в этот профиль?" + +#~ msgctxt "@label" +#~ msgid "" +#~ "If you transfer your settings they will override settings in the profile." +#~ msgstr "" +#~ "Если вы перенесёте свои параметры, они перезапишут настройки профиля." + +#~ msgctxt "@info:status" +#~ msgid "" +#~ "Unable to slice with the current settings. Please check your settings for " +#~ "errors." +#~ msgstr "" +#~ "Невозможно нарезать модель при текущих параметрах. Пожалуйста, проверьте " +#~ "значения своих параметров на присутствие ошибок." + +#~ msgctxt "@action:button" +#~ msgid "Save to Removable Drive" +#~ msgstr "Сохранить на внешний носитель" + +#~ msgctxt "@action:button" +#~ msgid "Print via USB" +#~ msgstr "Печатать через USB" + +#~ msgctxt "@info:credit" +#~ msgid "" +#~ "Cura has been developed by Ultimaker B.V. in cooperation with the " +#~ "community." +#~ msgstr "" +#~ "Cura была разработана компанией Ultimaker B.V. в кооперации с сообществом." + +#~ msgctxt "@action:inmenu menubar:profile" +#~ msgid "&Update profile with current settings" +#~ msgstr "Записать текущие параметры в профиль" + +#~ msgctxt "@action:inmenu menubar:profile" +#~ msgid "&Discard current settings" +#~ msgstr "Сбросить текущие параметры" + +#~ msgctxt "@action:inmenu menubar:profile" +#~ msgid "&Create profile from current settings..." +#~ msgstr "Создать профиль из текущих параметров…" + +#~ msgctxt "@action:inmenu" +#~ msgid "&Duplicate Model" +#~ msgstr "Дублировать модель" + +#~ msgctxt "@action:button" +#~ msgid "Update profile with current settings" +#~ msgstr "Внести текущие параметры в профиль" + +#~ msgctxt "@action:button" +#~ msgid "Discard current settings" +#~ msgstr "Сбросить текущие параметры" + +#~ msgctxt "@action:label" +#~ msgid "" +#~ "This profile uses the defaults specified by the printer, so it has no " +#~ "settings in the list below." +#~ msgstr "" +#~ "Данный профиль использует параметры принтера по умолчанию, то есть у него " +#~ "нет параметров из списка ниже." + +#~ msgctxt "@title:tab" +#~ msgid "Simple" +#~ msgstr "Простая" + +#~ msgctxt "@title:tab" +#~ msgid "Advanced" +#~ msgstr "Продвинутая" + +#~ msgctxt "@label:listbox" +#~ msgid "Printer:" +#~ msgstr "Принтер:" + +#~ msgctxt "@tooltip" +#~ msgid "" +#~ "Some setting values are different from the values stored in the profile.\n" +#~ "\n" +#~ "Click to open the profile manager." +#~ msgstr "" +#~ "Значения некоторых параметров отличаются от значений в профиле.\n" +#~ "\n" +#~ "Щёлкните, открыть менеджер профилей." + +#~ msgctxt "@label" +#~ msgid "Infill:" +#~ msgstr "Заполнение:" + +#~ msgctxt "@label" +#~ msgid "Helper Parts:" +#~ msgstr "Помощники:" + +#~ msgctxt "@option:check" +#~ msgid "Print Build Plate Adhesion" +#~ msgstr "Прилипание к столу" + +#~ msgctxt "@option:check" +#~ msgid "Print Support Structure" +#~ msgstr "Печать структуры поддержек" + +#~ msgctxt "@label" +#~ msgid "" +#~ "Enable printing support structures. This will build up supporting " +#~ "structures below the model to prevent the model from sagging or printing " +#~ "in mid air." +#~ msgstr "" +#~ "Разрешает печать поддержек. Это позволяет строить поддерживающие " +#~ "структуры под моделью, предотвращая её от провисания или печати в воздухе." + +#~ msgctxt "@label" +#~ msgid "Don't print support" +#~ msgstr "Не печатать поддержки" + +#~ msgctxt "@label" +#~ msgid "Print support using %1" +#~ msgstr "Печать поддержек с %1" + +#~ msgctxt "@info:status" +#~ msgid "Successfully imported profiles {0}" +#~ msgstr "Успешно импортированы профили {0}" + +#~ msgctxt "@label" +#~ msgid "Scripts" +#~ msgstr "Скрипты" + +#~ msgctxt "@label" +#~ msgid "Active Scripts" +#~ msgstr "Активные скрипты" + +#~ msgctxt "@label" +#~ msgid "Done" +#~ msgstr "Выполнено" + +#~ msgctxt "@item:inlistbox" +#~ msgid "English" +#~ msgstr "Английский" + +#~ msgctxt "@item:inlistbox" +#~ msgid "Finnish" +#~ msgstr "Финский" + +#~ msgctxt "@item:inlistbox" +#~ msgid "French" +#~ msgstr "Французский" + +#~ msgctxt "@item:inlistbox" +#~ msgid "German" +#~ msgstr "Немецкий" + +#~ msgctxt "@item:inlistbox" +#~ msgid "Italian" +#~ msgstr "Итальянский" + +#~ msgctxt "@item:inlistbox" +#~ msgid "Dutch" +#~ msgstr "Датский" + +#~ msgctxt "@item:inlistbox" +#~ msgid "Spanish" +#~ msgstr "Испанский" + +#~ msgctxt "@title:menu" +#~ msgid "Firmware" +#~ msgstr "Прошивка" + +#~ msgctxt "@title:window" +#~ msgid "Print with USB" +#~ msgstr "Печать через USB" + +#~ msgctxt "@label" +#~ msgid "Extruder Temperature %1" +#~ msgstr "Температура экструдера %1" + +#~ msgctxt "@action:button" +#~ msgid "Add Setting" +#~ msgstr "Добавить настройку" + +#~ msgctxt "@title" +#~ msgid "Add Printer" +#~ msgstr "Добавление принтера" + +#~ msgctxt "@label" +#~ msgid "0.0 m" +#~ msgstr "0.0 м" + +#~ msgctxt "@label" +#~ msgid "%1 m" +#~ msgstr "%1 м" + +#~ msgctxt "@label:listbox" +#~ msgid "Setup" +#~ msgstr "Настройка" + +#~ msgctxt "@action:inmenu menubar:profile" +#~ msgid "&Add Profile..." +#~ msgstr "Добавить профиль..." + +#~ msgctxt "@title:menu menubar:toplevel" +#~ msgid "P&rofile" +#~ msgstr "Профиль" + +#~ msgctxt "@title:tab" +#~ msgid "View" +#~ msgstr "Вид" + +#~ msgctxt "@option:check" +#~ msgid "Generate Brim" +#~ msgstr "Генерировать кайму" + +#~ msgctxt "@title:window" +#~ msgid "View" +#~ msgstr "Просмотр" + +#~ msgctxt "@label:listbox" +#~ msgid "Print Job" +#~ msgstr "Задание на печать" + +#~ msgctxt "@action:button" +#~ msgid "Skip Printer Check" +#~ msgstr "Пропустить проверку принтера" + +#~ msgctxt "@info:status" +#~ msgid "Incomplete" +#~ msgstr "Не выполнено" + +#~ msgctxt "@label" +#~ msgid "" +#~ "To assist you in having better default settings for your Ultimaker. Cura " +#~ "would like to know which upgrades you have in your machine:" +#~ msgstr "" +#~ "Для того, чтобы установить лучшие настройки по умолчанию для вашего " +#~ "Ultimaker, Cura должна знать какие изменения вы внесли в свой принтер:" + +#~ msgctxt "@option:check" +#~ msgid "Olsson Block" +#~ msgstr "Блок Олссона" + +#~ msgctxt "@action:button" +#~ msgid "Skip Bedleveling" +#~ msgstr "Пропустить выравнивание стола" + +#~ msgctxt "@label" +#~ msgid "Everything is in order! You're done with bedleveling." +#~ msgstr "Всё в порядке! Вы завершили выравнивание стола." + +#~ msgctxt "@option:check" +#~ msgid "Extruder driver upgrades" +#~ msgstr "Обновления экструдера" + +#~ msgctxt "@option:check" +#~ msgid "Heated printer bed (self built)" +#~ msgstr "Нагреваемый стол (самодельный)" + +#~ msgctxt "@label" +#~ msgid "" +#~ "If you bought your Ultimaker after october 2012 you will have the " +#~ "Extruder drive upgrade. If you do not have this upgrade, it is highly " +#~ "recommended to improve reliability. This upgrade can be bought from the " +#~ "Ultimaker webshop or found on thingiverse as thing:26094" +#~ msgstr "" +#~ "Если вы купили ваш Ultimaker после октября 2012 года, то у вас есть " +#~ "обновление экструдера. Если у вас нет этого обновления, оно крайне " +#~ "рекомендуется. Это обновление можно купить на сайте Ultimaker или найти " +#~ "на Thingiverse (thing:26094)" + +#~ msgctxt "@label" +#~ msgid "" +#~ "Cura requires these new features and thus your firmware will most likely " +#~ "need to be upgraded. You can do so now." +#~ msgstr "" +#~ "Cura требует эти новые возможности и соответственно, ваша прошивка также " +#~ "может нуждаться в обновлении. Вы можете сделать это прямо сейчас." + +#~ msgctxt "@action:button" +#~ msgid "Upgrade to Marlin Firmware" +#~ msgstr "Обновиться на прошивку Marlin" + +#~ msgctxt "@action:button" +#~ msgid "Skip Upgrade" +#~ msgstr "Пропусть апгрейд" + +#~ msgctxt "@label" +#~ msgid "" +#~ "This printer name has already been used. Please choose a different " +#~ "printer name." +#~ msgstr "" +#~ "Данное имя принтера уже используется. Пожалуйста, выберите другое имя для " +#~ "принтера." + +#~ msgctxt "@title" +#~ msgid "Bed Levelling" +#~ msgstr "Выравнивание стола" diff --git a/resources/i18n/ru/fdmextruder.def.json.po b/resources/i18n/ru/fdmextruder.def.json.po new file mode 100644 index 0000000000..69706f744c --- /dev/null +++ b/resources/i18n/ru/fdmextruder.def.json.po @@ -0,0 +1,2417 @@ +msgid "" +msgstr "" +"Project-Id-Version: Uranium json setting files\n" +"Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n" +"POT-Creation-Date: 2017-01-06 23:10+0300\n" +"PO-Revision-Date: 2017-01-06 23:10+0300\n" +"Last-Translator: Ruslan Popov \n" +"Language-Team: \n" +"Language: ru_RU\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.8.11\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +#: fdmextruder.def.json +msgctxt "machine_settings label" +msgid "Machine" +msgstr "Принтер" + +#: fdmextruder.def.json +msgctxt "machine_settings description" +msgid "Machine specific settings" +msgstr "Параметры, относящиеся к принтеру" + +#: fdmextruder.def.json +msgctxt "extruder_nr label" +msgid "Extruder" +msgstr "Экструдер" + +#: fdmextruder.def.json +msgctxt "extruder_nr description" +msgid "The extruder train used for printing. This is used in multi-extrusion." +msgstr "" +"Экструдер, который используется для печати. Имеет значение при использовании " +"нескольких экструдеров." + +#: fdmextruder.def.json +msgctxt "machine_nozzle_offset_x label" +msgid "Nozzle X Offset" +msgstr "X смещение сопла" + +#: fdmextruder.def.json +msgctxt "machine_nozzle_offset_x description" +msgid "The x-coordinate of the offset of the nozzle." +msgstr "Смещение сопла по оси X." + +#: fdmextruder.def.json +msgctxt "machine_nozzle_offset_y label" +msgid "Nozzle Y Offset" +msgstr "Y смещение сопла" + +#: fdmextruder.def.json +msgctxt "machine_nozzle_offset_y description" +msgid "The y-coordinate of the offset of the nozzle." +msgstr "Смещение сопла по оси Y." + +#: fdmextruder.def.json +msgctxt "machine_extruder_start_code label" +msgid "Extruder Start G-Code" +msgstr "G-код старта экструдера" + +#: fdmextruder.def.json +msgctxt "machine_extruder_start_code description" +msgid "Start g-code to execute whenever turning the extruder on." +msgstr "Стартовый G-код, который выполняется при включении экструдера." + +#: fdmextruder.def.json +msgctxt "machine_extruder_start_pos_abs label" +msgid "Extruder Start Position Absolute" +msgstr "Абсолютная стартовая позиция экструдера" + +#: fdmextruder.def.json +msgctxt "machine_extruder_start_pos_abs description" +msgid "" +"Make the extruder starting position absolute rather than relative to the " +"last-known location of the head." +msgstr "" +"Устанавливает абсолютную стартовую позицию экструдера, а не относительно " +"последней известной позиции головы." + +#: fdmextruder.def.json +msgctxt "machine_extruder_start_pos_x label" +msgid "Extruder Start Position X" +msgstr "Стартовая X позиция экструдера" + +#: fdmextruder.def.json +msgctxt "machine_extruder_start_pos_x description" +msgid "The x-coordinate of the starting position when turning the extruder on." +msgstr "X координата стартовой позиции при включении экструдера." + +#: fdmextruder.def.json +msgctxt "machine_extruder_start_pos_y label" +msgid "Extruder Start Position Y" +msgstr "Стартовая Y позиция экструдера" + +#: fdmextruder.def.json +msgctxt "machine_extruder_start_pos_y description" +msgid "The y-coordinate of the starting position when turning the extruder on." +msgstr "Y координата стартовой позиции при включении экструдера." + +#: fdmextruder.def.json +msgctxt "machine_extruder_end_code label" +msgid "Extruder End G-Code" +msgstr "G-код завершения экструдера" + +#: fdmextruder.def.json +msgctxt "machine_extruder_end_code description" +msgid "End g-code to execute whenever turning the extruder off." +msgstr "Завершающий G-код, который выполняется при отключении экструдера." + +#: fdmextruder.def.json +msgctxt "machine_extruder_end_pos_abs label" +msgid "Extruder End Position Absolute" +msgstr "Абсолютная конечная позиция экструдера" + +#: fdmextruder.def.json +msgctxt "machine_extruder_end_pos_abs description" +msgid "" +"Make the extruder ending position absolute rather than relative to the last-" +"known location of the head." +msgstr "" +"Устанавливает абсолютную конечную позицию экструдера, а не относительно " +"последней известной позиции головы." + +#: fdmextruder.def.json +msgctxt "machine_extruder_end_pos_x label" +msgid "Extruder End Position X" +msgstr "Конечная X позиция экструдера" + +#: fdmextruder.def.json +msgctxt "machine_extruder_end_pos_x description" +msgid "The x-coordinate of the ending position when turning the extruder off." +msgstr "X координата конечной позиции при отключении экструдера." + +#: fdmextruder.def.json +msgctxt "machine_extruder_end_pos_y label" +msgid "Extruder End Position Y" +msgstr "Конечная Y позиция экструдера" + +#: fdmextruder.def.json +msgctxt "machine_extruder_end_pos_y description" +msgid "The y-coordinate of the ending position when turning the extruder off." +msgstr "Y координата конечной позиции при отключении экструдера." + +#: fdmextruder.def.json +msgctxt "extruder_prime_pos_z label" +msgid "Extruder Prime Z Position" +msgstr "Начальная Z позиция экструдера" + +#: fdmextruder.def.json +msgctxt "extruder_prime_pos_z description" +msgid "" +"The Z coordinate of the position where the nozzle primes at the start of " +"printing." +msgstr "Z координата позиции, с которой сопло начинает печать." + +#: fdmextruder.def.json +msgctxt "platform_adhesion label" +msgid "Build Plate Adhesion" +msgstr "Прилипание к столу" + +#: fdmextruder.def.json +msgctxt "platform_adhesion description" +msgid "Adhesion" +msgstr "Прилипание" + +#: fdmextruder.def.json +msgctxt "extruder_prime_pos_x label" +msgid "Extruder Prime X Position" +msgstr "Начальная X позиция экструдера" + +#: fdmextruder.def.json +msgctxt "extruder_prime_pos_x description" +msgid "" +"The X coordinate of the position where the nozzle primes at the start of " +"printing." +msgstr "X координата позиции, в которой сопло начинает печать." + +#: fdmextruder.def.json +msgctxt "extruder_prime_pos_y label" +msgid "Extruder Prime Y Position" +msgstr "Начальная Y позиция экструдера" + +#: fdmextruder.def.json +msgctxt "extruder_prime_pos_y description" +msgid "" +"The Y coordinate of the position where the nozzle primes at the start of " +"printing." +msgstr "Y координата позиции, в которой сопло начинает печать." + +#~ msgctxt "machine_nozzle_size label" +#~ msgid "Nozzle Diameter" +#~ msgstr "Диаметр сопла" + +#~ msgctxt "machine_nozzle_size description" +#~ msgid "" +#~ "The inner diameter of the nozzle. Change this setting when using a non-" +#~ "standard nozzle size." +#~ msgstr "" +#~ "Внутренний диаметр сопла. Измените эту настройку при использовании сопла " +#~ "нестандартного размера." + +#~ msgctxt "resolution label" +#~ msgid "Quality" +#~ msgstr "Качество" + +#~ msgctxt "layer_height label" +#~ msgid "Layer Height" +#~ msgstr "Высота слоя" + +#~ msgctxt "layer_height description" +#~ msgid "" +#~ "The height of each layer in mm. Higher values produce faster prints in " +#~ "lower resolution, lower values produce slower prints in higher resolution." +#~ msgstr "" +#~ "Высота каждого слоя в миллиметрах. Большие значения приводят к быстрой " +#~ "печати при низком разрешении, малые значения приводят к замедлению печати " +#~ "с высоким разрешением." + +#~ msgctxt "layer_height_0 label" +#~ msgid "Initial Layer Height" +#~ msgstr "Высота первого слоя" + +#~ msgctxt "layer_height_0 description" +#~ msgid "" +#~ "The height of the initial layer in mm. A thicker initial layer makes " +#~ "adhesion to the build plate easier." +#~ msgstr "" +#~ "Высота первого слоя в миллиметрах. Более толстый слой упрощает прилипание " +#~ "пластика к столу." + +#~ msgctxt "line_width label" +#~ msgid "Line Width" +#~ msgstr "Ширина линии" + +#~ msgctxt "line_width description" +#~ msgid "" +#~ "Width of a single line. Generally, the width of each line should " +#~ "correspond to the width of the nozzle. However, slightly reducing this " +#~ "value could produce better prints." +#~ msgstr "" +#~ "Ширина одной линии. Обычно, ширина каждой линии должна соответствовать " +#~ "диаметру сопла. Однако, небольшое уменьшение этого значение приводит к " +#~ "лучшей печати." + +#~ msgctxt "wall_line_width label" +#~ msgid "Wall Line Width" +#~ msgstr "Ширина линии стенки" + +#~ msgctxt "wall_line_width description" +#~ msgid "Width of a single wall line." +#~ msgstr "Ширина одной линии стенки." + +#~ msgctxt "wall_line_width_0 label" +#~ msgid "Outer Wall Line Width" +#~ msgstr "Ширина линии внешней стенки" + +#~ msgctxt "wall_line_width_0 description" +#~ msgid "" +#~ "Width of the outermost wall line. By lowering this value, higher levels " +#~ "of detail can be printed." +#~ msgstr "" +#~ "Ширина линии внешней стенки. Уменьшая данное значение, можно печатать " +#~ "более тонкие детали." + +#~ msgctxt "wall_line_width_x label" +#~ msgid "Inner Wall(s) Line Width" +#~ msgstr "Ширина линии внутренней стенки" + +#~ msgctxt "wall_line_width_x description" +#~ msgid "" +#~ "Width of a single wall line for all wall lines except the outermost one." +#~ msgstr "" +#~ "Ширина одной линии стенки для всех линий стенки, кроме самой внешней." + +#~ msgctxt "skin_line_width label" +#~ msgid "Top/bottom Line Width" +#~ msgstr "Ширина линии дна/крышки." + +#~ msgctxt "skin_line_width description" +#~ msgid "Width of a single top/bottom line." +#~ msgstr "Ширина одной линии дна/крышки." + +#~ msgctxt "infill_line_width label" +#~ msgid "Infill Line Width" +#~ msgstr "Ширина линии заполнения" + +#~ msgctxt "infill_line_width description" +#~ msgid "Width of a single infill line." +#~ msgstr "Ширина одной линии заполнения." + +#~ msgctxt "skirt_line_width label" +#~ msgid "Skirt Line Width" +#~ msgstr "Ширина линии юбки" + +#~ msgctxt "skirt_line_width description" +#~ msgid "Width of a single skirt line." +#~ msgstr "Ширина одной линии юбки." + +#~ msgctxt "support_line_width label" +#~ msgid "Support Line Width" +#~ msgstr "Ширина линии поддержки" + +#~ msgctxt "support_line_width description" +#~ msgid "Width of a single support structure line." +#~ msgstr "Ширина одной линии поддержки." + +#~ msgctxt "support_roof_line_width label" +#~ msgid "Support Roof Line Width" +#~ msgstr "Ширина линии поддерживающей крыши" + +#~ msgctxt "support_roof_line_width description" +#~ msgid "Width of a single support roof line." +#~ msgstr "Ширина одной линии поддерживающей крыши." + +#~ msgctxt "shell label" +#~ msgid "Shell" +#~ msgstr "Ограждение" + +#~ msgctxt "wall_thickness label" +#~ msgid "Wall Thickness" +#~ msgstr "Толщина стенки" + +#~ msgctxt "wall_thickness description" +#~ msgid "" +#~ "The thickness of the outside walls in the horizontal direction. This " +#~ "value divided by the wall line width defines the number of walls." +#~ msgstr "" +#~ "Толщина внешних стенок в горизонтальном направлении. Это значение, " +#~ "разделённое на ширину линии стенки, определяет количество линий стенки." + +#~ msgctxt "wall_line_count label" +#~ msgid "Wall Line Count" +#~ msgstr "Количество линий стенки" + +#~ msgctxt "wall_line_count description" +#~ msgid "" +#~ "The number of walls. When calculated by the wall thickness, this value is " +#~ "rounded to a whole number." +#~ msgstr "" +#~ "Количество линий стенки. При вычислении толщины стенки, это значение " +#~ "округляется до целого." + +#~ msgctxt "top_bottom_thickness label" +#~ msgid "Top/Bottom Thickness" +#~ msgstr "Толщина дна/крышки" + +#~ msgctxt "top_bottom_thickness description" +#~ msgid "" +#~ "The thickness of the top/bottom layers in the print. This value divided " +#~ "by the layer height defines the number of top/bottom layers." +#~ msgstr "" +#~ "Толщина слоя дна/крышки при печати. Это значение, разделённое на высоту " +#~ "слоя, определяет количество слоёв в дне/крышке." + +#~ msgctxt "top_thickness label" +#~ msgid "Top Thickness" +#~ msgstr "Толщина крышки" + +#~ msgctxt "top_thickness description" +#~ msgid "" +#~ "The thickness of the top layers in the print. This value divided by the " +#~ "layer height defines the number of top layers." +#~ msgstr "" +#~ "Толщина крышки при печати. Это значение, разделённое на высоту слоя, " +#~ "определяет количество слоёв в крышке." + +#~ msgctxt "top_layers label" +#~ msgid "Top Layers" +#~ msgstr "Слои крышки" + +#~ msgctxt "top_layers description" +#~ msgid "" +#~ "The number of top layers. When calculated by the top thickness, this " +#~ "value is rounded to a whole number." +#~ msgstr "" +#~ "Количество слоёв в крышке. При вычислении толщины крышки это значение " +#~ "округляется до целого." + +#~ msgctxt "bottom_thickness label" +#~ msgid "Bottom Thickness" +#~ msgstr "Толщина дна" + +#~ msgctxt "bottom_thickness description" +#~ msgid "" +#~ "The thickness of the bottom layers in the print. This value divided by " +#~ "the layer height defines the number of bottom layers." +#~ msgstr "" +#~ "Толщина дна при печати. Это значение, разделённое на высоту слоя, " +#~ "определяет количество слоёв в дне." + +#~ msgctxt "bottom_layers label" +#~ msgid "Bottom Layers" +#~ msgstr "Слои дна" + +#~ msgctxt "bottom_layers description" +#~ msgid "" +#~ "The number of bottom layers. When calculated by the bottom thickness, " +#~ "this value is rounded to a whole number." +#~ msgstr "" +#~ "Количество слоёв в дне. При вычислении толщины дна это значение " +#~ "округляется до целого." + +#~ msgctxt "top_bottom_pattern label" +#~ msgid "Top/Bottom Pattern" +#~ msgstr "Шаблон для крышки/дна" + +#~ msgctxt "top_bottom_pattern description" +#~ msgid "The pattern of the top/bottom layers." +#~ msgstr "Шаблон слоёв для крышки/дна." + +#~ msgctxt "top_bottom_pattern option lines" +#~ msgid "Lines" +#~ msgstr "Линии" + +#~ msgctxt "top_bottom_pattern option concentric" +#~ msgid "Concentric" +#~ msgstr "Концентрический" + +#~ msgctxt "top_bottom_pattern option zigzag" +#~ msgid "Zig Zag" +#~ msgstr "Зигзаг" + +#~ msgctxt "skin_alternate_rotation description" +#~ msgid "" +#~ "Alternate the direction in which the top/bottom layers are printed. " +#~ "Normally they are printed diagonally only. This setting adds the X-only " +#~ "and Y-only directions." +#~ msgstr "" +#~ "Изменить направление, в котором печатаются слои крышки/дна. Обычно, они " +#~ "печатаются по диагонали. Данный параметр добавляет направления X-только и " +#~ "Y-только." + +#~ msgctxt "skin_outline_count description" +#~ msgid "" +#~ "Replaces the outermost part of the top/bottom pattern with a number of " +#~ "concentric lines. Using one or two lines improves roofs that start on " +#~ "infill material." +#~ msgstr "" +#~ "Заменяет внешнюю часть шаблона крышки/дна рядом концентрических линий. " +#~ "Использование одной или двух линий улучшает мосты, которые печатаются " +#~ "поверх материала заполнения." + +#~ msgctxt "alternate_extra_perimeter description" +#~ msgid "" +#~ "Prints an extra wall at every other layer. This way infill gets caught " +#~ "between these extra walls, resulting in stronger prints." +#~ msgstr "" +#~ "Печатает дополнительную стенку через определённое количество слоёв. Таким " +#~ "образом заполнения заключается между этими дополнительными стенками, что " +#~ "приводит к повышению прочности печати." + +#~ msgctxt "remove_overlapping_walls_enabled label" +#~ msgid "Remove Overlapping Wall Parts" +#~ msgstr "Удаление перекрывающихся частей стены" + +#~ msgctxt "remove_overlapping_walls_enabled description" +#~ msgid "" +#~ "Remove parts of a wall which share an overlap which would result in " +#~ "overextrusion in some places. These overlaps occur in thin parts and " +#~ "sharp corners in models." +#~ msgstr "" +#~ "Удаляет части стены, которые перекрываются. что приводит к появлению " +#~ "излишков материала в некоторых местах. Такие перекрытия образуются в " +#~ "тонких частях и острых углах моделей." + +#~ msgctxt "remove_overlapping_walls_0_enabled label" +#~ msgid "Remove Overlapping Outer Wall Parts" +#~ msgstr "Удаление перекрывающихся частей внешних стенок" + +#~ msgctxt "remove_overlapping_walls_0_enabled description" +#~ msgid "" +#~ "Remove parts of an outer wall which share an overlap which would result " +#~ "in overextrusion in some places. These overlaps occur in thin pieces in a " +#~ "model and sharp corners." +#~ msgstr "" +#~ "Удаляет части внешней стены, которые перекрываются, что приводит к " +#~ "появлению излишков материала в некоторых местах. Такие перекрытия " +#~ "образуются в тонких частях и острых углах моделей." + +#~ msgctxt "remove_overlapping_walls_x_enabled label" +#~ msgid "Remove Overlapping Inner Wall Parts" +#~ msgstr "Удаление перекрывающихся частей внутренних стенок" + +#~ msgctxt "remove_overlapping_walls_x_enabled description" +#~ msgid "" +#~ "Remove parts of an inner wall that would otherwise overlap and cause over-" +#~ "extrusion. These overlaps occur in thin pieces in a model and sharp " +#~ "corners." +#~ msgstr "" +#~ "Удаляет части внутренних стенок, которые в противном случае будут " +#~ "перекрываться и приводить к появлению излишков материала. Такие " +#~ "перекрытия образуются в тонких частях и острых углах моделей." + +#~ msgctxt "fill_perimeter_gaps label" +#~ msgid "Fill Gaps Between Walls" +#~ msgstr "Заполнение зазоров между стенками" + +#~ msgctxt "fill_perimeter_gaps description" +#~ msgid "" +#~ "Fills the gaps between walls when overlapping inner wall parts are " +#~ "removed." +#~ msgstr "" +#~ "Заполняет зазоры между стенами после того, как перекрывающиеся части " +#~ "внутренних стенок были удалены." + +#~ msgctxt "fill_perimeter_gaps option nowhere" +#~ msgid "Nowhere" +#~ msgstr "Нигде" + +#~ msgctxt "fill_perimeter_gaps option everywhere" +#~ msgid "Everywhere" +#~ msgstr "Везде" + +#~ msgctxt "fill_perimeter_gaps option skin" +#~ msgid "Skin" +#~ msgstr "Покрытие" + +#~ msgctxt "travel_compensate_overlapping_walls_enabled label" +#~ msgid "Compensate Wall Overlaps" +#~ msgstr "Компенсация перекрытия стен" + +#~ msgctxt "travel_compensate_overlapping_walls_enabled description" +#~ msgid "" +#~ "Compensate the flow for parts of a wall being printed where there is " +#~ "already a wall in place." +#~ msgstr "" +#~ "Компенсирует поток для печатаемых частей стен в местах где уже напечатана " +#~ "стена." + +#~ msgctxt "xy_offset label" +#~ msgid "Horizontal Expansion" +#~ msgstr "Горизонтальное расширение" + +#~ msgctxt "xy_offset description" +#~ msgid "" +#~ "Amount of offset applied to all polygons in each layer. Positive values " +#~ "can compensate for too big holes; negative values can compensate for too " +#~ "small holes." +#~ msgstr "" +#~ "Сумма смещения применяемая ко всем полигонам на каждом слое. Позитивные " +#~ "значения могут возместить потери для слишком больших отверстий; " +#~ "негативные значения могут возместить потери для слишком малых отверстий." + +#~ msgctxt "z_seam_type label" +#~ msgid "Z Seam Alignment" +#~ msgstr "Выравнивание шва по оси Z" + +#~ msgctxt "z_seam_type description" +#~ msgid "" +#~ "Starting point of each path in a layer. When paths in consecutive layers " +#~ "start at the same point a vertical seam may show on the print. When " +#~ "aligning these at the back, the seam is easiest to remove. When placed " +#~ "randomly the inaccuracies at the paths' start will be less noticeable. " +#~ "When taking the shortest path the print will be quicker." +#~ msgstr "" +#~ "Начальная точка для каждого пути в слое. Когда пути в последовательных " +#~ "слоях начинаются в одной и той же точке, то на модели может возникать " +#~ "вертикальный шов. Проще всего удалить шов, выравнивая начало путей " +#~ "позади. Менее заметным шов можно сделать, случайно устанавливая начало " +#~ "путей. Если выбрать самый короткий путь, то печать будет быстрее." + +#~ msgctxt "z_seam_type option back" +#~ msgid "Back" +#~ msgstr "Позади" + +#~ msgctxt "z_seam_type option shortest" +#~ msgid "Shortest" +#~ msgstr "Короткий путь" + +#~ msgctxt "z_seam_type option random" +#~ msgid "Random" +#~ msgstr "Случайно" + +#~ msgctxt "skin_no_small_gaps_heuristic label" +#~ msgid "Ignore Small Z Gaps" +#~ msgstr "Игнорирование небольших зазоров по оси Z" + +#~ msgctxt "skin_no_small_gaps_heuristic description" +#~ msgid "" +#~ "When the model has small vertical gaps, about 5% extra computation time " +#~ "can be spent on generating top and bottom skin in these narrow spaces. In " +#~ "such case, disable the setting." +#~ msgstr "" +#~ "Когда модель имеет небольшие вертикальные зазоры, около 5% " +#~ "дополнительного времени будет потрачено на вычисления верхних и нижних " +#~ "поверхностей в этих узких пространствах. В этом случае, отключите данную " +#~ "настройку." + +#~ msgctxt "infill label" +#~ msgid "Infill" +#~ msgstr "Заполнение" + +#~ msgctxt "infill_sparse_density label" +#~ msgid "Infill Density" +#~ msgstr "Плотность заполнения" + +#~ msgctxt "infill_sparse_density description" +#~ msgid "Adjusts the density of infill of the print." +#~ msgstr "Отрегулируйте плотность заполнения при печати." + +#~ msgctxt "infill_line_distance label" +#~ msgid "Line Distance" +#~ msgstr "Дистанция заполнения" + +#~ msgctxt "infill_line_distance description" +#~ msgid "" +#~ "Distance between the printed infill lines. This setting is calculated by " +#~ "the infill density and the infill line width." +#~ msgstr "" +#~ "Дистанция между линиями заполнения. Этот параметр вычисляется из " +#~ "плотности заполнения и ширины линии заполнения." + +#~ msgctxt "infill_pattern label" +#~ msgid "Infill Pattern" +#~ msgstr "Шаблон заполнения" + +#~ msgctxt "infill_pattern description" +#~ msgid "" +#~ "The pattern of the infill material of the print. The line and zig zag " +#~ "infill swap direction on alternate layers, reducing material cost. The " +#~ "grid, triangle and concentric patterns are fully printed every layer." +#~ msgstr "" +#~ "Шаблон для материала заполнения при печати. Заполнение линиями и зигзагом " +#~ "меняет направление при смене слоя, уменьшая стоимость материала. " +#~ "Сетчатый, треугольный и концентрический шаблоны полностью печатаются на " +#~ "каждом слое." + +#~ msgctxt "infill_pattern option grid" +#~ msgid "Grid" +#~ msgstr "Сетка" + +#~ msgctxt "infill_pattern option lines" +#~ msgid "Lines" +#~ msgstr "Линии" + +#~ msgctxt "infill_pattern option triangles" +#~ msgid "Triangles" +#~ msgstr "Треугольники" + +#~ msgctxt "infill_pattern option concentric" +#~ msgid "Concentric" +#~ msgstr "Концентрический" + +#~ msgctxt "infill_pattern option zigzag" +#~ msgid "Zig Zag" +#~ msgstr "Зигзаг" + +#~ msgctxt "infill_overlap label" +#~ msgid "Infill Overlap" +#~ msgstr "Перекрытие заполнения" + +#~ msgctxt "infill_overlap description" +#~ msgid "" +#~ "The amount of overlap between the infill and the walls. A slight overlap " +#~ "allows the walls to connect firmly to the infill." +#~ msgstr "" +#~ "Величина перекрытия между заполнением и стенками. Небольшое перекрытие " +#~ "позволяет стенкам плотно соединиться с заполнением." + +#~ msgctxt "infill_wipe_dist label" +#~ msgid "Infill Wipe Distance" +#~ msgstr "Дистанция окончания заполнения" + +#~ msgctxt "infill_wipe_dist description" +#~ msgid "" +#~ "Distance of a travel move inserted after every infill line, to make the " +#~ "infill stick to the walls better. This option is similar to infill " +#~ "overlap, but without extrusion and only on one end of the infill line." +#~ msgstr "" +#~ "Расстояние, на которое продолжается движение сопла после печати каждой " +#~ "линии заполнения, для обеспечения лучшего связывания заполнения со " +#~ "стенками. Этот параметр похож на перекрытие заполнения, но без экструзии " +#~ "и только с одной стороны линии заполнения." + +#~ msgctxt "infill_sparse_thickness label" +#~ msgid "Infill Layer Thickness" +#~ msgstr "Толщина слоя заполнения" + +#~ msgctxt "infill_sparse_thickness description" +#~ msgid "" +#~ "The thickness per layer of infill material. This value should always be a " +#~ "multiple of the layer height and is otherwise rounded." +#~ msgstr "" +#~ "Толщина слоя для материала заполнения. Данное значение должно быть всегда " +#~ "кратно толщине слоя и всегда округляется." + +#~ msgctxt "infill_before_walls label" +#~ msgid "Infill Before Walls" +#~ msgstr "Заполнение перед печатью стенок" + +#~ msgctxt "infill_before_walls description" +#~ msgid "" +#~ "Print the infill before printing the walls. Printing the walls first may " +#~ "lead to more accurate walls, but overhangs print worse. Printing the " +#~ "infill first leads to sturdier walls, but the infill pattern might " +#~ "sometimes show through the surface." +#~ msgstr "" +#~ "Печатать заполнение до печати стенок. Если печатать сначала стенки, то " +#~ "это может сделать их более точными, но нависающие стенки будут напечатаны " +#~ "хуже. Если печатать сначала заполнение, то это сделает стенки более " +#~ "крепкими, но шаблон заполнения может иногда прорываться сквозь " +#~ "поверхность стенки." + +#~ msgctxt "material label" +#~ msgid "Material" +#~ msgstr "Материал" + +#~ msgctxt "material_flow_dependent_temperature label" +#~ msgid "Auto Temperature" +#~ msgstr "Автоматическая температура" + +#~ msgctxt "material_flow_dependent_temperature description" +#~ msgid "" +#~ "Change the temperature for each layer automatically with the average flow " +#~ "speed of that layer." +#~ msgstr "" +#~ "Изменять температуру каждого слоя автоматически в соответствии со средней " +#~ "скоростью потока на этом слое." + +#~ msgctxt "material_print_temperature label" +#~ msgid "Printing Temperature" +#~ msgstr "Температура печати" + +#~ msgctxt "material_print_temperature description" +#~ msgid "" +#~ "The temperature used for printing. Set at 0 to pre-heat the printer " +#~ "manually." +#~ msgstr "" +#~ "Температура при печати. Установите 0 для предварительного разогрева " +#~ "вручную." + +#~ msgctxt "material_flow_temp_graph label" +#~ msgid "Flow Temperature Graph" +#~ msgstr "График температуры потока" + +#~ msgctxt "material_flow_temp_graph description" +#~ msgid "" +#~ "Data linking material flow (in mm3 per second) to temperature (degrees " +#~ "Celsius)." +#~ msgstr "" +#~ "График, объединяющий поток (в мм3 в секунду) с температурой (в градусах " +#~ "Цельсия)." + +#~ msgctxt "material_extrusion_cool_down_speed label" +#~ msgid "Extrusion Cool Down Speed Modifier" +#~ msgstr "Модификатор скорости охлаждения экструзии" + +#~ msgctxt "material_extrusion_cool_down_speed description" +#~ msgid "" +#~ "The extra speed by which the nozzle cools while extruding. The same value " +#~ "is used to signify the heat up speed lost when heating up while extruding." +#~ msgstr "" +#~ "Дополнительная скорость, с помощью которой сопло охлаждается во время " +#~ "экструзии. Это же значение используется для ускорения нагрева сопла при " +#~ "экструзии." + +#~ msgctxt "material_bed_temperature label" +#~ msgid "Bed Temperature" +#~ msgstr "Температура стола" + +#~ msgctxt "material_bed_temperature description" +#~ msgid "" +#~ "The temperature used for the heated bed. Set at 0 to pre-heat the printer " +#~ "manually." +#~ msgstr "" +#~ "Температура стола при печати. Установите 0 для предварительного разогрева " +#~ "вручную." + +#~ msgctxt "material_diameter label" +#~ msgid "Diameter" +#~ msgstr "Диаметр" + +#~ msgctxt "material_diameter description" +#~ msgid "" +#~ "Adjusts the diameter of the filament used. Match this value with the " +#~ "diameter of the used filament." +#~ msgstr "Укажите диаметр используемой нити." + +#~ msgctxt "material_flow label" +#~ msgid "Flow" +#~ msgstr "Поток" + +#~ msgctxt "material_flow description" +#~ msgid "" +#~ "Flow compensation: the amount of material extruded is multiplied by this " +#~ "value." +#~ msgstr "" +#~ "Компенсация потока: объём выдавленного материала умножается на этот " +#~ "коэффициент." + +#~ msgctxt "retraction_enable label" +#~ msgid "Enable Retraction" +#~ msgstr "Разрешить откат" + +#~ msgctxt "retraction_enable description" +#~ msgid "" +#~ "Retract the filament when the nozzle is moving over a non-printed area. " +#~ msgstr "Откат нити при движении сопла вне зоны печати." + +#~ msgctxt "retraction_amount label" +#~ msgid "Retraction Distance" +#~ msgstr "Величина отката" + +#~ msgctxt "retraction_amount description" +#~ msgid "The length of material retracted during a retraction move." +#~ msgstr "Длина нить, которая будет извлечена по время отката." + +#~ msgctxt "retraction_speed label" +#~ msgid "Retraction Speed" +#~ msgstr "Скорость отката" + +#~ msgctxt "retraction_speed description" +#~ msgid "" +#~ "The speed at which the filament is retracted and primed during a " +#~ "retraction move." +#~ msgstr "" +#~ "Скорость с которой нить будет извлечена и возвращена обратно при откате." + +#~ msgctxt "retraction_retract_speed label" +#~ msgid "Retraction Retract Speed" +#~ msgstr "Скорость извлечения при откате" + +#~ msgctxt "retraction_retract_speed description" +#~ msgid "" +#~ "The speed at which the filament is retracted during a retraction move." +#~ msgstr "Скорость с которой нить будет извлечена при откате." + +#~ msgctxt "retraction_prime_speed label" +#~ msgid "Retraction Prime Speed" +#~ msgstr "Скорость возврата при откате" + +#~ msgctxt "retraction_prime_speed description" +#~ msgid "The speed at which the filament is primed during a retraction move." +#~ msgstr "Скорость с которой нить будет возвращена при откате." + +#~ msgctxt "retraction_extra_prime_amount label" +#~ msgid "Retraction Extra Prime Amount" +#~ msgstr "Дополнительно возвращаемый объем при откате" + +#~ msgctxt "retraction_extra_prime_amount description" +#~ msgid "" +#~ "Some material can ooze away during a travel move, which can be " +#~ "compensated for here." +#~ msgstr "" +#~ "Небольшое количество материала может выдавится во время движение, что " +#~ "может быть скомпенсировано с помощью данного параметра." + +#~ msgctxt "retraction_min_travel label" +#~ msgid "Retraction Minimum Travel" +#~ msgstr "Минимальное перемещение при откате" + +#~ msgctxt "retraction_min_travel description" +#~ msgid "" +#~ "The minimum distance of travel needed for a retraction to happen at all. " +#~ "This helps to get fewer retractions in a small area." +#~ msgstr "" +#~ "Минимальное расстояние на которое необходимо переместиться для отката, " +#~ "чтобы он произошёл. Этот параметр помогает уменьшить количество откатов " +#~ "на небольшой области печати." + +#~ msgctxt "retraction_count_max label" +#~ msgid "Maximum Retraction Count" +#~ msgstr "Максимальное количество откатов" + +#~ msgctxt "retraction_count_max description" +#~ msgid "" +#~ "This setting limits the number of retractions occurring within the " +#~ "minimum extrusion distance window. Further retractions within this window " +#~ "will be ignored. This avoids retracting repeatedly on the same piece of " +#~ "filament, as that can flatten the filament and cause grinding issues." +#~ msgstr "" +#~ "Данный параметр ограничивает число откатов, которые происходят внутри " +#~ "окна минимальной дистанции экструзии. Дальнейшие откаты внутри этого окна " +#~ "будут проигнорированы. Это исключает выполнение множества повторяющихся " +#~ "откатов над одним и тем же участком нити, что позволяет избежать проблем " +#~ "с истиранием нити." + +#~ msgctxt "retraction_extrusion_window label" +#~ msgid "Minimum Extrusion Distance Window" +#~ msgstr "Окно минимальной расстояния экструзии" + +#~ msgctxt "retraction_extrusion_window description" +#~ msgid "" +#~ "The window in which the maximum retraction count is enforced. This value " +#~ "should be approximately the same as the retraction distance, so that " +#~ "effectively the number of times a retraction passes the same patch of " +#~ "material is limited." +#~ msgstr "" +#~ "Окно, в котором может быть выполнено максимальное количество откатов. Это " +#~ "значение приблизительно должно совпадать с расстоянием отката таким " +#~ "образом, чтобы количество выполненных откатов распределялось на величину " +#~ "выдавленного материала." + +#~ msgctxt "retraction_hop label" +#~ msgid "Z Hop when Retracting" +#~ msgstr "Поднятие оси Z при откате" + +#~ msgctxt "retraction_hop description" +#~ msgid "" +#~ "Whenever a retraction is done, the build plate is lowered to create " +#~ "clearance between the nozzle and the print. It prevents the nozzle from " +#~ "hitting the print during travel moves, reducing the chance to knock the " +#~ "print from the build plate." +#~ msgstr "" +#~ "При выполнении отката между соплом и печатаемой деталью создаётся зазор. " +#~ "Это предотвращает возможность касания сопла частей детали при его " +#~ "перемещении, снижая вероятность смещения детали на столе." + +#~ msgctxt "speed label" +#~ msgid "Speed" +#~ msgstr "Скорость" + +#~ msgctxt "speed_print label" +#~ msgid "Print Speed" +#~ msgstr "Скорость печати" + +#~ msgctxt "speed_print description" +#~ msgid "The speed at which printing happens." +#~ msgstr "Скорость, на которой происходит печать." + +#~ msgctxt "speed_infill label" +#~ msgid "Infill Speed" +#~ msgstr "Скорость заполнения" + +#~ msgctxt "speed_infill description" +#~ msgid "The speed at which infill is printed." +#~ msgstr "Скорость, на которой печатается заполнение." + +#~ msgctxt "speed_wall label" +#~ msgid "Wall Speed" +#~ msgstr "Скорость печати стенок" + +#~ msgctxt "speed_wall description" +#~ msgid "The speed at which the walls are printed." +#~ msgstr "Скорость, на которой происходит печать стенок." + +#~ msgctxt "speed_wall_0 label" +#~ msgid "Outer Wall Speed" +#~ msgstr "Скорость печати внешней стенки" + +#~ msgctxt "speed_wall_0 description" +#~ msgid "" +#~ "The speed at which the outermost walls are printed. Printing the outer " +#~ "wall at a lower speed improves the final skin quality. However, having a " +#~ "large difference between the inner wall speed and the outer wall speed " +#~ "will effect quality in a negative way." +#~ msgstr "" +#~ "Скорость, на которой происходит печать внешних стенок. Печать внешней " +#~ "стенки на пониженной скорость улучшает качество поверхности модели. " +#~ "Однако, при большой разнице между скоростями печати внутренних стенок и " +#~ "внешних возникает эффект, негативно влияющий на качество." + +#~ msgctxt "speed_wall_x label" +#~ msgid "Inner Wall Speed" +#~ msgstr "Скорость печати внутренних стенок" + +#~ msgctxt "speed_wall_x description" +#~ msgid "" +#~ "The speed at which all inner walls are printed Printing the inner wall " +#~ "faster than the outer wall will reduce printing time. It works well to " +#~ "set this in between the outer wall speed and the infill speed." +#~ msgstr "" +#~ "Скорость, на которой происходит печать внутренних стенок. Печать " +#~ "внутренних стенок на скорости, больше скорости печати внешней стенки, " +#~ "ускоряет печать. Отлично работает, если скорость находится между " +#~ "скоростями печати внешней стенки и скорости заполнения." + +#~ msgctxt "speed_topbottom label" +#~ msgid "Top/Bottom Speed" +#~ msgstr "Скорость крышки/дна" + +#~ msgctxt "speed_topbottom description" +#~ msgid "The speed at which top/bottom layers are printed." +#~ msgstr "Скорость, на которой печатаются слои крышки/дна." + +#~ msgctxt "speed_support label" +#~ msgid "Support Speed" +#~ msgstr "Скорость печати поддержек" + +#~ msgctxt "speed_support description" +#~ msgid "" +#~ "The speed at which the support structure is printed. Printing support at " +#~ "higher speeds can greatly reduce printing time. The surface quality of " +#~ "the support structure is not important since it is removed after printing." +#~ msgstr "" +#~ "Скорость, на которой происходит печать структуры поддержек. Печать " +#~ "поддержек на повышенной скорости может значительно уменьшить время " +#~ "печати. Качество поверхности структуры поддержек не имеет значения, так " +#~ "как эта структура будет удалена после печати." + +#~ msgctxt "speed_support_lines label" +#~ msgid "Support Wall Speed" +#~ msgstr "Скорость печати стенок поддержки" + +#~ msgctxt "speed_support_lines description" +#~ msgid "" +#~ "The speed at which the walls of support are printed. Printing the walls " +#~ "at lower speeds improves stability." +#~ msgstr "" +#~ "Скорость, на которой печатаются стенки поддержек. Печать стенок на " +#~ "пониженных скоростях улучшает стабильность." + +#~ msgctxt "speed_support_roof label" +#~ msgid "Support Roof Speed" +#~ msgstr "Скорость печати крыши поддержек" + +#~ msgctxt "speed_support_roof description" +#~ msgid "" +#~ "The speed at which the roofs of support are printed. Printing the support " +#~ "roof at lower speeds can improve overhang quality." +#~ msgstr "" +#~ "Скорость, на которой происходит печать крыши поддержек. Печать крыши " +#~ "поддержек на пониженных скоростях может улучшить качество печати " +#~ "нависающих краёв модели." + +#~ msgctxt "speed_travel label" +#~ msgid "Travel Speed" +#~ msgstr "Скорость перемещения" + +#~ msgctxt "speed_travel description" +#~ msgid "The speed at which travel moves are made." +#~ msgstr "Скорость, с которой выполняется перемещение." + +#~ msgctxt "speed_layer_0 label" +#~ msgid "Initial Layer Speed" +#~ msgstr "Скорость первого слоя" + +#~ msgctxt "speed_layer_0 description" +#~ msgid "" +#~ "The print speed for the initial layer. A lower value is advised to " +#~ "improve adhesion to the build plate." +#~ msgstr "" +#~ "Скорость печати первого слоя. Пониженное значение помогает улучшить " +#~ "прилипание материала к столу." + +#~ msgctxt "skirt_speed label" +#~ msgid "Skirt Speed" +#~ msgstr "Скорость печати юбки" + +#~ msgctxt "skirt_speed description" +#~ msgid "" +#~ "The speed at which the skirt and brim are printed. Normally this is done " +#~ "at the initial layer speed, but sometimes you might want to print the " +#~ "skirt at a different speed." +#~ msgstr "" +#~ "Скорость, на которой происходит печать юбки и каймы. Обычно, их печать " +#~ "происходит на скорости печати первого слоя, но иногда вам может " +#~ "потребоваться печатать юбку на другой скорости." + +#~ msgctxt "speed_slowdown_layers label" +#~ msgid "Number of Slower Layers" +#~ msgstr "Количество медленных слоёв" + +#~ msgctxt "speed_slowdown_layers description" +#~ msgid "" +#~ "The first few layers are printed slower than the rest of the object, to " +#~ "get better adhesion to the build plate and improve the overall success " +#~ "rate of prints. The speed is gradually increased over these layers." +#~ msgstr "" +#~ "Первые несколько слоёв печатаются на медленной скорости, чем весь " +#~ "остальной объект, чтобы получить лучшее прилипание к столу и увеличить " +#~ "вероятность успешной печати. Скорость последовательно увеличивается по " +#~ "мере печати указанного количества слоёв." + +#~ msgctxt "travel label" +#~ msgid "Travel" +#~ msgstr "Перемещение" + +#~ msgctxt "retraction_combing label" +#~ msgid "Enable Combing" +#~ msgstr "Разрешить комбинг" + +#~ msgctxt "retraction_combing description" +#~ msgid "" +#~ "Combing keeps the nozzle within already printed areas when traveling. " +#~ "This results in slightly longer travel moves but reduces the need for " +#~ "retractions. If combing is disabled, the material will retract and the " +#~ "nozzle moves in a straight line to the next point." +#~ msgstr "" +#~ "Комбинг удерживает при перемещении сопло внутри уже напечатанных зон. Это " +#~ "выражается в небольшом увеличении пути, но уменьшает необходимость в " +#~ "откатах. При отключенном комбинге выполняется откат и сопло передвигается " +#~ "в следующую точку по прямой." + +#~ msgctxt "travel_avoid_other_parts label" +#~ msgid "Avoid Printed Parts" +#~ msgstr "Избегать напечатанных частей" + +#~ msgctxt "travel_avoid_other_parts description" +#~ msgid "" +#~ "The nozzle avoids already printed parts when traveling. This option is " +#~ "only available when combing is enabled." +#~ msgstr "" +#~ "Сопло избегает уже напечатанных частей при перемещении. Эта опция " +#~ "доступна только при включенном комбинге." + +#~ msgctxt "travel_avoid_distance label" +#~ msgid "Avoid Distance" +#~ msgstr "Дистанция обхода" + +#~ msgctxt "travel_avoid_distance description" +#~ msgid "" +#~ "The distance between the nozzle and already printed parts when avoiding " +#~ "during travel moves." +#~ msgstr "" +#~ "Дистанция между соплом и уже напечатанными частями, выдерживаемая при " +#~ "перемещении." + +#~ msgctxt "coasting_enable label" +#~ msgid "Enable Coasting" +#~ msgstr "Разрешить накат" + +#~ msgctxt "cooling label" +#~ msgid "Cooling" +#~ msgstr "Охлаждение" + +#~ msgctxt "cool_fan_enabled label" +#~ msgid "Enable Cooling Fans" +#~ msgstr "Включить охлаждающие вентиляторы" + +#~ msgctxt "cool_fan_enabled description" +#~ msgid "" +#~ "Enables the cooling fans while printing. The fans improve print quality " +#~ "on layers with short layer times and bridging / overhangs." +#~ msgstr "" +#~ "Разрешает использование вентиляторов во время печати. Применение " +#~ "вентиляторов улучшает качество печати слоёв с малой площадью, а также " +#~ "мостов и нависаний." + +#~ msgctxt "cool_fan_speed label" +#~ msgid "Fan Speed" +#~ msgstr "Скорость вентилятора" + +#~ msgctxt "cool_fan_speed description" +#~ msgid "The speed at which the cooling fans spin." +#~ msgstr "Скорость, с которой вращается вентилятор." + +#~ msgctxt "cool_fan_speed_min label" +#~ msgid "Regular Fan Speed" +#~ msgstr "Обычная скорость вентилятора" + +#~ msgctxt "cool_fan_speed_min description" +#~ msgid "" +#~ "The speed at which the fans spin before hitting the threshold. When a " +#~ "layer prints faster than the threshold, the fan speed gradually inclines " +#~ "towards the maximum fan speed." +#~ msgstr "" +#~ "Скорость, с которой вращается вентилятор до достижения порога. Если слой " +#~ "печатается быстрее установленного порога, то вентилятор постепенно " +#~ "начинает вращаться быстрее." + +#~ msgctxt "cool_fan_speed_max label" +#~ msgid "Maximum Fan Speed" +#~ msgstr "Максимальная скорость вентилятора" + +#~ msgctxt "cool_fan_speed_max description" +#~ msgid "" +#~ "The speed at which the fans spin on the minimum layer time. The fan speed " +#~ "gradually increases between the regular fan speed and maximum fan speed " +#~ "when the threshold is hit." +#~ msgstr "" +#~ "Скорость, с которой вращается вентилятор при минимальной площади слоя. " +#~ "Если слой печатается быстрее установленного порога, то вентилятор " +#~ "постепенно начинает вращаться с указанной скоростью." + +#~ msgctxt "cool_min_layer_time_fan_speed_max label" +#~ msgid "Regular/Maximum Fan Speed Threshold" +#~ msgstr "Порог переключения на повышенную скорость" + +#~ msgctxt "cool_min_layer_time_fan_speed_max description" +#~ msgid "" +#~ "The layer time which sets the threshold between regular fan speed and " +#~ "maximum fan speed. Layers that print slower than this time use regular " +#~ "fan speed. For faster layers the fan speed gradually increases towards " +#~ "the maximum fan speed." +#~ msgstr "" +#~ "Время печати слоя, которое устанавливает порог для переключения с обычной " +#~ "скорости вращения вентилятора на максимальную. Слои, которые будут " +#~ "печататься дольше указанного значения, будут использовать обычную " +#~ "скорость вращения вентилятора. Для быстрых слоёв скорость вентилятора " +#~ "постепенно будет повышаться до максимальной." + +#~ msgctxt "cool_fan_full_at_height label" +#~ msgid "Regular Fan Speed at Height" +#~ msgstr "Обычная скорость вентилятора на высоте" + +#~ msgctxt "cool_fan_full_at_height description" +#~ msgid "" +#~ "The height at which the fans spin on regular fan speed. At the layers " +#~ "below the fan speed gradually increases from zero to regular fan speed." +#~ msgstr "" +#~ "Высота, на которой вентилятор должен вращаться с обыкновенной скорость. " +#~ "На более низких слоях вентилятор будет постепенно разгоняться с нуля до " +#~ "обычной скорости." + +#~ msgctxt "cool_fan_full_layer label" +#~ msgid "Regular Fan Speed at Layer" +#~ msgstr "Обычная скорость вентилятора на слое" + +#~ msgctxt "cool_fan_full_layer description" +#~ msgid "" +#~ "The layer at which the fans spin on regular fan speed. If regular fan " +#~ "speed at height is set, this value is calculated and rounded to a whole " +#~ "number." +#~ msgstr "" +#~ "Слой, на котором вентилятор должен вращаться с обыкновенной скорость. " +#~ "Если определена обычная скорость для вентилятора на высоте, это значение " +#~ "вычисляется и округляется до целого." + +#~ msgctxt "cool_min_layer_time label" +#~ msgid "Minimum Layer Time" +#~ msgstr "Минимальное время слоя" + +#~ msgctxt "cool_min_layer_time description" +#~ msgid "" +#~ "The minimum time spent in a layer. This forces the printer to slow down, " +#~ "to at least spend the time set here in one layer. This allows the printed " +#~ "material to cool down properly before printing the next layer." +#~ msgstr "" +#~ "Минимальное время затрачиваемое на печать слоя. Эта величина заставляет " +#~ "принтер замедлится, чтобы уложиться в указанное время при печати слоя. " +#~ "Это позволяет материалу остыть до нужной температуры перед печатью " +#~ "следующего слоя." + +#~ msgctxt "cool_min_speed label" +#~ msgid "Minimum Speed" +#~ msgstr "Минимальная скорость" + +#~ msgctxt "cool_min_speed description" +#~ msgid "" +#~ "The minimum print speed, despite slowing down due to the minimum layer " +#~ "time. When the printer would slow down too much, the pressure in the " +#~ "nozzle would be too low and result in bad print quality." +#~ msgstr "" +#~ "Минимальная скорость печати, независящая от замедления печати до " +#~ "минимального времени печати слоя. Если принтер начнёт слишком " +#~ "замедляться, давление в сопле будет слишком малым, что отрицательно " +#~ "скажется на качестве печати." + +#~ msgctxt "cool_lift_head label" +#~ msgid "Lift Head" +#~ msgstr "Подъём головы" + +#~ msgctxt "cool_lift_head description" +#~ msgid "" +#~ "When the minimum speed is hit because of minimum layer time, lift the " +#~ "head away from the print and wait the extra time until the minimum layer " +#~ "time is reached." +#~ msgstr "" +#~ "Когда будет произойдёт конфликт между параметрами минимальной скорости " +#~ "печати и минимальным временем печати слоя, голова принтера будет отведена " +#~ "от печатаемой модели и будет выдержана необходимая пауза для достижения " +#~ "минимального времени печати слоя." + +#~ msgctxt "draft_shield_enabled label" +#~ msgid "Enable Draft Shield" +#~ msgstr "Разрешить печать кожуха" + +#~ msgctxt "draft_shield_enabled description" +#~ msgid "" +#~ "This will create a wall around the object, which traps (hot) air and " +#~ "shields against exterior airflow. Especially useful for materials which " +#~ "warp easily." +#~ msgstr "" +#~ "Создаёт стенку вокруг объекта, которая удерживает (горячий) воздух и " +#~ "препятствует обдуву модели внешним воздушным потоком. Очень пригодится " +#~ "для материалов, которые легко деформируются." + +#~ msgctxt "draft_shield_dist label" +#~ msgid "Draft Shield X/Y Distance" +#~ msgstr "Дистанция X/Y до кожуха" + +#~ msgctxt "draft_shield_dist description" +#~ msgid "Distance of the draft shield from the print, in the X/Y directions." +#~ msgstr "Дистанция до стенки кожуха от модели, по осям X/Y." + +#~ msgctxt "draft_shield_height_limitation label" +#~ msgid "Draft Shield Limitation" +#~ msgstr "Ограничение кожуха" + +#~ msgctxt "draft_shield_height_limitation description" +#~ msgid "" +#~ "Set the height of the draft shield. Choose to print the draft shield at " +#~ "the full height of the object or at a limited height." +#~ msgstr "" +#~ "Устанавливает высоту кожуха. Можно печать кожух высотой с модель или " +#~ "указать определённую высоту." + +#~ msgctxt "draft_shield_height_limitation option full" +#~ msgid "Full" +#~ msgstr "Полная" + +#~ msgctxt "draft_shield_height_limitation option limited" +#~ msgid "Limited" +#~ msgstr "Ограниченная" + +#~ msgctxt "draft_shield_height label" +#~ msgid "Draft Shield Height" +#~ msgstr "Высота кожуха" + +#~ msgctxt "draft_shield_height description" +#~ msgid "" +#~ "Height limitation of the draft shield. Above this height no draft shield " +#~ "will be printed." +#~ msgstr "" +#~ "Ограничение по высоте для кожуха. Выше указанного значение кожух " +#~ "печататься не будет." + +#~ msgctxt "support label" +#~ msgid "Support" +#~ msgstr "Поддержки" + +#~ msgctxt "support_enable label" +#~ msgid "Enable Support" +#~ msgstr "Разрешить поддержки" + +#~ msgctxt "support_enable description" +#~ msgid "" +#~ "Enable support structures. These structures support parts of the model " +#~ "with severe overhangs." +#~ msgstr "" +#~ "Разрешить печать поддержек. Такие структуры поддерживают части моделей со " +#~ "значительными навесаниями." + +#~ msgctxt "support_type label" +#~ msgid "Placement" +#~ msgstr "Размещение" + +#~ msgctxt "support_type description" +#~ msgid "" +#~ "Adjusts the placement of the support structures. The placement can be set " +#~ "to touching build plate or everywhere. When set to everywhere the support " +#~ "structures will also be printed on the model." +#~ msgstr "" +#~ "Настраивает размещение структур поддержки. Размещение может быть выбрано " +#~ "с касанием стола и везде. Для последнего случая структуры поддержки " +#~ "печатаются даже на самой модели." + +#~ msgctxt "support_type option buildplate" +#~ msgid "Touching Buildplate" +#~ msgstr "От стола" + +#~ msgctxt "support_type option everywhere" +#~ msgid "Everywhere" +#~ msgstr "Везде" + +#~ msgctxt "support_angle label" +#~ msgid "Overhang Angle" +#~ msgstr "Угол нависания" + +#~ msgctxt "support_angle description" +#~ msgid "" +#~ "The minimum angle of overhangs for which support is added. At a value of " +#~ "0° all overhangs are supported, 90° will not provide any support." +#~ msgstr "" +#~ "Минимальный угол нависания при котором добавляются поддержки. При " +#~ "значении в 0° все нависания обеспечиваются поддержками, при 90° не " +#~ "получат никаких поддержек." + +#~ msgctxt "support_pattern label" +#~ msgid "Support Pattern" +#~ msgstr "Шаблон поддержек" + +#~ msgctxt "support_pattern description" +#~ msgid "" +#~ "The pattern of the support structures of the print. The different options " +#~ "available result in sturdy or easy to remove support." +#~ msgstr "" +#~ "Шаблон печатаемой структуры поддержек. Имеющиеся варианты отличаются " +#~ "крепкостью или простотой удаления поддержек." + +#~ msgctxt "support_pattern option lines" +#~ msgid "Lines" +#~ msgstr "Линии" + +#~ msgctxt "support_pattern option grid" +#~ msgid "Grid" +#~ msgstr "Сетка" + +#~ msgctxt "support_pattern option triangles" +#~ msgid "Triangles" +#~ msgstr "Треугольники" + +#~ msgctxt "support_pattern option concentric" +#~ msgid "Concentric" +#~ msgstr "Концентрические" + +#~ msgctxt "support_pattern option zigzag" +#~ msgid "Zig Zag" +#~ msgstr "Зигзаг" + +#~ msgctxt "support_connect_zigzags label" +#~ msgid "Connect ZigZags" +#~ msgstr "Соединённый зигзаг" + +#~ msgctxt "support_connect_zigzags description" +#~ msgid "" +#~ "Connect the ZigZags. This will increase the strength of the zig zag " +#~ "support structure." +#~ msgstr "Соединяет зигзаги. Это увеличивает силу такой поддержки." + +#~ msgctxt "support_infill_rate label" +#~ msgid "Support Density" +#~ msgstr "Плотность поддержек" + +#~ msgctxt "support_infill_rate description" +#~ msgid "" +#~ "Adjusts the density of the support structure. A higher value results in " +#~ "better overhangs, but the supports are harder to remove." +#~ msgstr "" +#~ "Настраивает плотность структуры поддержек. Более высокое значение " +#~ "приводит к улучшению качества навесов, но такие поддержки сложнее удалять." + +#~ msgctxt "support_line_distance label" +#~ msgid "Support Line Distance" +#~ msgstr "Дистанция между линиями поддержки" + +#~ msgctxt "support_line_distance description" +#~ msgid "" +#~ "Distance between the printed support structure lines. This setting is " +#~ "calculated by the support density." +#~ msgstr "" +#~ "Дистанция между напечатанными линями структуры поддержек. Этот параметр " +#~ "вычисляется по плотности поддержек." + +#~ msgctxt "support_xy_distance label" +#~ msgid "X/Y Distance" +#~ msgstr "Дистанция X/Y" + +#~ msgctxt "support_xy_distance description" +#~ msgid "" +#~ "Distance of the support structure from the print in the X/Y directions." +#~ msgstr "" +#~ "Расстояние между структурами поддержек и печатаемой модели по осям X/Y." + +#~ msgctxt "support_z_distance label" +#~ msgid "Z Distance" +#~ msgstr "Z дистанция" + +#~ msgctxt "support_z_distance description" +#~ msgid "" +#~ "Distance from the top/bottom of the support structure to the print. This " +#~ "gap provides clearance to remove the supports after the model is printed. " +#~ "This value is rounded down to a multiple of the layer height." +#~ msgstr "" +#~ "Расстояние между верхом/низом структуры поддержек и печатаемой моделью. " +#~ "Этот зазор упрощает последующее удаление поддержек. Это значение " +#~ "округляется вниз и кратно высоте слоя." + +#~ msgctxt "support_top_distance label" +#~ msgid "Top Distance" +#~ msgstr "Дистанция сверху" + +#~ msgctxt "support_top_distance description" +#~ msgid "Distance from the top of the support to the print." +#~ msgstr "Расстояние между верхом поддержек и печатаемой моделью." + +#~ msgctxt "support_bottom_distance label" +#~ msgid "Bottom Distance" +#~ msgstr "Дистанция снизу" + +#~ msgctxt "support_bottom_distance description" +#~ msgid "Distance from the print to the bottom of the support." +#~ msgstr "Расстояние между печатаемой моделью и низом поддержки." + +#~ msgctxt "support_bottom_stair_step_height description" +#~ msgid "" +#~ "The height of the steps of the stair-like bottom of support resting on " +#~ "the model. A low value makes the support harder to remove, but too high " +#~ "values can lead to unstable support structures." +#~ msgstr "" +#~ "Высота шагов лестнично-подобного низа поддержек, лежащих на модели. Малое " +#~ "значение усложняет последующее удаление поддержек, но слишком большое " +#~ "значение может сделать структуру поддержек нестабильной." + +#~ msgctxt "support_join_distance label" +#~ msgid "Join Distance" +#~ msgstr "Дистанция объединения" + +#~ msgctxt "support_join_distance description" +#~ msgid "" +#~ "The maximum distance between support structures in the X/Y directions. " +#~ "When seperate structures are closer together than this value, the " +#~ "structures merge into one." +#~ msgstr "" +#~ "Максимальное расстояние между структурами поддержки по осям X/Y. Если " +#~ "отдельные структуры находятся ближе, чем определено данным значением, то " +#~ "такие структуры объединяются в одну." + +#~ msgctxt "support_offset description" +#~ msgid "" +#~ "Amount of offset applied to all support polygons in each layer. Positive " +#~ "values can smooth out the support areas and result in more sturdy support." +#~ msgstr "" +#~ "Величина смещения, применяемая ко всем полигонам поддержки в каждом слое. " +#~ "Положительные значения могут сглаживать зоны поддержки и приводить к " +#~ "укреплению структур поддержек." + +#~ msgctxt "support_area_smoothing label" +#~ msgid "Area Smoothing" +#~ msgstr "Сглаживание зон" + +#~ msgctxt "support_area_smoothing description" +#~ msgid "" +#~ "Maximum distance in the X/Y directions of a line segment which is to be " +#~ "smoothed out. Ragged lines are introduced by the join distance and " +#~ "support bridge, which cause the machine to resonate. Smoothing the " +#~ "support areas won't cause them to break with the constraints, except it " +#~ "might change the overhang." +#~ msgstr "" +#~ "Максимальное расстояние по осям X/Y в сегменте линии, которая подлежит " +#~ "сглаживанию. Неровные линии появляются при дистанции объединения и " +#~ "поддержке в виде моста, что заставляет принтер резонировать. Сглаживание " +#~ "зон поддержек не приводит к нарушению ограничений, кроме возможных " +#~ "изменений в навесаниях." + +#~ msgctxt "support_roof_enable label" +#~ msgid "Enable Support Roof" +#~ msgstr "Разрешить крышу" + +#~ msgctxt "support_roof_enable description" +#~ msgid "" +#~ "Generate a dense top skin at the top of the support on which the model is " +#~ "printed." +#~ msgstr "" +#~ "Генерировать плотную поверхность наверху структуры поддержек на которой " +#~ "будет печататься модель." + +#~ msgctxt "support_roof_height label" +#~ msgid "Support Roof Thickness" +#~ msgstr "Толщина крыши" + +#~ msgctxt "support_roof_height description" +#~ msgid "The thickness of the support roofs." +#~ msgstr "Толщина поддерживающей крыши." + +#~ msgctxt "support_roof_density label" +#~ msgid "Support Roof Density" +#~ msgstr "Плотность крыши" + +#~ msgctxt "support_roof_density description" +#~ msgid "" +#~ "Adjusts the density of the roof of the support structure. A higher value " +#~ "results in better overhangs, but the supports are harder to remove." +#~ msgstr "" +#~ "Настройте плотность крыши структуры поддержек. Большее значение приведёт " +#~ "к лучшим навесам, но такие поддержки будет труднее удалять." + +#~ msgctxt "support_roof_line_distance label" +#~ msgid "Support Roof Line Distance" +#~ msgstr "Дистанция линии крыши" + +#~ msgctxt "support_roof_line_distance description" +#~ msgid "" +#~ "Distance between the printed support roof lines. This setting is " +#~ "calculated by the support roof Density, but can be adjusted separately." +#~ msgstr "" +#~ "Расстояние между линиями поддерживающей крыши. Этот параметр вычисляется " +#~ "из плотности поддерживающей крыши, но также может быть указан " +#~ "самостоятельно." + +#~ msgctxt "support_roof_pattern label" +#~ msgid "Support Roof Pattern" +#~ msgstr "Шаблон поддерживающей крыши" + +#~ msgctxt "support_roof_pattern description" +#~ msgid "The pattern with which the top of the support is printed." +#~ msgstr "" +#~ "Шаблон, который будет использоваться для печати верхней части поддержек." + +#~ msgctxt "support_roof_pattern option lines" +#~ msgid "Lines" +#~ msgstr "Линии" + +#~ msgctxt "support_roof_pattern option grid" +#~ msgid "Grid" +#~ msgstr "Сетка" + +#~ msgctxt "support_roof_pattern option triangles" +#~ msgid "Triangles" +#~ msgstr "Треугольники" + +#~ msgctxt "support_roof_pattern option concentric" +#~ msgid "Concentric" +#~ msgstr "Концентрический" + +#~ msgctxt "support_roof_pattern option zigzag" +#~ msgid "Zig Zag" +#~ msgstr "Зигзаг" + +#~ msgctxt "support_conical_enabled label" +#~ msgid "Conical Support" +#~ msgstr "Конические поддержки" + +#~ msgctxt "support_conical_enabled description" +#~ msgid "" +#~ "Experimental feature: Make support areas smaller at the bottom than at " +#~ "the overhang." +#~ msgstr "" +#~ "Экспериментальная возможность: Нижняя часть поддержек становится меньше, " +#~ "чем верхняя." + +#~ msgctxt "support_conical_angle label" +#~ msgid "Cone Angle" +#~ msgstr "Угол конуса" + +#~ msgctxt "support_conical_angle description" +#~ msgid "" +#~ "The angle of the tilt of conical support. With 0 degrees being vertical, " +#~ "and 90 degrees being horizontal. Smaller angles cause the support to be " +#~ "more sturdy, but consist of more material. Negative angles cause the base " +#~ "of the support to be wider than the top." +#~ msgstr "" +#~ "Угол наклона конических поддержек. При 0 градусах поддержки будут " +#~ "вертикальными, при 90 градусах будут горизонтальными. Меньшее значение " +#~ "углов укрепляет поддержки, но требует больше материала для них. " +#~ "Отрицательные углы приводят утолщению основания поддержек по сравнению с " +#~ "их верхней частью." + +#~ msgctxt "support_conical_min_width label" +#~ msgid "Cone Minimal Width" +#~ msgstr "Минимальная ширина конуса" + +#~ msgctxt "support_conical_min_width description" +#~ msgid "" +#~ "Minimal width to which the base of the conical support area is reduced. " +#~ "Small widths can lead to unstable support structures." +#~ msgstr "" +#~ "Минимальная ширина, до которой может быть уменьшен низ конуса. Малая " +#~ "ширина может сделать такую структуру поддержек нестабильной." + +#~ msgctxt "support_use_towers label" +#~ msgid "Use Towers" +#~ msgstr "Использовать башни" + +#~ msgctxt "support_use_towers description" +#~ msgid "" +#~ "Use specialized towers to support tiny overhang areas. These towers have " +#~ "a larger diameter than the region they support. Near the overhang the " +#~ "towers' diameter decreases, forming a roof." +#~ msgstr "" +#~ "Использование специальных башен для поддержки крошечных нависающих " +#~ "областей. Такие башни имеют диаметр больший, чем поддерживаемый ими " +#~ "регион. Вблизи навесов диаметр башен увеличивается, формируя крышу." + +#~ msgctxt "support_tower_diameter label" +#~ msgid "Tower Diameter" +#~ msgstr "Диаметр башен" + +#~ msgctxt "support_tower_diameter description" +#~ msgid "The diameter of a special tower." +#~ msgstr "Диаметр специальных башен." + +#~ msgctxt "support_minimal_diameter label" +#~ msgid "Minimum Diameter" +#~ msgstr "Минимальный диаметр." + +#~ msgctxt "support_minimal_diameter description" +#~ msgid "" +#~ "Minimum diameter in the X/Y directions of a small area which is to be " +#~ "supported by a specialized support tower." +#~ msgstr "" +#~ "Минимальный диаметр по осям X/Y небольшой области, которая будет " +#~ "поддерживаться с помощью специальных башен." + +#~ msgctxt "support_tower_roof_angle label" +#~ msgid "Tower Roof Angle" +#~ msgstr "Угол крыши башен" + +#~ msgctxt "support_tower_roof_angle description" +#~ msgid "" +#~ "The angle of a rooftop of a tower. A higher value results in pointed " +#~ "tower roofs, a lower value results in flattened tower roofs." +#~ msgstr "" +#~ "Угол верхней части башен. Большие значения приводят уменьшению площади " +#~ "крыши, меньшие наоборот делают крышу плоской." + +#~ msgctxt "adhesion_type label" +#~ msgid "Type" +#~ msgstr "Тип" + +#~ msgctxt "adhesion_type description" +#~ msgid "" +#~ "Different options that help to improve both priming your extrusion and " +#~ "adhesion to the build plate. Brim adds a single layer flat area around " +#~ "the base of your object to prevent warping. Raft adds a thick grid with a " +#~ "roof below the object. Skirt is a line printed around the object, but not " +#~ "connected to the model." +#~ msgstr "" +#~ "Различные варианты, которы помогают улучшить прилипание пластика к столу. " +#~ "Кайма добавляет однослойную плоскую область вокруг основания печатаемого " +#~ "объекта, предотвращая его деформацию. Подложка добавляет толстую сетку с " +#~ "крышей под объект. Юбка - это линия, печатаемая вокруг объекта, но не " +#~ "соединённая с моделью." + +#~ msgctxt "adhesion_type option skirt" +#~ msgid "Skirt" +#~ msgstr "Юбка" + +#~ msgctxt "adhesion_type option brim" +#~ msgid "Brim" +#~ msgstr "Кайма" + +#~ msgctxt "adhesion_type option raft" +#~ msgid "Raft" +#~ msgstr "Подложка" + +#~ msgctxt "skirt_line_count label" +#~ msgid "Skirt Line Count" +#~ msgstr "Количество линий юбки" + +#~ msgctxt "skirt_line_count description" +#~ msgid "" +#~ "Multiple skirt lines help to prime your extrusion better for small " +#~ "objects. Setting this to 0 will disable the skirt." +#~ msgstr "" +#~ "Несколько линий юбки помогают лучше начать укладывание материала при " +#~ "печати небольших объектов. Установка этого параметра в 0 отключает печать " +#~ "юбки." + +#~ msgctxt "skirt_gap label" +#~ msgid "Skirt Distance" +#~ msgstr "Дистанция до юбки" + +#~ msgctxt "skirt_gap description" +#~ msgid "" +#~ "The horizontal distance between the skirt and the first layer of the " +#~ "print.\n" +#~ "This is the minimum distance, multiple skirt lines will extend outwards " +#~ "from this distance." +#~ msgstr "" +#~ "Расстояние по горизонтали между юбкой и первым слоем печатаемого " +#~ "объекта.\n" +#~ "Это минимальное расстояние, следующие линии юбки будут печататься наружу." + +#~ msgctxt "skirt_minimal_length label" +#~ msgid "Skirt Minimum Length" +#~ msgstr "Минимальная длина юбки" + +#~ msgctxt "skirt_minimal_length description" +#~ msgid "" +#~ "The minimum length of the skirt. If this length is not reached by the " +#~ "skirt line count, more skirt lines will be added until the minimum length " +#~ "is reached. Note: If the line count is set to 0 this is ignored." +#~ msgstr "" +#~ "Минимальная длина печатаемой линии юбки. Если при печати юбки эта длина " +#~ "не будет выбрана, то будут добавляться дополнительные кольца юбки. " +#~ "Следует отметить, если количество линий юбки установлено в 0, то этот " +#~ "параметр игнорируется." + +#~ msgctxt "brim_width label" +#~ msgid "Brim Width" +#~ msgstr "Ширина каймы" + +#~ msgctxt "brim_width description" +#~ msgid "" +#~ "The distance from the model to the outermost brim line. A larger brim " +#~ "enhances adhesion to the build plate, but also reduces the effective " +#~ "print area." +#~ msgstr "" +#~ "Расстояние между моделью и самой удалённой линией каймы. Более широкая " +#~ "кайма увеличивает прилипание к столу, но также уменьшает эффективную " +#~ "область печати." + +#~ msgctxt "brim_line_count label" +#~ msgid "Brim Line Count" +#~ msgstr "Количество линий каймы" + +#~ msgctxt "brim_line_count description" +#~ msgid "" +#~ "The number of lines used for a brim. More brim lines enhance adhesion to " +#~ "the build plate, but also reduces the effective print area." +#~ msgstr "" +#~ "Количество линий, используемых для печати каймы. Большее количество линий " +#~ "каймы улучшает прилипание к столу, но уменьшает эффективную область " +#~ "печати." + +#~ msgctxt "raft_margin label" +#~ msgid "Raft Extra Margin" +#~ msgstr "Дополнительное поле подложки" + +#~ msgctxt "raft_margin description" +#~ msgid "" +#~ "If the raft is enabled, this is the extra raft area around the object " +#~ "which is also given a raft. Increasing this margin will create a stronger " +#~ "raft while using more material and leaving less area for your print." +#~ msgstr "Если подложка включена, это дополнительное поле вокруг объекта" + +#~ msgctxt "raft_airgap label" +#~ msgid "Raft Air-gap" +#~ msgstr "Воздушный зазор подложки" + +#~ msgctxt "raft_airgap description" +#~ msgid "" +#~ "The gap between the final raft layer and the first layer of the object. " +#~ "Only the first layer is raised by this amount to lower the bonding " +#~ "between the raft layer and the object. Makes it easier to peel off the " +#~ "raft." +#~ msgstr "" +#~ "Зазор между последним слоем подложки и первым слоем объекта. Первый слой " +#~ "объекта будет приподнят на указанное расстояние, чтобы уменьшить связь " +#~ "между слоем подложки и объекта. Упрощает процесс последующего отделения " +#~ "подложки." + +#~ msgctxt "raft_surface_layers label" +#~ msgid "Raft Top Layers" +#~ msgstr "Верхние слои подложки" + +#~ msgctxt "raft_surface_layers description" +#~ msgid "" +#~ "The number of top layers on top of the 2nd raft layer. These are fully " +#~ "filled layers that the object sits on. 2 layers result in a smoother top " +#~ "surface than 1." +#~ msgstr "" +#~ "Количество верхних слоёв над вторым слоем подложки. Это такие полностью " +#~ "заполненные слои, на которых размещается объект. Два слоя приводят к " +#~ "более гладкой поверхности чем один." + +#~ msgctxt "raft_surface_thickness label" +#~ msgid "Raft Top Layer Thickness" +#~ msgstr "Толщина верхнего слоя подложки" + +#~ msgctxt "raft_surface_thickness description" +#~ msgid "Layer thickness of the top raft layers." +#~ msgstr "Толщина верхних слоёв поддержки." + +#~ msgctxt "raft_surface_line_width label" +#~ msgid "Raft Top Line Width" +#~ msgstr "Ширина линий верха подложки" + +#~ msgctxt "raft_surface_line_width description" +#~ msgid "" +#~ "Width of the lines in the top surface of the raft. These can be thin " +#~ "lines so that the top of the raft becomes smooth." +#~ msgstr "" +#~ "Ширина линий верхних слоёв подложки. Это могут быть тонкие линии, которые " +#~ "делают подложку гладкой." + +#~ msgctxt "raft_surface_line_spacing label" +#~ msgid "Raft Top Spacing" +#~ msgstr "Дистанция между линиями верха поддержки" + +#~ msgctxt "raft_surface_line_spacing description" +#~ msgid "" +#~ "The distance between the raft lines for the top raft layers. The spacing " +#~ "should be equal to the line width, so that the surface is solid." +#~ msgstr "" +#~ "Расстояние между линиями подложки на её верхних слоёв. Расстояние должно " +#~ "быть равно ширине линии, тогда поверхность будет цельной." + +#~ msgctxt "raft_interface_thickness label" +#~ msgid "Raft Middle Thickness" +#~ msgstr "Толщина середины подложки" + +#~ msgctxt "raft_interface_thickness description" +#~ msgid "Layer thickness of the middle raft layer." +#~ msgstr "Толщина слоёв средних слоёв подложки." + +#~ msgctxt "raft_interface_line_width label" +#~ msgid "Raft Middle Line Width" +#~ msgstr "Ширина линий середины подложки" + +#~ msgctxt "raft_interface_line_width description" +#~ msgid "" +#~ "Width of the lines in the middle raft layer. Making the second layer " +#~ "extrude more causes the lines to stick to the bed." +#~ msgstr "" +#~ "Толщина линий средних слоёв подложки. Приводит к повышенному выдавливанию " +#~ "материала на втором слое, для лучшего прилипания к столу." + +#~ msgctxt "raft_interface_line_spacing label" +#~ msgid "Raft Middle Spacing" +#~ msgstr "Дистанция между слоями середины подложки" + +#~ msgctxt "raft_interface_line_spacing description" +#~ msgid "" +#~ "The distance between the raft lines for the middle raft layer. The " +#~ "spacing of the middle should be quite wide, while being dense enough to " +#~ "support the top raft layers." +#~ msgstr "" +#~ "Расстояние между линиями средних слоёв подложки. Дистанция в средних " +#~ "слоях должна быть достаточно широкой, чтобы создавать нужной плотность " +#~ "для поддержки верхних слоёв подложки." + +#~ msgctxt "raft_base_thickness label" +#~ msgid "Raft Base Thickness" +#~ msgstr "Толщина нижнего слоя подложки" + +#~ msgctxt "raft_base_thickness description" +#~ msgid "" +#~ "Layer thickness of the base raft layer. This should be a thick layer " +#~ "which sticks firmly to the printer bed." +#~ msgstr "" +#~ "Толщина нижнего слоя подложки. Она должна быть достаточно для хорошего " +#~ "прилипания подложки к столу." + +#~ msgctxt "raft_base_line_width label" +#~ msgid "Raft Base Line Width" +#~ msgstr "Ширина линии нижнего слоя подложки" + +#~ msgctxt "raft_base_line_width description" +#~ msgid "" +#~ "Width of the lines in the base raft layer. These should be thick lines to " +#~ "assist in bed adhesion." +#~ msgstr "" +#~ "Ширина линий нижнего слоя подложки. Она должна быть достаточной, чтобы " +#~ "улучшить прилипание к столу." + +#~ msgctxt "raft_base_line_spacing label" +#~ msgid "Raft Line Spacing" +#~ msgstr "Дистанция между линиями нижнего слоя" + +#~ msgctxt "raft_base_line_spacing description" +#~ msgid "" +#~ "The distance between the raft lines for the base raft layer. Wide spacing " +#~ "makes for easy removal of the raft from the build plate." +#~ msgstr "" +#~ "Расстояние между линиями нижнего слоя подложки. Большее значение упрощает " +#~ "снятие модели со стола." + +#~ msgctxt "raft_speed label" +#~ msgid "Raft Print Speed" +#~ msgstr "Скорость печати подложки" + +#~ msgctxt "raft_speed description" +#~ msgid "The speed at which the raft is printed." +#~ msgstr "Скорость, на которой печатается подложка." + +#~ msgctxt "raft_surface_speed label" +#~ msgid "Raft Surface Print Speed" +#~ msgstr "Скорость печати поверхности подложки" + +#~ msgctxt "raft_surface_speed description" +#~ msgid "" +#~ "The speed at which the surface raft layers are printed. These should be " +#~ "printed a bit slower, so that the nozzle can slowly smooth out adjacent " +#~ "surface lines." +#~ msgstr "" +#~ "Скорость, на которой печатается поверхность подложки. Поверхность должна " +#~ "печататься немного медленнее, чтобы сопло могло медленно разглаживать " +#~ "линии поверхности." + +#~ msgctxt "raft_interface_speed label" +#~ msgid "Raft Interface Print Speed" +#~ msgstr "Скорость печати связи подложки" + +#~ msgctxt "raft_interface_speed description" +#~ msgid "" +#~ "The speed at which the interface raft layer is printed. This should be " +#~ "printed quite slowly, as the volume of material coming out of the nozzle " +#~ "is quite high." +#~ msgstr "" +#~ "Скорость, на которой печатается связующий слой подложки. Она должна быть " +#~ "достаточно низкой, так как объём материала, выходящего из сопла, " +#~ "достаточно большой." + +#~ msgctxt "raft_base_speed label" +#~ msgid "Raft Base Print Speed" +#~ msgstr "Скорость печати низа подложки" + +#~ msgctxt "raft_base_speed description" +#~ msgid "" +#~ "The speed at which the base raft layer is printed. This should be printed " +#~ "quite slowly, as the volume of material coming out of the nozzle is quite " +#~ "high." +#~ msgstr "" +#~ "Скорость, на которой печатается нижний слой подложки. Она должна быть " +#~ "достаточно низкой, так как объём материала, выходящего из сопла, " +#~ "достаточно большой." + +#~ msgctxt "raft_fan_speed label" +#~ msgid "Raft Fan Speed" +#~ msgstr "Скорость вентилятора для подложки" + +#~ msgctxt "raft_fan_speed description" +#~ msgid "The fan speed for the raft." +#~ msgstr "Скорость вращения вентилятора при печати подложки." + +#~ msgctxt "raft_surface_fan_speed label" +#~ msgid "Raft Surface Fan Speed" +#~ msgstr "Скорость вентилятора для поверхности подложки" + +#~ msgctxt "raft_surface_fan_speed description" +#~ msgid "The fan speed for the surface raft layers." +#~ msgstr "" +#~ "Скорость вращения вентилятора при печати поверхности слоёв подложки." + +#~ msgctxt "raft_interface_fan_speed label" +#~ msgid "Raft Interface Fan Speed" +#~ msgstr "Скорость вентилятора для связующего слоя" + +#~ msgctxt "raft_interface_fan_speed description" +#~ msgid "The fan speed for the interface raft layer." +#~ msgstr "Скорость вращения вентилятора при печати связующего слоя подложки." + +#~ msgctxt "raft_base_fan_speed label" +#~ msgid "Raft Base Fan Speed" +#~ msgstr "Скорость вентилятора для низа подложки" + +#~ msgctxt "raft_base_fan_speed description" +#~ msgid "The fan speed for the base raft layer." +#~ msgstr "Скорость вентилятора при печати нижнего слоя подложки." + +#~ msgctxt "meshfix label" +#~ msgid "Mesh Fixes" +#~ msgstr "Ремонт объектов" + +#~ msgctxt "meshfix_union_all label" +#~ msgid "Union Overlapping Volumes" +#~ msgstr "Объединение перекрывающихся объёмов" + +#~ msgctxt "meshfix_union_all description" +#~ msgid "" +#~ "Ignore the internal geometry arising from overlapping volumes and print " +#~ "the volumes as one. This may cause internal cavities to disappear." +#~ msgstr "" +#~ "Игнорирование внутренней геометрии, возникшей при объединении объёмов и " +#~ "печать объёмов как единого целого. Это может привести к исчезновению " +#~ "внутренних поверхностей." + +#~ msgctxt "meshfix_union_all_remove_holes label" +#~ msgid "Remove All Holes" +#~ msgstr "Удаляет все отверстия" + +#~ msgctxt "meshfix_union_all_remove_holes description" +#~ msgid "" +#~ "Remove the holes in each layer and keep only the outside shape. This will " +#~ "ignore any invisible internal geometry. However, it also ignores layer " +#~ "holes which can be viewed from above or below." +#~ msgstr "" +#~ "Удаляет отверстия в каждом слое, оставляя только внешнюю форму. Вся " +#~ "невидимая внутренняя геометрия будет проигнорирована. Однако, также будут " +#~ "проигнорированы отверстия в слоях, которые могут быть видны сверху или " +#~ "снизу." + +#~ msgctxt "meshfix_extensive_stitching label" +#~ msgid "Extensive Stitching" +#~ msgstr "Обширное сшивание" + +#~ msgctxt "meshfix_extensive_stitching description" +#~ msgid "" +#~ "Extensive stitching tries to stitch up open holes in the mesh by closing " +#~ "the hole with touching polygons. This option can introduce a lot of " +#~ "processing time." +#~ msgstr "" +#~ "Обширное сшивание пытается сшить открытые отверстия в объекте, закрывая " +#~ "их полигонами. Эта опция может добавить дополнительное время во время " +#~ "обработки." + +#~ msgctxt "meshfix_keep_open_polygons label" +#~ msgid "Keep Disconnected Faces" +#~ msgstr "Сохранить отсоединённые поверхности" + +#~ msgctxt "meshfix_keep_open_polygons description" +#~ msgid "" +#~ "Normally Cura tries to stitch up small holes in the mesh and remove parts " +#~ "of a layer with big holes. Enabling this option keeps those parts which " +#~ "cannot be stitched. This option should be used as a last resort option " +#~ "when everything else fails to produce proper GCode." +#~ msgstr "" +#~ "Обычно Cura пытается закрыть небольшие отверстия в объекте и убрать части " +#~ "слоя с большими отверстиями. Включение этого параметра сохраняет те " +#~ "части, что не могут быть сшиты. Этот параметр должен использоваться как " +#~ "последний вариант, когда уже ничего не помогает получить нормальный GCode." + +#~ msgctxt "blackmagic label" +#~ msgid "Special Modes" +#~ msgstr "Специальные режимы" + +#~ msgctxt "print_sequence label" +#~ msgid "Print Sequence" +#~ msgstr "Последовательная печать" + +#~ msgctxt "print_sequence description" +#~ msgid "" +#~ "Whether to print all objects one layer at a time or to wait for one " +#~ "object to finish, before moving on to the next. One at a time mode is " +#~ "only possible if all models are separated in such a way that the whole " +#~ "print head can move in between and all models are lower than the distance " +#~ "between the nozzle and the X/Y axes." +#~ msgstr "" +#~ "Печатать ли все объекты послойно или каждый объект в отдельности. " +#~ "Отдельная печать возможно в случае, когда все модели разделены так, чтобы " +#~ "между ними могла проходить голова принтера и все модели ниже чем " +#~ "расстояние до осей X/Y." + +#~ msgctxt "print_sequence option all_at_once" +#~ msgid "All at Once" +#~ msgstr "Все за раз" + +#~ msgctxt "print_sequence option one_at_a_time" +#~ msgid "One at a Time" +#~ msgstr "По отдельности" + +#~ msgctxt "magic_mesh_surface_mode label" +#~ msgid "Surface Mode" +#~ msgstr "Поверхностный режим" + +#~ msgctxt "magic_mesh_surface_mode description" +#~ msgid "" +#~ "Print the surface instead of the volume. No infill, no top/bottom skin, " +#~ "just a single wall of which the middle coincides with the surface of the " +#~ "mesh. It's also possible to do both: print the insides of a closed volume " +#~ "as normal, but print all polygons not part of a closed volume as surface." +#~ msgstr "" +#~ "Печатать только поверхность. Никакого заполнения, никаких верхних нижних " +#~ "поверхностей, просто одна стенка, которая совпадает с поверхностью " +#~ "объекта. Позволяет делать и печать внутренностей закрытого объёма в виде " +#~ "нормалей, и печать всех полигонов, не входящих в закрытый объём, в виде " +#~ "поверхностей." + +#~ msgctxt "magic_mesh_surface_mode option normal" +#~ msgid "Normal" +#~ msgstr "Нормаль" + +#~ msgctxt "magic_mesh_surface_mode option surface" +#~ msgid "Surface" +#~ msgstr "Поверхность" + +#~ msgctxt "magic_mesh_surface_mode option both" +#~ msgid "Both" +#~ msgstr "Оба варианта" + +#~ msgctxt "magic_spiralize label" +#~ msgid "Spiralize Outer Contour" +#~ msgstr "Спирально печатать внешний контур" + +#~ msgctxt "magic_spiralize description" +#~ msgid "" +#~ "Spiralize smooths out the Z move of the outer edge. This will create a " +#~ "steady Z increase over the whole print. This feature turns a solid object " +#~ "into a single walled print with a solid bottom. This feature used to be " +#~ "called Joris in older versions." +#~ msgstr "" +#~ "Спирально сглаживать движение по оси Z, печатая внешний контур. Приводит " +#~ "к постоянному увеличению Z координаты во время печати. Этот параметр " +#~ "превращает твёрдый объект в одностенную модель с твёрдым дном. Раньше " +#~ "этот параметр назывался Joris." + +#~ msgctxt "experimental label" +#~ msgid "Experimental" +#~ msgstr "Экспериментальное" + +#~ msgctxt "magic_fuzzy_skin_enabled label" +#~ msgid "Fuzzy Skin" +#~ msgstr "Нечёткая поверхность" + +#~ msgctxt "magic_fuzzy_skin_enabled description" +#~ msgid "" +#~ "Randomly jitter while printing the outer wall, so that the surface has a " +#~ "rough and fuzzy look." +#~ msgstr "" +#~ "Вносит небольшое дрожание при печати внешней стенки, что придаёт " +#~ "поверхности шершавый вид." + +#~ msgctxt "magic_fuzzy_skin_thickness label" +#~ msgid "Fuzzy Skin Thickness" +#~ msgstr "Толщина шершавости" + +#~ msgctxt "magic_fuzzy_skin_thickness description" +#~ msgid "" +#~ "The width within which to jitter. It's advised to keep this below the " +#~ "outer wall width, since the inner walls are unaltered." +#~ msgstr "" +#~ "Величина амплитуды дрожания. Рекомендуется придерживаться толщины внешней " +#~ "стенки, так как внутренние стенки не изменяются." + +#~ msgctxt "magic_fuzzy_skin_point_density label" +#~ msgid "Fuzzy Skin Density" +#~ msgstr "Плотность шершавой стенки" + +#~ msgctxt "magic_fuzzy_skin_point_density description" +#~ msgid "" +#~ "The average density of points introduced on each polygon in a layer. Note " +#~ "that the original points of the polygon are discarded, so a low density " +#~ "results in a reduction of the resolution." +#~ msgstr "" +#~ "Средняя плотность точек, добавленных на каждом полигоне в слое. Следует " +#~ "отметить, что оригинальные точки полигона отбрасываются, следовательно " +#~ "низкая плотность приводит к уменьшению разрешения." + +#~ msgctxt "magic_fuzzy_skin_point_dist label" +#~ msgid "Fuzzy Skin Point Distance" +#~ msgstr "Дистанция между точками шершавости" + +#~ msgctxt "magic_fuzzy_skin_point_dist description" +#~ msgid "" +#~ "The average distance between the random points introduced on each line " +#~ "segment. Note that the original points of the polygon are discarded, so a " +#~ "high smoothness results in a reduction of the resolution. This value must " +#~ "be higher than half the Fuzzy Skin Thickness." +#~ msgstr "" +#~ "Среднее расстояние между случайными точками, который вносятся в каждый " +#~ "сегмент линии. Следует отметить, что оригинальные точки полигона " +#~ "отбрасываются, таким образом, сильное сглаживание приводит к уменьшению " +#~ "разрешения. Это значение должно быть больше половины толщины шершавости." + +#~ msgctxt "wireframe_enabled label" +#~ msgid "Wire Printing" +#~ msgstr "Нитевая печать" + +#~ msgctxt "wireframe_enabled description" +#~ msgid "" +#~ "Print only the outside surface with a sparse webbed structure, printing " +#~ "'in thin air'. This is realized by horizontally printing the contours of " +#~ "the model at given Z intervals which are connected via upward and " +#~ "diagonally downward lines." +#~ msgstr "" +#~ "Печатать только внешнюю поверхность с редкой перепончатой структурой, " +#~ "печатаемой \"прямо в воздухе\". Это реализуется горизонтальной печатью " +#~ "контуров модели с заданными Z интервалами, которые соединяются " +#~ "диагональными линиями." + +#~ msgctxt "wireframe_height label" +#~ msgid "WP Connection Height" +#~ msgstr "Высота соединений при нетевой печати" + +#~ msgctxt "wireframe_height description" +#~ msgid "" +#~ "The height of the upward and diagonally downward lines between two " +#~ "horizontal parts. This determines the overall density of the net " +#~ "structure. Only applies to Wire Printing." +#~ msgstr "" +#~ "Высота диагональных линий между горизонтальными частями. Она определяет " +#~ "общую плотность сетевой структуры. Применяется только при нитевой печати." + +#~ msgctxt "wireframe_printspeed label" +#~ msgid "WP speed" +#~ msgstr "Скорость нитевой печати" + +#~ msgctxt "wireframe_printspeed description" +#~ msgid "" +#~ "Speed at which the nozzle moves when extruding material. Only applies to " +#~ "Wire Printing." +#~ msgstr "" +#~ "Скорость с которой двигается сопло, выдавая материал. Применяется только " +#~ "при нитевой печати." + +#~ msgctxt "wireframe_printspeed_bottom label" +#~ msgid "WP Bottom Printing Speed" +#~ msgstr "Скорость печати низа" + +#~ msgctxt "wireframe_printspeed_bottom description" +#~ msgid "" +#~ "Speed of printing the first layer, which is the only layer touching the " +#~ "build platform. Only applies to Wire Printing." +#~ msgstr "" +#~ "Скорость, с которой печатается первый слой, касающийся стола. Применяется " +#~ "только при нитевой печати." + +#~ msgctxt "wireframe_printspeed_flat description" +#~ msgid "" +#~ "Speed of printing the horizontal contours of the object. Only applies to " +#~ "Wire Printing." +#~ msgstr "" +#~ "Скорость, с которой печатаются горизонтальные контуры объекта. " +#~ "Применяется только при нитевой печати." + +#~ msgctxt "wireframe_flow label" +#~ msgid "WP Flow" +#~ msgstr "Поток нитевой печати" + +#~ msgctxt "wireframe_flow description" +#~ msgid "" +#~ "Flow compensation: the amount of material extruded is multiplied by this " +#~ "value. Only applies to Wire Printing." +#~ msgstr "" +#~ "Компенсация потока: объём выдавленного материала умножается на это " +#~ "значение. Применяется только при нитевой печати." + +#~ msgctxt "wireframe_flow_connection label" +#~ msgid "WP Connection Flow" +#~ msgstr "Поток соединений при нитевой печати" + +#~ msgctxt "wireframe_flow_connection description" +#~ msgid "" +#~ "Flow compensation when going up or down. Only applies to Wire Printing." +#~ msgstr "" +#~ "Компенсация потока при движении вверх и вниз. Применяется только при " +#~ "нитевой печати." + +#~ msgctxt "wireframe_flow_flat label" +#~ msgid "WP Flat Flow" +#~ msgstr "Поток горизонтальных линий" + +#~ msgctxt "wireframe_flow_flat description" +#~ msgid "" +#~ "Flow compensation when printing flat lines. Only applies to Wire Printing." +#~ msgstr "" +#~ "Компенсация потока при печати плоских линий. Применяется только при " +#~ "нитевой печати." + +#~ msgctxt "wireframe_top_delay label" +#~ msgid "WP Top Delay" +#~ msgstr "Верхняя задержка при нитевой печати" + +#~ msgctxt "wireframe_top_delay description" +#~ msgid "" +#~ "Delay time after an upward move, so that the upward line can harden. Only " +#~ "applies to Wire Printing." +#~ msgstr "" +#~ "Задержка после движения вверх, чтобы такие линии были твёрже. Применяется " +#~ "только при нитевой печати." + +#~ msgctxt "wireframe_bottom_delay label" +#~ msgid "WP Bottom Delay" +#~ msgstr "Нижняя задержка при нитевой печати" + +#~ msgctxt "wireframe_bottom_delay description" +#~ msgid "Delay time after a downward move. Only applies to Wire Printing." +#~ msgstr "" +#~ "Задержка после движения вниз. Применяется только при нитевой печати." + +#~ msgctxt "wireframe_flat_delay label" +#~ msgid "WP Flat Delay" +#~ msgstr "Горизонтальная задержка при нитевой печати" + +#~ msgctxt "wireframe_flat_delay description" +#~ msgid "" +#~ "Delay time between two horizontal segments. Introducing such a delay can " +#~ "cause better adhesion to previous layers at the connection points, while " +#~ "too long delays cause sagging. Only applies to Wire Printing." +#~ msgstr "" +#~ "Задержка между двумя горизонтальными сегментами. Внесение такой задержки " +#~ "может улучшить прилипание к предыдущим слоям в местах соединений, в то " +#~ "время как более длинные задержки могут вызывать провисания. Применяется " +#~ "только при нитевой печати." + +#~ msgctxt "wireframe_up_half_speed description" +#~ msgid "" +#~ "Distance of an upward move which is extruded with half speed.\n" +#~ "This can cause better adhesion to previous layers, while not heating the " +#~ "material in those layers too much. Only applies to Wire Printing." +#~ msgstr "" +#~ "Расстояние движения вверх, при котором выдавливание идёт на половине " +#~ "скорости.\n" +#~ "Это может улучшить прилипание к предыдущим слоям, не перегревая материал " +#~ "тех слоёв. Применяется только при нитевой печати." + +#~ msgctxt "wireframe_top_jump label" +#~ msgid "WP Knot Size" +#~ msgstr "Размер узла при нитевой печати" + +#~ msgctxt "wireframe_top_jump description" +#~ msgid "" +#~ "Creates a small knot at the top of an upward line, so that the " +#~ "consecutive horizontal layer has a better chance to connect to it. Only " +#~ "applies to Wire Printing." +#~ msgstr "" +#~ "Создаёт небольшой узел наверху возвышающейся линии так, чтобы последующий " +#~ "горизонтальный слой имел больший шанс к присоединению. Применяется только " +#~ "при нитевой печати." + +#~ msgctxt "wireframe_fall_down label" +#~ msgid "WP Fall Down" +#~ msgstr "Падение нитевой печати" + +#~ msgctxt "wireframe_fall_down description" +#~ msgid "" +#~ "Distance with which the material falls down after an upward extrusion. " +#~ "This distance is compensated for. Only applies to Wire Printing." +#~ msgstr "" +#~ "Расстояние с которой материал падает вниз после восходящего выдавливания. " +#~ "Расстояние компенсируется. Применяется только при нитевой печати." + +#~ msgctxt "wireframe_drag_along label" +#~ msgid "WP Drag along" +#~ msgstr "Протягивание при нитевой печати" + +#~ msgctxt "wireframe_drag_along description" +#~ msgid "" +#~ "Distance with which the material of an upward extrusion is dragged along " +#~ "with the diagonally downward extrusion. This distance is compensated for. " +#~ "Only applies to Wire Printing." +#~ msgstr "" +#~ "Расстояние, на которое материал от восходящего выдавливания тянется во " +#~ "время нисходящего выдавливания. Расстояние компенсируется. Применяется " +#~ "только при нитевой печати." + +#~ msgctxt "wireframe_strategy label" +#~ msgid "WP Strategy" +#~ msgstr "Стратегия нитевой печати" + +#~ msgctxt "wireframe_strategy option compensate" +#~ msgid "Compensate" +#~ msgstr "Компенсация" + +#~ msgctxt "wireframe_strategy option knot" +#~ msgid "Knot" +#~ msgstr "Узел" + +#~ msgctxt "wireframe_strategy option retract" +#~ msgid "Retract" +#~ msgstr "Откат" + +#~ msgctxt "wireframe_straight_before_down description" +#~ msgid "" +#~ "Percentage of a diagonally downward line which is covered by a horizontal " +#~ "line piece. This can prevent sagging of the top most point of upward " +#~ "lines. Only applies to Wire Printing." +#~ msgstr "" +#~ "Процент диагонально нисходящей линии, которая покрывается куском " +#~ "горизонтальной линии. Это может предотвратить провисание самых верхних " +#~ "точек восходящих линий. Применяется только при нитевой печати." + +#~ msgctxt "wireframe_roof_fall_down description" +#~ msgid "" +#~ "The distance which horizontal roof lines printed 'in thin air' fall down " +#~ "when being printed. This distance is compensated for. Only applies to " +#~ "Wire Printing." +#~ msgstr "" +#~ "Расстояние, на котором линии горизонтальной крыши печатаются \"в воздухе" +#~ "\" подают вниз перед печатью. Расстояние компенсируется. Применяется " +#~ "только при нитевой печати." diff --git a/resources/i18n/ru/fdmprinter.def.json.po b/resources/i18n/ru/fdmprinter.def.json.po new file mode 100644 index 0000000000..d0ea639973 --- /dev/null +++ b/resources/i18n/ru/fdmprinter.def.json.po @@ -0,0 +1,5395 @@ +msgid "" +msgstr "" +"Project-Id-Version: Uranium json setting files\n" +"Report-Msgid-Bugs-To: http://github.com/ultimaker/uranium\n" +"POT-Creation-Date: 2017-01-06 16:14+0300\n" +"PO-Revision-Date: 2017-01-06 23:21+0300\n" +"Last-Translator: Ruslan Popov \n" +"Language-Team: \n" +"Language: ru_RU\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.8.11\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +#: fdmprinter.def.json +msgctxt "machine_settings label" +msgid "Machine" +msgstr "Принтер" + +#: fdmprinter.def.json +msgctxt "machine_settings description" +msgid "Machine specific settings" +msgstr "Параметры, относящиеся к принтеру" + +#: fdmprinter.def.json +msgctxt "machine_name label" +msgid "Machine Type" +msgstr "Тип принтера" + +#: fdmprinter.def.json +msgctxt "machine_name description" +msgid "The name of your 3D printer model." +msgstr "Название модели вашего 3D принтера" + +#: fdmprinter.def.json +msgctxt "machine_show_variants label" +msgid "Show machine variants" +msgstr "Показать варианты принтера" + +#: fdmprinter.def.json +msgctxt "machine_show_variants description" +msgid "" +"Whether to show the different variants of this machine, which are described " +"in separate json files." +msgstr "" +"Следует ли показывать различные варианты этого принтера, которые описаны в " +"отдельных JSON файлах." + +#: fdmprinter.def.json +msgctxt "machine_start_gcode label" +msgid "Start GCode" +msgstr "Начало G-кода" + +#: fdmprinter.def.json +msgctxt "machine_start_gcode description" +msgid "" +"Gcode commands to be executed at the very start - separated by \n" +"." +msgstr "" +"Команды в G-коде, которые будут выполнены при старте печати, разделённые \n" +"." + +#: fdmprinter.def.json +msgctxt "machine_end_gcode label" +msgid "End GCode" +msgstr "Конец G-кода" + +#: fdmprinter.def.json +msgctxt "machine_end_gcode description" +msgid "" +"Gcode commands to be executed at the very end - separated by \n" +"." +msgstr "" +"Команды в G-коде, которые будут выполнены в конце печати, разделённые \n" +"." + +#: fdmprinter.def.json +msgctxt "material_guid label" +msgid "Material GUID" +msgstr "GUID материала" + +#: fdmprinter.def.json +msgctxt "material_guid description" +msgid "GUID of the material. This is set automatically. " +msgstr "Идентификатор материала, устанавливается автоматически. " + +#: fdmprinter.def.json +msgctxt "material_bed_temp_wait label" +msgid "Wait for build plate heatup" +msgstr "Ожидать пока прогреется стол" + +#: fdmprinter.def.json +msgctxt "material_bed_temp_wait description" +msgid "" +"Whether to insert a command to wait until the build plate temperature is " +"reached at the start." +msgstr "" +"Следует ли добавлять команду ожидания прогрева стола до нужной температуры " +"перед началом печати." + +#: fdmprinter.def.json +msgctxt "material_print_temp_wait label" +msgid "Wait for nozzle heatup" +msgstr "Ожидать пока прогреется голова" + +#: fdmprinter.def.json +msgctxt "material_print_temp_wait description" +msgid "Whether to wait until the nozzle temperature is reached at the start." +msgstr "" +"Следует ли добавлять команду ожидания прогрева головы перед началом печати." + +#: fdmprinter.def.json +msgctxt "material_print_temp_prepend label" +msgid "Include material temperatures" +msgstr "Добавлять температуру из материала" + +#: fdmprinter.def.json +msgctxt "material_print_temp_prepend description" +msgid "" +"Whether to include nozzle temperature commands at the start of the gcode. " +"When the start_gcode already contains nozzle temperature commands Cura " +"frontend will automatically disable this setting." +msgstr "" +"Следует ли добавлять команды управления температурой сопла в начало G-кода. " +"Если в коде уже используются команды для управления температурой сопла, то " +"Cura автоматически проигнорирует этот параметр." + +#: fdmprinter.def.json +msgctxt "material_bed_temp_prepend label" +msgid "Include build plate temperature" +msgstr "Добавлять температуру стола" + +#: fdmprinter.def.json +msgctxt "material_bed_temp_prepend description" +msgid "" +"Whether to include build plate temperature commands at the start of the " +"gcode. When the start_gcode already contains build plate temperature " +"commands Cura frontend will automatically disable this setting." +msgstr "" +"Следует ли добавлять команды управления температурой стола в начало G-кода. " +"Если в коде уже используются команды для управления температурой стола, то " +"Cura автоматически проигнорирует этот параметр." + +#: fdmprinter.def.json +msgctxt "machine_width label" +msgid "Machine width" +msgstr "Ширина принтера" + +#: fdmprinter.def.json +msgctxt "machine_width description" +msgid "The width (X-direction) of the printable area." +msgstr "Ширина (по оси X) области печати." + +#: fdmprinter.def.json +msgctxt "machine_depth label" +msgid "Machine depth" +msgstr "Глубина принтера" + +#: fdmprinter.def.json +msgctxt "machine_depth description" +msgid "The depth (Y-direction) of the printable area." +msgstr "Ширина (по оси Y) области печати." + +#: fdmprinter.def.json +msgctxt "machine_shape label" +msgid "Build plate shape" +msgstr "Форма стола" + +#: fdmprinter.def.json +msgctxt "machine_shape description" +msgid "" +"The shape of the build plate without taking unprintable areas into account." +msgstr "Форма стола без учёта непечатаемых областей." + +#: fdmprinter.def.json +msgctxt "machine_shape option rectangular" +msgid "Rectangular" +msgstr "Прямоугольная" + +#: fdmprinter.def.json +msgctxt "machine_shape option elliptic" +msgid "Elliptic" +msgstr "Эллиптическая" + +#: fdmprinter.def.json +msgctxt "machine_height label" +msgid "Machine height" +msgstr "Высота принтера" + +#: fdmprinter.def.json +msgctxt "machine_height description" +msgid "The height (Z-direction) of the printable area." +msgstr "Ширина (по оси Z) области печати." + +#: fdmprinter.def.json +msgctxt "machine_heated_bed label" +msgid "Has heated build plate" +msgstr "Имеет подогреваемый стол" + +#: fdmprinter.def.json +msgctxt "machine_heated_bed description" +msgid "Whether the machine has a heated build plate present." +msgstr "Имеет ли принтер подогреваемый стол." + +#: fdmprinter.def.json +msgctxt "machine_center_is_zero label" +msgid "Is center origin" +msgstr "Начало координат в центре" + +#: fdmprinter.def.json +msgctxt "machine_center_is_zero description" +msgid "" +"Whether the X/Y coordinates of the zero position of the printer is at the " +"center of the printable area." +msgstr "" +"Следует ли считать центром координат по осям X/Y в центре области печати." + +#: fdmprinter.def.json +msgctxt "machine_extruder_count label" +msgid "Number of Extruders" +msgstr "Количество экструдеров" + +#: fdmprinter.def.json +msgctxt "machine_extruder_count description" +msgid "" +"Number of extruder trains. An extruder train is the combination of a feeder, " +"bowden tube, and nozzle." +msgstr "" +"Количество экструдеров. Экструдер - это комбинация механизма подачи, трубы и " +"сопла." + +#: fdmprinter.def.json +msgctxt "machine_nozzle_tip_outer_diameter label" +msgid "Outer nozzle diameter" +msgstr "Внешний диаметр сопла" + +#: fdmprinter.def.json +msgctxt "machine_nozzle_tip_outer_diameter description" +msgid "The outer diameter of the tip of the nozzle." +msgstr "Внешний диаметр кончика сопла." + +#: fdmprinter.def.json +msgctxt "machine_nozzle_head_distance label" +msgid "Nozzle length" +msgstr "Длина сопла" + +#: fdmprinter.def.json +msgctxt "machine_nozzle_head_distance description" +msgid "" +"The height difference between the tip of the nozzle and the lowest part of " +"the print head." +msgstr "Высота между кончиком сопла и нижней частью головы." + +#: fdmprinter.def.json +msgctxt "machine_nozzle_expansion_angle label" +msgid "Nozzle angle" +msgstr "Угол сопла" + +#: fdmprinter.def.json +msgctxt "machine_nozzle_expansion_angle description" +msgid "" +"The angle between the horizontal plane and the conical part right above the " +"tip of the nozzle." +msgstr "" +"Угол между горизонтальной плоскостью и конической частью над кончиком сопла." + +#: fdmprinter.def.json +msgctxt "machine_heat_zone_length label" +msgid "Heat zone length" +msgstr "Длина зоны нагрева" + +#: fdmprinter.def.json +msgctxt "machine_heat_zone_length description" +msgid "" +"The distance from the tip of the nozzle in which heat from the nozzle is " +"transferred to the filament." +msgstr "" +"Расстояние от кончика сопла до места, на котором тепло передаётся материалу." + +#: fdmprinter.def.json +msgctxt "machine_filament_park_distance label" +msgid "Filament Park Distance" +msgstr "Расстояние парковки материала" + +#: fdmprinter.def.json +msgctxt "machine_filament_park_distance description" +msgid "" +"The distance from the tip of the nozzle where to park the filament when an " +"extruder is no longer used." +msgstr "" +"Расстояние от кончика сопла до места, где останавливается материал пока " +"экструдер не используется." + +#: fdmprinter.def.json +msgctxt "machine_nozzle_heat_up_speed label" +msgid "Heat up speed" +msgstr "Скорость нагрева" + +#: fdmprinter.def.json +msgctxt "machine_nozzle_heat_up_speed description" +msgid "" +"The speed (°C/s) by which the nozzle heats up averaged over the window of " +"normal printing temperatures and the standby temperature." +msgstr "" +"Скорость (°C/сек.) с которой сопло греет, усреднённой в окне температур при " +"обычной печати и температура ожидания." + +#: fdmprinter.def.json +msgctxt "machine_nozzle_cool_down_speed label" +msgid "Cool down speed" +msgstr "Скорость охлаждения" + +#: fdmprinter.def.json +msgctxt "machine_nozzle_cool_down_speed description" +msgid "" +"The speed (°C/s) by which the nozzle cools down averaged over the window of " +"normal printing temperatures and the standby temperature." +msgstr "" +"Скорость (°C/сек.) с которой сопло охлаждает усреднённой в окне температур " +"при обычной печати и температура ожидания." + +#: fdmprinter.def.json +msgctxt "machine_min_cool_heat_time_window label" +msgid "Minimal Time Standby Temperature" +msgstr "Время перехода в ожидание" + +#: fdmprinter.def.json +msgctxt "machine_min_cool_heat_time_window description" +msgid "" +"The minimal time an extruder has to be inactive before the nozzle is cooled. " +"Only when an extruder is not used for longer than this time will it be " +"allowed to cool down to the standby temperature." +msgstr "" +"Минимальное время, которое экструдер должен быть неактивен, чтобы сопло " +"начало охлаждаться. Только когда экструдер не используется дольше, чем " +"указанное время, он может быть охлаждён до температуры ожидания." + +#: fdmprinter.def.json +msgctxt "machine_gcode_flavor label" +msgid "Gcode flavour" +msgstr "Вариант G-кода" + +#: fdmprinter.def.json +msgctxt "machine_gcode_flavor description" +msgid "The type of gcode to be generated." +msgstr "Генерируемый вариант G-кода." + +#: fdmprinter.def.json +msgctxt "machine_gcode_flavor option RepRap (Marlin/Sprinter)" +msgid "RepRap (Marlin/Sprinter)" +msgstr "RepRap (Marlin/Sprinter)" + +#: fdmprinter.def.json +msgctxt "machine_gcode_flavor option RepRap (Volumatric)" +msgid "RepRap (Volumetric)" +msgstr "RepRap (Volumetric)" + +#: fdmprinter.def.json +msgctxt "machine_gcode_flavor option UltiGCode" +msgid "Ultimaker 2" +msgstr "Ultimaker 2" + +#: fdmprinter.def.json +msgctxt "machine_gcode_flavor option Griffin" +msgid "Griffin" +msgstr "Griffin" + +#: fdmprinter.def.json +msgctxt "machine_gcode_flavor option Makerbot" +msgid "Makerbot" +msgstr "Makerbot" + +#: fdmprinter.def.json +msgctxt "machine_gcode_flavor option BFB" +msgid "Bits from Bytes" +msgstr "Bits from Bytes" + +#: fdmprinter.def.json +msgctxt "machine_gcode_flavor option MACH3" +msgid "Mach3" +msgstr "Mach3" + +#: fdmprinter.def.json +msgctxt "machine_gcode_flavor option Repetier" +msgid "Repetier" +msgstr "Repetier" + +#: fdmprinter.def.json +msgctxt "machine_disallowed_areas label" +msgid "Disallowed areas" +msgstr "Запрещённые области" + +#: fdmprinter.def.json +msgctxt "machine_disallowed_areas description" +msgid "A list of polygons with areas the print head is not allowed to enter." +msgstr "Список полигонов с областями, в которые голове запрещено заходить." + +#: fdmprinter.def.json +msgctxt "nozzle_disallowed_areas label" +msgid "Nozzle Disallowed Areas" +msgstr "Запрещённые зоны для сопла" + +#: fdmprinter.def.json +msgctxt "nozzle_disallowed_areas description" +msgid "A list of polygons with areas the nozzle is not allowed to enter." +msgstr "Список полигонов с областями, в которые не должно заходить сопло." + +#: fdmprinter.def.json +msgctxt "machine_head_polygon label" +msgid "Machine head polygon" +msgstr "Полигон головы принтера" + +#: fdmprinter.def.json +msgctxt "machine_head_polygon description" +msgid "A 2D silhouette of the print head (fan caps excluded)." +msgstr "2D контур головы принтера (исключая крышки вентилятора)." + +#: fdmprinter.def.json +msgctxt "machine_head_with_fans_polygon label" +msgid "Machine head & Fan polygon" +msgstr "Полигон головы принтера и вентилятора" + +#: fdmprinter.def.json +msgctxt "machine_head_with_fans_polygon description" +msgid "A 2D silhouette of the print head (fan caps included)." +msgstr "2D контур головы принтера (включая крышки вентилятора)." + +#: fdmprinter.def.json +msgctxt "gantry_height label" +msgid "Gantry height" +msgstr "Высота портала" + +#: fdmprinter.def.json +msgctxt "gantry_height description" +msgid "" +"The height difference between the tip of the nozzle and the gantry system (X " +"and Y axes)." +msgstr "Высота между кончиком сопла и портальной системой (по осям X и Y)." + +#: fdmprinter.def.json +msgctxt "machine_nozzle_size label" +msgid "Nozzle Diameter" +msgstr "Диаметр сопла" + +#: fdmprinter.def.json +msgctxt "machine_nozzle_size description" +msgid "" +"The inner diameter of the nozzle. Change this setting when using a non-" +"standard nozzle size." +msgstr "" +"Внутренний диаметр сопла. Измените этот параметр при использовании сопла " +"нестандартного размера." + +#: fdmprinter.def.json +msgctxt "machine_use_extruder_offset_to_offset_coords label" +msgid "Offset With Extruder" +msgstr "Смещение экструдера" + +#: fdmprinter.def.json +msgctxt "machine_use_extruder_offset_to_offset_coords description" +msgid "Apply the extruder offset to the coordinate system." +msgstr "Применить смещение экструдера к системе координат." + +#: fdmprinter.def.json +msgctxt "extruder_prime_pos_z label" +msgid "Extruder Prime Z Position" +msgstr "Z координата начала печати" + +#: fdmprinter.def.json +msgctxt "extruder_prime_pos_z description" +msgid "" +"The Z coordinate of the position where the nozzle primes at the start of " +"printing." +msgstr "Позиция кончика сопла на оси Z при старте печати." + +#: fdmprinter.def.json +msgctxt "extruder_prime_pos_abs label" +msgid "Absolute Extruder Prime Position" +msgstr "Абсолютная позиция экструдера при старте" + +#: fdmprinter.def.json +msgctxt "extruder_prime_pos_abs description" +msgid "" +"Make the extruder prime position absolute rather than relative to the last-" +"known location of the head." +msgstr "" +"Сделать стартовую позицию экструдера абсолютной, а не относительной от " +"последней известной позиции головы." + +#: fdmprinter.def.json +msgctxt "machine_max_feedrate_x label" +msgid "Maximum Speed X" +msgstr "Максимальная скорость по оси X" + +#: fdmprinter.def.json +msgctxt "machine_max_feedrate_x description" +msgid "The maximum speed for the motor of the X-direction." +msgstr "Максимальная скорость для мотора оси X." + +#: fdmprinter.def.json +msgctxt "machine_max_feedrate_y label" +msgid "Maximum Speed Y" +msgstr "Максимальная скорость по оси Y" + +#: fdmprinter.def.json +msgctxt "machine_max_feedrate_y description" +msgid "The maximum speed for the motor of the Y-direction." +msgstr "Максимальная скорость для мотора оси Y." + +#: fdmprinter.def.json +msgctxt "machine_max_feedrate_z label" +msgid "Maximum Speed Z" +msgstr "Максимальная скорость по оси Z" + +#: fdmprinter.def.json +msgctxt "machine_max_feedrate_z description" +msgid "The maximum speed for the motor of the Z-direction." +msgstr "Максимальная скорость для мотора оси Z." + +#: fdmprinter.def.json +msgctxt "machine_max_feedrate_e label" +msgid "Maximum Feedrate" +msgstr "Максимальная подача" + +#: fdmprinter.def.json +msgctxt "machine_max_feedrate_e description" +msgid "The maximum speed of the filament." +msgstr "Максимальная скорость подачи материала." + +#: fdmprinter.def.json +msgctxt "machine_max_acceleration_x label" +msgid "Maximum Acceleration X" +msgstr "Максимальное ускорение по оси X" + +#: fdmprinter.def.json +msgctxt "machine_max_acceleration_x description" +msgid "Maximum acceleration for the motor of the X-direction" +msgstr "Максимальное ускорение для мотора оси X." + +#: fdmprinter.def.json +msgctxt "machine_max_acceleration_y label" +msgid "Maximum Acceleration Y" +msgstr "Максимальное ускорение по оси Y" + +#: fdmprinter.def.json +msgctxt "machine_max_acceleration_y description" +msgid "Maximum acceleration for the motor of the Y-direction." +msgstr "Максимальное ускорение для мотора оси Y." + +#: fdmprinter.def.json +msgctxt "machine_max_acceleration_z label" +msgid "Maximum Acceleration Z" +msgstr "Максимальное ускорение по оси Z" + +#: fdmprinter.def.json +msgctxt "machine_max_acceleration_z description" +msgid "Maximum acceleration for the motor of the Z-direction." +msgstr "Максимальное ускорение для мотора оси Z." + +#: fdmprinter.def.json +msgctxt "machine_max_acceleration_e label" +msgid "Maximum Filament Acceleration" +msgstr "Максимальное ускорение материала" + +#: fdmprinter.def.json +msgctxt "machine_max_acceleration_e description" +msgid "Maximum acceleration for the motor of the filament." +msgstr "Максимальное ускорение мотора подачи материала." + +#: fdmprinter.def.json +msgctxt "machine_acceleration label" +msgid "Default Acceleration" +msgstr "Стандартное ускорение" + +#: fdmprinter.def.json +msgctxt "machine_acceleration description" +msgid "The default acceleration of print head movement." +msgstr "Стандартное ускорение для движений головы." + +#: fdmprinter.def.json +msgctxt "machine_max_jerk_xy label" +msgid "Default X-Y Jerk" +msgstr "Обычный X-Y рывок" + +#: fdmprinter.def.json +msgctxt "machine_max_jerk_xy description" +msgid "Default jerk for movement in the horizontal plane." +msgstr "" +"Стандартное изменение ускорения для движения в горизонтальной плоскости." + +#: fdmprinter.def.json +msgctxt "machine_max_jerk_z label" +msgid "Default Z Jerk" +msgstr "Обычный Z рывок" + +#: fdmprinter.def.json +msgctxt "machine_max_jerk_z description" +msgid "Default jerk for the motor of the Z-direction." +msgstr "Стандартное изменение ускорения для мотора по оси Z." + +#: fdmprinter.def.json +msgctxt "machine_max_jerk_e label" +msgid "Default Filament Jerk" +msgstr "Обычный рывок материала" + +#: fdmprinter.def.json +msgctxt "machine_max_jerk_e description" +msgid "Default jerk for the motor of the filament." +msgstr "Стандартное изменение ускорения для мотора, подающего материал." + +#: fdmprinter.def.json +msgctxt "machine_minimum_feedrate label" +msgid "Minimum Feedrate" +msgstr "Минимальная подача" + +#: fdmprinter.def.json +msgctxt "machine_minimum_feedrate description" +msgid "The minimal movement speed of the print head." +msgstr "Минимальная скорость движения головы." + +#: fdmprinter.def.json +msgctxt "resolution label" +msgid "Quality" +msgstr "Качество" + +#: fdmprinter.def.json +msgctxt "resolution description" +msgid "" +"All settings that influence the resolution of the print. These settings have " +"a large impact on the quality (and print time)" +msgstr "" +"Все параметры, которые влияют на разрешение печати. Эти параметры сильно " +"влияют на качество (и время печати)" + +#: fdmprinter.def.json +msgctxt "layer_height label" +msgid "Layer Height" +msgstr "Высота слоя" + +#: fdmprinter.def.json +msgctxt "layer_height description" +msgid "" +"The height of each layer in mm. Higher values produce faster prints in lower " +"resolution, lower values produce slower prints in higher resolution." +msgstr "" +"Высота каждого слоя в миллиметрах. Большие значения приводят к быстрой " +"печати при низком разрешении, малые значения приводят к замедлению печати с " +"высоким разрешением." + +#: fdmprinter.def.json +msgctxt "layer_height_0 label" +msgid "Initial Layer Height" +msgstr "Высота первого слоя" + +#: fdmprinter.def.json +msgctxt "layer_height_0 description" +msgid "" +"The height of the initial layer in mm. A thicker initial layer makes " +"adhesion to the build plate easier." +msgstr "" +"Высота первого слоя в миллиметрах. Более толстый слой упрощает прилипание " +"пластика к столу." + +#: fdmprinter.def.json +msgctxt "line_width label" +msgid "Line Width" +msgstr "Ширина линии" + +#: fdmprinter.def.json +msgctxt "line_width description" +msgid "" +"Width of a single line. Generally, the width of each line should correspond " +"to the width of the nozzle. However, slightly reducing this value could " +"produce better prints." +msgstr "" +"Ширина одной линии. Обычно, ширина каждой линии должна соответствовать " +"диаметру сопла. Однако, небольшое уменьшение этого значение приводит к " +"лучшей печати." + +#: fdmprinter.def.json +msgctxt "wall_line_width label" +msgid "Wall Line Width" +msgstr "Ширина линии стенки" + +#: fdmprinter.def.json +msgctxt "wall_line_width description" +msgid "Width of a single wall line." +msgstr "Ширина одной линии стенки." + +#: fdmprinter.def.json +msgctxt "wall_line_width_0 label" +msgid "Outer Wall Line Width" +msgstr "Ширина линии внешней стенки" + +#: fdmprinter.def.json +msgctxt "wall_line_width_0 description" +msgid "" +"Width of the outermost wall line. By lowering this value, higher levels of " +"detail can be printed." +msgstr "" +"Ширина линии внешней стенки. Уменьшая данное значение, можно печатать более " +"тонкие детали." + +#: fdmprinter.def.json +msgctxt "wall_line_width_x label" +msgid "Inner Wall(s) Line Width" +msgstr "Ширина линии внутренней стенки" + +#: fdmprinter.def.json +msgctxt "wall_line_width_x description" +msgid "" +"Width of a single wall line for all wall lines except the outermost one." +msgstr "Ширина одной линии стенки для всех линий стенки, кроме самой внешней." + +#: fdmprinter.def.json +msgctxt "skin_line_width label" +msgid "Top/Bottom Line Width" +msgstr "Ширина линии дна/крышки" + +#: fdmprinter.def.json +msgctxt "skin_line_width description" +msgid "Width of a single top/bottom line." +msgstr "Ширина одной линии дна/крышки." + +#: fdmprinter.def.json +msgctxt "infill_line_width label" +msgid "Infill Line Width" +msgstr "Ширина линии заполнения" + +#: fdmprinter.def.json +msgctxt "infill_line_width description" +msgid "Width of a single infill line." +msgstr "Ширина одной линии заполнения." + +#: fdmprinter.def.json +msgctxt "skirt_brim_line_width label" +msgid "Skirt/Brim Line Width" +msgstr "Ширина линии юбки/каймы" + +#: fdmprinter.def.json +msgctxt "skirt_brim_line_width description" +msgid "Width of a single skirt or brim line." +msgstr "Ширина одной линии юбки или каймы." + +#: fdmprinter.def.json +msgctxt "support_line_width label" +msgid "Support Line Width" +msgstr "Ширина линии поддержки" + +#: fdmprinter.def.json +msgctxt "support_line_width description" +msgid "Width of a single support structure line." +msgstr "Ширина одной линии поддержки." + +#: fdmprinter.def.json +msgctxt "support_interface_line_width label" +msgid "Support Interface Line Width" +msgstr "Ширина линии поддерживающей крыши" + +#: fdmprinter.def.json +msgctxt "support_interface_line_width description" +msgid "Width of a single support interface line." +msgstr "Ширина одной линии поддерживающей крыши." + +#: fdmprinter.def.json +msgctxt "prime_tower_line_width label" +msgid "Prime Tower Line Width" +msgstr "Ширина линии черновой башни" + +#: fdmprinter.def.json +msgctxt "prime_tower_line_width description" +msgid "Width of a single prime tower line." +msgstr "Ширина отдельной линии черновой башни." + +#: fdmprinter.def.json +msgctxt "shell label" +msgid "Shell" +msgstr "Ограждение" + +#: fdmprinter.def.json +msgctxt "shell description" +msgid "Shell" +msgstr "Ограждение" + +#: fdmprinter.def.json +msgctxt "wall_thickness label" +msgid "Wall Thickness" +msgstr "Толщина стенки" + +#: fdmprinter.def.json +msgctxt "wall_thickness description" +msgid "" +"The thickness of the outside walls in the horizontal direction. This value " +"divided by the wall line width defines the number of walls." +msgstr "" +"Толщина внешних стенок в горизонтальном направлении. Это значение, " +"разделённое на ширину линии стенки, определяет количество линий стенки." + +#: fdmprinter.def.json +msgctxt "wall_line_count label" +msgid "Wall Line Count" +msgstr "Количество линий стенки" + +#: fdmprinter.def.json +msgctxt "wall_line_count description" +msgid "" +"The number of walls. When calculated by the wall thickness, this value is " +"rounded to a whole number." +msgstr "" +"Количество линий стенки. При вычислении толщины стенки, это значение " +"округляется до целого." + +#: fdmprinter.def.json +msgctxt "wall_0_wipe_dist label" +msgid "Outer Wall Wipe Distance" +msgstr "Расстояние очистки внешней стенки" + +#: fdmprinter.def.json +msgctxt "wall_0_wipe_dist description" +msgid "" +"Distance of a travel move inserted after the outer wall, to hide the Z seam " +"better." +msgstr "" +"Расстояние перемещения, добавленное после печати внешней стенки, чтобы лучше " +"спрятать Z шов." + +#: fdmprinter.def.json +msgctxt "top_bottom_thickness label" +msgid "Top/Bottom Thickness" +msgstr "Толщина дна/крышки" + +#: fdmprinter.def.json +msgctxt "top_bottom_thickness description" +msgid "" +"The thickness of the top/bottom layers in the print. This value divided by " +"the layer height defines the number of top/bottom layers." +msgstr "" +"Толщина слоя дна/крышки при печати. Это значение, разделённое на высоту " +"слоя, определяет количество слоёв в дне/крышке." + +#: fdmprinter.def.json +msgctxt "top_thickness label" +msgid "Top Thickness" +msgstr "Толщина крышки" + +#: fdmprinter.def.json +msgctxt "top_thickness description" +msgid "" +"The thickness of the top layers in the print. This value divided by the " +"layer height defines the number of top layers." +msgstr "" +"Толщина крышки при печати. Это значение, разделённое на высоту слоя, " +"определяет количество слоёв в крышке." + +#: fdmprinter.def.json +msgctxt "top_layers label" +msgid "Top Layers" +msgstr "Слои крышки" + +#: fdmprinter.def.json +msgctxt "top_layers description" +msgid "" +"The number of top layers. When calculated by the top thickness, this value " +"is rounded to a whole number." +msgstr "" +"Количество слоёв в крышке. При вычислении толщины крышки это значение " +"округляется до целого." + +#: fdmprinter.def.json +msgctxt "bottom_thickness label" +msgid "Bottom Thickness" +msgstr "Толщина дна" + +#: fdmprinter.def.json +msgctxt "bottom_thickness description" +msgid "" +"The thickness of the bottom layers in the print. This value divided by the " +"layer height defines the number of bottom layers." +msgstr "" +"Толщина дна при печати. Это значение, разделённое на высоту слоя, определяет " +"количество слоёв в дне." + +#: fdmprinter.def.json +msgctxt "bottom_layers label" +msgid "Bottom Layers" +msgstr "Слои дна" + +#: fdmprinter.def.json +msgctxt "bottom_layers description" +msgid "" +"The number of bottom layers. When calculated by the bottom thickness, this " +"value is rounded to a whole number." +msgstr "" +"Количество слоёв в дне. При вычислении толщины дна это значение округляется " +"до целого." + +#: fdmprinter.def.json +msgctxt "top_bottom_pattern label" +msgid "Top/Bottom Pattern" +msgstr "Шаблон для крышки/дна" + +#: fdmprinter.def.json +msgctxt "top_bottom_pattern description" +msgid "The pattern of the top/bottom layers." +msgstr "Шаблон слоёв для крышки/дна." + +#: fdmprinter.def.json +msgctxt "top_bottom_pattern option lines" +msgid "Lines" +msgstr "Линии" + +#: fdmprinter.def.json +msgctxt "top_bottom_pattern option concentric" +msgid "Concentric" +msgstr "Концентрический" + +#: fdmprinter.def.json +msgctxt "top_bottom_pattern option zigzag" +msgid "Zig Zag" +msgstr "Зигзаг" + +#: fdmprinter.def.json +msgctxt "wall_0_inset label" +msgid "Outer Wall Inset" +msgstr "Вставка внешней стенки" + +#: fdmprinter.def.json +msgctxt "wall_0_inset description" +msgid "" +"Inset applied to the path of the outer wall. If the outer wall is smaller " +"than the nozzle, and printed after the inner walls, use this offset to get " +"the hole in the nozzle to overlap with the inner walls instead of the " +"outside of the model." +msgstr "" +"Вставка применяется для внешних стенок. Если внешняя стенка меньше диаметра " +"сопла и печатается после внутренних стенок, то используйте это смещение для " +"захода соплом на внутренние стенки, вместо выхода за модель." + +#: fdmprinter.def.json +msgctxt "outer_inset_first label" +msgid "Outer Before Inner Walls" +msgstr "Печать внешних стенок" + +#: fdmprinter.def.json +msgctxt "outer_inset_first description" +msgid "" +"Prints walls in order of outside to inside when enabled. This can help " +"improve dimensional accuracy in X and Y when using a high viscosity plastic " +"like ABS; however it can decrease outer surface print quality, especially on " +"overhangs." +msgstr "" +"Указывает печатать стенки снаружи внутрь. Это помогает улучшить аккуратность " +"печати по осям X и Y, при использовании вязких пластиков подобно ABS. " +"Однако, это может отрицательно повлиять на качество печати внешних " +"поверхностей, особенно нависающих." + +#: fdmprinter.def.json +msgctxt "alternate_extra_perimeter label" +msgid "Alternate Extra Wall" +msgstr "Чередующаяся стенка" + +#: fdmprinter.def.json +msgctxt "alternate_extra_perimeter description" +msgid "" +"Prints an extra wall at every other layer. This way infill gets caught " +"between these extra walls, resulting in stronger prints." +msgstr "" +"Печатает дополнительную стенку через слой. Таким образом заполнение " +"заключается между этими дополнительными стенками, что приводит к повышению " +"прочности печати." + +#: fdmprinter.def.json +msgctxt "travel_compensate_overlapping_walls_enabled label" +msgid "Compensate Wall Overlaps" +msgstr "Компенсация перекрытия стен" + +#: fdmprinter.def.json +msgctxt "travel_compensate_overlapping_walls_enabled description" +msgid "" +"Compensate the flow for parts of a wall being printed where there is already " +"a wall in place." +msgstr "" +"Компенсирует поток для печатаемых частей стен в местах где уже напечатана " +"стена." + +#: fdmprinter.def.json +msgctxt "travel_compensate_overlapping_walls_0_enabled label" +msgid "Compensate Outer Wall Overlaps" +msgstr "Компенсация перекрытия внешних стен" + +#: fdmprinter.def.json +msgctxt "travel_compensate_overlapping_walls_0_enabled description" +msgid "" +"Compensate the flow for parts of an outer wall being printed where there is " +"already a wall in place." +msgstr "" +"Компенсирует поток для печатаемых частей внешних стен в местах где уже " +"напечатана стена." + +#: fdmprinter.def.json +msgctxt "travel_compensate_overlapping_walls_x_enabled label" +msgid "Compensate Inner Wall Overlaps" +msgstr "Компенсация перекрытия внутренних стен" + +#: fdmprinter.def.json +msgctxt "travel_compensate_overlapping_walls_x_enabled description" +msgid "" +"Compensate the flow for parts of an inner wall being printed where there is " +"already a wall in place." +msgstr "" +"Компенсирует поток для печатаемых частей внутренних стен в местах где уже " +"напечатана стена." + +#: fdmprinter.def.json +msgctxt "fill_perimeter_gaps label" +msgid "Fill Gaps Between Walls" +msgstr "Заполнение зазоров между стенками" + +#: fdmprinter.def.json +msgctxt "fill_perimeter_gaps description" +msgid "Fills the gaps between walls where no walls fit." +msgstr "Заполняет зазоры между стенками, когда это необходимо." + +#: fdmprinter.def.json +msgctxt "fill_perimeter_gaps option nowhere" +msgid "Nowhere" +msgstr "Нигде" + +#: fdmprinter.def.json +msgctxt "fill_perimeter_gaps option everywhere" +msgid "Everywhere" +msgstr "Везде" + +#: fdmprinter.def.json +msgctxt "xy_offset label" +msgid "Horizontal Expansion" +msgstr "Горизонтальное расширение" + +#: fdmprinter.def.json +msgctxt "xy_offset description" +msgid "" +"Amount of offset applied to all polygons in each layer. Positive values can " +"compensate for too big holes; negative values can compensate for too small " +"holes." +msgstr "" +"Сумма смещения применяемая ко всем полигонам на каждом слое. Позитивные " +"значения могут возместить потери для слишком больших отверстий; негативные " +"значения могут возместить потери для слишком малых отверстий." + +#: fdmprinter.def.json +msgctxt "z_seam_type label" +msgid "Z Seam Alignment" +msgstr "Выравнивание шва по оси Z" + +#: fdmprinter.def.json +msgctxt "z_seam_type description" +msgid "" +"Starting point of each path in a layer. When paths in consecutive layers " +"start at the same point a vertical seam may show on the print. When aligning " +"these near a user specified location, the seam is easiest to remove. When " +"placed randomly the inaccuracies at the paths' start will be less " +"noticeable. When taking the shortest path the print will be quicker." +msgstr "" +"Начальная точка каждого пути на слое. Когда пути последовательных слоёв " +"начинаются в одной точке, то в процессе печати может появиться вертикальный " +"шов. Выравнивая место точки в указанной пользователем области, шов несложно " +"убрать. При случайном размещении неточность в начале пути становится не так " +"важна. При выборе кратчайшего пути, печать становится быстрее." + +#: fdmprinter.def.json +msgctxt "z_seam_type option back" +msgid "User Specified" +msgstr "Пользовательский" + +#: fdmprinter.def.json +msgctxt "z_seam_type option shortest" +msgid "Shortest" +msgstr "Короткий путь" + +#: fdmprinter.def.json +msgctxt "z_seam_type option random" +msgid "Random" +msgstr "Случайно" + +#: fdmprinter.def.json +msgctxt "z_seam_x label" +msgid "Z Seam X" +msgstr "X координата для Z шва" + +#: fdmprinter.def.json +msgctxt "z_seam_x description" +msgid "" +"The X coordinate of the position near where to start printing each part in a " +"layer." +msgstr "" +"X координата позиции вблизи которой следует начинать путь на каждом слое." + +#: fdmprinter.def.json +msgctxt "z_seam_y label" +msgid "Z Seam Y" +msgstr "Y координата для Z шва" + +#: fdmprinter.def.json +msgctxt "z_seam_y description" +msgid "" +"The Y coordinate of the position near where to start printing each part in a " +"layer." +msgstr "" +"Y координата позиции вблизи которой следует начинать путь на каждом слое." + +#: fdmprinter.def.json +msgctxt "skin_no_small_gaps_heuristic label" +msgid "Ignore Small Z Gaps" +msgstr "Игнорирование Z зазоров" + +#: fdmprinter.def.json +msgctxt "skin_no_small_gaps_heuristic description" +msgid "" +"When the model has small vertical gaps, about 5% extra computation time can " +"be spent on generating top and bottom skin in these narrow spaces. In such " +"case, disable the setting." +msgstr "" +"Когда модель имеет небольшие вертикальные зазоры, около 5% дополнительного " +"времени будет потрачено на вычисления верхних и нижних поверхностей в этих " +"узких пространствах. В этом случае, отключите данный параметр." + +#: fdmprinter.def.json +msgctxt "infill label" +msgid "Infill" +msgstr "Заполнение" + +#: fdmprinter.def.json +msgctxt "infill description" +msgid "Infill" +msgstr "Заполнение" + +#: fdmprinter.def.json +msgctxt "infill_sparse_density label" +msgid "Infill Density" +msgstr "Плотность заполнения" + +#: fdmprinter.def.json +msgctxt "infill_sparse_density description" +msgid "Adjusts the density of infill of the print." +msgstr "Отрегулируйте плотность заполнения при печати." + +#: fdmprinter.def.json +msgctxt "infill_line_distance label" +msgid "Infill Line Distance" +msgstr "Дистанция линий заполнения" + +#: fdmprinter.def.json +msgctxt "infill_line_distance description" +msgid "" +"Distance between the printed infill lines. This setting is calculated by the " +"infill density and the infill line width." +msgstr "" +"Дистанция между линиями заполнения. Этот параметр вычисляется из плотности " +"заполнения и ширины линии заполнения." + +#: fdmprinter.def.json +msgctxt "infill_pattern label" +msgid "Infill Pattern" +msgstr "Шаблон заполнения" + +#: fdmprinter.def.json +msgctxt "infill_pattern description" +msgid "" +"The pattern of the infill material of the print. The line and zig zag infill " +"swap direction on alternate layers, reducing material cost. The grid, " +"triangle, cubic, tetrahedral and concentric patterns are fully printed every " +"layer. Cubic and tetrahedral infill change with every layer to provide a " +"more equal distribution of strength over each direction." +msgstr "" +"Шаблон для материала заполнения при печати. Заполнение линиями и зигзагом " +"меняет направление при смене слоя, уменьшая стоимость материала. Сетчатый, " +"треугольный и концентрический шаблоны полностью печатаются на каждом слое. " +"Кубическое и тетраэдральное заполнение меняется на каждом слое для равного " +"распределения прочности по каждому направлению." + +#: fdmprinter.def.json +msgctxt "infill_pattern option grid" +msgid "Grid" +msgstr "Сетка" + +#: fdmprinter.def.json +msgctxt "infill_pattern option lines" +msgid "Lines" +msgstr "Линии" + +#: fdmprinter.def.json +msgctxt "infill_pattern option triangles" +msgid "Triangles" +msgstr "Треугольник" + +#: fdmprinter.def.json +msgctxt "infill_pattern option cubic" +msgid "Cubic" +msgstr "Куб" + +#: fdmprinter.def.json +msgctxt "infill_pattern option cubicsubdiv" +msgid "Cubic Subdivision" +msgstr "Динамический куб" + +#: fdmprinter.def.json +msgctxt "infill_pattern option tetrahedral" +msgid "Tetrahedral" +msgstr "Тетраэдр" + +#: fdmprinter.def.json +msgctxt "infill_pattern option concentric" +msgid "Concentric" +msgstr "Концентрическое" + +#: fdmprinter.def.json +msgctxt "infill_pattern option concentric_3d" +msgid "Concentric 3D" +msgstr "Концентрическое 3D" + +#: fdmprinter.def.json +msgctxt "infill_pattern option zigzag" +msgid "Zig Zag" +msgstr "Зигзаг" + +#: fdmprinter.def.json +msgctxt "sub_div_rad_mult label" +msgid "Cubic Subdivision Radius" +msgstr "Радиус динамического куба" + +#: fdmprinter.def.json +msgctxt "sub_div_rad_mult description" +msgid "" +"A multiplier on the radius from the center of each cube to check for the " +"boundary of the model, as to decide whether this cube should be subdivided. " +"Larger values lead to more subdivisions, i.e. more small cubes." +msgstr "" +"Коэффициент для радиуса от центра каждого куба для проверки границ модели, " +"используется для принятия решения о разделении куба. Большие значения " +"приводят к увеличению делений, т.е. к более мелким кубам." + +#: fdmprinter.def.json +msgctxt "sub_div_rad_add label" +msgid "Cubic Subdivision Shell" +msgstr "Стенка динамического куба" + +#: fdmprinter.def.json +msgctxt "sub_div_rad_add description" +msgid "" +"An addition to the radius from the center of each cube to check for the " +"boundary of the model, as to decide whether this cube should be subdivided. " +"Larger values lead to a thicker shell of small cubes near the boundary of " +"the model." +msgstr "" +"Дополнение к радиусу от центра каждого куба для проверки границ модели, " +"используется для принятия решения о разделении куба. Большие значения " +"приводят к утолщению стенок мелких кубов по мере приближения к границе " +"модели." + +#: fdmprinter.def.json +msgctxt "infill_overlap label" +msgid "Infill Overlap Percentage" +msgstr "Процент перекрытие заполнения" + +#: fdmprinter.def.json +msgctxt "infill_overlap description" +msgid "" +"The amount of overlap between the infill and the walls. A slight overlap " +"allows the walls to connect firmly to the infill." +msgstr "" +"Величина перекрытия между заполнением и стенками. Небольшое перекрытие " +"позволяет стенкам плотно соединиться с заполнением." + +#: fdmprinter.def.json +msgctxt "infill_overlap_mm label" +msgid "Infill Overlap" +msgstr "Перекрытие заполнения" + +#: fdmprinter.def.json +msgctxt "infill_overlap_mm description" +msgid "" +"The amount of overlap between the infill and the walls. A slight overlap " +"allows the walls to connect firmly to the infill." +msgstr "" +"Величина перекрытия между заполнением и стенками. Небольшое перекрытие " +"позволяет стенкам плотно соединиться с заполнением." + +#: fdmprinter.def.json +msgctxt "skin_overlap label" +msgid "Skin Overlap Percentage" +msgstr "Процент перекрытия поверхности" + +#: fdmprinter.def.json +msgctxt "skin_overlap description" +msgid "" +"The amount of overlap between the skin and the walls. A slight overlap " +"allows the walls to connect firmly to the skin." +msgstr "" +"Величина перекрытия между поверхностью и стенками. Небольшое перекрытие " +"позволяет стенкам плотно соединиться с поверхностью." + +#: fdmprinter.def.json +msgctxt "skin_overlap_mm label" +msgid "Skin Overlap" +msgstr "Перекрытие поверхности" + +#: fdmprinter.def.json +msgctxt "skin_overlap_mm description" +msgid "" +"The amount of overlap between the skin and the walls. A slight overlap " +"allows the walls to connect firmly to the skin." +msgstr "" +"Величина перекрытия между поверхностью и стенками. Небольшое перекрытие " +"позволяет стенкам плотно соединиться с поверхностью." + +#: fdmprinter.def.json +msgctxt "infill_wipe_dist label" +msgid "Infill Wipe Distance" +msgstr "Дистанция окончания заполнения" + +#: fdmprinter.def.json +msgctxt "infill_wipe_dist description" +msgid "" +"Distance of a travel move inserted after every infill line, to make the " +"infill stick to the walls better. This option is similar to infill overlap, " +"but without extrusion and only on one end of the infill line." +msgstr "" +"Расстояние, на которое продолжается движение сопла после печати каждой линии " +"заполнения, для обеспечения лучшего связывания заполнения со стенками. Этот " +"параметр похож на перекрытие заполнения, но без экструзии и только с одной " +"стороны линии заполнения." + +#: fdmprinter.def.json +msgctxt "infill_sparse_thickness label" +msgid "Infill Layer Thickness" +msgstr "Толщина слоя заполнения" + +#: fdmprinter.def.json +msgctxt "infill_sparse_thickness description" +msgid "" +"The thickness per layer of infill material. This value should always be a " +"multiple of the layer height and is otherwise rounded." +msgstr "" +"Толщина слоя для материала заполнения. Данное значение должно быть всегда " +"кратно толщине слоя и всегда округляется." + +#: fdmprinter.def.json +msgctxt "gradual_infill_steps label" +msgid "Gradual Infill Steps" +msgstr "Изменение шага заполнения" + +#: fdmprinter.def.json +msgctxt "gradual_infill_steps description" +msgid "" +"Number of times to reduce the infill density by half when getting further " +"below top surfaces. Areas which are closer to top surfaces get a higher " +"density, up to the Infill Density." +msgstr "" +"Количество шагов уменьшения наполовину плотности заполнения вглубь модели. " +"Области, располагающиеся ближе к краю модели, получают большую плотность, до " +"указанной в \"Плотность заполнения.\"" + +#: fdmprinter.def.json +msgctxt "gradual_infill_step_height label" +msgid "Gradual Infill Step Height" +msgstr "Высота изменения шага заполнения" + +#: fdmprinter.def.json +msgctxt "gradual_infill_step_height description" +msgid "" +"The height of infill of a given density before switching to half the density." +msgstr "" +"Высота заполнения с указанной плотностью перед переключением на половину " +"плотности." + +#: fdmprinter.def.json +msgctxt "infill_before_walls label" +msgid "Infill Before Walls" +msgstr "Заполнение перед печатью стенок" + +#: fdmprinter.def.json +msgctxt "infill_before_walls description" +msgid "" +"Print the infill before printing the walls. Printing the walls first may " +"lead to more accurate walls, but overhangs print worse. Printing the infill " +"first leads to sturdier walls, but the infill pattern might sometimes show " +"through the surface." +msgstr "" +"Печатать заполнение до печати стенок. Если печатать сначала стенки, то это " +"может сделать их более точными, но нависающие стенки будут напечатаны хуже. " +"Если печатать сначала заполнение, то это сделает стенки более крепкими, но " +"шаблон заполнения может иногда прорываться сквозь поверхность стенки." + +#: fdmprinter.def.json +msgctxt "material label" +msgid "Material" +msgstr "Материал" + +#: fdmprinter.def.json +msgctxt "material description" +msgid "Material" +msgstr "Материал" + +#: fdmprinter.def.json +msgctxt "material_flow_dependent_temperature label" +msgid "Auto Temperature" +msgstr "Автоматическая температура" + +#: fdmprinter.def.json +msgctxt "material_flow_dependent_temperature description" +msgid "" +"Change the temperature for each layer automatically with the average flow " +"speed of that layer." +msgstr "" +"Изменять температуру каждого слоя автоматически в соответствии со средней " +"скоростью потока на этом слое." + +#: fdmprinter.def.json +msgctxt "default_material_print_temperature label" +msgid "Default Printing Temperature" +msgstr "Температура сопла" + +#: fdmprinter.def.json +msgctxt "default_material_print_temperature description" +msgid "" +"The default temperature used for printing. This should be the \"base\" " +"temperature of a material. All other print temperatures should use offsets " +"based on this value" +msgstr "" +"Стандартная температура сопла, используемая при печати. Значением должна " +"быть \"базовая\" температура для материала. Все другие температуры печати " +"должны быть выражены смещениями от основного значения." + +#: fdmprinter.def.json +msgctxt "material_print_temperature label" +msgid "Printing Temperature" +msgstr "Температура сопла" + +#: fdmprinter.def.json +msgctxt "material_print_temperature description" +msgid "" +"The temperature used for printing. Set at 0 to pre-heat the printer manually." +msgstr "" +"Температура при печати. Установите 0 для предварительного разогрева вручную." + +#: fdmprinter.def.json +msgctxt "material_print_temperature_layer_0 label" +msgid "Printing Temperature Initial Layer" +msgstr "Температура печати первого слоя" + +#: fdmprinter.def.json +msgctxt "material_print_temperature_layer_0 description" +msgid "" +"The temperature used for printing the first layer. Set at 0 to disable " +"special handling of the initial layer." +msgstr "" +"Температура при печати первого слоя. Установите в 0 для отключения " +"специального поведения на первом слое." + +#: fdmprinter.def.json +msgctxt "material_initial_print_temperature label" +msgid "Initial Printing Temperature" +msgstr "Начальная температура печати" + +#: fdmprinter.def.json +msgctxt "material_initial_print_temperature description" +msgid "" +"The minimal temperature while heating up to the Printing Temperature at " +"which printing can already start." +msgstr "" +"Минимальная температура, в процессе нагрева до температуры печати, на " +"которой можно запустить процесс печати." + +#: fdmprinter.def.json +msgctxt "material_final_print_temperature label" +msgid "Final Printing Temperature" +msgstr "Конечная температура печати" + +#: fdmprinter.def.json +msgctxt "material_final_print_temperature description" +msgid "" +"The temperature to which to already start cooling down just before the end " +"of printing." +msgstr "" +"Температура, до которой можно начать охлаждать сопло, перед окончанием " +"печати." + +#: fdmprinter.def.json +msgctxt "material_flow_temp_graph label" +msgid "Flow Temperature Graph" +msgstr "График температуры потока" + +#: fdmprinter.def.json +msgctxt "material_flow_temp_graph description" +msgid "" +"Data linking material flow (in mm3 per second) to temperature (degrees " +"Celsius)." +msgstr "" +"График, объединяющий поток (в мм3 в секунду) с температурой (в градусах " +"Цельсия)." + +#: fdmprinter.def.json +msgctxt "material_extrusion_cool_down_speed label" +msgid "Extrusion Cool Down Speed Modifier" +msgstr "Модификатор скорости охлаждения экструзии" + +#: fdmprinter.def.json +msgctxt "material_extrusion_cool_down_speed description" +msgid "" +"The extra speed by which the nozzle cools while extruding. The same value is " +"used to signify the heat up speed lost when heating up while extruding." +msgstr "" +"Дополнительная скорость, с помощью которой сопло охлаждается во время " +"экструзии. Это же значение используется для ускорения нагрева сопла при " +"экструзии." + +#: fdmprinter.def.json +msgctxt "material_bed_temperature label" +msgid "Build Plate Temperature" +msgstr "Температура стола" + +#: fdmprinter.def.json +msgctxt "material_bed_temperature description" +msgid "" +"The temperature used for the heated build plate. Set at 0 to pre-heat the " +"printer manually." +msgstr "" +"Температура стола при печати. Установите 0 для предварительного разогрева " +"вручную." + +#: fdmprinter.def.json +msgctxt "material_bed_temperature_layer_0 label" +msgid "Build Plate Temperature Initial Layer" +msgstr "Температура стола для первого слоя" + +#: fdmprinter.def.json +msgctxt "material_bed_temperature_layer_0 description" +msgid "The temperature used for the heated build plate at the first layer." +msgstr "Температура стола, используемая при печати первого слоя." + +#: fdmprinter.def.json +msgctxt "material_diameter label" +msgid "Diameter" +msgstr "Диаметр" + +#: fdmprinter.def.json +msgctxt "material_diameter description" +msgid "" +"Adjusts the diameter of the filament used. Match this value with the " +"diameter of the used filament." +msgstr "Укажите диаметр используемой нити." + +#: fdmprinter.def.json +msgctxt "material_flow label" +msgid "Flow" +msgstr "Поток" + +#: fdmprinter.def.json +msgctxt "material_flow description" +msgid "" +"Flow compensation: the amount of material extruded is multiplied by this " +"value." +msgstr "" +"Компенсация потока: объём выдавленного материала умножается на этот " +"коэффициент." + +#: fdmprinter.def.json +msgctxt "retraction_enable label" +msgid "Enable Retraction" +msgstr "Разрешить откат" + +#: fdmprinter.def.json +msgctxt "retraction_enable description" +msgid "" +"Retract the filament when the nozzle is moving over a non-printed area. " +msgstr "Откат нити при движении сопла вне зоны печати." + +#: fdmprinter.def.json +msgctxt "retract_at_layer_change label" +msgid "Retract at Layer Change" +msgstr "Откат при смене слоя" + +#: fdmprinter.def.json +msgctxt "retract_at_layer_change description" +msgid "Retract the filament when the nozzle is moving to the next layer." +msgstr "Откат нити при перемещении сопла на следующий слой." + +#: fdmprinter.def.json +msgctxt "retraction_amount label" +msgid "Retraction Distance" +msgstr "Величина отката" + +#: fdmprinter.def.json +msgctxt "retraction_amount description" +msgid "The length of material retracted during a retraction move." +msgstr "Длина нити материала, которая будет извлечена по время отката." + +#: fdmprinter.def.json +msgctxt "retraction_speed label" +msgid "Retraction Speed" +msgstr "Скорость отката" + +#: fdmprinter.def.json +msgctxt "retraction_speed description" +msgid "" +"The speed at which the filament is retracted and primed during a retraction " +"move." +msgstr "" +"Скорость, с которой материал будет извлечён и возвращён обратно при откате." + +#: fdmprinter.def.json +msgctxt "retraction_retract_speed label" +msgid "Retraction Retract Speed" +msgstr "Скорость извлечения при откате" + +#: fdmprinter.def.json +msgctxt "retraction_retract_speed description" +msgid "The speed at which the filament is retracted during a retraction move." +msgstr "Скорость с которой нить будет извлечена при откате." + +#: fdmprinter.def.json +msgctxt "retraction_prime_speed label" +msgid "Retraction Prime Speed" +msgstr "Скорость возврата в начале печати" + +#: fdmprinter.def.json +msgctxt "retraction_prime_speed description" +msgid "The speed at which the filament is primed during a retraction move." +msgstr "Скорость с которой материал будет возвращён при откате." + +#: fdmprinter.def.json +msgctxt "retraction_extra_prime_amount label" +msgid "Retraction Extra Prime Amount" +msgstr "Дополнительно заполняемый объём при откате" + +#: fdmprinter.def.json +msgctxt "retraction_extra_prime_amount description" +msgid "" +"Some material can ooze away during a travel move, which can be compensated " +"for here." +msgstr "" +"Небольшое количество материала может выдавится во время движение, что может " +"быть скомпенсировано с помощью данного параметра." + +#: fdmprinter.def.json +msgctxt "retraction_min_travel label" +msgid "Retraction Minimum Travel" +msgstr "Минимальное перемещение при откате" + +#: fdmprinter.def.json +msgctxt "retraction_min_travel description" +msgid "" +"The minimum distance of travel needed for a retraction to happen at all. " +"This helps to get fewer retractions in a small area." +msgstr "" +"Минимальное расстояние на которое необходимо переместиться для отката, чтобы " +"он произошёл. Этот параметр помогает уменьшить количество откатов на " +"небольшой области печати." + +#: fdmprinter.def.json +msgctxt "retraction_count_max label" +msgid "Maximum Retraction Count" +msgstr "Максимальное количество откатов" + +#: fdmprinter.def.json +msgctxt "retraction_count_max description" +msgid "" +"This setting limits the number of retractions occurring within the minimum " +"extrusion distance window. Further retractions within this window will be " +"ignored. This avoids retracting repeatedly on the same piece of filament, as " +"that can flatten the filament and cause grinding issues." +msgstr "" +"Данный параметр ограничивает число откатов, которые происходят внутри окна " +"минимальной дистанции экструзии. Дальнейшие откаты внутри этого окна будут " +"проигнорированы. Это исключает выполнение множества повторяющихся откатов " +"над одним и тем же участком нити, что позволяет избежать проблем с " +"истиранием нити." + +#: fdmprinter.def.json +msgctxt "retraction_extrusion_window label" +msgid "Minimum Extrusion Distance Window" +msgstr "Окно минимальной расстояния экструзии" + +#: fdmprinter.def.json +msgctxt "retraction_extrusion_window description" +msgid "" +"The window in which the maximum retraction count is enforced. This value " +"should be approximately the same as the retraction distance, so that " +"effectively the number of times a retraction passes the same patch of " +"material is limited." +msgstr "" +"Окно, в котором может быть выполнено максимальное количество откатов. Это " +"значение приблизительно должно совпадать с расстоянием отката таким образом, " +"чтобы количество выполненных откатов распределялось на величину выдавленного " +"материала." + +#: fdmprinter.def.json +msgctxt "material_standby_temperature label" +msgid "Standby Temperature" +msgstr "Температура ожидания" + +#: fdmprinter.def.json +msgctxt "material_standby_temperature description" +msgid "" +"The temperature of the nozzle when another nozzle is currently used for " +"printing." +msgstr "" +"Температура сопла в момент, когда для печати используется другое сопло." + +#: fdmprinter.def.json +msgctxt "switch_extruder_retraction_amount label" +msgid "Nozzle Switch Retraction Distance" +msgstr "Величина отката при смене экструдера" + +#: fdmprinter.def.json +msgctxt "switch_extruder_retraction_amount description" +msgid "" +"The amount of retraction: Set at 0 for no retraction at all. This should " +"generally be the same as the length of the heat zone." +msgstr "" +"Величина отката: Установите 0 для отключения отката. Обычно соответствует " +"длине зоны нагрева." + +#: fdmprinter.def.json +msgctxt "switch_extruder_retraction_speeds label" +msgid "Nozzle Switch Retraction Speed" +msgstr "Скорость отката при смене экструдера" + +#: fdmprinter.def.json +msgctxt "switch_extruder_retraction_speeds description" +msgid "" +"The speed at which the filament is retracted. A higher retraction speed " +"works better, but a very high retraction speed can lead to filament grinding." +msgstr "" +"Скорость с которой материал будет извлечён и возвращён обратно при откате. " +"Высокая скорость отката работает лучше, но очень большая скорость портит " +"материал." + +#: fdmprinter.def.json +msgctxt "switch_extruder_retraction_speed label" +msgid "Nozzle Switch Retract Speed" +msgstr "Скорость отката при смене экструдера" + +#: fdmprinter.def.json +msgctxt "switch_extruder_retraction_speed description" +msgid "" +"The speed at which the filament is retracted during a nozzle switch retract." +msgstr "" +"Скорость, с которой материал будет извлечён при откате для смены экструдера." + +#: fdmprinter.def.json +msgctxt "switch_extruder_prime_speed label" +msgid "Nozzle Switch Prime Speed" +msgstr "Скорость наполнения при смене экструдера" + +#: fdmprinter.def.json +msgctxt "switch_extruder_prime_speed description" +msgid "" +"The speed at which the filament is pushed back after a nozzle switch " +"retraction." +msgstr "" +"Скорость, с которой материал будет возвращён обратно при смене экструдера." + +#: fdmprinter.def.json +msgctxt "speed label" +msgid "Speed" +msgstr "Скорость" + +#: fdmprinter.def.json +msgctxt "speed description" +msgid "Speed" +msgstr "Скорость" + +#: fdmprinter.def.json +msgctxt "speed_print label" +msgid "Print Speed" +msgstr "Скорость печати" + +#: fdmprinter.def.json +msgctxt "speed_print description" +msgid "The speed at which printing happens." +msgstr "Скорость, на которой происходит печать." + +#: fdmprinter.def.json +msgctxt "speed_infill label" +msgid "Infill Speed" +msgstr "Скорость заполнения" + +#: fdmprinter.def.json +msgctxt "speed_infill description" +msgid "The speed at which infill is printed." +msgstr "Скорость, на которой печатается заполнение." + +#: fdmprinter.def.json +msgctxt "speed_wall label" +msgid "Wall Speed" +msgstr "Скорость печати стенок" + +#: fdmprinter.def.json +msgctxt "speed_wall description" +msgid "The speed at which the walls are printed." +msgstr "Скорость, на которой происходит печать стенок." + +#: fdmprinter.def.json +msgctxt "speed_wall_0 label" +msgid "Outer Wall Speed" +msgstr "Скорость печати внешней стенки" + +#: fdmprinter.def.json +msgctxt "speed_wall_0 description" +msgid "" +"The speed at which the outermost walls are printed. Printing the outer wall " +"at a lower speed improves the final skin quality. However, having a large " +"difference between the inner wall speed and the outer wall speed will affect " +"quality in a negative way." +msgstr "" +"Скорость, на которой происходит печать внешних стенок. Печать внешней стенки " +"на пониженной скорости улучшает качество поверхности модели. Однако, при " +"большой разнице между скоростями печати внутренних и внешних стенок " +"возникает эффект, негативно влияющий на качество." + +#: fdmprinter.def.json +msgctxt "speed_wall_x label" +msgid "Inner Wall Speed" +msgstr "Скорость печати внутренних стенок" + +#: fdmprinter.def.json +msgctxt "speed_wall_x description" +msgid "" +"The speed at which all inner walls are printed. Printing the inner wall " +"faster than the outer wall will reduce printing time. It works well to set " +"this in between the outer wall speed and the infill speed." +msgstr "" +"Скорость, на которой происходит печать внутренних стенок. Печать внутренних " +"стенок на скорости, большей скорости печати внешней стенки, ускоряет печать. " +"Отлично работает, если значение скорости находится между скоростями печати " +"внешней стенки и скорости заполнения." + +#: fdmprinter.def.json +msgctxt "speed_topbottom label" +msgid "Top/Bottom Speed" +msgstr "Скорость крышки/дна" + +#: fdmprinter.def.json +msgctxt "speed_topbottom description" +msgid "The speed at which top/bottom layers are printed." +msgstr "Скорость, на которой печатаются слои крышки/дна." + +#: fdmprinter.def.json +msgctxt "speed_support label" +msgid "Support Speed" +msgstr "Скорость печати поддержек" + +#: fdmprinter.def.json +msgctxt "speed_support description" +msgid "" +"The speed at which the support structure is printed. Printing support at " +"higher speeds can greatly reduce printing time. The surface quality of the " +"support structure is not important since it is removed after printing." +msgstr "" +"Скорость, на которой происходит печать структуры поддержек. Печать поддержек " +"на повышенной скорости может значительно уменьшить время печати. Качество " +"поверхности структуры поддержек не имеет значения, так как эта структура " +"будет удалена после печати." + +#: fdmprinter.def.json +msgctxt "speed_support_infill label" +msgid "Support Infill Speed" +msgstr "Скорость заполнения поддержек" + +#: fdmprinter.def.json +msgctxt "speed_support_infill description" +msgid "" +"The speed at which the infill of support is printed. Printing the infill at " +"lower speeds improves stability." +msgstr "" +"Скорость, на которой заполняются поддержки. Печать заполнения на пониженных " +"скоростях улучшает стабильность." + +#: fdmprinter.def.json +msgctxt "speed_support_interface label" +msgid "Support Interface Speed" +msgstr "Скорость границы поддержек" + +#: fdmprinter.def.json +msgctxt "speed_support_interface description" +msgid "" +"The speed at which the roofs and bottoms of support are printed. Printing " +"the them at lower speeds can improve overhang quality." +msgstr "" +"Скорость, на которой происходит печать верха и низа поддержек. Печать крыши " +"поддержек на пониженных скоростях может улучшить качество печати нависающих " +"краёв модели." + +#: fdmprinter.def.json +msgctxt "speed_prime_tower label" +msgid "Prime Tower Speed" +msgstr "Скорость черновых башен" + +#: fdmprinter.def.json +msgctxt "speed_prime_tower description" +msgid "" +"The speed at which the prime tower is printed. Printing the prime tower " +"slower can make it more stable when the adhesion between the different " +"filaments is suboptimal." +msgstr "" +"Скорость, на которой печатается черновая башня. Замедленная печать черновой " +"башни может сделать её стабильнее при недостаточном прилипании различных " +"материалов." + +#: fdmprinter.def.json +msgctxt "speed_travel label" +msgid "Travel Speed" +msgstr "Скорость перемещения" + +#: fdmprinter.def.json +msgctxt "speed_travel description" +msgid "The speed at which travel moves are made." +msgstr "Скорость, с которой выполняется перемещение." + +#: fdmprinter.def.json +msgctxt "speed_layer_0 label" +msgid "Initial Layer Speed" +msgstr "Скорость первого слоя" + +#: fdmprinter.def.json +msgctxt "speed_layer_0 description" +msgid "" +"The speed for the initial layer. A lower value is advised to improve " +"adhesion to the build plate." +msgstr "" +"Скорость печати первого слоя. Пониженное значение помогает улучшить " +"прилипание материала к столу." + +#: fdmprinter.def.json +msgctxt "speed_print_layer_0 label" +msgid "Initial Layer Print Speed" +msgstr "Скорость первого слоя" + +#: fdmprinter.def.json +msgctxt "speed_print_layer_0 description" +msgid "" +"The speed of printing for the initial layer. A lower value is advised to " +"improve adhesion to the build plate." +msgstr "" +"Скорость печати первого слоя. Пониженное значение помогает улучшить " +"прилипание материала к столу." + +#: fdmprinter.def.json +msgctxt "speed_travel_layer_0 label" +msgid "Initial Layer Travel Speed" +msgstr "Скорость перемещений на первом слое" + +#: fdmprinter.def.json +msgctxt "speed_travel_layer_0 description" +msgid "" +"The speed of travel moves in the initial layer. A lower value is advised to " +"prevent pulling previously printed parts away from the build plate. The " +"value of this setting can automatically be calculated from the ratio between " +"the Travel Speed and the Print Speed." +msgstr "" +"Скорость перемещений на первом слое. Малые значения помогают предотвращать " +"отлипание напечатанных частей от стола. Значение этого параметра может быть " +"вычислено автоматически из отношения между скоростями перемещения и печати." + +#: fdmprinter.def.json +msgctxt "skirt_brim_speed label" +msgid "Skirt/Brim Speed" +msgstr "Скорость юбки/каймы" + +#: fdmprinter.def.json +msgctxt "skirt_brim_speed description" +msgid "" +"The speed at which the skirt and brim are printed. Normally this is done at " +"the initial layer speed, but sometimes you might want to print the skirt or " +"brim at a different speed." +msgstr "" +"Скорость, на которой происходит печать юбки и каймы. Обычно, их печать " +"происходит на скорости печати первого слоя, но иногда вам может " +"потребоваться печатать юбку или кайму на другой скорости." + +#: fdmprinter.def.json +msgctxt "max_feedrate_z_override label" +msgid "Maximum Z Speed" +msgstr "Максимальная скорость по оси Z" + +#: fdmprinter.def.json +msgctxt "max_feedrate_z_override description" +msgid "" +"The maximum speed with which the build plate is moved. Setting this to zero " +"causes the print to use the firmware defaults for the maximum z speed." +msgstr "" +"Максимальная скорость, с которой движется ось Z. Установка нуля в качестве " +"значения, приводит к использованию скорости прописанной в прошивке." + +#: fdmprinter.def.json +msgctxt "speed_slowdown_layers label" +msgid "Number of Slower Layers" +msgstr "Количество медленных слоёв" + +#: fdmprinter.def.json +msgctxt "speed_slowdown_layers description" +msgid "" +"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." +msgstr "" +"Первые несколько слоёв печатаются на медленной скорости, чем вся остальная " +"модель, чтобы получить лучшее прилипание к столу и увеличить вероятность " +"успешной печати. Скорость последовательно увеличивается по мере печати " +"указанного количества слоёв." + +#: fdmprinter.def.json +msgctxt "speed_equalize_flow_enabled label" +msgid "Equalize Filament Flow" +msgstr "Выравнивание потока материала" + +#: fdmprinter.def.json +msgctxt "speed_equalize_flow_enabled description" +msgid "" +"Print thinner than normal lines faster so that the amount of material " +"extruded per second remains the same. Thin pieces in your model might " +"require lines printed with smaller line width than provided in the settings. " +"This setting controls the speed changes for such lines." +msgstr "" +"Печатать более тонкие чем обычно линии быстрее, чтобы объём выдавленного " +"материала в секунду оставался постоянным. Тонкие части в вашей модели могут " +"требовать, чтобы линии были напечатаны с меньшей шириной, чем " +"предоставляется параметрами. Этот параметр управляет скоростью изменения " +"таких линий." + +#: fdmprinter.def.json +msgctxt "speed_equalize_flow_max label" +msgid "Maximum Speed for Flow Equalization" +msgstr "Максимальная скорость выравнивания потока" + +#: fdmprinter.def.json +msgctxt "speed_equalize_flow_max description" +msgid "" +"Maximum print speed when adjusting the print speed in order to equalize flow." +msgstr "" +"Максимальная скорость печати до которой может увеличиваться скорость печати " +"при выравнивании потока." + +#: fdmprinter.def.json +msgctxt "acceleration_enabled label" +msgid "Enable Acceleration Control" +msgstr "Разрешить управление ускорением" + +#: fdmprinter.def.json +msgctxt "acceleration_enabled description" +msgid "" +"Enables adjusting the print head acceleration. Increasing the accelerations " +"can reduce printing time at the cost of print quality." +msgstr "" +"Разрешает регулирование ускорения головы. Увеличение ускорений может " +"сократить время печати за счёт качества печати." + +#: fdmprinter.def.json +msgctxt "acceleration_print label" +msgid "Print Acceleration" +msgstr "Ускорение печати" + +#: fdmprinter.def.json +msgctxt "acceleration_print description" +msgid "The acceleration with which printing happens." +msgstr "Ускорение, с которым которой происходит печать." + +#: fdmprinter.def.json +msgctxt "acceleration_infill label" +msgid "Infill Acceleration" +msgstr "Ускорение заполнения" + +#: fdmprinter.def.json +msgctxt "acceleration_infill description" +msgid "The acceleration with which infill is printed." +msgstr "Ускорение, с которым печатается заполнение." + +#: fdmprinter.def.json +msgctxt "acceleration_wall label" +msgid "Wall Acceleration" +msgstr "Ускорение стенок" + +#: fdmprinter.def.json +msgctxt "acceleration_wall description" +msgid "The acceleration with which the walls are printed." +msgstr "Ускорение, с которым происходит печать стенок." + +#: fdmprinter.def.json +msgctxt "acceleration_wall_0 label" +msgid "Outer Wall Acceleration" +msgstr "Ускорение внешней стенки" + +#: fdmprinter.def.json +msgctxt "acceleration_wall_0 description" +msgid "The acceleration with which the outermost walls are printed." +msgstr "Ускорение, с которым происходит печать внешних стенок." + +#: fdmprinter.def.json +msgctxt "acceleration_wall_x label" +msgid "Inner Wall Acceleration" +msgstr "Ускорение внутренней стенки" + +#: fdmprinter.def.json +msgctxt "acceleration_wall_x description" +msgid "The acceleration with which all inner walls are printed." +msgstr "Ускорение, с которым происходит печать внутренних стенок." + +#: fdmprinter.def.json +msgctxt "acceleration_topbottom label" +msgid "Top/Bottom Acceleration" +msgstr "Ускорение крышки/дна" + +#: fdmprinter.def.json +msgctxt "acceleration_topbottom description" +msgid "The acceleration with which top/bottom layers are printed." +msgstr "Ускорение, с которым печатаются слои крышки/дна." + +#: fdmprinter.def.json +msgctxt "acceleration_support label" +msgid "Support Acceleration" +msgstr "Ускорение поддержек" + +#: fdmprinter.def.json +msgctxt "acceleration_support description" +msgid "The acceleration with which the support structure is printed." +msgstr "Ускорение, с которым печатаются структуры поддержки." + +#: fdmprinter.def.json +msgctxt "acceleration_support_infill label" +msgid "Support Infill Acceleration" +msgstr "Ускорение заполнение поддержек" + +#: fdmprinter.def.json +msgctxt "acceleration_support_infill description" +msgid "The acceleration with which the infill of support is printed." +msgstr "Ускорение, с которым печатается заполнение поддержек." + +#: fdmprinter.def.json +msgctxt "acceleration_support_interface label" +msgid "Support Interface Acceleration" +msgstr "Ускорение края поддержек" + +#: fdmprinter.def.json +msgctxt "acceleration_support_interface description" +msgid "" +"The acceleration with which the roofs and bottoms of support are printed. " +"Printing them at lower accelerations can improve overhang quality." +msgstr "" +"Ускорение, с которым печатаются верх и низ поддержек. Их печать с " +"пониженными ускорениями может улучшить качество печати нависающих частей." + +#: fdmprinter.def.json +msgctxt "acceleration_prime_tower label" +msgid "Prime Tower Acceleration" +msgstr "Ускорение черновой башни" + +#: fdmprinter.def.json +msgctxt "acceleration_prime_tower description" +msgid "The acceleration with which the prime tower is printed." +msgstr "Ускорение, с которым печатается черновая башня." + +#: fdmprinter.def.json +msgctxt "acceleration_travel label" +msgid "Travel Acceleration" +msgstr "Ускорение перемещения" + +#: fdmprinter.def.json +msgctxt "acceleration_travel description" +msgid "The acceleration with which travel moves are made." +msgstr "Ускорение, с которым выполняется перемещение." + +#: fdmprinter.def.json +msgctxt "acceleration_layer_0 label" +msgid "Initial Layer Acceleration" +msgstr "Ускорение первого слоя" + +#: fdmprinter.def.json +msgctxt "acceleration_layer_0 description" +msgid "The acceleration for the initial layer." +msgstr "Ускорение для первого слоя." + +#: fdmprinter.def.json +msgctxt "acceleration_print_layer_0 label" +msgid "Initial Layer Print Acceleration" +msgstr "Ускорение печати первого слоя" + +#: fdmprinter.def.json +msgctxt "acceleration_print_layer_0 description" +msgid "The acceleration during the printing of the initial layer." +msgstr "Ускорение при печати первого слоя." + +#: fdmprinter.def.json +msgctxt "acceleration_travel_layer_0 label" +msgid "Initial Layer Travel Acceleration" +msgstr "Ускорение перемещений первого слоя" + +#: fdmprinter.def.json +msgctxt "acceleration_travel_layer_0 description" +msgid "The acceleration for travel moves in the initial layer." +msgstr "Ускорение для перемещения на первом слое." + +#: fdmprinter.def.json +msgctxt "acceleration_skirt_brim label" +msgid "Skirt/Brim Acceleration" +msgstr "Ускорение юбки/каймы" + +#: fdmprinter.def.json +msgctxt "acceleration_skirt_brim description" +msgid "" +"The acceleration with which the skirt and brim are printed. Normally this is " +"done with the initial layer acceleration, but sometimes you might want to " +"print the skirt or brim at a different acceleration." +msgstr "" +"Ускорение, с которым происходит печать юбки и каймы. Обычно, их печать " +"происходит с ускорениями первого слоя, но иногда вам может потребоваться " +"печатать юбку с другими ускорениями." + +#: fdmprinter.def.json +msgctxt "jerk_enabled label" +msgid "Enable Jerk Control" +msgstr "Включить управление рывком" + +#: fdmprinter.def.json +msgctxt "jerk_enabled description" +msgid "" +"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." +msgstr "" +"Разрешает управление скоростью изменения ускорений головы по осям X или Y. " +"Увеличение данного значения может сократить время печати за счёт его " +"качества." + +#: fdmprinter.def.json +msgctxt "jerk_print label" +msgid "Print Jerk" +msgstr "Рывок печати" + +#: fdmprinter.def.json +msgctxt "jerk_print description" +msgid "The maximum instantaneous velocity change of the print head." +msgstr "Изменение максимальной мгновенной скорости печатающей головки." + +#: fdmprinter.def.json +msgctxt "jerk_infill label" +msgid "Infill Jerk" +msgstr "Рывок заполнения" + +#: fdmprinter.def.json +msgctxt "jerk_infill description" +msgid "The maximum instantaneous velocity change with which infill is printed." +msgstr "" +"Изменение максимальной мгновенной скорости, с которой печатается заполнение." + +#: fdmprinter.def.json +msgctxt "jerk_wall label" +msgid "Wall Jerk" +msgstr "Рывок стены" + +#: fdmprinter.def.json +msgctxt "jerk_wall description" +msgid "" +"The maximum instantaneous velocity change with which the walls are printed." +msgstr "" +"Изменение максимальной мгновенной скорости, с которой будут напечатаны стены." + +#: fdmprinter.def.json +msgctxt "jerk_wall_0 label" +msgid "Outer Wall Jerk" +msgstr "Рывок внешних стен" + +#: fdmprinter.def.json +msgctxt "jerk_wall_0 description" +msgid "" +"The maximum instantaneous velocity change with which the outermost walls are " +"printed." +msgstr "" +"Изменение максимальной мгновенной скорости, с которой печатаются внешние " +"стенки." + +#: fdmprinter.def.json +msgctxt "jerk_wall_x label" +msgid "Inner Wall Jerk" +msgstr "Рывок внутренних стен" + +#: fdmprinter.def.json +msgctxt "jerk_wall_x description" +msgid "" +"The maximum instantaneous velocity change with which all inner walls are " +"printed." +msgstr "" +"Изменение максимальной мгновенной скорости, с которой печатаются внутренние " +"стенки." + +#: fdmprinter.def.json +msgctxt "jerk_topbottom label" +msgid "Top/Bottom Jerk" +msgstr "Рывок крышки/дна" + +#: fdmprinter.def.json +msgctxt "jerk_topbottom description" +msgid "" +"The maximum instantaneous velocity change with which top/bottom layers are " +"printed." +msgstr "" +"Изменение максимальной мгновенной скорости, с которой печатаются верхние и " +"нижние слои." + +#: fdmprinter.def.json +msgctxt "jerk_support label" +msgid "Support Jerk" +msgstr "Рывок поддержек" + +#: fdmprinter.def.json +msgctxt "jerk_support description" +msgid "" +"The maximum instantaneous velocity change with which the support structure " +"is printed." +msgstr "" +"Изменение максимальной мгновенной скорости, с которой печатаются поддержки." + +#: fdmprinter.def.json +msgctxt "jerk_support_infill label" +msgid "Support Infill Jerk" +msgstr "Рывок заполнение поддержек" + +#: fdmprinter.def.json +msgctxt "jerk_support_infill description" +msgid "" +"The maximum instantaneous velocity change with which the infill of support " +"is printed." +msgstr "" +"Изменение максимальной мгновенной скорости, с которой печатается заполнение " +"поддержек." + +#: fdmprinter.def.json +msgctxt "jerk_support_interface label" +msgid "Support Interface Jerk" +msgstr "Рывок связи поддержек" + +#: fdmprinter.def.json +msgctxt "jerk_support_interface description" +msgid "" +"The maximum instantaneous velocity change with which the roofs and bottoms " +"of support are printed." +msgstr "" +"Изменение максимальной мгновенной скорости, с которой печатается связующие " +"слои поддержек." + +#: fdmprinter.def.json +msgctxt "jerk_prime_tower label" +msgid "Prime Tower Jerk" +msgstr "Рывок черновых башен" + +#: fdmprinter.def.json +msgctxt "jerk_prime_tower description" +msgid "" +"The maximum instantaneous velocity change with which the prime tower is " +"printed." +msgstr "" +"Изменение максимальной мгновенной скорости, с которой печатается черновая " +"башня." + +#: fdmprinter.def.json +msgctxt "jerk_travel label" +msgid "Travel Jerk" +msgstr "Рывок перемещения" + +#: fdmprinter.def.json +msgctxt "jerk_travel description" +msgid "" +"The maximum instantaneous velocity change with which travel moves are made." +msgstr "" +"Изменение максимальной мгновенной скорости, с которой выполняются " +"перемещения." + +#: fdmprinter.def.json +msgctxt "jerk_layer_0 label" +msgid "Initial Layer Jerk" +msgstr "Рывок первого слоя" + +#: fdmprinter.def.json +msgctxt "jerk_layer_0 description" +msgid "The print maximum instantaneous velocity change for the initial layer." +msgstr "Изменение максимальной мгновенной скорости на первом слое." + +#: fdmprinter.def.json +msgctxt "jerk_print_layer_0 label" +msgid "Initial Layer Print Jerk" +msgstr "Рывок печати первого слоя" + +#: fdmprinter.def.json +msgctxt "jerk_print_layer_0 description" +msgid "" +"The maximum instantaneous velocity change during the printing of the initial " +"layer." +msgstr "" +"Изменение максимальной мгновенной скорости, с которой печатается первый слой." + +#: fdmprinter.def.json +msgctxt "jerk_travel_layer_0 label" +msgid "Initial Layer Travel Jerk" +msgstr "Рывок перемещения первого слоя" + +#: fdmprinter.def.json +msgctxt "jerk_travel_layer_0 description" +msgid "The acceleration for travel moves in the initial layer." +msgstr "" +"Изменение максимальной мгновенной скорости, с которой происходят перемещения " +"на первом слое." + +#: fdmprinter.def.json +msgctxt "jerk_skirt_brim label" +msgid "Skirt/Brim Jerk" +msgstr "Рывок юбки/каймы" + +#: fdmprinter.def.json +msgctxt "jerk_skirt_brim description" +msgid "" +"The maximum instantaneous velocity change with which the skirt and brim are " +"printed." +msgstr "" +"Изменение максимальной мгновенной скорости, с которой печатается юбка и " +"кайма." + +#: fdmprinter.def.json +msgctxt "travel label" +msgid "Travel" +msgstr "Перемещение" + +#: fdmprinter.def.json +msgctxt "travel description" +msgid "travel" +msgstr "Перемещение" + +#: fdmprinter.def.json +msgctxt "retraction_combing label" +msgid "Combing Mode" +msgstr "Режим комбинга" + +#: fdmprinter.def.json +msgctxt "retraction_combing description" +msgid "" +"Combing keeps the nozzle within already printed areas when traveling. This " +"results in slightly longer travel moves but reduces the need for " +"retractions. If combing is off, the material will retract and the nozzle " +"moves in a straight line to the next point. It is also possible to avoid " +"combing over top/bottom skin areas by combing within the infill only." +msgstr "" +"Комбинг удерживает сопло при перемещении внутри уже напечатанных зон. Это " +"выражается в небольшом увеличении пути, но уменьшает необходимость в " +"откатах. При отключенном комбинге выполняется откат и сопло передвигается в " +"следующую точку по прямой. Также есть возможность не применять комбинг над " +"областями поверхностей крышки/дна, разрешив комбинг только над заполнением." + +#: fdmprinter.def.json +msgctxt "retraction_combing option off" +msgid "Off" +msgstr "Выключен" + +#: fdmprinter.def.json +msgctxt "retraction_combing option all" +msgid "All" +msgstr "Все" + +#: fdmprinter.def.json +msgctxt "retraction_combing option noskin" +msgid "No Skin" +msgstr "Без поверхности" + +#: fdmprinter.def.json +msgctxt "travel_avoid_other_parts label" +msgid "Avoid Printed Parts When Traveling" +msgstr "Избегать напечатанных частей при перемещении" + +#: fdmprinter.def.json +msgctxt "travel_avoid_other_parts description" +msgid "" +"The nozzle avoids already printed parts when traveling. This option is only " +"available when combing is enabled." +msgstr "" +"Сопло избегает уже напечатанных частей при перемещении. Эта опция доступна " +"только при включенном комбинге." + +#: fdmprinter.def.json +msgctxt "travel_avoid_distance label" +msgid "Travel Avoid Distance" +msgstr "Дистанция обхода" + +#: fdmprinter.def.json +msgctxt "travel_avoid_distance description" +msgid "" +"The distance between the nozzle and already printed parts when avoiding " +"during travel moves." +msgstr "" +"Дистанция между соплом и уже напечатанными частями, выдерживаемая при " +"перемещении." + +#: fdmprinter.def.json +msgctxt "start_layers_at_same_position label" +msgid "Start Layers with the Same Part" +msgstr "Начинать печать в одном месте" + +#: fdmprinter.def.json +msgctxt "start_layers_at_same_position description" +msgid "" +"In each layer start with printing the object near the same point, so that we " +"don't start a new layer with printing the piece which the previous layer " +"ended with. This makes for better overhangs and small parts, but increases " +"printing time." +msgstr "" +"На каждом слое печать начинается вблизи одной и той же точки, таким образом, " +"мы не начинаем новый слой на том месте, где завершилась печать предыдущего " +"слоя. Это улучшает печать нависаний и мелких частей, но увеличивает " +"длительность процесса." + +#: fdmprinter.def.json +msgctxt "layer_start_x label" +msgid "Layer Start X" +msgstr "X координата начала" + +#: fdmprinter.def.json +msgctxt "layer_start_x description" +msgid "" +"The X coordinate of the position near where to find the part to start " +"printing each layer." +msgstr "" +"X координата позиции, вблизи которой следует искать часть модели для начала " +"печати слоя." + +#: fdmprinter.def.json +msgctxt "layer_start_y label" +msgid "Layer Start Y" +msgstr "Y координата начала" + +#: fdmprinter.def.json +msgctxt "layer_start_y description" +msgid "" +"The Y coordinate of the position near where to find the part to start " +"printing each layer." +msgstr "" +"Y координата позиции, вблизи которой следует искать часть модели для начала " +"печати слоя." + +#: fdmprinter.def.json +msgctxt "retraction_hop_enabled label" +msgid "Z Hop When Retracted" +msgstr "Поднятие оси Z при откате" + +#: fdmprinter.def.json +msgctxt "retraction_hop_enabled description" +msgid "" +"Whenever a retraction is done, the build plate is lowered to create " +"clearance between the nozzle and the print. It prevents the nozzle from " +"hitting the print during travel moves, reducing the chance to knock the " +"print from the build plate." +msgstr "" +"При выполнении отката между соплом и печатаемой деталью создаётся зазор. Это " +"предотвращает возможность касания сопла частей детали при его перемещении, " +"снижая вероятность смещения детали на столе." + +#: fdmprinter.def.json +msgctxt "retraction_hop_only_when_collides label" +msgid "Z Hop Only Over Printed Parts" +msgstr "Поднятие оси Z только над напечатанными частями" + +#: fdmprinter.def.json +msgctxt "retraction_hop_only_when_collides description" +msgid "" +"Only perform a Z Hop when moving over printed parts which cannot be avoided " +"by horizontal motion by Avoid Printed Parts when Traveling." +msgstr "" +"Выполнять поднятие оси Z только в случае движения над напечатанными частями, " +"которые нельзя обогнуть горизонтальным движением, используя «Обход " +"напечатанных деталей» при перемещении." + +#: fdmprinter.def.json +msgctxt "retraction_hop label" +msgid "Z Hop Height" +msgstr "Высота поднятия оси Z" + +#: fdmprinter.def.json +msgctxt "retraction_hop description" +msgid "The height difference when performing a Z Hop." +msgstr "Расстояние, на которое приподнимается ось Z." + +#: fdmprinter.def.json +msgctxt "retraction_hop_after_extruder_switch label" +msgid "Z Hop After Extruder Switch" +msgstr "Поднятие оси Z после смены экструдера" + +#: fdmprinter.def.json +msgctxt "retraction_hop_after_extruder_switch description" +msgid "" +"After the machine switched from one extruder to the other, the build plate " +"is lowered to create clearance between the nozzle and the print. This " +"prevents the nozzle from leaving oozed material on the outside of a print." +msgstr "" +"При переключении принтера на другой экструдер между соплом и печатаемой " +"деталью создаётся зазор. Это предотвращает возможность вытекания материала и " +"его прилипание к внешней части печатаемой модели." + +#: fdmprinter.def.json +msgctxt "cooling label" +msgid "Cooling" +msgstr "Охлаждение" + +#: fdmprinter.def.json +msgctxt "cooling description" +msgid "Cooling" +msgstr "Охлаждение" + +#: fdmprinter.def.json +msgctxt "cool_fan_enabled label" +msgid "Enable Print Cooling" +msgstr "Включить вентиляторы" + +#: fdmprinter.def.json +msgctxt "cool_fan_enabled description" +msgid "" +"Enables the print cooling fans while printing. The fans improve print " +"quality on layers with short layer times and bridging / overhangs." +msgstr "" +"Разрешает использование вентиляторов во время печати. Применение " +"вентиляторов улучшает качество печати слоёв с малой площадью, а также мостов " +"и нависаний." + +#: fdmprinter.def.json +msgctxt "cool_fan_speed label" +msgid "Fan Speed" +msgstr "Скорость вентилятора" + +#: fdmprinter.def.json +msgctxt "cool_fan_speed description" +msgid "The speed at which the print cooling fans spin." +msgstr "Скорость, с которой вращаются вентиляторы." + +#: fdmprinter.def.json +msgctxt "cool_fan_speed_min label" +msgid "Regular Fan Speed" +msgstr "Обычная скорость вентилятора" + +#: fdmprinter.def.json +msgctxt "cool_fan_speed_min description" +msgid "" +"The speed at which the fans spin before hitting the threshold. When a layer " +"prints faster than the threshold, the fan speed gradually inclines towards " +"the maximum fan speed." +msgstr "" +"Скорость, с которой вращается вентилятор до достижения порога. Если слой " +"печатается быстрее установленного порога, то вентилятор постепенно начинает " +"вращаться быстрее." + +#: fdmprinter.def.json +msgctxt "cool_fan_speed_max label" +msgid "Maximum Fan Speed" +msgstr "Максимальная скорость вентилятора" + +#: fdmprinter.def.json +msgctxt "cool_fan_speed_max description" +msgid "" +"The speed at which the fans spin on the minimum layer time. The fan speed " +"gradually increases between the regular fan speed and maximum fan speed when " +"the threshold is hit." +msgstr "" +"Скорость, с которой вращается вентилятор при минимальной площади слоя. Если " +"слой печатается быстрее установленного порога, то вентилятор постепенно " +"начинает вращаться с указанной скоростью." + +#: fdmprinter.def.json +msgctxt "cool_min_layer_time_fan_speed_max label" +msgid "Regular/Maximum Fan Speed Threshold" +msgstr "Порог переключения на повышенную скорость" + +#: fdmprinter.def.json +msgctxt "cool_min_layer_time_fan_speed_max description" +msgid "" +"The layer time which sets the threshold between regular fan speed and " +"maximum fan speed. Layers that print slower than this time use regular fan " +"speed. For faster layers the fan speed gradually increases towards the " +"maximum fan speed." +msgstr "" +"Время печати слоя, которое устанавливает порог для переключения с обычной " +"скорости вращения вентилятора на максимальную. Слои, которые будут " +"печататься дольше указанного значения, будут использовать обычную скорость " +"вращения вентилятора. Для быстрых слоёв скорость вентилятора постепенно " +"будет повышаться до максимальной." + +#: fdmprinter.def.json +msgctxt "cool_fan_speed_0 label" +msgid "Initial Fan Speed" +msgstr "Начальная скорость вентилятора" + +#: fdmprinter.def.json +msgctxt "cool_fan_speed_0 description" +msgid "" +"The speed at which the fans spin at the start of the print. In subsequent " +"layers the fan speed is gradually increased up to the layer corresponding to " +"Regular Fan Speed at Height." +msgstr "" +"Скорость, на которой вращается вентилятор, в начале печати. На последующих " +"слоях скорость вращения постепенно увеличивается до слоя, соответствующего " +"параметру обычной скорости вращения вентилятора на указанной высоте." + +#: fdmprinter.def.json +msgctxt "cool_fan_full_at_height label" +msgid "Regular Fan Speed at Height" +msgstr "Обычная скорость вентилятора на высоте" + +#: fdmprinter.def.json +msgctxt "cool_fan_full_at_height description" +msgid "" +"The height at which the fans spin on regular fan speed. At the layers below " +"the fan speed gradually increases from Initial Fan Speed to Regular Fan " +"Speed." +msgstr "" +"Высота, на которой вентилятор вращается с обычной скоростью. На предыдущих " +"слоях скорость вращения вентилятора постепенно увеличивается с начальной." + +#: fdmprinter.def.json +msgctxt "cool_fan_full_layer label" +msgid "Regular Fan Speed at Layer" +msgstr "Обычная скорость вентилятора на слое" + +#: fdmprinter.def.json +msgctxt "cool_fan_full_layer description" +msgid "" +"The layer at which the fans spin on regular fan speed. If regular fan speed " +"at height is set, this value is calculated and rounded to a whole number." +msgstr "" +"Слой, на котором вентилятор должен вращаться с обыкновенной скорость. Если " +"определена обычная скорость для вентилятора на высоте, это значение " +"вычисляется и округляется до целого." + +#: fdmprinter.def.json +msgctxt "cool_min_layer_time label" +msgid "Minimum Layer Time" +msgstr "Минимальное время слоя" + +#: fdmprinter.def.json +msgctxt "cool_min_layer_time description" +msgid "" +"The minimum time spent in a layer. This forces the printer to slow down, to " +"at least spend the time set here in one layer. This allows the printed " +"material to cool down properly before printing the next layer. Layers may " +"still take shorter than the minimal layer time if Lift Head is disabled and " +"if the Minimum Speed would otherwise be violated." +msgstr "" +"Минимальное время, затрачиваемое на печать слоя. Этот параметр заставляет " +"принтер замедляться, как минимум, чтобы потратить на печать слоя время, " +"указанное в этом параметре. Это позволяет напечатанному материалу достаточно " +"охладиться перед печатью следующего слоя. Слои могут печататься быстрее, чем " +"указано в этом параметре, если поднятие головы отключено и если будет " +"нарушено требование по минимальной скорости печати." + +#: fdmprinter.def.json +msgctxt "cool_min_speed label" +msgid "Minimum Speed" +msgstr "Минимальная скорость" + +#: fdmprinter.def.json +msgctxt "cool_min_speed description" +msgid "" +"The minimum print speed, despite slowing down due to the minimum layer time. " +"When the printer would slow down too much, the pressure in the nozzle would " +"be too low and result in bad print quality." +msgstr "" +"Минимальная скорость печати, независящая от замедления печати до " +"минимального времени печати слоя. Если принтер начнёт слишком замедляться, " +"давление в сопле будет слишком малым, что отрицательно скажется на качестве " +"печати." + +#: fdmprinter.def.json +msgctxt "cool_lift_head label" +msgid "Lift Head" +msgstr "Подъём головы" + +#: fdmprinter.def.json +msgctxt "cool_lift_head description" +msgid "" +"When the minimum speed is hit because of minimum layer time, lift the head " +"away from the print and wait the extra time until the minimum layer time is " +"reached." +msgstr "" +"Когда будет произойдёт конфликт между параметрами минимальной скорости " +"печати и минимальным временем печати слоя, голова принтера будет отведена от " +"печатаемой модели и будет выдержана необходимая пауза для достижения " +"минимального времени печати слоя." + +#: fdmprinter.def.json +msgctxt "support label" +msgid "Support" +msgstr "Поддержки" + +#: fdmprinter.def.json +msgctxt "support description" +msgid "Support" +msgstr "Поддержки" + +#: fdmprinter.def.json +msgctxt "support_enable label" +msgid "Enable Support" +msgstr "Разрешить поддержки" + +#: fdmprinter.def.json +msgctxt "support_enable description" +msgid "" +"Enable support structures. These structures support parts of the model with " +"severe overhangs." +msgstr "" +"Разрешить печать поддержек. Такие структуры поддерживают части моделей со " +"значительными навесаниями." + +#: fdmprinter.def.json +msgctxt "support_extruder_nr label" +msgid "Support Extruder" +msgstr "Экструдер поддержек" + +#: fdmprinter.def.json +msgctxt "support_extruder_nr description" +msgid "" +"The extruder train to use for printing the support. This is used in multi-" +"extrusion." +msgstr "" +"Этот экструдер используется для печати поддержек. Используется при наличии " +"нескольких экструдеров." + +#: fdmprinter.def.json +msgctxt "support_infill_extruder_nr label" +msgid "Support Infill Extruder" +msgstr "" +"Экструдер заполнения поддержек. Используется при наличии нескольких " +"экструдеров." + +#: fdmprinter.def.json +msgctxt "support_infill_extruder_nr description" +msgid "" +"The extruder train to use for printing the infill of the support. This is " +"used in multi-extrusion." +msgstr "" +"Этот экструдер используется для печати заполнения поддержек Используется при " +"наличии нескольких экструдеров." + +#: fdmprinter.def.json +msgctxt "support_extruder_nr_layer_0 label" +msgid "First Layer Support Extruder" +msgstr "Экструдер первого слоя поддержек" + +#: fdmprinter.def.json +msgctxt "support_extruder_nr_layer_0 description" +msgid "" +"The extruder train to use for printing the first layer of support infill. " +"This is used in multi-extrusion." +msgstr "" +"Этот экструдер используется для печати первого слоя заполнения поддержек. " +"Используется при наличии нескольких экструдеров." + +#: fdmprinter.def.json +msgctxt "support_interface_extruder_nr label" +msgid "Support Interface Extruder" +msgstr "Экструдер связующего слоя поддержек" + +#: fdmprinter.def.json +msgctxt "support_interface_extruder_nr description" +msgid "" +"The extruder train to use for printing the roofs and bottoms of the support. " +"This is used in multi-extrusion." +msgstr "" +"Этот экструдер используется для печати верха и ниха поддержек Используется " +"при наличии нескольких экструдеров." + +#: fdmprinter.def.json +msgctxt "support_type label" +msgid "Support Placement" +msgstr "Размещение поддержек" + +#: fdmprinter.def.json +msgctxt "support_type description" +msgid "" +"Adjusts the placement of the support structures. The placement can be set to " +"touching build plate or everywhere. When set to everywhere the support " +"structures will also be printed on the model." +msgstr "" +"Настраивает размещение структур поддержки. Размещение может быть выбрано с " +"касанием стола и везде. Для последнего случая структуры поддержки печатаются " +"даже на самой модели." + +#: fdmprinter.def.json +msgctxt "support_type option buildplate" +msgid "Touching Buildplate" +msgstr "От стола" + +#: fdmprinter.def.json +msgctxt "support_type option everywhere" +msgid "Everywhere" +msgstr "Везде" + +#: fdmprinter.def.json +msgctxt "support_angle label" +msgid "Support Overhang Angle" +msgstr "Угол нависания поддержки" + +#: fdmprinter.def.json +msgctxt "support_angle description" +msgid "" +"The minimum angle of overhangs for which support is added. At a value of 0° " +"all overhangs are supported, 90° will not provide any support." +msgstr "" +"Минимальный угол нависания при котором добавляются поддержки. При значении в " +"0° все нависания обеспечиваются поддержками, при 90° не получат никаких " +"поддержек." + +#: fdmprinter.def.json +msgctxt "support_pattern label" +msgid "Support Pattern" +msgstr "Шаблон поддержек" + +#: fdmprinter.def.json +msgctxt "support_pattern description" +msgid "" +"The pattern of the support structures of the print. The different options " +"available result in sturdy or easy to remove support." +msgstr "" +"Шаблон печатаемой структуры поддержек. Имеющиеся варианты отличаются " +"крепкостью или простотой удаления поддержек." + +#: fdmprinter.def.json +msgctxt "support_pattern option lines" +msgid "Lines" +msgstr "Линии" + +#: fdmprinter.def.json +msgctxt "support_pattern option grid" +msgid "Grid" +msgstr "Сетка" + +#: fdmprinter.def.json +msgctxt "support_pattern option triangles" +msgid "Triangles" +msgstr "Треугольники" + +#: fdmprinter.def.json +msgctxt "support_pattern option concentric" +msgid "Concentric" +msgstr "Концентрические" + +#: fdmprinter.def.json +msgctxt "support_pattern option concentric_3d" +msgid "Concentric 3D" +msgstr "Концентрические 3D" + +#: fdmprinter.def.json +msgctxt "support_pattern option zigzag" +msgid "Zig Zag" +msgstr "Зигзаг" + +#: fdmprinter.def.json +msgctxt "support_connect_zigzags label" +msgid "Connect Support ZigZags" +msgstr "Соединённый зигзаг" + +#: fdmprinter.def.json +msgctxt "support_connect_zigzags description" +msgid "" +"Connect the ZigZags. This will increase the strength of the zig zag support " +"structure." +msgstr "Соединяет зигзаги. Это увеличивает прочность такой поддержки." + +#: fdmprinter.def.json +msgctxt "support_infill_rate label" +msgid "Support Density" +msgstr "Плотность поддержек" + +#: fdmprinter.def.json +msgctxt "support_infill_rate description" +msgid "" +"Adjusts the density of the support structure. A higher value results in " +"better overhangs, but the supports are harder to remove." +msgstr "" +"Настраивает плотность структуры поддержек. Более высокое значение приводит к " +"улучшению качества навесов, но такие поддержки сложнее удалять." + +#: fdmprinter.def.json +msgctxt "support_line_distance label" +msgid "Support Line Distance" +msgstr "Дистанция между линиями поддержки" + +#: fdmprinter.def.json +msgctxt "support_line_distance description" +msgid "" +"Distance between the printed support structure lines. This setting is " +"calculated by the support density." +msgstr "" +"Дистанция между напечатанными линями структуры поддержек. Этот параметр " +"вычисляется по плотности поддержек." + +#: fdmprinter.def.json +msgctxt "support_z_distance label" +msgid "Support Z Distance" +msgstr "Зазор поддержки по оси Z" + +#: fdmprinter.def.json +msgctxt "support_z_distance description" +msgid "" +"Distance from the top/bottom of the support structure to the print. This gap " +"provides clearance to remove the supports after the model is printed. This " +"value is rounded down to a multiple of the layer height." +msgstr "" +"Расстояние между верхом/низом структуры поддержек и печатаемой моделью. Этот " +"зазор упрощает последующее удаление поддержек. Это значение округляется вниз " +"и кратно высоте слоя." + +#: fdmprinter.def.json +msgctxt "support_top_distance label" +msgid "Support Top Distance" +msgstr "Зазор поддержки сверху" + +#: fdmprinter.def.json +msgctxt "support_top_distance description" +msgid "Distance from the top of the support to the print." +msgstr "Расстояние между верхом поддержек и печатаемой моделью." + +#: fdmprinter.def.json +msgctxt "support_bottom_distance label" +msgid "Support Bottom Distance" +msgstr "Дистанция поддержки снизу" + +#: fdmprinter.def.json +msgctxt "support_bottom_distance description" +msgid "Distance from the print to the bottom of the support." +msgstr "Расстояние между печатаемой моделью и низом поддержки." + +#: fdmprinter.def.json +msgctxt "support_xy_distance label" +msgid "Support X/Y Distance" +msgstr "Зазор поддержки по осям X/Y" + +#: fdmprinter.def.json +msgctxt "support_xy_distance description" +msgid "Distance of the support structure from the print in the X/Y directions." +msgstr "" +"Расстояние между структурами поддержек и печатаемой модели по осям X/Y." + +#: fdmprinter.def.json +msgctxt "support_xy_overrides_z label" +msgid "Support Distance Priority" +msgstr "Приоритет зазоров поддержки" + +#: fdmprinter.def.json +msgctxt "support_xy_overrides_z description" +msgid "" +"Whether the Support X/Y Distance overrides the Support Z Distance or vice " +"versa. When X/Y overrides Z the X/Y distance can push away the support from " +"the model, influencing the actual Z distance to the overhang. We can disable " +"this by not applying the X/Y distance around overhangs." +msgstr "" +"Будет ли зазор по осям X/Y перекрывать зазор по оси Z и наоборот. Если X/Y " +"перекрывает Z, то X/Y может выдавить поддержку из модели, влияя на реальный " +"зазор по оси Z до свисания. Мы можем исправить это, не применяя X/Y зазор " +"около свисаний." + +#: fdmprinter.def.json +msgctxt "support_xy_overrides_z option xy_overrides_z" +msgid "X/Y overrides Z" +msgstr "X/Y перекрывает Z" + +#: fdmprinter.def.json +msgctxt "support_xy_overrides_z option z_overrides_xy" +msgid "Z overrides X/Y" +msgstr "Z перекрывает X/Y" + +#: fdmprinter.def.json +msgctxt "support_xy_distance_overhang label" +msgid "Minimum Support X/Y Distance" +msgstr "Минимальный X/Y зазор поддержки" + +#: fdmprinter.def.json +msgctxt "support_xy_distance_overhang description" +msgid "" +"Distance of the support structure from the overhang in the X/Y directions. " +msgstr "Зазор между структурами поддержек и свисанием по осям X/Y." + +#: fdmprinter.def.json +msgctxt "support_bottom_stair_step_height label" +msgid "Support Stair Step Height" +msgstr "Высота шага лестничной поддержки" + +#: fdmprinter.def.json +msgctxt "support_bottom_stair_step_height description" +msgid "" +"The height of the steps of the stair-like bottom of support resting on the " +"model. A low value makes the support harder to remove, but too high values " +"can lead to unstable support structures." +msgstr "" +"Высота шагов лестнично-подобного низа поддержек, лежащих на модели. Малое " +"значение усложняет последующее удаление поддержек, но слишком большое " +"значение может сделать структуру поддержек нестабильной." + +#: fdmprinter.def.json +msgctxt "support_join_distance label" +msgid "Support Join Distance" +msgstr "Расстояние объединения поддержки" + +#: fdmprinter.def.json +msgctxt "support_join_distance description" +msgid "" +"The maximum distance between support structures in the X/Y directions. When " +"seperate structures are closer together than this value, the structures " +"merge into one." +msgstr "" +"Максимальное расстояние между структурами поддержки по осям X/Y. Если " +"отдельные структуры находятся ближе, чем определено данным значением, то " +"такие структуры объединяются в одну." + +#: fdmprinter.def.json +msgctxt "support_offset label" +msgid "Support Horizontal Expansion" +msgstr "Горизонтальное расширение поддержки" + +#: fdmprinter.def.json +msgctxt "support_offset description" +msgid "" +"Amount of offset applied to all support polygons in each layer. Positive " +"values can smooth out the support areas and result in more sturdy support." +msgstr "" +"Величина смещения, применяемая ко всем полигонам поддержки в каждом слое. " +"Положительные значения могут сглаживать зоны поддержки и приводить к " +"укреплению структур поддержек." + +#: fdmprinter.def.json +msgctxt "support_interface_enable label" +msgid "Enable Support Interface" +msgstr "Разрешить связующий слой поддержки" + +#: fdmprinter.def.json +msgctxt "support_interface_enable description" +msgid "" +"Generate a dense interface between the model and the support. This will " +"create a skin at the top of the support on which the model is printed and at " +"the bottom of the support, where it rests on the model." +msgstr "" +"Генерирует плотный слой между моделью и поддержкой. Создаёт поверхность " +"сверху поддержек, на которой печатается модель, и снизу, при печати " +"поддержек на модели." + +#: fdmprinter.def.json +msgctxt "support_interface_height label" +msgid "Support Interface Thickness" +msgstr "Толщина связующего слоя поддержки" + +#: fdmprinter.def.json +msgctxt "support_interface_height description" +msgid "" +"The thickness of the interface of the support where it touches with the " +"model on the bottom or the top." +msgstr "" +"Толщина связующего слоя поддержек, который касается модели снизу или сверху." + +#: fdmprinter.def.json +msgctxt "support_roof_height label" +msgid "Support Roof Thickness" +msgstr "Толщина крыши" + +#: fdmprinter.def.json +msgctxt "support_roof_height description" +msgid "" +"The thickness of the support roofs. This controls the amount of dense layers " +"at the top of the support on which the model rests." +msgstr "" +"Толщина крыши поддержек. Управляет величиной плотности верхних слоёв " +"поддержек, на которых располагается вся модель." + +#: fdmprinter.def.json +msgctxt "support_bottom_height label" +msgid "Support Bottom Thickness" +msgstr "Толщина низа поддержек" + +#: fdmprinter.def.json +msgctxt "support_bottom_height description" +msgid "" +"The thickness of the support bottoms. This controls the number of dense " +"layers are printed on top of places of a model on which support rests." +msgstr "" +"Толщина низа поддержек. Управляет количеством плотных слоёв, которые будут " +"напечатаны на верхних частях модели, где располагаются поддержки." + +#: fdmprinter.def.json +msgctxt "support_interface_skip_height label" +msgid "Support Interface Resolution" +msgstr "Разрешение связующего слоя поддержек." + +#: fdmprinter.def.json +msgctxt "support_interface_skip_height description" +msgid "" +"When checking where there's model above the support, take steps of the given " +"height. Lower values will slice slower, while higher values may cause normal " +"support to be printed in some places where there should have been support " +"interface." +msgstr "" +"Если выбрано, то поддержки печатаются с учётом указанной высоты шага. " +"Меньшие значения нарезаются дольше, в то время как большие значения могут " +"привести к печати обычных поддержек в таких местах, где должен быть " +"связующий слой." + +#: fdmprinter.def.json +msgctxt "support_interface_density label" +msgid "Support Interface Density" +msgstr "Плотность связующего слоя поддержки" + +#: fdmprinter.def.json +msgctxt "support_interface_density description" +msgid "" +"Adjusts the density of the roofs and bottoms of the support structure. A " +"higher value results in better overhangs, but the supports are harder to " +"remove." +msgstr "" +"Настройте плотность верха и низа структуры поддержек. Большее значение " +"приведёт к лучшим навесам, но такие поддержки будет труднее удалять." + +#: fdmprinter.def.json +msgctxt "support_interface_line_distance label" +msgid "Support Interface Line Distance" +msgstr "Дистанция между линиями связующего слоя" + +#: fdmprinter.def.json +msgctxt "support_interface_line_distance description" +msgid "" +"Distance between the printed support interface lines. This setting is " +"calculated by the Support Interface Density, but can be adjusted separately." +msgstr "" +"Расстояние между линиями связующего слоя поддержке. Этот параметр " +"вычисляется из \"Плотности связующего слоя\", но также может быть указан " +"самостоятельно." + +#: fdmprinter.def.json +msgctxt "support_interface_pattern label" +msgid "Support Interface Pattern" +msgstr "Шаблон связующего слоя" + +#: fdmprinter.def.json +msgctxt "support_interface_pattern description" +msgid "" +"The pattern with which the interface of the support with the model is " +"printed." +msgstr "" +"Шаблон, который будет использоваться для печати связующего слоя поддержек." + +#: fdmprinter.def.json +msgctxt "support_interface_pattern option lines" +msgid "Lines" +msgstr "Линии" + +#: fdmprinter.def.json +msgctxt "support_interface_pattern option grid" +msgid "Grid" +msgstr "Сетка" + +#: fdmprinter.def.json +msgctxt "support_interface_pattern option triangles" +msgid "Triangles" +msgstr "Треугольники" + +#: fdmprinter.def.json +msgctxt "support_interface_pattern option concentric" +msgid "Concentric" +msgstr "Концентрический" + +#: fdmprinter.def.json +msgctxt "support_interface_pattern option concentric_3d" +msgid "Concentric 3D" +msgstr "Концентрический 3D" + +#: fdmprinter.def.json +msgctxt "support_interface_pattern option zigzag" +msgid "Zig Zag" +msgstr "Зигзаг" + +#: fdmprinter.def.json +msgctxt "support_use_towers label" +msgid "Use Towers" +msgstr "Использовать башни" + +#: fdmprinter.def.json +msgctxt "support_use_towers description" +msgid "" +"Use specialized towers to support tiny overhang areas. These towers have a " +"larger diameter than the region they support. Near the overhang the towers' " +"diameter decreases, forming a roof." +msgstr "" +"Использование специальных башен для поддержки крошечных нависающих областей. " +"Такие башни имеют диаметр больший, чем поддерживаемый ими регион. Вблизи " +"навесов диаметр башен увеличивается, формируя крышу." + +#: fdmprinter.def.json +msgctxt "support_tower_diameter label" +msgid "Tower Diameter" +msgstr "Диаметр башен" + +#: fdmprinter.def.json +msgctxt "support_tower_diameter description" +msgid "The diameter of a special tower." +msgstr "Диаметр специальных башен." + +#: fdmprinter.def.json +msgctxt "support_minimal_diameter label" +msgid "Minimum Diameter" +msgstr "Минимальный диаметр." + +#: fdmprinter.def.json +msgctxt "support_minimal_diameter description" +msgid "" +"Minimum diameter in the X/Y directions of a small area which is to be " +"supported by a specialized support tower." +msgstr "" +"Минимальный диаметр по осям X/Y небольшой области, которая будет " +"поддерживаться с помощью специальных башен." + +#: fdmprinter.def.json +msgctxt "support_tower_roof_angle label" +msgid "Tower Roof Angle" +msgstr "Угол крыши башен" + +#: fdmprinter.def.json +msgctxt "support_tower_roof_angle description" +msgid "" +"The angle of a rooftop of a tower. A higher value results in pointed tower " +"roofs, a lower value results in flattened tower roofs." +msgstr "" +"Угол верхней части башен. Большие значения приводят уменьшению площади " +"крыши, меньшие наоборот делают крышу плоской." + +#: fdmprinter.def.json +msgctxt "platform_adhesion label" +msgid "Build Plate Adhesion" +msgstr "Прилипание к столу" + +#: fdmprinter.def.json +msgctxt "platform_adhesion description" +msgid "Adhesion" +msgstr "Прилипание" + +#: fdmprinter.def.json +msgctxt "extruder_prime_pos_x label" +msgid "Extruder Prime X Position" +msgstr "Начальная X позиция экструдера" + +#: fdmprinter.def.json +msgctxt "extruder_prime_pos_x description" +msgid "" +"The X coordinate of the position where the nozzle primes at the start of " +"printing." +msgstr "X координата позиции, в которой сопло начинает печать." + +#: fdmprinter.def.json +msgctxt "extruder_prime_pos_y label" +msgid "Extruder Prime Y Position" +msgstr "Начальная Y позиция экструдера" + +#: fdmprinter.def.json +msgctxt "extruder_prime_pos_y description" +msgid "" +"The Y coordinate of the position where the nozzle primes at the start of " +"printing." +msgstr "Y координата позиции, в которой сопло начинает печать." + +#: fdmprinter.def.json +msgctxt "adhesion_type label" +msgid "Build Plate Adhesion Type" +msgstr "Тип прилипания к столу" + +#: fdmprinter.def.json +msgctxt "adhesion_type description" +msgid "" +"Different options that help to improve both priming your extrusion and " +"adhesion to the build plate. Brim adds a single layer flat area around the " +"base of your model to prevent warping. Raft adds a thick grid with a roof " +"below the model. Skirt is a line printed around the model, but not connected " +"to the model." +msgstr "" +"Различные варианты, которые помогают улучшить прилипание пластика к столу. " +"Кайма добавляет однослойную плоскую область вокруг основания печатаемой " +"модели, предотвращая её деформацию. Подложка добавляет толстую сетку с " +"крышей под модель. Юбка - это линия, печатаемая вокруг модели, но не " +"соединённая с ней." + +#: fdmprinter.def.json +msgctxt "adhesion_type option skirt" +msgid "Skirt" +msgstr "Юбка" + +#: fdmprinter.def.json +msgctxt "adhesion_type option brim" +msgid "Brim" +msgstr "Кайма" + +#: fdmprinter.def.json +msgctxt "adhesion_type option raft" +msgid "Raft" +msgstr "Подложка" + +#: fdmprinter.def.json +msgctxt "adhesion_type option none" +msgid "None" +msgstr "Отсутствует" + +#: fdmprinter.def.json +msgctxt "adhesion_extruder_nr label" +msgid "Build Plate Adhesion Extruder" +msgstr "Экструдер первого слоя" + +#: fdmprinter.def.json +msgctxt "adhesion_extruder_nr description" +msgid "" +"The extruder train to use for printing the skirt/brim/raft. This is used in " +"multi-extrusion." +msgstr "" +"Этот экструдер используется дл печати юбки/каймы/подложки. Используется при " +"наличии нескольких экструдеров." + +#: fdmprinter.def.json +msgctxt "skirt_line_count label" +msgid "Skirt Line Count" +msgstr "Количество линий юбки" + +#: fdmprinter.def.json +msgctxt "skirt_line_count description" +msgid "" +"Multiple skirt lines help to prime your extrusion better for small models. " +"Setting this to 0 will disable the skirt." +msgstr "" +"Несколько линий юбки помогают лучше начать укладывание материала при печати " +"небольших моделей. Установка этого параметра в 0 отключает печать юбки." + +#: fdmprinter.def.json +msgctxt "skirt_gap label" +msgid "Skirt Distance" +msgstr "Дистанция до юбки" + +#: fdmprinter.def.json +msgctxt "skirt_gap description" +msgid "" +"The horizontal distance between the skirt and the first layer of the print.\n" +"This is the minimum distance, multiple skirt lines will extend outwards from " +"this distance." +msgstr "" +"Расстояние по горизонтали между юбкой и первым слоем печатаемого объекта.\n" +"Это минимальное расстояние, следующие линии юбки будут печататься наружу." + +#: fdmprinter.def.json +msgctxt "skirt_brim_minimal_length label" +msgid "Skirt/Brim Minimum Length" +msgstr "Минимальная длина юбки/каймы." + +#: fdmprinter.def.json +msgctxt "skirt_brim_minimal_length description" +msgid "" +"The minimum length of the skirt or brim. If this length is not reached by " +"all skirt or brim lines together, more skirt or brim lines will be added " +"until the minimum length is reached. Note: If the line count is set to 0 " +"this is ignored." +msgstr "" +"Минимальная длина печатаемой линии юбки или каймы. Если при печати юбки или " +"каймы эта длина не будет выбрана, то будут добавляться дополнительные кольца " +"юбки или каймы. Следует отметить, если количество линий установлено в 0, то " +"этот параметр игнорируется." + +#: fdmprinter.def.json +msgctxt "brim_width label" +msgid "Brim Width" +msgstr "Ширина каймы" + +#: fdmprinter.def.json +msgctxt "brim_width description" +msgid "" +"The distance from the model to the outermost brim line. A larger brim " +"enhances adhesion to the build plate, but also reduces the effective print " +"area." +msgstr "" +"Расстояние между моделью и самой удалённой линией каймы. Более широкая кайма " +"увеличивает прилипание к столу, но также уменьшает эффективную область " +"печати." + +#: fdmprinter.def.json +msgctxt "brim_line_count label" +msgid "Brim Line Count" +msgstr "Количество линий каймы" + +#: fdmprinter.def.json +msgctxt "brim_line_count description" +msgid "" +"The number of lines used for a brim. More brim lines enhance adhesion to the " +"build plate, but also reduces the effective print area." +msgstr "" +"Количество линий, используемых для печати каймы. Большее количество линий " +"каймы улучшает прилипание к столу, но уменьшает эффективную область печати." + +#: fdmprinter.def.json +msgctxt "brim_outside_only label" +msgid "Brim Only on Outside" +msgstr "Кайма только снаружи" + +#: fdmprinter.def.json +msgctxt "brim_outside_only description" +msgid "" +"Only print the brim on the outside of the model. This reduces the amount of " +"brim you need to remove afterwards, while it doesn't reduce the bed adhesion " +"that much." +msgstr "" +"Печатать кайму только на внешней стороне модели. Это сокращает объём каймы, " +"которую вам потребуется удалить в дальнейшем, и не снижает качество " +"прилипания к столу." + +#: fdmprinter.def.json +msgctxt "raft_margin label" +msgid "Raft Extra Margin" +msgstr "Дополнительное поле подложки" + +#: fdmprinter.def.json +msgctxt "raft_margin description" +msgid "" +"If the raft is enabled, this is the extra raft area around the model which " +"is also given a raft. Increasing this margin will create a stronger raft " +"while using more material and leaving less area for your print." +msgstr "" +"Если подложка включена, это дополнительное поле вокруг модели, которая также " +"имеет подложку. Увеличение этого значения создаст более крепкую поддержку, " +"используя больше материала и оставляя меньше свободной области для печати." + +#: fdmprinter.def.json +msgctxt "raft_airgap label" +msgid "Raft Air Gap" +msgstr "Воздушный зазор подложки" + +#: fdmprinter.def.json +msgctxt "raft_airgap description" +msgid "" +"The gap between the final raft layer and the first layer of the model. Only " +"the first layer is raised by this amount to lower the bonding between the " +"raft layer and the model. Makes it easier to peel off the raft." +msgstr "" +"Зазор между последним слоем подложки и первым слоем модели. Первый слой " +"будет приподнят на указанное расстояние, чтобы уменьшить связь между слоем " +"подложки и модели. Упрощает процесс последующего отделения подложки." + +#: fdmprinter.def.json +msgctxt "layer_0_z_overlap label" +msgid "Initial Layer Z Overlap" +msgstr "Z наложение первого слоя" + +#: fdmprinter.def.json +msgctxt "layer_0_z_overlap description" +msgid "" +"Make the first and second layer of the model overlap in the Z direction to " +"compensate for the filament lost in the airgap. All models above the first " +"model layer will be shifted down by this amount." +msgstr "" +"Приводит к наложению первого и второго слоёв модели по оси Z для компенсации " +"потерь материала в воздушном зазоре. Все слои модели выше первого будут " +"смешены чуть ниже на указанное значение." + +#: fdmprinter.def.json +msgctxt "raft_surface_layers label" +msgid "Raft Top Layers" +msgstr "Верхние слои подложки" + +#: fdmprinter.def.json +msgctxt "raft_surface_layers description" +msgid "" +"The number of top layers on top of the 2nd raft layer. These are fully " +"filled layers that the model sits on. 2 layers result in a smoother top " +"surface than 1." +msgstr "" +"Количество верхних слоёв над вторым слоем подложки. Это такие полностью " +"заполненные слои, на которых размещается модель. Два слоя приводят к более " +"гладкой поверхности чем один." + +#: fdmprinter.def.json +msgctxt "raft_surface_thickness label" +msgid "Raft Top Layer Thickness" +msgstr "Толщина верхнего слоя подложки" + +#: fdmprinter.def.json +msgctxt "raft_surface_thickness description" +msgid "Layer thickness of the top raft layers." +msgstr "Толщина верхних слоёв поддержки." + +#: fdmprinter.def.json +msgctxt "raft_surface_line_width label" +msgid "Raft Top Line Width" +msgstr "Ширина линий верха подложки" + +#: fdmprinter.def.json +msgctxt "raft_surface_line_width description" +msgid "" +"Width of the lines in the top surface of the raft. These can be thin lines " +"so that the top of the raft becomes smooth." +msgstr "" +"Ширина линий верхних слоёв подложки. Это могут быть тонкие линии, которые " +"делают подложку гладкой." + +#: fdmprinter.def.json +msgctxt "raft_surface_line_spacing label" +msgid "Raft Top Spacing" +msgstr "Дистанция между линиями верха поддержки" + +#: fdmprinter.def.json +msgctxt "raft_surface_line_spacing description" +msgid "" +"The distance between the raft lines for the top raft layers. The spacing " +"should be equal to the line width, so that the surface is solid." +msgstr "" +"Расстояние между линиями подложки на её верхних слоёв. Расстояние должно " +"быть равно ширине линии, тогда поверхность будет сплошной." + +#: fdmprinter.def.json +msgctxt "raft_interface_thickness label" +msgid "Raft Middle Thickness" +msgstr "Толщина середины подложки" + +#: fdmprinter.def.json +msgctxt "raft_interface_thickness description" +msgid "Layer thickness of the middle raft layer." +msgstr "Толщина слоёв средних слоёв подложки." + +#: fdmprinter.def.json +msgctxt "raft_interface_line_width label" +msgid "Raft Middle Line Width" +msgstr "Ширина линий середины подложки" + +#: fdmprinter.def.json +msgctxt "raft_interface_line_width description" +msgid "" +"Width of the lines in the middle raft layer. Making the second layer extrude " +"more causes the lines to stick to the build plate." +msgstr "" +"Толщина линий средних слоёв подложки. Приводит к повышенному выдавливанию " +"материала на втором слое, для лучшего прилипания к столу." + +#: fdmprinter.def.json +msgctxt "raft_interface_line_spacing label" +msgid "Raft Middle Spacing" +msgstr "Дистанция между слоями середины подложки" + +#: fdmprinter.def.json +msgctxt "raft_interface_line_spacing description" +msgid "" +"The distance between the raft lines for the middle raft layer. The spacing " +"of the middle should be quite wide, while being dense enough to support the " +"top raft layers." +msgstr "" +"Расстояние между линиями средних слоёв подложки. Дистанция в средних слоях " +"должна быть достаточно широкой, чтобы создавать нужной плотность для " +"поддержки верхних слоёв подложки." + +#: fdmprinter.def.json +msgctxt "raft_base_thickness label" +msgid "Raft Base Thickness" +msgstr "Толщина нижнего слоя подложки" + +#: fdmprinter.def.json +msgctxt "raft_base_thickness description" +msgid "" +"Layer thickness of the base raft layer. This should be a thick layer which " +"sticks firmly to the printer build plate." +msgstr "" +"Толщина нижнего слоя подложки. Она должна быть достаточной для хорошего " +"прилипания подложки к столу." + +#: fdmprinter.def.json +msgctxt "raft_base_line_width label" +msgid "Raft Base Line Width" +msgstr "Ширина линии нижнего слоя подложки" + +#: fdmprinter.def.json +msgctxt "raft_base_line_width description" +msgid "" +"Width of the lines in the base raft layer. These should be thick lines to " +"assist in build plate adhesion." +msgstr "" +"Ширина линий нижнего слоя подложки. Она должна быть достаточной, чтобы " +"улучшить прилипание к столу." + +#: fdmprinter.def.json +msgctxt "raft_base_line_spacing label" +msgid "Raft Line Spacing" +msgstr "Дистанция между линиями нижнего слоя" + +#: fdmprinter.def.json +msgctxt "raft_base_line_spacing description" +msgid "" +"The distance between the raft lines for the base raft layer. Wide spacing " +"makes for easy removal of the raft from the build plate." +msgstr "" +"Расстояние между линиями нижнего слоя подложки. Большее значение упрощает " +"снятие модели со стола." + +#: fdmprinter.def.json +msgctxt "raft_speed label" +msgid "Raft Print Speed" +msgstr "Скорость печати подложки" + +#: fdmprinter.def.json +msgctxt "raft_speed description" +msgid "The speed at which the raft is printed." +msgstr "Скорость, на которой печатается подложка." + +#: fdmprinter.def.json +msgctxt "raft_surface_speed label" +msgid "Raft Top Print Speed" +msgstr "Скорость печати верха подложки" + +#: fdmprinter.def.json +msgctxt "raft_surface_speed description" +msgid "" +"The speed at which the top raft layers are printed. These should be printed " +"a bit slower, so that the nozzle can slowly smooth out adjacent surface " +"lines." +msgstr "" +"Скорость, на которой печатаются верхние слои подложки. Верх подложки долежн " +"печататься немного медленнее, чтобы сопло могло медленно разглаживать линии " +"поверхности." + +#: fdmprinter.def.json +msgctxt "raft_interface_speed label" +msgid "Raft Middle Print Speed" +msgstr "Скорость печати середины подложки" + +#: fdmprinter.def.json +msgctxt "raft_interface_speed description" +msgid "" +"The speed at which the middle raft layer is printed. This should be printed " +"quite slowly, as the volume of material coming out of the nozzle is quite " +"high." +msgstr "" +"Скорость, на которой печатается средние слои подложки. Она должна быть " +"достаточно низкой, так как объём материала, выходящего из сопла, достаточно " +"большой." + +#: fdmprinter.def.json +msgctxt "raft_base_speed label" +msgid "Raft Base Print Speed" +msgstr "Скорость печати низа подложки" + +#: fdmprinter.def.json +msgctxt "raft_base_speed description" +msgid "" +"The speed at which the base raft layer is printed. This should be printed " +"quite slowly, as the volume of material coming out of the nozzle is quite " +"high." +msgstr "" +"Скорость, на которой печатается нижний слой подложки. Она должна быть " +"достаточно низкой, так как объём материала, выходящего из сопла, достаточно " +"большой." + +#: fdmprinter.def.json +msgctxt "raft_acceleration label" +msgid "Raft Print Acceleration" +msgstr "Ускорение печати подложки" + +#: fdmprinter.def.json +msgctxt "raft_acceleration description" +msgid "The acceleration with which the raft is printed." +msgstr "Ускорение, с которым печатается подложка." + +#: fdmprinter.def.json +msgctxt "raft_surface_acceleration label" +msgid "Raft Top Print Acceleration" +msgstr "Ускорение печати верха подложки" + +#: fdmprinter.def.json +msgctxt "raft_surface_acceleration description" +msgid "The acceleration with which the top raft layers are printed." +msgstr "Ускорение, с которым печатаются верхние слои подложки." + +#: fdmprinter.def.json +msgctxt "raft_interface_acceleration label" +msgid "Raft Middle Print Acceleration" +msgstr "Ускорение печати середины подложки" + +#: fdmprinter.def.json +msgctxt "raft_interface_acceleration description" +msgid "The acceleration with which the middle raft layer is printed." +msgstr "Ускорение, с которым печатаются средние слои подложки." + +#: fdmprinter.def.json +msgctxt "raft_base_acceleration label" +msgid "Raft Base Print Acceleration" +msgstr "Ускорение печати низа подложки" + +#: fdmprinter.def.json +msgctxt "raft_base_acceleration description" +msgid "The acceleration with which the base raft layer is printed." +msgstr "Ускорение, с которым печатаются нижние слои подложки." + +#: fdmprinter.def.json +msgctxt "raft_jerk label" +msgid "Raft Print Jerk" +msgstr "Рывок подложки" + +#: fdmprinter.def.json +msgctxt "raft_jerk description" +msgid "The jerk with which the raft is printed." +msgstr "Скорость изменения ускорений при печати подложки." + +#: fdmprinter.def.json +msgctxt "raft_surface_jerk label" +msgid "Raft Top Print Jerk" +msgstr "Рывок печати верха подложки" + +#: fdmprinter.def.json +msgctxt "raft_surface_jerk description" +msgid "The jerk with which the top raft layers are printed." +msgstr "" +"Изменение максимальной мгновенной скорости, с которой печатается верхние " +"слои подложки." + +#: fdmprinter.def.json +msgctxt "raft_interface_jerk label" +msgid "Raft Middle Print Jerk" +msgstr "Рывок печати середины подложки" + +#: fdmprinter.def.json +msgctxt "raft_interface_jerk description" +msgid "The jerk with which the middle raft layer is printed." +msgstr "" +"Изменение максимальной мгновенной скорости, с которой печатается срелние " +"слои подложки." + +#: fdmprinter.def.json +msgctxt "raft_base_jerk label" +msgid "Raft Base Print Jerk" +msgstr "Рывок печати низа подложки" + +#: fdmprinter.def.json +msgctxt "raft_base_jerk description" +msgid "The jerk with which the base raft layer is printed." +msgstr "" +"Изменение максимальной мгновенной скорости, с которой печатается нижние слои " +"подложки." + +#: fdmprinter.def.json +msgctxt "raft_fan_speed label" +msgid "Raft Fan Speed" +msgstr "Скорость вентилятора для подложки" + +#: fdmprinter.def.json +msgctxt "raft_fan_speed description" +msgid "The fan speed for the raft." +msgstr "Скорость вращения вентилятора при печати подложки." + +#: fdmprinter.def.json +msgctxt "raft_surface_fan_speed label" +msgid "Raft Top Fan Speed" +msgstr "Скорость вентилятора для верха подложки" + +#: fdmprinter.def.json +msgctxt "raft_surface_fan_speed description" +msgid "The fan speed for the top raft layers." +msgstr "Скорость вентилятора при печати верхних слоёв подложки." + +#: fdmprinter.def.json +msgctxt "raft_interface_fan_speed label" +msgid "Raft Middle Fan Speed" +msgstr "Скорость вентилятора для середины подложки" + +#: fdmprinter.def.json +msgctxt "raft_interface_fan_speed description" +msgid "The fan speed for the middle raft layer." +msgstr "Скорость вентилятора при печати средних слоёв подложки." + +#: fdmprinter.def.json +msgctxt "raft_base_fan_speed label" +msgid "Raft Base Fan Speed" +msgstr "Скорость вентилятора для низа подложки" + +#: fdmprinter.def.json +msgctxt "raft_base_fan_speed description" +msgid "The fan speed for the base raft layer." +msgstr "Скорость вентилятора при печати нижнего слоя подложки." + +#: fdmprinter.def.json +msgctxt "dual label" +msgid "Dual Extrusion" +msgstr "Два экструдера" + +#: fdmprinter.def.json +msgctxt "dual description" +msgid "Settings used for printing with multiple extruders." +msgstr "Параметры, используемые для печати несколькими экструдерами." + +#: fdmprinter.def.json +msgctxt "prime_tower_enable label" +msgid "Enable Prime Tower" +msgstr "Разрешить черновую башню" + +#: fdmprinter.def.json +msgctxt "prime_tower_enable description" +msgid "" +"Print a tower next to the print which serves to prime the material after " +"each nozzle switch." +msgstr "" +"Печатает башню перед печатью модели, что помогает выдавить старый материал " +"после смены экструдера." + +#: fdmprinter.def.json +msgctxt "prime_tower_size label" +msgid "Prime Tower Size" +msgstr "Размер черновой башни" + +#: fdmprinter.def.json +msgctxt "prime_tower_size description" +msgid "The width of the prime tower." +msgstr "Диаметр черновой башни." + +#: fdmprinter.def.json +msgctxt "prime_tower_min_volume label" +msgid "Prime Tower Minimum Volume" +msgstr "Минимальный объём черновой башни" + +#: fdmprinter.def.json +msgctxt "prime_tower_min_volume description" +msgid "" +"The minimum volume for each layer of the prime tower in order to purge " +"enough material." +msgstr "" +"Минимальный объём материала на каждый слой черновой башни, который требуется " +"выдавить." + +#: fdmprinter.def.json +msgctxt "prime_tower_wall_thickness label" +msgid "Prime Tower Thickness" +msgstr "Толщина черновой башни" + +#: fdmprinter.def.json +msgctxt "prime_tower_wall_thickness description" +msgid "" +"The thickness of the hollow prime tower. A thickness larger than half the " +"Prime Tower Minimum Volume will result in a dense prime tower." +msgstr "" +"Толщина полости черновой башни. Если толщина больше половины минимального " +"объёма черновой башни, то результатом будет увеличение плотности башни." + +#: fdmprinter.def.json +msgctxt "prime_tower_position_x label" +msgid "Prime Tower X Position" +msgstr "X позиция черновой башни" + +#: fdmprinter.def.json +msgctxt "prime_tower_position_x description" +msgid "The x coordinate of the position of the prime tower." +msgstr "X координата позиции черновой башни." + +#: fdmprinter.def.json +msgctxt "prime_tower_position_y label" +msgid "Prime Tower Y Position" +msgstr "Y позиция черновой башни" + +#: fdmprinter.def.json +msgctxt "prime_tower_position_y description" +msgid "The y coordinate of the position of the prime tower." +msgstr "Y координата позиции черновой башни." + +#: fdmprinter.def.json +msgctxt "prime_tower_flow label" +msgid "Prime Tower Flow" +msgstr "Поток черновой башни" + +#: fdmprinter.def.json +msgctxt "prime_tower_flow description" +msgid "" +"Flow compensation: the amount of material extruded is multiplied by this " +"value." +msgstr "" +"Компенсация потока: объём выдавленного материала умножается на этот " +"коэффициент." + +#: fdmprinter.def.json +msgctxt "prime_tower_wipe_enabled label" +msgid "Wipe Inactive Nozzle on Prime Tower" +msgstr "Очистка неактивного сопла на черновой башне" + +#: fdmprinter.def.json +msgctxt "prime_tower_wipe_enabled description" +msgid "" +"After printing the prime tower with one nozzle, wipe the oozed material from " +"the other nozzle off on the prime tower." +msgstr "" +"После печати черновой башни одним соплом, вытирает вытекший материал из " +"другого сопла об эту башню." + +#: fdmprinter.def.json +msgctxt "dual_pre_wipe label" +msgid "Wipe Nozzle After Switch" +msgstr "Очистка сопла после переключения" + +#: fdmprinter.def.json +msgctxt "dual_pre_wipe description" +msgid "" +"After switching extruder, wipe the oozed material off of the nozzle on the " +"first thing printed. This performs a safe slow wipe move at a place where " +"the oozed material causes least harm to the surface quality of your print." +msgstr "" +"После смены экструдера убираем материал, вытекший из сопла, на первой " +"печатаемой части. Выполняется безопасная медленная очистка на месте, где " +"вытекший материал нанесёт наименьший ущерб качеству печатаемой поверхности." + +#: fdmprinter.def.json +msgctxt "ooze_shield_enabled label" +msgid "Enable Ooze Shield" +msgstr "Печатать защиту от капель" + +#: fdmprinter.def.json +msgctxt "ooze_shield_enabled description" +msgid "" +"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." +msgstr "" +"Разрешает печать внешней защиты от вытекших капель. Создаёт ограду вокруг " +"модели, о которую вытирается материал вытекший из второго сопла, если оно " +"находится на той же высоте, что и первое сопло." + +#: fdmprinter.def.json +msgctxt "ooze_shield_angle label" +msgid "Ooze Shield Angle" +msgstr "Угол защиты от капель" + +#: fdmprinter.def.json +msgctxt "ooze_shield_angle description" +msgid "" +"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." +msgstr "" +"Максимальный угол, который может иметь часть защиты от капель. При 0 " +"градусов будет вертикаль, при 90 - будет горизонталь. Малые значения угла " +"приводят к лучшему качеству, но тратят больше материала." + +#: fdmprinter.def.json +msgctxt "ooze_shield_dist label" +msgid "Ooze Shield Distance" +msgstr "Дистанция до защиты от капель" + +#: fdmprinter.def.json +msgctxt "ooze_shield_dist description" +msgid "Distance of the ooze shield from the print, in the X/Y directions." +msgstr "Дистанция до стенки защиты от модели, по осям X/Y." + +#: fdmprinter.def.json +msgctxt "meshfix label" +msgid "Mesh Fixes" +msgstr "Ремонт объектов" + +#: fdmprinter.def.json +msgctxt "meshfix description" +msgid "category_fixes" +msgstr "" + +#: fdmprinter.def.json +msgctxt "meshfix_union_all label" +msgid "Union Overlapping Volumes" +msgstr "Объединение перекрывающихся объёмов" + +#: fdmprinter.def.json +msgctxt "meshfix_union_all description" +msgid "" +"Ignore the internal geometry arising from overlapping volumes within a mesh " +"and print the volumes as one. This may cause unintended internal cavities to " +"disappear." +msgstr "" +"Игнорирует внутреннюю геометрию, являющуюся результатом перекрытия объёмов в " +"модели, и печатает эти объёмы как один. Это может приводить к " +"непреднамеренному исчезновению внутренних полостей." + +#: fdmprinter.def.json +msgctxt "meshfix_union_all_remove_holes label" +msgid "Remove All Holes" +msgstr "Удаляет все отверстия" + +#: fdmprinter.def.json +msgctxt "meshfix_union_all_remove_holes description" +msgid "" +"Remove the holes in each layer and keep only the outside shape. This will " +"ignore any invisible internal geometry. However, it also ignores layer holes " +"which can be viewed from above or below." +msgstr "" +"Удаляет отверстия в каждом слое, оставляя только внешнюю форму. Вся " +"невидимая внутренняя геометрия будет проигнорирована. Однако, также будут " +"проигнорированы отверстия в слоях, которые могут быть видны сверху или снизу." + +#: fdmprinter.def.json +msgctxt "meshfix_extensive_stitching label" +msgid "Extensive Stitching" +msgstr "Обширное сшивание" + +#: fdmprinter.def.json +msgctxt "meshfix_extensive_stitching description" +msgid "" +"Extensive stitching tries to stitch up open holes in the mesh by closing the " +"hole with touching polygons. This option can introduce a lot of processing " +"time." +msgstr "" +"Обширное сшивание пытается сшить открытые отверстия в объекте, закрывая их " +"полигонами. Эта опция может добавить дополнительное время во время обработки." + +#: fdmprinter.def.json +msgctxt "meshfix_keep_open_polygons label" +msgid "Keep Disconnected Faces" +msgstr "Сохранить отсоединённые поверхности" + +#: fdmprinter.def.json +msgctxt "meshfix_keep_open_polygons description" +msgid "" +"Normally Cura tries to stitch up small holes in the mesh and remove parts of " +"a layer with big holes. Enabling this option keeps those parts which cannot " +"be stitched. This option should be used as a last resort option when " +"everything else fails to produce proper GCode." +msgstr "" +"Обычно Cura пытается закрыть небольшие отверстия в объекте и убрать части " +"слоя с большими отверстиями. Включение этого параметра сохраняет те части, " +"что не могут быть сшиты. Этот параметр должен использоваться как последний " +"вариант, когда уже ничего не помогает получить нормальный GCode." + +#: fdmprinter.def.json +msgctxt "multiple_mesh_overlap label" +msgid "Merged Meshes Overlap" +msgstr "Перекрытие касающихся объектов" + +#: fdmprinter.def.json +msgctxt "multiple_mesh_overlap description" +msgid "" +"Make meshes which are touching each other overlap a bit. This makes them " +"bond together better." +msgstr "" +"Если объекты немного касаются друг друга, то сделаем их перерывающимися. Это " +"позволит им соединиться покрепче." + +#: fdmprinter.def.json +msgctxt "carve_multiple_volumes label" +msgid "Remove Mesh Intersection" +msgstr "Удалить пересечения объектов" + +#: fdmprinter.def.json +msgctxt "carve_multiple_volumes description" +msgid "" +"Remove areas where multiple meshes are overlapping with each other. This may " +"be used if merged dual material objects overlap with each other." +msgstr "" +"Удаляет области, где несколько объектов перекрываются друг с другом. Можно " +"использовать, для объектов, состоящих из двух материалов и пересекающихся " +"друг с другом." + +#: fdmprinter.def.json +msgctxt "alternate_carve_order label" +msgid "Alternate Mesh Removal" +msgstr "Чередование объектов" + +#: fdmprinter.def.json +msgctxt "alternate_carve_order description" +msgid "" +"Switch to which mesh intersecting volumes will belong with every layer, so " +"that the overlapping meshes become interwoven. Turning this setting off will " +"cause one of the meshes to obtain all of the volume in the overlap, while it " +"is removed from the other meshes." +msgstr "" +"Чередует какой из объектов, пересекающихся в объёме, будет участвовать в " +"печати каждого слоя, таким образом, что пересекающиеся объекты становятся " +"вплетёнными друг в друга. Выключение этого параметра приведёт к тому, что " +"один из объектов займёт весь объём пересечения, в то время как данный объём " +"будет исключён из других объектов." + +#: fdmprinter.def.json +msgctxt "blackmagic label" +msgid "Special Modes" +msgstr "Специальные режимы" + +#: fdmprinter.def.json +msgctxt "blackmagic description" +msgid "category_blackmagic" +msgstr "" + +#: fdmprinter.def.json +msgctxt "print_sequence label" +msgid "Print Sequence" +msgstr "Последовательная печать" + +#: fdmprinter.def.json +msgctxt "print_sequence description" +msgid "" +"Whether to print all models one layer at a time or to wait for one model to " +"finish, before moving on to the next. One at a time mode is only possible if " +"all models are separated in such a way that the whole print head can move in " +"between and all models are lower than the distance between the nozzle and " +"the X/Y axes." +msgstr "" +"Печатать ли все модели послойно или каждый модель в отдельности. Отдельная " +"печать возможна в случае, когда все модели разделены так, чтобы между ними " +"могла проходить голова принтера и все модели ниже чем расстояние до осей X/Y." + +#: fdmprinter.def.json +msgctxt "print_sequence option all_at_once" +msgid "All at Once" +msgstr "Все за раз" + +#: fdmprinter.def.json +msgctxt "print_sequence option one_at_a_time" +msgid "One at a Time" +msgstr "По отдельности" + +#: fdmprinter.def.json +msgctxt "infill_mesh label" +msgid "Infill Mesh" +msgstr "Заполнение объекта" + +#: fdmprinter.def.json +msgctxt "infill_mesh description" +msgid "" +"Use this mesh to modify the infill of other meshes with which it overlaps. " +"Replaces infill regions of other meshes with regions for this mesh. It's " +"suggested to only print one Wall and no Top/Bottom Skin for this mesh." +msgstr "" +"Использовать указанный объект для изменения заполнения других объектов, с " +"которыми он перекрывается. Заменяет области заполнения других объектов " +"областями для этого объекта. Предлагается только для печати одной стенки без " +"верхних и нижних поверхностей." + +#: fdmprinter.def.json +msgctxt "infill_mesh_order label" +msgid "Infill Mesh Order" +msgstr "Порядок заполнения объекта" + +#: fdmprinter.def.json +msgctxt "infill_mesh_order description" +msgid "" +"Determines which infill mesh is inside the infill of another infill mesh. An " +"infill mesh with a higher order will modify the infill of infill meshes with " +"lower order and normal meshes." +msgstr "" +"Определяет какой заполняющий объект находится внутри заполнения другого " +"заполняющего объекта. Заполняющий объект с более высоким порядком будет " +"модифицировать заполнение объектов с более низким порядком или обычных " +"объектов." + +#: fdmprinter.def.json +msgctxt "support_mesh label" +msgid "Support Mesh" +msgstr "Поддерживающий объект" + +#: fdmprinter.def.json +msgctxt "support_mesh description" +msgid "" +"Use this mesh to specify support areas. This can be used to generate support " +"structure." +msgstr "" +"Используйте этот объект для указания области поддержек. Может использоваться " +"при генерации структуры поддержек." + +#: fdmprinter.def.json +msgctxt "anti_overhang_mesh label" +msgid "Anti Overhang Mesh" +msgstr "Блокиратор поддержек" + +#: fdmprinter.def.json +msgctxt "anti_overhang_mesh description" +msgid "" +"Use this mesh to specify where no part of the model should be detected as " +"overhang. This can be used to remove unwanted support structure." +msgstr "" +"Используйте этот объект для указания частей модели, которые не должны " +"рассматриваться как свисающие. Может использоваться для удаления нежелаемых " +"структур поддержки." + +#: fdmprinter.def.json +msgctxt "magic_mesh_surface_mode label" +msgid "Surface Mode" +msgstr "Поверхностный режим" + +#: fdmprinter.def.json +msgctxt "magic_mesh_surface_mode description" +msgid "" +"Treat the model as a surface only, a volume, or volumes with loose surfaces. " +"The normal print mode only prints enclosed volumes. \"Surface\" prints a " +"single wall tracing the mesh surface with no infill and no top/bottom skin. " +"\"Both\" prints enclosed volumes like normal and any remaining polygons as " +"surfaces." +msgstr "" +"Рассматривать модель только в виде поверхности или как объёмы со свободными " +"поверхностями. При нормальном режиме печатаются только закрытые объёмы. В " +"режиме \"Поверхность\" печатается одиночная стенка по границе объекта, без " +"заполнения, верха и низа. В режиме \"Оба варианта\" печатаются закрытые " +"объёмы как нормальные, а любые оставшиеся полигоны как поверхности." + +#: fdmprinter.def.json +msgctxt "magic_mesh_surface_mode option normal" +msgid "Normal" +msgstr "Нормаль" + +#: fdmprinter.def.json +msgctxt "magic_mesh_surface_mode option surface" +msgid "Surface" +msgstr "Поверхность" + +#: fdmprinter.def.json +msgctxt "magic_mesh_surface_mode option both" +msgid "Both" +msgstr "Оба варианта" + +#: fdmprinter.def.json +msgctxt "magic_spiralize label" +msgid "Spiralize Outer Contour" +msgstr "Спирально печатать внешний контур" + +#: fdmprinter.def.json +msgctxt "magic_spiralize description" +msgid "" +"Spiralize smooths out the Z move of the outer edge. This will create a " +"steady Z increase over the whole print. This feature turns a solid model " +"into a single walled print with a solid bottom. This feature used to be " +"called Joris in older versions." +msgstr "" +"Спирально сглаживать движение по оси Z, печатая внешний контур. Приводит к " +"постоянному увеличению Z координаты во время печати. Этот параметр " +"превращает сплошной объект в одностенную модель с твёрдым дном. Раньше этот " +"параметр назывался Joris." + +#: fdmprinter.def.json +msgctxt "experimental label" +msgid "Experimental" +msgstr "Экспериментальное" + +#: fdmprinter.def.json +msgctxt "experimental description" +msgid "experimental!" +msgstr "экспериментальное!" + +#: fdmprinter.def.json +msgctxt "draft_shield_enabled label" +msgid "Enable Draft Shield" +msgstr "Разрешить печать кожуха" + +#: fdmprinter.def.json +msgctxt "draft_shield_enabled description" +msgid "" +"This will create a wall around the model, which traps (hot) air and shields " +"against exterior airflow. Especially useful for materials which warp easily." +msgstr "" +"Создаёт стенку вокруг модели, которая удерживает (горячий) воздух и " +"препятствует обдуву модели внешним воздушным потоком. Очень пригодится для " +"материалов, которые легко деформируются." + +#: fdmprinter.def.json +msgctxt "draft_shield_dist label" +msgid "Draft Shield X/Y Distance" +msgstr "Дистанция X/Y до кожуха" + +#: fdmprinter.def.json +msgctxt "draft_shield_dist description" +msgid "Distance of the draft shield from the print, in the X/Y directions." +msgstr "Дистанция до стенки кожуха от модели, по осям X/Y." + +#: fdmprinter.def.json +msgctxt "draft_shield_height_limitation label" +msgid "Draft Shield Limitation" +msgstr "Ограничение кожуха" + +#: fdmprinter.def.json +msgctxt "draft_shield_height_limitation description" +msgid "" +"Set the height of the draft shield. Choose to print the draft shield at the " +"full height of the model or at a limited height." +msgstr "" +"Устанавливает высоту кожуха. Можно печать кожух высотой с модель или указать " +"определённую высоту." + +#: fdmprinter.def.json +msgctxt "draft_shield_height_limitation option full" +msgid "Full" +msgstr "Полная" + +#: fdmprinter.def.json +msgctxt "draft_shield_height_limitation option limited" +msgid "Limited" +msgstr "Ограниченная" + +#: fdmprinter.def.json +msgctxt "draft_shield_height label" +msgid "Draft Shield Height" +msgstr "Высота кожуха" + +#: fdmprinter.def.json +msgctxt "draft_shield_height description" +msgid "" +"Height limitation of the draft shield. Above this height no draft shield " +"will be printed." +msgstr "" +"Ограничение по высоте для кожуха. Выше указанного значение кожух печататься " +"не будет." + +#: fdmprinter.def.json +msgctxt "conical_overhang_enabled label" +msgid "Make Overhang Printable" +msgstr "Сделать нависания печатаемыми" + +#: fdmprinter.def.json +msgctxt "conical_overhang_enabled description" +msgid "" +"Change the geometry of the printed model such that minimal support is " +"required. Steep overhangs will become shallow overhangs. Overhanging areas " +"will drop down to become more vertical." +msgstr "" +"Изменяет геометрию печатаемой модели так, чтобы снизить требования к объёму " +"поддержек. Крутые навесы станут поменьше. Нависающие области опустятся и " +"станут более вертикальными." + +#: fdmprinter.def.json +msgctxt "conical_overhang_angle label" +msgid "Maximum Model Angle" +msgstr "Максимальный угол модели" + +#: fdmprinter.def.json +msgctxt "conical_overhang_angle description" +msgid "" +"The maximum angle of overhangs after the they have been made printable. At a " +"value of 0° all overhangs are replaced by a piece of model connected to the " +"build plate, 90° will not change the model in any way." +msgstr "" +"Максимальный угол нависания, после которого они становятся печатаемыми. При " +"значении в 0° все нависания заменяются частью модели, соединённой со столом, " +"при 90° в модель не вносится никаких изменений." + +#: fdmprinter.def.json +msgctxt "coasting_enable label" +msgid "Enable Coasting" +msgstr "Разрешить накат" + +#: fdmprinter.def.json +msgctxt "coasting_enable description" +msgid "" +"Coasting replaces the last part of an extrusion path with a travel path. The " +"oozed material is used to print the last piece of the extrusion path in " +"order to reduce stringing." +msgstr "" +"Накат отключает экструзию материала на завершающей части пути. Вытекающий " +"материал используется для печати на завершающей части пути, уменьшая " +"строчность." + +#: fdmprinter.def.json +msgctxt "coasting_volume label" +msgid "Coasting Volume" +msgstr "Объём наката" + +#: fdmprinter.def.json +msgctxt "coasting_volume description" +msgid "" +"The volume otherwise oozed. This value should generally be close to the " +"nozzle diameter cubed." +msgstr "" +"Объём, который бы сочился. Это значение должно обычно быть близко к " +"возведенному в куб диаметру сопла." + +#: fdmprinter.def.json +msgctxt "coasting_min_volume label" +msgid "Minimum Volume Before Coasting" +msgstr "Минимальный объём перед накатом" + +#: fdmprinter.def.json +msgctxt "coasting_min_volume description" +msgid "" +"The smallest volume an extrusion path should have before allowing coasting. " +"For smaller extrusion paths, less pressure has been built up in the bowden " +"tube and so the coasted volume is scaled linearly. This value should always " +"be larger than the Coasting Volume." +msgstr "" +"Минимальный объём экструзии, который должен быть произведён перед " +"выполнением наката. Для малых путей меньшее давление будет создаваться в " +"боудене и таким образом, объём наката будет изменяться линейно. Это значение " +"должно всегда быть больше \"Объёма наката\"." + +#: fdmprinter.def.json +msgctxt "coasting_speed label" +msgid "Coasting Speed" +msgstr "Скорость наката" + +#: fdmprinter.def.json +msgctxt "coasting_speed description" +msgid "" +"The speed by which to move during coasting, relative to the speed of the " +"extrusion path. A value slightly under 100% is advised, since during the " +"coasting move the pressure in the bowden tube drops." +msgstr "" +"Скорость, с которой производятся движения во время наката, относительно " +"скорости печати. Рекомендуется использовать значение чуть меньше 100%, так " +"как во время наката давление в боудене снижается." + +#: fdmprinter.def.json +msgctxt "skin_outline_count label" +msgid "Extra Skin Wall Count" +msgstr "Количество внешних дополнительных поверхностей" + +#: fdmprinter.def.json +msgctxt "skin_outline_count description" +msgid "" +"Replaces the outermost part of the top/bottom pattern with a number of " +"concentric lines. Using one or two lines improves roofs that start on infill " +"material." +msgstr "" +"Заменяет внешнюю часть шаблона крышки/дна рядом концентрических линий. " +"Использование одной или двух линий улучшает мосты, которые печатаются поверх " +"материала заполнения." + +#: fdmprinter.def.json +msgctxt "skin_alternate_rotation label" +msgid "Alternate Skin Rotation" +msgstr "Чередование вращения поверхности" + +#: fdmprinter.def.json +msgctxt "skin_alternate_rotation description" +msgid "" +"Alternate the direction in which the top/bottom layers are printed. Normally " +"they are printed diagonally only. This setting adds the X-only and Y-only " +"directions." +msgstr "" +"Изменить направление, в котором печатаются слои крышки/дна. Обычно, они " +"печатаются по диагонали. Данный параметр добавляет направления X-только и Y-" +"только." + +#: fdmprinter.def.json +msgctxt "support_conical_enabled label" +msgid "Enable Conical Support" +msgstr "Конические поддержки" + +#: fdmprinter.def.json +msgctxt "support_conical_enabled description" +msgid "" +"Experimental feature: Make support areas smaller at the bottom than at the " +"overhang." +msgstr "" +"Экспериментальная возможность: Нижняя часть поддержек становится меньше, чем " +"верхняя." + +#: fdmprinter.def.json +msgctxt "support_conical_angle label" +msgid "Conical Support Angle" +msgstr "Угол конических поддержек" + +#: fdmprinter.def.json +msgctxt "support_conical_angle description" +msgid "" +"The angle of the tilt of conical support. With 0 degrees being vertical, and " +"90 degrees being horizontal. Smaller angles cause the support to be more " +"sturdy, but consist of more material. Negative angles cause the base of the " +"support to be wider than the top." +msgstr "" +"Угол наклона конических поддержек. При 0 градусах поддержки будут " +"вертикальными, при 90 градусах будут горизонтальными. Меньшее значение углов " +"укрепляет поддержки, но требует больше материала для них. Отрицательные углы " +"приводят утолщению основания поддержек по сравнению с их верхней частью." + +#: fdmprinter.def.json +msgctxt "support_conical_min_width label" +msgid "Conical Support Minimum Width" +msgstr "Минимальная ширина конических поддержек" + +#: fdmprinter.def.json +msgctxt "support_conical_min_width description" +msgid "" +"Minimum width to which the base of the conical support area is reduced. " +"Small widths can lead to unstable support structures." +msgstr "" +"Минимальная ширина, до которой может быть уменьшен низ конуса. Малая ширина " +"может сделать такую структуру поддержек нестабильной." + +#: fdmprinter.def.json +msgctxt "infill_hollow label" +msgid "Hollow Out Objects" +msgstr "Пустые объекты" + +#: fdmprinter.def.json +msgctxt "infill_hollow description" +msgid "" +"Remove all infill and make the inside of the object eligible for support." +msgstr "Удаляет всё заполнение и разрешает генерацию поддержек внутри объекта." + +#: fdmprinter.def.json +msgctxt "magic_fuzzy_skin_enabled label" +msgid "Fuzzy Skin" +msgstr "Нечёткая поверхность" + +#: fdmprinter.def.json +msgctxt "magic_fuzzy_skin_enabled description" +msgid "" +"Randomly jitter while printing the outer wall, so that the surface has a " +"rough and fuzzy look." +msgstr "" +"Вносит небольшое дрожание при печати внешней стенки, что придаёт поверхности " +"шершавый вид." + +#: fdmprinter.def.json +msgctxt "magic_fuzzy_skin_thickness label" +msgid "Fuzzy Skin Thickness" +msgstr "Толщина шершавости" + +#: fdmprinter.def.json +msgctxt "magic_fuzzy_skin_thickness description" +msgid "" +"The width within which to jitter. It's advised to keep this below the outer " +"wall width, since the inner walls are unaltered." +msgstr "" +"Величина амплитуды дрожания. Рекомендуется придерживаться толщины внешней " +"стенки, так как внутренние стенки не изменяются." + +#: fdmprinter.def.json +msgctxt "magic_fuzzy_skin_point_density label" +msgid "Fuzzy Skin Density" +msgstr "Плотность шершавой стенки" + +#: fdmprinter.def.json +msgctxt "magic_fuzzy_skin_point_density description" +msgid "" +"The average density of points introduced on each polygon in a layer. Note " +"that the original points of the polygon are discarded, so a low density " +"results in a reduction of the resolution." +msgstr "" +"Средняя плотность точек, добавленных на каждом полигоне в слое. Следует " +"отметить, что оригинальные точки полигона отбрасываются, следовательно " +"низкая плотность приводит к уменьшению разрешения." + +#: fdmprinter.def.json +msgctxt "magic_fuzzy_skin_point_dist label" +msgid "Fuzzy Skin Point Distance" +msgstr "Дистанция между точками шершавости" + +#: fdmprinter.def.json +msgctxt "magic_fuzzy_skin_point_dist description" +msgid "" +"The average distance between the random points introduced on each line " +"segment. Note that the original points of the polygon are discarded, so a " +"high smoothness results in a reduction of the resolution. This value must be " +"higher than half the Fuzzy Skin Thickness." +msgstr "" +"Среднее расстояние между случайными точками, который вносятся в каждый " +"сегмент линии. Следует отметить, что оригинальные точки полигона " +"отбрасываются, таким образом, сильное сглаживание приводит к уменьшению " +"разрешения. Это значение должно быть больше половины толщины шершавости." + +#: fdmprinter.def.json +msgctxt "wireframe_enabled label" +msgid "Wire Printing" +msgstr "Каркасная печать (КП)" + +#: fdmprinter.def.json +msgctxt "wireframe_enabled description" +msgid "" +"Print only the outside surface with a sparse webbed structure, printing 'in " +"thin air'. This is realized by horizontally printing the contours of the " +"model at given Z intervals which are connected via upward and diagonally " +"downward lines." +msgstr "" +"Печатать только внешнюю поверхность с редкой перепончатой структурой, " +"печатаемой \"прямо в воздухе\". Это реализуется горизонтальной печатью " +"контуров модели с заданными Z интервалами, которые соединяются диагональными " +"линиями." + +#: fdmprinter.def.json +msgctxt "wireframe_height label" +msgid "WP Connection Height" +msgstr "Высота соединений (КП)" + +#: fdmprinter.def.json +msgctxt "wireframe_height description" +msgid "" +"The height of the upward and diagonally downward lines between two " +"horizontal parts. This determines the overall density of the net structure. " +"Only applies to Wire Printing." +msgstr "" +"Высота диагональных линий между двумя горизонтальными частями. Она " +"определяет общую плотность сетевой структуры. Применяется только при " +"каркасной печати." + +#: fdmprinter.def.json +msgctxt "wireframe_roof_inset label" +msgid "WP Roof Inset Distance" +msgstr "Расстояние крыши внутрь (КП)" + +#: fdmprinter.def.json +msgctxt "wireframe_roof_inset description" +msgid "" +"The distance covered when making a connection from a roof outline inward. " +"Only applies to Wire Printing." +msgstr "" +"Покрываемое расстояние при создании соединения от внешней части крыши " +"внутрь. Применяется только при каркасной печати." + +#: fdmprinter.def.json +msgctxt "wireframe_printspeed label" +msgid "WP Speed" +msgstr "Скорость каркасной печати" + +#: fdmprinter.def.json +msgctxt "wireframe_printspeed description" +msgid "" +"Speed at which the nozzle moves when extruding material. Only applies to " +"Wire Printing." +msgstr "" +"Скорость с которой двигается сопло, выдавая материал. Применяется только при " +"каркасной печати." + +#: fdmprinter.def.json +msgctxt "wireframe_printspeed_bottom label" +msgid "WP Bottom Printing Speed" +msgstr "Скорость печати низа (КП)" + +#: fdmprinter.def.json +msgctxt "wireframe_printspeed_bottom description" +msgid "" +"Speed of printing the first layer, which is the only layer touching the " +"build platform. Only applies to Wire Printing." +msgstr "" +"Скорость, с которой печатается первый слой, касающийся стола. Применяется " +"только при каркасной печати." + +#: fdmprinter.def.json +msgctxt "wireframe_printspeed_up label" +msgid "WP Upward Printing Speed" +msgstr "Скорость печати вверх (КП)" + +#: fdmprinter.def.json +msgctxt "wireframe_printspeed_up description" +msgid "" +"Speed of printing a line upward 'in thin air'. Only applies to Wire Printing." +msgstr "" +"Скорость печати линии вверх \"в разрежённом воздухе\". Применяется только " +"при каркасной печати." + +#: fdmprinter.def.json +msgctxt "wireframe_printspeed_down label" +msgid "WP Downward Printing Speed" +msgstr "Скорость печати вниз (КП)" + +#: fdmprinter.def.json +msgctxt "wireframe_printspeed_down description" +msgid "" +"Speed of printing a line diagonally downward. Only applies to Wire Printing." +msgstr "" +"Скорость печати линии диагонально вниз. Применяется только при каркасной " +"печати." + +#: fdmprinter.def.json +msgctxt "wireframe_printspeed_flat label" +msgid "WP Horizontal Printing Speed" +msgstr "Скорость горизонтальной печати (КП)" + +#: fdmprinter.def.json +msgctxt "wireframe_printspeed_flat description" +msgid "" +"Speed of printing the horizontal contours of the model. Only applies to Wire " +"Printing." +msgstr "" +"Скорость, с которой печатаются горизонтальные контуры модели. Применяется " +"только при нитевой печати." + +#: fdmprinter.def.json +msgctxt "wireframe_flow label" +msgid "WP Flow" +msgstr "Поток каркасной печати" + +#: fdmprinter.def.json +msgctxt "wireframe_flow description" +msgid "" +"Flow compensation: the amount of material extruded is multiplied by this " +"value. Only applies to Wire Printing." +msgstr "" +"Компенсация потока: объём выдавленного материала умножается на это значение. " +"Применяется только при каркасной печати." + +#: fdmprinter.def.json +msgctxt "wireframe_flow_connection label" +msgid "WP Connection Flow" +msgstr "Поток соединений (КП)" + +#: fdmprinter.def.json +msgctxt "wireframe_flow_connection description" +msgid "Flow compensation when going up or down. Only applies to Wire Printing." +msgstr "" +"Компенсация потока при движении вверх и вниз. Применяется только при " +"каркасной печати." + +#: fdmprinter.def.json +msgctxt "wireframe_flow_flat label" +msgid "WP Flat Flow" +msgstr "Поток горизонтальных линий (КП)" + +#: fdmprinter.def.json +msgctxt "wireframe_flow_flat description" +msgid "" +"Flow compensation when printing flat lines. Only applies to Wire Printing." +msgstr "" +"Компенсация потока при печати плоских линий. Применяется только при " +"каркасной печати." + +#: fdmprinter.def.json +msgctxt "wireframe_top_delay label" +msgid "WP Top Delay" +msgstr "Верхняя задержка (КП)" + +#: fdmprinter.def.json +msgctxt "wireframe_top_delay description" +msgid "" +"Delay time after an upward move, so that the upward line can harden. Only " +"applies to Wire Printing." +msgstr "" +"Задержка после движения вверх, чтобы такие линии были твёрже. Применяется " +"только при каркасной печати." + +#: fdmprinter.def.json +msgctxt "wireframe_bottom_delay label" +msgid "WP Bottom Delay" +msgstr "Нижняя задержка (КП)" + +#: fdmprinter.def.json +msgctxt "wireframe_bottom_delay description" +msgid "Delay time after a downward move. Only applies to Wire Printing." +msgstr "Задержка после движения вниз. Применяется только при каркасной печати." + +#: fdmprinter.def.json +msgctxt "wireframe_flat_delay label" +msgid "WP Flat Delay" +msgstr "Горизонтальная задержка (КП)" + +#: fdmprinter.def.json +msgctxt "wireframe_flat_delay description" +msgid "" +"Delay time between two horizontal segments. Introducing such a delay can " +"cause better adhesion to previous layers at the connection points, while too " +"long delays cause sagging. Only applies to Wire Printing." +msgstr "" +"Задержка между двумя горизонтальными сегментами. Внесение такой задержки " +"может улучшить прилипание к предыдущим слоям в местах соединений, в то время " +"как более длинные задержки могут вызывать провисания. Применяется только при " +"нитевой печати." + +#: fdmprinter.def.json +msgctxt "wireframe_up_half_speed label" +msgid "WP Ease Upward" +msgstr "Ослабление вверх (КП)" + +#: fdmprinter.def.json +msgctxt "wireframe_up_half_speed description" +msgid "" +"Distance of an upward move which is extruded with half speed.\n" +"This can cause better adhesion to previous layers, while not heating the " +"material in those layers too much. Only applies to Wire Printing." +msgstr "" +"Расстояние движения вверх, при котором выдавливание идёт на половине " +"скорости.\n" +"Это может улучшить прилипание к предыдущим слоям, не перегревая материал тех " +"слоёв. Применяется только при каркасной печати." + +#: fdmprinter.def.json +msgctxt "wireframe_top_jump label" +msgid "WP Knot Size" +msgstr "Размер узла (КП)" + +#: fdmprinter.def.json +msgctxt "wireframe_top_jump description" +msgid "" +"Creates a small knot at the top of an upward line, so that the consecutive " +"horizontal layer has a better chance to connect to it. Only applies to Wire " +"Printing." +msgstr "" +"Создаёт небольшой узел наверху возвышающейся линии так, чтобы последующий " +"горизонтальный слой имел больший шанс к присоединению. Применяется только " +"при каркасной печати." + +#: fdmprinter.def.json +msgctxt "wireframe_fall_down label" +msgid "WP Fall Down" +msgstr "Падение (КП)" + +#: fdmprinter.def.json +msgctxt "wireframe_fall_down description" +msgid "" +"Distance with which the material falls down after an upward extrusion. This " +"distance is compensated for. Only applies to Wire Printing." +msgstr "" +"Расстояние с которой материал падает вниз после восходящего выдавливания. " +"Расстояние компенсируется. Применяется только при каркасной печати." + +#: fdmprinter.def.json +msgctxt "wireframe_drag_along label" +msgid "WP Drag Along" +msgstr "Протягивание (КП)" + +#: fdmprinter.def.json +msgctxt "wireframe_drag_along description" +msgid "" +"Distance with which the material of an upward extrusion is dragged along " +"with the diagonally downward extrusion. This distance is compensated for. " +"Only applies to Wire Printing." +msgstr "" +"Расстояние, на которое материал от восходящего выдавливания тянется во время " +"нисходящего выдавливания. Расстояние компенсируется. Применяется только при " +"каркасной печати." + +#: fdmprinter.def.json +msgctxt "wireframe_strategy label" +msgid "WP Strategy" +msgstr "Стратегия (КП)" + +#: fdmprinter.def.json +msgctxt "wireframe_strategy description" +msgid "" +"Strategy for making sure two consecutive layers connect at each connection " +"point. Retraction lets the upward lines harden in the right position, but " +"may cause filament grinding. A knot can be made at the end of an upward line " +"to heighten the chance of connecting to it and to let the line cool; " +"however, it may require slow printing speeds. Another strategy is to " +"compensate for the sagging of the top of an upward line; however, the lines " +"won't always fall down as predicted." +msgstr "" +"Стратегия проверки соединения двух соседних слоёв в соответствующих точках. " +"Откат укрепляет восходящие линии в нужных местах, но может привести к " +"истиранию нити материала. Узел может быть сделан в конце восходящей линии " +"для повышения шанса соединения с ним и позволить линии охладиться; однако, " +"это может потребовать пониженных скоростей печати. Другая стратегия состоит " +"в том, чтобы компенсировать провисание вершины восходящей линии; однако, " +"строки будут не всегда падать, как предсказано." + +#: fdmprinter.def.json +msgctxt "wireframe_strategy option compensate" +msgid "Compensate" +msgstr "Компенсация" + +#: fdmprinter.def.json +msgctxt "wireframe_strategy option knot" +msgid "Knot" +msgstr "Узел" + +#: fdmprinter.def.json +msgctxt "wireframe_strategy option retract" +msgid "Retract" +msgstr "Откат" + +#: fdmprinter.def.json +msgctxt "wireframe_straight_before_down label" +msgid "WP Straighten Downward Lines" +msgstr "Прямые нисходящие линии (КП)" + +#: fdmprinter.def.json +msgctxt "wireframe_straight_before_down description" +msgid "" +"Percentage of a diagonally downward line which is covered by a horizontal " +"line piece. This can prevent sagging of the top most point of upward lines. " +"Only applies to Wire Printing." +msgstr "" +"Процент диагонально нисходящей линии, которая покрывается куском " +"горизонтальной линии. Это может предотвратить провисание самых верхних " +"точек восходящих линий. Применяется только при каркасной печати." + +#: fdmprinter.def.json +msgctxt "wireframe_roof_fall_down label" +msgid "WP Roof Fall Down" +msgstr "Опадание крыши (КП)" + +#: fdmprinter.def.json +msgctxt "wireframe_roof_fall_down description" +msgid "" +"The distance which horizontal roof lines printed 'in thin air' fall down " +"when being printed. This distance is compensated for. Only applies to Wire " +"Printing." +msgstr "" +"Расстояние, на котором линии горизонтальной крыши печатаются \"в воздухе\" " +"подают вниз перед каркасной печати." + +#: fdmprinter.def.json +msgctxt "wireframe_roof_drag_along label" +msgid "WP Roof Drag Along" +msgstr "Протягивание крыши (КП)" + +#: fdmprinter.def.json +msgctxt "wireframe_roof_drag_along description" +msgid "" +"The distance of the end piece of an inward line which gets dragged along " +"when going back to the outer outline of the roof. This distance is " +"compensated for. Only applies to Wire Printing." +msgstr "" +"Расстояние финальной части восходящей линии, которая протягивается при " +"возвращении к внешнему контуру крыши. Это расстояние скомпенсировано. " +"Применяется только при каркасной печати." + +#: fdmprinter.def.json +msgctxt "wireframe_roof_outer_delay label" +msgid "WP Roof Outer Delay" +msgstr "Задержка внешней крыши (КП)" + +#: fdmprinter.def.json +msgctxt "wireframe_roof_outer_delay description" +msgid "" +"Time spent at the outer perimeters of hole which is to become a roof. Longer " +"times can ensure a better connection. Only applies to Wire Printing." +msgstr "" +"Время, потраченное на внешних периметрах отверстия, которое станет крышей. " +"Увеличенное время может придать прочности. Применяется только при каркасной " +"печати." + +#: fdmprinter.def.json +msgctxt "wireframe_nozzle_clearance label" +msgid "WP Nozzle Clearance" +msgstr "Зазор сопла (КП)" + +#: fdmprinter.def.json +msgctxt "wireframe_nozzle_clearance description" +msgid "" +"Distance between the nozzle and horizontally downward lines. Larger " +"clearance results in diagonally downward lines with a less steep angle, " +"which in turn results in less upward connections with the next layer. Only " +"applies to Wire Printing." +msgstr "" +"Зазор между соплом и горизонтально нисходящими линиями. Большее значение " +"уменьшает угол нисхождения, что приводит уменьшению восходящих соединений на " +"следующем слое. Применяется только при каркасной печати." + +#: fdmprinter.def.json +msgctxt "command_line_settings label" +msgid "Command Line Settings" +msgstr "Параметры командной строки" + +#: fdmprinter.def.json +msgctxt "command_line_settings description" +msgid "" +"Settings which are only used if CuraEngine isn't called from the Cura " +"frontend." +msgstr "" +"Параметры, которые используются в случае, когда CuraEngine вызывается " +"напрямую." + +#: fdmprinter.def.json +msgctxt "center_object label" +msgid "Center object" +msgstr "Центрирование объекта" + +#: fdmprinter.def.json +msgctxt "center_object description" +msgid "" +"Whether to center the object on the middle of the build platform (0,0), " +"instead of using the coordinate system in which the object was saved." +msgstr "" +"Следует ли размещать объект в центре стола (0, 0), вместо использования " +"координатной системы, в которой был сохранён объект." + +#: fdmprinter.def.json +msgctxt "mesh_position_x label" +msgid "Mesh position x" +msgstr "X позиция объекта" + +#: fdmprinter.def.json +msgctxt "mesh_position_x description" +msgid "Offset applied to the object in the x direction." +msgstr "Смещение, применяемое к объект по оси X." + +#: fdmprinter.def.json +msgctxt "mesh_position_y label" +msgid "Mesh position y" +msgstr "Y позиция объекта" + +#: fdmprinter.def.json +msgctxt "mesh_position_y description" +msgid "Offset applied to the object in the y direction." +msgstr "Смещение, применяемое к объект по оси Y." + +#: fdmprinter.def.json +msgctxt "mesh_position_z label" +msgid "Mesh position z" +msgstr "Z позиция объекта" + +#: fdmprinter.def.json +msgctxt "mesh_position_z description" +msgid "" +"Offset applied to the object in the z direction. With this you can perform " +"what was used to be called 'Object Sink'." +msgstr "" +"Смещение, применяемое к объект по оси Z. Это позволяет выполнять операцию, " +"ранее известную как проваливание объекта под поверхность стола." + +#: fdmprinter.def.json +msgctxt "mesh_rotation_matrix label" +msgid "Mesh Rotation Matrix" +msgstr "Матрица вращения объекта" + +#: fdmprinter.def.json +msgctxt "mesh_rotation_matrix description" +msgid "" +"Transformation matrix to be applied to the model when loading it from file." +msgstr "Матрица преобразования, применяемая к модели при её загрузки из файла." + +#~ msgctxt "machine_extruder_count label" +#~ msgid "Number extruders" +#~ msgstr "Количество экструдеров" + +#~ msgctxt "machine_heat_zone_length description" +#~ msgid "" +#~ "The distance from the tip of the nozzle in which heat from the nozzle is " +#~ "transfered to the filament." +#~ msgstr "Расстояние от кончика сопла, на котором тепло передаётся материалу." + +#~ msgctxt "z_seam_type description" +#~ msgid "" +#~ "Starting point of each path in a layer. When paths in consecutive layers " +#~ "start at the same point a vertical seam may show on the print. When " +#~ "aligning these at the back, the seam is easiest to remove. When placed " +#~ "randomly the inaccuracies at the paths' start will be less noticeable. " +#~ "When taking the shortest path the print will be quicker." +#~ msgstr "" +#~ "Начальная точка для каждого пути в слое. Когда пути в последовательных " +#~ "слоях начинаются в одной и той же точке, то на модели может возникать " +#~ "вертикальный шов. Проще всего удалить шов, выравнивая начало путей " +#~ "позади. Менее заметным шов можно сделать, случайно устанавливая начало " +#~ "путей. Если выбрать самый короткий путь, то печать будет быстрее." + +#~ msgctxt "z_seam_type option back" +#~ msgid "Back" +#~ msgstr "Позади" + +#~ msgctxt "retraction_hop_enabled label" +#~ msgid "Z Hop when Retracted" +#~ msgstr "Поднятие оси Z при откате" + +#~ msgctxt "speed_travel_layer_0 description" +#~ msgid "" +#~ "The speed of travel moves in the initial layer. A lower value is advised " +#~ "to prevent pulling previously printed parts away from the build plate." +#~ msgstr "" +#~ "Скорость перемещений на первом слое. Пониженное значение помогает " +#~ "избежать сдвига уже напечатанных частей со стола." + +#~ msgctxt "retraction_combing description" +#~ msgid "" +#~ "Combing keeps the nozzle within already printed areas when traveling. " +#~ "This results in slightly longer travel moves but reduces the need for " +#~ "retractions. If combing is off, the material will retract and the nozzle " +#~ "moves in a straight line to the next point. It is also possible to avoid " +#~ "combing over top/bottom skin areas by combing within the infill only. It " +#~ "is also possible to avoid combing over top/bottom skin areas by combing " +#~ "within the infill only." +#~ msgstr "" +#~ "Комбинг удерживает сопло при перемещении внутри уже напечатанных зон. Это " +#~ "приводит к небольшому увеличению пути, но уменьшает необходимость в " +#~ "откатах. При отключенном комбинге выполняется откат и сопло передвигается " +#~ "в следующую точку по прямой. Также есть возможность не применять комбинг " +#~ "над областями поверхностей крышки/дна, разрешив комбинг только над " +#~ "заполнением." + +#~ msgctxt "travel_avoid_other_parts label" +#~ msgid "Avoid Printed Parts when Traveling" +#~ msgstr "Избегать напечатанное" + +#~ msgctxt "cool_fan_full_at_height description" +#~ msgid "" +#~ "The height at which the fans spin on regular fan speed. At the layers " +#~ "below the fan speed gradually increases from zero to regular fan speed." +#~ msgstr "" +#~ "Высота, на которой вентилятор должен вращаться с обыкновенной скорость. " +#~ "На более низких слоях вентилятор будет постепенно разгоняться с нуля до " +#~ "обычной скорости." + +#~ msgctxt "cool_min_layer_time description" +#~ msgid "" +#~ "The minimum time spent in a layer. This forces the printer to slow down, " +#~ "to at least spend the time set here in one layer. This allows the printed " +#~ "material to cool down properly before printing the next layer." +#~ msgstr "" +#~ "Минимальное время, затрачиваемое на печать слоя. Эта величина заставляет " +#~ "принтер замедлиться, чтобы уложиться в указанное время при печати слоя. " +#~ "Это позволяет материалу остыть до нужной температуры перед печатью " +#~ "следующего слоя." + +#~ msgctxt "prime_tower_wipe_enabled label" +#~ msgid "Wipe Nozzle on Prime Tower" +#~ msgstr "Вытирать сопло о черновую башню" + +#~ msgctxt "multiple_mesh_overlap label" +#~ msgid "Dual Extrusion Overlap" +#~ msgstr "Перекрытие двойной экструзии" + +#~ msgctxt "multiple_mesh_overlap description" +#~ msgid "" +#~ "Make the models printed with different extruder trains overlap a bit. " +#~ "This makes the different materials bond together better." +#~ msgstr "" +#~ "Приводит к небольшому перекрытию моделей, напечатанных разными " +#~ "экструдерами. Это приводит к лучшей связи двух материалов друг с другом." + +#~ msgctxt "meshfix_union_all description" +#~ msgid "" +#~ "Ignore the internal geometry arising from overlapping volumes and print " +#~ "the volumes as one. This may cause internal cavities to disappear." +#~ msgstr "" +#~ "Игнорирование внутренней геометрии, возникшей при объединении объёмов и " +#~ "печать объёмов как единого целого. Это может привести к исчезновению " +#~ "внутренних поверхностей." + +#~ msgctxt "carve_multiple_volumes description" +#~ msgid "" +#~ "Remove areas where multiple objecs are overlapping with each other. This " +#~ "is may be used if merged dual material objects overlap with each other." +#~ msgstr "" +#~ "Удаляет области где несколько объектов перекрываются друг с другом. Можно " +#~ "использовать при пересечении объединённых мультиматериальных объектов." + +#~ msgctxt "remove_overlapping_walls_enabled label" +#~ msgid "Remove Overlapping Wall Parts" +#~ msgstr "Удаление перекрывающихся частей стены" + +#~ msgctxt "remove_overlapping_walls_enabled description" +#~ msgid "" +#~ "Remove parts of a wall which share an overlap which would result in " +#~ "overextrusion in some places. These overlaps occur in thin parts and " +#~ "sharp corners in models." +#~ msgstr "" +#~ "Удаляет части стены, которые перекрываются. что приводит к появлению " +#~ "излишков материала в некоторых местах. Такие перекрытия образуются в " +#~ "тонких частях и острых углах моделей." + +#~ msgctxt "remove_overlapping_walls_0_enabled label" +#~ msgid "Remove Overlapping Outer Wall Parts" +#~ msgstr "Удаление перекрывающихся частей внешних стенок" + +#~ msgctxt "remove_overlapping_walls_0_enabled description" +#~ msgid "" +#~ "Remove parts of an outer wall which share an overlap which would result " +#~ "in overextrusion in some places. These overlaps occur in thin pieces in a " +#~ "model and sharp corners." +#~ msgstr "" +#~ "Удаляет части внешней стены, которые перекрываются, что приводит к " +#~ "появлению излишков материала в некоторых местах. Такие перекрытия " +#~ "образуются в тонких частях и острых углах моделей." + +#~ msgctxt "remove_overlapping_walls_x_enabled label" +#~ msgid "Remove Overlapping Inner Wall Parts" +#~ msgstr "Удаление перекрывающихся частей внутренних стенок" + +#~ msgctxt "remove_overlapping_walls_x_enabled description" +#~ msgid "" +#~ "Remove parts of an inner wall that would otherwise overlap and cause over-" +#~ "extrusion. These overlaps occur in thin pieces in a model and sharp " +#~ "corners." +#~ msgstr "" +#~ "Удаляет части внутренних стенок, которые в противном случае будут " +#~ "перекрываться и приводить к появлению излишков материала. Такие " +#~ "перекрытия образуются в тонких частях и острых углах моделей." + +#~ msgctxt "fill_perimeter_gaps description" +#~ msgid "" +#~ "Fills the gaps between walls when overlapping inner wall parts are " +#~ "removed." +#~ msgstr "" +#~ "Заполняет зазоры между стенами после того, как перекрывающиеся части " +#~ "внутренних стенок были удалены." + +#~ msgctxt "infill_line_distance label" +#~ msgid "Line Distance" +#~ msgstr "Дистанция заполнения" + +#~ msgctxt "speed_support_roof label" +#~ msgid "Support Roof Speed" +#~ msgstr "Скорость печати крыши поддержек" + +#~ msgctxt "retraction_combing label" +#~ msgid "Enable Combing" +#~ msgstr "Разрешить комбинг" + +#~ msgctxt "support_type label" +#~ msgid "Placement" +#~ msgstr "Размещение" + +#~ msgctxt "support_xy_distance label" +#~ msgid "X/Y Distance" +#~ msgstr "Дистанция X/Y" + +#~ msgctxt "support_z_distance label" +#~ msgid "Z Distance" +#~ msgstr "Z дистанция" + +#~ msgctxt "support_top_distance label" +#~ msgid "Top Distance" +#~ msgstr "Дистанция сверху" + +#~ msgctxt "support_join_distance label" +#~ msgid "Join Distance" +#~ msgstr "Дистанция объединения" + +#~ msgctxt "support_area_smoothing label" +#~ msgid "Area Smoothing" +#~ msgstr "Сглаживание зон" + +#~ msgctxt "support_area_smoothing description" +#~ msgid "" +#~ "Maximum distance in the X/Y directions of a line segment which is to be " +#~ "smoothed out. Ragged lines are introduced by the join distance and " +#~ "support bridge, which cause the machine to resonate. Smoothing the " +#~ "support areas won't cause them to break with the constraints, except it " +#~ "might change the overhang." +#~ msgstr "" +#~ "Максимальное расстояние по осям X/Y в сегменте линии, которая подлежит " +#~ "сглаживанию. Неровные линии появляются при дистанции объединения и " +#~ "поддержке в виде моста, что заставляет принтер резонировать. Сглаживание " +#~ "зон поддержек не приводит к нарушению ограничений, кроме возможных " +#~ "изменений в навесаниях." + +#~ msgctxt "support_roof_height description" +#~ msgid "The thickness of the support roofs." +#~ msgstr "Толщина поддерживающей крыши." + +#~ msgctxt "support_roof_line_distance label" +#~ msgid "Support Roof Line Distance" +#~ msgstr "Дистанция линии крыши" + +#~ msgctxt "support_roof_pattern option lines" +#~ msgid "Lines" +#~ msgstr "Линии" + +#~ msgctxt "support_roof_pattern option grid" +#~ msgid "Grid" +#~ msgstr "Сетка" + +#~ msgctxt "support_roof_pattern option triangles" +#~ msgid "Triangles" +#~ msgstr "Треугольники" + +#~ msgctxt "support_roof_pattern option concentric" +#~ msgid "Concentric" +#~ msgstr "Концентрический" + +#~ msgctxt "support_roof_pattern option zigzag" +#~ msgid "Zig Zag" +#~ msgstr "Зигзаг" + +#~ msgctxt "support_conical_angle label" +#~ msgid "Cone Angle" +#~ msgstr "Угол конуса" + +#~ msgctxt "support_conical_min_width label" +#~ msgid "Cone Minimal Width" +#~ msgstr "Минимальная ширина конуса" + +#~ msgctxt "adhesion_type label" +#~ msgid "Type" +#~ msgstr "Тип" + +#~ msgctxt "raft_surface_speed label" +#~ msgid "Raft Surface Print Speed" +#~ msgstr "Скорость печати поверхности подложки" + +#~ msgctxt "raft_interface_speed label" +#~ msgid "Raft Interface Print Speed" +#~ msgstr "Скорость печати связи подложки" + +#~ msgctxt "raft_interface_speed description" +#~ msgid "" +#~ "The speed at which the interface raft layer is printed. This should be " +#~ "printed quite slowly, as the volume of material coming out of the nozzle " +#~ "is quite high." +#~ msgstr "" +#~ "Скорость, на которой печатается связующий слой подложки. Она должна быть " +#~ "достаточно низкой, так как объём материала, выходящего из сопла, " +#~ "достаточно большой." + +#~ msgctxt "raft_surface_fan_speed label" +#~ msgid "Raft Surface Fan Speed" +#~ msgstr "Скорость вентилятора для поверхности подложки" + +#~ msgctxt "raft_surface_fan_speed description" +#~ msgid "The fan speed for the surface raft layers." +#~ msgstr "" +#~ "Скорость вращения вентилятора при печати поверхности слоёв подложки." + +#~ msgctxt "raft_interface_fan_speed label" +#~ msgid "Raft Interface Fan Speed" +#~ msgstr "Скорость вентилятора для связующего слоя" + +#~ msgctxt "magic_mesh_surface_mode description" +#~ msgid "" +#~ "Print the surface instead of the volume. No infill, no top/bottom skin, " +#~ "just a single wall of which the middle coincides with the surface of the " +#~ "mesh. It's also possible to do both: print the insides of a closed volume " +#~ "as normal, but print all polygons not part of a closed volume as surface." +#~ msgstr "" +#~ "Печатать только поверхность. Никакого заполнения, никаких верхних нижних " +#~ "поверхностей, просто одна стенка, которая совпадает с поверхностью " +#~ "объекта. Позволяет делать и печать внутренностей закрытого объёма в виде " +#~ "нормалей, и печать всех полигонов, не входящих в закрытый объём, в виде " +#~ "поверхностей." From 0c4b2c404bfb8b1b3902ff8b87d13b8b78f47add Mon Sep 17 00:00:00 2001 From: Ruslan Popov Date: Fri, 6 Jan 2017 23:32:37 +0300 Subject: [PATCH 73/75] Add Russian language into select control on General Page. --- resources/qml/Preferences/GeneralPage.qml | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/qml/Preferences/GeneralPage.qml b/resources/qml/Preferences/GeneralPage.qml index eab5dbe938..ad71e9ebfe 100644 --- a/resources/qml/Preferences/GeneralPage.qml +++ b/resources/qml/Preferences/GeneralPage.qml @@ -97,6 +97,7 @@ UM.PreferencesPage append({ text: "Français", code: "fr" }) append({ text: "Italiano", code: "it" }) append({ text: "Nederlands", code: "nl" }) + append({ text: "Русский", code: "ru" }) append({ text: "Türkçe", code: "tr" }) } } From 5ed32230f713eeb33ce953e80c0aec909995ca99 Mon Sep 17 00:00:00 2001 From: TheRikke Date: Sat, 7 Jan 2017 22:22:47 +0100 Subject: [PATCH 74/75] Fix connections to devices not based on arduino stk500v2 failed to release the serial port on timeout. --- plugins/USBPrinting/avr_isp/stk500v2.py | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/plugins/USBPrinting/avr_isp/stk500v2.py b/plugins/USBPrinting/avr_isp/stk500v2.py index ccbaa3de53..91bef53875 100644 --- a/plugins/USBPrinting/avr_isp/stk500v2.py +++ b/plugins/USBPrinting/avr_isp/stk500v2.py @@ -43,17 +43,20 @@ class Stk500v2(ispBase.IspBase): self.serial.flushInput() self.serial.flushOutput() - if self.sendMessage([0x10, 0xc8, 0x64, 0x19, 0x20, 0x00, 0x53, 0x03, 0xac, 0x53, 0x00, 0x00]) != [0x10, 0x00]: + try: + if self.sendMessage([0x10, 0xc8, 0x64, 0x19, 0x20, 0x00, 0x53, 0x03, 0xac, 0x53, 0x00, 0x00]) != [0x10, 0x00]: + raise ispBase.IspError("Failed to enter programming mode") + + self.sendMessage([0x06, 0x80, 0x00, 0x00, 0x00]) + if self.sendMessage([0xEE])[1] == 0x00: + self._has_checksum = True + else: + self._has_checksum = False + except ispBase.IspError: self.close() - raise ispBase.IspError("Failed to enter programming mode") - - self.sendMessage([0x06, 0x80, 0x00, 0x00, 0x00]) - if self.sendMessage([0xEE])[1] == 0x00: - self._has_checksum = True - else: - self._has_checksum = False + raise self.serial.timeout = 5 - + def close(self): if self.serial is not None: self.serial.close() From 58917098008f0c52566fe1b43abe15c185fb84d5 Mon Sep 17 00:00:00 2001 From: Thomas Karl Pietrowski Date: Wed, 11 Jan 2017 19:08:46 +0100 Subject: [PATCH 75/75] Using UM.Platform and correcting something minor Since we already have UM.Platform, I think it is worth to get constancy into our code and use UM.Platform for our detection. Additionally, I corrected the head of the file, because I think I shall mention Cura and not Uranium. I guess the plugin was moved to Cura, so this was missed. --- plugins/RemovableDriveOutputDevice/__init__.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/plugins/RemovableDriveOutputDevice/__init__.py b/plugins/RemovableDriveOutputDevice/__init__.py index 16adcbfd7c..616fe6ee8c 100644 --- a/plugins/RemovableDriveOutputDevice/__init__.py +++ b/plugins/RemovableDriveOutputDevice/__init__.py @@ -1,7 +1,7 @@ # Copyright (c) 2015 Ultimaker B.V. -# Uranium is released under the terms of the AGPLv3 or higher. +# Cura is released under the terms of the AGPLv3 or higher. -import platform +from UM.Platform import Platform from UM.i18n import i18nCatalog catalog = i18nCatalog("cura") @@ -18,15 +18,15 @@ def getMetaData(): } def register(app): - if platform.system() == "Windows": + if Platform.isWindows(): from . import WindowsRemovableDrivePlugin return { "output_device": WindowsRemovableDrivePlugin.WindowsRemovableDrivePlugin() } - elif platform.system() == "Darwin": + elif Platform.isOSX(): from . import OSXRemovableDrivePlugin return { "output_device": OSXRemovableDrivePlugin.OSXRemovableDrivePlugin() } - elif platform.system() == "Linux": + elif Platform.isLinux(): from . import LinuxRemovableDrivePlugin return { "output_device": LinuxRemovableDrivePlugin.LinuxRemovableDrivePlugin() } else: - Logger.log("e", "Unsupported system %s, no removable device hotplugging support available.", platform.system()) + Logger.log("e", "Unsupported system, thus no removable device hotplugging support available.") return { }