From 3853fb6d192c6bc75b3e5b7f39d07f804928b599 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 27 Aug 2019 08:51:48 +0200 Subject: [PATCH 001/158] Add UI feedback on invalid firmware update CURA-6537 --- cura/PrinterOutput/FirmwareUpdater.py | 2 +- plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.qml | 2 ++ plugins/USBPrinting/AvrFirmwareUpdater.py | 3 +++ plugins/USBPrinting/avr_isp/intelHex.py | 7 +++++-- 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/cura/PrinterOutput/FirmwareUpdater.py b/cura/PrinterOutput/FirmwareUpdater.py index 3f20e0f3c4..d33015920a 100644 --- a/cura/PrinterOutput/FirmwareUpdater.py +++ b/cura/PrinterOutput/FirmwareUpdater.py @@ -75,4 +75,4 @@ class FirmwareUpdateState(IntEnum): communication_error = 4 io_error = 5 firmware_not_found_error = 6 - + invalid_firmware_error = 7 diff --git a/plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.qml b/plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.qml index b5b6c15f50..90a27c24e1 100644 --- a/plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.qml +++ b/plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.qml @@ -151,6 +151,8 @@ Cura.MachineAction return catalog.i18nc("@label","Firmware update failed due to an input/output error."); case 6: return catalog.i18nc("@label","Firmware update failed due to missing firmware."); + case 7: + return catalog.i18nc("@label","Firmware update failed due to invalid firmware file."); } } diff --git a/plugins/USBPrinting/AvrFirmwareUpdater.py b/plugins/USBPrinting/AvrFirmwareUpdater.py index 0f7146560d..ded2036efe 100644 --- a/plugins/USBPrinting/AvrFirmwareUpdater.py +++ b/plugins/USBPrinting/AvrFirmwareUpdater.py @@ -27,6 +27,9 @@ class AvrFirmwareUpdater(FirmwareUpdater): except (FileNotFoundError, AssertionError): Logger.log("e", "Unable to read provided hex file. Could not update firmware.") self._setFirmwareUpdateState(FirmwareUpdateState.firmware_not_found_error) + except Exception: + Logger.logException("e", "Failed to read hex file '%s'", self._firmware_file) + self._setFirmwareUpdateState(FirmwareUpdateState.invalid_firmware_error) return programmer = stk500v2.Stk500v2() diff --git a/plugins/USBPrinting/avr_isp/intelHex.py b/plugins/USBPrinting/avr_isp/intelHex.py index 671f1788f7..3c5c66d805 100644 --- a/plugins/USBPrinting/avr_isp/intelHex.py +++ b/plugins/USBPrinting/avr_isp/intelHex.py @@ -5,13 +5,16 @@ See: http://en.wikipedia.org/wiki/Intel_HEX This is a python 3 conversion of the code created by David Braam for the Cura project. """ import io +from typing import List + from UM.Logger import Logger -def readHex(filename): + +def readHex(filename: str) -> List[int]: """ Read an verify an intel hex file. Return the data as an list of bytes. """ - data = [] + data = [] # type: List[int] extra_addr = 0 f = io.open(filename, "r", encoding = "utf-8") for line in f: From 946b2b943e53e6fb5027f1b1c78bbb8c3ab08692 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 27 Aug 2019 13:38:42 +0200 Subject: [PATCH 002/158] F5 reloads gcode file CURA-6643 --- cura/CuraApplication.py | 14 ++++++++++++++ cura/Scene/GCodeListDecorator.py | 9 ++++++++- plugins/GCodeGzReader/GCodeGzReader.py | 2 +- plugins/GCodeReader/FlavorParser.py | 3 ++- plugins/GCodeReader/GCodeReader.py | 12 ++++++++---- 5 files changed, 33 insertions(+), 7 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index d477454e2b..749c8925ff 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -69,6 +69,7 @@ from cura.Scene.BuildPlateDecorator import BuildPlateDecorator from cura.Scene.ConvexHullDecorator import ConvexHullDecorator from cura.Scene.CuraSceneController import CuraSceneController from cura.Scene.CuraSceneNode import CuraSceneNode +from cura.Scene.GCodeListDecorator import GCodeListDecorator from cura.Scene.SliceableObjectDecorator import SliceableObjectDecorator from cura.Scene import ZOffsetDecorator @@ -1327,7 +1328,14 @@ class CuraApplication(QtApplication): Logger.log("i", "Reloading all loaded mesh data.") nodes = [] has_merged_nodes = False + gcode_filename = None # type: Optional[str] for node in DepthFirstIterator(self.getController().getScene().getRoot()): + # Objects loaded from Gcode should also be included. + gcode_list_decorator = node.getDecorator(GCodeListDecorator) + if gcode_list_decorator is not None and gcode_list_decorator.getGcodeFileName(): + gcode_filename = gcode_list_decorator.getGcodeFileName() + break + if not isinstance(node, CuraSceneNode) or not node.getMeshData(): if node.getName() == "MergedMesh": has_merged_nodes = True @@ -1335,11 +1343,17 @@ class CuraApplication(QtApplication): nodes.append(node) + # We can open only one gcode file at the same time. If the current view has a gcode file open, just reopen it + # for reloading. + if gcode_filename: + self._openFile(gcode_filename) + if not nodes: return for node in nodes: mesh_data = node.getMeshData() + gcode_list_decorator = node.getDecorator(GCodeListDecorator) if mesh_data and mesh_data.getFileName(): job = ReadMeshJob(mesh_data.getFileName()) job._node = node # type: ignore diff --git a/cura/Scene/GCodeListDecorator.py b/cura/Scene/GCodeListDecorator.py index d3dadb3f23..6c52fb89bf 100644 --- a/cura/Scene/GCodeListDecorator.py +++ b/cura/Scene/GCodeListDecorator.py @@ -1,11 +1,18 @@ from UM.Scene.SceneNodeDecorator import SceneNodeDecorator -from typing import List +from typing import List, Optional class GCodeListDecorator(SceneNodeDecorator): def __init__(self) -> None: super().__init__() self._gcode_list = [] # type: List[str] + self._filename = None # type: Optional[str] + + def getGcodeFileName(self) -> Optional[str]: + return self._filename + + def setGcodeFileName(self, filename: str) -> None: + self._filename = filename def getGCodeList(self) -> List[str]: return self._gcode_list diff --git a/plugins/GCodeGzReader/GCodeGzReader.py b/plugins/GCodeGzReader/GCodeGzReader.py index d075e4e3b0..a528b494e9 100644 --- a/plugins/GCodeGzReader/GCodeGzReader.py +++ b/plugins/GCodeGzReader/GCodeGzReader.py @@ -27,6 +27,6 @@ class GCodeGzReader(MeshReader): file_data = file.read() uncompressed_gcode = gzip.decompress(file_data).decode("utf-8") PluginRegistry.getInstance().getPluginObject("GCodeReader").preReadFromStream(uncompressed_gcode) - result = PluginRegistry.getInstance().getPluginObject("GCodeReader").readFromStream(uncompressed_gcode) + result = PluginRegistry.getInstance().getPluginObject("GCodeReader").readFromStream(uncompressed_gcode, file_name) return result diff --git a/plugins/GCodeReader/FlavorParser.py b/plugins/GCodeReader/FlavorParser.py index 12bed210d2..fb97525da9 100644 --- a/plugins/GCodeReader/FlavorParser.py +++ b/plugins/GCodeReader/FlavorParser.py @@ -292,7 +292,7 @@ class FlavorParser: extruder.getProperty("machine_nozzle_offset_y", "value")] return result - def processGCodeStream(self, stream: str) -> Optional[CuraSceneNode]: + def processGCodeStream(self, stream: str, filename: str) -> Optional[CuraSceneNode]: Logger.log("d", "Preparing to load GCode") self._cancelled = False # We obtain the filament diameter from the selected extruder to calculate line widths @@ -453,6 +453,7 @@ class FlavorParser: scene_node.addDecorator(decorator) gcode_list_decorator = GCodeListDecorator() + gcode_list_decorator.setGcodeFileName(filename) gcode_list_decorator.setGCodeList(gcode_list) scene_node.addDecorator(gcode_list_decorator) diff --git a/plugins/GCodeReader/GCodeReader.py b/plugins/GCodeReader/GCodeReader.py index b9e948dfea..e0d31c340e 100755 --- a/plugins/GCodeReader/GCodeReader.py +++ b/plugins/GCodeReader/GCodeReader.py @@ -2,12 +2,16 @@ # Copyright (c) 2018 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. +from typing import Optional + from UM.FileHandler.FileReader import FileReader from UM.Mesh.MeshReader import MeshReader from UM.i18n import i18nCatalog from UM.Application import Application from UM.MimeTypeDatabase import MimeTypeDatabase, MimeType +from cura.Scene.CuraSceneNode import CuraSceneNode + catalog = i18nCatalog("cura") from . import MarlinFlavorParser, RepRapFlavorParser @@ -54,10 +58,10 @@ class GCodeReader(MeshReader): file_data = file.read() return self.preReadFromStream(file_data, args, kwargs) - def readFromStream(self, stream): - return self._flavor_reader.processGCodeStream(stream) + def readFromStream(self, stream: str, filename: str) -> Optional["CuraSceneNode"]: + return self._flavor_reader.processGCodeStream(stream, filename) - def _read(self, file_name): + def _read(self, file_name: str) -> Optional["CuraSceneNode"]: with open(file_name, "r", encoding = "utf-8") as file: file_data = file.read() - return self.readFromStream(file_data) + return self.readFromStream(file_data, file_name) From 79f11286a631e19e23b3966cd771c8aaea28b4cb Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 27 Aug 2019 14:09:16 +0200 Subject: [PATCH 003/158] Fix typing CURA-6643 --- cura/CuraApplication.py | 6 ++---- plugins/GCodeReader/FlavorParser.py | 2 +- plugins/GCodeReader/GCodeReader.py | 22 ++++++++++++++++------ 3 files changed, 19 insertions(+), 11 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 749c8925ff..bb64d7fd8e 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -1331,9 +1331,8 @@ class CuraApplication(QtApplication): gcode_filename = None # type: Optional[str] for node in DepthFirstIterator(self.getController().getScene().getRoot()): # Objects loaded from Gcode should also be included. - gcode_list_decorator = node.getDecorator(GCodeListDecorator) - if gcode_list_decorator is not None and gcode_list_decorator.getGcodeFileName(): - gcode_filename = gcode_list_decorator.getGcodeFileName() + gcode_filename = node.callDecoration("getGcodeFileName") + if gcode_filename is not None: break if not isinstance(node, CuraSceneNode) or not node.getMeshData(): @@ -1353,7 +1352,6 @@ class CuraApplication(QtApplication): for node in nodes: mesh_data = node.getMeshData() - gcode_list_decorator = node.getDecorator(GCodeListDecorator) if mesh_data and mesh_data.getFileName(): job = ReadMeshJob(mesh_data.getFileName()) job._node = node # type: ignore diff --git a/plugins/GCodeReader/FlavorParser.py b/plugins/GCodeReader/FlavorParser.py index fb97525da9..09fa2b4502 100644 --- a/plugins/GCodeReader/FlavorParser.py +++ b/plugins/GCodeReader/FlavorParser.py @@ -292,7 +292,7 @@ class FlavorParser: extruder.getProperty("machine_nozzle_offset_y", "value")] return result - def processGCodeStream(self, stream: str, filename: str) -> Optional[CuraSceneNode]: + def processGCodeStream(self, stream: str, filename: str) -> Optional["CuraSceneNode"]: Logger.log("d", "Preparing to load GCode") self._cancelled = False # We obtain the filament diameter from the selected extruder to calculate line widths diff --git a/plugins/GCodeReader/GCodeReader.py b/plugins/GCodeReader/GCodeReader.py index e0d31c340e..21be026cc6 100755 --- a/plugins/GCodeReader/GCodeReader.py +++ b/plugins/GCodeReader/GCodeReader.py @@ -2,7 +2,7 @@ # Copyright (c) 2018 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. -from typing import Optional +from typing import Optional, Union, List, TYPE_CHECKING from UM.FileHandler.FileReader import FileReader from UM.Mesh.MeshReader import MeshReader @@ -10,11 +10,15 @@ from UM.i18n import i18nCatalog from UM.Application import Application from UM.MimeTypeDatabase import MimeTypeDatabase, MimeType -from cura.Scene.CuraSceneNode import CuraSceneNode - catalog = i18nCatalog("cura") + +from .FlavorParser import FlavorParser from . import MarlinFlavorParser, RepRapFlavorParser +if TYPE_CHECKING: + from UM.Scene.SceneNode import SceneNode + from cura.Scene.CuraSceneNode import CuraSceneNode + # Class for loading and parsing G-code files class GCodeReader(MeshReader): @@ -34,7 +38,7 @@ class GCodeReader(MeshReader): ) self._supported_extensions = [".gcode", ".g"] - self._flavor_reader = None + self._flavor_reader = None # type: Optional[FlavorParser] Application.getInstance().getPreferences().addPreference("gcodereader/show_caution", True) @@ -59,9 +63,15 @@ class GCodeReader(MeshReader): return self.preReadFromStream(file_data, args, kwargs) def readFromStream(self, stream: str, filename: str) -> Optional["CuraSceneNode"]: + if self._flavor_reader is None: + return None return self._flavor_reader.processGCodeStream(stream, filename) - def _read(self, file_name: str) -> Optional["CuraSceneNode"]: + def _read(self, file_name: str) -> Union["SceneNode", List["SceneNode"]]: with open(file_name, "r", encoding = "utf-8") as file: file_data = file.read() - return self.readFromStream(file_data, file_name) + result = [] # type: List[SceneNode] + node = self.readFromStream(file_data, file_name) + if node is not None: + result.append(node) + return result From 11c23b4fe9108fd5739b56e70e76091c47f9644b Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 25 Jul 2019 16:54:47 +0200 Subject: [PATCH 004/158] Add first draft of the radiocheckbar CURA-6598 --- resources/qml/RadioCheckbar.qml | 127 ++++++++++++++++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 resources/qml/RadioCheckbar.qml diff --git a/resources/qml/RadioCheckbar.qml b/resources/qml/RadioCheckbar.qml new file mode 100644 index 0000000000..2d863f7a66 --- /dev/null +++ b/resources/qml/RadioCheckbar.qml @@ -0,0 +1,127 @@ +import QtQuick 2.0 +import QtQuick.Controls 2.3 +import QtQuick.Layouts 1.3 +Item +{ + id: base + property ButtonGroup buttonGroup: null + + property color activeColor: "#3282ff" + property color inactiveColor: "#cccccc" + property color defaultItemColor: "#0a0850" + property int checkboxSize: 14 + property int inactiveMarkerSize: 4 + property int barSize: 2 + + implicitWidth: 200 + implicitHeight: buttonBar.height + + property var model: null + + // The horizontal inactive bar that sits behind the buttons + Rectangle + { + id: inactiveLine + color: inactiveColor + anchors.verticalCenter: buttonBar.verticalCenter + height: barSize + width: buttonBar.width + } + + RowLayout + { + id: buttonBar + height: childrenRect.height + width: parent.width + spacing: 0 + Repeater + { + id: repeater + model: base.model + + Item + { + Layout.fillWidth: true + // The last item of the repeater needs to be shorter, as we don't need another part to fit + // the horizontal bar. The others should essentially not be limited. + Layout.maximumWidth: index + 1 === repeater.count ? activeComponent.width: 200000000 + height: activeComponent.height + + property bool isEnabled: model.enabled + // The horizontal bar between the checkable options. + // Note that the horizontal bar points towards the previous item. + Rectangle + { + property Item previousItem: repeater.itemAt(index - 1) + + height: barSize + width: parent.width - activeComponent.width + color: defaultItemColor + + anchors + { + right: activeComponent.left + verticalCenter: activeComponent.verticalCenter + } + visible: previousItem !== null && previousItem.isEnabled && isEnabled + } + Loader + { + id: activeComponent + sourceComponent: isEnabled? checkboxComponent : disabledComponent + } + } + } + } + + Component + { + id: disabledComponent + Item + { + height: checkboxSize + width: inactiveMarkerSize + Rectangle + { + anchors.centerIn: parent + height: parent.width + width: parent.width + radius: width / 2 + color: inactiveColor + } + } + } + + Component + { + id: checkboxComponent + CheckBox + { + id: checkbox + ButtonGroup.group: buttonGroup + width: checkboxSize + height: checkboxSize + indicator: Rectangle + { + height: checkbox.height + width: checkbox.width + radius: width / 2 + + anchors.centerIn: checkbox + border.color: defaultItemColor + + Rectangle + { + anchors + { + margins: 3 + fill: parent + } + radius: width / 2 + color: activeColor + visible: checkbox.checked + } + } + } + } +} From abc6e5950b6b4ca0dab413c30300c5a6091254be Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 25 Jul 2019 17:02:34 +0200 Subject: [PATCH 005/158] Fix alignment of inactiveMarker CURA-6598 --- resources/qml/RadioCheckbar.qml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/resources/qml/RadioCheckbar.qml b/resources/qml/RadioCheckbar.qml index 2d863f7a66..645b24e560 100644 --- a/resources/qml/RadioCheckbar.qml +++ b/resources/qml/RadioCheckbar.qml @@ -69,6 +69,8 @@ Item { id: activeComponent sourceComponent: isEnabled? checkboxComponent : disabledComponent + // Ensure the inactive markers that are not the first / last one align with the center of the checkboxes + x: isEnabled && index !== 0 && index + 1 !== repeater.count ? -(checkboxSize - inactiveMarkerSize) / 2: 0 } } } From cc4dc6a27c53cb780bc152c70074b4c7f5543d53 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 25 Jul 2019 17:05:31 +0200 Subject: [PATCH 006/158] Fix overlap if first option is radioButton CURA-6598 --- resources/qml/RadioCheckbar.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/RadioCheckbar.qml b/resources/qml/RadioCheckbar.qml index 645b24e560..5210fed9e6 100644 --- a/resources/qml/RadioCheckbar.qml +++ b/resources/qml/RadioCheckbar.qml @@ -70,7 +70,7 @@ Item id: activeComponent sourceComponent: isEnabled? checkboxComponent : disabledComponent // Ensure the inactive markers that are not the first / last one align with the center of the checkboxes - x: isEnabled && index !== 0 && index + 1 !== repeater.count ? -(checkboxSize - inactiveMarkerSize) / 2: 0 + x: !isEnabled && index !== 0 && index + 1 !== repeater.count ? (checkboxSize - inactiveMarkerSize) / 2: 0 } } } From e47514d6dd8ffa978b7547e41160d559a986fd13 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 25 Jul 2019 17:37:35 +0200 Subject: [PATCH 007/158] Fix horizontal bar not coloring correct if last item is checkbox CURA-6598 --- resources/qml/RadioCheckbar.qml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/qml/RadioCheckbar.qml b/resources/qml/RadioCheckbar.qml index 5210fed9e6..6a07d49b99 100644 --- a/resources/qml/RadioCheckbar.qml +++ b/resources/qml/RadioCheckbar.qml @@ -31,6 +31,7 @@ Item RowLayout { id: buttonBar + anchors.centerIn: parent height: childrenRect.height width: parent.width spacing: 0 @@ -46,7 +47,6 @@ Item // the horizontal bar. The others should essentially not be limited. Layout.maximumWidth: index + 1 === repeater.count ? activeComponent.width: 200000000 height: activeComponent.height - property bool isEnabled: model.enabled // The horizontal bar between the checkable options. // Note that the horizontal bar points towards the previous item. @@ -55,7 +55,7 @@ Item property Item previousItem: repeater.itemAt(index - 1) height: barSize - width: parent.width - activeComponent.width + width: buttonBar.width / (repeater.count - 1) - activeComponent.width - 2 color: defaultItemColor anchors @@ -63,7 +63,7 @@ Item right: activeComponent.left verticalCenter: activeComponent.verticalCenter } - visible: previousItem !== null && previousItem.isEnabled && isEnabled + visible: previousItem !== null && previousItem.isEnabled && isEnabled } Loader { From a66c074e972c51a96a378f777bb3e2e583f230e8 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 26 Jul 2019 10:43:47 +0200 Subject: [PATCH 008/158] Simplify the alignment code CURA-6598 --- resources/qml/RadioCheckbar.qml | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/resources/qml/RadioCheckbar.qml b/resources/qml/RadioCheckbar.qml index 6a07d49b99..a50cb4a9fe 100644 --- a/resources/qml/RadioCheckbar.qml +++ b/resources/qml/RadioCheckbar.qml @@ -25,7 +25,13 @@ Item color: inactiveColor anchors.verticalCenter: buttonBar.verticalCenter height: barSize - width: buttonBar.width + anchors + { + left: buttonBar.left + right: buttonBar.right + leftMargin: (checkboxSize - inactiveMarkerSize) / 2 + rightMargin: (checkboxSize - inactiveMarkerSize) / 2 + } } RowLayout @@ -69,8 +75,6 @@ Item { id: activeComponent sourceComponent: isEnabled? checkboxComponent : disabledComponent - // Ensure the inactive markers that are not the first / last one align with the center of the checkboxes - x: !isEnabled && index !== 0 && index + 1 !== repeater.count ? (checkboxSize - inactiveMarkerSize) / 2: 0 } } } @@ -82,12 +86,12 @@ Item Item { height: checkboxSize - width: inactiveMarkerSize + width: checkboxSize Rectangle { anchors.centerIn: parent - height: parent.width - width: parent.width + height: inactiveMarkerSize + width: inactiveMarkerSize radius: width / 2 color: inactiveColor } From a275e3de2b964434b700bf632d665180fab3600a Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 26 Jul 2019 11:39:03 +0200 Subject: [PATCH 009/158] Add LabelBar component CURA-6598 --- resources/qml/LabelBar.qml | 50 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 resources/qml/LabelBar.qml diff --git a/resources/qml/LabelBar.qml b/resources/qml/LabelBar.qml new file mode 100644 index 0000000000..f8f77e2017 --- /dev/null +++ b/resources/qml/LabelBar.qml @@ -0,0 +1,50 @@ +import QtQuick 2.0 +import QtQuick.Controls 2.1 +import QtQuick.Layouts 1.3 + +// The labelBar shows a set of labels that are evenly spaced from oneother. +// The first item is aligned to the left, the last is aligned to the right. +// It's intended to be used together with RadioCheckBar. As such, it needs +// to know what the used itemSize is, so it can ensure the labels are aligned correctly. +Item +{ + id: base + property var model: null + property int itemSize: 14 + RowLayout + { + anchors.fill: parent + spacing: 0 + Repeater + { + id: repeater + model: base.model + + Item + { + Layout.fillWidth: true + Layout.fillHeight: true + Layout.maximumWidth: index + 1 === repeater.count ? itemSize: 200000000 + + Label + { + id: label + text: model.text + + anchors + { + // Some magic to ensure that the items are aligned properly. + // We want the following: + // First item should be aligned to the left, no margin. + // Last item should be aligned to the right, no margin. + // The middle item(s) should be aligned to the center of the "item" it's showing (hence half the itemsize as offset). + // We want the center of the label to align with the center of the item, so we negatively offset by half the contentWidth + right: index + 1 === repeater.count ? parent.right: undefined + left: index + 1 === repeater.count || index === 0 ? undefined: parent.left + leftMargin: (0.5 * itemSize) - 0.5 * contentWidth + } + } + } + } + } +} From ae406e2480f2f0209b7a43d281232dd7f7555a59 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 29 Jul 2019 16:01:23 +0200 Subject: [PATCH 010/158] Fix the RadioCheckbar to work in Cura --- resources/qml/RadioCheckbar.qml | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/resources/qml/RadioCheckbar.qml b/resources/qml/RadioCheckbar.qml index a50cb4a9fe..8c47efa05b 100644 --- a/resources/qml/RadioCheckbar.qml +++ b/resources/qml/RadioCheckbar.qml @@ -14,7 +14,7 @@ Item property int barSize: 2 implicitWidth: 200 - implicitHeight: buttonBar.height + implicitHeight: checkboxSize property var model: null @@ -23,8 +23,12 @@ Item { id: inactiveLine color: inactiveColor - anchors.verticalCenter: buttonBar.verticalCenter + height: barSize + + // This can (and should) be done wiht a verticalCenter. For some reason it does work in QtCreator + // but not when using the exact same QML in Cura. + y: 0.5 * checkboxSize anchors { left: buttonBar.left @@ -37,15 +41,16 @@ Item RowLayout { id: buttonBar - anchors.centerIn: parent - height: childrenRect.height + anchors.top: parent.top + height: checkboxSize width: parent.width spacing: 0 + Repeater { id: repeater model: base.model - + height: checkboxSize Item { Layout.fillWidth: true @@ -53,7 +58,7 @@ Item // the horizontal bar. The others should essentially not be limited. Layout.maximumWidth: index + 1 === repeater.count ? activeComponent.width: 200000000 height: activeComponent.height - property bool isEnabled: model.enabled + property bool isEnabled: model.available // The horizontal bar between the checkable options. // Note that the horizontal bar points towards the previous item. Rectangle @@ -67,7 +72,6 @@ Item anchors { right: activeComponent.left - verticalCenter: activeComponent.verticalCenter } visible: previousItem !== null && previousItem.isEnabled && isEnabled } @@ -75,6 +79,10 @@ Item { id: activeComponent sourceComponent: isEnabled? checkboxComponent : disabledComponent + width: checkboxSize + // This can (and should) be done wiht a verticalCenter. For some reason it does work in QtCreator + // but not when using the exact same QML in Cura. + y: -0.5 * checkboxSize } } } @@ -87,9 +95,13 @@ Item { height: checkboxSize width: checkboxSize + Rectangle { - anchors.centerIn: parent + // This can (and should) be done wiht a verticalCenter. For some reason it does work in QtCreator + // but not when using the exact same QML in Cura. + y: 0.5 * checkboxSize - 1 + anchors.horizontalCenter: parent.horizontalCenter height: inactiveMarkerSize width: inactiveMarkerSize radius: width / 2 @@ -109,11 +121,10 @@ Item height: checkboxSize indicator: Rectangle { - height: checkbox.height - width: checkbox.width + height: checkboxSize + width: checkboxSize radius: width / 2 - anchors.centerIn: checkbox border.color: defaultItemColor Rectangle From 3b93a1914a7f40b4fd17f8c1bbd90f7caf76e1ab Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 29 Jul 2019 16:12:39 +0200 Subject: [PATCH 011/158] Ensure the Label bar uses the theme CURA-6598 --- resources/qml/LabelBar.qml | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/resources/qml/LabelBar.qml b/resources/qml/LabelBar.qml index f8f77e2017..ea29df0e06 100644 --- a/resources/qml/LabelBar.qml +++ b/resources/qml/LabelBar.qml @@ -1,7 +1,7 @@ import QtQuick 2.0 import QtQuick.Controls 2.1 import QtQuick.Layouts 1.3 - +import UM 1.2 as UM // The labelBar shows a set of labels that are evenly spaced from oneother. // The first item is aligned to the left, the last is aligned to the right. // It's intended to be used together with RadioCheckBar. As such, it needs @@ -10,10 +10,14 @@ Item { id: base property var model: null + property string modelKey: "" property int itemSize: 14 + height: childrenRect.height RowLayout { - anchors.fill: parent + anchors.left: parent.left + anchors.right: parent.right + height: childrenRect.height spacing: 0 Repeater { @@ -25,12 +29,14 @@ Item Layout.fillWidth: true Layout.fillHeight: true Layout.maximumWidth: index + 1 === repeater.count ? itemSize: 200000000 - + height: childrenRect.height Label { id: label - text: model.text - + text: model[modelKey] + color: UM.Theme.getColor("text") + font: UM.Theme.getFont("default") + height: contentHeight anchors { // Some magic to ensure that the items are aligned properly. From 6b90975391792773e01e1e11d3ff10607707e4e4 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 29 Jul 2019 16:53:42 +0200 Subject: [PATCH 012/158] Replace the old settingSlider with the RadioButtonbar CURA-6598 --- .../RecommendedQualityProfileSelector.qml | 379 ++---------------- resources/qml/RadioCheckbar.qml | 10 + 2 files changed, 33 insertions(+), 356 deletions(-) diff --git a/resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelector.qml b/resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelector.qml index 0486f5d2d7..343be60e73 100644 --- a/resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelector.qml +++ b/resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelector.qml @@ -3,6 +3,7 @@ import QtQuick 2.7 import QtQuick.Controls 1.4 +import QtQuick.Controls 2.3 as Controls2 import QtQuick.Controls.Styles 1.4 import UM 1.2 as UM @@ -33,133 +34,6 @@ Item } } - Component.onCompleted: qualityModel.update() - - Connections - { - target: Cura.QualityProfilesDropDownMenuModel - onItemsChanged: qualityModel.update() - } - - Connections { - target: base - onVisibleChanged: - { - // update needs to be called when the widgets are visible, otherwise the step width calculation - // will fail because the width of an invisible item is 0. - if (visible) - { - qualityModel.update(); - } - } - } - - ListModel - { - id: qualityModel - - property var totalTicks: 0 - property var availableTotalTicks: 0 - property var existingQualityProfile: 0 - - property var qualitySliderActiveIndex: 0 - property var qualitySliderStepWidth: 0 - property var qualitySliderAvailableMin: 0 - property var qualitySliderAvailableMax: 0 - property var qualitySliderMarginRight: 0 - - function update () - { - reset() - - var availableMin = -1 - var availableMax = -1 - - for (var i = 0; i < Cura.QualityProfilesDropDownMenuModel.rowCount(); i++) - { - var qualityItem = Cura.QualityProfilesDropDownMenuModel.getItem(i) - - // Add each quality item to the UI quality model - qualityModel.append(qualityItem) - - // Set selected value - if (Cura.MachineManager.activeQualityType == qualityItem.quality_type) - { - // set to -1 when switching to user created profile so all ticks are clickable - if (Cura.MachineManager.hasCustomQuality) - { - qualityModel.qualitySliderActiveIndex = -1 - } - else - { - qualityModel.qualitySliderActiveIndex = i - } - - qualityModel.existingQualityProfile = 1 - } - - // Set min available - if (qualityItem.available && availableMin == -1) - { - availableMin = i - } - - // Set max available - if (qualityItem.available) - { - availableMax = i - } - } - - // Set total available ticks for active slider part - if (availableMin != -1) - { - qualityModel.availableTotalTicks = availableMax - availableMin + 1 - } - - // Calculate slider values - calculateSliderStepWidth(qualityModel.totalTicks) - calculateSliderMargins(availableMin, availableMax, qualityModel.totalTicks) - - qualityModel.qualitySliderAvailableMin = availableMin - qualityModel.qualitySliderAvailableMax = availableMax - } - - function calculateSliderStepWidth (totalTicks) - { - // Do not use Math.round otherwise the tickmarks won't be aligned - qualityModel.qualitySliderStepWidth = totalTicks != 0 ? - ((settingsColumnWidth - UM.Theme.getSize("print_setup_slider_handle").width) / (totalTicks)) : 0 - } - - function calculateSliderMargins (availableMin, availableMax, totalTicks) - { - if (availableMin == -1 || (availableMin == 0 && availableMax == 0)) - { - // Do not use Math.round otherwise the tickmarks won't be aligned - qualityModel.qualitySliderMarginRight = settingsColumnWidth / 2 - } - else if (availableMin == availableMax) - { - // Do not use Math.round otherwise the tickmarks won't be aligned - qualityModel.qualitySliderMarginRight = (totalTicks - availableMin) * qualitySliderStepWidth - } - else - { - // Do not use Math.round otherwise the tickmarks won't be aligned - qualityModel.qualitySliderMarginRight = (totalTicks - availableMax) * qualitySliderStepWidth - } - } - - function reset () { - qualityModel.clear() - qualityModel.availableTotalTicks = 0 - qualityModel.existingQualityProfile = 0 - - // check, the ticks count cannot be less than zero - qualityModel.totalTicks = Math.max(0, Cura.QualityProfilesDropDownMenuModel.rowCount() - 1) - } - } // Here are the elements that are shown in the left column Item @@ -210,246 +84,39 @@ Item } } - // Show titles for the each quality slider ticks Item { - anchors.left: speedSlider.left - anchors.top: speedSlider.bottom - height: childrenRect.height - - Repeater + anchors.left: titleRow.right + anchors.right: parent.right + Controls2.ButtonGroup { - model: qualityModel - - Label - { - anchors.verticalCenter: parent.verticalCenter - anchors.top: parent.top - // The height has to be set manually, otherwise it's not automatically calculated in the repeater - height: UM.Theme.getSize("default_margin").height - color: (Cura.MachineManager.activeMachine != null && Cura.QualityProfilesDropDownMenuModel.getItem(index).available) ? UM.Theme.getColor("quality_slider_available") : UM.Theme.getColor("quality_slider_unavailable") - text: - { - var result = "" - if(Cura.MachineManager.activeMachine != null) - { - result = Cura.QualityProfilesDropDownMenuModel.getItem(index).layer_height - - if(result == undefined) - { - result = ""; - } - else - { - result = Number(Math.round(result + "e+2") + "e-2"); //Round to 2 decimals. Javascript makes this difficult... - if (result == undefined || result != result) //Parse failure. - { - result = ""; - } - } - } - return result - } - - x: - { - // Make sure the text aligns correctly with each tick - if (qualityModel.totalTicks == 0) - { - // If there is only one tick, align it centrally - return Math.round(((settingsColumnWidth) - width) / 2) - } - else if (index == 0) - { - return Math.round(settingsColumnWidth / qualityModel.totalTicks) * index - } - else if (index == qualityModel.totalTicks) - { - return Math.round(settingsColumnWidth / qualityModel.totalTicks) * index - width - } - else - { - return Math.round((settingsColumnWidth / qualityModel.totalTicks) * index - (width / 2)) - } - } - font: UM.Theme.getFont("default") - } + id: activeProfileButtonGroup + exclusive: true + onClicked: Cura.MachineManager.activeQualityGroup = button.identifier } - } - - // Print speed slider - // Two sliders are created, one at the bottom with the unavailable qualities - // and the other at the top with the available quality profiles and so the handle to select them. - Item - { - id: speedSlider - height: childrenRect.height - - anchors + Cura.LabelBar { - left: titleRow.right - right: parent.right - verticalCenter: titleRow.verticalCenter + id: labelbar + anchors.left: parent.left + anchors.right: parent.right + model: Cura.QualityProfilesDropDownMenuModel + modelKey: "layer_height" } - - // Draw unavailable slider - Slider + Cura.RadioCheckbar { - id: unavailableSlider + anchors.left: parent.left + anchors.right: parent.right + anchors.top: labelbar.bottom + model: Cura.QualityProfilesDropDownMenuModel + buttonGroup: activeProfileButtonGroup + modelKey: "quality_group" - width: parent.width - height: qualitySlider.height // Same height as the slider that is on top - updateValueWhileDragging : false - tickmarksEnabled: true - - minimumValue: 0 - // maximumValue must be greater than minimumValue to be able to see the handle. While the value is strictly - // speaking not always correct, it seems to have the correct behavior (switching from 0 available to 1 available) - maximumValue: qualityModel.totalTicks - stepSize: 1 - - style: SliderStyle + function checkedFunction(modelItem) { - //Draw Unvailable line - groove: Item - { - Rectangle - { - height: UM.Theme.getSize("print_setup_slider_groove").height - width: control.width - UM.Theme.getSize("print_setup_slider_handle").width - anchors.horizontalCenter: parent.horizontalCenter - anchors.verticalCenter: parent.verticalCenter - color: UM.Theme.getColor("quality_slider_unavailable") - } - } - - handle: Item {} - - tickmarks: Repeater - { - id: qualityRepeater - model: qualityModel.totalTicks > 0 ? qualityModel : 0 - - Rectangle - { - color: Cura.QualityProfilesDropDownMenuModel.getItem(index).available ? UM.Theme.getColor("quality_slider_available") : UM.Theme.getColor("quality_slider_unavailable") - implicitWidth: UM.Theme.getSize("print_setup_slider_tickmarks").width - implicitHeight: UM.Theme.getSize("print_setup_slider_tickmarks").height - anchors.verticalCenter: parent.verticalCenter - - // Do not use Math.round otherwise the tickmarks won't be aligned - x: ((UM.Theme.getSize("print_setup_slider_handle").width / 2) - (implicitWidth / 2) + (qualityModel.qualitySliderStepWidth * index)) - radius: Math.round(implicitWidth / 2) - } - } + return Cura.MachineManager.activeQualityType == modelItem.quality_type } - // Create a mouse area on top of the unavailable profiles to show a specific tooltip - MouseArea - { - anchors.fill: parent - hoverEnabled: true - enabled: !Cura.MachineManager.hasCustomQuality - onEntered: - { - var tooltipContent = catalog.i18nc("@tooltip", "This quality profile is not available for your current material and nozzle configuration. Please change these to enable this quality profile.") - base.showTooltip(qualityRow, Qt.point(-UM.Theme.getSize("thick_margin").width, customisedSettings.height), tooltipContent) - } - onExited: base.hideTooltip() - } - } - - // Draw available slider - Slider - { - id: qualitySlider - - width: qualityModel.qualitySliderStepWidth * (qualityModel.availableTotalTicks - 1) + UM.Theme.getSize("print_setup_slider_handle").width - height: UM.Theme.getSize("print_setup_slider_handle").height // The handle is the widest element of the slider - enabled: qualityModel.totalTicks > 0 && !Cura.SimpleModeSettingsManager.isProfileCustomized - visible: qualityModel.availableTotalTicks > 0 - updateValueWhileDragging : false - - anchors - { - right: parent.right - rightMargin: qualityModel.qualitySliderMarginRight - } - - minimumValue: qualityModel.qualitySliderAvailableMin >= 0 ? qualityModel.qualitySliderAvailableMin : 0 - // maximumValue must be greater than minimumValue to be able to see the handle. While the value is strictly - // speaking not always correct, it seems to have the correct behavior (switching from 0 available to 1 available) - maximumValue: qualityModel.qualitySliderAvailableMax >= 1 ? qualityModel.qualitySliderAvailableMax : 1 - stepSize: 1 - - value: qualityModel.qualitySliderActiveIndex - - style: SliderStyle - { - // Draw Available line - groove: Item - { - Rectangle - { - height: UM.Theme.getSize("print_setup_slider_groove").height - width: control.width - UM.Theme.getSize("print_setup_slider_handle").width - anchors.verticalCenter: parent.verticalCenter - - // Do not use Math.round otherwise the tickmarks won't be aligned - x: UM.Theme.getSize("print_setup_slider_handle").width / 2 - color: UM.Theme.getColor("quality_slider_available") - } - } - - handle: Rectangle - { - id: qualityhandleButton - color: UM.Theme.getColor("primary") - implicitWidth: UM.Theme.getSize("print_setup_slider_handle").width - implicitHeight: implicitWidth - radius: Math.round(implicitWidth / 2) - visible: !Cura.SimpleModeSettingsManager.isProfileCustomized && !Cura.MachineManager.hasCustomQuality && qualityModel.existingQualityProfile - } - } - - onValueChanged: - { - // only change if an active machine is set and the slider is visible at all. - if (Cura.MachineManager.activeMachine != null && visible) - { - // prevent updating during view initializing. Trigger only if the value changed by user - if (qualitySlider.value != qualityModel.qualitySliderActiveIndex && qualityModel.qualitySliderActiveIndex != -1) - { - // start updating with short delay - qualitySliderChangeTimer.start() - } - } - } - - // This mouse area is only used to capture the onHover state and don't propagate it to the unavailable mouse area - MouseArea - { - anchors.fill: parent - hoverEnabled: true - acceptedButtons: Qt.NoButton - enabled: !Cura.MachineManager.hasCustomQuality - } - } - - // This mouse area will only take the mouse events and show a tooltip when the profile in use is - // a user created profile - MouseArea - { - anchors.fill: parent - hoverEnabled: true - visible: Cura.MachineManager.hasCustomQuality - - onEntered: - { - var tooltipContent = catalog.i18nc("@tooltip", "A custom profile is currently active. To enable the quality slider, choose a default quality profile in Custom tab") - base.showTooltip(qualityRow, Qt.point(-UM.Theme.getSize("thick_margin").width, customisedSettings.height), tooltipContent) - } - onExited: base.hideTooltip() + isCheckedFunction: checkedFunction } } } \ No newline at end of file diff --git a/resources/qml/RadioCheckbar.qml b/resources/qml/RadioCheckbar.qml index 8c47efa05b..3044fedb86 100644 --- a/resources/qml/RadioCheckbar.qml +++ b/resources/qml/RadioCheckbar.qml @@ -1,6 +1,7 @@ import QtQuick 2.0 import QtQuick.Controls 2.3 import QtQuick.Layouts 1.3 + Item { id: base @@ -12,12 +13,18 @@ Item property int checkboxSize: 14 property int inactiveMarkerSize: 4 property int barSize: 2 + property var isCheckedFunction // Function that accepts the modelItem and returns if the item should be active. implicitWidth: 200 implicitHeight: checkboxSize property var model: null + // What key of the model should be used to set the identifier of the checkbox. + // This is used to figure out what checkbox just got toggled. Set a buttonGroup and listen to it's clicked signal. + // You can use button.identifier to figure out which button was clicked. + property string modelKey: "name" + // The horizontal inactive bar that sits behind the buttons Rectangle { @@ -83,6 +90,7 @@ Item // This can (and should) be done wiht a verticalCenter. For some reason it does work in QtCreator // but not when using the exact same QML in Cura. y: -0.5 * checkboxSize + property var modelItem: model } } } @@ -119,6 +127,8 @@ Item ButtonGroup.group: buttonGroup width: checkboxSize height: checkboxSize + property var identifier: modelItem[base.modelKey] + checked: isCheckedFunction(modelItem) indicator: Rectangle { height: checkboxSize From 9e5082a42f5251e743028017b5dce015b50923c3 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 29 Jul 2019 17:00:02 +0200 Subject: [PATCH 013/158] Cleanup the qml a bit CURA-6598 --- .../RecommendedQualityProfileSelector.qml | 31 ++++++++++++++----- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelector.qml b/resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelector.qml index 343be60e73..0666853726 100644 --- a/resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelector.qml +++ b/resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelector.qml @@ -84,29 +84,44 @@ Item } } - Item + Column { - anchors.left: titleRow.right - anchors.right: parent.right + anchors + { + left: titleRow.right + right: parent.right + } + + spacing: UM.Theme.getSize("default_margin").height + Controls2.ButtonGroup { id: activeProfileButtonGroup exclusive: true onClicked: Cura.MachineManager.activeQualityGroup = button.identifier } + Cura.LabelBar { id: labelbar - anchors.left: parent.left - anchors.right: parent.right + anchors + { + left: parent.left + right: parent.right + } + model: Cura.QualityProfilesDropDownMenuModel modelKey: "layer_height" } + Cura.RadioCheckbar { - anchors.left: parent.left - anchors.right: parent.right - anchors.top: labelbar.bottom + anchors + { + left: parent.left + right: parent.right + } + model: Cura.QualityProfilesDropDownMenuModel buttonGroup: activeProfileButtonGroup modelKey: "quality_group" From 8d53ee90b4e2741fd349d0a1ac57cb6418f638ba Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 29 Jul 2019 17:03:25 +0200 Subject: [PATCH 014/158] Ensure that profile bar has no options selected if a quality_changes is active CURA-6598 --- .../Recommended/RecommendedQualityProfileSelector.qml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelector.qml b/resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelector.qml index 0666853726..7ad3493dca 100644 --- a/resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelector.qml +++ b/resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelector.qml @@ -128,6 +128,11 @@ Item function checkedFunction(modelItem) { + if(Cura.MachineManager.hasCustomQuality) + { + // When user created profile is active, no quality tickbox should be active. + return false + } return Cura.MachineManager.activeQualityType == modelItem.quality_type } From 24d6d5b102d1a31121035a6e248b13947f397937 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 30 Jul 2019 14:20:58 +0200 Subject: [PATCH 015/158] Update intent models to also house nested qualities CURA-6598 --- cura/Machines/Models/IntentCategoryModel.py | 15 ++++++- cura/Machines/Models/IntentModel.py | 50 ++++++++++++++++++--- 2 files changed, 56 insertions(+), 9 deletions(-) diff --git a/cura/Machines/Models/IntentCategoryModel.py b/cura/Machines/Models/IntentCategoryModel.py index 9a520a2d31..5211889801 100644 --- a/cura/Machines/Models/IntentCategoryModel.py +++ b/cura/Machines/Models/IntentCategoryModel.py @@ -5,9 +5,11 @@ from PyQt5.QtCore import Qt import collections from typing import TYPE_CHECKING +from cura.Machines.Models.IntentModel import IntentModel from cura.Settings.IntentManager import IntentManager from UM.Qt.ListModel import ListModel from UM.Settings.ContainerRegistry import ContainerRegistry #To update the list if anything changes. +from PyQt5.QtCore import pyqtProperty, pyqtSignal if TYPE_CHECKING: from UM.Settings.ContainerRegistry import ContainerInterface @@ -15,12 +17,14 @@ if TYPE_CHECKING: from UM.i18n import i18nCatalog catalog = i18nCatalog("cura") + ## Lists the intent categories that are available for the current printer # configuration. class IntentCategoryModel(ListModel): NameRole = Qt.UserRole + 1 IntentCategoryRole = Qt.UserRole + 2 WeightRole = Qt.UserRole + 3 + QualitiesRole = Qt.UserRole + 4 #Translations to user-visible string. Ordered by weight. #TODO: Create a solution for this name and weight to be used dynamically. @@ -29,6 +33,8 @@ class IntentCategoryModel(ListModel): name_translation["engineering"] = catalog.i18nc("@label", "Engineering") name_translation["smooth"] = catalog.i18nc("@label", "Smooth") + modelUpdated = pyqtSignal() + ## Creates a new model for a certain intent category. # \param The category to list the intent profiles for. def __init__(self, intent_category: str) -> None: @@ -38,6 +44,7 @@ class IntentCategoryModel(ListModel): self.addRoleName(self.NameRole, "name") self.addRoleName(self.IntentCategoryRole, "intent_category") self.addRoleName(self.WeightRole, "weight") + self.addRoleName(self.QualitiesRole, "qualities") ContainerRegistry.getInstance().containerAdded.connect(self._onContainerChange) ContainerRegistry.getInstance().containerRemoved.connect(self._onContainerChange) @@ -55,9 +62,13 @@ class IntentCategoryModel(ListModel): available_categories = IntentManager.getInstance().currentAvailableIntentCategories() result = [] for category in available_categories: + qualities = IntentModel() + qualities.setIntentCategory(category) result.append({ "name": self.name_translation.get(category, catalog.i18nc("@label", "Unknown")), "intent_category": category, - "weight": list(self.name_translation.keys()).index(category) + "weight": list(self.name_translation.keys()).index(category), + "qualities": qualities }) - self.setItems(result) \ No newline at end of file + result.sort(key = lambda k: k["weight"]) + self.setItems(result) diff --git a/cura/Machines/Models/IntentModel.py b/cura/Machines/Models/IntentModel.py index 5a44883b76..b310ec47a6 100644 --- a/cura/Machines/Models/IntentModel.py +++ b/cura/Machines/Models/IntentModel.py @@ -7,6 +7,7 @@ from PyQt5.QtCore import Qt, QObject, pyqtProperty, pyqtSignal from UM.Qt.ListModel import ListModel from UM.Settings.ContainerRegistry import ContainerRegistry +from UM.Settings.SettingFunction import SettingFunction from cura.Machines.ContainerTree import ContainerTree from cura.Settings.IntentManager import IntentManager @@ -16,18 +17,22 @@ import cura.CuraApplication class IntentModel(ListModel): NameRole = Qt.UserRole + 1 QualityTypeRole = Qt.UserRole + 2 + LayerHeightRole = Qt.UserRole + 3 + AvailableRole = Qt.UserRole + 4 def __init__(self, parent: Optional[QObject] = None) -> None: super().__init__(parent) self.addRoleName(self.NameRole, "name") self.addRoleName(self.QualityTypeRole, "quality_type") + self.addRoleName(self.LayerHeightRole, "layer_height") + self.addRoleName(self.AvailableRole, "available") self._intent_category = "engineering" ContainerRegistry.getInstance().containerAdded.connect(self._onChanged) ContainerRegistry.getInstance().containerRemoved.connect(self._onChanged) - + self._layer_height_unit = "" # This is cached self._update() intentCategoryChanged = pyqtSignal() @@ -54,11 +59,42 @@ class IntentModel(ListModel): return quality_groups = ContainerTree.getInstance().getCurrentQualityGroups() - for intent_category, quality_type in IntentManager.getInstance().getCurrentAvailableIntents(): - if intent_category == self._intent_category: - new_items.append({"name": quality_groups[quality_type].name, "quality_type": quality_type}) - if self._intent_category == "default": #For Default we always list all quality types. We can't filter on available profiles since the empty intent is not a specific quality type. - for quality_type in quality_groups.keys(): - new_items.append({"name": quality_groups[quality_type].name, "quality_type": quality_type}) + for quality_tuple, quality_group in quality_groups.items(): + new_items.append({"name": quality_group.name, + "quality_type": quality_tuple[1], + "layer_height": self._fetchLayerHeight(quality_group), + "available": True + }) + new_items = sorted(new_items, key=lambda x: x["layer_height"]) self.setItems(new_items) + + #TODO: Copied this from QualityProfilesDropdownMenuModel for the moment. This code duplication should be fixed. + def _fetchLayerHeight(self, quality_group) -> float: + global_stack = cura.CuraApplication.CuraApplication.getInstance().getMachineManager().activeMachine + if not self._layer_height_unit: + unit = global_stack.definition.getProperty("layer_height", "unit") + if not unit: + unit = "" + self._layer_height_unit = unit + + default_layer_height = global_stack.definition.getProperty("layer_height", "value") + + # Get layer_height from the quality profile for the GlobalStack + if quality_group.node_for_global is None: + return float(default_layer_height) + container = quality_group.node_for_global.getContainer() + + layer_height = default_layer_height + if container and container.hasProperty("layer_height", "value"): + layer_height = container.getProperty("layer_height", "value") + else: + # Look for layer_height in the GlobalStack from material -> definition + container = global_stack.definition + if container and container.hasProperty("layer_height", "value"): + layer_height = container.getProperty("layer_height", "value") + + if isinstance(layer_height, SettingFunction): + layer_height = layer_height(global_stack) + + return float(layer_height) From 5401a4db15f61ce72b0b5ed716ac4421d92e8519 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 30 Jul 2019 15:28:22 +0200 Subject: [PATCH 016/158] Ensure that each intent gets it's own bar in recommended CURA-6598 --- cura/Machines/Models/IntentModel.py | 31 ++++++++++++-- .../RecommendedQualityProfileSelector.qml | 42 ++++++++++--------- resources/qml/RadioCheckbar.qml | 21 ++++------ 3 files changed, 60 insertions(+), 34 deletions(-) diff --git a/cura/Machines/Models/IntentModel.py b/cura/Machines/Models/IntentModel.py index b310ec47a6..666786e26a 100644 --- a/cura/Machines/Models/IntentModel.py +++ b/cura/Machines/Models/IntentModel.py @@ -19,6 +19,7 @@ class IntentModel(ListModel): QualityTypeRole = Qt.UserRole + 2 LayerHeightRole = Qt.UserRole + 3 AvailableRole = Qt.UserRole + 4 + IntentRole = Qt.UserRole + 5 def __init__(self, parent: Optional[QObject] = None) -> None: super().__init__(parent) @@ -27,6 +28,7 @@ class IntentModel(ListModel): self.addRoleName(self.QualityTypeRole, "quality_type") self.addRoleName(self.LayerHeightRole, "layer_height") self.addRoleName(self.AvailableRole, "available") + self.addRoleName(self.IntentRole, "intent_category") self._intent_category = "engineering" @@ -59,12 +61,32 @@ class IntentModel(ListModel): return quality_groups = ContainerTree.getInstance().getCurrentQualityGroups() + layer_heights_added = [] for quality_tuple, quality_group in quality_groups.items(): - new_items.append({"name": quality_group.name, + # Add the intents that are of the correct category + if quality_tuple[0] == self._intent_category: + layer_height = self._fetchLayerHeight(quality_group) + new_items.append({"name": quality_group.name, "quality_type": quality_tuple[1], - "layer_height": self._fetchLayerHeight(quality_group), - "available": True + "layer_height": layer_height, + "available": quality_group.is_available, + "intent_category": self._intent_category }) + layer_heights_added.append(layer_height) + + # Now that we added all intents that we found something for, ensure that we set add ticks (and layer_heights) + # for all groups that we don't have anything for (and set it to not available) + for quality_tuple, quality_group in quality_groups.items(): + # Add the intents that are of the correct category + if quality_tuple[0] != self._intent_category: + layer_height = self._fetchLayerHeight(quality_group) + if layer_height not in layer_heights_added: + new_items.append({"name": "Unavailable", + "quality_type": "", + "layer_height": layer_height, + "intent_category": self._intent_category, + "available": False}) + layer_heights_added.append(layer_height) new_items = sorted(new_items, key=lambda x: x["layer_height"]) self.setItems(new_items) @@ -98,3 +120,6 @@ class IntentModel(ListModel): layer_height = layer_height(global_stack) return float(layer_height) + + def __repr__(self): + return str(self.items) diff --git a/resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelector.qml b/resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelector.qml index 7ad3493dca..2c8843122d 100644 --- a/resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelector.qml +++ b/resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelector.qml @@ -7,7 +7,7 @@ import QtQuick.Controls 2.3 as Controls2 import QtQuick.Controls.Styles 1.4 import UM 1.2 as UM -import Cura 1.0 as Cura +import Cura 1.6 as Cura // @@ -98,7 +98,8 @@ Item { id: activeProfileButtonGroup exclusive: true - onClicked: Cura.MachineManager.activeQualityGroup = button.identifier + onClicked: Cura.IntentManager.selectIntent(button.modelData.intent_category, button.modelData.quality_type) + } Cura.LabelBar @@ -114,29 +115,32 @@ Item modelKey: "layer_height" } - Cura.RadioCheckbar + Repeater { - anchors + model: Cura.IntentCategoryModel{} + Cura.RadioCheckbar { - left: parent.left - right: parent.right - } - - model: Cura.QualityProfilesDropDownMenuModel - buttonGroup: activeProfileButtonGroup - modelKey: "quality_group" - - function checkedFunction(modelItem) - { - if(Cura.MachineManager.hasCustomQuality) + anchors { - // When user created profile is active, no quality tickbox should be active. - return false + left: parent.left + right: parent.right } - return Cura.MachineManager.activeQualityType == modelItem.quality_type + dataModel: model["qualities"] + buttonGroup: activeProfileButtonGroup + + function checkedFunction(modelItem) + { + if(Cura.MachineManager.hasCustomQuality) + { + // When user created profile is active, no quality tickbox should be active. + return false + } + return Cura.MachineManager.activeQualityType == modelItem.quality_type && Cura.MachineManager.activeIntentCategory == modelItem.intent_category + } + + isCheckedFunction: checkedFunction } - isCheckedFunction: checkedFunction } } } \ No newline at end of file diff --git a/resources/qml/RadioCheckbar.qml b/resources/qml/RadioCheckbar.qml index 3044fedb86..1bc1c135f6 100644 --- a/resources/qml/RadioCheckbar.qml +++ b/resources/qml/RadioCheckbar.qml @@ -18,12 +18,7 @@ Item implicitWidth: 200 implicitHeight: checkboxSize - property var model: null - - // What key of the model should be used to set the identifier of the checkbox. - // This is used to figure out what checkbox just got toggled. Set a buttonGroup and listen to it's clicked signal. - // You can use button.identifier to figure out which button was clicked. - property string modelKey: "name" + property var dataModel: null // The horizontal inactive bar that sits behind the buttons Rectangle @@ -45,6 +40,7 @@ Item } } + RowLayout { id: buttonBar @@ -56,7 +52,7 @@ Item Repeater { id: repeater - model: base.model + model: base.dataModel height: checkboxSize Item { @@ -75,7 +71,9 @@ Item height: barSize width: buttonBar.width / (repeater.count - 1) - activeComponent.width - 2 color: defaultItemColor - + // This can (and should) be done wiht a verticalCenter. For some reason it does work in QtCreator + // but not when using the exact same QML in Cura. + y: 0.5 * checkboxSize anchors { right: activeComponent.left @@ -87,9 +85,7 @@ Item id: activeComponent sourceComponent: isEnabled? checkboxComponent : disabledComponent width: checkboxSize - // This can (and should) be done wiht a verticalCenter. For some reason it does work in QtCreator - // but not when using the exact same QML in Cura. - y: -0.5 * checkboxSize + property var modelItem: model } } @@ -127,7 +123,8 @@ Item ButtonGroup.group: buttonGroup width: checkboxSize height: checkboxSize - property var identifier: modelItem[base.modelKey] + property var modelData: modelItem + checked: isCheckedFunction(modelItem) indicator: Rectangle { From a9e09c6f54272a325691e86271afd774553f067d Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 1 Aug 2019 14:22:33 +0200 Subject: [PATCH 017/158] Removed unused timer CURA-6598 --- .../RecommendedQualityProfileSelector.qml | 22 ++----------------- 1 file changed, 2 insertions(+), 20 deletions(-) diff --git a/resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelector.qml b/resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelector.qml index 2c8843122d..c465a2e2be 100644 --- a/resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelector.qml +++ b/resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelector.qml @@ -9,10 +9,6 @@ import QtQuick.Controls.Styles 1.4 import UM 1.2 as UM import Cura 1.6 as Cura - -// -// Quality profile -// Item { id: qualityRow @@ -21,20 +17,6 @@ Item property real labelColumnWidth: Math.round(width / 3) property real settingsColumnWidth: width - labelColumnWidth - Timer - { - id: qualitySliderChangeTimer - interval: 50 - running: false - repeat: false - onTriggered: - { - var item = Cura.QualityProfilesDropDownMenuModel.getItem(qualitySlider.value); - Cura.MachineManager.activeQualityGroup = item.quality_group; - } - } - - // Here are the elements that are shown in the left column Item { @@ -46,7 +28,7 @@ Item { id: qualityRowTitle source: UM.Theme.getIcon("category_layer_height") - text: catalog.i18nc("@label", "Layer Height") + text: catalog.i18nc("@label", "Profiles") font: UM.Theme.getFont("medium") anchors.left: parent.left anchors.right: customisedSettings.left @@ -72,7 +54,7 @@ Item onClicked: { - // if the current profile is user-created, switch to a built-in quality + // If the current profile is user-created, switch to a built-in quality Cura.MachineManager.resetToUseDefaultQuality() } onEntered: From 94c2211e7fcf5d5d123bd92b2d6e5621a9d49053 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 1 Aug 2019 14:30:30 +0200 Subject: [PATCH 018/158] Further simplify the recommended print setup CURA-6598 --- .../Recommended/RecommendedPrintSetup.qml | 1 - .../RecommendedQualityProfileSelector.qml | 31 ------------------- 2 files changed, 32 deletions(-) diff --git a/resources/qml/PrintSetupSelector/Recommended/RecommendedPrintSetup.qml b/resources/qml/PrintSetupSelector/Recommended/RecommendedPrintSetup.qml index 6885f8c041..d9364681d2 100644 --- a/resources/qml/PrintSetupSelector/Recommended/RecommendedPrintSetup.qml +++ b/resources/qml/PrintSetupSelector/Recommended/RecommendedPrintSetup.qml @@ -27,7 +27,6 @@ Item Column { - width: parent.width - 2 * parent.padding spacing: UM.Theme.getSize("wide_margin").height anchors diff --git a/resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelector.qml b/resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelector.qml index c465a2e2be..4b9d158483 100644 --- a/resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelector.qml +++ b/resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelector.qml @@ -33,37 +33,6 @@ Item anchors.left: parent.left anchors.right: customisedSettings.left } - - UM.SimpleButton - { - id: customisedSettings - - visible: Cura.SimpleModeSettingsManager.isProfileCustomized || Cura.MachineManager.hasCustomQuality - height: visible ? UM.Theme.getSize("print_setup_icon").height : 0 - width: height - anchors - { - right: parent.right - rightMargin: UM.Theme.getSize("default_margin").width - leftMargin: UM.Theme.getSize("default_margin").width - verticalCenter: parent.verticalCenter - } - - color: hovered ? UM.Theme.getColor("setting_control_button_hover") : UM.Theme.getColor("setting_control_button") - iconSource: UM.Theme.getIcon("reset") - - onClicked: - { - // If the current profile is user-created, switch to a built-in quality - Cura.MachineManager.resetToUseDefaultQuality() - } - onEntered: - { - var tooltipContent = catalog.i18nc("@tooltip","You have modified some profile settings. If you want to change these go to custom mode.") - base.showTooltip(qualityRow, Qt.point(-UM.Theme.getSize("thick_margin").width, 0), tooltipContent) - } - onExited: base.hideTooltip() - } } Column From c51dfec29fd3a6c3ca828a5b3a8ed298a548f4d1 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 1 Aug 2019 14:50:33 +0200 Subject: [PATCH 019/158] Ensure that the intent category names are displayed coorectly in recommended CURA-6598 --- .../RecommendedQualityProfileSelector.qml | 92 ++++++++++++------- 1 file changed, 59 insertions(+), 33 deletions(-) diff --git a/resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelector.qml b/resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelector.qml index 4b9d158483..ad26ac7ef4 100644 --- a/resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelector.qml +++ b/resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelector.qml @@ -18,28 +18,12 @@ Item property real settingsColumnWidth: width - labelColumnWidth // Here are the elements that are shown in the left column - Item - { - id: titleRow - width: labelColumnWidth - height: childrenRect.height - - Cura.IconWithText - { - id: qualityRowTitle - source: UM.Theme.getIcon("category_layer_height") - text: catalog.i18nc("@label", "Profiles") - font: UM.Theme.getFont("medium") - anchors.left: parent.left - anchors.right: customisedSettings.left - } - } Column { anchors { - left: titleRow.right + left: parent.left right: parent.right } @@ -53,43 +37,85 @@ Item } - Cura.LabelBar + Item { - id: labelbar + height: childrenRect.height anchors { left: parent.left right: parent.right } + Cura.IconWithText + { + id: profileLabel + source: UM.Theme.getIcon("category_layer_height") + text: catalog.i18nc("@label", "Profiles") + font: UM.Theme.getFont("medium") + width: labelColumnWidth + } - model: Cura.QualityProfilesDropDownMenuModel - modelKey: "layer_height" + Cura.LabelBar + { + id: labelbar + anchors + { + left: profileLabel.right + right: parent.right + } + + model: Cura.QualityProfilesDropDownMenuModel + modelKey: "layer_height" + } } + Repeater { - model: Cura.IntentCategoryModel{} - Cura.RadioCheckbar + model: Cura.IntentCategoryModel {} + Item { anchors { left: parent.left right: parent.right } - dataModel: model["qualities"] - buttonGroup: activeProfileButtonGroup + height: childrenRect.height - function checkedFunction(modelItem) + Label { - if(Cura.MachineManager.hasCustomQuality) - { - // When user created profile is active, no quality tickbox should be active. - return false - } - return Cura.MachineManager.activeQualityType == modelItem.quality_type && Cura.MachineManager.activeIntentCategory == modelItem.intent_category + id: intentCategoryLabel + text: model.name + width: labelColumnWidth - UM.Theme.getSize("section_icon").width + anchors.left: parent.left + anchors.leftMargin: UM.Theme.getSize("section_icon").width + UM.Theme.getSize("narrow_margin").width + font: UM.Theme.getFont("medium") + color: UM.Theme.getColor("text") + renderType: Text.NativeRendering + elide: Text.ElideRight } - isCheckedFunction: checkedFunction + Cura.RadioCheckbar + { + anchors + { + left: intentCategoryLabel.right + right: parent.right + } + dataModel: model["qualities"] + buttonGroup: activeProfileButtonGroup + + function checkedFunction(modelItem) + { + if(Cura.MachineManager.hasCustomQuality) + { + // When user created profile is active, no quality tickbox should be active. + return false + } + return Cura.MachineManager.activeQualityType == modelItem.quality_type && Cura.MachineManager.activeIntentCategory == modelItem.intent_category + } + + isCheckedFunction: checkedFunction + } } } From 7d65951f437f3e532eea573b59b2b7a5d37cd5c1 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 5 Aug 2019 16:25:38 +0200 Subject: [PATCH 020/158] Refactor ComboBox to use states CURA-6598 --- resources/qml/Widgets/ComboBox.qml | 53 ++++++++++++++---------------- 1 file changed, 24 insertions(+), 29 deletions(-) diff --git a/resources/qml/Widgets/ComboBox.qml b/resources/qml/Widgets/ComboBox.qml index d1edcca69c..5a1ff16b95 100644 --- a/resources/qml/Widgets/ComboBox.qml +++ b/resources/qml/Widgets/ComboBox.qml @@ -14,40 +14,34 @@ import Cura 1.1 as Cura ComboBox { id: control - property bool highlighted: False + + states: [ + State + { + name: "disabled" + when: !control.enabled + PropertyChanges { target: backgroundRectangle.border; color: UM.Theme.getColor("setting_control_disabled_border")} + PropertyChanges { target: backgroundRectangle; color: UM.Theme.getColor("setting_control_disabled")} + PropertyChanges { target: contentLabel; color: UM.Theme.getColor("setting_control_disabled_text")} + }, + State + { + name: "highlighted" + when: control.hovered || control.activeFocus + PropertyChanges { target: backgroundRectangle.border; color: UM.Theme.getColor("setting_control_border_highlight") } + PropertyChanges { target: backgroundRectangle; color: UM.Theme.getColor("setting_control_highlight")} + } + ] + background: Rectangle { - color: - { - if (!enabled) - { - return UM.Theme.getColor("setting_control_disabled") - } - - if (control.hovered || control.activeFocus || control.highlighted) - { - return UM.Theme.getColor("setting_control_highlight") - } - - return UM.Theme.getColor("setting_control") - } + id: backgroundRectangle + color: UM.Theme.getColor("setting_control") radius: UM.Theme.getSize("setting_control_radius").width border.width: UM.Theme.getSize("default_lining").width - border.color: - { - if (!enabled) - { - return UM.Theme.getColor("setting_control_disabled_border") - } + border.color: UM.Theme.getColor("setting_control_border") - if (control.hovered || control.activeFocus || control.highlighted) - { - return UM.Theme.getColor("setting_control_border_highlight") - } - - return UM.Theme.getColor("setting_control_border") - } } indicator: UM.RecolorImage @@ -67,6 +61,7 @@ ComboBox contentItem: Label { + id: contentLabel anchors.left: parent.left anchors.leftMargin: UM.Theme.getSize("setting_unit_margin").width anchors.verticalCenter: parent.verticalCenter @@ -76,7 +71,7 @@ ComboBox textFormat: Text.PlainText renderType: Text.NativeRendering font: UM.Theme.getFont("default") - color: !enabled ? UM.Theme.getColor("setting_control_disabled_text") : UM.Theme.getColor("setting_control_text") + color: UM.Theme.getColor("setting_control_text") elide: Text.ElideRight verticalAlignment: Text.AlignVCenter } From 92be2611783a8d391e216711e6b0c3892da1bd24 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 6 Aug 2019 10:49:42 +0200 Subject: [PATCH 021/158] Update the profile selector to new style for the intents CURA-6598 --- .../Custom/CustomPrintSetup.qml | 107 ++++++-- .../Custom/QualitiesWithIntentMenu.qml | 242 ++++++++++++++++++ .../RecommendedQualityProfileSelector.qml | 1 - 3 files changed, 326 insertions(+), 24 deletions(-) create mode 100644 resources/qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml diff --git a/resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml b/resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml index e6a35455f2..1af3444e67 100644 --- a/resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml +++ b/resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml @@ -6,7 +6,7 @@ import QtQuick.Controls 2.0 import QtQuick.Controls 1.1 as OldControls import UM 1.3 as UM -import Cura 1.0 as Cura +import Cura 1.6 as Cura Item @@ -18,18 +18,6 @@ Item property var extrudersModel: CuraApplication.getExtrudersModel() - // Profile selector row - GlobalProfileSelector - { - id: globalProfileRow - anchors - { - top: parent.top - left: parent.left - right: parent.right - margins: parent.padding - } - } Item { id: intent @@ -37,7 +25,7 @@ Item anchors { - top: globalProfileRow.bottom + top: parent.top topMargin: UM.Theme.getSize("default_margin").height left: parent.left leftMargin: parent.padding @@ -60,20 +48,93 @@ Item color: UM.Theme.getColor("text") verticalAlignment: Text.AlignVCenter } - OldControls.ToolButton + + Button { id: intentSelection - text: Cura.MachineManager.activeStack != null ? Cura.MachineManager.activeStack.intent.name : "" - tooltip: text - height: UM.Theme.getSize("print_setup_big_item").height - width: UM.Theme.getSize("print_setup_big_item").width - anchors.right: parent.right - style: UM.Theme.styles.print_setup_header_button - activeFocusOnPress: true + onClicked: menu.opened ? menu.close() : menu.open() + text: generateActiveQualityText() - menu: Cura.IntentMenu { extruderIndex: Cura.ExtruderManager.activeExtruderIndex } + anchors.right: parent.right + width: UM.Theme.getSize("print_setup_big_item").width + height: textLabel.contentHeight + 2 * UM.Theme.getSize("narrow_margin").height + + contentItem: Label + { + id: textLabel + text: intentSelection.text + anchors.left: parent.left + anchors.leftMargin: UM.Theme.getSize("default_margin").width + anchors.verticalCenter: intentSelection.verticalCenter + height: contentHeight + verticalAlignment: Text.AlignVCenter + } + + background: Rectangle + { + border.color: UM.Theme.getColor("lining") + border.width: UM.Theme.getSize("default_lining").width + radius: UM.Theme.getSize("default_radius").width + } + + function generateActiveQualityText() + { + var result = Cura.MachineManager.activeQualityOrQualityChangesName + if (Cura.MachineManager.isActiveQualityExperimental) + { + result += " (Experimental)" + } + + if (Cura.MachineManager.isActiveQualitySupported) + { + if (Cura.MachineManager.activeQualityLayerHeight > 0) + { + result += " " + result += " - " + result += Cura.MachineManager.activeQualityLayerHeight + "mm" + result += "" + } + } + + return result + } + + UM.SimpleButton + { + id: customisedSettings + + visible: Cura.MachineManager.hasUserSettings + width: UM.Theme.getSize("print_setup_icon").width + height: UM.Theme.getSize("print_setup_icon").height + + anchors.verticalCenter: parent.verticalCenter + anchors.right: parent.right + anchors.rightMargin: UM.Theme.getSize("thick_margin").width + + color: hovered ? UM.Theme.getColor("setting_control_button_hover") : UM.Theme.getColor("setting_control_button"); + iconSource: UM.Theme.getIcon("star") + + onClicked: + { + forceActiveFocus(); + Cura.Actions.manageProfiles.trigger() + } + onEntered: + { + var content = catalog.i18nc("@tooltip", "Some setting/override values are different from the values stored in the profile.\n\nClick to open the profile manager.") + base.showTooltip(intent, Qt.point(-UM.Theme.getSize("default_margin").width, 0), content) + } + onExited: base.hideTooltip() + } } + QualitiesWithIntentMenu + { + id: menu + y: intentSelection.y + intentSelection.height + x: intentSelection.x + width: intentSelection.width + } } UM.TabRow diff --git a/resources/qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml b/resources/qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml new file mode 100644 index 0000000000..1ba73bb029 --- /dev/null +++ b/resources/qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml @@ -0,0 +1,242 @@ +import QtQuick 2.0 +import QtQuick.Controls 2.3 +import Cura 1.6 as Cura + +import UM 1.2 as UM +Popup +{ + id: popup + implicitWidth: 400 + property var dataModel: Cura.IntentCategoryModel {} + + property int defaultMargin: 5 + property int checkmarkSize: 12 + property int buttonHeight: 25 + property color backgroundColor: "#f2f2f2" + property color borderColor: "#cccccc" + padding: 0 + + background: Rectangle + { + color: backgroundColor + border.width: 1 + border.color: borderColor + } + + ButtonGroup + { + id: buttonGroup + exclusive: true + onClicked: popup.visible = false + } + + contentItem: Column + { + anchors.left: parent.left + anchors.right: parent.right + anchors.top: parent.top + + height: childrenRect.height + + // This repeater adds the intent labels + Repeater + { + model: dataModel + delegate: Item + { + // We need to set it like that, otherwise we'd have to set the sub model with model: model.qualities + // Which obviously won't work due to naming conflicts. + property variant subItemModel: model.qualities + + height: childrenRect.height + anchors + { + left: parent.left + leftMargin: defaultMargin + right: parent.right + rightMargin: defaultMargin + } + + Label + { + id: headerLabel + text: model.name + height: visible ? contentHeight: 0 + enabled: false + visible: qualitiesList.visibleChildren.length > 0 + } + + Column + { + id: qualitiesList + anchors.top: headerLabel.bottom + anchors.left: parent.left + anchors.right: parent.right + + // We set it by means of a binding, since then we can use the when condition, which we need to + // prevent a binding loop. + Binding + { + target: parent + property: "height" + value: parent.childrenRect.height + when: parent.visibleChildren.lengt > 0 + } + + // Add the qualities that belong to the intent + Repeater + { + visible: false + model: subItemModel + Button + { + id: button + + onClicked: Cura.IntentManager.selectIntent(model.intent_category, model.quality_type) + + width: parent.width + height: buttonHeight + checkable: true + visible: model.available + checked: + { + if(Cura.MachineManager.hasCustomQuality) + { + // When user created profile is active, no quality tickbox should be active. + return false + } + return Cura.MachineManager.activeQualityType == model.quality_type && Cura.MachineManager.activeIntentCategory == model.intent_category + } + ButtonGroup.group: buttonGroup + background: Item {} + contentItem: Item + { + Rectangle + { + id: checkmark + width: checkmarkSize + height: checkmarkSize + anchors.verticalCenter: parent.verticalCenter + color: "black" + visible: button.checked + } + + Label + { + id: label + text: model.name + " - " + model.layer_height + " mm" + verticalAlignment: Text.AlignVCenter + anchors + { + left: checkmark.right + leftMargin: defaultMargin + top: parent.top + bottom: parent.bottom + right: parent.right + } + } + } + } + } + } + } + } + + Rectangle + { + height: 1 + anchors.left: parent.left + anchors.right: parent.right + color: borderColor + } + Button + { + text: Cura.Actions.addProfile.text + + anchors.left: parent.left + anchors.leftMargin: defaultMargin + + enabled: Cura.Actions.addProfile.enabled + background: Item {} + onClicked: + { + Cura.Actions.addProfile.trigger() + popup.visible = false + } + + } + Button + { + text: Cura.Actions.updateProfile.text + + anchors.left: parent.left + anchors.leftMargin: defaultMargin + + enabled: Cura.Actions.updateProfile.enabled + background: Item {} + onClicked: + { + popup.visible = false + Cura.Actions.updateProfile.trigger() + } + } + Button + { + text: catalog.i18nc("@action:button", "Discard current changes") + + anchors.left: parent.left + anchors.leftMargin: defaultMargin + + enabled: Cura.MachineManager.hasUserSettings + background: Item {} + onClicked: + { + popup.visible = false + Cura.ContainerManager.clearUserContainers() + } + } + Rectangle + { + height: 1 + anchors.left: parent.left + anchors.right: parent.right + color: borderColor + } + Button + { + id: manageProfilesButton + text: Cura.Actions.manageProfiles.text + anchors + { + left: parent.left + leftMargin: defaultMargin + right: parent.right + rightMargin: defaultMargin + } + + height: textLabel.contentHeight + 2 * UM.Theme.getSize("narrow_margin").height + background: Item {} + contentItem: Item + { + width: manageProfilesButton.width + Label + { + id: textLabel + text: manageProfilesButton.text + height: contentHeight + } + Label + { + id: shortcutLabel + text: Cura.Actions.manageProfiles.shortcut + anchors.right: parent.right + } + } + onClicked: + { + popup.visible = false + Cura.Actions.manageProfiles.trigger() + } + } + } +} diff --git a/resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelector.qml b/resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelector.qml index ad26ac7ef4..9194f3c85c 100644 --- a/resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelector.qml +++ b/resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelector.qml @@ -34,7 +34,6 @@ Item id: activeProfileButtonGroup exclusive: true onClicked: Cura.IntentManager.selectIntent(button.modelData.intent_category, button.modelData.quality_type) - } Item From 6751dc4fc850c4d5d518e10a5c97b9af271d55f8 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 6 Aug 2019 12:41:37 +0200 Subject: [PATCH 022/158] Remove unused QML component CURA-6598 --- .../Custom/GlobalProfileSelector.qml | 100 ------------------ 1 file changed, 100 deletions(-) delete mode 100644 resources/qml/PrintSetupSelector/Custom/GlobalProfileSelector.qml diff --git a/resources/qml/PrintSetupSelector/Custom/GlobalProfileSelector.qml b/resources/qml/PrintSetupSelector/Custom/GlobalProfileSelector.qml deleted file mode 100644 index 32c07a52a6..0000000000 --- a/resources/qml/PrintSetupSelector/Custom/GlobalProfileSelector.qml +++ /dev/null @@ -1,100 +0,0 @@ -// Copyright (c) 2018 Ultimaker B.V. -// Cura is released under the terms of the LGPLv3 or higher. - -import QtQuick 2.7 -import QtQuick.Controls 1.1 -import QtQuick.Controls.Styles 1.1 -import QtQuick.Layouts 1.2 - -import UM 1.2 as UM -import Cura 1.0 as Cura - -Item -{ - id: globalProfileRow - height: childrenRect.height - - Label - { - id: globalProfileLabel - anchors - { - top: parent.top - bottom: parent.bottom - left: parent.left - right: globalProfileSelection.left - } - text: catalog.i18nc("@label", "Profile") - font: UM.Theme.getFont("medium") - color: UM.Theme.getColor("text") - verticalAlignment: Text.AlignVCenter - } - - ToolButton - { - id: globalProfileSelection - - text: generateActiveQualityText() - width: UM.Theme.getSize("print_setup_big_item").width - height: UM.Theme.getSize("print_setup_big_item").height - anchors - { - top: parent.top - right: parent.right - } - tooltip: Cura.MachineManager.activeQualityOrQualityChangesName - style: UM.Theme.styles.print_setup_header_button - activeFocusOnPress: true - menu: Cura.ProfileMenu { } - - function generateActiveQualityText() - { - var result = Cura.MachineManager.activeQualityOrQualityChangesName - if (Cura.MachineManager.isActiveQualityExperimental) - { - result += " (Experimental)" - } - - if (Cura.MachineManager.isActiveQualitySupported) - { - if (Cura.MachineManager.activeQualityLayerHeight > 0) - { - result += " " - result += " - " - result += Cura.MachineManager.activeQualityLayerHeight + "mm" - result += "" - } - } - - return result - } - - UM.SimpleButton - { - id: customisedSettings - - visible: Cura.MachineManager.hasUserSettings - width: UM.Theme.getSize("print_setup_icon").width - height: UM.Theme.getSize("print_setup_icon").height - - anchors.verticalCenter: parent.verticalCenter - anchors.right: parent.right - anchors.rightMargin: Math.round(UM.Theme.getSize("setting_preferences_button_margin").width - UM.Theme.getSize("thick_margin").width) - - color: hovered ? UM.Theme.getColor("setting_control_button_hover") : UM.Theme.getColor("setting_control_button"); - iconSource: UM.Theme.getIcon("star") - - onClicked: - { - forceActiveFocus(); - Cura.Actions.manageProfiles.trigger() - } - onEntered: - { - var content = catalog.i18nc("@tooltip","Some setting/override values are different from the values stored in the profile.\n\nClick to open the profile manager.") - base.showTooltip(globalProfileRow, Qt.point(-UM.Theme.getSize("default_margin").width, 0), content) - } - onExited: base.hideTooltip() - } - } -} \ No newline at end of file From 5acc3111e00d152609fdd0101cf7b761f8261bcb Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 6 Aug 2019 12:58:53 +0200 Subject: [PATCH 023/158] Some minor UI fixes CURA-6598 --- resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml b/resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml index 1af3444e67..4c3e2d395b 100644 --- a/resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml +++ b/resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml @@ -35,7 +35,7 @@ Item Label { - id: intentLabel + id: profileLabel anchors { top: parent.top @@ -43,7 +43,7 @@ Item left: parent.left right: intentSelection.left } - text: catalog.i18nc("@label", "Intent") + text: catalog.i18nc("@label", "Profile") font: UM.Theme.getFont("medium") color: UM.Theme.getColor("text") verticalAlignment: Text.AlignVCenter @@ -75,6 +75,7 @@ Item border.color: UM.Theme.getColor("lining") border.width: UM.Theme.getSize("default_lining").width radius: UM.Theme.getSize("default_radius").width + color: UM.Theme.getColor("main_background") } function generateActiveQualityText() From 87fedc26207ab9e1f20637a0e051523c825d210b Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 6 Aug 2019 13:08:55 +0200 Subject: [PATCH 024/158] Fix elide for the variant in configuration menu --- resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml b/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml index 77164429b3..fb074e948c 100644 --- a/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml +++ b/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml @@ -99,12 +99,14 @@ Cura.ExpandablePopup left: extruderIcon.right leftMargin: UM.Theme.getSize("default_margin").width top: typeAndBrandNameLabel.bottom + right: parent.right + rightMargin: UM.Theme.getSize("default_margin").width } } } } - //Placeholder text if there is a configuration to select but no materials (so we can't show the materials per extruder). + // Placeholder text if there is a configuration to select but no materials (so we can't show the materials per extruder). Label { text: catalog.i18nc("@label", "Select configuration") From 8445ebe8cfaf0ad3fd46e36047514b88b32eb94e Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 6 Aug 2019 13:13:54 +0200 Subject: [PATCH 025/158] Remove menu that is no longer used CURA-6598 --- resources/qml/Menus/IntentMenu.qml | 64 ------------------------------ 1 file changed, 64 deletions(-) delete mode 100644 resources/qml/Menus/IntentMenu.qml diff --git a/resources/qml/Menus/IntentMenu.qml b/resources/qml/Menus/IntentMenu.qml deleted file mode 100644 index 8aba7cbde6..0000000000 --- a/resources/qml/Menus/IntentMenu.qml +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright (c) 2019 Ultimaker B.V. -// Cura is released under the terms of the LGPLv3 or higher. - -import QtQuick 2.7 -import QtQuick.Controls 1.4 - -import UM 1.2 as UM -import Cura 1.6 as Cura - -Menu -{ - id: menu - title: "Intent" - - property int extruderIndex: 0 - - Cura.IntentCategoryModel - { - id: intentCategoryModel - } - - Instantiator - { - model: intentCategoryModel - - MenuItem //Section header. - { - text: model.name - enabled: false - checked: false - - property var per_category_intents: Cura.IntentModel - { - id: intentModel - intentCategory: model.intent_category - } - - property var intent_instantiator: Instantiator - { - model: intentModel - MenuItem - { - text: model.name - checkable: true - checked: false - Binding on checked - { - when: Cura.MachineManager.activeStack != null - value: Cura.MachineManager.activeStack.intent.metaData["intent_category"] == intentModel.intentCategory && Cura.MachineManager.activeStack.quality.metaData["quality_type"] == model.quality_type - } - exclusiveGroup: group - onTriggered: Cura.IntentManager.selectIntent(intentModel.intentCategory, model.quality_type) - } - - onObjectAdded: menu.insertItem(index, object) - onObjectRemoved: menu.removeItem(object) - } - } - - onObjectAdded: menu.insertItem(index, object) - onObjectRemoved: menu.removeItem(object) - } - ExclusiveGroup { id: group } -} From f7e6f22e6c73e1af5a5fa9e0ecae820500d01b66 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 6 Aug 2019 13:33:17 +0200 Subject: [PATCH 026/158] Fix typo CURA-6598 --- .../qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml b/resources/qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml index 1ba73bb029..d52f890a4d 100644 --- a/resources/qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml +++ b/resources/qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml @@ -80,7 +80,7 @@ Popup target: parent property: "height" value: parent.childrenRect.height - when: parent.visibleChildren.lengt > 0 + when: parent.visibleChildren.length > 0 } // Add the qualities that belong to the intent From d5bbc3f205433e37eb76e1891c77b4b5390acce9 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 6 Aug 2019 13:34:35 +0200 Subject: [PATCH 027/158] Remove reference to unknown component CURA-6598 --- resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml b/resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml index 4c3e2d395b..400b148896 100644 --- a/resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml +++ b/resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml @@ -205,7 +205,7 @@ Item { anchors { - top: tabBar.visible ? tabBar.bottom : globalProfileRow.bottom + top: tabBar.visible ? tabBar.bottom : intent.bottom topMargin: -UM.Theme.getSize("default_lining").width left: parent.left leftMargin: parent.padding From 210a2aa6bb506eb341f06c9c24751ac314cc1703 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 6 Aug 2019 15:13:06 +0200 Subject: [PATCH 028/158] Add arrow indicator to the custom print setup CURA-6598 --- .../Custom/CustomPrintSetup.qml | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml b/resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml index 400b148896..0941c98cfb 100644 --- a/resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml +++ b/resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml @@ -109,8 +109,8 @@ Item height: UM.Theme.getSize("print_setup_icon").height anchors.verticalCenter: parent.verticalCenter - anchors.right: parent.right - anchors.rightMargin: UM.Theme.getSize("thick_margin").width + anchors.right: downArrow.left + anchors.rightMargin: UM.Theme.getSize("default_margin").width color: hovered ? UM.Theme.getColor("setting_control_button_hover") : UM.Theme.getColor("setting_control_button"); iconSource: UM.Theme.getIcon("star") @@ -127,6 +127,24 @@ Item } onExited: base.hideTooltip() } + UM.RecolorImage + { + id: downArrow + + + source: UM.Theme.getIcon("arrow_bottom") + width: UM.Theme.getSize("standard_arrow").width + height: UM.Theme.getSize("standard_arrow").height + + anchors + { + right: parent.right + verticalCenter: parent.verticalCenter + rightMargin: UM.Theme.getSize("default_margin").width + } + + color: UM.Theme.getColor("setting_control_button") + } } QualitiesWithIntentMenu From 5ab31df73800f791ce01a8060a868045a3fc894a Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 6 Aug 2019 15:19:01 +0200 Subject: [PATCH 029/158] Add hover effect to quality/intent selector CURA-6598 --- resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml b/resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml index 0941c98cfb..13df330fb8 100644 --- a/resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml +++ b/resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml @@ -58,6 +58,7 @@ Item anchors.right: parent.right width: UM.Theme.getSize("print_setup_big_item").width height: textLabel.contentHeight + 2 * UM.Theme.getSize("narrow_margin").height + hoverEnabled: true contentItem: Label { @@ -72,7 +73,8 @@ Item background: Rectangle { - border.color: UM.Theme.getColor("lining") + id: backgroundItem + border.color: intentSelection.hovered ? UM.Theme.getColor("setting_control_border_highlight") : UM.Theme.getColor("setting_control_border") border.width: UM.Theme.getSize("default_lining").width radius: UM.Theme.getSize("default_radius").width color: UM.Theme.getColor("main_background") From 0891abf8afdf1516f128a38a987b0b3df0e566d6 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 6 Aug 2019 17:08:23 +0200 Subject: [PATCH 030/158] Fix hover & highlighting for the qualities& intent menu CURA-6598 --- .../PrintSetupSelector/Custom/MenuButton.qml | 47 +++++++++++++ .../Custom/QualitiesWithIntentMenu.qml | 67 ++++++------------- 2 files changed, 66 insertions(+), 48 deletions(-) create mode 100644 resources/qml/PrintSetupSelector/Custom/MenuButton.qml diff --git a/resources/qml/PrintSetupSelector/Custom/MenuButton.qml b/resources/qml/PrintSetupSelector/Custom/MenuButton.qml new file mode 100644 index 0000000000..ee1be80075 --- /dev/null +++ b/resources/qml/PrintSetupSelector/Custom/MenuButton.qml @@ -0,0 +1,47 @@ +import QtQuick 2.0 +import QtQuick.Controls 2.3 +import Cura 1.6 as Cura + +import UM 1.2 as UM + +Button +{ + // This is a work around for a qml issue. Since the default button uses a private implementation for contentItem + // (the so called IconText), which handles the mnemonic conversion (aka; ensuring that &Button) text property + // is rendered with the B underlined. Since we're also forced to mix controls 1.0 and 2.0 actions together, + // we need a special property for the text of the label if we do want it to be rendered correclty, but don't want + // another shortcut to be added (which will cause for "QQuickAction::event: Ambiguous shortcut overload: " to + // happen. + property string labelText: "" + id: button + hoverEnabled: true + + background: Rectangle + { + id: backgroundRectangle + border.width: 1 + border.color: button.checked ? UM.Theme.getColor("setting_control_border_highlight") : "transparent" + color: button.hovered ? UM.Theme.getColor("action_button_hovered") : "transparent" + } + + // Workarround to ensure that the mnemonic highlighting happens correctly + function replaceText(txt) + { + var index = txt.indexOf("&") + if(index >= 0) + { + txt = txt.replace(txt.substr(index, 2), ("" + txt.substr(index + 1, 1) + "")) + } + return txt + } + + contentItem: Label + { + id: textLabel + text: button.text != "" ? replaceText(button.text) : replaceText(button.labelText) + height: contentHeight + verticalAlignment: Text.AlignVCenter + anchors.left: button.left + anchors.leftMargin: UM.Theme.getSize("default_margin").width + } +} \ No newline at end of file diff --git a/resources/qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml b/resources/qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml index d52f890a4d..314a2bd095 100644 --- a/resources/qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml +++ b/resources/qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml @@ -52,9 +52,7 @@ Popup anchors { left: parent.left - leftMargin: defaultMargin right: parent.right - rightMargin: defaultMargin } Label @@ -64,6 +62,8 @@ Popup height: visible ? contentHeight: 0 enabled: false visible: qualitiesList.visibleChildren.length > 0 + anchors.left: parent.left + anchors.leftMargin: UM.Theme.getSize("narrow_margin").width } Column @@ -88,16 +88,16 @@ Popup { visible: false model: subItemModel - Button + MenuButton { id: button onClicked: Cura.IntentManager.selectIntent(model.intent_category, model.quality_type) width: parent.width - height: buttonHeight checkable: true visible: model.available + text: model.name + " - " + model.layer_height + " mm" checked: { if(Cura.MachineManager.hasCustomQuality) @@ -108,34 +108,7 @@ Popup return Cura.MachineManager.activeQualityType == model.quality_type && Cura.MachineManager.activeIntentCategory == model.intent_category } ButtonGroup.group: buttonGroup - background: Item {} - contentItem: Item - { - Rectangle - { - id: checkmark - width: checkmarkSize - height: checkmarkSize - anchors.verticalCenter: parent.verticalCenter - color: "black" - visible: button.checked - } - Label - { - id: label - text: model.name + " - " + model.layer_height + " mm" - verticalAlignment: Text.AlignVCenter - anchors - { - left: checkmark.right - leftMargin: defaultMargin - top: parent.top - bottom: parent.bottom - right: parent.right - } - } - } } } } @@ -149,46 +122,43 @@ Popup anchors.right: parent.right color: borderColor } - Button + MenuButton { - text: Cura.Actions.addProfile.text + labelText: Cura.Actions.addProfile.text anchors.left: parent.left - anchors.leftMargin: defaultMargin + anchors.right: parent.right enabled: Cura.Actions.addProfile.enabled - background: Item {} onClicked: { Cura.Actions.addProfile.trigger() popup.visible = false } - } - Button + MenuButton { - text: Cura.Actions.updateProfile.text - + labelText: Cura.Actions.updateProfile.text anchors.left: parent.left - anchors.leftMargin: defaultMargin + anchors.right: parent.right enabled: Cura.Actions.updateProfile.enabled - background: Item {} + onClicked: { popup.visible = false Cura.Actions.updateProfile.trigger() } } - Button + MenuButton { text: catalog.i18nc("@action:button", "Discard current changes") anchors.left: parent.left - anchors.leftMargin: defaultMargin + anchors.right: parent.right enabled: Cura.MachineManager.hasUserSettings - background: Item {} + onClicked: { popup.visible = false @@ -202,20 +172,19 @@ Popup anchors.right: parent.right color: borderColor } - Button + + MenuButton { id: manageProfilesButton text: Cura.Actions.manageProfiles.text anchors { left: parent.left - leftMargin: defaultMargin right: parent.right - rightMargin: defaultMargin } height: textLabel.contentHeight + 2 * UM.Theme.getSize("narrow_margin").height - background: Item {} + contentItem: Item { width: manageProfilesButton.width @@ -224,6 +193,8 @@ Popup id: textLabel text: manageProfilesButton.text height: contentHeight + anchors.left: button.left + anchors.leftMargin: UM.Theme.getSize("default_margin").width } Label { From 4520ee7e1c6663608ad108c2d21f6344cb5fedd2 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 7 Aug 2019 09:58:14 +0200 Subject: [PATCH 031/158] Added rounded corners to the intent menu CURA-6598 --- .../Custom/QualitiesWithIntentMenu.qml | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/resources/qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml b/resources/qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml index 314a2bd095..a7caba3d95 100644 --- a/resources/qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml +++ b/resources/qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml @@ -12,15 +12,17 @@ Popup property int defaultMargin: 5 property int checkmarkSize: 12 property int buttonHeight: 25 - property color backgroundColor: "#f2f2f2" - property color borderColor: "#cccccc" + property color backgroundColor: UM.Theme.getColor("main_background") + property color borderColor: UM.Theme.getColor("lining") + padding: 0 - background: Rectangle + background: Cura.RoundedRectangle { color: backgroundColor - border.width: 1 + border.width: UM.Theme.getSize("default_lining").width border.color: borderColor + cornerSide: Cura.RoundedRectangle.Direction.Down } ButtonGroup @@ -33,11 +35,11 @@ Popup contentItem: Column { anchors.left: parent.left + anchors.leftMargin: UM.Theme.getSize("default_lining").width + anchors.rightMargin: UM.Theme.getSize("default_lining").width anchors.right: parent.right anchors.top: parent.top - height: childrenRect.height - // This repeater adds the intent labels Repeater { @@ -209,5 +211,11 @@ Popup Cura.Actions.manageProfiles.trigger() } } + // spacer + Item + { + width: 2 + height: UM.Theme.getSize("default_radius").width + } } } From 7c832e7ea367ac408ecd68a4a6ab691163199fba Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 7 Aug 2019 10:58:50 +0200 Subject: [PATCH 032/158] Intents are now also displayed in active profile labels CURA-6598 --- .../qml/PrintSetupSelector/Custom/CustomPrintSetup.qml | 9 ++++++++- .../PrintSetupSelector/PrintSetupSelectorHeader.qml | 10 ++++++++-- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml b/resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml index 13df330fb8..656f58ac28 100644 --- a/resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml +++ b/resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml @@ -82,7 +82,14 @@ Item function generateActiveQualityText() { - var result = Cura.MachineManager.activeQualityOrQualityChangesName + + var result = "" + if(Cura.MachineManager.activeIntentCategory != "default") + { + result += Cura.MachineManager.activeIntentCategory + " - " + } + + result += Cura.MachineManager.activeQualityOrQualityChangesName if (Cura.MachineManager.isActiveQualityExperimental) { result += " (Experimental)" diff --git a/resources/qml/PrintSetupSelector/PrintSetupSelectorHeader.qml b/resources/qml/PrintSetupSelector/PrintSetupSelectorHeader.qml index 96b244d803..30691d32b9 100644 --- a/resources/qml/PrintSetupSelector/PrintSetupSelectorHeader.qml +++ b/resources/qml/PrintSetupSelector/PrintSetupSelectorHeader.qml @@ -20,10 +20,16 @@ RowLayout { if (Cura.MachineManager.activeStack) { - var text = Cura.MachineManager.activeQualityOrQualityChangesName + var text = "" + if(Cura.MachineManager.activeIntentCategory != "default") + { + text += Cura.MachineManager.activeIntentCategory + " - " + } + + text += Cura.MachineManager.activeQualityOrQualityChangesName if (!Cura.MachineManager.hasNotSupportedQuality) { - text += " " + layerHeight.properties.value + "mm" + text += " - " + layerHeight.properties.value + "mm" text += Cura.MachineManager.isActiveQualityExperimental ? " - " + catalog.i18nc("@label", "Experimental") : "" } return text From 6220dfd15354ce62ea5b01fd242eaa7113369f9e Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 7 Aug 2019 11:02:17 +0200 Subject: [PATCH 033/158] Remove profile menu CURA-6598 --- resources/qml/Menus/ProfileMenu.qml | 84 ---------------------------- resources/qml/Menus/SettingsMenu.qml | 1 - 2 files changed, 85 deletions(-) delete mode 100644 resources/qml/Menus/ProfileMenu.qml diff --git a/resources/qml/Menus/ProfileMenu.qml b/resources/qml/Menus/ProfileMenu.qml deleted file mode 100644 index 68260f2502..0000000000 --- a/resources/qml/Menus/ProfileMenu.qml +++ /dev/null @@ -1,84 +0,0 @@ -// Copyright (c) 2018 Ultimaker B.V. -// Cura is released under the terms of the LGPLv3 or higher. - -import QtQuick 2.7 -import QtQuick.Controls 1.4 - -import UM 1.2 as UM -import Cura 1.0 as Cura - -Menu -{ - id: menu - - Instantiator - { - model: Cura.QualityProfilesDropDownMenuModel - - MenuItem - { - text: - { - var full_text = (model.layer_height != "") ? model.name + " - " + model.layer_height + model.layer_height_unit : model.name - full_text += model.is_experimental ? " - " + catalog.i18nc("@label", "Experimental") : "" - return full_text - } - checkable: true - checked: Cura.MachineManager.activeQualityOrQualityChangesName == model.name - exclusiveGroup: group - onTriggered: Cura.MachineManager.setQualityGroup(model.quality_group) - visible: model.available - } - - onObjectAdded: menu.insertItem(index, object) - onObjectRemoved: menu.removeItem(object) - } - - MenuSeparator - { - id: customSeparator - visible: Cura.CustomQualityProfilesDropDownMenuModel.count > 0 - } - - Instantiator - { - id: customProfileInstantiator - model: Cura.CustomQualityProfilesDropDownMenuModel - - Connections - { - target: Cura.CustomQualityProfilesDropDownMenuModel - onModelReset: customSeparator.visible = Cura.CustomQualityProfilesDropDownMenuModel.count > 0 - } - - MenuItem - { - text: model.name - checkable: true - checked: Cura.MachineManager.activeQualityOrQualityChangesName == model.name - exclusiveGroup: group - onTriggered: Cura.MachineManager.setQualityChangesGroup(model.quality_changes_group) - } - - onObjectAdded: - { - customSeparator.visible = model.count > 0; - menu.insertItem(index, object); - } - onObjectRemoved: - { - customSeparator.visible = model.count > 0; - menu.removeItem(object); - } - } - - ExclusiveGroup { id: group; } - - MenuSeparator { id: profileMenuSeparator } - - MenuItem { action: Cura.Actions.addProfile } - MenuItem { action: Cura.Actions.updateProfile } - MenuItem { action: Cura.Actions.resetProfile } - MenuSeparator { } - MenuItem { action: Cura.Actions.manageProfiles } -} diff --git a/resources/qml/Menus/SettingsMenu.qml b/resources/qml/Menus/SettingsMenu.qml index 2845101dbf..f885120220 100644 --- a/resources/qml/Menus/SettingsMenu.qml +++ b/resources/qml/Menus/SettingsMenu.qml @@ -63,7 +63,6 @@ Menu title: catalog.i18nc("@title:menu", "&Build plate") visible: CuraSDKVersion == "dev" && Cura.MachineManager.hasVariantBuildplates } - ProfileMenu { title: catalog.i18nc("@title:settings", "&Profile") } MenuSeparator { } From a3d3580e2af3bdf0b5bc8eba05cde082a7b89187 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 7 Aug 2019 11:04:54 +0200 Subject: [PATCH 034/158] Remove buildplate menu The menu wasn't used anymore and leaving it in just makes things more complicated --- resources/qml/Menus/BuildplateMenu.qml | 36 -------------------------- resources/qml/Menus/SettingsMenu.qml | 7 ----- 2 files changed, 43 deletions(-) delete mode 100644 resources/qml/Menus/BuildplateMenu.qml diff --git a/resources/qml/Menus/BuildplateMenu.qml b/resources/qml/Menus/BuildplateMenu.qml deleted file mode 100644 index b924aa0879..0000000000 --- a/resources/qml/Menus/BuildplateMenu.qml +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright (c) 2018 Ultimaker B.V. -// Cura is released under the terms of the LGPLv3 or higher. - -import QtQuick 2.7 -import QtQuick.Controls 1.4 - -import UM 1.2 as UM -import Cura 1.0 as Cura - -Menu -{ - id: menu - title: "Build plate" - - property var buildPlateModel: CuraApplication.getBuildPlateModel() - - Instantiator - { - model: menu.buildPlateModel - - MenuItem { - text: model.name - checkable: true - checked: model.name == Cura.MachineManager.globalVariantName - exclusiveGroup: group - onTriggered: { - Cura.MachineManager.setGlobalVariant(model.container_node); - } - } - - onObjectAdded: menu.insertItem(index, object) - onObjectRemoved: menu.removeItem(object) - } - - ExclusiveGroup { id: group } -} diff --git a/resources/qml/Menus/SettingsMenu.qml b/resources/qml/Menus/SettingsMenu.qml index f885120220..17a4f6734a 100644 --- a/resources/qml/Menus/SettingsMenu.qml +++ b/resources/qml/Menus/SettingsMenu.qml @@ -57,13 +57,6 @@ Menu onObjectRemoved: base.removeItem(object) } - // TODO Only show in dev mode. Remove check when feature ready - BuildplateMenu - { - title: catalog.i18nc("@title:menu", "&Build plate") - visible: CuraSDKVersion == "dev" && Cura.MachineManager.hasVariantBuildplates - } - MenuSeparator { } MenuItem { action: Cura.Actions.configureSettingVisibility } From c7b6133e3dd4c0cd53ecb0c5f754f1f818535025 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 7 Aug 2019 11:27:02 +0200 Subject: [PATCH 035/158] Some UI polishing CURA-6598 --- resources/qml/PrintSetupSelector/Custom/MenuButton.qml | 3 ++- .../Custom/QualitiesWithIntentMenu.qml | 10 +++++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/resources/qml/PrintSetupSelector/Custom/MenuButton.qml b/resources/qml/PrintSetupSelector/Custom/MenuButton.qml index ee1be80075..1652b71213 100644 --- a/resources/qml/PrintSetupSelector/Custom/MenuButton.qml +++ b/resources/qml/PrintSetupSelector/Custom/MenuButton.qml @@ -22,6 +22,7 @@ Button border.width: 1 border.color: button.checked ? UM.Theme.getColor("setting_control_border_highlight") : "transparent" color: button.hovered ? UM.Theme.getColor("action_button_hovered") : "transparent" + radius: UM.Theme.getSize("action_button_radius").width } // Workarround to ensure that the mnemonic highlighting happens correctly @@ -42,6 +43,6 @@ Button height: contentHeight verticalAlignment: Text.AlignVCenter anchors.left: button.left - anchors.leftMargin: UM.Theme.getSize("default_margin").width + anchors.leftMargin: UM.Theme.getSize("wide_margin").width } } \ No newline at end of file diff --git a/resources/qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml b/resources/qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml index a7caba3d95..6d51b9005b 100644 --- a/resources/qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml +++ b/resources/qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml @@ -65,7 +65,7 @@ Popup enabled: false visible: qualitiesList.visibleChildren.length > 0 anchors.left: parent.left - anchors.leftMargin: UM.Theme.getSize("narrow_margin").width + anchors.leftMargin: UM.Theme.getSize("default_margin").width } Column @@ -195,14 +195,18 @@ Popup id: textLabel text: manageProfilesButton.text height: contentHeight - anchors.left: button.left - anchors.leftMargin: UM.Theme.getSize("default_margin").width + anchors.left: parent.left + anchors.leftMargin: UM.Theme.getSize("default_margin").width + UM.Theme.getSize("narrow_margin").width + verticalAlignment: Text.AlignVCenter } Label { id: shortcutLabel text: Cura.Actions.manageProfiles.shortcut + height: contentHeight anchors.right: parent.right + anchors.rightMargin: UM.Theme.getSize("default_margin").width + verticalAlignment: Text.AlignVCenter } } onClicked: From b56c09bcf43345e4953a5f44642c2eb709382745 Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Wed, 7 Aug 2019 15:50:00 +0200 Subject: [PATCH 036/158] Fix recommended-menu layer-height-label for Qt-5.10.0 part of CURA-6598 --- resources/qml/LabelBar.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/LabelBar.qml b/resources/qml/LabelBar.qml index ea29df0e06..6edfb3866c 100644 --- a/resources/qml/LabelBar.qml +++ b/resources/qml/LabelBar.qml @@ -28,7 +28,7 @@ Item { Layout.fillWidth: true Layout.fillHeight: true - Layout.maximumWidth: index + 1 === repeater.count ? itemSize: 200000000 + Layout.maximumWidth: index + 1 === repeater.count || repeater.count <= 1 ? itemSize : base.width / (repeater.count - 1) height: childrenRect.height Label { From f4dc93fc39a27402deea1f5bfbfbb54b42a558ca Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 29 Aug 2019 11:57:03 +0200 Subject: [PATCH 037/158] Prevent crash in model if no extruder is set CURA-6598 --- cura/Machines/Models/BaseMaterialsModel.py | 2 ++ resources/qml/Settings/SettingComboBox.qml | 3 +-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/cura/Machines/Models/BaseMaterialsModel.py b/cura/Machines/Models/BaseMaterialsModel.py index 3ab11b7e9d..8d7e8bda95 100644 --- a/cura/Machines/Models/BaseMaterialsModel.py +++ b/cura/Machines/Models/BaseMaterialsModel.py @@ -103,6 +103,8 @@ class BaseMaterialsModel(ListModel): # tree. This change may trigger an _update() call when the materials # changed for the configuration that this model is looking for. def _materialsListChanged(self, material: MaterialNode) -> None: + if self._extruder_stack is None: + return if material.variant.container_id != self._extruder_stack.variant.getId(): return if material.variant.machine.container_id != cura.CuraApplication.CuraApplication.getInstance().getGlobalContainerStack().definition.getId(): diff --git a/resources/qml/Settings/SettingComboBox.qml b/resources/qml/Settings/SettingComboBox.qml index 0b7f494a7d..1814d997b3 100644 --- a/resources/qml/Settings/SettingComboBox.qml +++ b/resources/qml/Settings/SettingComboBox.qml @@ -20,8 +20,7 @@ SettingItem textRole: "value" anchors.fill: parent - highlighted: base.hovered - + onActivated: { forceActiveFocus() From d59d7e5b8dc73b149eae6892f12243b6095e73b1 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 29 Aug 2019 13:09:42 +0200 Subject: [PATCH 038/158] Bump version nr --- resources/intent/smooth.inst.cfg | 2 +- resources/intent/strong.inst.cfg | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/intent/smooth.inst.cfg b/resources/intent/smooth.inst.cfg index cfaa18c2bf..2ec33da504 100644 --- a/resources/intent/smooth.inst.cfg +++ b/resources/intent/smooth.inst.cfg @@ -4,7 +4,7 @@ name = Smooth (TEST INTENT) definition = ultimaker3 [metadata] -setting_version = 8 +setting_version = 9 type = intent intent_category = smooth quality_type = draft diff --git a/resources/intent/strong.inst.cfg b/resources/intent/strong.inst.cfg index e90b73d7d8..d0354070a0 100644 --- a/resources/intent/strong.inst.cfg +++ b/resources/intent/strong.inst.cfg @@ -4,7 +4,7 @@ name = Strong (TEST INTENT) definition = ultimaker3 [metadata] -setting_version = 8 +setting_version = 9 type = intent intent_category = engineering quality_type = draft From 6274a58158bea8059bfb3c5de425a07a556423f6 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 29 Aug 2019 13:23:19 +0200 Subject: [PATCH 039/158] Add plug-in to read PLY files Seems to work fine. Contributes to issue CURA-6739. --- plugins/PLYReader/PLYReader.py | 76 ++++++++++++++++++++++++++++++++++ plugins/PLYReader/__init__.py | 21 ++++++++++ plugins/PLYReader/plugin.json | 7 ++++ 3 files changed, 104 insertions(+) create mode 100644 plugins/PLYReader/PLYReader.py create mode 100644 plugins/PLYReader/__init__.py create mode 100644 plugins/PLYReader/plugin.json diff --git a/plugins/PLYReader/PLYReader.py b/plugins/PLYReader/PLYReader.py new file mode 100644 index 0000000000..6f3abfd59d --- /dev/null +++ b/plugins/PLYReader/PLYReader.py @@ -0,0 +1,76 @@ +# Copyright (c) 2019 Ultimaker B.V., fieldOfView +# Cura is released under the terms of the LGPLv3 or higher. + +# The _toMeshData function is taken from the AMFReader class which was built by fieldOfView. + +import numpy # To create the mesh data. +import os.path # To create the mesh name for the resulting mesh. +import trimesh # To load the PLY files into a Trimesh. + +from UM.Mesh.MeshData import MeshData, calculateNormalsFromIndexedVertices +from UM.Mesh.MeshReader import MeshReader +from UM.MimeTypeDatabase import MimeTypeDatabase, MimeType + +from cura.CuraApplication import CuraApplication +from cura.Scene.BuildPlateDecorator import BuildPlateDecorator +from cura.Scene.CuraSceneNode import CuraSceneNode +from cura.Scene.SliceableObjectDecorator import SliceableObjectDecorator + +## Class that leverages Trimesh to read PLY files (Stanford Triangle Format). +class PLYReader(MeshReader): + def __init__(self) -> None: + super().__init__() + + self._supported_extensions = [".ply"] + MimeTypeDatabase.addMimeType( + MimeType( + name = "application/x-ply", # Wikipedia lists the MIME type as "text/plain" but that won't do as it's not unique to PLY files. + comment = "Stanford Triangle Format", + suffixes = ["ply"] + ) + ) + + ## Reads the PLY file. + # \param file_name The file path of the PLY file. This is assumed to be a + # PLY file; it's not checked again. + # \return A scene node that contains the PLY file's contents. + def _read(self, file_name: str) -> CuraSceneNode: + mesh = trimesh.load(file_name) + mesh.merge_vertices() + mesh.remove_unreferenced_vertices() + mesh.fix_normals() + mesh_data = self._toMeshData(mesh) + + file_base_name = os.path.basename(file_name) + new_node = CuraSceneNode() + new_node.setMeshData(mesh_data) + new_node.setSelectable(True) + new_node.setName(file_base_name) + new_node.addDecorator(BuildPlateDecorator(CuraApplication.getInstance().getMultiBuildPlateModel().activeBuildPlate)) + new_node.addDecorator(SliceableObjectDecorator()) + return new_node + + def _toMeshData(self, tri_node: trimesh.base.Trimesh) -> MeshData: + tri_faces = tri_node.faces + tri_vertices = tri_node.vertices + + indices = [] + vertices = [] + + index_count = 0 + face_count = 0 + for tri_face in tri_faces: + face = [] + for tri_index in tri_face: + vertices.append(tri_vertices[tri_index]) + face.append(index_count) + index_count += 1 + indices.append(face) + face_count += 1 + + vertices = numpy.asarray(vertices, dtype = numpy.float32) + indices = numpy.asarray(indices, dtype = numpy.int32) + normals = calculateNormalsFromIndexedVertices(vertices, indices, face_count) + + mesh_data = MeshData(vertices = vertices, indices = indices, normals = normals) + return mesh_data \ No newline at end of file diff --git a/plugins/PLYReader/__init__.py b/plugins/PLYReader/__init__.py new file mode 100644 index 0000000000..05a6c8004d --- /dev/null +++ b/plugins/PLYReader/__init__.py @@ -0,0 +1,21 @@ +# Copyright (c) 2019 Ultimaker +# Cura is released under the terms of the LGPLv3 or higher. + +from . import PLYReader + +from UM.i18n import i18nCatalog +i18n_catalog = i18nCatalog("uranium") + + +def getMetaData(): + return { + "mesh_reader": [ + { + "extension": "ply", + "description": i18n_catalog.i18nc("@item:inlistbox", "PLY File") + } + ] + } + +def register(app): + return {"mesh_reader": PLYReader.PLYReader()} diff --git a/plugins/PLYReader/plugin.json b/plugins/PLYReader/plugin.json new file mode 100644 index 0000000000..b295b08780 --- /dev/null +++ b/plugins/PLYReader/plugin.json @@ -0,0 +1,7 @@ +{ + "name": "PLY Reader", + "author": "Ultimaker B.V.", + "version": "1.0.0", + "description": "Provides support for reading PLY files.", + "api": "6.0.0" +} From a8b818fbdc14d8205e8d91f6236f1361746f37ee Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 29 Aug 2019 13:52:01 +0200 Subject: [PATCH 040/158] Ensure that right intents are added to the tree CURA-6598 --- cura/Machines/IntentNode.py | 5 ++++- cura/Machines/QualityNode.py | 6 +++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/cura/Machines/IntentNode.py b/cura/Machines/IntentNode.py index 232498536c..521e7f2e38 100644 --- a/cura/Machines/IntentNode.py +++ b/cura/Machines/IntentNode.py @@ -3,6 +3,7 @@ from typing import TYPE_CHECKING +from UM.Settings.ContainerRegistry import ContainerRegistry from cura.Machines.ContainerNode import ContainerNode if TYPE_CHECKING: @@ -14,4 +15,6 @@ if TYPE_CHECKING: class IntentNode(ContainerNode): def __init__(self, container_id: str, quality: "QualityNode") -> None: super().__init__(container_id) - self.quality = quality \ No newline at end of file + self.quality = quality + my_metadata = ContainerRegistry.getInstance().findContainersMetadata(id=container_id)[0] + self.intent_category = my_metadata.get("intent_category", "default") \ No newline at end of file diff --git a/cura/Machines/QualityNode.py b/cura/Machines/QualityNode.py index 451c8babfb..7980f4ed63 100644 --- a/cura/Machines/QualityNode.py +++ b/cura/Machines/QualityNode.py @@ -31,8 +31,8 @@ class QualityNode(ContainerNode): # Find all intent profiles that fit the current configuration. from cura.Machines.MachineNode import MachineNode if not isinstance(self.parent, MachineNode): # Not a global profile. - for intent in container_registry.findInstanceContainersMetadata(type = "intent", definition = self.parent.variant.machine.quality_definition, variant = self.parent.variant.variant_name, material = self.parent.base_file): + for intent in container_registry.findInstanceContainersMetadata(type = "intent", definition = self.parent.variant.machine.quality_definition, variant = self.parent.variant.variant_name, material = self.parent.base_file, quality_type = self.quality_type): self.intents[intent["id"]] = IntentNode(intent["id"], quality = self) - if not self.intents: - self.intents["empty_intent"] = IntentNode("empty_intent", quality = self) + + self.intents["empty_intent"] = IntentNode("empty_intent", quality = self) # Otherwise, there are no intents for global profiles. \ No newline at end of file From ba0c16d96851580f556a4bf2ee030c56626af3c4 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 29 Aug 2019 13:53:23 +0200 Subject: [PATCH 041/158] Update intents model to use container tree CURA-6598 --- cura/Machines/Models/IntentModel.py | 30 ++++++++++++++-------- resources/qml/Settings/SettingComboBox.qml | 2 +- 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/cura/Machines/Models/IntentModel.py b/cura/Machines/Models/IntentModel.py index 666786e26a..5b4ce10878 100644 --- a/cura/Machines/Models/IntentModel.py +++ b/cura/Machines/Models/IntentModel.py @@ -10,6 +10,7 @@ from UM.Settings.ContainerRegistry import ContainerRegistry from UM.Settings.SettingFunction import SettingFunction from cura.Machines.ContainerTree import ContainerTree +from cura.Settings.ExtruderManager import ExtruderManager from cura.Settings.IntentManager import IntentManager import cura.CuraApplication @@ -61,18 +62,27 @@ class IntentModel(ListModel): return quality_groups = ContainerTree.getInstance().getCurrentQualityGroups() + container_tree = ContainerTree.getInstance() + machine_node = container_tree.machines[global_stack.definition.getId()] + active_extruder = ExtruderManager.getInstance().getActiveExtruderStack() + active_variant_name = active_extruder.variant.getMetaDataEntry("name") + active_variant_node = machine_node.variants[active_variant_name] + active_material_node = active_variant_node.materials[active_extruder.material.getMetaDataEntry("base_file")] layer_heights_added = [] - for quality_tuple, quality_group in quality_groups.items(): - # Add the intents that are of the correct category - if quality_tuple[0] == self._intent_category: - layer_height = self._fetchLayerHeight(quality_group) - new_items.append({"name": quality_group.name, - "quality_type": quality_tuple[1], - "layer_height": layer_height, - "available": quality_group.is_available, - "intent_category": self._intent_category - }) + for quality_id, quality_node in active_material_node.qualities.items(): + quality_group = quality_groups[quality_node.quality_type] + layer_height = self._fetchLayerHeight(quality_group) + + for intent_id, intent_node in quality_node.intents.items(): + if intent_node.intent_category != self._intent_category: + continue layer_heights_added.append(layer_height) + new_items.append({"name": quality_group.name, + "quality_type": quality_group.quality_type, + "layer_height": layer_height, + "available": quality_group.is_available, + "intent_category": self._intent_category + }) # Now that we added all intents that we found something for, ensure that we set add ticks (and layer_heights) # for all groups that we don't have anything for (and set it to not available) diff --git a/resources/qml/Settings/SettingComboBox.qml b/resources/qml/Settings/SettingComboBox.qml index 1814d997b3..cbabb3ffd4 100644 --- a/resources/qml/Settings/SettingComboBox.qml +++ b/resources/qml/Settings/SettingComboBox.qml @@ -20,7 +20,7 @@ SettingItem textRole: "value" anchors.fill: parent - + onActivated: { forceActiveFocus() From de1065f0a3a732004b0a0441d1ddd32a50087688 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 29 Aug 2019 14:04:05 +0200 Subject: [PATCH 042/158] Prevent crash if extruder is not yet set CURA-6598 --- cura/Machines/Models/IntentModel.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cura/Machines/Models/IntentModel.py b/cura/Machines/Models/IntentModel.py index 5b4ce10878..e76c73cde1 100644 --- a/cura/Machines/Models/IntentModel.py +++ b/cura/Machines/Models/IntentModel.py @@ -65,6 +65,8 @@ class IntentModel(ListModel): container_tree = ContainerTree.getInstance() machine_node = container_tree.machines[global_stack.definition.getId()] active_extruder = ExtruderManager.getInstance().getActiveExtruderStack() + if not active_extruder: + return active_variant_name = active_extruder.variant.getMetaDataEntry("name") active_variant_node = machine_node.variants[active_variant_name] active_material_node = active_variant_node.materials[active_extruder.material.getMetaDataEntry("base_file")] From 6c84f0dbb677c8f452468106fade364f90b0eba2 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 29 Aug 2019 14:11:56 +0200 Subject: [PATCH 043/158] Rename PLYReader to TrimeshReader We're going to repurpose this plug-in to read other file formats as well. Currently it still only registers itself as PLY file reader. But I'm about to change that. Contributes to issue CURA-6739. --- plugins/PLYReader/plugin.json | 7 ----- .../TrimeshReader.py} | 31 +++++++++++-------- .../{PLYReader => TrimeshReader}/__init__.py | 4 +-- plugins/TrimeshReader/plugin.json | 7 +++++ 4 files changed, 27 insertions(+), 22 deletions(-) delete mode 100644 plugins/PLYReader/plugin.json rename plugins/{PLYReader/PLYReader.py => TrimeshReader/TrimeshReader.py} (68%) rename plugins/{PLYReader => TrimeshReader}/__init__.py (82%) create mode 100644 plugins/TrimeshReader/plugin.json diff --git a/plugins/PLYReader/plugin.json b/plugins/PLYReader/plugin.json deleted file mode 100644 index b295b08780..0000000000 --- a/plugins/PLYReader/plugin.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "name": "PLY Reader", - "author": "Ultimaker B.V.", - "version": "1.0.0", - "description": "Provides support for reading PLY files.", - "api": "6.0.0" -} diff --git a/plugins/PLYReader/PLYReader.py b/plugins/TrimeshReader/TrimeshReader.py similarity index 68% rename from plugins/PLYReader/PLYReader.py rename to plugins/TrimeshReader/TrimeshReader.py index 6f3abfd59d..f59bc70362 100644 --- a/plugins/PLYReader/PLYReader.py +++ b/plugins/TrimeshReader/TrimeshReader.py @@ -5,19 +5,19 @@ import numpy # To create the mesh data. import os.path # To create the mesh name for the resulting mesh. -import trimesh # To load the PLY files into a Trimesh. +import trimesh # To load the files into a Trimesh. -from UM.Mesh.MeshData import MeshData, calculateNormalsFromIndexedVertices -from UM.Mesh.MeshReader import MeshReader -from UM.MimeTypeDatabase import MimeTypeDatabase, MimeType +from UM.Mesh.MeshData import MeshData, calculateNormalsFromIndexedVertices # To construct meshes from the Trimesh data. +from UM.Mesh.MeshReader import MeshReader # The plug-in type we're extending. +from UM.MimeTypeDatabase import MimeTypeDatabase, MimeType # To add file types that we can open. from cura.CuraApplication import CuraApplication -from cura.Scene.BuildPlateDecorator import BuildPlateDecorator -from cura.Scene.CuraSceneNode import CuraSceneNode -from cura.Scene.SliceableObjectDecorator import SliceableObjectDecorator +from cura.Scene.BuildPlateDecorator import BuildPlateDecorator # Added to the resulting scene node. +from cura.Scene.CuraSceneNode import CuraSceneNode # To create a node in the scene after reading the file. +from cura.Scene.SliceableObjectDecorator import SliceableObjectDecorator # Added to the resulting scene node. -## Class that leverages Trimesh to read PLY files (Stanford Triangle Format). -class PLYReader(MeshReader): +## Class that leverages Trimesh to import files. +class Trimesh(MeshReader): def __init__(self) -> None: super().__init__() @@ -30,10 +30,10 @@ class PLYReader(MeshReader): ) ) - ## Reads the PLY file. - # \param file_name The file path of the PLY file. This is assumed to be a - # PLY file; it's not checked again. - # \return A scene node that contains the PLY file's contents. + ## Reads a file using Trimesh. + # \param file_name The file path. This is assumed to be one of the file + # types that Trimesh can read. It will not be checked again. + # \return A scene node that contains the file's contents. def _read(self, file_name: str) -> CuraSceneNode: mesh = trimesh.load(file_name) mesh.merge_vertices() @@ -50,6 +50,11 @@ class PLYReader(MeshReader): new_node.addDecorator(SliceableObjectDecorator()) return new_node + ## Converts a Trimesh to Uranium's MeshData. + # \param tri_node A Trimesh containing the contents of a file that was + # just read. + # \return Mesh data from the Trimesh in a way that Uranium can understand + # it. def _toMeshData(self, tri_node: trimesh.base.Trimesh) -> MeshData: tri_faces = tri_node.faces tri_vertices = tri_node.vertices diff --git a/plugins/PLYReader/__init__.py b/plugins/TrimeshReader/__init__.py similarity index 82% rename from plugins/PLYReader/__init__.py rename to plugins/TrimeshReader/__init__.py index 05a6c8004d..f24448f15e 100644 --- a/plugins/PLYReader/__init__.py +++ b/plugins/TrimeshReader/__init__.py @@ -1,7 +1,7 @@ # Copyright (c) 2019 Ultimaker # Cura is released under the terms of the LGPLv3 or higher. -from . import PLYReader +from . import TrimeshReader from UM.i18n import i18nCatalog i18n_catalog = i18nCatalog("uranium") @@ -18,4 +18,4 @@ def getMetaData(): } def register(app): - return {"mesh_reader": PLYReader.PLYReader()} + return {"mesh_reader": TrimeshReader.TrimeshReader()} diff --git a/plugins/TrimeshReader/plugin.json b/plugins/TrimeshReader/plugin.json new file mode 100644 index 0000000000..61c66aa5e8 --- /dev/null +++ b/plugins/TrimeshReader/plugin.json @@ -0,0 +1,7 @@ +{ + "name": "Trimesh Reader", + "author": "Ultimaker B.V.", + "version": "1.0.0", + "description": "Provides support for reading model files.", + "api": "6.0.0" +} From 68d3cf841296be622deb4e7ac87a6d888fff9c92 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 29 Aug 2019 14:12:17 +0200 Subject: [PATCH 044/158] Fix binding loop in LabelBar CURA-6598 --- resources/qml/LabelBar.qml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/resources/qml/LabelBar.qml b/resources/qml/LabelBar.qml index 6edfb3866c..f6e655de79 100644 --- a/resources/qml/LabelBar.qml +++ b/resources/qml/LabelBar.qml @@ -17,7 +17,7 @@ Item { anchors.left: parent.left anchors.right: parent.right - height: childrenRect.height + height: label.height spacing: 0 Repeater { @@ -27,9 +27,8 @@ Item Item { Layout.fillWidth: true - Layout.fillHeight: true Layout.maximumWidth: index + 1 === repeater.count || repeater.count <= 1 ? itemSize : base.width / (repeater.count - 1) - height: childrenRect.height + height: label.height Label { id: label From cead90c5bacdb519c93b020fb1cce13d64706042 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 29 Aug 2019 14:15:34 +0200 Subject: [PATCH 045/158] Fix class name Oops. Contributes to issue CURA-6739. --- plugins/TrimeshReader/TrimeshReader.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/TrimeshReader/TrimeshReader.py b/plugins/TrimeshReader/TrimeshReader.py index f59bc70362..d719e3dbc8 100644 --- a/plugins/TrimeshReader/TrimeshReader.py +++ b/plugins/TrimeshReader/TrimeshReader.py @@ -17,7 +17,7 @@ from cura.Scene.CuraSceneNode import CuraSceneNode # To create a node in the sc from cura.Scene.SliceableObjectDecorator import SliceableObjectDecorator # Added to the resulting scene node. ## Class that leverages Trimesh to import files. -class Trimesh(MeshReader): +class TrimeshReader(MeshReader): def __init__(self) -> None: super().__init__() From 1f534db50838b311d2ea6eff880df90634027c08 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 29 Aug 2019 14:56:49 +0200 Subject: [PATCH 046/158] Handle Trimesh returning scene of objects These objects are added as a group node, if they are plural. Contributes to issue CURA-6739. --- plugins/TrimeshReader/TrimeshReader.py | 56 +++++++++++++++++++------- 1 file changed, 42 insertions(+), 14 deletions(-) diff --git a/plugins/TrimeshReader/TrimeshReader.py b/plugins/TrimeshReader/TrimeshReader.py index d719e3dbc8..f0fd9bc023 100644 --- a/plugins/TrimeshReader/TrimeshReader.py +++ b/plugins/TrimeshReader/TrimeshReader.py @@ -3,6 +3,7 @@ # The _toMeshData function is taken from the AMFReader class which was built by fieldOfView. +from typing import List, Union, TYPE_CHECKING import numpy # To create the mesh data. import os.path # To create the mesh name for the resulting mesh. import trimesh # To load the files into a Trimesh. @@ -10,12 +11,17 @@ import trimesh # To load the files into a Trimesh. from UM.Mesh.MeshData import MeshData, calculateNormalsFromIndexedVertices # To construct meshes from the Trimesh data. from UM.Mesh.MeshReader import MeshReader # The plug-in type we're extending. from UM.MimeTypeDatabase import MimeTypeDatabase, MimeType # To add file types that we can open. +from UM.Scene.GroupDecorator import GroupDecorator # Added to the parent node if we load multiple nodes at once. from cura.CuraApplication import CuraApplication from cura.Scene.BuildPlateDecorator import BuildPlateDecorator # Added to the resulting scene node. +from cura.Scene.ConvexHullDecorator import ConvexHullDecorator # Added to group nodes if we load multiple nodes at once. from cura.Scene.CuraSceneNode import CuraSceneNode # To create a node in the scene after reading the file. from cura.Scene.SliceableObjectDecorator import SliceableObjectDecorator # Added to the resulting scene node. +if TYPE_CHECKING: + from UM.Scene.SceneNode import SceneNode + ## Class that leverages Trimesh to import files. class TrimeshReader(MeshReader): def __init__(self) -> None: @@ -34,21 +40,43 @@ class TrimeshReader(MeshReader): # \param file_name The file path. This is assumed to be one of the file # types that Trimesh can read. It will not be checked again. # \return A scene node that contains the file's contents. - def _read(self, file_name: str) -> CuraSceneNode: - mesh = trimesh.load(file_name) - mesh.merge_vertices() - mesh.remove_unreferenced_vertices() - mesh.fix_normals() - mesh_data = self._toMeshData(mesh) + def _read(self, file_name: str) -> Union["SceneNode", List["SceneNode"]]: + mesh_or_scene = trimesh.load(file_name) + meshes = [] + if isinstance(mesh_or_scene, trimesh.Trimesh): + meshes = [mesh_or_scene] + elif isinstance(mesh_or_scene, trimesh.Scene): + meshes = [mesh for mesh in mesh_or_scene.geometry.values()] - file_base_name = os.path.basename(file_name) - new_node = CuraSceneNode() - new_node.setMeshData(mesh_data) - new_node.setSelectable(True) - new_node.setName(file_base_name) - new_node.addDecorator(BuildPlateDecorator(CuraApplication.getInstance().getMultiBuildPlateModel().activeBuildPlate)) - new_node.addDecorator(SliceableObjectDecorator()) - return new_node + active_build_plate = CuraApplication.getInstance().getMultiBuildPlateModel().activeBuildPlate + nodes = [] + for mesh in meshes: + if not isinstance(mesh, trimesh.Trimesh): # Trimesh can also receive point clouds, 2D paths, 3D paths or metadata. Skip those. + continue + mesh.merge_vertices() + mesh.remove_unreferenced_vertices() + mesh.fix_normals() + mesh_data = self._toMeshData(mesh) + + file_base_name = os.path.basename(file_name) + new_node = CuraSceneNode() + new_node.setMeshData(mesh_data) + new_node.setSelectable(True) + new_node.setName(file_base_name if len(meshes) == 1 else "{file_base_name} {counter}".format(file_base_name = file_base_name, counter = str(len(nodes) + 1))) + new_node.addDecorator(BuildPlateDecorator(active_build_plate)) + new_node.addDecorator(SliceableObjectDecorator()) + nodes.append(new_node) + + if len(nodes) == 1: + return nodes[0] + # Add all nodes to a group so they stay together. + group_node = CuraSceneNode() + group_node.addDecorator(GroupDecorator()) + group_node.addDecorator(ConvexHullDecorator()) + group_node.addDecorator(BuildPlateDecorator(active_build_plate)) + for node in nodes: + node.setParent(group_node) + return group_node ## Converts a Trimesh to Uranium's MeshData. # \param tri_node A Trimesh containing the contents of a file that was From 3a3ba6d590c6392c4f943e1cebfc805954bf80ab Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 29 Aug 2019 14:58:21 +0200 Subject: [PATCH 047/158] Add support for .DAE files Contributes to issue CURA-6739. --- plugins/TrimeshReader/TrimeshReader.py | 9 ++++++++- plugins/TrimeshReader/__init__.py | 6 +++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/plugins/TrimeshReader/TrimeshReader.py b/plugins/TrimeshReader/TrimeshReader.py index f0fd9bc023..65ece039fe 100644 --- a/plugins/TrimeshReader/TrimeshReader.py +++ b/plugins/TrimeshReader/TrimeshReader.py @@ -27,7 +27,14 @@ class TrimeshReader(MeshReader): def __init__(self) -> None: super().__init__() - self._supported_extensions = [".ply"] + self._supported_extensions = [".dae", ".ply"] + MimeTypeDatabase.addMimeType( + MimeType( + name = "model/vnd.collada+xml", + comment = "COLLADA Digital Asset Exchange", + suffixes = ["dae"] + ) + ) MimeTypeDatabase.addMimeType( MimeType( name = "application/x-ply", # Wikipedia lists the MIME type as "text/plain" but that won't do as it's not unique to PLY files. diff --git a/plugins/TrimeshReader/__init__.py b/plugins/TrimeshReader/__init__.py index f24448f15e..debcc632ec 100644 --- a/plugins/TrimeshReader/__init__.py +++ b/plugins/TrimeshReader/__init__.py @@ -10,9 +10,13 @@ i18n_catalog = i18nCatalog("uranium") def getMetaData(): return { "mesh_reader": [ + { + "extension": "dae", + "description": i18n_catalog.i18nc("@item:inlistbox", "COLLADA Digital Asset Exchange") + }, { "extension": "ply", - "description": i18n_catalog.i18nc("@item:inlistbox", "PLY File") + "description": i18n_catalog.i18nc("@item:inlistbox", "Stanford Triangle Format") } ] } From e761b2c2a76b4215334d19921e8e648797a30f5f Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 29 Aug 2019 15:14:35 +0200 Subject: [PATCH 048/158] Add support for reading glTF files Contributes to issue CURA-6739. --- plugins/TrimeshReader/TrimeshReader.py | 16 +++++++++++++++- plugins/TrimeshReader/__init__.py | 8 ++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/plugins/TrimeshReader/TrimeshReader.py b/plugins/TrimeshReader/TrimeshReader.py index 65ece039fe..779b0fddf4 100644 --- a/plugins/TrimeshReader/TrimeshReader.py +++ b/plugins/TrimeshReader/TrimeshReader.py @@ -27,7 +27,7 @@ class TrimeshReader(MeshReader): def __init__(self) -> None: super().__init__() - self._supported_extensions = [".dae", ".ply"] + self._supported_extensions = [".dae", ".gltf", ".glb", ".ply"] MimeTypeDatabase.addMimeType( MimeType( name = "model/vnd.collada+xml", @@ -35,6 +35,20 @@ class TrimeshReader(MeshReader): suffixes = ["dae"] ) ) + MimeTypeDatabase.addMimeType( + MimeType( + name = "model/gltf-binary", + comment = "glTF Binary", + suffixes = ["glb"] + ) + ) + MimeTypeDatabase.addMimeType( + MimeType( + name = "model/gltf+json", + comment = "glTF Embedded JSON", + suffixes = ["gltf"] + ) + ) MimeTypeDatabase.addMimeType( MimeType( name = "application/x-ply", # Wikipedia lists the MIME type as "text/plain" but that won't do as it's not unique to PLY files. diff --git a/plugins/TrimeshReader/__init__.py b/plugins/TrimeshReader/__init__.py index debcc632ec..0b1ef72be2 100644 --- a/plugins/TrimeshReader/__init__.py +++ b/plugins/TrimeshReader/__init__.py @@ -14,6 +14,14 @@ def getMetaData(): "extension": "dae", "description": i18n_catalog.i18nc("@item:inlistbox", "COLLADA Digital Asset Exchange") }, + { + "extension": "glb", + "description": i18n_catalog.i18nc("@item:inlistbox", "glTF Binary") + }, + { + "extension": "gltf", + "description": i18n_catalog.i18nc("@item:inlistbox", "glTF Embedded JSON") + }, { "extension": "ply", "description": i18n_catalog.i18nc("@item:inlistbox", "Stanford Triangle Format") From c80cd9679ff8ad6680d7f6387aa0072ec37527d2 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 29 Aug 2019 15:15:35 +0200 Subject: [PATCH 049/158] Fix RadioCheckbars layout getting out of wack sometimes CURA-6598 --- .../Recommended/RecommendedQualityProfileSelector.qml | 7 ++++++- resources/qml/RadioCheckbar.qml | 3 ++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelector.qml b/resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelector.qml index 9194f3c85c..2742605399 100644 --- a/resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelector.qml +++ b/resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelector.qml @@ -78,7 +78,7 @@ Item left: parent.left right: parent.right } - height: childrenRect.height + height: intentCategoryLabel.height Label { @@ -110,6 +110,11 @@ Item // When user created profile is active, no quality tickbox should be active. return false } + + if(modelItem === null) + { + return false + } return Cura.MachineManager.activeQualityType == modelItem.quality_type && Cura.MachineManager.activeIntentCategory == modelItem.intent_category } diff --git a/resources/qml/RadioCheckbar.qml b/resources/qml/RadioCheckbar.qml index 1bc1c135f6..4f959fc8fd 100644 --- a/resources/qml/RadioCheckbar.qml +++ b/resources/qml/RadioCheckbar.qml @@ -57,10 +57,11 @@ Item Item { Layout.fillWidth: true + Layout.fillHeight: true // The last item of the repeater needs to be shorter, as we don't need another part to fit // the horizontal bar. The others should essentially not be limited. Layout.maximumWidth: index + 1 === repeater.count ? activeComponent.width: 200000000 - height: activeComponent.height + property bool isEnabled: model.available // The horizontal bar between the checkable options. // Note that the horizontal bar points towards the previous item. From 41c5b87eaed328b2bde563bc1e46df9de1af252a Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 29 Aug 2019 15:34:06 +0200 Subject: [PATCH 050/158] Document Trimesh not reading OFF files Contributes to issue CURA-6739. --- plugins/TrimeshReader/TrimeshReader.py | 8 ++++++++ plugins/TrimeshReader/__init__.py | 5 +++++ 2 files changed, 13 insertions(+) diff --git a/plugins/TrimeshReader/TrimeshReader.py b/plugins/TrimeshReader/TrimeshReader.py index 779b0fddf4..c22d98872f 100644 --- a/plugins/TrimeshReader/TrimeshReader.py +++ b/plugins/TrimeshReader/TrimeshReader.py @@ -49,6 +49,14 @@ class TrimeshReader(MeshReader): suffixes = ["gltf"] ) ) + # Trimesh seems to have a bug when reading .off files. + #MimeTypeDatabase.addMimeType( + # MimeType( + # name = "application/x-off", + # comment = "Geomview Object File Format", + # suffixes = ["off"] + # ) + #) MimeTypeDatabase.addMimeType( MimeType( name = "application/x-ply", # Wikipedia lists the MIME type as "text/plain" but that won't do as it's not unique to PLY files. diff --git a/plugins/TrimeshReader/__init__.py b/plugins/TrimeshReader/__init__.py index 0b1ef72be2..8e6d95983f 100644 --- a/plugins/TrimeshReader/__init__.py +++ b/plugins/TrimeshReader/__init__.py @@ -22,6 +22,11 @@ def getMetaData(): "extension": "gltf", "description": i18n_catalog.i18nc("@item:inlistbox", "glTF Embedded JSON") }, + # Trimesh seems to have a bug when reading OFF files. + #{ + # "extension": "off", + # "description": i18n_catalog.i18nc("@item:inlistbox", "Geomview Object File Format") + #}, { "extension": "ply", "description": i18n_catalog.i18nc("@item:inlistbox", "Stanford Triangle Format") From 714e6f191d4625d1f7ae039ee90044ba790b4e0d Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 29 Aug 2019 15:40:49 +0200 Subject: [PATCH 051/158] Add support for OpenCTM Contributes to issue CURA-6739. --- plugins/TrimeshReader/TrimeshReader.py | 9 ++++++++- plugins/TrimeshReader/__init__.py | 4 ++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/plugins/TrimeshReader/TrimeshReader.py b/plugins/TrimeshReader/TrimeshReader.py index c22d98872f..5dbbfb16de 100644 --- a/plugins/TrimeshReader/TrimeshReader.py +++ b/plugins/TrimeshReader/TrimeshReader.py @@ -27,7 +27,14 @@ class TrimeshReader(MeshReader): def __init__(self) -> None: super().__init__() - self._supported_extensions = [".dae", ".gltf", ".glb", ".ply"] + self._supported_extensions = [".ctm", ".dae", ".gltf", ".glb", ".ply"] + MimeTypeDatabase.addMimeType( + MimeType( + name = "application/x-ctm", + comment = "Open Compressed Triangle Mesh", + suffixes = ["ctm"] + ) + ) MimeTypeDatabase.addMimeType( MimeType( name = "model/vnd.collada+xml", diff --git a/plugins/TrimeshReader/__init__.py b/plugins/TrimeshReader/__init__.py index 8e6d95983f..06962fa29f 100644 --- a/plugins/TrimeshReader/__init__.py +++ b/plugins/TrimeshReader/__init__.py @@ -10,6 +10,10 @@ i18n_catalog = i18nCatalog("uranium") def getMetaData(): return { "mesh_reader": [ + { + "extension": "ctm", + "description": i18n_catalog.i18nc("@item:inlistbox", "Open Compressed Triangle Mesh") + }, { "extension": "dae", "description": i18n_catalog.i18nc("@item:inlistbox", "COLLADA Digital Asset Exchange") From 04997fca7fc2eafc22f9646f96351df0f5d919de Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 29 Aug 2019 15:52:02 +0200 Subject: [PATCH 052/158] Add property for active intent category CURA-6598 --- cura/Settings/MachineManager.py | 10 ++++++++++ cura/Settings/cura_empty_instance_containers.py | 1 + 2 files changed, 11 insertions(+) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index e0293c200f..7e25cd5d57 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -132,6 +132,7 @@ class MachineManager(QObject): activeMaterialChanged = pyqtSignal() activeVariantChanged = pyqtSignal() activeQualityChanged = pyqtSignal() + activeIntentChanged = pyqtSignal() activeStackChanged = pyqtSignal() # Emitted whenever the active stack is changed (ie: when changing between extruders, changing a profile, but not when changing a value) extruderChanged = pyqtSignal() @@ -270,6 +271,7 @@ class MachineManager(QObject): self.activeQualityChanged.emit() self.activeVariantChanged.emit() self.activeMaterialChanged.emit() + self.activeIntentChanged.emit() self.rootMaterialChanged.emit() self.numberExtrudersEnabledChanged.emit() @@ -607,6 +609,14 @@ class MachineManager(QObject): return False return Util.parseBool(global_container_stack.quality.getMetaDataEntry("is_experimental", False)) + @pyqtProperty(str, notify=activeIntentChanged) + def activeIntentCategory(self): + + if not self._active_container_stack: + return "" + intent_category = self._active_container_stack.intent.getMetaDataEntry("intent_category") + return intent_category + ## Returns whether there is anything unsupported in the current set-up. # # The current set-up signifies the global stack and all extruder stacks, diff --git a/cura/Settings/cura_empty_instance_containers.py b/cura/Settings/cura_empty_instance_containers.py index e8a6df8ff1..0ab37c5435 100644 --- a/cura/Settings/cura_empty_instance_containers.py +++ b/cura/Settings/cura_empty_instance_containers.py @@ -47,6 +47,7 @@ EMPTY_INTENT_CONTAINER_ID = "empty_intent" empty_intent_container = copy.deepcopy(empty_container) empty_intent_container.setMetaDataEntry("id", EMPTY_INTENT_CONTAINER_ID) empty_intent_container.setMetaDataEntry("type", "intent") +empty_intent_container.setMetaDataEntry("intent_category", "default") empty_intent_container.setName(catalog.i18nc("@info:No intent profile selected", "Default")) From bac77c0609871b6ad723a78826bb6937debf4c30 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 29 Aug 2019 15:52:34 +0200 Subject: [PATCH 053/158] Add support for ZAE files Contributes to issue CURA-6739. --- plugins/TrimeshReader/TrimeshReader.py | 9 ++++++++- plugins/TrimeshReader/__init__.py | 4 ++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/plugins/TrimeshReader/TrimeshReader.py b/plugins/TrimeshReader/TrimeshReader.py index 5dbbfb16de..d1e4b73962 100644 --- a/plugins/TrimeshReader/TrimeshReader.py +++ b/plugins/TrimeshReader/TrimeshReader.py @@ -27,7 +27,7 @@ class TrimeshReader(MeshReader): def __init__(self) -> None: super().__init__() - self._supported_extensions = [".ctm", ".dae", ".gltf", ".glb", ".ply"] + self._supported_extensions = [".ctm", ".dae", ".gltf", ".glb", ".ply", ".zae"] MimeTypeDatabase.addMimeType( MimeType( name = "application/x-ctm", @@ -71,6 +71,13 @@ class TrimeshReader(MeshReader): suffixes = ["ply"] ) ) + MimeTypeDatabase.addMimeType( + MimeType( + name = "model/vnd.collada+xml+zip", + comment = "Compressed COLLADA Digital Asset Exchange", + suffixes = ["zae"] + ) + ) ## Reads a file using Trimesh. # \param file_name The file path. This is assumed to be one of the file diff --git a/plugins/TrimeshReader/__init__.py b/plugins/TrimeshReader/__init__.py index 06962fa29f..5e2885238f 100644 --- a/plugins/TrimeshReader/__init__.py +++ b/plugins/TrimeshReader/__init__.py @@ -34,6 +34,10 @@ def getMetaData(): { "extension": "ply", "description": i18n_catalog.i18nc("@item:inlistbox", "Stanford Triangle Format") + }, + { + "extension": "zae", + "description": i18n_catalog.i18nc("@item:inlistbox", "Compressed COLLADA Digital Asset Exchange") } ] } From 5f94657d2ce3b49eb64f667fe58f767ab66cc1f9 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 29 Aug 2019 16:07:14 +0200 Subject: [PATCH 054/158] Update MIME types with new file formats from Trimesh Contributes to issue CURA-6739. --- cura.desktop.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura.desktop.in b/cura.desktop.in index b0195015a5..2502327203 100644 --- a/cura.desktop.in +++ b/cura.desktop.in @@ -13,6 +13,6 @@ TryExec=@CMAKE_INSTALL_FULL_BINDIR@/cura Icon=cura-icon Terminal=false Type=Application -MimeType=model/stl;application/vnd.ms-3mfdocument;application/prs.wavefront-obj;image/bmp;image/gif;image/jpeg;image/png;model/x3d+xml;text/x-gcode; +MimeType=model/stl;application/vnd.ms-3mfdocument;application/prs.wavefront-obj;image/bmp;image/gif;image/jpeg;image/png;text/x-gcode;application/x-amf;application/x-ply;application/x-ctm;model/vnd.collada+xml;model/gltf-binary;model/gltf+json;model/vnd.collada+xml+zip; Categories=Graphics; Keywords=3D;Printing;Slicer; From b734d34af3e548ffdf86deb49f5bfd9bf1b56c38 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 29 Aug 2019 16:22:18 +0200 Subject: [PATCH 055/158] Add typing for lists that it can't auto-detect Contributes to issue CURA-6739. --- plugins/TrimeshReader/TrimeshReader.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/TrimeshReader/TrimeshReader.py b/plugins/TrimeshReader/TrimeshReader.py index d1e4b73962..41992ddbd1 100644 --- a/plugins/TrimeshReader/TrimeshReader.py +++ b/plugins/TrimeshReader/TrimeshReader.py @@ -3,7 +3,7 @@ # The _toMeshData function is taken from the AMFReader class which was built by fieldOfView. -from typing import List, Union, TYPE_CHECKING +from typing import Any, List, Union, TYPE_CHECKING import numpy # To create the mesh data. import os.path # To create the mesh name for the resulting mesh. import trimesh # To load the files into a Trimesh. @@ -85,14 +85,14 @@ class TrimeshReader(MeshReader): # \return A scene node that contains the file's contents. def _read(self, file_name: str) -> Union["SceneNode", List["SceneNode"]]: mesh_or_scene = trimesh.load(file_name) - meshes = [] + meshes = [] # type: List[Union[trimesh.Trimesh, trimesh.Scene, Any]] if isinstance(mesh_or_scene, trimesh.Trimesh): meshes = [mesh_or_scene] elif isinstance(mesh_or_scene, trimesh.Scene): meshes = [mesh for mesh in mesh_or_scene.geometry.values()] active_build_plate = CuraApplication.getInstance().getMultiBuildPlateModel().activeBuildPlate - nodes = [] + nodes = [] # type: List[SceneNode] for mesh in meshes: if not isinstance(mesh, trimesh.Trimesh): # Trimesh can also receive point clouds, 2D paths, 3D paths or metadata. Skip those. continue From 001c2ec753bf0840de9422c15a4455ac71143f9a Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 29 Aug 2019 17:09:31 +0200 Subject: [PATCH 056/158] Fix test --- tests/Machines/TestQualityNode.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/Machines/TestQualityNode.py b/tests/Machines/TestQualityNode.py index 64685689c2..54266cb6ad 100644 --- a/tests/Machines/TestQualityNode.py +++ b/tests/Machines/TestQualityNode.py @@ -44,6 +44,7 @@ def test_qualityNode_machine_1(container_registry): with patch("UM.Settings.ContainerRegistry.ContainerRegistry.getInstance", MagicMock(return_value=container_registry)): node = QualityNode("quality_1", material_node) - assert len(node.intents) == 2 + assert len(node.intents) == 3 assert "intent_3" in node.intents - assert "intent_4" in node.intents \ No newline at end of file + assert "intent_4" in node.intents + assert "empty_intent" in node.intents \ No newline at end of file From 41d7a705e681585ba30c3724d31b21890fd587ce Mon Sep 17 00:00:00 2001 From: Mark Burton Date: Thu, 29 Aug 2019 20:58:11 +0100 Subject: [PATCH 057/158] Avoid crash due to race in CuraEngineBackend. --- plugins/CuraEngineBackend/CuraEngineBackend.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index 2aae1fff21..994966f9b7 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -632,7 +632,10 @@ class CuraEngineBackend(QObject, Backend): self.setState(BackendState.Done) self.processingProgress.emit(1.0) - gcode_list = self._scene.gcode_dict[self._start_slice_job_build_plate] #type: ignore #Because we generate this attribute dynamically. + try: + gcode_list = self._scene.gcode_dict[self._start_slice_job_build_plate] #type: ignore #Because we generate this attribute dynamically. + except KeyError: # Can occur if the g-code has been cleared while a slice message is still arriving from the other end. + gcode_list = [] for index, line in enumerate(gcode_list): replaced = line.replace("{print_time}", str(self._application.getPrintInformation().currentPrintTime.getDisplayString(DurationFormat.Format.ISO8601))) replaced = replaced.replace("{filament_amount}", str(self._application.getPrintInformation().materialLengths)) From 9b45b56e61454f257ca52778474a0352624be1c0 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 30 Aug 2019 11:43:59 +0200 Subject: [PATCH 058/158] Fix simulation view not showing bars for g-code --- plugins/SimulationView/SimulationView.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/plugins/SimulationView/SimulationView.py b/plugins/SimulationView/SimulationView.py index 72bf1274ea..b3f527acae 100644 --- a/plugins/SimulationView/SimulationView.py +++ b/plugins/SimulationView/SimulationView.py @@ -468,6 +468,9 @@ class SimulationView(CuraView): Application.getInstance().getPreferences().preferenceChanged.connect(self._onPreferencesChanged) self._controller.getScene().getRoot().childrenChanged.connect(self._onSceneChanged) + self.calculateMaxLayers() + self.calculateMaxPathsOnLayer(self._current_layer_num) + # FIX: on Max OS X, somehow QOpenGLContext.currentContext() can become None during View switching. # This can happen when you do the following steps: # 1. Start Cura From 743b8cd1567d90295807fa07efc990ccaed49c58 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Fri, 30 Aug 2019 15:53:23 +0200 Subject: [PATCH 059/158] Fix multi extrusion gcode loading CURA-6604 --- plugins/GCodeReader/FlavorParser.py | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/plugins/GCodeReader/FlavorParser.py b/plugins/GCodeReader/FlavorParser.py index 09fa2b4502..5a57618983 100644 --- a/plugins/GCodeReader/FlavorParser.py +++ b/plugins/GCodeReader/FlavorParser.py @@ -3,7 +3,7 @@ import math import re -from typing import Dict, List, NamedTuple, Optional, Union +from typing import Dict, List, NamedTuple, Optional, Union, Set import numpy @@ -38,6 +38,8 @@ class FlavorParser: self._message = None # type: Optional[Message] self._layer_number = 0 self._extruder_number = 0 + # All extruder numbers that have been seen + self._extruders_seen = {0} # type: Set[int] self._clearValues() self._scene_node = None # X, Y, Z position, F feedrate and E extruder values are stored @@ -418,6 +420,7 @@ class FlavorParser: if line.startswith("T"): T = self._getInt(line, "T") if T is not None: + self._extruders_seen.add(T) self._createPolygon(self._current_layer_thickness, current_path, self._extruder_offsets.get(self._extruder_number, [0, 0])) current_path.clear() @@ -468,12 +471,16 @@ class FlavorParser: if self._layer_number == 0: Logger.log("w", "File doesn't contain any valid layers") - settings = CuraApplication.getInstance().getGlobalContainerStack() - if settings is not None and not settings.getProperty("machine_center_is_zero", "value"): - machine_width = settings.getProperty("machine_width", "value") - machine_depth = settings.getProperty("machine_depth", "value") + if not global_stack.getProperty("machine_center_is_zero", "value"): + machine_width = global_stack.getProperty("machine_width", "value") + machine_depth = global_stack.getProperty("machine_depth", "value") scene_node.setPosition(Vector(-machine_width / 2, 0, machine_depth / 2)) + # Make sure that all seen extruders (if exist in the currently active machine) are enabled. + for extruder_nr in self._extruders_seen: + if str(extruder_nr) in global_stack.extruders: + CuraApplication.getInstance().getMachineManager().setExtruderEnabled(extruder_nr, True) + Logger.log("d", "GCode loading finished") if CuraApplication.getInstance().getPreferences().getValue("gcodereader/show_caution"): From 87e0b8629a1bacca337a3f3c89209d3d0eafaf99 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 30 Aug 2019 16:32:11 +0200 Subject: [PATCH 060/158] Add convenience script for running complete coverage --- .../tests/TestLegacyProfileReader.py | 9 ++++++-- .../tests/TestVersionUpgrade25to26.py | 3 +++ .../tests/TestVersionUpgrade26to27.py | 4 +++- .../tests/TestVersionUpgrade27to30.py | 4 +++- .../tests/TestVersionUpgrade34to35.py | 4 +++- run_coverage.py | 22 +++++++++++++++++++ 6 files changed, 41 insertions(+), 5 deletions(-) create mode 100644 run_coverage.py diff --git a/plugins/LegacyProfileReader/tests/TestLegacyProfileReader.py b/plugins/LegacyProfileReader/tests/TestLegacyProfileReader.py index 480a61f301..05f49017a3 100644 --- a/plugins/LegacyProfileReader/tests/TestLegacyProfileReader.py +++ b/plugins/LegacyProfileReader/tests/TestLegacyProfileReader.py @@ -5,6 +5,9 @@ import configparser # An input for some functions we're testing. import os.path # To find the integration test .ini files. import pytest # To register tests with. import unittest.mock # To mock the application, plug-in and container registry out. +import os.path +import sys +sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), "..")) import UM.Application # To mock the application out. import UM.PluginRegistry # To mock the plug-in registry out. @@ -12,11 +15,13 @@ import UM.Settings.ContainerRegistry # To mock the container registry out. import UM.Settings.InstanceContainer # To intercept the serialised data from the read() function. import LegacyProfileReader as LegacyProfileReaderModule # To get the directory of the module. -from LegacyProfileReader import LegacyProfileReader # The module we're testing. @pytest.fixture def legacy_profile_reader(): - return LegacyProfileReader() + try: + return LegacyProfileReaderModule.LegacyProfileReader() + except TypeError: + return LegacyProfileReaderModule.LegacyProfileReader.LegacyProfileReader() test_prepareDefaultsData = [ { diff --git a/plugins/VersionUpgrade/VersionUpgrade25to26/tests/TestVersionUpgrade25to26.py b/plugins/VersionUpgrade/VersionUpgrade25to26/tests/TestVersionUpgrade25to26.py index 9d7c7646cc..45cdaebe87 100644 --- a/plugins/VersionUpgrade/VersionUpgrade25to26/tests/TestVersionUpgrade25to26.py +++ b/plugins/VersionUpgrade/VersionUpgrade25to26/tests/TestVersionUpgrade25to26.py @@ -1,5 +1,8 @@ # Copyright (c) 2017 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. +import os.path +import sys +sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), "..")) import configparser #To check whether the appropriate exceptions are raised. import pytest #To register tests with. diff --git a/plugins/VersionUpgrade/VersionUpgrade26to27/tests/TestVersionUpgrade26to27.py b/plugins/VersionUpgrade/VersionUpgrade26to27/tests/TestVersionUpgrade26to27.py index eebaca23c6..6235578238 100644 --- a/plugins/VersionUpgrade/VersionUpgrade26to27/tests/TestVersionUpgrade26to27.py +++ b/plugins/VersionUpgrade/VersionUpgrade26to27/tests/TestVersionUpgrade26to27.py @@ -3,7 +3,9 @@ import configparser #To check whether the appropriate exceptions are raised. import pytest #To register tests with. - +import os.path +import sys +sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), "..")) import VersionUpgrade26to27 #The module we're testing. ## Creates an instance of the upgrader to test with. diff --git a/plugins/VersionUpgrade/VersionUpgrade27to30/tests/TestVersionUpgrade27to30.py b/plugins/VersionUpgrade/VersionUpgrade27to30/tests/TestVersionUpgrade27to30.py index cae08ebcfd..8ac6616511 100644 --- a/plugins/VersionUpgrade/VersionUpgrade27to30/tests/TestVersionUpgrade27to30.py +++ b/plugins/VersionUpgrade/VersionUpgrade27to30/tests/TestVersionUpgrade27to30.py @@ -1,6 +1,8 @@ # Copyright (c) 2017 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. - +import os.path +import sys +sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), "..")) import configparser #To parse the resulting config files. import pytest #To register tests with. diff --git a/plugins/VersionUpgrade/VersionUpgrade34to35/tests/TestVersionUpgrade34to35.py b/plugins/VersionUpgrade/VersionUpgrade34to35/tests/TestVersionUpgrade34to35.py index b74e6f35ac..9f306e74fa 100644 --- a/plugins/VersionUpgrade/VersionUpgrade34to35/tests/TestVersionUpgrade34to35.py +++ b/plugins/VersionUpgrade/VersionUpgrade34to35/tests/TestVersionUpgrade34to35.py @@ -1,6 +1,8 @@ # Copyright (c) 2018 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. - +import os.path +import sys +sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), "..")) import configparser #To parse the resulting config files. import pytest #To register tests with. diff --git a/run_coverage.py b/run_coverage.py new file mode 100644 index 0000000000..2fd60f9342 --- /dev/null +++ b/run_coverage.py @@ -0,0 +1,22 @@ +import pytest +from pathlib import Path + +# Small helper script to run the coverage of main code & all plugins + +path = Path("plugins") +args = ["--cov" ,"cura" , "--cov-report", "html"] +all_paths = [] +for p in path.glob('**/*'): + if p.is_dir(): + if p.name in ["__pycache__", "tests"]: + continue + args.append("--cov") + args.append(str(p)) + all_paths.append(str(p)) + +for path in all_paths: + args.append(path) +args.append(".") +args.append("-x") +pytest.main(args) + From b97015a35407e77c7d66c5f7aad8ca486e05e54e Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Mon, 2 Sep 2019 00:17:14 +0200 Subject: [PATCH 061/158] Added 'align selected face with buildplate' feature. Alt-click to select a face. See the (identically named) 'feature_bottom_face' branch in Uranium for more indepth information. --- cura/CuraActions.py | 32 +++++++++++++++++++++++++++++ plugins/SolidView/SolidView.py | 4 ++++ resources/qml/Actions.qml | 10 +++++++++ resources/qml/Menus/ContextMenu.qml | 1 + resources/shaders/overhang.shader | 10 +++++++-- 5 files changed, 55 insertions(+), 2 deletions(-) diff --git a/cura/CuraActions.py b/cura/CuraActions.py index 20c44c7916..0f2878023d 100644 --- a/cura/CuraActions.py +++ b/cura/CuraActions.py @@ -7,11 +7,13 @@ from typing import List, cast from UM.Event import CallFunctionEvent from UM.FlameProfiler import pyqtSlot +from UM.Math.Quaternion import Quaternion from UM.Math.Vector import Vector from UM.Scene.Selection import Selection from UM.Scene.Iterator.BreadthFirstIterator import BreadthFirstIterator from UM.Operations.GroupedOperation import GroupedOperation from UM.Operations.RemoveSceneNodeOperation import RemoveSceneNodeOperation +from UM.Operations.RotateOperation import RotateOperation from UM.Operations.TranslateOperation import TranslateOperation import cura.CuraApplication @@ -73,6 +75,36 @@ class CuraActions(QObject): operation.addOperation(center_operation) operation.push() + # Rotate the selection, so that the face that the mouse-pointer is on, faces the build-plate. + @pyqtSlot() + def bottomFaceSelection(self) -> None: + selected_face = Selection.getSelectedFace() + if not selected_face: + Logger.log("e", "Bottom face operation shouldn't have been called without a selected face.") + return + + original_node, face_id = selected_face + meshdata = original_node.getMeshDataTransformed() + if not meshdata or face_id < 0 or face_id > 0x10001: + return + + rotation_point, face_normal = meshdata.getFacePlane(face_id) + rotation_point_vector = Vector(rotation_point[0], rotation_point[1], rotation_point[2]) + face_normal_vector = Vector(face_normal[0], face_normal[1], face_normal[2]) + rotation_quaternion = Quaternion.rotationTo(face_normal_vector.normalized(), Vector(0.0, -1.0, 0.0)) + + operation = GroupedOperation() + for node in Selection.getAllSelectedObjects(): + current_node = node + parent_node = current_node.getParent() + while parent_node and parent_node.callDecoration("isGroup"): + current_node = parent_node + parent_node = current_node.getParent() + + rotate_operation = RotateOperation(current_node, rotation_quaternion, rotation_point_vector) + operation.addOperation(rotate_operation) + operation.push() + ## Multiply all objects in the selection # # \param count The number of times to multiply the selection. diff --git a/plugins/SolidView/SolidView.py b/plugins/SolidView/SolidView.py index 4ce8ae7bc4..38bc5eada8 100644 --- a/plugins/SolidView/SolidView.py +++ b/plugins/SolidView/SolidView.py @@ -139,6 +139,10 @@ class SolidView(View): shade_factor * int(material_color[5:7], 16) / 255, 1.0 ] + + # Color the currently selected face-id, 0x10001 is certain to be greater than the largest ID. + face = Selection.getSelectedFace() + uniforms["selected_face"] = 0x10001 if not face or node != face[0] else face[1] except ValueError: pass diff --git a/resources/qml/Actions.qml b/resources/qml/Actions.qml index 7e6afa813d..759d4e1785 100644 --- a/resources/qml/Actions.qml +++ b/resources/qml/Actions.qml @@ -26,6 +26,7 @@ Item property alias deleteSelection: deleteSelectionAction; property alias centerSelection: centerSelectionAction; + property alias bottomFaceSelection: bottomFaceSelectionAction; property alias multiplySelection: multiplySelectionAction; property alias deleteObject: deleteObjectAction; @@ -271,6 +272,15 @@ Item onTriggered: CuraActions.centerSelection(); } + Action + { + id: bottomFaceSelectionAction; + text: catalog.i18nc("@action:inmenu menubar:edit", "Align Selected Face To Bottom"); + enabled: UM.Controller.toolsEnabled && UM.Selection.hasFaceSelected; + // iconName: "NO-ICON-YET"; // TODO? + onTriggered: CuraActions.bottomFaceSelection(); + } + Action { id: multiplySelectionAction; diff --git a/resources/qml/Menus/ContextMenu.qml b/resources/qml/Menus/ContextMenu.qml index cb10d50ce8..5125c0c998 100644 --- a/resources/qml/Menus/ContextMenu.qml +++ b/resources/qml/Menus/ContextMenu.qml @@ -20,6 +20,7 @@ Menu // Selection-related actions. MenuItem { action: Cura.Actions.centerSelection; } MenuItem { action: Cura.Actions.deleteSelection; } + MenuItem { action: Cura.Actions.bottomFaceSelection; } MenuItem { action: Cura.Actions.multiplySelection; } // Extruder selection - only visible if there is more than 1 extruder diff --git a/resources/shaders/overhang.shader b/resources/shaders/overhang.shader index e1c03f7586..cb34f25893 100644 --- a/resources/shaders/overhang.shader +++ b/resources/shaders/overhang.shader @@ -32,6 +32,8 @@ fragment = uniform lowp float u_overhangAngle; uniform lowp vec4 u_overhangColor; + uniform lowp vec4 u_faceColor; + uniform highp int u_faceId; varying highp vec3 f_vertex; varying highp vec3 f_normal; @@ -58,7 +60,7 @@ fragment = highp float NdotR = clamp(dot(viewVector, reflectedLight), 0.0, 1.0); finalColor += pow(NdotR, u_shininess) * u_specularColor; - finalColor = (-normal.y > u_overhangAngle) ? u_overhangColor : finalColor; + finalColor = (u_faceId != gl_PrimitiveID) ? ((-normal.y > u_overhangAngle) ? u_overhangColor : finalColor) : u_faceColor; gl_FragColor = finalColor; gl_FragColor.a = 1.0; @@ -99,6 +101,8 @@ fragment41core = uniform lowp float u_overhangAngle; uniform lowp vec4 u_overhangColor; + uniform lowp vec4 u_faceColor; + uniform highp int u_faceId; in highp vec3 f_vertex; in highp vec3 f_normal; @@ -127,7 +131,7 @@ fragment41core = highp float NdotR = clamp(dot(viewVector, reflectedLight), 0.0, 1.0); finalColor += pow(NdotR, u_shininess) * u_specularColor; - finalColor = (-normal.y > u_overhangAngle) ? u_overhangColor : finalColor; + finalColor = (u_faceId != gl_PrimitiveID) ? ((-normal.y > u_overhangAngle) ? u_overhangColor : finalColor) : u_faceColor; frag_color = finalColor; frag_color.a = 1.0; @@ -138,6 +142,7 @@ u_ambientColor = [0.3, 0.3, 0.3, 1.0] u_diffuseColor = [1.0, 0.79, 0.14, 1.0] u_specularColor = [0.4, 0.4, 0.4, 1.0] u_overhangColor = [1.0, 0.0, 0.0, 1.0] +u_faceColor = [0.0, 0.0, 1.0, 1.0] u_shininess = 20.0 [bindings] @@ -148,6 +153,7 @@ u_normalMatrix = normal_matrix u_viewPosition = view_position u_lightPosition = light_0_position u_diffuseColor = diffuse_color +u_faceId = selected_face [attributes] a_vertex = vertex From 24474b4434925aa5d3b6ffb9214261eba57d18df Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 2 Sep 2019 09:52:36 +0200 Subject: [PATCH 062/158] Made too broad exception handling more specific --- plugins/SimulationView/SimulationView.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/SimulationView/SimulationView.py b/plugins/SimulationView/SimulationView.py index b3f527acae..28d5a74523 100644 --- a/plugins/SimulationView/SimulationView.py +++ b/plugins/SimulationView/SimulationView.py @@ -386,7 +386,7 @@ class SimulationView(CuraView): self._max_thickness = max(float(p.lineThicknesses.max()), self._max_thickness) try: self._min_thickness = min(float(p.lineThicknesses[numpy.nonzero(p.lineThicknesses)].min()), self._min_thickness) - except: + except ValueError: # Sometimes, when importing a GCode the line thicknesses are zero and so the minimum (avoiding # the zero) can't be calculated Logger.log("i", "Min thickness can't be calculated because all the values are zero") From b358d8ddd078da4db5b4916d9d91cb3fd9fdc559 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 2 Sep 2019 13:20:09 +0200 Subject: [PATCH 063/158] Fix typo in ComboBox.qml --- resources/qml/Widgets/ComboBox.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/Widgets/ComboBox.qml b/resources/qml/Widgets/ComboBox.qml index d1edcca69c..bed1a1b3af 100644 --- a/resources/qml/Widgets/ComboBox.qml +++ b/resources/qml/Widgets/ComboBox.qml @@ -14,7 +14,7 @@ import Cura 1.1 as Cura ComboBox { id: control - property bool highlighted: False + property bool highlighted: false background: Rectangle { color: From 957add798b19c9180f9c6d36f6112f36bbf78957 Mon Sep 17 00:00:00 2001 From: SAMSECTOR Date: Mon, 2 Sep 2019 22:14:24 +0300 Subject: [PATCH 064/158] Update printrbot_simple_extended.def.json manufacturer name changed from "PrintrBot" to "Printrbot" to allow the profile under the "Add a printer" menu not appearing in version 4.2.1 --- resources/definitions/printrbot_simple_extended.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/printrbot_simple_extended.def.json b/resources/definitions/printrbot_simple_extended.def.json index c4cab54386..06c639f024 100644 --- a/resources/definitions/printrbot_simple_extended.def.json +++ b/resources/definitions/printrbot_simple_extended.def.json @@ -5,7 +5,7 @@ "metadata": { "visible": true, "author": "samsector", - "manufacturer": "PrintrBot", + "manufacturer": "Printrbot", "platform": "printrbot_simple_metal_upgrade.stl", "platform_offset": [0, -0.3, 0], "file_formats": "text/x-gcode", From cb65cb868e20d54882c976eb1d11f4256f019e45 Mon Sep 17 00:00:00 2001 From: SAMSECTOR Date: Mon, 2 Sep 2019 22:20:20 +0300 Subject: [PATCH 065/158] Update printrbot_simple.def.json manufacturer name changed from "PrintrBot" to "Printrbot" to allow the profile under the "Add a printer" menu not appearing in version 4.2.1 --- resources/definitions/printrbot_simple.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/printrbot_simple.def.json b/resources/definitions/printrbot_simple.def.json index 4d1f368b6d..760ff383d1 100644 --- a/resources/definitions/printrbot_simple.def.json +++ b/resources/definitions/printrbot_simple.def.json @@ -5,7 +5,7 @@ "metadata": { "visible": true, "author": "Calvindog717", - "manufacturer": "PrintrBot", + "manufacturer": "Printrbot", "platform": "printrbot_simple_metal_platform.stl", "platform_offset": [0, -3.45, 0], "file_formats": "text/x-gcode", From 51ed0072db14c0d6d192669d18903d376f6e239c Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 3 Sep 2019 09:48:01 +0200 Subject: [PATCH 066/158] Apply proposed Creality changes These are the changes currently confirmed by multiple people in this comment: https://github.com/Ultimaker/Cura/issues/6106#issuecomment-524241165 Contributes to issue #6106. --- resources/definitions/creality_base.def.json | 282 ++++++++++--------- 1 file changed, 142 insertions(+), 140 deletions(-) diff --git a/resources/definitions/creality_base.def.json b/resources/definitions/creality_base.def.json index de51cb1a53..d7e028f31a 100644 --- a/resources/definitions/creality_base.def.json +++ b/resources/definitions/creality_base.def.json @@ -2,146 +2,6 @@ "name": "Creawsome Base Printer", "version": 2, "inherits": "fdmprinter", - "overrides": { - "machine_name": { "default_value": "Creawsome Base Printer" }, - "machine_start_gcode": { "default_value": "M201 X500.00 Y500.00 Z100.00 E5000.00 ;Setup machine max acceleration\nM203 X500.00 Y500.00 Z10.00 E50.00 ;Setup machine max feedrate\nM204 P500.00 R1000.00 T500.00 ;Setup Print/Retract/Travel acceleration\nM205 X8.00 Y8.00 Z0.40 E5.00 ;Setup Jerk\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\n\nG28 ;Home\n\nG92 E0 ;Reset Extruder\nG1 Z2.0 F3000 ;Move Z Axis up\nG1 X10.1 Y20 Z0.28 F5000.0 ;Move to start position\nG1 X10.1 Y200.0 Z0.28 F1500.0 E15 ;Draw the first line\nG1 X10.4 Y200.0 Z0.28 F5000.0 ;Move to side a little\nG1 X10.4 Y20 Z0.28 F1500.0 E30 ;Draw the second line\nG92 E0 ;Reset Extruder\nG1 Z2.0 F3000 ;Move Z Axis up\n"}, - "machine_end_gcode": { "default_value": "G91 ;Relative positionning\nG1 E-2 F2700 ;Retract a bit\nG1 E-2 Z0.2 F2400 ;Retract and raise Z\nG1 X5 Y5 F3000 ;Wipe out\nG1 Z10 ;Raise Z more\nG90 ;Absolute positionning\n\nG1 X0 Y{machine_depth} ;Present print\nM106 S0 ;Turn-off fan\nM104 S0 ;Turn-off hotend\nM140 S0 ;Turn-off bed\n\nM84 X Y E ;Disable all steppers but Z\n" }, - - "machine_max_feedrate_x": { "value": 500 }, - "machine_max_feedrate_y": { "value": 500 }, - "machine_max_feedrate_z": { "value": 10 }, - "machine_max_feedrate_e": { "value": 50 }, - - "machine_max_acceleration_x": { "value": 500 }, - "machine_max_acceleration_y": { "value": 500 }, - "machine_max_acceleration_z": { "value": 100 }, - "machine_max_acceleration_e": { "value": 5000 }, - "machine_acceleration": { "value": 500 }, - - "machine_max_jerk_xy": { "value": 10 }, - "machine_max_jerk_z": { "value": 0.4 }, - "machine_max_jerk_e": { "value": 5 }, - - "machine_heated_bed": { "default_value": true }, - - "material_diameter": { "default_value": 1.75 }, - - "acceleration_print": { "value": 500 }, - "acceleration_travel": { "value": 500 }, - "acceleration_travel_layer_0": { "value": "acceleration_travel" }, - "acceleration_roofing": { "enabled": "acceleration_enabled and roofing_layer_count > 0 and top_layers > 0" }, - - "jerk_print": { "value": 8 }, - "jerk_travel": { "value": "jerk_print" }, - "jerk_travel_layer_0": { "value": "jerk_travel" }, - - "acceleration_enabled": { "value": false }, - "jerk_enabled": { "value": false }, - - "speed_print": { "value": 50.0 } , - "speed_infill": { "value": "speed_print" }, - "speed_wall": { "value": "speed_print / 2" }, - "speed_wall_0": { "value": "speed_wall" }, - "speed_wall_x": { "value": "speed_wall" }, - "speed_topbottom": { "value": "speed_print / 2" }, - "speed_roofing": { "value": "speed_topbottom" }, - "speed_travel": { "value": "150.0 if speed_print < 60 else 250.0 if speed_print > 100 else speed_print * 2.5" }, - "speed_layer_0": { "value": 20.0 }, - "speed_print_layer_0": { "value": "speed_layer_0" }, - "speed_travel_layer_0": { "value": "100 if speed_layer_0 < 20 else 150 if speed_layer_0 > 30 else speed_layer_0 * 5" }, - "speed_prime_tower": { "value": "speed_topbottom" }, - "speed_support": { "value": "speed_wall_0" }, - "speed_support_interface": { "value": "speed_topbottom" }, - "speed_z_hop": {"value": 5}, - - "skirt_brim_speed": { "value": "speed_layer_0" }, - - "line_width": { "value": "machine_nozzle_size * 1.1"}, - - "material_initial_print_temperature": { "value": "material_print_temperature"}, - "material_final_print_temperature": { "value": "material_print_temperature"}, - "material_flow": { "value": 100}, - - "z_seam_type": { "value": "'back'"}, - "z_seam_corner": { "value": "'z_seam_corner_none'"}, - - "infill_sparse_density": { "value": "20"}, - "infill_pattern": { "value": "'lines' if infill_sparse_density > 50 else 'cubic'"}, - "infill_before_walls": { "value": false }, - "infill_overlap": { "value": 30.0 }, - "skin_overlap": { "value": 10.0 }, - "infill_wipe_dist": { "value": 0.0 }, - "wall_0_wipe_dist": { "value": 0.0 }, - - "fill_perimeter_gaps": { "value": "'everywhere'" }, - "fill_outline_gaps": { "value": false }, - "filter_out_tiny_gaps": { "value": false }, - - "retraction_speed": { - "maximum_value_warning": "machine_max_feedrate_e if retraction_enable else float('inf')", - "maximum_value": 200 - }, - "retraction_retract_speed": { - "maximum_value_warning": "machine_max_feedrate_e if retraction_enable else float('inf')", - "maximum_value": 200 - }, - "retraction_prime_speed": { - "maximum_value_warning": "machine_max_feedrate_e if retraction_enable else float('inf')", - "maximum_value": 200 - }, - - "retraction_hop_enabled": { "value": "support_enable" }, - "retraction_hop": { "value": 0.2 }, - "retraction_combing": { "value": "'off' if retraction_hop_enabled else 'infill'"}, - "retraction_combing_max_distance": { "value": 30}, - "travel_avoid_other_parts": { "value": true }, - "travel_avoid_supports": { "value": true }, - "travel_retract_before_outer_wall": { "value": true }, - - "retraction_enable": { "value": true }, - "retraction_count_max": { "value": 100 }, - "retraction_extrusion_window": { "value": 10 }, - "retraction_min_travel": { "value": 1.5 }, - - "cool_fan_full_at_height": { "value": "layer_height_0 + 2 * layer_height" }, - "cool_fan_enabled": { "value": true }, - "cool_min_layer_time": { "value": 10 }, - - "adhesion_type": { "value": "'skirt'" }, - "brim_replaces_support": { "value": false }, - "skirt_gap": { "value": 10.0 }, - "skirt_line_count": { "value": 4 }, - - "adaptive_layer_height_variation": { "value": 0.04}, - "adaptive_layer_height_variation_step": { "value": 0.04 }, - - "meshfix_maximum_resolution": { "value": "0.05" }, - "meshfix_maximum_travel_resolution": { "value": "meshfix_maximum_resolution" }, - - "support_type": { "value": "'buildplate'"}, - "support_angle": { "value": "math.floor(math.degrees(math.atan(line_width/2.0/layer_height)))" }, - "support_pattern": { "value": "'zigzag'" }, - "support_infill_rate": { "value": "0 if support_tree_enable else 20" }, - "support_use_towers": { "value": false }, - "support_xy_distance": { "value": "wall_line_width_0 * 2" }, - "support_xy_distance_overhang": { "value": "wall_line_width_0" }, - "support_z_distance": { "value": "layer_height if layer_height >= 0.16 else layer_height*2" }, - "support_xy_overrides_z": { "value": "'xy_overrides_z'" }, - "support_wall_count": { "value": 1}, - "support_brim_enable": { "value": true}, - "support_brim_width": { "value": 4}, - - "support_interface_enable": { "value": true }, - "support_interface_height": { "value": "layer_height * 4" }, - "support_interface_density": { "value": 33.333 }, - "support_interface_pattern": { "value": "'grid'" }, - "support_interface_skip_height": { "value": 0.2}, - "minimum_support_area": { "value": 10}, - "minimum_interface_area": { "value": 10}, - "top_bottom_thickness": {"value": "layer_height_0 + layer_height * 3"}, - "wall_thickness": {"value": "line_width * 2"} - - }, "metadata": { "visible": false, "author": "trouch.com", @@ -261,5 +121,147 @@ "zyyx_pro_flex", "zyyx_pro_pla" ] + }, + "overrides": { + "machine_name": { "default_value": "Creawsome Base Printer" }, + "machine_start_gcode": { "default_value": "M201 X500.00 Y500.00 Z100.00 E5000.00 ;Setup machine max acceleration\nM203 X500.00 Y500.00 Z10.00 E50.00 ;Setup machine max feedrate\nM204 P500.00 R1000.00 T500.00 ;Setup Print/Retract/Travel acceleration\nM205 X8.00 Y8.00 Z0.40 E5.00 ;Setup Jerk\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\n\nG28 ;Home\n\nG92 E0 ;Reset Extruder\nG1 Z2.0 F3000 ;Move Z Axis up\nG1 X10.1 Y20 Z0.28 F5000.0 ;Move to start position\nG1 X10.1 Y200.0 Z0.28 F1500.0 E15 ;Draw the first line\nG1 X10.4 Y200.0 Z0.28 F5000.0 ;Move to side a little\nG1 X10.4 Y20 Z0.28 F1500.0 E30 ;Draw the second line\nG92 E0 ;Reset Extruder\nG1 Z2.0 F3000 ;Move Z Axis up\n" }, + "machine_end_gcode": { "default_value": "G91 ;Relative positionning\nG1 E-2 F2700 ;Retract a bit\nG1 E-2 Z0.2 F2400 ;Retract and raise Z\nG1 X5 Y5 F3000 ;Wipe out\nG1 Z10 ;Raise Z more\nG90 ;Absolute positionning\n\nG1 X0 Y{machine_depth} ;Present print\nM106 S0 ;Turn-off fan\nM104 S0 ;Turn-off hotend\nM140 S0 ;Turn-off bed\n\nM84 X Y E ;Disable all steppers but Z\n" }, + + "machine_max_feedrate_x": { "value": 500 }, + "machine_max_feedrate_y": { "value": 500 }, + "machine_max_feedrate_z": { "value": 10 }, + "machine_max_feedrate_e": { "value": 50 }, + + "machine_max_acceleration_x": { "value": 500 }, + "machine_max_acceleration_y": { "value": 500 }, + "machine_max_acceleration_z": { "value": 100 }, + "machine_max_acceleration_e": { "value": 5000 }, + "machine_acceleration": { "value": 500 }, + + "machine_max_jerk_xy": { "value": 10 }, + "machine_max_jerk_z": { "value": 0.4 }, + "machine_max_jerk_e": { "value": 5 }, + + "machine_heated_bed": { "default_value": true }, + + "material_diameter": { "default_value": 1.75 }, + + "acceleration_print": { "value": 500 }, + "acceleration_travel": { "value": 500 }, + "acceleration_travel_layer_0": { "value": "acceleration_travel" }, + "acceleration_roofing": { "enabled": "acceleration_enabled and roofing_layer_count > 0 and top_layers > 0" }, + + "jerk_print": { "value": 8 }, + "jerk_travel": { "value": "jerk_print" }, + "jerk_travel_layer_0": { "value": "jerk_travel" }, + + "acceleration_enabled": { "value": false }, + "jerk_enabled": { "value": false }, + + "speed_print": { "value": 50.0 } , + "speed_infill": { "value": "speed_print" }, + "speed_wall": { "value": "speed_print / 2" }, + "speed_wall_0": { "value": "speed_wall" }, + "speed_wall_x": { "value": "speed_wall" }, + "speed_topbottom": { "value": "speed_print / 2" }, + "speed_roofing": { "value": "speed_topbottom" }, + "speed_travel": { "value": "150.0 if speed_print < 60 else 250.0 if speed_print > 100 else speed_print * 2.5" }, + "speed_layer_0": { "value": 20.0 }, + "speed_print_layer_0": { "value": "speed_layer_0" }, + "speed_travel_layer_0": { "value": "100 if speed_layer_0 < 20 else 150 if speed_layer_0 > 30 else speed_layer_0 * 5" }, + "speed_prime_tower": { "value": "speed_topbottom" }, + "speed_support": { "value": "speed_wall_0" }, + "speed_support_interface": { "value": "speed_topbottom" }, + "speed_z_hop": { "value": 5 }, + + "skirt_brim_speed": { "value": "speed_layer_0" }, + + "line_width": { "value": "machine_nozzle_size" }, + + "optimize_wall_printing_order": { "value": "True" }, + + "material_initial_print_temperature": { "value": "material_print_temperature" }, + "material_final_print_temperature": { "value": "material_print_temperature" }, + "material_flow": { "value": 100 }, + "travel_compensate_overlapping_walls_0_enabled": { "value": "False" }, + + "z_seam_type": { "value": "'back'" }, + "z_seam_corner": { "value": "'z_seam_corner_weighted'" }, + + "infill_sparse_density": { "value": "20" }, + "infill_pattern": { "value": "'lines' if infill_sparse_density > 50 else 'cubic'" }, + "infill_before_walls": { "value": false }, + "infill_overlap": { "value": 30.0 }, + "skin_overlap": { "value": 10.0 }, + "infill_wipe_dist": { "value": 0.0 }, + "wall_0_wipe_dist": { "value": 0.0 }, + + "fill_perimeter_gaps": { "value": "'everywhere'" }, + "fill_outline_gaps": { "value": false }, + "filter_out_tiny_gaps": { "value": false }, + + "retraction_speed": { + "maximum_value_warning": "machine_max_feedrate_e if retraction_enable else float('inf')", + "maximum_value": 200 + }, + "retraction_retract_speed": { + "maximum_value_warning": "machine_max_feedrate_e if retraction_enable else float('inf')", + "maximum_value": 200 + }, + "retraction_prime_speed": { + "maximum_value_warning": "machine_max_feedrate_e if retraction_enable else float('inf')", + "maximum_value": 200 + }, + + "retraction_hop_enabled": { "value": "False" }, + "retraction_hop": { "value": 0.2 }, + "retraction_combing": { "value": "'off' if retraction_hop_enabled else 'noskin'" }, + "retraction_combing_max_distance": { "value": 30 }, + "travel_avoid_other_parts": { "value": true }, + "travel_avoid_supports": { "value": true }, + "travel_retract_before_outer_wall": { "value": true }, + + "retraction_enable": { "value": true }, + "retraction_count_max": { "value": 100 }, + "retraction_extrusion_window": { "value": 10 }, + "retraction_min_travel": { "value": 1.5 }, + + "cool_fan_full_at_height": { "value": "layer_height_0 + 2 * layer_height" }, + "cool_fan_enabled": { "value": true }, + "cool_min_layer_time": { "value": 10 }, + + "adhesion_type": { "value": "'skirt'" }, + "brim_replaces_support": { "value": false }, + "skirt_gap": { "value": 10.0 }, + "skirt_line_count": { "value": 3 }, + + "adaptive_layer_height_variation": { "value": 0.04 }, + "adaptive_layer_height_variation_step": { "value": 0.04 }, + + "meshfix_maximum_resolution": { "value": "0.05" }, + "meshfix_maximum_travel_resolution": { "value": "meshfix_maximum_resolution" }, + + "support_angle": { "value": "math.floor(math.degrees(math.atan(line_width/2.0/layer_height)))" }, + "support_pattern": { "value": "'zigzag'" }, + "support_infill_rate": { "value": "0 if support_tree_enable else 20" }, + "support_use_towers": { "value": false }, + "support_xy_distance": { "value": "wall_line_width_0 * 2" }, + "support_xy_distance_overhang": { "value": "wall_line_width_0" }, + "support_z_distance": { "value": "layer_height if layer_height >= 0.16 else layer_height*2" }, + "support_xy_overrides_z": { "value": "'xy_overrides_z'" }, + "support_wall_count": { "value": 1 }, + "support_brim_enable": { "value": true }, + "support_brim_width": { "value": 4 }, + + "support_interface_enable": { "value": true }, + "support_interface_height": { "value": "layer_height * 4" }, + "support_interface_density": { "value": 33.333 }, + "support_interface_pattern": { "value": "'grid'" }, + "support_interface_skip_height": { "value": 0.2 }, + "minimum_support_area": { "value": 5 }, + "minimum_interface_area": { "value": 10 }, + "top_bottom_thickness": {"value": "layer_height_0 + layer_height * 3" }, + "wall_thickness": {"value": "line_width * 2" } + } } \ No newline at end of file From 0926c223b2e167fbacd566d4b73d44a0016c2860 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 3 Sep 2019 10:53:46 +0200 Subject: [PATCH 067/158] Add missing renderType: Text.NativeRendering CURA-6598 --- resources/qml/LabelBar.qml | 1 + resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml | 2 ++ resources/qml/PrintSetupSelector/Custom/MenuButton.qml | 1 + .../qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml | 3 +++ 4 files changed, 7 insertions(+) diff --git a/resources/qml/LabelBar.qml b/resources/qml/LabelBar.qml index f6e655de79..3985a47368 100644 --- a/resources/qml/LabelBar.qml +++ b/resources/qml/LabelBar.qml @@ -35,6 +35,7 @@ Item text: model[modelKey] color: UM.Theme.getColor("text") font: UM.Theme.getFont("default") + renderType: Text.NativeRendering height: contentHeight anchors { diff --git a/resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml b/resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml index 656f58ac28..f329b1ce65 100644 --- a/resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml +++ b/resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml @@ -45,6 +45,7 @@ Item } text: catalog.i18nc("@label", "Profile") font: UM.Theme.getFont("medium") + renderType: Text.NativeRendering color: UM.Theme.getColor("text") verticalAlignment: Text.AlignVCenter } @@ -69,6 +70,7 @@ Item anchors.verticalCenter: intentSelection.verticalCenter height: contentHeight verticalAlignment: Text.AlignVCenter + renderType: Text.NativeRendering } background: Rectangle diff --git a/resources/qml/PrintSetupSelector/Custom/MenuButton.qml b/resources/qml/PrintSetupSelector/Custom/MenuButton.qml index 1652b71213..511e29de2a 100644 --- a/resources/qml/PrintSetupSelector/Custom/MenuButton.qml +++ b/resources/qml/PrintSetupSelector/Custom/MenuButton.qml @@ -44,5 +44,6 @@ Button verticalAlignment: Text.AlignVCenter anchors.left: button.left anchors.leftMargin: UM.Theme.getSize("wide_margin").width + renderType: Text.NativeRendering } } \ No newline at end of file diff --git a/resources/qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml b/resources/qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml index 6d51b9005b..cd2510163f 100644 --- a/resources/qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml +++ b/resources/qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml @@ -61,6 +61,7 @@ Popup { id: headerLabel text: model.name + renderType: Text.NativeRendering height: visible ? contentHeight: 0 enabled: false visible: qualitiesList.visibleChildren.length > 0 @@ -198,6 +199,7 @@ Popup anchors.left: parent.left anchors.leftMargin: UM.Theme.getSize("default_margin").width + UM.Theme.getSize("narrow_margin").width verticalAlignment: Text.AlignVCenter + renderType: Text.NativeRendering } Label { @@ -207,6 +209,7 @@ Popup anchors.right: parent.right anchors.rightMargin: UM.Theme.getSize("default_margin").width verticalAlignment: Text.AlignVCenter + renderType: Text.NativeRendering } } onClicked: From f77ad22fe3a7637f7b099330c99cf89cc8969730 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 3 Sep 2019 11:13:47 +0200 Subject: [PATCH 068/158] Fix hardcoded entries in radioCheckbar CURA-6598 --- resources/qml/RadioCheckbar.qml | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/resources/qml/RadioCheckbar.qml b/resources/qml/RadioCheckbar.qml index 4f959fc8fd..6f5ed301fa 100644 --- a/resources/qml/RadioCheckbar.qml +++ b/resources/qml/RadioCheckbar.qml @@ -1,18 +1,19 @@ import QtQuick 2.0 import QtQuick.Controls 2.3 import QtQuick.Layouts 1.3 +import UM 1.1 as UM Item { id: base property ButtonGroup buttonGroup: null - property color activeColor: "#3282ff" - property color inactiveColor: "#cccccc" - property color defaultItemColor: "#0a0850" - property int checkboxSize: 14 - property int inactiveMarkerSize: 4 - property int barSize: 2 + property color activeColor: UM.Theme.getColor("primary") + property color inactiveColor: UM.Theme.getColor("slider_groove") + property color defaultItemColor: UM.Theme.getColor("small_button_active") + property int checkboxSize: UM.Theme.getSize("radio_button").height * 0.75 + property int inactiveMarkerSize: 2 * barSize + property int barSize: UM.Theme.getSize("slider_groove_radius").height property var isCheckedFunction // Function that accepts the modelItem and returns if the item should be active. implicitWidth: 200 @@ -28,15 +29,13 @@ Item height: barSize - // This can (and should) be done wiht a verticalCenter. For some reason it does work in QtCreator - // but not when using the exact same QML in Cura. - y: 0.5 * checkboxSize anchors { left: buttonBar.left right: buttonBar.right leftMargin: (checkboxSize - inactiveMarkerSize) / 2 rightMargin: (checkboxSize - inactiveMarkerSize) / 2 + verticalCenter: parent.verticalCenter } } @@ -72,12 +71,11 @@ Item height: barSize width: buttonBar.width / (repeater.count - 1) - activeComponent.width - 2 color: defaultItemColor - // This can (and should) be done wiht a verticalCenter. For some reason it does work in QtCreator - // but not when using the exact same QML in Cura. - y: 0.5 * checkboxSize + anchors { right: activeComponent.left + verticalCenter: parent.verticalCenter } visible: previousItem !== null && previousItem.isEnabled && isEnabled } @@ -105,7 +103,7 @@ Item { // This can (and should) be done wiht a verticalCenter. For some reason it does work in QtCreator // but not when using the exact same QML in Cura. - y: 0.5 * checkboxSize - 1 + anchors.verticalCenter: parent.verticalCenter anchors.horizontalCenter: parent.horizontalCenter height: inactiveMarkerSize width: inactiveMarkerSize From 52f3f9b7735604f0d746459e4cec282956496906 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 3 Sep 2019 11:01:39 +0200 Subject: [PATCH 069/158] Update QML import versions and add headings CURA-6598 --- resources/qml/LabelBar.qml | 9 +++++++-- .../qml/Menus/ConfigurationMenu/ConfigurationMenu.qml | 4 ++-- .../qml/PrintSetupSelector/Custom/CustomPrintSetup.qml | 6 +++--- resources/qml/PrintSetupSelector/Custom/MenuButton.qml | 7 +++++-- .../Custom/QualitiesWithIntentMenu.qml | 8 ++++++-- .../qml/PrintSetupSelector/PrintSetupSelectorHeader.qml | 2 +- .../Recommended/RecommendedPrintSetup.qml | 2 +- .../Recommended/RecommendedQualityProfileSelector.qml | 2 +- resources/qml/RadioCheckbar.qml | 5 ++++- 9 files changed, 30 insertions(+), 15 deletions(-) diff --git a/resources/qml/LabelBar.qml b/resources/qml/LabelBar.qml index 3985a47368..87cc825b3b 100644 --- a/resources/qml/LabelBar.qml +++ b/resources/qml/LabelBar.qml @@ -1,7 +1,12 @@ -import QtQuick 2.0 -import QtQuick.Controls 2.1 +// Copyright (c) 2019 Ultimaker B.V. +// Cura is released under the terms of the LGPLv3 or higher. + +import QtQuick 2.10 +import QtQuick.Controls 2.3 import QtQuick.Layouts 1.3 + import UM 1.2 as UM + // The labelBar shows a set of labels that are evenly spaced from oneother. // The first item is aligned to the left, the last is aligned to the right. // It's intended to be used together with RadioCheckBar. As such, it needs diff --git a/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml b/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml index fb074e948c..959d498054 100644 --- a/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml +++ b/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml @@ -1,8 +1,8 @@ // Copyright (c) 2018 Ultimaker B.V. // Cura is released under the terms of the LGPLv3 or higher. -import QtQuick 2.7 -import QtQuick.Controls 2.0 +import QtQuick 2.10 +import QtQuick.Controls 2.3 import QtQuick.Controls.Styles 1.4 import UM 1.2 as UM diff --git a/resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml b/resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml index f329b1ce65..d38dfc14f8 100644 --- a/resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml +++ b/resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml @@ -1,9 +1,9 @@ // Copyright (c) 2018 Ultimaker B.V. // Cura is released under the terms of the LGPLv3 or higher. -import QtQuick 2.7 -import QtQuick.Controls 2.0 -import QtQuick.Controls 1.1 as OldControls +import QtQuick 2.10 +import QtQuick.Controls 2.3 +import QtQuick.Controls 1.4 as OldControls import UM 1.3 as UM import Cura 1.6 as Cura diff --git a/resources/qml/PrintSetupSelector/Custom/MenuButton.qml b/resources/qml/PrintSetupSelector/Custom/MenuButton.qml index 511e29de2a..29436da9cf 100644 --- a/resources/qml/PrintSetupSelector/Custom/MenuButton.qml +++ b/resources/qml/PrintSetupSelector/Custom/MenuButton.qml @@ -1,8 +1,11 @@ -import QtQuick 2.0 +// Copyright (c) 2019 Ultimaker B.V. +// Cura is released under the terms of the LGPLv3 or higher. + +import QtQuick 2.10 import QtQuick.Controls 2.3 -import Cura 1.6 as Cura import UM 1.2 as UM +import Cura 1.6 as Cura Button { diff --git a/resources/qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml b/resources/qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml index cd2510163f..a885629247 100644 --- a/resources/qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml +++ b/resources/qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml @@ -1,8 +1,12 @@ -import QtQuick 2.0 +// Copyright (c) 2019 Ultimaker B.V. +// Cura is released under the terms of the LGPLv3 or higher. + +import QtQuick 2.10 import QtQuick.Controls 2.3 -import Cura 1.6 as Cura import UM 1.2 as UM +import Cura 1.6 as Cura + Popup { id: popup diff --git a/resources/qml/PrintSetupSelector/PrintSetupSelectorHeader.qml b/resources/qml/PrintSetupSelector/PrintSetupSelectorHeader.qml index 30691d32b9..5628867922 100644 --- a/resources/qml/PrintSetupSelector/PrintSetupSelectorHeader.qml +++ b/resources/qml/PrintSetupSelector/PrintSetupSelectorHeader.qml @@ -1,7 +1,7 @@ // Copyright (c) 2018 Ultimaker B.V. // Cura is released under the terms of the LGPLv3 or higher. -import QtQuick 2.7 +import QtQuick 2.10 import QtQuick.Controls 2.3 import QtQuick.Layouts 1.3 diff --git a/resources/qml/PrintSetupSelector/Recommended/RecommendedPrintSetup.qml b/resources/qml/PrintSetupSelector/Recommended/RecommendedPrintSetup.qml index d9364681d2..a180ad6324 100644 --- a/resources/qml/PrintSetupSelector/Recommended/RecommendedPrintSetup.qml +++ b/resources/qml/PrintSetupSelector/Recommended/RecommendedPrintSetup.qml @@ -1,7 +1,7 @@ // Copyright (c) 2018 Ultimaker B.V. // Cura is released under the terms of the LGPLv3 or higher. -import QtQuick 2.7 +import QtQuick 2.10 import QtQuick.Controls 1.4 import QtQuick.Controls.Styles 1.4 diff --git a/resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelector.qml b/resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelector.qml index 2742605399..68a3e4811d 100644 --- a/resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelector.qml +++ b/resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelector.qml @@ -1,7 +1,7 @@ // Copyright (c) 2018 Ultimaker B.V. // Cura is released under the terms of the LGPLv3 or higher. -import QtQuick 2.7 +import QtQuick 2.10 import QtQuick.Controls 1.4 import QtQuick.Controls 2.3 as Controls2 import QtQuick.Controls.Styles 1.4 diff --git a/resources/qml/RadioCheckbar.qml b/resources/qml/RadioCheckbar.qml index 6f5ed301fa..3c767a6201 100644 --- a/resources/qml/RadioCheckbar.qml +++ b/resources/qml/RadioCheckbar.qml @@ -1,4 +1,7 @@ -import QtQuick 2.0 +// Copyright (c) 2019 Ultimaker B.V. +// Cura is released under the terms of the LGPLv3 or higher. + +import QtQuick 2.10 import QtQuick.Controls 2.3 import QtQuick.Layouts 1.3 import UM 1.1 as UM From 39d52556f41f7f776167d406d02f3a7939160edf Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 3 Sep 2019 11:16:50 +0200 Subject: [PATCH 070/158] Fix text alignments by using rounding CURA-6598 --- resources/qml/LabelBar.qml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/resources/qml/LabelBar.qml b/resources/qml/LabelBar.qml index 87cc825b3b..571c9f0bfb 100644 --- a/resources/qml/LabelBar.qml +++ b/resources/qml/LabelBar.qml @@ -32,8 +32,9 @@ Item Item { Layout.fillWidth: true - Layout.maximumWidth: index + 1 === repeater.count || repeater.count <= 1 ? itemSize : base.width / (repeater.count - 1) + Layout.maximumWidth: Math.round(index + 1 === repeater.count || repeater.count <= 1 ? itemSize : base.width / (repeater.count - 1)) height: label.height + Label { id: label @@ -52,7 +53,7 @@ Item // We want the center of the label to align with the center of the item, so we negatively offset by half the contentWidth right: index + 1 === repeater.count ? parent.right: undefined left: index + 1 === repeater.count || index === 0 ? undefined: parent.left - leftMargin: (0.5 * itemSize) - 0.5 * contentWidth + leftMargin: Math.round((itemSize - contentWidth) * 0.5) } } } From ac0c7fd4d6b867dab9535f502c03e67abfead525 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 3 Sep 2019 11:27:11 +0200 Subject: [PATCH 071/158] Remove unused properties CURA-6598 --- .../qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/resources/qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml b/resources/qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml index cd2510163f..2aa80e8fe7 100644 --- a/resources/qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml +++ b/resources/qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml @@ -9,9 +9,7 @@ Popup implicitWidth: 400 property var dataModel: Cura.IntentCategoryModel {} - property int defaultMargin: 5 - property int checkmarkSize: 12 - property int buttonHeight: 25 + property int defaultMargin: UM.Theme.getSize("default_margin").width property color backgroundColor: UM.Theme.getColor("main_background") property color borderColor: UM.Theme.getColor("lining") From c41af1b9a02f74b6fef5a941ec64fc8e73aae964 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 3 Sep 2019 14:00:09 +0200 Subject: [PATCH 072/158] Remove user-visible XML tags These XML tags are outside of the i18n call and are therefore not removed by gettext. They should not be present there. --- cura/Settings/CuraContainerRegistry.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py index 314adeeb54..7059831fe4 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -314,9 +314,9 @@ class CuraContainerRegistry(ContainerRegistry): result = self._configureProfile(profile, profile_id, new_name, expected_machine_definition) if result is not None: return {"status": "error", "message": catalog.i18nc( - "@info:status Don't translate the XML tags or !", + "@info:status Don't translate the XML tag !", "Failed to import profile from {0}:", - file_name) + " " + result + ""} + file_name) + " " + result} return {"status": "ok", "message": catalog.i18nc("@info:status", "Successfully imported profile {0}", profile_or_list[0].getName())} From 5b48e133376ddf79f56881ea16d002b3c7be3175 Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Tue, 3 Sep 2019 14:25:10 +0200 Subject: [PATCH 073/158] Remove 'align face to bottom' from context-menu. part of CURA-6745 --- resources/qml/Actions.qml | 10 ---------- resources/qml/Menus/ContextMenu.qml | 1 - 2 files changed, 11 deletions(-) diff --git a/resources/qml/Actions.qml b/resources/qml/Actions.qml index 759d4e1785..7e6afa813d 100644 --- a/resources/qml/Actions.qml +++ b/resources/qml/Actions.qml @@ -26,7 +26,6 @@ Item property alias deleteSelection: deleteSelectionAction; property alias centerSelection: centerSelectionAction; - property alias bottomFaceSelection: bottomFaceSelectionAction; property alias multiplySelection: multiplySelectionAction; property alias deleteObject: deleteObjectAction; @@ -272,15 +271,6 @@ Item onTriggered: CuraActions.centerSelection(); } - Action - { - id: bottomFaceSelectionAction; - text: catalog.i18nc("@action:inmenu menubar:edit", "Align Selected Face To Bottom"); - enabled: UM.Controller.toolsEnabled && UM.Selection.hasFaceSelected; - // iconName: "NO-ICON-YET"; // TODO? - onTriggered: CuraActions.bottomFaceSelection(); - } - Action { id: multiplySelectionAction; diff --git a/resources/qml/Menus/ContextMenu.qml b/resources/qml/Menus/ContextMenu.qml index 5125c0c998..cb10d50ce8 100644 --- a/resources/qml/Menus/ContextMenu.qml +++ b/resources/qml/Menus/ContextMenu.qml @@ -20,7 +20,6 @@ Menu // Selection-related actions. MenuItem { action: Cura.Actions.centerSelection; } MenuItem { action: Cura.Actions.deleteSelection; } - MenuItem { action: Cura.Actions.bottomFaceSelection; } MenuItem { action: Cura.Actions.multiplySelection; } // Extruder selection - only visible if there is more than 1 extruder From 503a24f7a196262be9078892d7daedd5a444b725 Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Tue, 3 Sep 2019 15:08:41 +0200 Subject: [PATCH 074/158] Make magic value into funtion (max face-id). part of CURA-6745 --- cura/CuraActions.py | 2 +- plugins/SolidView/SolidView.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cura/CuraActions.py b/cura/CuraActions.py index 0f2878023d..9338521003 100644 --- a/cura/CuraActions.py +++ b/cura/CuraActions.py @@ -85,7 +85,7 @@ class CuraActions(QObject): original_node, face_id = selected_face meshdata = original_node.getMeshDataTransformed() - if not meshdata or face_id < 0 or face_id > 0x10001: + if not meshdata or face_id < 0 or face_id > Selection.endFaceSelectionId(): return rotation_point, face_normal = meshdata.getFacePlane(face_id) diff --git a/plugins/SolidView/SolidView.py b/plugins/SolidView/SolidView.py index 38bc5eada8..da18c328d1 100644 --- a/plugins/SolidView/SolidView.py +++ b/plugins/SolidView/SolidView.py @@ -140,9 +140,9 @@ class SolidView(View): 1.0 ] - # Color the currently selected face-id, 0x10001 is certain to be greater than the largest ID. + # Color the currently selected face-id. face = Selection.getSelectedFace() - uniforms["selected_face"] = 0x10001 if not face or node != face[0] else face[1] + uniforms["selected_face"] = Selection.endFaceSelectionId() if not face or node != face[0] else face[1] except ValueError: pass From 2f917c28416d8de48f78a7bae48ffba47f45f7c6 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 3 Sep 2019 15:38:41 +0200 Subject: [PATCH 075/158] Change definition ID upon reading profile Implements CURA-6713. --- cura/Settings/CuraContainerRegistry.py | 9 ++++----- plugins/CuraProfileReader/CuraProfileReader.py | 6 +++++- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py index 7059831fe4..c1a9ba9ead 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -241,12 +241,11 @@ class CuraContainerRegistry(ContainerRegistry): # And check if the profile_definition matches either one (showing error if not): if profile_definition != expected_machine_definition: - Logger.log("e", "Profile [%s] is for machine [%s] but the current active machine is [%s]. Will not import the profile", file_name, profile_definition, expected_machine_definition) - return { "status": "error", - "message": catalog.i18nc("@info:status Don't translate the XML tags !", "The machine defined in profile {0} ({1}) doesn't match with your current machine ({2}), could not import it.", file_name, profile_definition, expected_machine_definition)} + Logger.log("d", "Profile {file_name} is for machine {profile_definition}, but the current active machine is {expected_machine_definition}. Changing profile's definition.".format(file_name = file_name, profile_definition = profile_definition, expected_machine_definition = expected_machine_definition)) + global_profile.setMetaDataEntry("definition", expected_machine_definition) + for extruder_profile in extruder_profiles: + extruder_profile.setMetaDataEntry("definition", expected_machine_definition) - # Fix the global quality profile's definition field in case it's not correct - global_profile.setMetaDataEntry("definition", expected_machine_definition) quality_name = global_profile.getName() quality_type = global_profile.getMetaDataEntry("quality_type") diff --git a/plugins/CuraProfileReader/CuraProfileReader.py b/plugins/CuraProfileReader/CuraProfileReader.py index 92f2c31a8c..8ae7b7e0b0 100644 --- a/plugins/CuraProfileReader/CuraProfileReader.py +++ b/plugins/CuraProfileReader/CuraProfileReader.py @@ -4,11 +4,11 @@ import configparser from typing import List, Optional, Tuple -from UM.PluginRegistry import PluginRegistry from UM.Logger import Logger from UM.Settings.ContainerFormatError import ContainerFormatError from UM.Settings.InstanceContainer import InstanceContainer # The new profile to make. from cura.CuraApplication import CuraApplication +from cura.Machines.QualityManager import getMachineDefinitionIDForQualitySearch from cura.ReaderWriters.ProfileReader import ProfileReader import zipfile @@ -92,6 +92,10 @@ class CuraProfileReader(ProfileReader): except Exception as e: Logger.log("e", "Error while trying to parse profile: %s", str(e)) return None + + active_quality_definition = getMachineDefinitionIDForQualitySearch(CuraApplication.getInstance().getGlobalContainerStack().definition) + if profile.getMetaDataEntry("definition") != active_quality_definition: + profile.setMetaDataEntry("definition", active_quality_definition) return profile ## Upgrade a serialized profile to the current profile format. From 44db4216bcfa0b83dd464da9ad4d018fd6211600 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 3 Sep 2019 15:44:41 +0200 Subject: [PATCH 076/158] Rename to getEndFaceSelectionId() CURA-6745 --- cura/CuraActions.py | 2 +- plugins/SolidView/SolidView.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cura/CuraActions.py b/cura/CuraActions.py index 9338521003..1e992badc3 100644 --- a/cura/CuraActions.py +++ b/cura/CuraActions.py @@ -85,7 +85,7 @@ class CuraActions(QObject): original_node, face_id = selected_face meshdata = original_node.getMeshDataTransformed() - if not meshdata or face_id < 0 or face_id > Selection.endFaceSelectionId(): + if not meshdata or face_id < 0 or face_id > Selection.getEndFaceSelectionId(): return rotation_point, face_normal = meshdata.getFacePlane(face_id) diff --git a/plugins/SolidView/SolidView.py b/plugins/SolidView/SolidView.py index da18c328d1..3f70a3612d 100644 --- a/plugins/SolidView/SolidView.py +++ b/plugins/SolidView/SolidView.py @@ -142,7 +142,7 @@ class SolidView(View): # Color the currently selected face-id. face = Selection.getSelectedFace() - uniforms["selected_face"] = Selection.endFaceSelectionId() if not face or node != face[0] else face[1] + uniforms["selected_face"] = Selection.getEndFaceSelectionId() if not face or node != face[0] else face[1] except ValueError: pass From efbcdcc8ac41d91ef9ea0fc93f718725f82fb2b1 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 3 Sep 2019 15:47:18 +0200 Subject: [PATCH 077/158] Add None check in bottomFaceSelection() CURA-6745 --- cura/CuraActions.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/cura/CuraActions.py b/cura/CuraActions.py index 1e992badc3..8f60333261 100644 --- a/cura/CuraActions.py +++ b/cura/CuraActions.py @@ -3,7 +3,7 @@ from PyQt5.QtCore import QObject, QUrl from PyQt5.QtGui import QDesktopServices -from typing import List, cast +from typing import List, Optional, cast from UM.Event import CallFunctionEvent from UM.FlameProfiler import pyqtSlot @@ -94,12 +94,15 @@ class CuraActions(QObject): rotation_quaternion = Quaternion.rotationTo(face_normal_vector.normalized(), Vector(0.0, -1.0, 0.0)) operation = GroupedOperation() + current_node = None # type: Optional[SceneNode] for node in Selection.getAllSelectedObjects(): current_node = node parent_node = current_node.getParent() while parent_node and parent_node.callDecoration("isGroup"): current_node = parent_node parent_node = current_node.getParent() + if current_node is None: + return rotate_operation = RotateOperation(current_node, rotation_quaternion, rotation_point_vector) operation.addOperation(rotate_operation) From 70332978fde2883751765569a971a7f6ab68f684 Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Tue, 3 Sep 2019 15:48:31 +0200 Subject: [PATCH 078/158] Less cryptic max face-id. part of CURA-6745 --- cura/CuraActions.py | 2 +- plugins/SolidView/SolidView.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cura/CuraActions.py b/cura/CuraActions.py index 9338521003..ad359973c1 100644 --- a/cura/CuraActions.py +++ b/cura/CuraActions.py @@ -85,7 +85,7 @@ class CuraActions(QObject): original_node, face_id = selected_face meshdata = original_node.getMeshDataTransformed() - if not meshdata or face_id < 0 or face_id > Selection.endFaceSelectionId(): + if not meshdata or face_id < 0 or face_id > Selection.maxFaceSelectionId(): return rotation_point, face_normal = meshdata.getFacePlane(face_id) diff --git a/plugins/SolidView/SolidView.py b/plugins/SolidView/SolidView.py index da18c328d1..94691b637a 100644 --- a/plugins/SolidView/SolidView.py +++ b/plugins/SolidView/SolidView.py @@ -142,7 +142,7 @@ class SolidView(View): # Color the currently selected face-id. face = Selection.getSelectedFace() - uniforms["selected_face"] = Selection.endFaceSelectionId() if not face or node != face[0] else face[1] + uniforms["selected_face"] = (Selection.maxFaceSelectionId() + 1) if not face or node != face[0] else face[1] except ValueError: pass From a07e88125fe3c6a669663db1db292829b63c144a Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 3 Sep 2019 15:58:40 +0200 Subject: [PATCH 079/158] Fix typing CURA-6713 --- plugins/CuraProfileReader/CuraProfileReader.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/plugins/CuraProfileReader/CuraProfileReader.py b/plugins/CuraProfileReader/CuraProfileReader.py index 8ae7b7e0b0..5e2a4266c8 100644 --- a/plugins/CuraProfileReader/CuraProfileReader.py +++ b/plugins/CuraProfileReader/CuraProfileReader.py @@ -93,7 +93,11 @@ class CuraProfileReader(ProfileReader): Logger.log("e", "Error while trying to parse profile: %s", str(e)) return None - active_quality_definition = getMachineDefinitionIDForQualitySearch(CuraApplication.getInstance().getGlobalContainerStack().definition) + global_stack = CuraApplication.getInstance().getGlobalContainerStack() + if global_stack is None: + return None + + active_quality_definition = getMachineDefinitionIDForQualitySearch(global_stack.definition) if profile.getMetaDataEntry("definition") != active_quality_definition: profile.setMetaDataEntry("definition", active_quality_definition) return profile From 09dc2099569b65a82774a503b072ca812956acb1 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 3 Sep 2019 16:27:37 +0200 Subject: [PATCH 080/158] Fix regex in FlavorParser --- plugins/GCodeReader/FlavorParser.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/GCodeReader/FlavorParser.py b/plugins/GCodeReader/FlavorParser.py index 5a57618983..ec0f5d3ea3 100644 --- a/plugins/GCodeReader/FlavorParser.py +++ b/plugins/GCodeReader/FlavorParser.py @@ -68,7 +68,7 @@ class FlavorParser: if n < 0: return None n += len(code) - pattern = re.compile("[;\s]") + pattern = re.compile("[;\\s]") match = pattern.search(line, n) m = match.start() if match is not None else -1 try: From 05247961459191ed28655a457e0e11f57f97733d Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 3 Sep 2019 20:01:10 +0200 Subject: [PATCH 081/158] Do not trigger slicing if there's no slicable object CURA-6604 --- plugins/CuraEngineBackend/CuraEngineBackend.py | 13 +++++++++++++ plugins/GCodeReader/FlavorParser.py | 5 ----- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index 994966f9b7..ddf7864bb3 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -543,6 +543,15 @@ class CuraEngineBackend(QObject, Backend): if error.getErrorCode() == Arcus.ErrorCode.BindFailedError and self._start_slice_job is not None: self._start_slice_job.setIsCancelled(False) + # Check if there's any slicable object in the scene. + def hasSlicableObject(self) -> bool: + has_slicable = False + for node in DepthFirstIterator(self._scene.getRoot()): + if node.callDecoration("isSliceable"): + has_slicable = True + break + return has_slicable + ## Remove old layer data (if any) def _clearLayerData(self, build_plate_numbers: Set = None) -> None: # Clear out any old gcode @@ -561,6 +570,10 @@ class CuraEngineBackend(QObject, Backend): ## Convenient function: mark everything to slice, emit state and clear layer data def needsSlicing(self) -> None: + # CURA-6604: If there's no slicable object, do not (try to) trigger slice, which will clear all the current + # gcode. This can break Gcode file loading if it tries to remove it afterwards. + if not self.hasSlicableObject(): + return self.determineAutoSlicing() self.stopSlicing() self.markSliceAll() diff --git a/plugins/GCodeReader/FlavorParser.py b/plugins/GCodeReader/FlavorParser.py index ec0f5d3ea3..89812e7202 100644 --- a/plugins/GCodeReader/FlavorParser.py +++ b/plugins/GCodeReader/FlavorParser.py @@ -476,11 +476,6 @@ class FlavorParser: machine_depth = global_stack.getProperty("machine_depth", "value") scene_node.setPosition(Vector(-machine_width / 2, 0, machine_depth / 2)) - # Make sure that all seen extruders (if exist in the currently active machine) are enabled. - for extruder_nr in self._extruders_seen: - if str(extruder_nr) in global_stack.extruders: - CuraApplication.getInstance().getMachineManager().setExtruderEnabled(extruder_nr, True) - Logger.log("d", "GCode loading finished") if CuraApplication.getInstance().getPreferences().getValue("gcodereader/show_caution"): From 86d87acd5b9e0799f438a0f87f102355a806770b Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Tue, 3 Sep 2019 21:21:06 +0200 Subject: [PATCH 082/158] Filter out configurations for empty materials --- .../src/Models/Http/ClusterPrinterMaterialStationSlot.py | 7 ++++++- .../src/Models/Http/ClusterPrinterStatus.py | 3 ++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/plugins/UM3NetworkPrinting/src/Models/Http/ClusterPrinterMaterialStationSlot.py b/plugins/UM3NetworkPrinting/src/Models/Http/ClusterPrinterMaterialStationSlot.py index 2e6bb6e7a5..80deb1c9a8 100644 --- a/plugins/UM3NetworkPrinting/src/Models/Http/ClusterPrinterMaterialStationSlot.py +++ b/plugins/UM3NetworkPrinting/src/Models/Http/ClusterPrinterMaterialStationSlot.py @@ -1,5 +1,7 @@ # Copyright (c) 2019 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. +from typing import Optional + from .ClusterPrintCoreConfiguration import ClusterPrintCoreConfiguration @@ -10,8 +12,11 @@ class ClusterPrinterMaterialStationSlot(ClusterPrintCoreConfiguration): # \param slot_index: The index of the slot in the material station (ranging 0 to 5). # \param compatible: Whether the configuration is compatible with the print core. # \param material_remaining: How much material is remaining on the spool (between 0 and 1, or -1 for missing data). - def __init__(self, slot_index: int, compatible: bool, material_remaining: float, **kwargs): + # \param material_empty: Whether the material spool is too empty to be used. + def __init__(self, slot_index: int, compatible: bool, material_remaining: float, + material_empty: Optional[bool] = False, **kwargs): self.slot_index = slot_index self.compatible = compatible self.material_remaining = material_remaining + self.material_empty = material_empty super().__init__(**kwargs) diff --git a/plugins/UM3NetworkPrinting/src/Models/Http/ClusterPrinterStatus.py b/plugins/UM3NetworkPrinting/src/Models/Http/ClusterPrinterStatus.py index 986f9d5cfa..bf38d8798f 100644 --- a/plugins/UM3NetworkPrinting/src/Models/Http/ClusterPrinterStatus.py +++ b/plugins/UM3NetworkPrinting/src/Models/Http/ClusterPrinterStatus.py @@ -115,7 +115,8 @@ class ClusterPrinterStatus(BaseModel): # We filter out any slot that is not supported by the extruder index, print core type or if the material is empty. @staticmethod def _isSupportedConfiguration(slot: ClusterPrinterMaterialStationSlot, extruder_index: int) -> bool: - return slot.extruder_index == extruder_index and slot.compatible + print("_isSupportedConfiguration", slot.material_empty) + return slot.extruder_index == extruder_index and slot.compatible and not slot.material_empty ## Create an empty material slot with a fake empty material. @staticmethod From ed616789cbaf5226b6f36eeb26bed5f3237c28f2 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Tue, 3 Sep 2019 21:22:13 +0200 Subject: [PATCH 083/158] Remove debug print statement --- .../UM3NetworkPrinting/src/Models/Http/ClusterPrinterStatus.py | 1 - 1 file changed, 1 deletion(-) diff --git a/plugins/UM3NetworkPrinting/src/Models/Http/ClusterPrinterStatus.py b/plugins/UM3NetworkPrinting/src/Models/Http/ClusterPrinterStatus.py index bf38d8798f..2d2806050a 100644 --- a/plugins/UM3NetworkPrinting/src/Models/Http/ClusterPrinterStatus.py +++ b/plugins/UM3NetworkPrinting/src/Models/Http/ClusterPrinterStatus.py @@ -115,7 +115,6 @@ class ClusterPrinterStatus(BaseModel): # We filter out any slot that is not supported by the extruder index, print core type or if the material is empty. @staticmethod def _isSupportedConfiguration(slot: ClusterPrinterMaterialStationSlot, extruder_index: int) -> bool: - print("_isSupportedConfiguration", slot.material_empty) return slot.extruder_index == extruder_index and slot.compatible and not slot.material_empty ## Create an empty material slot with a fake empty material. From 6ed57838a9c35bb063b68bd609c6a5a452898aa9 Mon Sep 17 00:00:00 2001 From: "B. Perry" Date: Tue, 3 Sep 2019 14:02:52 -0600 Subject: [PATCH 084/158] Fixed PauseAtHeight.py to resume at starting height --- .../scripts/PauseAtHeight.py | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/plugins/PostProcessingPlugin/scripts/PauseAtHeight.py b/plugins/PostProcessingPlugin/scripts/PauseAtHeight.py index 45dc9a22ff..50d365da0b 100644 --- a/plugins/PostProcessingPlugin/scripts/PauseAtHeight.py +++ b/plugins/PostProcessingPlugin/scripts/PauseAtHeight.py @@ -265,7 +265,7 @@ class PauseAtHeight(Script): if not is_griffin: # Retraction - prepend_gcode += self.putValue(M = 83) + "\n" + prepend_gcode += self.putValue(M = 83) + " ; switch to relative E values for any needed retraction\n" if retraction_amount != 0: if firmware_retract: #Can't set the distance directly to what the user wants. We have to choose ourselves. retraction_count = 1 if control_temperatures else 3 #Retract more if we don't control the temperature. @@ -275,25 +275,25 @@ class PauseAtHeight(Script): prepend_gcode += self.putValue(G = 1, E = -retraction_amount, F = retraction_speed * 60) + "\n" # Move the head away - prepend_gcode += self.putValue(G = 1, Z = current_z + 1, F = 300) + "\n" + prepend_gcode += self.putValue(G = 1, Z = current_z + 1, F = 300) + " ; move up a millimeter to get out of the way\n" # This line should be ok prepend_gcode += self.putValue(G = 1, X = park_x, Y = park_y, F = 9000) + "\n" if current_z < 15: - prepend_gcode += self.putValue(G = 1, Z = 15, F = 300) + "\n" + prepend_gcode += self.putValue(G = 1, Z = 15, F = 300) + " ; too close to bed--move to at least 15mm\n" if control_temperatures: # Set extruder standby temperature - prepend_gcode += self.putValue(M = 104, S = standby_temperature) + "; standby temperature\n" + prepend_gcode += self.putValue(M = 104, S = standby_temperature) + " ; standby temperature\n" # Wait till the user continues printing - prepend_gcode += self.putValue(M = 0) + ";Do the actual pause\n" + prepend_gcode += self.putValue(M = 0) + " ; Do the actual pause\n" if not is_griffin: if control_temperatures: # Set extruder resume temperature - prepend_gcode += self.putValue(M = 109, S = int(target_temperature.get(current_t, 0))) + "; resume temperature\n" + prepend_gcode += self.putValue(M = 109, S = int(target_temperature.get(current_t, 0))) + " ; resume temperature\n" # Push the filament back, if retraction_amount != 0: @@ -309,8 +309,10 @@ class PauseAtHeight(Script): prepend_gcode += self.putValue(G = 1, E = -retraction_amount, F = retraction_speed * 60) + "\n" # Move the head back - prepend_gcode += self.putValue(G = 1, Z = current_z + 1, F = 300) + "\n" + if current_z < 15: + prepend_gcode += self.putValue(G = 1, Z = current_z + 1, F = 300) + "\n" prepend_gcode += self.putValue(G = 1, X = x, Y = y, F = 9000) + "\n" + prepend_gcode += self.putValue(G = 1, Z = current_z, F = 300) + " ; move back down to resume height\n" if retraction_amount != 0: if firmware_retract: #Can't set the distance directly to what the user wants. We have to choose ourselves. retraction_count = 1 if control_temperatures else 3 #Retract more if we don't control the temperature. @@ -319,7 +321,7 @@ class PauseAtHeight(Script): else: prepend_gcode += self.putValue(G = 1, E = retraction_amount, F = retraction_speed * 60) + "\n" prepend_gcode += self.putValue(G = 1, F = 9000) + "\n" - prepend_gcode += self.putValue(M = 82) + "\n" + prepend_gcode += self.putValue(M = 82) + " ; switch back to absolute E values\n" # reset extrude value to pre pause value prepend_gcode += self.putValue(G = 92, E = current_e) + "\n" From de7915688aa382bf0db1992539a7e93d84abe3f9 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 4 Sep 2019 09:16:22 +0200 Subject: [PATCH 085/158] Move profiles from pr-data to main Cura repository Don't look too deeply into this, please. Contributes to issue CURA-6742. --- resources/definitions/ultimaker_s3.def.json | 1 + .../ultimaker_s3_extruder_left.def.json | 1 + .../ultimaker_s3_extruder_right.def.json | 1 + resources/images/UltimakerS3backplate.png | Bin 0 -> 18196 bytes resources/meshes/ultimaker_s3_platform.obj | 1 + resources/quality/ultimaker_s3 | 1 + resources/variants/ultimaker_s3_aa0.25.inst.cfg | 1 + resources/variants/ultimaker_s3_aa0.8.inst.cfg | 1 + resources/variants/ultimaker_s3_aa04.inst.cfg | 1 + resources/variants/ultimaker_s3_bb0.8.inst.cfg | 1 + resources/variants/ultimaker_s3_bb04.inst.cfg | 1 + resources/variants/ultimaker_s3_cc06.inst.cfg | 1 + 12 files changed, 11 insertions(+) create mode 120000 resources/definitions/ultimaker_s3.def.json create mode 120000 resources/extruders/ultimaker_s3_extruder_left.def.json create mode 120000 resources/extruders/ultimaker_s3_extruder_right.def.json create mode 100644 resources/images/UltimakerS3backplate.png create mode 120000 resources/meshes/ultimaker_s3_platform.obj create mode 120000 resources/quality/ultimaker_s3 create mode 120000 resources/variants/ultimaker_s3_aa0.25.inst.cfg create mode 120000 resources/variants/ultimaker_s3_aa0.8.inst.cfg create mode 120000 resources/variants/ultimaker_s3_aa04.inst.cfg create mode 120000 resources/variants/ultimaker_s3_bb0.8.inst.cfg create mode 120000 resources/variants/ultimaker_s3_bb04.inst.cfg create mode 120000 resources/variants/ultimaker_s3_cc06.inst.cfg diff --git a/resources/definitions/ultimaker_s3.def.json b/resources/definitions/ultimaker_s3.def.json new file mode 120000 index 0000000000..bf3ab68f86 --- /dev/null +++ b/resources/definitions/ultimaker_s3.def.json @@ -0,0 +1 @@ +/home/ruben/Projects/cura-private-data/resources/definitions/ultimaker_s3.def.json \ No newline at end of file diff --git a/resources/extruders/ultimaker_s3_extruder_left.def.json b/resources/extruders/ultimaker_s3_extruder_left.def.json new file mode 120000 index 0000000000..831647c1d1 --- /dev/null +++ b/resources/extruders/ultimaker_s3_extruder_left.def.json @@ -0,0 +1 @@ +/home/ruben/Projects/cura-private-data/resources/extruders/ultimaker_s3_extruder_left.def.json \ No newline at end of file diff --git a/resources/extruders/ultimaker_s3_extruder_right.def.json b/resources/extruders/ultimaker_s3_extruder_right.def.json new file mode 120000 index 0000000000..bc70bbb2b4 --- /dev/null +++ b/resources/extruders/ultimaker_s3_extruder_right.def.json @@ -0,0 +1 @@ +/home/ruben/Projects/cura-private-data/resources/extruders/ultimaker_s3_extruder_right.def.json \ No newline at end of file diff --git a/resources/images/UltimakerS3backplate.png b/resources/images/UltimakerS3backplate.png new file mode 100644 index 0000000000000000000000000000000000000000..60897a30ec57875ae962266936231c8da9b7aee6 GIT binary patch literal 18196 zcmeIaXH-*d&@POR1r!w!DT07V@6wg3ASF}@ozSEN>C!t`Xi^_S4G2gVA%KJ)iqbpM z2@nwJgx&&#^6lXBuJ!#qKhIj{#ieOG`<{Dd?rUbQ8Ts@|L+Q>fx?4muB{5o?!+d6X6=;t$oTw%WO%DNoZ`!}LTbguk@S#r%~w}--4P>a zzWHwro}TW!vL#BYwWgWlm9Aq`CtVpCCW??>NgZU4vPP~GiwEzPZu$27IAh1}|3I z2I*vK-DRk2PdXkeG{s_g6rF#fybjqs(OVRYZk%8z+`B{SoGFc6=*3&_$NSib6@`sq zvbAFtJ2MNK@4ObWp39ZYU_MOR3CY}O%a8Z3lCa-HAv*#qSP!r1P(BTE$d_kt2VSPr z4&MD%(aH73Y$Nv*o8Cl zOLXPloC4R6{Dd1%+ijera@?b>=fWNoUVoHZk^TJR)oTWoxAt>Jzc4317X745NfpmO zqf(@9WIw49QO>w6SG zseT|V>dS%?7Og8}usEPA5U_hv6j<{mUSr|ORlyR#??|5i@=vkOF*^QNve(t-;jP!N zSf0J5X0Ui zhPGwo+f8k^qrXY{-t*JvrCrcq1%9p5GMznw=Cjy~M~4p26nU%S0(jovPWVmD{%1mB zsLME%YU8t=fFv!7RADgh`l65WmXTQHT)42utOx%}_YKtox@f&?ErR=E9G0lbdrBEp z@5Pf0nJIHENXujVQLeE|JoXEB5*8f2V#OHH<6ltCmhyVqc@COJF;ga2{8`#wZvIo9 zW0|Ftb2X#-Y2vTKAGOW;KLe3HB}LJQ#o!#fNluab*Ll8B{#!L}m!wn;rf9QsyG7P{ z$wiKQZjYz1!KOd{m72{8MmZ9CV!U;BDUo#>jO5-Qt zclN8*Q;R@k5y_9rE=NHU8vQL_tFMOBb! znJf0eb;{pVYRY?GFj`F69wYubGnIMs9#@(kuIs&BNyTd|Prqu~ulN_mA*7bG=PCH= zr5bdms;ct6K2JEEA5&9>7;XYAjQ`j2cZ;vU7X z)pHFyZE|vN%v(oOPp~MY=-Y{l^+uWG?g{xw$X0NU6cxx`f%udOm3v_y0HAlnLRIM{ zkvZXy^?j%c@XpP*%7$)4MEop-zgN8TWIcg5iQPf!3dHjy40j$r3qriONksIB2=wxW zj`!p`#^Yv`zd&)n|@7=!r`jh4MV>DP71wAt-lwo&EUp zfE9G2-N6={^vOz-7p`;(u@t+Nnb8=}dFAqo-pB9n5}w%q3eB3kcqljVXtNO{ z$M=!O@9)bree0`^G172U(7{q+*F_i!VbLFJ3jZ(wkI%Ud$j10uy=_V6bYbAMFk-KZ zjuD6R+T5|5_ey(vGX~WkKsEhfNA ze|;~~$~5#Y$+g1?a=eeBG&Ne92R6FcLyJdlI22j0+H4EMrHP1M1+o(4eP?<$Uk5(+4htItYpuucp9`7l zUzkg`rbI(XWO)i}k628g-z}&c|6N8zvN0I8_4$E&%ZvKf;eg#@it@8-RECt23Nya5 zTK|=_Smp0+83mEc9xm&{s)3HnaJ1W`lnRtR8C6j6tvXhSOBe~fhi168RoJ7g+SJgw zN7l-V*98@L=zPF80rwm-39HTd&tJkX_4Dd3LP)QKqDn~VQu_|tdP?&1 zi>;oaDttjf&@Wko3u$3L&+zYNLtPt*<}f@$TzwOz2;-luQb$0wsXs_5<_&8Mca+q_ zB&jZ?Ew=qD?EJ)2vHXM~hg+j+o2v1oC9zQ|$bx^TJ=$#xR=*XM7+s~Pppy0r*z3Gn zxm|0xBQ#!XlZn{b*{K{e*~{*n1c8gtFst1Ka5vTFQDdl> zvmVI{yyq6woQV2~h!8gpPwX~4vWd0nAowfMk8k9cXQQm_q?4LT0XCri!t~ohEo)y! z>tfd;KPC_-O~=S!BK-X!Bf2ho8CN@tiI=Kvbe(ei=G^G5elUJjc(^gh_oV;vK#*kK zK1Za?FEy^bCS`>kd>0eRn3SLhRhOugPpiz=Rsw~qc2C_kagC0REp2O9aQO!xFMBqe_rPvJV&V|MW3t$<6X2Hcdb;dQD0K1SnOIhm4Qm*RDRiqs7GT-D%LlfxaT|xr{moa z%VjJmP730~(@hqkfPuh=54 zJM~Y~yO}2-K!-hUCH$xor4yOU>kTCTqT9o%44x8$5$sx;5(%|$v&l)av%jTbKh=jq zPKiv#z!^iELG#NmnD?3AxP;D!u?3+?K8rpANj6YiqX|l)QG~S0L3r_UlSD~Zg)edW zH?7!hvjos;Eo{ug;H46JwIYfqr$9+sWv&D@CE1xQ|tu;34szxyF_1HvJhVIKBJuRHAYfnlESM=9yb7K@LpqV&O-9OuSZ8;4a8DK@X3|Rj(O|V8QY2VtDeryHX?13O& zgDylayw&jhHj)HX=ivSuFdnUL&#`F67#`Y-Ne)l5tu{xe-GWPN?CweMi3cBj)46YB zWjMCEEa0}f4TKWhp{8blpCIu**_gdxyO}Vu0K`2hW!8qdXfm&xv`!TOIkLBrS9p!{ ztMj|<8pGsz#o()XDurmhNAls!(2GWwp2M90@%1+cb*5JjvI^R0gG|8d3vNDf5$Uk= zMm5~WknMQER=$h~i(^fvpK|s159%z*vlU){9_0+T;2~%Ga)^ofkL3@_b0#bIA9CT zh-&8x^8l0Ha+i3G0ZYC3ulScBh|%I1Nq8+fL)|?JZ2z z<^gML=p5IVkD~8epVrVw0{iYRw6>1IL_~xh`y_<1iVqhW=BG<~@q4cW3M=R>P7jV{ zz3z1}em1OaX1a3y?Bjt7$(#+FHS7E2x)v?6hAGkfupu&h~&1)i|tf zgRXbP$BLmf&d$B{Rawm8hL>evIhkS{0zwyDY$a02+%cbNFct_(`KiKVK4mc`D=cZ2E?x2O^so)! z3$wM)(F1}=H`Yq4!z0@HJlI&Zmds^V^d;;sV*KDu9{J^eb3bwTm0uTK^2quhf3k;? zm7NckAT!%g)Yc4&X=`^@9JyTWbMB#_b()duC4EW^C@D2J0-nx*bSQwQGZzkZ!TxN5 zOmnp@sAV6w87v%60VfN^W(}C0tWtZd$P_1mg;bvlGDDlhH zoLp`=XTPF@HNaP@*+lj21m56uid%O#kjtK3k#03Vy1#8Q_96(X?%8?`(cU zN5Oh2D4J?bXeS+f;+?VV40EqZa|KqV0&&36C$vbiRCH`_^cCrgMlL8CFM=vpG*ej> zxUqIX;l&0DOPYTlPu|P}c;7Q|{_0T&n79#QjE612v++BB`_U5ld{ylsNveqn0iJ%` z`p@Zr$mMeMsnUbPWY~exC!;_oUdJ98?y+}fO)|GA*j{ZX_UT;5Lsnbtjgz8H_>LoU zaMr@PA!y5?;9r$W&u`aJ`Dm$AOV`p=!%E`U{*RoXo}Nk8Oo<5t(#G319B;;j7(}m% z2XF5dgP%QGEqUyGR-P-VQSr`!mae2DC0f9JfLBjt)lwnjV%(G$;{+XuHatYJD+v2- z4hHz#{Oqn1u1KvM1_hKICtb#50UBQ`5<4r|O0!JsZn&mQ2I ztpSJYA~4(d9Prr8NWt@RxO7pPt5n{FI8|F1;Jlbg$MhR(@&lg)8@YnF%c)4Za^y$^ z5?Nz+#z;fO16h1dW>x)5-H~fAHpw9Bxj|*7HwB$;GCL%oExpAF!J(VwZ@KcE#(0Rr z$N3ihS2Ag?)}t8mW&u8rw!Za3!FHTs8B-c0!uJK>ydKnlcr1Hoa$=xgJh$IV2kUpF zG&p{d*}qnY{`mTn;CX(?_8NdiXnSd~QuHrp01AcWqqf#}-{14XIa4X@yiY4&zo_f+ z+qVTiLdr!!}kPiT~`1f#I0ZYHTu`wzzy6E;j zi=>V9(cZnRxWQxR`?Xf=pl@*7@e-3LM#6EhkTLtK>>p=9WIsrpa*D6dlB&H$)g74| zI>2rls@PuPfgQ`p^!j2Nqy~6hD0!f%YIWGIe>Oaw9=R?J=!^-zb)7ym)QraRkXqR9 z^p*(7jAV{VuxDmi)}VAy-Ug12?^`b>Z~lF~gIqv;)JD)@6TO}?84PV9-`@Z#x zTi(*(Iy-m|UsWs!0pgt|9HnGt2VG8hi{9~I4jymiZA1Zn(tVSKtCmiQPL|H{&`H=Y z-*>;^Gim_ObG-gc+m!)Sk~OI1h%OJgLa1b)-u-Ku=UsOkGtx~~U{=VB*DoRxBMvvG z0YlXKzpqW(aE2LkMl2Y}u)Gte4S zF|n|pQ}~WL^w5%L;yNRPrGI3>e%txapRr6S@Y-0EMag(d`U4ApEO0I$V3i<0bLh!7 zU0uCW82Rk)jFXWa#+!jQ+(YNtoabMSiYh}D74K_Gs{57JeM5i&tSbnn6$l4nMo&e^ zi!g>iE`m_!gN2J}pn5_Am4s5a_A{Iw@_2!E9xG2$YIKeq*lZ4*h!0g#6sc|Hi2!y? zRP^9)O7&&Ie=`WC>IQPqEU6zH`L(14B-H|L0lC@AboBICkjp_F1xP}7^Ee{#dCblb z`8)yOaRS2`fHyrSnag8axxrzR*geYJn)xTjn^Ra)7>cg6cNAD%SiO(S9`)HZR_VIX z2VgorK^57e6R`!);Y z&Fv}H$xYubL_N)+b+$u=Y_@js?!HO7LAVcdk)|30L2n#-*WLTrK8=3>j(RLq(3IKM zgyuz@;kF&Z6VUeYprxWDZWFM~csnni4^*)7o{B|fmWh!DxgMccbo}RWEntrdTkB+g zui8|0gg^&AbOG@pj!+R8tn^&DEbxhnAg+8}jSC&~GXW2vho|K8dDP7Vh1XQ&)6nxD z(VCg{=Yj$9Y1L6iB(Vb85J=f_kGojIIYl{n^U{0Yv#8NPX275J{;W&y46j*W8y3#3 zy)KUAEZeIbr(z)O1US7VXlemnF0Fc+ijI_vO0G)nWAe;25zT4zsnF-Kso)8v#X=81 z@4oERo%I)FAqJ#-LiV2uZ#*=8Ut2BRnaLBp9YH$}QKi=C(Z+@dMlwAi%~R1saexBb z0nSDTgo`LbC4{SSVTe+&*t z0FgODX=fkE9kq?p4Ujj#irVQzK@aI{Yx7|knWG*xp(U}KK6Exk4xQ>^tv$W5yzJKD)DrQ6r5w=OO=`L(rMdSodZ z+$~K6^e8Sp>hXW-pq81wE;DoRs|$L_>m^|SN;BEN3)((=(&t<<87hqANO4!3v9o<+ z<-s;6Ks)1YNHQnaw<$XF9XOp&@g{YlFq%^H)3?yJoKpW z&@^n5L+Em$AE$rIBO(~o=0-bg)Yj!da9B9wP$Xb3NnkjFg9yip8!;}Y%yqvwE0b`x zLfVMX_aTc!@h6>~;q2_}Dkih%KYc}mw_)V-lD+F7ll!A8TmcePZNxmIYfXI6ACNCH ziBC`$zLjCok86Xbv`=XGoP?BMXhW!{UhGNhynIx0u8#l9p#~+4IvpLu=*T99V<{~o z?gha)mgN5uTTm)jSytiUk5hgqXuNcQNiv`4h$(nzAyByk^2QK$efa382EYLOEQXj~ z6E}{V)A*^P{5%j*L9OR{!a%^?(xloeOVGTkrNG6WfD@;!TJm`@PzcIwsA5-^*c`gt z#yj;Is<~2vIqdf}g2TB$l4xKsxt`S>oOvr6|!~T+S%C0zPpqNz$ zE0D4OaufDb>@6qz7P%0O3d-u-!+pbCs~Z8XVA!LArcPGc_f^QpEzfVB=hb??!Ee(d zIYv)3>VyW;0=N#G%)Cioz|QQ8Toz1H10H2l_K`O~4|lO2Kdao6;QhAjqY@NfZPa4a zdiA07SgI;#(3eP|550`iUR$=_4r=ji4N8Orr>A`VBZj?bxjm&?|J$fDZ^@@+CUM{c zfpEjaE5g_|>MLGLK7sJ*ttxUJ*MLGJh}Wy3p9&tqP`4on0^nHVfsD0~pGis(DQuAx z@YQ8u8)6rLZS>GtPgnprB!gi;Pkx^?8$$)=)}V&1M)@t6pXTO#F?jV6<4|EhUSJZz z#0G+wTp7{xArJ=w<+oL0lIeXkOE!Xyt!(Zm6EuCaI^x;mfrEgx{8@{1&TG==sZ*a~ zonY|nv<#2_VG$Xb#x=_=q^jgaVy>c!t!Aa(Sqxt4%9Eh&!O-i)Md|*oyZiE7dBf9Z zHh$l)RTS(SdSUFS8@=~N7Su@_N@Rq5r`1FD^stO@ZrA~EK)F_PHP-H1N(H^K!VVN< z9~HqHP=09(V%m8|XZg8Q=-UmW4(Cif5qt7c9v-P89?miofs4lZCqOMcfc&D`yDsbH zbKx&a)mCYkw>uum0LeH?8KyacOA7{X4>3-Uc-`mPP*eC`ZB*p(FRPfYeLyvQ%2A09 zmu?5W;A-`b%Z*1pSOOxXr0rQ@b!*DT8!kUo1o}G#wfi&?aQ_-zgUPK(r3XmIZ$C&DsTTM?L7VHvFmSspaP)M z$4L3i&ya=+7`@dziO$L4rjGln&UI#@S9lr=MD~hTh(-ej_FwXyf$ehM`dSq-e1!%0 zEX|F{%CBKpCf5eYP7k-MGSBSA)6RxXfL4SbfWrE{>#Nkwu^#)F5HuI?`upZdAfj|Y z0JSb;;h!l%P7>-S+EKuHWN77gZX;a(RnHEcGgN7F;zM z_PgY`26z-2MIZ_KJn+;$J^Y<#I8+!ueu=$EPqelZUNTkXI2o7_`XI;1v#s<_1AQkdU10ghBNF-(`A7a z;=bj>t&_S4i#pDT+2S#~$j#3HS8m@JX2ZJrqjx_GNHnZr<>d2+K(LiSm=&R4WmH>` z>|LA9i=L{oodtNuy4o!!)pG;5PHsKN7U@q`oMm-GnB1sv|1W?``<+hUN)7(&CA{^= ztlHv9^3Mv`1QFWZGriGhuhdhZyA$Zjnw1Q<+ zGp@@OFsWJ1W^(twn(hFVecac-&sT3;JqP3GG%;RE%j(S zEOwC1BOflEmxcu*RJL-PC?MA?br4U=2V*?7a>lIl#r_BaCi04@Zl;%!UXFIt%3r~YB(Z(x*TWM)(C0+Baw*d`2xA{w65b3F@oUa14m`%(xGceY%1_-c%rUtoNp((d_=lZMV*-AqMTcSr9WpYl(NlcEOk3Zcj063uk~a4$ zyUOfO>5{Sfra47xHM6jYKiw*MC-AmeVkDX6x;+a;eUR@ODNx^dg^-JR`a{CDKLe*V zSf%o$!KXQ|4=}Z+vrX2NMLVo*2KU`)bY{Mi1K8HPn7HQzd?qT+o$udtHq4p7zMp(g z-F@bNW&tJ-H>Nyras9h7no@hU@Hz;_ysMA>slKd0mq*H~pkb29u*a_P$%~@VdJ#Rl zAg^MR$7Cq(DGp#UNdf8*d%KRt%&INw1sDY2xYhbGq#HT{DeUvR-YBN z{IpRI>7q#D0wHmU&uxq$b#2N~UOmytZK!PYAlo(4sDAd(du z6=BB5w0^qxiH^IwH=hj;UufNLy8{qyte8B2(5 zq@LivnZ%chZYlg}HUa_3TuNmjN)m?{i*a*}pFqe|>o7@Loxu zhO<^}(7?#j?iN&{atxF7n?Qqh?VaiaOmzA~XJ~;QcjW=;Sv}{^@(U;sn?*OU8-eS< zdPFfF|64Gjy`w{SY2Tek;0^0T{csnzs2yooxl=a?h-I7+JAfXyZ(yJ>kamv<1g(97 zml~K|8OrjE5l#kT(_kd`L%pzBM_ukwQmey2?G&81D%*+_v>}2LSmT|iOa}!aPa=B$ z00ShrNuHs&c2)kY_fN=zI<={MiVjkNIMlmdh)GBVpIF63kOAq+h2OgV4fU;=27i4X zj8>su)7#$Mb1B|K2hVCCYL}sAhXOHY`#K8)JQ4m`nfApC5M{y&26TVZ4WhgS1s@x4 z8XP0^7?_tchfcB~zCB87exQ(%kyyPuVOQB7E!f!7YdX^B_JC<$nMtxS$toV72LOs7xB_p6II5o!=P=c}4*7`bXC$?K(`P)8qdLCHx$4#!k z-RXDb59sNK=XCl{3sLso?rI!hJ48?!<0$4Fll}xzPJAJMTj0C7ex*@#B$5}^-W!~ zo%X`qX~}2I$M8Hon{x(WGx3&uag1uIpC?8KpNT~~Vo}(B$v~DKZrM2SpwrpHE>nNG z!?H@d)S^#0d7!K9txE#z>CV6ZVFw7xrV*GZB_Ixr2y`3&^AvQ8xjnLP-Pm_@r-n8C zp!VSLQg0CCbd||l&yP!1gU=Nce z0D*?`{}{1+2d1j?u&x><*Q+zy)$L(3et`DhX`4j4dBQf@5s<`PxtYcL`!#_L?zviZ z697e}nV29)QVL}5dAWES8U0mwPX}vqh-7au_v*w=cQ1_oeOFu+6P;~kDnBw58b9a# zQobx)lAy@Pw}OEOBBEF9tBv?N{uZ^=l$tt@16xrhjc76Rf(dh%`JEu!=WX?miqi6x_Bh;vZG%JK85@Vo?KqtQ=ZWTZry^o4}2K-2C+5 zvN8Y8b@iv!#DU?K%w}C~4?ju`wvUl)ob~uNsB)xL4>*ivR4EzrNZ)#wdvoIa<^{lU zGeHx(Wh;cYnAyhj2emdZ4X7NM7@t4)!U-Yj?PH6}mexCK8x8P3d-M;`GY7jXu+=(j z3DzWU`T(;vTex-pn;64E*C!(CVxnnTwfZMgQl=`X?EEW`CipN1(*O*J{I0)sEglz< zT_aYc1C@Bzs9X{kr+U*WcKLgz<3JM&tEVyZ#k*E&aql!Ow0V&%6zk09O?K@3kP_#AlP)Ar&d)=+^ z4{z{zD7oo~NzmInUS+^dg`&PfIVeehd;Y%mcc#NYeaHx|)!C~oHPrt7dx?#2T75lI zu}@S+W@gU~v z0p!zqakbPpk)6GSoflZ+$IS?~X#ld{jRw~XkCi3VnWcT{)%>KNT(+)PggD@m>n)$X z#eDj>p~PQ~god*Rj2xU`U!Ac-j2%YLZF1il2M}3!o1EqOVvA@32{`wifzJ-9Ws~(F~ z00jbYQqN6zi?(1x4LHVS>5%1e;ATX>DKfkM4h#4`O$)P(t~*GZU9bB{%-45swZXix zm8r>O@@e@&jR2OZxZ_R>eRcOb*M1#X5}1d19knwA%^BQjxw|>Ez4Sd~3r^10S`2L; zmnYnK`-csi9N|eZKalXKo4*G znygB515FZua<>(utJEL`sgQ1lF<>zr`wfs;?M9Vl18XX}Ha#g5d{R@eZv*4*p=u`#6-#+4FWk~ zEszsp`0WY+8d`m0M%s+N<8CRg3gE3O1Eis;sS|xat^-Q>l3>tG7%(vina+zQUAHAI zZa<%<5>{7BaJ%QA_o;_o6*gw}=^d&Ws$;_o0Kt!`IBBdV zfw?biH~18d*6|KNf&jA6GU|e@b^8RG^BOZ_FV8aN8`!Wh-a<2-d^yabvh$NLo%Vx! zz62nF8;}05N%vVNn+ zADaAzdUm^w1}iyxapi^LvFt>KI~c@MCAXYz)8pvn>@Lz?!vu7=2FiIEr8ezXBVu0x znMg{+A0y4xAWujVT$-)5M%1}d%pEco;4>3H1~kE!5qb^iHx*}ZLsd_@$D1@b2zlL) z4j;nW4fFgyaU%6T6*j`h(t(L;V{Iu_Jtbh#zPeCGh&?jD5QxgC z&j8+!mdVr6J;0hQ_FC~Hg>1&kzJ-*_P&*k7E*5GRdF*rUEER(T{8Wzbktr^wf6N$C z$&@{-+&vvC2BUdAk{klx8dSQKt1O<>kJ7>1AKbaC!M(gGQXUnL{l@w% zuVfe>^yT;tS!#|a>YLVDIX(f7VVdj#SDV#tZ8dA`(89rZWHl#2XJlvp5?F3?^|zp1 z)`7gNIIUVWFbvM6d`qxf?iJEji0!(j3Ny&|a3Yjx{g|#dV~7T5ZagyF%aS$!ZnOUm zZpWtP4~G|*R+Z2H)T%bv{Zni{C#WiWqn3ZNu95@aXjb8vwkhrXH7vTk+)|@bPjbjX z9|Bi}|UJZxKsUXQTQdEU7r(K$$P3{G< z#__%eGpC0S1{*)!Y}X-d8Oc=l7p)I#2KrT-E}BR|ZCXf86EJfhO5arz8#lCU8Rcgg zC34HRe*s_;y&h~mSKplY{>So1{&&F*Or@$qoOs@1E%9FcFQAI6%!$O7Ix}h)CE{vI zi%&mN6KY)KV9ii(KdIndWr^CfUAZV0{(v0x8)JZ2cG{}=%=EBMpJ_^RXPM@<^J!d) zwZO)gaHS5~+0PLcazkFIwQ7Z-bIm}NmYkeja*^%bB*g~rKp*#ahpiw(2UvtB#nXzKthMdIZV~7w^TaM%mLroy|bMtd?Uc=CX zK1=RhsJNzKg_T61en6)Qn7iVFGE*nON=HoG*5C8z&GEj>qlK%bnq(rSULG3SGY2h9 z1UZfxFOR3zuAcn}rb&+Vowa$sO}d-L%_8g6Nw)xy-Mm|o7Vn;+iQQtz8Vd^@9on;3 zVnj(vw8BU2ATF-fa9LH?Y`C|#H=`c|n zu(9h%vJ5p|c4s-y7GUJGGn?MdE0~EO@0iFgm>-IC1t|_uVMLNSE@qupgA7PyF)t|K zK$~P`2L>>NU%`k#ACJ4dAcBs5+$K!ReNh59H>&gKvnQkr_iSt^>cFmr%5;oqx#C|* zDT&)YZ-vu$zG|!J<~8dFuI}P(D6q`PaD8*n`bBH30Ip_zreq!q;-VVWL+;cN5(>(P zhLwi}3R=c!brYbe4HPWBkYlbQ7h}-oWv$paO*r;t*_qF#O-gd-z6)lDDA;=iZ7iDe zn|O@sE`GaDX%|c9P;9IoKLpG#G?a2&btDmpFlP)JXuM#( z#zbqQ6N7GJI_^|r1&M2Jp1t7S?b5kFzW-(7fH~MK!tk&Jn&V;@maecFsH%0J3Fe*~ zNxxq~?oigbSM4dx5~vWGRBUBQdNTkJz&u1om9VcBD%`@wqt$+mnDpre2&_vb2~;{} z2Vz)%wayj54G`h(J3ogb`sK*5Du+9qJ1&mQqPnUEJj1Q6F}tI7hp#`DNW}YbkEzT) z0D>jeCL0;UJTTf2gyf7M^H#}B8d)npinokvqO%M9^?SRw zSERwFn)gQHs^lJEK@Kj@w{MKqH^ggmjJpPmtORC!;41L1ciB$89bp=qJqsqR^6KT} zNDm$@Twa+|h<@F_(z}hGxS*ar|1?xkC9%y{E5pU65c0sR4e_j_=OZ6cOsgm0K1Lv9 z0fRoX4kE?qHwj*Fvb2D*EC;f(khO2V^n?s$?Dk~@e@+HakTRTwgPSgfc_({mRmP`j zFcF`YI}(UeP3DP+QtXU_$TwiRfxI`c=3~p0MpEy_Pt-q|Q7U3R18OMG4eo#-vrVgb zI2UPFf=kM@oBZ(_m71jII=~6igSFhnD#e1eHI0J0xAeIK1`PVWjS$~}T${ge#kzL9 zbpQ6e&n6srZ41zf;}KFpVWe+TXJrrMt3M$~-tw!NDOk#_n zHb4tIy%-F?$-JNJ!Ar{CSMrZ`3GRJYy5w;f0RhVHWl~&1|1U__Sx_xrw$f(;F4Pb> zKT&lD5_H^$j$x1#sr9S=HrgH0r|2w3#}P&gbgC?cBy-X&rSqEHZ~_$`a>5OpiKWKp zq@vn=J)%>R#V}pJWc=~nczfqAM&2jFhLzyPsyKHQM^DW|!mP~a>5Hls*AvzTz5H?g zqRIk(4_+!YZAz5KLdM6c*Kdw=p`J^28>M?DvxL;-_keRo>ggWf5-zwY-?t?+!L&iO zqjrsN1rKf+`u~2P0_Y^nDdY2W8n~_>(=>eGP2DUIOwJFS#V!cqj)Lj!p62V&orOfk zA8Pp>(rXpFYy&p4pkw08{mcEWdiKZq;_;qlPwICPfc%v2FhvB_whaf&92RzW#$yW0 z|L|0ggc*hVokdl5%NZyGQ>@WU$`W~)kCE9&&w-AGp(OEj_zhy>Ls`euwXRc{DU}T6XsW7SF2Am>v2HYDFA~4d6R(pdJ(_LmWn?xR zA*K8)>FqkaBK=zD!d~dg`KcZp27)3hrE#B;v1#NcW4^YY=tG;#vrb>bWS(D@sdsAe z^kWFf1veU23SEZj_O2Iaw6dk#Fg;dLS6?^%o>XY1CC=}9e3TH8-c4nh)X;>5hz4hB z>mBFRkNP&`%9CvgfPXDy9CyqB9?}NXD{Iz|vU689xp(WihZ9HbHq3EnT^7Ko4GbL= zv_0v6=qqr%&~g~8s8 z>RtOgUM{N&E(p{`&pKO*|NF&3b=Z`{A9uT(@z=$0sHu<1*0+4uZ8@-n3H_wE8DrxG zAEQI3MV+M>mG1$3;~(M2AG596u68*jgErlMlEP~9{Z4=V1nP5OfE=|c<7y>#Q%W2n zlJ~Xn9&4@LSi#t|uwWKlMRl-nKSnJ8y2pNNxjlEli2E>@T%12p&9`$0=AIw&HeU}8 z%nFNEent-15LXj#!kHwNZ5^fGdc7%W0jP^ekLYp;)BNT-5COv8XU*9!-&^5`V96M=iOBYzJzp){!dxV8mh=cT zol*#xmcUWketLmRyMwB>u~Ej~lJ52gJ|qQcdhh3WEGFvrk5yhn7IWaH%l-&*r+xb5 z%27c*>`WL14m5wWl1l#P3CsRa>gLaYhZdfiWpC}7rBTGXw*Z1kgg$xz0Bk27mLQ-v zdk(M+nx6(UETEeF_Pz2^rTYtJi8^c7PDcJAt073uN%OZ%y9ZCxAJ<97Pn1w^o{vfm zRM+A+$Uez~a49BS9ceo^dB3yIUQaNqG{R5eH>H99k<-!#V;mjzi$lYKjsZ^3{`pYy zq_hmxMUbBtjRi!PnCP_WP)0cTy@2%~%}XsZxfh4#n$pSwAyl{)Nw1O@TozFFHz6Mq zK3Hkl2CFay8b@ySJ{xYZQR5N0Eq5m|n{%Zl7tD16rWD=s=s#JRvwO_8nl9{S6FN)Q z-x4^1Ep9lEJXrpGF=Lu#PamZl;9x1GWB-$v21@h->4M z$9J8MBh|UUxyprp=03K$;aBM0wCYM1{9nBEYc+Rpn5|jjIsTQ!vDN)7$l}({nzoAb zCh^As$IPj-BpScn-Jv&mqpogU$J!KHV$i!nHbD4Z)dJYrccMa!(Tv=A#t>D*@bHf6 z{kEz@+~g!5qSAEXbxR3|Y~1Luk~%D^z1?fi+rKQSygK2eFWlfjoy=rBefr?+!PK&6 z)4B4lAz~3*IhHpOE*>Jf2Snc##_K>fXaFI0>t7x!4JhM z;NeF~oX?!75x^e!7X2uSX0z+J@NTF^S^KGyS~QK{rniW1%|cg)5kgil2#^<{b_E~- z#(wP%edQB~W)yf9R6cfchVYKAOu(vgB{R_STTz5XBPzW`mb;XU?3;w>(%8d_6Ttk1 zmAo1`eT`U+E#i-nF$>c>Z}#8zA5ZIH)3bpb%R%=Rz^;_tZO@r=w&Maw_pJ$)ab5d{ z!V%X#ZxR1j39siNrgVs?uojdGmwv@qASx?48C+tII5Qo2419^nuFwooIa9aR4wfjv z){(8J%(_id94^x2B^0T0nH5(CDgl~!hfutfzU%$mAHKW4E-Eq;UT(TGhy9-iEC?JoetqNBJP=c{qIHfO=#^QBbdWEEJYl;JkC zWDEZ@O>Zz0rP^ZeNt2Rrr-X~LpHC_9c7e5a;AkM%EgjM^~rvZ!gx91G9P`Eh0Z0(mWXw1jf2?LT& zPc&!@8Z|T}xwf3Qh1kEOsOt6=@i)g$Zx(@7I=oCSN?I-`AGU>sL;PySPFliOShB-^ z1px+@u5}!ro+;THhz{3B_=?Y1LffHSFa9*^X5WDHc#E7`@*S)v z3^llT+iw@d$cdj*QH0qc#FIV?7z6I*FeSRYx(5(52x*Dv&|NFGU8}`B?JnCq<8+Sr zc-8*o_BlsP=5cYcPd-rgq}(H%uBQ=6$%?g%{7>r(7EV{AM^X1FFj=s@XU{ZeAoeEr z1T$>1d+9>^5L-4(o$;r0Qt{lTFW{PXU<4KNMAS@|%Enqn~3g!&56yTa{xK#-X7oj2ZQ zFQ=;moN!y&3FCR;FCsYsWJmz}VtsK1qrOUx8wFfLYPtIc_L!p|+mMTUT<6RFpAH9L zd*en$OcCM9^l=AqV4A|MY#tBp4ZaOjmSSrx%VW>=4B4v6L-X;2Qrg~Lhf+2i0)b{} zB(~?uF~T-`i`1K0nWYrWk_8RK93S)GW%_axGz>8Q0P3O6dl^v6OcGCw>pc#99QOyp zYc}BX410T}n?`t#muf~YRVjo`#y6r8V$#~ZM_@rClgL>BaLec}ao|OiQj4ro>+!(D z%<|<&3X{1rm|hoC)8ICyk;~BmvQJ;%a$8Hs%x#Q0 zn?wdGwl>flYQ1SNnJG+vg-nSc2I06>rrdjJ3c literal 0 HcmV?d00001 diff --git a/resources/meshes/ultimaker_s3_platform.obj b/resources/meshes/ultimaker_s3_platform.obj new file mode 120000 index 0000000000..0456797955 --- /dev/null +++ b/resources/meshes/ultimaker_s3_platform.obj @@ -0,0 +1 @@ +/home/ruben/Projects/cura-private-data/resources/meshes/ultimaker_s3_platform.obj \ No newline at end of file diff --git a/resources/quality/ultimaker_s3 b/resources/quality/ultimaker_s3 new file mode 120000 index 0000000000..f2a52666c7 --- /dev/null +++ b/resources/quality/ultimaker_s3 @@ -0,0 +1 @@ +/home/ruben/Projects/cura-private-data/resources/quality/ultimaker_s3 \ No newline at end of file diff --git a/resources/variants/ultimaker_s3_aa0.25.inst.cfg b/resources/variants/ultimaker_s3_aa0.25.inst.cfg new file mode 120000 index 0000000000..781ec8859a --- /dev/null +++ b/resources/variants/ultimaker_s3_aa0.25.inst.cfg @@ -0,0 +1 @@ +/home/ruben/Projects/cura-private-data/resources/variants/ultimaker_s3_aa0.25.inst.cfg \ No newline at end of file diff --git a/resources/variants/ultimaker_s3_aa0.8.inst.cfg b/resources/variants/ultimaker_s3_aa0.8.inst.cfg new file mode 120000 index 0000000000..05d969096a --- /dev/null +++ b/resources/variants/ultimaker_s3_aa0.8.inst.cfg @@ -0,0 +1 @@ +/home/ruben/Projects/cura-private-data/resources/variants/ultimaker_s3_aa0.8.inst.cfg \ No newline at end of file diff --git a/resources/variants/ultimaker_s3_aa04.inst.cfg b/resources/variants/ultimaker_s3_aa04.inst.cfg new file mode 120000 index 0000000000..ea67c735cf --- /dev/null +++ b/resources/variants/ultimaker_s3_aa04.inst.cfg @@ -0,0 +1 @@ +/home/ruben/Projects/cura-private-data/resources/variants/ultimaker_s3_aa04.inst.cfg \ No newline at end of file diff --git a/resources/variants/ultimaker_s3_bb0.8.inst.cfg b/resources/variants/ultimaker_s3_bb0.8.inst.cfg new file mode 120000 index 0000000000..d9cc34e168 --- /dev/null +++ b/resources/variants/ultimaker_s3_bb0.8.inst.cfg @@ -0,0 +1 @@ +/home/ruben/Projects/cura-private-data/resources/variants/ultimaker_s3_bb0.8.inst.cfg \ No newline at end of file diff --git a/resources/variants/ultimaker_s3_bb04.inst.cfg b/resources/variants/ultimaker_s3_bb04.inst.cfg new file mode 120000 index 0000000000..b7a6d15e1f --- /dev/null +++ b/resources/variants/ultimaker_s3_bb04.inst.cfg @@ -0,0 +1 @@ +/home/ruben/Projects/cura-private-data/resources/variants/ultimaker_s3_bb04.inst.cfg \ No newline at end of file diff --git a/resources/variants/ultimaker_s3_cc06.inst.cfg b/resources/variants/ultimaker_s3_cc06.inst.cfg new file mode 120000 index 0000000000..7b69f2657b --- /dev/null +++ b/resources/variants/ultimaker_s3_cc06.inst.cfg @@ -0,0 +1 @@ +/home/ruben/Projects/cura-private-data/resources/variants/ultimaker_s3_cc06.inst.cfg \ No newline at end of file From 52cb68fdb38dda18c9a9f7e854509dd9d7a1d7d3 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 4 Sep 2019 09:23:27 +0200 Subject: [PATCH 086/158] Commit actual files instead of my symlinks I've been having this profile added via a symlink so that it would update itself. I didn't know that symlinks were possible in Git. Contributes to issue CURA-6742. --- resources/definitions/ultimaker_s3.def.json | 166 +- .../ultimaker_s3_extruder_left.def.json | 31 +- .../ultimaker_s3_extruder_right.def.json | 31 +- resources/meshes/ultimaker_s3_platform.obj | 8032 ++++++++++++++++- resources/quality/ultimaker_s3 | 1 - .../um_s3_aa0.25_ABS_Normal_Quality.inst.cfg | 20 + .../um_s3_aa0.25_CPE_Normal_Quality.inst.cfg | 20 + ...um_s3_aa0.25_Nylon_Normal_Quality.inst.cfg | 35 + .../um_s3_aa0.25_PC_Normal_Quality.inst.cfg | 55 + .../um_s3_aa0.25_PLA_Normal_Quality.inst.cfg | 36 + .../um_s3_aa0.25_PP_Normal_Quality.inst.cfg | 59 + .../um_s3_aa0.25_TPLA_Normal_Quality.inst.cfg | 40 + .../um_s3_aa0.4_ABS_Draft_Print.inst.cfg | 31 + .../um_s3_aa0.4_ABS_Fast_Print.inst.cfg | 30 + .../um_s3_aa0.4_ABS_High_Quality.inst.cfg | 29 + .../um_s3_aa0.4_ABS_Normal_Quality.inst.cfg | 27 + .../um_s3_aa0.4_BAM_Draft_Print.inst.cfg | 40 + .../um_s3_aa0.4_BAM_Fast_Print.inst.cfg | 39 + .../um_s3_aa0.4_BAM_Normal_Quality.inst.cfg | 38 + .../um_s3_aa0.4_CPEP_Draft_Print.inst.cfg | 48 + .../um_s3_aa0.4_CPEP_Fast_Print.inst.cfg | 46 + .../um_s3_aa0.4_CPEP_High_Quality.inst.cfg | 48 + .../um_s3_aa0.4_CPEP_Normal_Quality.inst.cfg | 48 + .../um_s3_aa0.4_CPE_Draft_Print.inst.cfg | 29 + .../um_s3_aa0.4_CPE_Fast_Print.inst.cfg | 27 + .../um_s3_aa0.4_CPE_High_Quality.inst.cfg | 28 + .../um_s3_aa0.4_CPE_Normal_Quality.inst.cfg | 26 + .../um_s3_aa0.4_Nylon_Draft_Print.inst.cfg | 38 + .../um_s3_aa0.4_Nylon_Fast_Print.inst.cfg | 38 + .../um_s3_aa0.4_Nylon_High_Quality.inst.cfg | 37 + .../um_s3_aa0.4_Nylon_Normal_Quality.inst.cfg | 37 + .../um_s3_aa0.4_PC_Draft_Print.inst.cfg | 63 + .../um_s3_aa0.4_PC_Fast_Print.inst.cfg | 63 + .../um_s3_aa0.4_PC_High_Quality.inst.cfg | 64 + .../um_s3_aa0.4_PC_Normal_Quality.inst.cfg | 62 + .../um_s3_aa0.4_PLA_Draft_Print.inst.cfg | 35 + .../um_s3_aa0.4_PLA_Fast_Print.inst.cfg | 31 + .../um_s3_aa0.4_PLA_High_Quality.inst.cfg | 33 + .../um_s3_aa0.4_PLA_Normal_Quality.inst.cfg | 29 + .../um_s3_aa0.4_PP_Draft_Print.inst.cfg | 62 + .../um_s3_aa0.4_PP_Fast_Print.inst.cfg | 64 + .../um_s3_aa0.4_PP_Normal_Quality.inst.cfg | 64 + .../um_s3_aa0.4_TPLA_Draft_Print.inst.cfg | 38 + .../um_s3_aa0.4_TPLA_Fast_Print.inst.cfg | 31 + .../um_s3_aa0.4_TPLA_High_Quality.inst.cfg | 36 + .../um_s3_aa0.4_TPLA_Normal_Quality.inst.cfg | 33 + .../um_s3_aa0.4_TPU_Draft_Print.inst.cfg | 63 + .../um_s3_aa0.4_TPU_Fast_Print.inst.cfg | 64 + .../um_s3_aa0.4_TPU_Normal_Quality.inst.cfg | 63 + .../um_s3_aa0.8_ABS_Draft_Print.inst.cfg | 22 + .../um_s3_aa0.8_ABS_Superdraft_Print.inst.cfg | 22 + .../um_s3_aa0.8_ABS_Verydraft_Print.inst.cfg | 22 + .../um_s3_aa0.8_CPEP_Fast_Print.inst.cfg | 39 + ...um_s3_aa0.8_CPEP_Superdraft_Print.inst.cfg | 39 + .../um_s3_aa0.8_CPEP_Verydraft_Print.inst.cfg | 39 + .../um_s3_aa0.8_CPE_Draft_Print.inst.cfg | 25 + .../um_s3_aa0.8_CPE_Superdraft_Print.inst.cfg | 26 + .../um_s3_aa0.8_CPE_Verydraft_Print.inst.cfg | 25 + .../um_s3_aa0.8_Nylon_Draft_Print.inst.cfg | 35 + ...m_s3_aa0.8_Nylon_Superdraft_Print.inst.cfg | 35 + ...um_s3_aa0.8_Nylon_Verydraft_Print.inst.cfg | 35 + .../um_s3_aa0.8_PC_Fast_Print.inst.cfg | 32 + .../um_s3_aa0.8_PC_Superdraft_Print.inst.cfg | 31 + .../um_s3_aa0.8_PC_Verydraft_Print.inst.cfg | 32 + .../um_s3_aa0.8_PLA_Draft_Print.inst.cfg | 42 + .../um_s3_aa0.8_PLA_Superdraft_Print.inst.cfg | 42 + .../um_s3_aa0.8_PLA_Verydraft_Print.inst.cfg | 41 + .../um_s3_aa0.8_PP_Draft_Print.inst.cfg | 52 + .../um_s3_aa0.8_PP_Superdraft_Print.inst.cfg | 52 + .../um_s3_aa0.8_PP_Verydraft_Print.inst.cfg | 51 + .../um_s3_aa0.8_TPLA_Draft_Print.inst.cfg | 40 + ...um_s3_aa0.8_TPLA_Superdraft_Print.inst.cfg | 41 + .../um_s3_aa0.8_TPLA_Verydraft_Print.inst.cfg | 43 + .../um_s3_aa0.8_TPU_Draft_Print.inst.cfg | 62 + .../um_s3_aa0.8_TPU_Superdraft_Print.inst.cfg | 63 + .../um_s3_aa0.8_TPU_Verydraft_Print.inst.cfg | 62 + .../um_s3_bb0.4_PVA_Draft_Print.inst.cfg | 20 + .../um_s3_bb0.4_PVA_Fast_Print.inst.cfg | 21 + .../um_s3_bb0.4_PVA_High_Quality.inst.cfg | 19 + .../um_s3_bb0.4_PVA_Normal_Quality.inst.cfg | 18 + .../um_s3_bb0.8_PVA_Draft_Print.inst.cfg | 18 + .../um_s3_bb0.8_PVA_Superdraft_Print.inst.cfg | 18 + .../um_s3_bb0.8_PVA_Verydraft_Print.inst.cfg | 19 + .../um_s3_cc0.6_CFFCPE_Draft_Print.inst.cfg | 31 + .../um_s3_cc0.6_CFFPA_Draft_Print.inst.cfg | 31 + .../um_s3_cc0.6_GFFCPE_Draft_Print.inst.cfg | 31 + .../um_s3_cc0.6_GFFPA_Draft_Print.inst.cfg | 31 + .../um_s3_cc0.6_PLA_Draft_Print.inst.cfg | 43 + .../um_s3_cc0.6_PLA_Fast_Print.inst.cfg | 43 + .../um_s3_global_Draft_Quality.inst.cfg | 14 + .../um_s3_global_Fast_Quality.inst.cfg | 14 + .../um_s3_global_High_Quality.inst.cfg | 14 + .../um_s3_global_Normal_Quality.inst.cfg | 14 + .../um_s3_global_Superdraft_Quality.inst.cfg | 14 + .../um_s3_global_Verydraft_Quality.inst.cfg | 14 + .../variants/ultimaker_s3_aa0.25.inst.cfg | 51 +- .../variants/ultimaker_s3_aa0.8.inst.cfg | 68 +- resources/variants/ultimaker_s3_aa04.inst.cfg | 43 +- .../variants/ultimaker_s3_bb0.8.inst.cfg | 94 +- resources/variants/ultimaker_s3_bb04.inst.cfg | 52 +- resources/variants/ultimaker_s3_cc06.inst.cfg | 47 +- 101 files changed, 11929 insertions(+), 11 deletions(-) mode change 120000 => 100644 resources/definitions/ultimaker_s3.def.json mode change 120000 => 100644 resources/extruders/ultimaker_s3_extruder_left.def.json mode change 120000 => 100644 resources/extruders/ultimaker_s3_extruder_right.def.json mode change 120000 => 100644 resources/meshes/ultimaker_s3_platform.obj delete mode 120000 resources/quality/ultimaker_s3 create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.25_ABS_Normal_Quality.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.25_CPE_Normal_Quality.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.25_Nylon_Normal_Quality.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.25_PC_Normal_Quality.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.25_PLA_Normal_Quality.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.25_PP_Normal_Quality.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.25_TPLA_Normal_Quality.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.4_ABS_Draft_Print.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.4_ABS_Fast_Print.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.4_ABS_High_Quality.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.4_ABS_Normal_Quality.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.4_BAM_Draft_Print.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.4_BAM_Fast_Print.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.4_BAM_Normal_Quality.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.4_CPEP_Draft_Print.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.4_CPEP_Fast_Print.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.4_CPEP_High_Quality.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.4_CPEP_Normal_Quality.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.4_CPE_Draft_Print.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.4_CPE_Fast_Print.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.4_CPE_High_Quality.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.4_CPE_Normal_Quality.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.4_Nylon_Draft_Print.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.4_Nylon_Fast_Print.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.4_Nylon_High_Quality.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.4_Nylon_Normal_Quality.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.4_PC_Draft_Print.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.4_PC_Fast_Print.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.4_PC_High_Quality.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.4_PC_Normal_Quality.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.4_PLA_Draft_Print.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.4_PLA_Fast_Print.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.4_PLA_High_Quality.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.4_PLA_Normal_Quality.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.4_PP_Draft_Print.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.4_PP_Fast_Print.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.4_PP_Normal_Quality.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.4_TPLA_Draft_Print.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.4_TPLA_Fast_Print.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.4_TPLA_High_Quality.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.4_TPLA_Normal_Quality.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.4_TPU_Draft_Print.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.4_TPU_Fast_Print.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.4_TPU_Normal_Quality.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.8_ABS_Draft_Print.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.8_ABS_Superdraft_Print.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.8_ABS_Verydraft_Print.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.8_CPEP_Fast_Print.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.8_CPEP_Superdraft_Print.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.8_CPEP_Verydraft_Print.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.8_CPE_Draft_Print.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.8_CPE_Superdraft_Print.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.8_CPE_Verydraft_Print.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.8_Nylon_Draft_Print.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.8_Nylon_Superdraft_Print.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.8_Nylon_Verydraft_Print.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.8_PC_Fast_Print.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.8_PC_Superdraft_Print.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.8_PC_Verydraft_Print.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.8_PLA_Draft_Print.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.8_PLA_Superdraft_Print.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.8_PLA_Verydraft_Print.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.8_PP_Draft_Print.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.8_PP_Superdraft_Print.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.8_PP_Verydraft_Print.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.8_TPLA_Draft_Print.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.8_TPLA_Superdraft_Print.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.8_TPLA_Verydraft_Print.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.8_TPU_Draft_Print.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.8_TPU_Superdraft_Print.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.8_TPU_Verydraft_Print.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_bb0.4_PVA_Draft_Print.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_bb0.4_PVA_Fast_Print.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_bb0.4_PVA_High_Quality.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_bb0.4_PVA_Normal_Quality.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_bb0.8_PVA_Draft_Print.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_bb0.8_PVA_Superdraft_Print.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_bb0.8_PVA_Verydraft_Print.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_cc0.6_CFFCPE_Draft_Print.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_cc0.6_CFFPA_Draft_Print.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_cc0.6_GFFCPE_Draft_Print.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_cc0.6_GFFPA_Draft_Print.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_cc0.6_PLA_Draft_Print.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_cc0.6_PLA_Fast_Print.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_global_Draft_Quality.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_global_Fast_Quality.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_global_High_Quality.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_global_Normal_Quality.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_global_Superdraft_Quality.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_global_Verydraft_Quality.inst.cfg mode change 120000 => 100644 resources/variants/ultimaker_s3_aa0.25.inst.cfg mode change 120000 => 100644 resources/variants/ultimaker_s3_aa0.8.inst.cfg mode change 120000 => 100644 resources/variants/ultimaker_s3_aa04.inst.cfg mode change 120000 => 100644 resources/variants/ultimaker_s3_bb0.8.inst.cfg mode change 120000 => 100644 resources/variants/ultimaker_s3_bb04.inst.cfg mode change 120000 => 100644 resources/variants/ultimaker_s3_cc06.inst.cfg diff --git a/resources/definitions/ultimaker_s3.def.json b/resources/definitions/ultimaker_s3.def.json deleted file mode 120000 index bf3ab68f86..0000000000 --- a/resources/definitions/ultimaker_s3.def.json +++ /dev/null @@ -1 +0,0 @@ -/home/ruben/Projects/cura-private-data/resources/definitions/ultimaker_s3.def.json \ No newline at end of file diff --git a/resources/definitions/ultimaker_s3.def.json b/resources/definitions/ultimaker_s3.def.json new file mode 100644 index 0000000000..c380fcbc50 --- /dev/null +++ b/resources/definitions/ultimaker_s3.def.json @@ -0,0 +1,165 @@ +{ + "id": "ultimaker_s3", + "version": 2, + "name": "Ultimaker S3", + "inherits": "ultimaker", + "metadata": { + "author": "Ultimaker", + "manufacturer": "Ultimaker B.V.", + "category": "Ultimaker", + "visible": true, + "file_formats": "application/x-ufp;text/x-gcode", + "platform": "ultimaker_s3_platform.obj", + "platform_texture": "UltimakerS3backplate.png", + "platform_offset": [0, 0, 0], + "has_machine_quality": true, + "has_materials": true, + "has_variant_buildplates": false, + "has_variants": true, + "exclude_materials": [ "generic_hips", "generic_petg", "structur3d_dap100silicone" ], + "preferred_variant_name": "AA 0.4", + "preferred_quality_type": "normal", + "variants_name": "Print core", + "nozzle_offsetting_for_disallowed_areas": false, + "machine_extruder_trains": + { + "0": "ultimaker_s3_extruder_left", + "1": "ultimaker_s3_extruder_right" + }, + "first_start_actions": [ "DiscoverUM3Action" ], + "supported_actions": [ "DiscoverUM3Action" ], + "supports_usb_connection": false, + "weight": -1, + "firmware_update_info": { + "id": 213482, + "check_urls": ["https://software.ultimaker.com/releases/firmware/213482/stable/version.txt"], + "update_url": "https://ultimaker.com/firmware" + } + }, + + "overrides": { + "machine_name": { "default_value": "Ultimaker S3" }, + "machine_width": { "default_value": 230 }, + "machine_depth": { "default_value": 190 }, + "machine_height": { "default_value": 200 }, + "machine_heated_bed": { "default_value": true }, + "machine_nozzle_heat_up_speed": { "default_value": 1.4 }, + "machine_nozzle_cool_down_speed": { "default_value": 0.8 }, + "machine_head_with_fans_polygon": + { + "default_value": + [ + [ -41.4, -45.8 ], + [ -41.4, 36.0 ], + [ 63.3, 36.0 ], + [ 63.3, -45.8 ] + ] + }, + "machine_gcode_flavor": { "default_value": "Griffin" }, + "machine_max_feedrate_x": { "default_value": 300 }, + "machine_max_feedrate_y": { "default_value": 300 }, + "machine_max_feedrate_z": { "default_value": 40 }, + "machine_acceleration": { "default_value": 3000 }, + "gantry_height": { "value": "60" }, + "machine_extruder_count": { "default_value": 2 }, + "extruder_prime_pos_abs": { "default_value": true }, + "machine_start_gcode": { "default_value": "" }, + "machine_end_gcode": { "default_value": "" }, + "prime_tower_position_x": { "default_value": 345 }, + "prime_tower_position_y": { "default_value": 222.5 }, + "prime_blob_enable": { "enabled": true, "default_value": false }, + + "speed_travel": + { + "maximum_value": "150", + "value": "150" + }, + + "acceleration_enabled": { "value": "True" }, + "acceleration_layer_0": { "value": "acceleration_topbottom" }, + "acceleration_prime_tower": { "value": "math.ceil(acceleration_print * 2000 / 4000)" }, + "acceleration_print": { "value": "4000" }, + "acceleration_support": { "value": "math.ceil(acceleration_print * 2000 / 4000)" }, + "acceleration_support_interface": { "value": "acceleration_topbottom" }, + "acceleration_topbottom": { "value": "math.ceil(acceleration_print * 500 / 4000)" }, + "acceleration_wall": { "value": "math.ceil(acceleration_print * 1000 / 4000)" }, + "acceleration_wall_0": { "value": "math.ceil(acceleration_wall * 500 / 1000)" }, + "brim_width": { "value": "3" }, + "cool_fan_full_at_height": { "value": "layer_height_0 + 4 * layer_height" }, + "cool_fan_speed": { "value": "50" }, + "cool_fan_speed_max": { "value": "100" }, + "cool_min_speed": { "value": "5" }, + "infill_line_width": { "value": "round(line_width * 0.5 / 0.35, 2)" }, + "infill_overlap": { "value": "0" }, + "infill_pattern": { "value": "'triangles'" }, + "infill_wipe_dist": { "value": "0" }, + "jerk_enabled": { "value": "True" }, + "jerk_layer_0": { "value": "jerk_topbottom" }, + "jerk_prime_tower": { "value": "math.ceil(jerk_print * 15 / 25)" }, + "jerk_print": { "value": "25" }, + "jerk_support": { "value": "math.ceil(jerk_print * 15 / 25)" }, + "jerk_support_interface": { "value": "jerk_topbottom" }, + "jerk_topbottom": { "value": "math.ceil(jerk_print * 5 / 25)" }, + "jerk_wall": { "value": "math.ceil(jerk_print * 10 / 25)" }, + "jerk_wall_0": { "value": "math.ceil(jerk_wall * 5 / 10)" }, + "layer_height_0": { "value": "round(machine_nozzle_size / 1.5, 2)" }, + "layer_start_x": { "value": "sum(extruderValues('machine_extruder_start_pos_x')) / len(extruderValues('machine_extruder_start_pos_x'))" }, + "layer_start_y": { "value": "sum(extruderValues('machine_extruder_start_pos_y')) / len(extruderValues('machine_extruder_start_pos_y'))" }, + "line_width": { "value": "machine_nozzle_size * 0.875" }, + "machine_min_cool_heat_time_window": { "value": "15" }, + "default_material_print_temperature": { "value": "200" }, + "material_standby_temperature": { "value": "100" }, + "multiple_mesh_overlap": { "value": "0" }, + "prime_tower_enable": { "value": "True" }, + "raft_airgap": { "value": "0" }, + "raft_base_speed": { "value": "20" }, + "raft_base_thickness": { "value": "0.3" }, + "raft_interface_line_spacing": { "value": "0.5" }, + "raft_interface_line_width": { "value": "0.5" }, + "raft_interface_speed": { "value": "20" }, + "raft_interface_thickness": { "value": "0.2" }, + "raft_jerk": { "value": "jerk_layer_0" }, + "raft_margin": { "value": "10" }, + "raft_speed": { "value": "25" }, + "raft_surface_layers": { "value": "1" }, + "retraction_amount": { "value": "6.5" }, + "retraction_count_max": { "value": "10" }, + "retraction_extrusion_window": { "value": "1" }, + "retraction_hop": { "value": "2" }, + "retraction_hop_enabled": { "value": "extruders_enabled_count > 1" }, + "retraction_hop_only_when_collides": { "value": "True" }, + "retraction_min_travel": { "value": "5" }, + "retraction_prime_speed": { "value": "15" }, + "skin_overlap": { "value": "10" }, + "speed_equalize_flow_enabled": { "value": "True" }, + "speed_layer_0": { "value": "20" }, + "speed_prime_tower": { "value": "speed_topbottom" }, + "speed_print": { "value": "35" }, + "speed_support": { "value": "speed_wall_0" }, + "speed_support_interface": { "value": "speed_topbottom" }, + "speed_topbottom": { "value": "math.ceil(speed_print * 20 / 35)" }, + "speed_wall": { "value": "math.ceil(speed_print * 30 / 35)" }, + "speed_wall_0": { "value": "math.ceil(speed_wall * 20 / 30)" }, + "speed_wall_x": { "value": "speed_wall" }, + "support_angle": { "value": "45" }, + "support_pattern": { "value": "'triangles'" }, + "support_use_towers": { "value": "False" }, + "support_xy_distance": { "value": "wall_line_width_0 * 2.5" }, + "support_xy_distance_overhang": { "value": "wall_line_width_0" }, + "support_z_distance": { "value": "0" }, + "switch_extruder_prime_speed": { "value": "15" }, + "switch_extruder_retraction_amount": { "value": "8" }, + "top_bottom_thickness": { "value": "1" }, + "travel_avoid_supports": { "value": "True" }, + "travel_avoid_distance": { "value": "3 if extruders_enabled_count > 1 else machine_nozzle_tip_outer_diameter / 2 * 1.5" }, + "wall_0_inset": { "value": "0" }, + "wall_line_width_x": { "value": "round(line_width * 0.3 / 0.35, 2)" }, + "wall_thickness": { "value": "1" }, + "meshfix_maximum_resolution": { "value": "(speed_wall_0 + speed_wall_x) / 60" }, + "meshfix_maximum_deviation": { "value": "layer_height / 2" }, + "optimize_wall_printing_order": { "value": "True" }, + "retraction_combing": { "default_value": "all" }, + "initial_layer_line_width_factor": { "value": "120" }, + "zig_zaggify_infill": { "value": "gradual_infill_steps == 0" } + } +} diff --git a/resources/extruders/ultimaker_s3_extruder_left.def.json b/resources/extruders/ultimaker_s3_extruder_left.def.json deleted file mode 120000 index 831647c1d1..0000000000 --- a/resources/extruders/ultimaker_s3_extruder_left.def.json +++ /dev/null @@ -1 +0,0 @@ -/home/ruben/Projects/cura-private-data/resources/extruders/ultimaker_s3_extruder_left.def.json \ No newline at end of file diff --git a/resources/extruders/ultimaker_s3_extruder_left.def.json b/resources/extruders/ultimaker_s3_extruder_left.def.json new file mode 100644 index 0000000000..61d3149e0b --- /dev/null +++ b/resources/extruders/ultimaker_s3_extruder_left.def.json @@ -0,0 +1,30 @@ +{ + "id": "ultimaker_s3_extruder_left", + "version": 2, + "name": "Extruder 1", + "inherits": "fdmextruder", + "metadata": { + "machine": "ultimaker_s3", + "position": "0" + }, + + "overrides": { + "extruder_nr": { + "default_value": 0, + "maximum_value": "1" + }, + "machine_nozzle_offset_x": { "default_value": 0 }, + "machine_nozzle_offset_y": { "default_value": 0 }, + + "machine_extruder_start_pos_abs": { "default_value": true }, + "machine_extruder_start_pos_x": { "default_value": 180 }, + "machine_extruder_start_pos_y": { "default_value": 180 }, + "machine_extruder_end_pos_abs": { "default_value": true }, + "machine_extruder_end_pos_x": { "default_value": 180 }, + "machine_extruder_end_pos_y": { "default_value": 180 }, + "machine_nozzle_head_distance": { "default_value": 2.7 }, + "extruder_prime_pos_x": { "default_value": -3 }, + "extruder_prime_pos_y": { "default_value": 6 }, + "extruder_prime_pos_z": { "default_value": 2 } + } +} diff --git a/resources/extruders/ultimaker_s3_extruder_right.def.json b/resources/extruders/ultimaker_s3_extruder_right.def.json deleted file mode 120000 index bc70bbb2b4..0000000000 --- a/resources/extruders/ultimaker_s3_extruder_right.def.json +++ /dev/null @@ -1 +0,0 @@ -/home/ruben/Projects/cura-private-data/resources/extruders/ultimaker_s3_extruder_right.def.json \ No newline at end of file diff --git a/resources/extruders/ultimaker_s3_extruder_right.def.json b/resources/extruders/ultimaker_s3_extruder_right.def.json new file mode 100644 index 0000000000..efcb6ae06a --- /dev/null +++ b/resources/extruders/ultimaker_s3_extruder_right.def.json @@ -0,0 +1,30 @@ +{ + "id": "ultimaker_s3_extruder_right", + "version": 2, + "name": "Extruder 2", + "inherits": "fdmextruder", + "metadata": { + "machine": "ultimaker_s3", + "position": "1" + }, + + "overrides": { + "extruder_nr": { + "default_value": 1, + "maximum_value": "1" + }, + "machine_nozzle_offset_x": { "default_value": 22 }, + "machine_nozzle_offset_y": { "default_value": 0 }, + + "machine_extruder_start_pos_abs": { "default_value": true }, + "machine_extruder_start_pos_x": { "default_value": 180 }, + "machine_extruder_start_pos_y": { "default_value": 180 }, + "machine_extruder_end_pos_abs": { "default_value": true }, + "machine_extruder_end_pos_x": { "default_value": 180 }, + "machine_extruder_end_pos_y": { "default_value": 180 }, + "machine_nozzle_head_distance": { "default_value": 4.2 }, + "extruder_prime_pos_x": { "default_value": 180 }, + "extruder_prime_pos_y": { "default_value": 6 }, + "extruder_prime_pos_z": { "default_value": 2 } + } +} diff --git a/resources/meshes/ultimaker_s3_platform.obj b/resources/meshes/ultimaker_s3_platform.obj deleted file mode 120000 index 0456797955..0000000000 --- a/resources/meshes/ultimaker_s3_platform.obj +++ /dev/null @@ -1 +0,0 @@ -/home/ruben/Projects/cura-private-data/resources/meshes/ultimaker_s3_platform.obj \ No newline at end of file diff --git a/resources/meshes/ultimaker_s3_platform.obj b/resources/meshes/ultimaker_s3_platform.obj new file mode 100644 index 0000000000..102874e3ce --- /dev/null +++ b/resources/meshes/ultimaker_s3_platform.obj @@ -0,0 +1,8031 @@ +v -123.778900 125.518311 -6.907795 +v -123.797607 121.257324 -7.040688 +v -123.799995 148.500000 -7.099978 +v -123.717606 136.811584 -5.034970 +v -123.689514 138.383133 -4.495398 +v -123.668266 139.354584 -3.842515 +v -122.703438 141.946640 24.150135 +v -122.575264 148.500000 27.401415 +v -123.783394 124.357140 -6.943633 +v -123.726234 124.340729 -5.062126 +v -123.697433 125.535110 -4.980642 +v -123.785675 120.499229 -6.692233 +v -123.770744 119.995567 -6.264033 +v -123.746635 119.562019 -5.578156 +v -122.592422 144.782043 27.268299 +v -122.641235 142.334106 25.539190 +v -122.610489 143.238342 26.570990 +v -124.574562 148.499893 27.643673 +v -125.799995 148.500000 -7.099978 +v -125.669678 139.320984 -3.903402 +v -125.626015 140.234543 -2.776348 +v -125.701309 137.411987 -4.735400 +v -125.580254 140.791824 -1.255374 +v -125.799080 121.412453 -7.073972 +v -125.741447 119.467690 -5.298861 +v -125.757713 119.727654 -5.888924 +v -125.775909 120.135315 -6.409525 +v -125.789719 120.689224 -6.805356 +v -124.642860 142.050629 25.777826 +v -124.594284 143.561432 27.219770 +v 123.798607 121.412453 -7.073972 +v 123.788132 125.517899 -6.953136 +v 123.799988 148.500000 -7.099978 +v 123.717163 137.034836 -5.016074 +v 123.692192 139.056763 -4.202315 +v 123.646599 140.244583 -2.931049 +v 123.582825 140.991791 -1.183872 +v 122.593826 148.500000 27.307976 +v 123.789421 124.357445 -6.976461 +v 123.728081 124.340919 -5.083951 +v 123.784752 120.439659 -6.669250 +v 123.757408 119.709328 -5.885711 +v 123.693954 119.396904 -4.968602 +v 122.620445 143.305984 26.566259 +v 125.675797 139.279266 -4.012356 +v 125.799988 148.500000 -7.099978 +v 125.616295 141.045639 -1.834042 +v 125.715202 137.599335 -4.845753 +v 124.661346 141.976913 25.322332 +v 125.797928 121.257324 -7.040688 +v 124.561897 148.500000 27.746351 +v 125.749077 119.516815 -5.479757 +v 125.770805 119.995567 -6.264033 +v 125.785751 120.499229 -6.692233 +v 124.582901 144.000381 27.419159 +v -0.433627 123.545013 -20.299978 +v 0.433775 123.548721 -20.299927 +v -0.982988 123.291168 -20.299980 +v -0.515263 123.518570 -4.699982 +v 0.515225 123.518318 -4.699982 +v 0.852666 123.366661 -4.699982 +v 1.042472 123.247452 -20.299980 +v -0.885582 123.344009 -4.699983 +v 1.367260 122.864059 -4.700087 +v -1.392007 122.830261 -4.699985 +v -1.439614 122.718979 -20.299982 +v 1.447857 122.702782 -20.299982 +v -1.590363 122.235336 -20.299982 +v 1.590363 122.235336 -4.700104 +v 1.615159 121.988457 -20.299982 +v -1.615159 121.988457 -4.700000 +v -1.568210 121.630394 -20.299982 +v 1.568210 121.630394 -4.700117 +v 1.415175 121.231514 -20.299982 +v -1.415175 121.231514 -4.699983 +v -1.211469 120.935127 -20.299982 +v 1.211469 120.935127 -4.700011 +v 1.027053 120.767014 -20.299982 +v -1.027053 120.767014 -4.699983 +v -0.618134 120.519394 -20.299982 +v 0.618161 120.519402 -4.700011 +v 0.583915 120.505600 -20.299982 +v -0.583881 120.505585 -4.699983 +v -0.034710 120.392029 -20.299982 +v 0.034666 120.392029 -4.699994 +v 79.499992 119.352646 -4.699983 +v -79.254425 119.000000 -2.699982 +v -79.499992 119.352646 -4.699983 +v 79.254425 119.000000 -2.699982 +v -81.415436 118.385399 -20.299982 +v -91.745560 119.000000 -2.699982 +v -85.624176 118.184456 -19.176199 +v -103.474350 142.187607 -20.266941 +v -103.475227 148.500000 -20.298664 +v -103.480392 124.453445 -17.978180 +v -103.474327 123.506805 -20.292078 +v -103.474403 122.664955 -20.270054 +v -103.474792 124.088440 -20.131594 +v -103.475044 122.088608 -20.033234 +v -103.475266 141.522446 -19.940849 +v -103.475967 124.671646 -19.675062 +v -103.476196 121.580650 -19.567003 +v -103.476288 141.154083 -19.562185 +v -103.493393 137.350800 -13.004006 +v -103.480392 125.421677 -17.978180 +v -103.493301 128.535370 -13.037661 +v -103.478004 121.280525 -18.901505 +v -103.515190 120.520004 -4.699983 +v -103.515190 124.337555 -4.699982 +v -103.515190 125.537560 -4.699982 +v -103.494659 136.877258 -12.563451 +v -103.494568 128.974823 -12.602526 +v -103.515213 136.484894 -4.693568 +v -103.495224 136.221008 -12.316591 +v -103.495186 129.635452 -12.327147 +v -102.525032 148.500000 -20.297888 +v -102.525536 142.073929 -20.239792 +v -102.519592 124.453445 -17.978180 +v -102.525581 122.628830 -20.271664 +v -102.525604 123.763466 -20.253416 +v -102.524765 124.371239 -19.953941 +v -102.524879 122.047485 -20.000715 +v -102.524323 141.328033 -19.779812 +v -102.523941 121.623199 -19.623102 +v -102.523712 124.757019 -19.564121 +v -102.506699 137.377441 -13.037759 +v -102.519592 125.421677 -17.978180 +v -102.506599 128.562012 -13.003924 +v -102.522148 121.296043 -18.963028 +v -102.484795 120.520004 -4.699983 +v -102.484795 125.537560 -4.699982 +v -102.484795 124.337555 -4.699982 +v -102.505432 136.937958 -12.602538 +v -102.505318 129.035522 -12.563430 +v -102.484741 136.730774 -4.679422 +v -102.504807 136.277298 -12.327147 +v -102.504768 129.691742 -12.316591 +v -0.433668 146.687607 -20.266937 +v -0.515177 148.500000 -4.699978 +v -0.433495 148.500000 -20.299974 +v -0.444588 124.455215 -18.181370 +v -0.433768 124.064957 -20.248905 +v -0.435918 145.877045 -19.837273 +v -0.435678 124.566193 -19.882954 +v -0.444588 125.419907 -18.181370 +v -0.471626 128.552765 -13.017731 +v -0.471600 141.867615 -13.022640 +v -0.515177 125.537560 -4.699982 +v -0.515177 124.337555 -4.699982 +v -0.474002 141.377243 -12.563434 +v -0.473797 128.974823 -12.602527 +v -0.475297 140.720963 -12.316586 +v -0.475242 129.635468 -12.327146 +v -0.515234 136.579285 -4.685525 +v -0.515633 137.447144 -4.525631 +v -0.516624 138.358353 -4.147129 +v -0.518110 139.165298 -3.579410 +v -0.520580 139.988434 -2.636411 +v -0.523477 140.490219 -1.529178 +v -0.525686 140.661316 -0.685408 +v -0.600000 148.500000 27.700026 +v -0.590811 141.551880 24.189827 +v -0.599979 145.231857 27.691992 +v -0.593405 141.792160 25.181160 +v -0.596356 142.471283 26.308067 +v -0.598573 143.478134 27.154871 +v -0.599649 144.477005 27.566135 +v -103.515526 137.332901 -4.558472 +v -103.516525 138.261337 -4.200128 +v -103.517899 139.088470 -3.647146 +v -103.519791 139.770004 -2.930894 +v -103.522041 140.282242 -2.077142 +v -103.524940 140.629425 -0.990034 +v -103.599991 148.500000 27.700026 +v -103.590683 141.546494 24.151115 +v -103.599960 145.199188 27.689819 +v -103.593422 141.790009 25.175095 +v -103.595825 142.327484 26.112658 +v -103.597527 142.932861 26.753635 +v -103.598778 143.627060 27.224945 +v -103.599541 144.403076 27.544779 +v -102.399994 148.500000 27.700026 +v -102.400040 145.173416 27.687176 +v -102.482506 138.898361 -3.811198 +v -102.484032 137.831848 -4.394243 +v -102.479683 139.919907 -2.740244 +v -102.476723 140.463562 -1.612636 +v -102.474434 140.653610 -0.750987 +v -102.409355 141.545029 24.131550 +v -102.406822 141.752808 25.077885 +v -102.403854 142.400620 26.222998 +v -102.401550 143.383789 27.097219 +v -102.400444 144.402069 27.545050 +v -79.834412 121.169449 -4.701422 +v 0.515177 124.337555 -4.699982 +v 102.484795 124.337555 -4.699982 +v 102.484795 120.520004 -4.699983 +v 93.792580 120.504227 -4.700222 +v -79.608337 120.869682 -4.700410 +v 79.810974 121.136620 -4.700951 +v -93.169708 120.103333 -4.700118 +v -93.660034 120.477562 -4.700276 +v 93.412888 120.339523 -4.700282 +v 93.155975 120.065941 -4.700138 +v -91.199013 121.118652 -4.704729 +v 79.538834 120.726501 -4.701214 +v -91.452232 120.752220 -4.700679 +v 92.975784 119.598564 -4.700064 +v -92.746597 119.383522 -4.699994 +v -91.499992 119.352646 -4.699983 +v -92.984299 119.616989 -4.699931 +v 91.499992 119.352646 -4.699983 +v 92.712402 119.373917 -4.699970 +v -123.704918 119.406097 -5.006795 +v -125.673828 119.342697 -4.643714 +v -125.448242 119.233131 -4.022115 +v -124.974792 119.122421 -3.394266 +v -123.424431 119.356491 -4.721560 +v -124.216087 119.032242 -2.882760 +v -123.431183 119.000702 -2.702945 +v -118.286034 119.008522 -2.700004 +v -117.446686 120.258507 -2.699887 +v -117.813896 119.859451 -2.699959 +v -117.069260 120.405914 -2.699887 +v -93.707397 120.315140 -2.699938 +v 117.748909 119.959366 -2.700021 +v 117.254326 120.378242 -2.699966 +v 93.497986 120.228104 -2.699977 +v 93.940285 120.408371 -2.699966 +v 93.169945 119.803787 -2.699978 +v 93.020607 119.182770 -2.699950 +v 92.760284 119.016273 -2.699984 +v -93.166580 119.788689 -2.699978 +v 117.945099 119.261238 -2.700148 +v -117.912086 119.353401 -2.700000 +v -93.062637 119.269722 -2.699976 +v -118.051476 119.129562 -2.700031 +v 118.218620 119.016579 -2.699992 +v -92.781548 119.022514 -2.700027 +v 91.745560 119.000000 -2.699982 +v -117.709160 120.253014 -4.700198 +v -123.431557 124.337654 -4.710291 +v -117.207901 120.504120 -4.700198 +v -118.008156 119.644287 -4.700133 +v -118.279015 119.376610 -4.700014 +v -122.425484 139.558868 24.168488 +v -123.267197 138.666763 -0.749820 +v -122.301895 141.552841 24.144461 +v -123.166824 140.666580 -0.688533 +v 0.471611 128.547089 -13.020448 +v 0.471618 141.861221 -13.019171 +v 0.433495 148.500000 -20.299974 +v 0.433810 146.573929 -20.239788 +v 0.433649 123.989830 -20.270569 +v -105.217323 124.368568 -8.253350 +v -105.249428 125.507248 -8.172711 +v -107.405624 125.520935 -6.604790 +v -105.618233 125.512680 -7.550677 +v -106.104141 125.516853 -7.073968 +v -106.817802 125.520012 -6.711080 +v -123.480270 125.520760 -6.624343 +v -123.406464 125.537415 -4.718421 +v -105.742447 124.360977 -7.383870 +v -106.400261 124.356720 -6.894501 +v -107.074173 124.354500 -6.640208 +v -123.515190 124.354416 -6.630264 +v -2.375973 124.360718 -7.353566 +v -2.408108 125.515121 -7.272839 +v -4.528426 124.346367 -5.707678 +v -32.720348 125.528694 -5.716523 +v -72.588997 124.376701 -9.184699 +v -72.738953 125.498367 -9.191535 +v -32.605324 124.346390 -5.711790 +v -99.052933 124.376877 -9.204794 +v -101.241241 125.483864 -10.853795 +v -101.291100 124.393028 -11.055563 +v -100.869537 125.489670 -10.188559 +v -100.307999 125.494530 -9.630728 +v -99.381577 125.497948 -9.239424 +v -2.954309 125.522476 -6.428508 +v -3.600958 125.526459 -5.972470 +v -4.320638 125.528648 -5.721797 +v -101.062790 124.387939 -10.473304 +v -100.462624 124.381599 -9.746922 +v -99.640572 124.377792 -9.311066 +v -2.747823 124.354912 -6.688328 +v -3.208852 124.350784 -6.214532 +v -3.915388 124.347427 -5.831334 +v -89.313148 120.223473 -20.299982 +v -81.740738 120.232155 -20.299982 +v -79.535530 120.703430 -4.701630 +v -122.519623 145.274750 27.479473 +v -122.273773 148.500000 27.681963 +v -122.347404 145.208221 27.630726 +v -122.180847 145.165298 27.681499 +v -122.631172 141.832413 24.514389 +v -122.505241 141.634384 24.129721 +v -122.530212 141.848465 24.917847 +v -122.334938 141.697495 24.840992 +v -122.464088 142.034149 25.464901 +v -122.246231 142.049393 25.683220 +v -122.603767 142.641693 26.063051 +v -122.442970 142.363556 26.014219 +v -122.244881 142.574097 26.401011 +v -122.466408 142.967987 26.623608 +v -122.262245 143.054642 26.831783 +v -122.556091 143.741684 26.997967 +v -122.425652 143.627197 27.114178 +v -122.233841 143.627792 27.220556 +v -122.514977 144.514893 27.362223 +v -122.383064 144.425903 27.467810 +v -122.213562 144.462509 27.554651 +v -123.375854 140.752487 -0.688539 +v -123.655510 137.488007 -4.755487 +v -123.609016 136.548401 -4.852862 +v -123.383240 136.545639 -4.703648 +v -123.391365 137.156616 -4.611506 +v -123.532509 137.921127 -4.468591 +v -123.323792 137.886734 -4.379573 +v -123.500740 138.855682 -3.947949 +v -123.321648 138.547806 -4.038620 +v -123.302940 139.163986 -3.592607 +v -123.497841 139.404678 -3.494964 +v -123.637909 140.299393 -2.813444 +v -123.511017 139.939545 -2.934212 +v -123.304268 139.674911 -3.058841 +v -123.295609 139.965225 -2.664153 +v -123.573151 140.585693 -2.048277 +v -123.431107 140.402679 -2.041083 +v -123.232658 140.327255 -1.991789 +v -123.578583 141.006042 -1.078155 +v -123.492302 140.825912 -1.005560 +v -123.263428 140.566772 -1.297280 +v -91.125710 120.975777 -4.795104 +v -79.876404 121.030540 -4.759994 +v 0.473797 141.437927 -12.602518 +v 0.475241 140.777252 -12.327140 +v 0.474002 129.035522 -12.563435 +v 0.475297 129.691742 -12.316590 +v 0.436371 145.794769 -19.750616 +v 0.435401 124.520126 -19.935883 +v -79.575577 120.511330 -5.036986 +v -79.787041 120.723289 -5.103093 +v -79.954048 120.788910 -5.085986 +v -79.906380 120.868362 -4.904600 +v -79.703827 120.819626 -4.834780 +v -81.443214 119.969955 -20.299982 +v -91.447578 120.469299 -4.982037 +v -91.320137 120.660995 -5.030531 +v -91.178352 120.757484 -5.057798 +v -91.028969 120.794846 -5.059298 +v -91.173988 120.860252 -4.891590 +v -89.568253 119.911949 -20.299982 +v 89.584549 118.385399 -20.299982 +v 81.415436 118.385399 -20.299982 +v 103.474983 148.500000 -20.297888 +v 103.474457 142.073929 -20.239792 +v 103.480392 124.453445 -17.978180 +v 103.474403 122.628830 -20.271664 +v 103.474388 123.763466 -20.253416 +v 103.475227 124.371239 -19.953941 +v 103.475105 122.047485 -20.000715 +v 103.475670 141.328033 -19.779812 +v 103.476051 121.623199 -19.623102 +v 103.476280 124.757019 -19.564121 +v 103.493301 137.377441 -13.037759 +v 103.480392 125.421677 -17.978180 +v 103.493393 128.562012 -13.003924 +v 103.477844 121.296043 -18.963028 +v 103.515190 120.520004 -4.699983 +v 103.515190 125.537560 -4.699982 +v 103.515190 124.337555 -4.699982 +v 103.494553 136.937958 -12.602537 +v 103.494675 129.035522 -12.563435 +v 103.515221 136.556458 -4.686877 +v 103.495178 136.277298 -12.327147 +v 103.495216 129.691742 -12.316590 +v 102.525635 142.187607 -20.266941 +v 102.525009 148.500000 -20.298645 +v 102.519592 124.453445 -17.978180 +v 102.525665 123.506805 -20.292078 +v 102.525597 122.664955 -20.270054 +v 102.525200 124.088440 -20.131594 +v 102.524956 122.088608 -20.033234 +v 102.524719 141.522446 -19.940849 +v 102.524025 124.671646 -19.675062 +v 102.523796 121.580650 -19.567003 +v 102.523705 141.154083 -19.562185 +v 102.506599 137.350800 -13.004006 +v 102.519592 125.421677 -17.978180 +v 102.506691 128.535370 -13.037661 +v 102.521988 121.280525 -18.901505 +v 102.484795 125.537560 -4.699982 +v 102.505325 136.877258 -12.563450 +v 102.505424 128.974823 -12.602526 +v 102.484764 136.579285 -4.685526 +v 102.504768 136.221008 -12.316591 +v 102.504799 129.635468 -12.327146 +v 0.515177 148.500000 -4.699978 +v 0.444588 124.455215 -18.181370 +v 0.444588 125.419907 -18.181370 +v 0.515177 125.537560 -4.699982 +v 0.515251 136.730774 -4.679422 +v 0.517503 138.898361 -3.811198 +v 0.515976 137.831848 -4.394243 +v 0.520308 139.919907 -2.740244 +v 0.523259 140.463562 -1.612636 +v 0.525514 140.653610 -0.750987 +v 0.590658 141.545029 24.131548 +v 0.600000 148.500000 27.700026 +v 0.599966 145.173416 27.687176 +v 0.593135 141.752808 25.077885 +v 0.596134 142.400620 26.222996 +v 0.598422 143.383789 27.097219 +v 0.599594 144.402069 27.545050 +v 103.515594 137.360123 -4.550949 +v 103.516769 138.489334 -4.085704 +v 103.518837 139.459930 -3.295880 +v 103.523277 140.465225 -1.610781 +v 103.520943 140.056824 -2.505926 +v 103.525673 140.660690 -0.708934 +v 103.590767 141.551147 24.181124 +v 103.599991 148.500000 27.700026 +v 103.599915 145.000656 27.674658 +v 103.592842 141.718307 24.947397 +v 103.595398 142.199921 25.951372 +v 103.597939 143.107315 26.905979 +v 103.599251 144.059204 27.427553 +v 102.399994 148.500000 27.700026 +v 102.400024 145.231857 27.691992 +v 102.484329 137.447144 -4.525632 +v 102.483376 138.358353 -4.147129 +v 102.481895 139.165298 -3.579410 +v 102.479408 139.988434 -2.636411 +v 102.476501 140.490219 -1.529178 +v 102.474258 140.661316 -0.685408 +v 102.409203 141.551880 24.189827 +v 102.406548 141.792160 25.181158 +v 102.403633 142.471283 26.308067 +v 102.401405 143.478134 27.154871 +v 102.400391 144.477005 27.566135 +v 123.433495 125.537300 -4.729113 +v 125.643623 119.318535 -4.506390 +v 125.379059 119.213570 -3.911189 +v 124.883949 119.105827 -3.300157 +v 123.382149 119.355118 -4.712761 +v 124.090012 119.025063 -2.842031 +v 123.427376 119.000595 -2.702304 +v 118.395432 119.356400 -4.699981 +v 123.307671 124.337578 -4.701297 +v 117.828018 120.102058 -4.700052 +v 117.358292 120.474388 -4.700041 +v 118.001266 119.663490 -4.700052 +v 118.150871 119.454453 -4.699969 +v 122.384254 141.562973 24.112606 +v 123.168343 140.665909 -0.692286 +v 105.217323 125.506546 -8.253350 +v 105.249428 124.367867 -8.172711 +v 107.405624 124.354187 -6.604791 +v 105.742447 125.514137 -7.383870 +v 106.400261 125.518417 -6.894500 +v 107.074173 125.520630 -6.640207 +v 123.515182 125.520721 -6.630262 +v 123.702591 125.534996 -4.994817 +v 105.618233 124.362442 -7.550677 +v 106.104141 124.358284 -7.073968 +v 106.817802 124.355118 -6.711080 +v 123.571121 124.354660 -6.658079 +v 123.562859 124.338539 -4.811217 +v 2.375973 125.514412 -7.353565 +v 2.408108 124.360016 -7.272839 +v 4.528426 125.528778 -5.707678 +v 72.738953 124.376762 -9.191535 +v 32.720348 124.346436 -5.716524 +v 72.588997 125.498428 -9.184699 +v 32.605324 125.528740 -5.711789 +v 99.052933 125.498253 -9.204794 +v 101.241241 124.391258 -10.853795 +v 101.291100 125.482101 -11.055563 +v 101.062790 125.487183 -10.473304 +v 100.462624 125.493523 -9.746922 +v 99.640572 125.497322 -9.311066 +v 2.747823 125.520210 -6.688327 +v 3.208852 125.524345 -6.214532 +v 3.915388 125.527695 -5.831334 +v 100.869537 124.385468 -10.188559 +v 100.307999 124.380592 -9.630728 +v 99.381577 124.377174 -9.239424 +v 2.954309 124.352646 -6.428508 +v 3.600958 124.348671 -5.972470 +v 4.320638 124.346481 -5.721798 +v 81.762947 120.242188 -20.299982 +v 89.201332 120.245956 -20.299982 +v 122.251465 141.701035 24.888420 +v 122.508278 145.188385 27.486597 +v 122.470367 148.500000 27.549826 +v 122.366234 145.230942 27.620163 +v 122.229202 148.500000 27.688200 +v 122.180374 145.198975 27.685953 +v 122.697273 141.976990 24.321791 +v 122.632164 141.763535 24.117718 +v 122.596687 141.885773 24.814671 +v 122.416397 141.747147 24.870359 +v 122.641075 142.277542 25.454687 +v 122.476112 142.142380 25.642162 +v 122.282471 141.961472 25.499708 +v 122.264717 142.299561 26.062757 +v 122.580383 142.777130 26.257877 +v 122.443611 142.632797 26.330292 +v 122.230614 142.882843 26.703127 +v 122.535507 143.327255 26.793961 +v 122.317810 143.269730 26.975847 +v 122.406235 143.669785 27.149931 +v 122.544563 144.090820 27.182377 +v 122.206291 143.998932 27.397743 +v 122.590134 144.857300 27.287502 +v 122.416550 144.448227 27.453918 +v 122.218788 144.639587 27.592222 +v 123.345612 140.730438 -0.721902 +v 123.474869 140.854660 -0.685640 +v 123.630150 136.564789 -4.879474 +v 123.603477 137.452484 -4.689911 +v 123.492058 136.538010 -4.756981 +v 123.655388 138.464218 -4.388837 +v 123.310623 136.544952 -4.692371 +v 123.335014 137.155060 -4.601349 +v 123.383362 137.637024 -4.476795 +v 123.513191 138.393173 -4.236556 +v 123.317856 138.345261 -4.163475 +v 123.598434 139.094406 -3.882812 +v 123.458488 139.207779 -3.643221 +v 123.293419 139.158936 -3.594824 +v 123.586426 139.653931 -3.393130 +v 123.355507 139.666656 -3.085800 +v 123.545952 140.253998 -2.546889 +v 123.322617 139.959808 -2.682391 +v 123.356804 140.371002 -2.003010 +v 123.190422 140.325668 -1.985545 +v 123.513893 140.669449 -1.611584 +v 123.295074 140.569702 -1.313683 +v 79.821266 120.930267 -4.819538 +v 91.129601 120.930992 -4.826019 +v 79.872467 121.050995 -4.746078 +v 79.544685 120.408348 -5.006674 +v 79.624199 120.591789 -5.030023 +v 79.766312 120.714760 -5.082232 +v 79.935730 120.787437 -5.073254 +v 79.841743 120.817261 -4.951159 +v 79.652245 120.782875 -4.821328 +v 81.457191 119.992241 -20.299982 +v 91.423058 120.504257 -5.015013 +v 91.498421 120.467331 -4.700700 +v 91.309555 120.686195 -4.990452 +v 91.108566 120.782196 -5.066273 +v 91.445183 120.740845 -4.701596 +v 91.328575 120.949066 -4.705514 +v 91.160637 121.148323 -4.703731 +v 89.463188 120.098969 -20.299982 +v 89.580627 119.838661 -20.299982 +v -123.407379 137.293488 -2.609838 +v -123.377846 137.884109 -2.359198 +v 123.394051 137.895630 -2.344923 +v 123.360443 138.171631 -2.102092 +v -123.352135 138.263199 -1.996058 +v 123.341820 138.382828 -1.802064 +v -123.322937 138.486023 -1.582113 +v 123.304993 138.564682 -1.354972 +v 123.285324 138.666229 -0.785798 +v 122.320786 139.637802 24.894356 +v -122.375397 139.753174 25.500620 +v 122.378113 139.809113 25.718523 +v -122.439117 140.089523 26.590048 +v 122.336189 140.208115 26.865940 +v -122.346626 140.496429 27.405722 +v 122.311852 140.569565 27.523333 +v 122.326950 141.501526 28.527752 +v 122.317314 142.142807 28.932178 +v -122.296257 142.669312 29.180302 +v -122.293144 143.872208 29.526834 +v 122.312408 143.916626 29.529678 +v -122.304489 145.328064 29.682253 +v 122.295372 145.270447 29.681156 +v 125.622047 137.393356 -4.406818 +v 125.427315 137.003799 -3.977706 +v 125.136688 136.972733 -3.553803 +v 124.777138 136.933609 -3.209860 +v 124.342026 136.877319 -2.941798 +v 123.860962 136.858032 -2.763032 +v 93.673721 136.838669 -2.695724 +v 125.412987 137.890060 -3.768965 +v 125.592934 139.054260 -3.717830 +v 125.411697 138.618195 -3.448086 +v 125.138290 137.760635 -3.388522 +v 125.126045 138.318420 -3.129252 +v 125.393555 139.192261 -2.948785 +v 124.770248 137.641754 -3.052038 +v 125.443268 139.600494 -2.605448 +v 125.617294 140.314529 -2.611781 +v 124.658913 138.083069 -2.758296 +v 125.110458 138.777206 -2.764651 +v 124.337341 137.549057 -2.793803 +v 124.741508 138.514954 -2.516759 +v 123.857971 137.485962 -2.624840 +v 124.111916 137.907623 -2.527047 +v 125.089340 139.121292 -2.323090 +v 124.307259 138.312881 -2.327080 +v 123.476059 137.548721 -2.532204 +v 123.833336 138.023605 -2.341359 +v 125.456551 140.063004 -1.876462 +v 124.720856 138.808884 -2.139570 +v 125.568520 140.672531 -1.428420 +v 123.817833 138.265823 -2.106691 +v 125.204010 139.613495 -1.706880 +v 124.284439 138.565689 -2.001396 +v 124.892387 139.189102 -1.739274 +v 123.796188 138.456146 -1.824320 +v 124.643936 139.048294 -1.519520 +v 124.266586 138.760452 -1.597831 +v 123.768311 138.640778 -1.365706 +v 125.023682 139.555756 -0.995835 +v 125.359573 140.106445 -0.866199 +v 124.192146 138.896652 -0.970977 +v 124.795959 139.342194 -0.767632 +v 124.452370 139.064514 -0.781275 +v 123.738312 138.744003 -0.773159 +v 122.456535 139.538757 23.776522 +v 122.867111 139.615036 23.863029 +v 124.628220 141.354202 23.900852 +v 124.434921 140.890533 24.048855 +v 123.582428 139.955322 24.132860 +v 124.079620 140.377197 24.135508 +v 123.015526 139.699249 24.424398 +v 124.581261 141.659607 25.565178 +v 124.487083 141.334747 25.508059 +v 124.267097 140.868286 25.384329 +v 123.924118 140.402847 25.208706 +v 123.403564 140.015030 25.278458 +v 122.821014 139.841125 25.531425 +v 123.855255 140.549164 25.987509 +v 123.494743 140.258942 25.960516 +v 123.043427 140.111237 26.220205 +v 122.473808 139.985199 26.296606 +v 124.215721 141.232635 26.512444 +v 124.471336 142.132599 26.953270 +v 123.930656 141.019348 26.837170 +v 124.294662 141.608459 26.895813 +v 123.680878 140.765152 26.839380 +v 124.593246 142.359512 26.581017 +v 123.260818 140.553040 27.005692 +v 122.785019 140.388184 27.078362 +v 124.482010 142.943665 27.495399 +v 123.861618 141.381592 27.467588 +v 124.199135 142.034012 27.551786 +v 123.473534 141.165756 27.683304 +v 124.554970 145.786285 27.698719 +v 123.016823 140.991241 27.830372 +v 122.469925 140.920868 27.965439 +v 123.809143 141.759766 27.920452 +v 124.419548 144.115250 28.011969 +v 124.189926 142.727173 28.020348 +v 124.401375 145.710587 28.185059 +v 123.860748 142.377106 28.271479 +v 123.237648 141.653595 28.326473 +v 124.176888 143.744431 28.382067 +v 122.763512 141.429550 28.369808 +v 123.365173 142.216202 28.614485 +v 124.150536 145.038849 28.615545 +v 123.854675 142.971497 28.543447 +v 123.850807 143.650772 28.759430 +v 122.756363 142.031784 28.792459 +v 123.446075 143.139404 28.951933 +v 123.724228 144.447128 29.028765 +v 123.740341 145.466797 29.087597 +v 122.988899 142.758896 29.050262 +v 122.395576 142.835205 29.236187 +v 122.985512 143.380905 29.251104 +v 123.214592 144.323212 29.342007 +v 122.719818 143.560654 29.386080 +v 123.234299 145.495361 29.423876 +v 122.738457 144.520920 29.542765 +v 122.750641 145.493652 29.609381 +v 124.111443 148.500000 28.709991 +v 123.346680 148.500000 29.387154 +v 122.489700 148.500000 29.677999 +v -125.540283 136.975204 -4.216683 +v -125.295456 136.955414 -3.765795 +v -124.970253 136.944595 -3.380332 +v -124.568878 136.906433 -3.066399 +v -124.106026 136.697525 -2.846749 +v -93.508949 136.714417 -2.702255 +v -125.619156 138.140671 -4.216978 +v -125.415276 137.812500 -3.798562 +v -125.453728 139.034317 -3.244794 +v -125.408295 138.466171 -3.519937 +v -125.136040 137.743484 -3.391164 +v -125.126595 138.277313 -3.151920 +v -124.768684 137.630325 -3.054291 +v -125.031975 138.654419 -2.744327 +v -124.758110 138.091690 -2.845890 +v -125.483101 139.647095 -2.731160 +v -124.340736 137.536896 -2.799740 +v -123.946663 137.298996 -2.703526 +v -124.324417 137.945999 -2.612323 +v -125.234558 139.274826 -2.443251 +v -124.533615 138.367691 -2.451627 +v -123.852730 137.755737 -2.512392 +v -124.826668 138.856049 -2.217199 +v -125.470787 140.297958 -1.387183 +v -123.981506 138.123474 -2.310292 +v -125.351257 139.772217 -1.954677 +v -124.288055 138.548676 -2.031816 +v -123.819916 138.283340 -2.089251 +v -125.063866 139.364243 -1.807904 +v -124.700211 139.021255 -1.698278 +v -123.783676 138.538071 -1.664282 +v -124.192635 138.765411 -1.484308 +v -125.232521 139.841385 -1.031264 +v -124.861710 139.379822 -0.979162 +v -124.476349 139.058273 -0.989736 +v -123.418312 138.614044 -1.162055 +v -124.235863 138.940552 -0.757408 +v -123.747108 138.748596 -0.755508 +v -124.612442 141.388062 24.328829 +v -122.880562 139.624496 23.953104 +v -124.423798 140.921783 24.422092 +v -123.368980 139.816071 23.960115 +v -124.137665 140.489929 24.467207 +v -123.769798 140.125137 24.480099 +v -123.326233 139.915192 24.923344 +v -122.839348 139.727905 24.932682 +v -124.489555 141.385712 25.593828 +v -124.257805 140.962555 25.717773 +v -123.931969 140.574707 25.815039 +v -123.523697 140.251282 25.883419 +v -123.060783 140.014969 25.905210 +v -122.690475 139.908997 25.919983 +v -124.552956 142.034744 26.446108 +v -124.452446 141.928833 26.820757 +v -124.228226 141.368011 26.722179 +v -123.910194 140.820038 26.486565 +v -123.500839 140.518845 26.616425 +v -123.038200 140.294128 26.686176 +v -123.797333 141.030548 27.112125 +v -124.522018 142.863022 27.291945 +v -123.260620 140.735687 27.307905 +v -122.781715 140.574860 27.393860 +v -124.221451 141.861542 27.348864 +v -124.326576 142.641953 27.717220 +v -123.879845 141.510590 27.581753 +v -124.501427 144.089188 27.780247 +v -123.963768 142.016403 27.926386 +v -123.470383 141.259216 27.788452 +v -123.012489 141.083282 27.930904 +v -124.337700 143.846268 28.147188 +v -122.450294 141.052216 28.113037 +v -123.959610 142.758896 28.352013 +v -123.465591 141.756271 28.242928 +v -124.393227 145.872498 28.207176 +v -123.004631 141.587814 28.402418 +v -124.160797 143.693024 28.400230 +v -123.568329 142.305435 28.510359 +v -124.182854 145.190353 28.576385 +v -122.436699 141.598221 28.585018 +v -123.833664 143.594376 28.760855 +v -123.453369 142.728134 28.789173 +v -122.992256 142.143723 28.764185 +v -123.924301 145.482849 28.914623 +v -123.750748 144.417114 28.996668 +v -122.430557 142.042404 28.870070 +v -123.372566 143.384552 29.072205 +v -122.850250 142.604996 29.042976 +v -123.221390 144.146332 29.312075 +v -123.520622 145.553665 29.257572 +v -122.735435 143.204330 29.285692 +v -123.216530 145.294479 29.426373 +v -122.732513 144.099335 29.489393 +v -122.794724 145.380280 29.597078 +v -124.303406 148.500000 28.401031 +v -123.842216 148.500000 29.003263 +v -123.223381 148.500000 29.443645 +v -122.458557 148.500000 29.684410 +v -123.848862 116.490852 -5.899983 +v -123.918678 116.485359 -4.399983 +v -124.751320 116.347321 -5.899983 +v -124.840981 116.323296 -4.399983 +v -125.731331 115.981438 -5.899983 +v -125.814034 115.939293 -4.399983 +v -126.807808 115.272736 -5.899984 +v -126.686714 115.361000 -4.399984 +v -127.420036 114.613716 -4.399984 +v -127.811707 114.065964 -5.899984 +v -127.981415 113.731354 -4.399984 +v -128.323303 112.840874 -5.899984 +v -128.347336 112.751183 -4.399984 +v -128.485352 111.918663 -5.899984 +v -128.490829 111.848846 -4.399984 +v -128.490829 -107.848816 -5.900032 +v -128.485352 -107.918633 -4.400032 +v -128.347351 -108.751183 -5.900032 +v -128.323303 -108.840874 -4.400032 +v -127.981392 -109.731384 -5.900032 +v -127.811676 -110.066010 -4.400032 +v -127.420097 -110.613640 -5.900033 +v -126.807747 -111.272789 -4.400032 +v -126.686729 -111.360992 -5.900033 +v -125.814201 -111.939201 -5.900033 +v -125.731499 -111.981346 -4.400032 +v -124.841278 -112.323212 -5.900033 +v -124.751602 -112.347244 -4.400032 +v -123.918594 -112.485367 -5.900033 +v -123.848831 -112.490852 -4.400032 +v 123.848808 -112.490852 -5.900033 +v 123.918579 -112.485367 -4.400032 +v 128.490829 -107.848816 -4.400032 +v 128.485352 -107.918633 -5.900032 +v 128.347351 -108.751183 -4.400032 +v 128.323303 -108.840874 -5.900032 +v 127.981392 -109.731384 -4.400032 +v 127.811684 -110.066002 -5.900033 +v 127.420074 -110.613678 -4.400032 +v 126.807777 -111.272774 -5.900033 +v 126.686745 -111.360992 -4.400032 +v 125.814232 -111.939186 -4.400032 +v 125.731522 -111.981331 -5.900033 +v 124.841293 -112.323204 -4.400032 +v 124.751617 -112.347244 -5.900033 +v 128.485352 111.918602 -4.399984 +v 128.490829 111.848747 -5.899984 +v 123.848846 116.490852 -4.399983 +v 123.918602 116.485367 -5.899983 +v 124.751381 116.347305 -4.399983 +v 124.841072 116.323265 -5.899983 +v 125.731339 115.981438 -4.399983 +v 125.814034 115.939293 -5.899983 +v 126.807838 115.272720 -4.399984 +v 126.686729 115.360992 -5.899984 +v 127.420013 114.613754 -5.899984 +v 127.811707 114.065948 -4.399984 +v 127.981415 113.731354 -5.899984 +v 128.323303 112.840874 -4.399984 +v 128.347336 112.751228 -5.899984 +v 122.500000 148.500000 -7.299976 +v 125.490013 148.500000 -18.680765 +v 125.500000 148.500000 -7.299976 +v 120.811798 148.500000 -20.287933 +v 120.779869 148.500000 -23.297600 +v -121.111626 148.500000 -23.280685 +v -120.824448 148.500000 -20.292238 +v 121.750755 148.500000 -23.147449 +v 122.731339 148.500000 -22.781443 +v 121.667557 148.500000 -19.956633 +v 123.614044 148.500000 -22.219763 +v 124.361305 148.500000 -21.486303 +v 122.276192 148.500000 -19.248241 +v 124.939240 148.500000 -20.614082 +v 125.323212 148.500000 -19.641190 +v 122.494461 148.500000 -18.529585 +v -125.499992 148.500000 -7.299976 +v -125.493134 148.500000 -18.627178 +v -122.499992 148.500000 -7.299976 +v -120.745895 -97.595192 -20.294550 +v 119.418747 -98.242973 -20.299652 +v 119.896957 -97.739487 -20.299604 +v 120.501480 -97.596779 -20.307573 +v 119.292007 -98.823532 -20.300013 +v -120.075317 -97.668686 -20.300041 +v 119.775055 -99.776619 -20.300028 +v 120.271324 -99.983147 -20.300028 +v 119.414673 -99.332115 -20.300026 +v 130.999985 -112.887878 -20.296299 +v -119.685028 -97.912460 -20.300026 +v -119.414665 -98.267868 -20.300026 +v -119.292000 -98.776657 -20.300026 +v -119.393944 -99.286797 -20.300026 +v -119.738312 -99.745422 -20.300028 +v -130.999985 -112.764626 -20.296947 +v -120.274551 -99.987526 -20.300028 +v -124.516418 -100.047935 -20.300028 +v -130.986267 -106.976845 -20.300028 +v 124.014038 -100.012764 -20.300028 +v 130.951736 -106.481750 -20.300028 +v 130.485199 -104.743752 -20.300028 +v 129.995178 -103.750000 -20.300028 +v 125.376137 -100.228836 -20.300028 +v -126.256004 -100.514709 -20.300028 +v 126.550491 -100.648407 -20.300028 +v -127.249992 -101.004791 -20.300028 +v 127.530861 -101.164200 -20.300028 +v -130.771271 -105.624184 -20.300028 +v -130.222168 -104.152985 -20.300028 +v -128.280045 -101.708504 -20.300028 +v 129.291534 -102.720024 -20.300028 +v 128.518478 -101.926392 -20.300028 +v -129.379150 -102.828224 -20.300028 +v -120.257370 -97.618202 -23.303097 +v -119.798943 -97.815338 -23.300028 +v 120.304253 -97.609634 -23.302044 +v -119.782234 -99.778496 -23.300261 +v -119.413895 -99.329964 -23.300028 +v -119.292007 -98.823547 -23.300028 +v -119.418739 -98.242981 -23.300028 +v -130.999985 -112.941383 -23.297308 +v -120.271317 -99.983147 -23.300028 +v 119.775101 -97.823364 -23.300026 +v 119.414658 -98.267891 -23.300026 +v 119.292000 -98.776649 -23.300026 +v 119.418793 -99.357086 -23.300026 +v 130.999985 -112.912247 -23.295227 +v 119.798965 -99.784683 -23.300028 +v 120.274582 -99.987534 -23.300028 +v -124.014038 -100.012764 -23.300028 +v 124.516403 -100.047935 -23.300028 +v 130.535095 -104.873734 -23.300028 +v 130.968750 -106.630760 -23.300028 +v 129.995178 -103.750000 -23.300028 +v -125.376114 -100.228828 -23.300028 +v 126.255981 -100.514694 -23.300028 +v -126.550491 -100.648407 -23.300028 +v -127.530922 -101.164246 -23.300028 +v 127.250000 -101.004791 -23.300028 +v -130.951736 -106.481728 -23.300028 +v -130.485199 -104.743790 -23.300028 +v -129.995178 -103.750000 -23.300028 +v 128.280075 -101.708534 -23.300028 +v 129.379150 -102.828224 -23.300028 +v -128.518478 -101.926392 -23.300028 +v -129.291534 -102.720024 -23.300028 +v -121.480598 -97.600281 -23.220627 +v -122.731308 -97.600006 -22.781506 +v -121.485016 -97.600006 -20.050444 +v -123.614120 -97.600006 -22.219757 +v -122.037872 -97.600006 -19.599304 +v -124.361351 -97.600006 -21.486292 +v -124.939278 -97.600006 -20.614075 +v -122.450729 -97.600006 -18.814415 +v -125.323242 -97.600006 -19.641140 +v -125.485359 -97.600006 -18.718697 +v -121.523247 148.500000 -20.028318 +v -122.089958 148.500000 -19.534952 +v -122.470726 148.500000 -18.742956 +v -122.337410 148.500000 -22.956833 +v -123.265381 148.500000 -22.473095 +v -124.272751 148.500000 -21.607742 +v -124.981422 148.500000 -20.531307 +v -125.347275 148.500000 -19.551422 +v -122.499443 -97.575020 -12.604840 +v -125.499992 -97.582451 -12.797888 +v -125.499992 -97.388100 -11.691212 +v -122.499992 -97.228371 -11.199620 +v -125.499992 -96.927032 -10.522801 +v -122.499992 -96.796204 -10.300028 +v -122.499992 -96.303345 -9.562597 +v -125.499992 -96.233238 -9.476027 +v -122.499992 -95.423882 -8.666689 +v -125.499992 -95.614807 -8.841157 +v -125.499992 -94.824959 -8.231556 +v -122.499992 -94.376930 -7.972893 +v -125.499992 -93.700737 -7.671827 +v -122.499992 -93.208542 -7.511895 +v -125.499992 -92.295341 -7.325005 +v -122.499992 -92.102417 -7.317586 +v 121.332619 -97.600105 -23.236347 +v 121.332466 -97.600006 -20.136358 +v 122.337379 -97.600006 -22.956894 +v 123.265419 -97.600006 -22.473129 +v 122.085442 -97.600006 -19.541189 +v 124.272774 -97.600006 -21.607773 +v 124.981400 -97.600006 -20.531393 +v 122.456230 -97.600006 -18.768280 +v 125.347252 -97.600006 -19.551569 +v 125.486282 -97.600006 -18.692442 +v 125.500000 -92.102417 -7.317586 +v 125.500000 -97.575020 -12.604840 +v 122.499359 -97.582451 -12.797888 +v 122.500000 -97.388100 -11.691212 +v 125.500000 -97.228371 -11.199620 +v 122.500000 -96.927032 -10.522801 +v 125.500000 -96.796204 -10.300028 +v 125.500000 -96.303345 -9.562597 +v 122.500000 -96.233238 -9.476027 +v 125.500000 -95.423882 -8.666689 +v 122.500000 -95.614807 -8.841157 +v 122.500000 -94.824959 -8.231556 +v 125.500000 -94.376930 -7.972893 +v 122.500000 -93.700737 -7.671827 +v 125.500000 -93.208542 -7.511895 +v 122.499886 -92.295341 -7.325005 +v 130.999985 -114.250908 -23.086523 +v 130.999985 -113.900215 -20.052269 +v 130.999985 -115.623672 -22.574188 +v 130.999985 -114.816292 -19.578260 +v 130.999985 -116.859962 -21.787552 +v 130.999985 -117.905518 -20.761232 +v 130.999985 -115.716095 -18.701925 +v 130.999985 -118.714859 -19.540068 +v 130.999985 -116.225327 -17.770367 +v 130.999985 -119.252548 -18.177534 +v 130.999985 -116.490425 -16.759218 +v 130.999985 -119.489388 -16.806313 +v -130.999985 -113.572533 -20.158754 +v -130.999985 -114.376450 -23.052889 +v -130.999985 -114.351540 -19.851315 +v -130.999985 -115.347198 -22.694849 +v -130.999985 -116.371674 -22.142324 +v -130.999985 -115.049248 -19.388901 +v -130.999985 -117.183899 -21.502045 +v -130.999985 -115.635872 -18.791319 +v -130.999985 -117.987297 -20.660238 +v -130.999985 -116.085358 -18.084764 +v -130.999985 -118.773872 -19.424257 +v -130.999985 -116.378059 -17.300266 +v -130.999985 -119.286194 -18.052002 +v -130.999985 -116.495605 -16.551306 +v -130.999985 -119.490387 -16.758808 +v 130.989014 -116.500000 -14.381718 +v 130.961365 -119.500000 -13.985286 +v 130.817078 -116.500000 -13.299699 +v 130.588028 -119.500000 -12.594712 +v 130.377716 -116.500000 -12.122287 +v 130.196182 -119.500000 -11.800031 +v 129.703339 -116.500000 -11.062609 +v 129.633224 -119.500000 -10.976038 +v 128.823898 -116.500000 -10.166730 +v 129.014786 -119.500000 -10.341161 +v 128.224899 -119.500000 -9.731530 +v 128.000000 -116.500000 -9.603883 +v 127.204735 -116.500000 -9.211755 +v 127.100731 -119.500000 -9.171831 +v 125.814484 -116.500000 -8.838605 +v 125.695335 -119.500000 -8.825008 +v 88.180832 -119.500000 -8.788692 +v 88.190269 -116.500000 -8.791777 +v 87.377190 -119.500000 -8.650752 +v 87.379242 -116.500000 -8.645697 +v 84.047554 -116.500000 -7.280856 +v 84.847519 -119.500000 -7.598902 +v 81.590515 -119.500000 -6.468049 +v 79.865524 -116.500000 -5.997742 +v 77.368362 -119.500000 -5.457813 +v 75.603195 -116.500000 -5.173487 +v 74.333740 -119.500000 -5.030953 +v 71.736549 -116.500000 -4.830858 +v 71.447136 -119.500000 -4.819301 +v -71.736549 -119.500000 -4.830859 +v -71.447136 -116.500000 -4.819300 +v -84.047539 -119.500000 -7.280851 +v -84.847519 -116.500000 -7.598901 +v -81.590515 -116.500000 -6.468049 +v -79.865524 -119.500000 -5.997742 +v -77.368362 -116.500000 -5.457813 +v -75.603195 -119.500000 -5.173487 +v -74.333740 -116.500000 -5.030953 +v -88.190269 -119.500000 -8.791777 +v -88.180832 -116.500000 -8.788692 +v -87.377190 -116.500000 -8.650750 +v -87.379227 -119.500000 -8.645694 +v -130.989014 -119.500000 -14.381718 +v -130.961365 -116.500000 -13.985286 +v -130.817078 -119.500000 -13.299699 +v -130.588028 -116.500000 -12.594712 +v -130.377716 -119.500000 -12.122287 +v -130.196182 -116.500000 -11.800031 +v -129.703339 -119.500000 -11.062609 +v -129.633224 -116.500000 -10.976038 +v -128.823883 -119.500000 -10.166717 +v -129.014786 -116.500000 -10.341161 +v -128.224930 -116.500000 -9.731552 +v -127.999992 -119.500000 -9.603883 +v -127.204689 -119.500000 -9.211740 +v -127.100693 -116.500000 -9.171818 +v -125.814468 -119.500000 -8.838605 +v -125.695320 -116.500000 -8.825008 +v 126.792892 116.000000 -4.399983 +v 126.792892 -112.000000 -4.400032 +v -126.792892 116.000000 -4.399983 +v -126.792892 -112.000000 -4.400032 +v -127.999992 114.792900 -4.399983 +v 128.000000 114.792900 -4.399983 +v 128.000000 -110.792908 -4.400032 +v -127.999992 -110.792908 -4.400032 +v -128.499985 115.000000 -3.899983 +v -126.999992 116.500000 -0.899983 +v -126.999992 116.500000 -3.899983 +v -128.499985 115.000000 -0.899983 +v -126.792892 116.000000 -0.399983 +v -127.999992 114.792900 -0.399983 +v 126.792892 116.000000 -0.399983 +v 127.000000 116.500000 -0.899983 +v 127.000000 116.500000 -3.899983 +v -128.499985 -111.000000 -0.900032 +v -127.999992 -110.792908 -0.400032 +v -128.499985 -111.000000 -3.900032 +v 128.499985 115.000000 -0.899983 +v 128.499985 115.000000 -3.899983 +v 128.000000 114.792900 -0.399983 +v -126.999992 -112.500000 -3.900032 +v -126.999992 -112.500000 -0.900032 +v -126.792892 -112.000000 -0.400032 +v 128.000000 -110.792908 -0.400032 +v 128.499985 -111.000000 -0.900032 +v 128.499985 -111.000000 -3.900032 +v 127.000000 -112.500000 -0.900032 +v 126.792892 -112.000000 -0.400032 +v 127.000000 -112.500000 -3.900032 +v -113.499512 -104.925499 -6.290667 +v -113.499794 -104.696381 -5.941831 +v -113.499992 -104.950165 -5.898036 +v -98.500351 -104.753258 -5.915757 +v -98.500107 -104.863670 -6.305339 +v -113.499992 -112.403862 -5.902736 +v -113.499992 -112.401367 -6.304688 +v -113.499992 -112.576485 -5.856108 +v -113.499992 -112.850365 -6.169373 +v -113.499992 -112.735107 -5.680000 +v -113.499992 -113.135582 -5.749354 +v -113.499992 -113.119308 -0.120282 +v -113.499992 -112.720406 -0.196579 +v -98.499992 -112.518532 -5.886173 +v -98.499992 -112.584015 -6.289790 +v -98.499992 -113.006104 -6.019112 +v -98.499969 -112.717926 -5.719210 +v -98.499481 -113.155006 -5.553756 +v -98.494156 -112.745590 -5.550069 +v -113.499992 -112.835075 0.240816 +v -113.499992 -112.423920 -0.023948 +v -113.499992 -112.392403 0.382573 +v -98.498772 -112.756721 -0.373211 +v -98.499809 -113.152428 -0.379375 +v -98.499992 -113.078110 -0.050501 +v -98.499992 -112.611053 -0.093820 +v -98.499992 -112.857735 0.224349 +v -98.499992 -112.440186 0.380228 +v -98.499992 -112.381073 -0.025535 +v -113.499908 -107.268150 -1.232720 +v -113.499733 -107.277565 -1.645689 +v -113.495285 -106.151192 -0.649756 +v -113.469170 -105.784584 -0.907685 +v -98.500359 -107.288628 -1.237510 +v -98.500069 -107.214096 -1.645461 +v -99.718605 -104.795349 -0.381813 +v -98.511063 -105.896660 -0.967468 +v -112.237427 -104.788513 -0.378215 +v -99.130211 -105.010773 -0.496472 +v -98.692696 -105.437569 -0.723395 +v -113.196884 -105.291206 -0.645579 +v -112.752754 -104.947914 -0.463047 +v -120.283081 -104.935890 -5.899981 +v -124.041954 -112.380196 -5.900015 +v -124.345459 -108.882858 -5.900032 +v -123.648956 -109.099205 -5.900032 +v -122.105476 -108.302788 -5.900032 +v -123.083359 -109.054390 -5.900032 +v -122.518867 -108.775360 -5.900032 +v -124.864326 -108.353592 -5.900032 +v -125.176270 -112.113762 -5.900033 +v -126.244164 -111.573875 -5.900033 +v -127.169693 -110.760399 -5.900033 +v -127.705376 -104.983971 -5.900032 +v -128.254196 -106.228333 -5.900032 +v -128.404648 -107.393890 -5.900032 +v -128.317169 -108.468346 -5.900032 +v -127.866142 -109.755821 -5.900033 +v -125.104385 -107.683228 -5.900032 +v -121.904442 -107.708160 -5.900032 +v -121.981270 -106.939384 -5.900032 +v -125.024849 -106.984032 -5.900032 +v -124.744057 -106.485962 -5.900032 +v -122.370270 -106.358353 -5.900032 +v -126.720436 -104.940346 -5.900032 +v -124.351341 -106.133759 -5.900032 +v -125.971497 -104.207916 -5.900032 +v -121.109909 -104.151787 -5.900032 +v -122.835838 -106.034187 -5.900032 +v -125.004074 -103.676003 -5.900031 +v -122.082436 -103.643372 -5.900031 +v -123.595512 -105.883949 -5.900032 +v -122.891411 -103.440079 -5.900031 +v -123.930885 -103.410545 -5.900031 +v -99.762520 -102.508858 -7.193946 +v -112.437813 -102.537514 -7.177415 +v -98.719894 -103.106201 -6.849077 +v -98.519432 -103.555161 -6.589985 +v -99.192123 -102.689484 -7.089674 +v -113.032555 -102.844978 -6.999902 +v -113.495285 -103.661278 -6.528798 +v -113.365311 -103.244720 -6.769102 +v -112.164268 -102.703552 -7.543434 +v -99.715584 -102.715805 -7.536356 +v -112.700294 -102.838028 -7.465782 +v -99.143272 -102.914772 -7.421479 +v -98.692696 -103.345505 -7.172802 +v -98.511055 -103.795998 -6.913196 +v -113.469170 -103.685844 -6.976448 +v -113.196938 -103.202034 -7.255642 +v -123.870140 -105.914825 -6.300029 +v -124.108574 -103.440071 -6.300029 +v -123.069107 -103.410545 -6.300029 +v -123.083351 -105.945625 -6.300029 +v -124.917564 -103.643372 -6.300029 +v -121.995911 -103.676010 -6.300029 +v -125.890121 -104.151817 -6.300029 +v -122.400894 -106.311417 -6.300029 +v -121.028503 -104.207909 -6.300029 +v -124.560188 -106.288651 -6.300029 +v -126.715698 -104.934837 -6.300029 +v -120.279839 -104.940414 -6.300001 +v -124.984863 -106.874008 -6.300030 +v -121.947678 -107.055283 -6.300030 +v -122.134476 -108.351173 -6.300030 +v -121.912720 -107.764015 -6.300030 +v -125.111130 -107.617622 -6.300030 +v -124.161758 -112.365791 -6.300035 +v -124.894539 -108.302742 -6.300030 +v -125.266083 -112.080132 -6.300033 +v -126.352432 -111.498817 -6.300033 +v -127.232658 -110.688118 -6.300034 +v -127.692566 -104.972702 -6.300030 +v -128.215454 -106.091179 -6.300030 +v -128.403107 -107.337410 -6.300030 +v -128.350403 -108.256805 -6.300031 +v -127.984772 -109.527443 -6.300033 +v -124.475876 -108.782425 -6.300035 +v -122.564178 -108.808975 -6.300035 +v -123.977356 -109.033783 -6.300033 +v -123.273483 -109.103020 -6.300034 +v -112.281502 -104.983139 -0.028692 +v -98.519440 -106.043015 -0.592111 +v -99.762512 -104.976540 -0.024644 +v -98.719910 -105.585251 -0.348906 +v -99.190887 -105.162781 -0.124252 +v -113.308205 -105.610222 -0.362170 +v -112.798042 -105.159676 -0.122605 +v -98.326378 -113.189217 -5.549622 +v -98.125603 -112.840919 -5.549874 +v -98.346329 -113.179306 -0.381882 +v -98.122849 -112.837944 -0.382129 +v -94.418640 -117.086685 -0.392829 +v -94.102501 -116.836975 -0.401198 +v -94.041710 -116.897942 -5.523133 +v -94.385391 -117.119865 -5.530602 +v -93.248222 -117.691116 -1.643624 +v -93.278313 -117.661041 -4.525964 +v -93.593376 -117.345970 -5.182483 +v -93.685204 -117.254150 -0.645702 +v -93.385139 -117.554199 -1.109923 +v -93.983215 -117.521812 -5.299919 +v -93.659790 -117.845245 -4.809508 +v -93.531029 -117.974007 -4.287407 +v -93.555519 -117.949516 -1.439597 +v -93.806717 -117.698318 -0.846351 +v -94.094833 -117.410194 -0.544410 +v 113.499519 -104.696648 -5.939164 +v 113.499840 -104.930397 -6.285290 +v 113.500000 -104.950111 -5.898717 +v 98.500404 -104.866028 -6.305832 +v 98.500092 -104.755470 -5.918425 +v 98.554482 -103.585854 -7.034211 +v 113.500000 -112.419914 -5.914762 +v 113.500000 -112.404060 -6.303746 +v 113.500000 -112.814133 -6.189299 +v 113.500000 -112.732468 -5.691329 +v 113.500000 -113.122543 -5.799522 +v 113.500000 -112.735374 -0.252623 +v 113.500000 -113.130424 -0.154565 +v 98.499992 -112.485909 -5.894973 +v 98.499992 -112.621277 -6.279701 +v 98.499992 -112.702332 -5.747434 +v 98.499992 -113.033752 -5.981179 +v 98.499817 -113.152283 -5.552338 +v 98.487495 -112.738274 -5.550432 +v 113.500000 -112.857735 0.224349 +v 113.500000 -112.485870 -0.019457 +v 113.500000 -112.440186 0.380228 +v 98.499466 -113.155251 -0.377895 +v 98.499969 -112.723473 -0.227026 +v 98.499992 -112.750000 -0.381767 +v 98.499992 -113.066734 -0.028299 +v 98.499992 -112.835075 0.240816 +v 98.499992 -112.486038 -0.026784 +v 98.499992 -112.392403 0.382573 +v 113.499641 -107.288414 -1.237147 +v 113.499924 -107.221558 -1.644919 +v 113.495285 -105.963409 -1.002908 +v 113.482582 -106.059982 -0.600996 +v 98.500092 -107.287163 -1.231096 +v 98.500473 -107.119835 -1.607435 +v 98.499992 -107.442665 -1.619605 +v 98.519989 -105.850006 -0.942378 +v 99.762573 -104.788605 -0.378049 +v 113.310593 -105.426094 -0.717291 +v 98.747757 -105.346573 -0.675018 +v 99.247215 -104.947937 -0.463054 +v 112.798149 -104.971954 -0.475823 +v 112.281425 -104.795334 -0.381843 +v 120.280762 -104.939301 -5.899974 +v 124.161591 -112.365814 -5.900041 +v 124.481133 -108.775352 -5.900032 +v 122.096054 -108.292747 -5.900032 +v 123.777817 -109.097626 -5.900032 +v 123.055847 -109.042770 -5.900032 +v 126.710945 -104.934135 -5.900032 +v 124.894539 -108.302765 -5.900032 +v 122.568306 -108.812569 -5.900032 +v 125.266022 -112.080162 -5.900033 +v 126.352356 -111.498863 -5.900033 +v 127.235878 -110.684738 -5.900033 +v 127.984848 -105.510780 -5.900032 +v 128.236313 -108.789978 -5.900032 +v 128.411392 -107.570511 -5.900032 +v 128.278763 -106.376389 -5.900032 +v 127.836113 -109.805634 -5.900033 +v 127.669876 -104.965614 -5.900032 +v 125.095566 -107.708069 -5.900032 +v 121.902435 -107.665779 -5.900032 +v 121.940353 -107.110680 -5.900032 +v 125.020500 -106.944038 -5.900032 +v 122.159836 -106.614799 -5.900032 +v 124.629768 -106.358398 -5.900032 +v 122.610275 -106.152077 -5.900032 +v 121.028549 -104.207870 -5.900032 +v 124.164169 -106.034195 -5.900032 +v 123.377098 -105.882690 -5.900032 +v 121.995842 -103.676041 -5.900031 +v 126.010841 -104.226738 -5.900032 +v 124.917488 -103.643349 -5.900031 +v 124.108589 -103.440079 -5.900031 +v 123.069069 -103.410553 -5.900031 +v 98.511055 -103.595947 -6.566602 +v 99.737251 -102.513840 -7.191072 +v 112.237526 -102.508865 -7.193945 +v 98.694313 -103.139557 -6.829818 +v 113.480286 -103.552589 -6.591471 +v 113.245514 -103.052094 -6.880321 +v 99.157127 -102.710800 -7.077363 +v 112.752754 -102.665260 -7.103669 +v 99.609573 -102.725800 -7.530644 +v 112.281433 -102.715607 -7.536579 +v 113.280121 -103.296547 -7.201065 +v 113.488785 -103.793900 -6.914021 +v 112.798103 -102.888779 -7.436486 +v 99.001900 -103.015198 -7.363509 +v 123.607086 -105.894508 -6.300029 +v 123.930862 -103.410545 -6.300029 +v 122.891365 -103.440079 -6.300029 +v 122.917824 -105.996483 -6.300029 +v 122.082375 -103.643394 -6.300029 +v 124.341850 -106.117165 -6.300029 +v 125.004021 -103.675987 -6.300029 +v 121.109894 -104.151802 -6.300029 +v 125.940239 -104.185684 -6.300029 +v 122.370323 -106.358299 -6.300029 +v 120.284874 -104.934319 -6.299974 +v 126.720154 -104.940269 -6.300029 +v 125.067200 -107.134468 -6.300030 +v 125.062706 -107.933044 -6.300030 +v 124.840096 -106.614677 -6.300029 +v 124.044334 -112.379829 -6.299971 +v 122.047325 -106.811668 -6.300029 +v 121.957108 -107.977531 -6.300030 +v 121.902435 -107.334229 -6.300030 +v 125.176231 -112.113785 -6.300033 +v 126.244125 -111.573906 -6.300033 +v 127.171951 -110.758118 -6.300034 +v 127.686363 -104.976646 -6.300030 +v 127.999123 -105.543640 -6.300030 +v 128.300034 -106.471367 -6.300030 +v 128.407745 -107.702271 -6.300030 +v 128.181396 -108.992409 -6.300033 +v 122.285065 -108.555832 -6.300030 +v 124.673141 -108.601311 -6.300033 +v 122.847336 -108.974190 -6.300034 +v 124.162331 -108.966446 -6.300034 +v 123.550743 -109.108284 -6.300034 +v 127.743515 -109.962273 -6.300034 +v 98.518402 -106.015022 -0.576808 +v 99.718506 -104.983116 -0.028731 +v 113.245491 -105.530182 -0.319623 +v 98.769402 -105.518837 -0.313582 +v 112.237511 -104.976295 -0.025104 +v 112.752716 -105.135696 -0.109857 +v 99.201920 -105.159698 -0.122616 +v 98.335167 -113.182594 -5.549920 +v 98.062172 -112.884262 -5.549552 +v 98.185387 -112.803619 -0.381866 +v 98.326126 -113.189362 -0.382180 +v 94.135887 -116.803902 -0.392826 +v 94.383286 -117.121971 -0.401478 +v 94.324425 -117.180733 -5.523123 +v 94.102478 -116.836937 -5.530604 +v 93.253868 -117.685486 -4.364363 +v 93.431343 -117.508011 -4.925447 +v 93.735924 -117.203400 -5.330145 +v 93.263680 -117.675674 -1.518235 +v 93.443596 -117.495735 -0.982359 +v 93.763214 -117.176125 -0.576032 +v 93.528664 -117.977074 -4.225070 +v 93.625305 -117.879730 -4.715205 +v 93.880737 -117.624275 -5.185385 +v 93.537170 -117.967857 -1.580292 +v 93.990219 -117.514809 -0.620049 +v 93.694748 -117.810280 -1.051726 +v -93.457199 107.408188 -5.899989 +v -92.471741 107.428665 -5.899989 +v -116.421928 107.690308 -5.899989 +v -117.723480 107.392021 -5.899989 +v -118.682686 107.451340 -5.899989 +v -91.678413 107.609406 -5.899989 +v -94.632759 107.721680 -5.899989 +v -119.602753 107.713234 -5.899989 +v -90.766449 108.051056 -5.899989 +v -88.072945 110.981140 -5.899985 +v -95.563309 108.288452 -5.899989 +v -89.881233 108.817245 -5.899989 +v -121.261696 108.937073 -5.899989 +v -120.566490 108.291306 -5.899989 +v -122.929337 110.965004 -5.899985 +v -115.358192 108.352219 -5.899989 +v -96.260963 108.936569 -5.899927 +v -114.685974 108.956573 -5.899958 +v -92.376839 110.017067 -5.899984 +v -116.716599 110.515991 -5.899984 +v -117.292595 110.051674 -5.899984 +v -117.972672 109.891693 -5.899984 +v -118.636246 110.019333 -5.899984 +v -116.453796 111.069145 -5.899984 +v -89.582787 108.977974 -5.899989 +v -116.394730 111.606445 -5.899683 +v -92.972641 109.891693 -5.899874 +v -89.007599 109.003036 -5.899989 +v -88.616379 109.230896 -5.899990 +v -88.273994 110.005592 -5.899982 +v -97.999992 108.986526 -5.899444 +v -104.266434 110.355560 -5.888364 +v -112.999992 108.982887 -5.896468 +v -106.771355 110.365898 -5.885510 +v -122.699768 109.924782 -5.899983 +v -121.959541 108.994751 -5.899990 +v -122.353432 109.196281 -5.899990 +v -93.636230 110.019333 -5.899706 +v -122.780365 111.516769 -5.899985 +v -91.868309 110.356567 -5.899985 +v -94.157387 110.387894 -5.899706 +v -119.157417 110.387932 -5.899984 +v -88.224861 111.581909 -5.899985 +v -91.525284 110.851791 -5.899985 +v -94.451607 110.806999 -5.899706 +v -119.481621 110.866241 -5.899985 +v -107.254250 110.957619 -5.896412 +v -117.217361 112.911865 -5.899669 +v -116.590553 112.297836 -5.899670 +v -117.942871 113.116211 -5.899650 +v -91.382301 111.522881 -5.899984 +v -94.611031 111.462395 -5.899826 +v -119.609612 111.556183 -5.899985 +v -91.590561 112.297852 -5.899985 +v -119.436722 112.228004 -5.899985 +v -122.915993 111.992317 -5.899990 +v -94.451820 112.203018 -5.899984 +v -92.291740 112.959991 -5.899984 +v -119.015717 112.747292 -5.899984 +v -118.545944 113.009422 -5.900004 +v -88.063522 112.029976 -5.899984 +v -120.575012 115.733574 -5.899984 +v -121.562607 114.962120 -5.899984 +v -122.832520 112.622887 -5.899985 +v -118.511703 116.430450 -5.899996 +v -112.999992 116.470177 -5.905325 +v -119.653870 116.178001 -5.899984 +v -89.627434 115.139854 -5.899984 +v -90.693741 115.899643 -5.899983 +v -94.015778 112.747238 -5.899984 +v -93.545959 113.009415 -5.899984 +v -91.705811 116.283203 -5.899983 +v -92.574860 116.438957 -5.899793 +v -88.303055 113.080490 -5.899984 +v -97.999992 116.450958 -5.900380 +v -122.418610 113.763077 -5.899984 +v -93.030785 113.108910 -5.899984 +v -88.770714 114.097679 -5.899984 +v -88.071281 112.023727 -6.249987 +v -88.353348 113.244545 -6.249987 +v -88.869331 114.238022 -6.249987 +v -89.526070 115.043114 -6.249987 +v -90.425079 115.733627 -6.249986 +v -91.346169 116.178009 -6.249986 +v -92.487869 116.430382 -6.249986 +v -88.300186 109.924904 -6.249987 +v -88.646561 109.196289 -6.249988 +v -88.066315 110.978760 -6.249987 +v -98.000145 111.329643 -1.306486 +v -98.000343 111.284821 -1.658780 +v -97.999992 116.446060 -0.036659 +v -97.999992 116.501801 0.318218 +v -97.999992 116.668297 -0.113920 +v -97.999992 116.999046 0.068039 +v -97.999428 116.804558 -0.382584 +v -97.992462 117.146606 -0.392939 +v -97.999992 116.449997 -6.249986 +v -97.999992 116.677109 -6.219506 +v -97.999992 116.628044 -5.859048 +v -97.999992 117.038368 -5.959882 +v -97.999771 116.804825 -5.589553 +v -97.988678 117.141571 -5.551567 +v -98.000267 108.964531 -6.242128 +v -98.000107 108.732391 -5.942806 +v -112.999786 108.967407 -6.242245 +v -98.552956 107.589096 -7.003625 +v -112.423355 107.587151 -7.004711 +v -98.025063 108.025566 -6.751427 +v -98.226402 107.753662 -6.908240 +v -112.991585 108.092934 -6.712529 +v -112.801086 107.766960 -6.900558 +v -94.578064 107.690315 -6.249988 +v -93.276512 107.392021 -6.249988 +v -119.566055 107.687584 -6.249988 +v -118.310516 107.399757 -6.249988 +v -92.073479 107.491287 -6.249988 +v -117.306091 107.453941 -6.249988 +v -116.367241 107.721672 -6.249988 +v -91.126602 107.847733 -6.249988 +v -88.187202 111.259911 -6.249987 +v -95.641525 108.352013 -6.249988 +v -89.738297 108.937073 -6.249988 +v -90.436714 108.288429 -6.249988 +v -120.641571 108.352051 -6.249988 +v -121.308395 108.958084 -6.249988 +v -122.928596 110.977837 -6.249987 +v -115.435402 108.289360 -6.249988 +v -122.796249 111.345139 -6.249987 +v -96.130859 108.835815 -6.249988 +v -114.891869 108.815964 -6.249988 +v -92.292458 110.042313 -6.249987 +v -94.082542 110.306168 -6.249987 +v -93.530800 109.985214 -6.249987 +v -93.027306 109.891693 -6.249987 +v -118.707375 110.051666 -6.249987 +v -94.474319 110.856720 -6.249987 +v -114.621017 108.966179 -6.249984 +v -96.413216 108.976440 -6.249709 +v -94.611168 111.539703 -6.249810 +v -104.237610 110.403954 -6.242070 +v -118.027336 109.891693 -6.249827 +v -89.040466 108.994743 -6.249988 +v -106.755104 110.442375 -6.233991 +v -107.157143 110.736473 -6.245662 +v -122.725990 110.005554 -6.249987 +v -121.992378 109.003029 -6.249988 +v -122.383606 109.230888 -6.249988 +v -117.363731 110.019341 -6.249716 +v -116.842575 110.387924 -6.249753 +v -119.283401 110.516006 -6.249987 +v -91.654900 110.608009 -6.249987 +v -103.869957 110.727264 -6.241818 +v -116.518379 110.866234 -6.249715 +v -119.601173 111.253990 -6.249987 +v -91.378632 111.421478 -6.249987 +v -116.392204 111.549171 -6.249715 +v -88.205940 111.620117 -6.249987 +v -122.813408 111.741768 -6.249987 +v -91.525772 112.149673 -6.249987 +v -118.519196 113.018822 -6.249987 +v -119.089600 112.699272 -6.249987 +v -119.515198 112.046059 -6.249987 +v -103.858253 112.262878 -6.245065 +v -91.830063 112.600189 -6.249987 +v -112.999992 116.454048 -6.250648 +v -94.484596 112.111603 -6.249987 +v -116.526878 112.151657 -6.249769 +v -92.337517 112.971985 -6.249987 +v -121.372597 115.139809 -6.249987 +v -120.306221 115.899666 -6.249986 +v -122.927307 112.003471 -6.249987 +v -122.173409 114.181870 -6.249987 +v -118.425499 116.438911 -6.249986 +v -119.294159 116.283211 -6.249986 +v -94.197571 112.573898 -6.249987 +v -122.700172 113.098145 -6.249987 +v -116.830055 112.600174 -6.249987 +v -93.708115 112.944855 -6.249987 +v -117.337502 112.971977 -6.249987 +v -93.057114 113.116203 -6.249987 +v -117.969193 113.108917 -6.249987 +v -112.999992 116.760338 -6.183825 +v -112.999992 117.041199 -5.942510 +v -113.007523 117.146599 -5.551701 +v -113.011307 117.141563 -0.393072 +v -112.999992 116.339027 0.301899 +v -112.999992 116.673340 0.277984 +v -112.999992 117.038368 0.015241 +v -112.999535 111.321297 -1.300562 +v -112.379631 108.968468 -0.092693 +v -98.475334 108.995598 -0.106952 +v -112.983459 109.462547 -0.349791 +v -112.744789 109.107712 -0.165509 +v -98.163330 109.205498 -0.216355 +v -98.008926 109.484711 -0.361415 +v -112.508896 108.828346 -0.414637 +v -98.518517 108.819817 -0.410019 +v -112.999886 111.295853 -1.667535 +v -98.008667 109.344498 -0.682835 +v -98.144615 109.057861 -0.534070 +v -112.845184 109.051636 -0.530834 +v -112.991425 109.329285 -0.675166 +v -112.999992 116.467468 -0.037616 +v -112.999992 116.730728 -0.166269 +v -113.000198 116.799858 -0.392486 +v -113.001457 116.798187 -5.550020 +v -113.000076 116.767227 -5.723131 +v -112.999992 108.716454 -5.952114 +v -98.519775 107.421898 -6.695710 +v -112.377480 107.405441 -6.705694 +v -98.206375 107.596001 -6.595117 +v -98.015335 107.880562 -6.430892 +v -112.752441 107.551208 -6.620988 +v -112.983795 107.890961 -6.425009 +v -97.743851 116.844315 -0.394769 +v -97.757713 116.838837 -5.549709 +v -96.479713 117.569489 -0.409993 +v -96.557098 117.929001 -0.439012 +v -96.648811 117.876091 -5.534465 +v -96.490608 117.563240 -5.534006 +v -96.005692 117.843430 -4.930008 +v -96.021057 117.834366 -0.914491 +v -96.195190 117.733711 -0.600994 +v -96.156540 117.756027 -5.314418 +v -96.188637 118.142052 -4.985723 +v -96.200172 118.135406 -0.874624 +v -96.338158 118.055328 -5.309988 +v -113.242294 116.838844 -0.394931 +v -113.256165 116.844322 -5.549870 +v -114.345245 117.872650 -0.409992 +v -114.550301 117.586845 -0.419719 +v -114.496002 117.555489 -5.539159 +v -114.411201 117.910744 -5.516488 +v -114.981857 117.836052 -5.015651 +v -114.822136 117.743729 -0.621010 +v -114.986725 117.838989 -0.947407 +v -114.796585 117.728981 -5.355307 +v -114.803696 118.137421 -0.913932 +v -114.685379 118.068916 -5.273161 +v -114.817238 118.145737 -4.962123 +v -114.629814 118.036835 -0.601007 +v -104.414108 112.413628 -6.139888 +v -106.482231 110.938232 -5.749270 +v -104.493355 110.933571 -5.759127 +v -106.487389 111.903282 -5.670944 +v -106.647697 111.906334 -5.724234 +v -106.769165 111.851471 -5.813412 +v -106.935722 111.982765 -6.094294 +v -106.504074 112.065399 -5.758055 +v -106.648102 111.083740 -5.728839 +v -106.477921 111.119072 -5.663718 +v -106.787575 111.172974 -5.830660 +v -106.873199 112.329819 -6.183705 +v -106.685463 112.454254 -6.183847 +v -104.519966 111.887238 -5.664809 +v -104.342880 111.889977 -5.727822 +v -104.230042 111.827873 -5.807755 +v -104.075012 111.899689 -6.067691 +v -104.480385 112.066589 -5.759784 +v -104.349289 111.098404 -5.724714 +v -104.515678 111.099098 -5.669219 +v -104.229538 111.144989 -5.815945 +v -104.067993 112.163719 -6.151033 +v -104.205994 112.368210 -6.162953 +v -107.128067 112.083672 -6.232297 +v -106.903862 112.594223 -6.247279 +v -106.689117 110.611526 -6.132488 +v -106.897377 110.766296 -6.152784 +v -107.098976 111.000710 -6.212734 +v -106.924095 111.044205 -6.072845 +v -104.342430 110.556915 -6.171640 +v -103.914062 111.960899 -6.203500 +v -104.219086 112.581245 -6.240262 +v -104.131752 110.705536 -6.157367 +v -104.038795 110.982742 -6.130045 +v -103.934410 111.046631 -6.192696 +v -104.480042 111.969444 -5.323241 +v -104.473381 110.699265 -5.496435 +v -106.513138 110.678482 -5.512131 +v -103.769928 112.022125 -5.892881 +v -106.568703 111.870361 -5.316419 +v -106.942986 111.905777 -5.491482 +v -107.224693 111.987534 -5.882084 +v -106.825523 112.077309 -5.472023 +v -106.452087 112.083336 -5.359232 +v -106.580963 112.237206 -5.450602 +v -106.785179 110.866623 -5.471889 +v -106.566093 110.942360 -5.358616 +v -107.039703 111.096970 -5.589523 +v -106.831940 111.129662 -5.421003 +v -106.589676 111.138077 -5.316360 +v -107.035713 112.458000 -5.887029 +v -107.183807 110.896088 -5.858757 +v -104.473587 110.902161 -5.371440 +v -104.436478 111.112213 -5.317396 +v -104.241524 111.926552 -5.386766 +v -103.979485 111.891624 -5.562956 +v -104.249046 112.156982 -5.466810 +v -104.518562 112.293533 -5.482383 +v -106.681541 112.655128 -5.889740 +v -107.048790 110.566238 -5.888335 +v -104.240997 110.857124 -5.468195 +v -104.020943 110.938721 -5.590680 +v -104.108810 111.138252 -5.449102 +v -103.897697 111.157433 -5.667879 +v -103.907387 112.365372 -5.887381 +v -104.220413 112.636398 -5.889463 +v -103.883896 110.655914 -5.886767 +v -103.767960 110.969543 -5.891033 +v 119.277084 106.393517 -4.899989 +v 95.566040 106.687584 -4.899989 +v 94.310516 106.399757 -4.899989 +v 118.311691 106.452644 -4.899989 +v 93.306091 106.453941 -4.899989 +v 120.321587 106.609413 -4.899989 +v 117.367218 106.721680 -4.899989 +v 92.367241 106.721672 -4.899989 +v 121.233490 107.051033 -4.899989 +v 123.923012 109.991776 -4.899984 +v 116.436707 107.288445 -4.899989 +v 122.126549 107.824242 -4.899989 +v 90.738297 107.937073 -4.899988 +v 91.436661 107.288467 -4.899989 +v 89.186546 110.257935 -4.899984 +v 96.641594 107.352066 -4.899989 +v 115.745979 107.930901 -4.899928 +v 97.130836 107.835800 -4.899989 +v 119.623154 109.017067 -4.899989 +v 95.283409 109.516006 -4.899988 +v 94.707375 109.051666 -4.899989 +v 94.027336 108.891693 -4.899989 +v 93.363731 109.019341 -4.899989 +v 95.601173 110.253990 -4.899852 +v 122.426277 107.978027 -4.899989 +v 97.413818 107.976685 -4.899984 +v 119.027367 108.891693 -4.899878 +v 122.994049 108.003273 -4.899989 +v 123.383987 108.229218 -4.899989 +v 123.754089 109.092621 -4.899990 +v 114.000000 107.986526 -4.899444 +v 107.734337 109.350510 -4.891824 +v 98.999992 107.982849 -4.896558 +v 105.343307 109.335587 -4.892531 +v 89.071800 109.991951 -4.899983 +v 89.259972 109.036934 -4.899990 +v 89.919495 108.015945 -4.899989 +v 89.572708 108.301605 -4.899989 +v 118.363785 109.019325 -4.899711 +v 120.196320 109.417709 -4.899988 +v 117.841614 109.387657 -4.899711 +v 92.842575 109.387924 -4.899990 +v 123.775154 110.582008 -4.899984 +v 117.508217 109.886246 -4.899704 +v 92.518379 109.866234 -4.899983 +v 120.556572 110.066063 -4.899984 +v 95.089607 111.699265 -4.899679 +v 94.057129 112.116211 -4.899740 +v 94.582771 111.991867 -4.899984 +v 95.515198 111.046059 -4.899679 +v 117.394417 110.483948 -4.899829 +v 92.392204 110.549171 -4.899984 +v 120.595520 110.678253 -4.899984 +v 89.206841 110.615959 -4.899984 +v 120.401939 111.315758 -4.899984 +v 117.470238 110.998016 -4.899930 +v 92.526878 111.151657 -4.899984 +v 92.830040 111.600159 -4.899984 +v 89.071106 111.024162 -4.900006 +v 119.708931 111.959755 -4.899984 +v 93.337494 111.971970 -4.900055 +v 123.936478 111.029953 -4.899984 +v 91.424995 114.733574 -4.899984 +v 90.526024 114.043068 -4.899984 +v 93.490334 115.430748 -4.900046 +v 98.999992 115.451912 -4.900729 +v 92.346130 115.178001 -4.899984 +v 122.082268 114.384392 -4.899960 +v 121.162155 114.963066 -4.899930 +v 117.766685 111.532646 -4.899930 +v 118.313545 111.963829 -4.899953 +v 120.294167 115.283203 -4.899930 +v 119.426048 115.438835 -4.899759 +v 108.013367 111.471786 -4.891539 +v 123.696945 112.080444 -4.899984 +v 89.289581 112.040268 -4.899984 +v 114.000000 115.451820 -4.901362 +v 122.764908 113.721687 -4.899984 +v 118.969223 112.108917 -4.899984 +v 123.301338 112.968239 -4.899984 +v 89.736198 113.044205 -4.899984 +v 123.928719 111.023720 -5.249987 +v 123.714645 112.026840 -5.249987 +v 123.285194 113.012062 -5.249986 +v 122.386742 114.138947 -5.249986 +v 121.121315 114.991249 -5.249986 +v 119.795052 115.405235 -5.249986 +v 123.474556 108.364761 -5.249987 +v 123.831955 109.388870 -5.249987 +v 123.924683 110.000000 -5.249987 +v 113.999931 110.329643 -0.306486 +v 113.999680 110.284821 -0.658780 +v 113.994652 108.515915 0.622359 +v 114.000000 115.446060 0.963341 +v 114.000000 115.501793 1.318218 +v 114.000000 115.668289 0.886080 +v 114.000000 115.999046 1.068036 +v 114.000565 115.804558 0.617415 +v 114.007538 116.146606 0.607061 +v 114.000000 115.449997 -5.249986 +v 114.000000 115.677109 -5.219506 +v 114.000000 115.720963 -4.791820 +v 114.000000 116.038368 -4.959881 +v 114.000206 115.799850 -4.552153 +v 114.011314 116.141571 -4.551567 +v 113.999580 107.963921 -5.242334 +v 113.999886 107.732391 -4.942805 +v 99.000084 107.967079 -5.242357 +v 113.376526 106.581184 -6.008274 +v 99.599998 106.584969 -6.006034 +v 113.968620 107.002335 -5.764848 +v 113.689171 106.688217 -5.946023 +v 99.298325 106.698257 -5.940228 +v 99.022987 107.017281 -5.756165 +v 117.096085 106.862488 -5.249987 +v 119.182930 106.390770 -5.249988 +v 92.421928 106.690308 -5.249988 +v 93.723480 106.392021 -5.249988 +v 117.969620 106.519394 -5.249988 +v 94.682686 106.451340 -5.249988 +v 120.519264 106.663666 -5.249988 +v 95.602730 106.713234 -5.249988 +v 123.812775 110.259972 -5.249987 +v 116.358482 107.352013 -5.249987 +v 122.270584 107.942039 -5.249987 +v 121.564560 107.289337 -5.249987 +v 91.358437 107.352028 -5.249987 +v 90.691597 107.958092 -5.249987 +v 89.119019 110.065613 -5.249987 +v 96.566505 107.291321 -5.249987 +v 115.869087 107.835846 -5.249987 +v 97.131416 107.838875 -5.249987 +v 119.707535 109.042313 -5.249987 +v 117.769287 109.460953 -5.249987 +v 118.294586 109.050919 -5.249987 +v 118.972694 108.891693 -5.249987 +v 93.292603 109.051674 -5.249987 +v 117.470222 110.002022 -5.249987 +v 115.579910 107.977150 -5.249862 +v 117.394417 110.516022 -5.249832 +v 97.415993 107.973610 -5.249982 +v 107.743530 109.398308 -5.242226 +v 93.972672 108.891693 -5.249852 +v 123.086090 108.019096 -5.249987 +v 105.275436 109.373375 -5.244706 +v 89.160904 109.425552 -5.249987 +v 89.871613 108.037392 -5.249987 +v 89.507072 108.394264 -5.249987 +v 94.636246 109.019333 -5.249716 +v 95.157433 109.387939 -5.249753 +v 92.716599 109.515991 -5.249987 +v 120.393303 109.669777 -5.249987 +v 108.129616 109.768715 -5.237755 +v 95.481613 109.866226 -5.249714 +v 92.453796 110.069145 -5.249987 +v 120.611160 110.460304 -5.249987 +v 95.609612 110.556190 -5.249714 +v 92.394730 110.606445 -5.249987 +v 123.794052 110.620071 -5.249987 +v 89.209145 110.594025 -5.249987 +v 120.451797 111.203079 -5.249987 +v 93.291733 111.959991 -5.249987 +v 92.590561 111.297844 -5.249987 +v 117.489182 111.052124 -5.249907 +v 89.069229 111.041512 -5.249987 +v 98.999992 115.454544 -5.250670 +v 95.436722 111.227997 -5.249831 +v 120.011887 111.753136 -5.249987 +v 119.549400 112.008522 -5.249987 +v 90.627380 114.139801 -5.249986 +v 91.693764 114.899658 -5.249986 +v 89.826332 113.181335 -5.249986 +v 93.577652 115.439323 -5.249986 +v 92.705795 115.283195 -5.249986 +v 117.802475 111.573959 -5.249987 +v 95.015732 111.747284 -5.249987 +v 89.335381 112.183235 -5.249987 +v 118.291832 111.944839 -5.249987 +v 94.545921 112.009430 -5.249987 +v 118.942879 112.116211 -5.249987 +v 94.030800 112.108917 -5.249987 +v 98.999992 115.760338 -5.183825 +v 98.999992 116.041199 -4.942509 +v 98.992462 116.146606 -4.551701 +v 98.988686 116.141571 0.606927 +v 98.999992 115.339027 1.301899 +v 98.999992 115.673340 1.277982 +v 98.999992 116.038376 1.015234 +v 99.000198 110.321304 -0.300562 +v 99.479935 107.988045 0.896983 +v 113.517632 107.989532 0.896202 +v 99.044327 108.353836 0.706629 +v 113.863274 108.231628 0.770063 +v 99.441933 107.839493 0.579550 +v 113.418991 107.810287 0.594986 +v 99.000038 110.295853 -0.667536 +v 113.986069 108.310341 0.334863 +v 113.783447 107.981194 0.505796 +v 99.029411 108.226479 0.378272 +v 98.999992 115.467468 0.962384 +v 98.999992 115.730728 0.833731 +v 98.999786 115.799858 0.607514 +v 98.999428 115.804550 -4.562055 +v 98.999992 115.652847 -4.845448 +v 98.999992 107.716454 -4.952114 +v 113.478729 106.421669 -5.695842 +v 99.479515 106.426086 -5.693498 +v 113.783806 106.587341 -5.600120 +v 113.984993 106.875946 -5.433554 +v 99.040802 106.793175 -5.481410 +v 114.256142 115.844307 0.605231 +v 114.242256 115.838829 -4.549708 +v 115.458786 116.533997 0.599046 +v 115.303352 116.848503 0.594521 +v 115.283752 116.837181 -4.543685 +v 115.548958 116.586067 -4.525201 +v 115.967522 116.827782 0.130243 +v 115.728035 116.689400 0.477969 +v 115.986710 116.838974 -4.003286 +v 115.813538 116.738754 -4.333748 +v 115.798119 117.134293 -4.057592 +v 115.805977 117.139053 0.088237 +v 115.572716 117.003860 0.461469 +v 115.556709 116.994629 -4.419199 +v 98.757683 115.838844 0.605069 +v 98.743820 115.844322 -4.549870 +v 97.716278 116.837219 0.599046 +v 97.519547 116.546524 0.594282 +v 97.440727 116.591995 -4.526853 +v 97.567131 116.923210 -4.509143 +v 97.188873 116.737366 0.407748 +v 97.007202 116.842552 0.009389 +v 97.041718 116.822418 -4.131379 +v 97.188591 117.141930 0.039357 +v 97.200897 117.134979 -4.079837 +v 97.397346 117.021149 0.440425 +v 107.586189 111.413033 -5.139513 +v 105.517776 109.938225 -4.749277 +v 107.506638 109.933578 -4.759125 +v 105.515610 110.905540 -4.671377 +v 105.329254 110.885361 -4.729440 +v 105.227264 110.860260 -4.819574 +v 105.063942 110.942734 -5.089035 +v 105.492996 111.066559 -4.759372 +v 105.351906 110.083733 -4.728831 +v 105.522079 110.119072 -4.663718 +v 105.212433 110.172974 -4.830655 +v 105.090736 111.277710 -5.182544 +v 105.289825 111.425751 -5.166357 +v 107.480034 110.887238 -4.664808 +v 107.657120 110.889969 -4.727819 +v 107.769951 110.827881 -4.807754 +v 107.976868 110.918137 -5.131878 +v 107.519485 111.066910 -4.759967 +v 107.670860 110.114128 -4.729780 +v 107.481453 110.096718 -4.669746 +v 107.772728 110.139778 -4.819564 +v 107.931999 111.163704 -5.151029 +v 107.793999 111.368225 -5.162958 +v 104.871925 111.083664 -5.232297 +v 105.165283 111.584297 -5.243751 +v 105.321037 109.564156 -5.168948 +v 105.174271 109.708855 -5.126842 +v 104.867050 109.734520 -5.241574 +v 104.938721 110.034477 -5.187284 +v 105.075905 110.044197 -5.072843 +v 108.165199 111.197701 -5.242495 +v 107.781578 111.582031 -5.240498 +v 107.706375 109.580956 -5.160128 +v 107.912750 109.795784 -5.151037 +v 107.937347 110.100189 -5.084785 +v 107.520111 110.969406 -4.323245 +v 107.526360 109.699219 -4.496430 +v 105.482056 109.681274 -4.510768 +v 108.196640 110.972534 -4.851724 +v 104.779068 111.014053 -4.882636 +v 105.427185 110.870232 -4.316616 +v 105.175392 110.908806 -4.418930 +v 104.970909 110.892014 -4.579121 +v 105.519333 111.092667 -4.364466 +v 105.248383 111.152390 -4.464416 +v 105.505302 111.314125 -4.503884 +v 105.214134 109.870827 -4.470306 +v 105.433907 109.942360 -4.358616 +v 104.959518 110.094780 -4.591235 +v 105.168060 110.129669 -4.420999 +v 105.410324 110.138077 -4.316359 +v 104.925430 111.389008 -4.884177 +v 105.247055 111.639610 -4.887202 +v 107.526413 109.902161 -4.371441 +v 107.563560 110.112267 -4.317392 +v 107.824005 110.858505 -4.408923 +v 108.072060 110.865387 -4.627129 +v 107.873337 111.071869 -4.500808 +v 107.671715 111.185608 -4.450884 +v 107.475281 111.289795 -4.479084 +v 105.022705 109.493622 -4.887904 +v 104.846115 109.765907 -4.884669 +v 104.769356 110.036293 -4.887146 +v 107.817123 109.886459 -4.480720 +v 108.074448 110.121819 -4.631178 +v 107.852768 110.164177 -4.424860 +v 107.720177 111.648094 -4.889249 +v 108.228195 111.130844 -4.894429 +v 108.065651 109.590736 -4.887218 +v 108.229324 109.983955 -4.889183 +vn 0.9920 0.0812 -0.0970 +vn 0.6018 -0.4497 -0.6600 +vn 0.9337 0.2674 -0.2381 +vn 0.9731 0.0429 -0.2264 +vn 0.9485 0.1342 -0.2870 +vn 0.9469 0.2018 -0.2504 +vn 0.9710 0.1956 -0.1376 +vn 0.9804 0.1878 -0.0594 +vn 0.9762 0.2145 -0.0332 +vn 0.5118 0.8590 -0.0140 +vn 0.9281 0.0167 -0.3721 +vn 0.8325 -0.1217 -0.5406 +vn 0.8513 0.0321 -0.5237 +vn 0.7272 -0.3517 -0.5895 +vn 0.7791 -0.4597 -0.4263 +vn 0.7649 -0.5738 -0.2927 +vn 0.5350 -0.8094 -0.2422 +vn 0.9657 0.0398 -0.2564 +vn 0.9332 0.2965 -0.2032 +vn 0.9457 0.1807 -0.2700 +vn -0.9906 -0.0633 0.1214 +vn -0.9910 -0.1074 0.0803 +vn -0.3957 -0.0295 -0.9179 +vn -0.9911 -0.0264 0.1303 +vn -0.9924 -0.1060 0.0619 +vn -0.4882 -0.1599 -0.8580 +vn -0.7682 0.6138 0.1818 +vn -0.3601 -0.9007 0.2431 +vn -0.6369 -0.3816 -0.6698 +vn -0.9466 -0.0517 -0.3182 +vn -0.4449 0.2629 -0.8561 +vn -0.9874 -0.1369 0.0794 +vn -0.9897 -0.0444 0.1363 +vn -0.3555 -0.2831 -0.8908 +vn -1.0000 0.0046 0.0082 +vn -0.9109 0.3685 -0.1854 +vn -0.9745 0.0170 -0.2238 +vn -0.9829 0.0783 -0.1667 +vn -0.9783 0.1467 -0.1462 +vn -0.9817 0.1699 -0.0861 +vn -0.4923 0.8653 0.0941 +vn -0.9968 -0.0521 0.0598 +vn -0.9575 -0.0683 -0.2801 +vn -0.2931 0.5239 -0.7998 +vn -0.7047 -0.4149 -0.5756 +vn -0.7850 -0.5208 -0.3354 +vn -0.5611 -0.7657 -0.3143 +vn -0.9785 0.1906 -0.0789 +vn -0.9512 0.0496 -0.3047 +vn -0.9325 0.2992 -0.2024 +vn -0.9728 0.1206 -0.1976 +vn 0.9994 -0.0268 0.0214 +vn 0.9935 -0.0600 0.0970 +vn 0.9586 0.2737 -0.0784 +vn 0.9946 -0.0284 0.1003 +vn 0.9934 -0.0908 0.0699 +vn 0.7472 -0.4807 -0.4588 +vn 0.7506 0.5881 0.3011 +vn 0.4485 -0.8426 0.2982 +vn 0.2496 -0.7543 -0.6072 +vn 0.1466 -0.5754 -0.8046 +vn 0.9850 -0.0302 0.1699 +vn -0.5917 0.8045 0.0517 +vn -0.9461 0.3170 -0.0665 +vn -0.2560 0.8676 -0.4262 +vn 0.4510 0.8110 -0.3727 +vn 0.5618 0.8259 -0.0487 +vn 0.0839 0.2262 -0.9705 +vn 0.5987 0.7874 -0.1466 +vn 0.0583 0.1160 -0.9915 +vn 0.1382 0.1175 -0.9834 +vn -0.2658 0.5934 -0.7598 +vn -0.8802 0.4741 0.0229 +vn 0.8848 0.4654 0.0229 +vn -0.9732 0.1695 -0.1557 +vn 0.2283 0.0571 -0.9719 +vn 0.9956 0.0559 0.0753 +vn -0.4148 0.5956 -0.6879 +vn -0.9714 -0.2293 -0.0613 +vn 0.1380 -0.0164 -0.9903 +vn 0.9071 -0.4157 -0.0662 +vn -0.6685 0.1430 -0.7298 +vn -0.7699 -0.6350 -0.0633 +vn 0.2452 -0.1952 -0.9496 +vn 0.6687 -0.7413 -0.0574 +vn -0.6375 -0.2275 -0.7361 +vn -0.4299 -0.8988 -0.0853 +vn 0.3558 -0.5267 -0.7721 +vn 0.3764 -0.9224 -0.0865 +vn -0.2663 -0.5080 -0.8192 +vn -0.4096 -0.8924 -0.1896 +vn 0.3915 -0.7531 -0.5288 +vn -0.1692 -0.8725 -0.4583 +vn 0.0079 -0.9954 0.0950 +vn -0.1047 -0.4505 -0.8866 +vn -0.0106 -0.9752 0.2209 +vn 0.0806 -0.9950 -0.0583 +vn 0.1753 -0.9845 0.0032 +vn 0.1231 -0.9806 0.1526 +vn -0.8554 -0.1082 -0.5066 +vn -0.9487 -0.3148 -0.0308 +vn -0.6724 0.2859 -0.6827 +vn -0.7483 0.2942 -0.5946 +vn -0.8892 -0.2576 -0.3781 +vn -0.6010 0.2199 -0.7684 +vn -0.9055 0.4229 0.0352 +vn -0.0937 0.0142 -0.9955 +vn -0.5878 0.6531 -0.4774 +vn -0.9004 -0.3545 -0.2523 +vn -0.5437 -0.1017 -0.8331 +vn -0.7317 -0.6601 0.1699 +vn -0.9432 0.3271 -0.0574 +vn -0.9660 0.1875 -0.1779 +vn -0.8132 -0.3955 -0.4270 +vn -0.3036 -0.5213 -0.7976 +vn -0.6085 -0.6356 -0.4750 +vn -0.6251 0.2255 -0.7473 +vn -0.9242 -0.3819 0.0065 +vn -0.9871 0.0371 -0.1558 +vn -0.3262 0.1708 -0.9297 +vn -0.9894 -0.0399 -0.1393 +vn -0.9874 -0.0305 -0.1554 +vn 0.9925 -0.1221 -0.0114 +vn 0.8552 -0.1387 -0.4994 +vn 0.8017 0.1510 -0.5784 +vn 0.7183 0.4254 -0.5505 +vn 0.8891 -0.2646 -0.3735 +vn 0.7702 0.6137 0.1737 +vn 0.9876 -0.1528 -0.0353 +vn 0.9848 -0.1304 -0.1144 +vn 0.8989 -0.3608 -0.2485 +vn 0.4511 0.7410 -0.4974 +vn 0.9859 -0.1098 -0.1265 +vn 0.9529 0.3019 -0.0278 +vn 0.2837 0.8082 -0.5162 +vn 0.9097 -0.4088 -0.0736 +vn 0.8473 -0.4139 -0.3328 +vn 0.0844 0.3604 -0.9290 +vn 0.0606 -0.8022 -0.5940 +vn 0.9936 -0.0004 -0.1127 +vn 0.4029 0.0688 -0.9127 +vn 0.6895 -0.5516 -0.4693 +vn 0.9848 0.0253 -0.1716 +vn 0.9900 0.0720 -0.1212 +vn -0.3844 0.4514 -0.8053 +vn -0.9877 0.1561 -0.0037 +vn -0.5852 0.8098 -0.0433 +vn -0.8012 -0.5853 -0.1242 +vn -0.7283 0.3673 -0.5785 +vn -0.9885 -0.1409 -0.0548 +vn -0.4707 0.7335 -0.4903 +vn -0.9351 0.3488 -0.0632 +vn -0.9809 0.1280 -0.1461 +vn -0.9887 -0.1100 -0.1021 +vn -0.0479 0.0483 -0.9977 +vn -0.0496 -0.3698 -0.9278 +vn -0.8137 -0.5811 -0.0178 +vn -0.9876 0.0341 -0.1532 +vn -0.2561 -0.4032 -0.8785 +vn -0.9878 -0.0326 -0.1521 +vn -0.0472 0.0666 -0.9967 +vn -0.0346 0.2861 -0.9576 +vn -0.0487 0.4822 -0.8747 +vn -0.0612 0.6733 -0.7368 +vn -0.0750 0.8548 -0.5135 +vn -0.9252 0.1862 0.3307 +vn -0.0703 0.9962 -0.0524 +vn -0.7411 0.4204 -0.5235 +vn -0.0446 0.9802 -0.1932 +vn -0.0370 0.0385 -0.9986 +vn 0.0020 0.9298 -0.3681 +vn 0.0106 0.7624 -0.6470 +vn 0.0141 0.5126 -0.8585 +vn -0.0301 0.2692 -0.9626 +vn -0.3306 -0.2545 -0.9088 +vn -0.3960 -0.1019 -0.9126 +vn -0.4688 0.0615 -0.8812 +vn -0.4959 0.2868 -0.8196 +vn -0.4387 0.4949 -0.7500 +vn -0.4951 0.7891 -0.3637 +vn -0.9761 0.1766 -0.1267 +vn -0.1406 0.9763 -0.1648 +vn -0.1290 0.0492 -0.9904 +vn -0.0382 0.9345 -0.3540 +vn -0.0060 0.8080 -0.5891 +vn -0.0205 0.6531 -0.7570 +vn 0.0759 0.4843 -0.8716 +vn 0.0071 0.3211 -0.9470 +vn -0.0150 0.7617 -0.6478 +vn 0.1378 0.0835 -0.9869 +vn 0.3345 0.3922 -0.8569 +vn 0.2040 -0.4134 -0.8874 +vn 0.8063 0.5671 0.1681 +vn 0.3041 -0.2309 -0.9242 +vn 0.5791 0.7499 0.3198 +vn 0.1265 0.7096 -0.6932 +vn 0.1555 0.7933 -0.5887 +vn 0.0542 0.9956 -0.0771 +vn -0.0003 0.9540 -0.2999 +vn -0.0084 0.8187 -0.5742 +vn -0.0133 0.5931 -0.8050 +vn 0.0299 0.3360 -0.9414 +vn 0.1889 0.0388 -0.9812 +vn -0.0295 0.1056 -0.9940 +vn -0.0074 -0.3114 -0.9503 +vn -0.0808 -0.5183 -0.8514 +vn -0.1392 -0.7378 -0.6605 +vn 0.0072 0.0535 -0.9985 +vn -0.7423 -0.4666 -0.4808 +vn -0.0198 -0.3379 -0.9410 +vn 0.0304 0.1613 -0.9864 +vn 0.3301 -0.0433 -0.9430 +vn 0.3403 0.0606 -0.9384 +vn -0.3636 -0.4013 -0.8407 +vn 0.4200 -0.6231 -0.6598 +vn 0.5694 -0.2176 -0.7928 +vn 0.2530 0.1935 -0.9479 +vn -0.1868 0.0902 -0.9782 +vn -0.2151 -0.0731 -0.9738 +vn 0.4336 0.0121 -0.9010 +vn 0.5718 -0.2655 -0.7762 +vn 0.6814 -0.4392 -0.5855 +vn -0.5514 -0.4797 -0.6826 +vn -0.8204 -0.4581 -0.3423 +vn -0.2729 -0.7005 -0.6594 +vn 0.2794 -0.5995 -0.7500 +vn 0.9771 -0.0909 -0.1923 +vn -0.3305 0.5979 -0.7303 +vn 0.2651 0.0849 -0.9605 +vn -0.7049 -0.3303 0.6277 +vn -0.2518 -0.5613 0.7884 +vn 0.0467 -0.5191 0.8534 +vn 0.4282 -0.5843 -0.6894 +vn -0.4065 -0.0544 0.9121 +vn -0.1843 -0.0101 0.9828 +vn 0.6804 -0.4921 -0.5430 +vn 0.4645 -0.7963 0.3875 +vn -0.6589 -0.7150 0.2337 +vn 0.3565 0.0037 0.9343 +vn 0.7057 -0.4267 -0.5655 +vn 0.0161 -0.0763 0.9970 +vn 0.6101 -0.4849 0.6266 +vn -0.2430 0.0437 0.9690 +vn 0.0186 -0.1041 0.9944 +vn -0.6878 -0.0115 0.7258 +vn 0.0396 -0.9992 0.0068 +vn -0.4970 -0.4408 -0.7475 +vn 0.1224 -0.9814 0.1476 +vn -0.3535 -0.4946 0.7940 +vn 0.2330 -0.8638 0.4467 +vn 0.3826 0.0143 0.9238 +vn 0.7930 0.0262 0.6086 +vn -0.8614 -0.1530 0.4843 +vn -0.5416 0.1990 0.8168 +vn 0.0190 -0.7015 0.7124 +vn -0.8469 -0.2367 0.4763 +vn 0.6602 -0.7499 0.0418 +vn -0.3824 -0.3381 0.8600 +vn 0.0359 -0.9967 -0.0728 +vn -0.0190 -0.4913 -0.8708 +vn 0.6076 -0.5349 -0.5871 +vn -0.1445 -0.6796 -0.7192 +vn 0.7694 -0.5848 -0.2570 +vn 0.0791 -0.9922 0.0966 +vn -0.0741 -0.9917 0.1055 +vn -0.0939 -0.9916 0.0889 +vn 0.0791 -0.9937 0.0795 +vn -0.0983 -0.0488 0.9940 +vn 0.0889 -0.0424 0.9951 +vn 0.0011 0.5922 0.8058 +vn 0.1951 0.7562 0.6246 +vn 0.1708 0.9806 -0.0967 +vn 0.1946 0.9708 -0.1406 +vn 0.9714 0.1605 -0.1751 +vn 0.7800 0.4934 -0.3849 +vn 0.7548 0.4782 -0.4490 +vn 0.6213 -0.4462 -0.6441 +vn 0.6922 0.0628 -0.7190 +vn 0.9919 -0.1028 -0.0746 +vn 0.7951 0.6012 -0.0802 +vn 0.9854 -0.1471 -0.0860 +vn 0.7515 0.1291 -0.6470 +vn -0.5026 -0.8027 -0.3210 +vn -0.7700 0.5639 -0.2986 +vn 0.1552 0.7647 -0.6255 +vn 0.0001 -0.8577 -0.5141 +vn 0.1048 0.8920 -0.4397 +vn 0.0132 -0.6558 -0.7548 +vn -0.3474 0.8939 -0.2832 +vn -0.6192 0.5576 -0.5529 +vn -0.1386 0.8681 -0.4766 +vn -0.2935 -0.9067 -0.3028 +vn -0.2088 -0.8870 -0.4120 +vn -0.5285 -0.7945 -0.2992 +vn -0.7378 0.5897 -0.3285 +vn 0.0433 0.6882 -0.7242 +vn -0.1319 -0.9087 -0.3960 +vn -0.4585 0.5577 -0.6919 +vn 0.0391 -0.7506 -0.6596 +vn -0.1856 -0.9177 -0.3513 +vn 0.0090 0.9656 -0.2598 +vn -0.1594 -0.8743 -0.4585 +vn -0.3534 0.5757 -0.7374 +vn 0.4463 0.8777 -0.1743 +vn 0.7802 -0.6250 0.0260 +vn 0.2449 0.9441 -0.2209 +vn 0.1224 0.9572 -0.2623 +vn -0.4905 0.5999 -0.6321 +vn -0.2384 0.8317 -0.5015 +vn 0.3054 -0.9283 -0.2122 +vn 0.1525 -0.9549 -0.2549 +vn 0.0760 -0.9547 -0.2877 +vn -0.3933 -0.8687 -0.3012 +vn -0.3055 -0.8536 -0.4219 +vn -0.2623 -0.7708 -0.5805 +vn -0.0903 0.9604 -0.2637 +vn 0.1725 0.9556 -0.2389 +vn -0.3595 0.9319 -0.0488 +vn 0.2061 0.9783 -0.0191 +vn -0.9638 0.1520 -0.2190 +vn -0.3195 -0.8734 -0.3676 +vn 0.9457 -0.2205 -0.2389 +vn 0.9287 0.3031 -0.2135 +vn 0.2658 0.9241 -0.2746 +vn 0.1868 0.8580 -0.4785 +vn 0.2318 0.7231 -0.6506 +vn 0.2471 0.6002 -0.7607 +vn 0.2162 0.4633 -0.8594 +vn 0.1954 0.2725 -0.9421 +vn 0.3193 0.1942 -0.9276 +vn 0.2004 0.3560 -0.9127 +vn 0.1926 0.4902 -0.8501 +vn 0.2058 0.6339 -0.7455 +vn 0.2500 0.7263 -0.6403 +vn 0.2501 0.8159 -0.5214 +vn 0.1950 0.8934 -0.4047 +vn 0.2937 0.9173 -0.2691 +vn 0.8270 0.0315 -0.5614 +vn 0.4943 0.0604 -0.8672 +vn 0.7208 0.6383 -0.2703 +vn 0.6000 0.7923 -0.1103 +vn 0.8366 0.5244 -0.1586 +vn 0.5952 0.7158 -0.3652 +vn 0.5603 0.6635 -0.4958 +vn 0.8844 0.3440 -0.3155 +vn 0.6521 0.4920 -0.5768 +vn 0.8799 0.2057 -0.4284 +vn 0.6119 0.3778 -0.6949 +vn 0.8046 0.1536 -0.5736 +vn 0.5483 0.2411 -0.8007 +vn 0.5372 0.8366 -0.1073 +vn 0.8134 0.5717 -0.1071 +vn 0.6838 0.2178 -0.6964 +vn 0.7416 0.0303 -0.6702 +vn 0.6115 0.2834 -0.7387 +vn 0.6240 0.4357 -0.6487 +vn 0.6289 0.5508 -0.5487 +vn 0.6932 0.5633 -0.4497 +vn 0.6681 0.6813 -0.2991 +vn 0.6036 0.7192 -0.3441 +vn 0.1931 0.7944 -0.5759 +vn -0.3405 0.7231 -0.6010 +vn 0.0589 0.5723 -0.8180 +vn 0.0723 0.4941 -0.8664 +vn 0.9910 -0.0098 -0.1333 +vn 0.9869 0.0205 -0.1601 +vn 0.5535 0.7889 -0.2670 +vn 0.5841 0.5781 -0.5698 +vn -0.4374 0.8535 -0.2832 +vn -0.7218 0.6326 -0.2808 +vn 0.0816 -0.9951 -0.0563 +vn -0.2930 -0.9496 -0.1118 +vn 0.9867 -0.1623 -0.0133 +vn 0.7870 0.5924 0.1721 +vn 0.9859 -0.1097 -0.1264 +vn 0.9222 0.3852 -0.0343 +vn 0.6309 -0.6752 -0.3823 +vn 0.2747 0.1901 -0.9425 +vn 0.3086 -0.4397 -0.8435 +vn 0.9936 -0.0008 -0.1131 +vn 0.8547 0.0054 -0.5190 +vn 0.9848 0.0253 -0.1718 +vn 0.9901 0.0720 -0.1208 +vn -0.9701 -0.2416 -0.0245 +vn -0.6725 0.2859 -0.6827 +vn -0.9054 0.4231 0.0347 +vn -0.0938 0.0142 -0.9955 +vn -0.9629 0.2657 -0.0464 +vn -0.9660 0.1875 -0.1778 +vn -0.8132 -0.3955 -0.4269 +vn -0.0520 0.2346 -0.9707 +vn -0.9242 -0.3818 0.0068 +vn -0.9871 0.0370 -0.1559 +vn -0.1178 0.1852 -0.9756 +vn -0.9896 -0.0312 -0.1406 +vn 0.9958 0.0904 0.0124 +vn 0.8786 -0.4701 -0.0840 +vn 0.9085 0.4160 -0.0386 +vn 0.0868 0.1111 -0.9900 +vn 0.6318 -0.5678 -0.5277 +vn 0.7987 0.5674 0.2002 +vn 0.0436 0.3583 -0.9326 +vn 0.5820 0.7500 0.3143 +vn 0.1593 0.7164 -0.6793 +vn 0.1968 0.8005 -0.5662 +vn 0.0592 0.9952 -0.0773 +vn 0.2400 0.7604 -0.6034 +vn 0.0435 0.1573 -0.9866 +vn -0.0002 0.9540 -0.2999 +vn -0.0085 0.8187 -0.5742 +vn -0.0131 0.5931 -0.8050 +vn 0.0298 0.3361 -0.9414 +vn 0.6001 0.7241 -0.3398 +vn 0.9670 -0.0701 -0.2450 +vn 0.5738 0.8182 -0.0364 +vn 0.3820 0.6362 -0.6703 +vn 0.4795 0.3998 -0.7811 +vn 0.2756 0.8529 -0.4434 +vn 0.4429 0.8965 -0.0122 +vn 0.8382 0.3940 -0.3772 +vn 0.1939 0.1584 -0.9681 +vn 0.0454 0.9473 -0.3171 +vn 0.0395 0.8369 -0.5460 +vn 0.0056 0.6306 -0.7761 +vn -0.0095 0.3820 -0.9241 +vn 0.0208 0.7414 -0.6708 +vn -0.1385 0.0709 -0.9878 +vn -0.7392 0.4203 -0.5262 +vn -0.0419 0.1875 -0.9814 +vn -0.2726 -0.2717 -0.9230 +vn -0.3283 -0.1469 -0.9331 +vn -0.3593 0.0082 -0.9332 +vn -0.3112 0.2755 -0.9095 +vn -0.5539 0.6343 0.5393 +vn -0.1207 0.8477 -0.5165 +vn 0.0021 0.9298 -0.3681 +vn 0.0104 0.7625 -0.6469 +vn 0.0144 0.5126 -0.8585 +vn -0.1436 0.0856 -0.9859 +vn -0.1883 0.9562 -0.2243 +vn 0.9683 -0.0556 0.2436 +vn 0.8507 -0.0899 0.5179 +vn 0.5787 -0.0620 0.8132 +vn -0.2671 -0.7907 -0.5508 +vn 0.3518 -0.0874 0.9320 +vn -0.3262 -0.6026 -0.7283 +vn -0.1064 -0.7898 -0.6040 +vn 0.1262 -0.4981 -0.8579 +vn -0.2254 -0.5350 -0.8142 +vn 0.0109 -0.3728 -0.9279 +vn -0.3469 -0.6102 -0.7122 +vn -0.3483 0.9321 -0.0991 +vn -0.1471 0.9833 -0.1070 +vn 0.5051 0.8427 -0.1866 +vn 0.7700 -0.5639 -0.2986 +vn -0.0209 0.7682 -0.6399 +vn -0.0333 -0.8501 -0.5256 +vn -0.0132 0.6558 -0.7548 +vn -0.1382 -0.9349 -0.3268 +vn 0.2935 0.9067 -0.3028 +vn 0.2087 0.8870 -0.4120 +vn 0.3474 -0.8939 -0.2832 +vn 0.6192 -0.5576 -0.5529 +vn 0.1386 -0.8681 -0.4766 +vn -0.8577 -0.2894 -0.4249 +vn 0.5320 0.8269 -0.1824 +vn 0.7378 -0.5897 -0.3285 +vn 0.3094 0.7999 -0.5142 +vn -0.0582 -0.7687 -0.6370 +vn -0.0390 0.7506 -0.6596 +vn 0.4585 -0.5577 -0.6919 +vn 0.3236 -0.3294 -0.8870 +vn 0.1856 0.9177 -0.3513 +vn 0.2874 0.6812 -0.6733 +vn 0.3534 -0.5757 -0.7374 +vn -0.4463 -0.8777 -0.1743 +vn -0.7802 0.6250 0.0260 +vn -0.3054 0.9283 -0.2122 +vn -0.1525 0.9549 -0.2549 +vn -0.0760 0.9547 -0.2877 +vn 0.3933 0.8687 -0.3012 +vn 0.3055 0.8536 -0.4219 +vn 0.2623 0.7708 -0.5805 +vn -0.2448 -0.9441 -0.2209 +vn -0.1224 -0.9572 -0.2623 +vn 0.4905 -0.5999 -0.6321 +vn 0.2384 -0.8317 -0.5015 +vn -0.2144 0.9271 -0.3074 +vn 0.2796 0.9206 -0.2725 +vn -0.2872 0.9578 0.0099 +vn 0.1571 0.9865 -0.0457 +vn 0.9798 -0.1557 -0.1253 +vn -0.9777 0.1621 -0.1335 +vn -0.9031 -0.2745 -0.3303 +vn -0.1535 0.9497 -0.2731 +vn -0.2343 0.8726 -0.4285 +vn -0.2452 0.7812 -0.5741 +vn -0.2320 0.6514 -0.7224 +vn -0.3427 0.5300 -0.7756 +vn -0.2257 0.3826 -0.8959 +vn -0.2328 0.2181 -0.9477 +vn -0.2384 0.1889 -0.9526 +vn -0.2877 0.3440 -0.8938 +vn -0.2083 0.4816 -0.8513 +vn -0.1907 0.6482 -0.7372 +vn -0.3484 0.7178 -0.6027 +vn -0.3096 0.7939 -0.5233 +vn -0.1098 0.9111 -0.3973 +vn -0.3468 0.9091 -0.2307 +vn -0.8143 0.0411 -0.5790 +vn -0.3208 0.8786 -0.3538 +vn -0.5247 0.0479 -0.8500 +vn -0.8016 0.5658 -0.1932 +vn -0.8069 0.5808 -0.1079 +vn -0.4730 0.8386 -0.2703 +vn -0.6180 0.6699 -0.4115 +vn -0.8696 0.3492 -0.3490 +vn -0.5700 0.5988 -0.5626 +vn -0.7929 0.3443 -0.5028 +vn -0.5685 0.3762 -0.7316 +vn -0.8584 0.1886 -0.4771 +vn -0.6165 0.2086 -0.7592 +vn -0.5413 0.8349 -0.1000 +vn -0.7779 0.6254 -0.0616 +vn -0.7006 0.2137 -0.6808 +vn -0.7717 0.0270 -0.6354 +vn -0.5042 0.0574 -0.8617 +vn -0.7676 0.2603 -0.5858 +vn -0.6054 0.3715 -0.7039 +vn -0.8299 0.3209 -0.4563 +vn -0.5289 0.5446 -0.6509 +vn -0.7639 0.4566 -0.4561 +vn -0.7612 0.5615 -0.3245 +vn -0.4511 0.8117 -0.3709 +vn -0.7518 0.6113 -0.2473 +vn -0.3471 0.6279 -0.6966 +vn 0.2188 0.6642 -0.7148 +vn 0.0084 0.5014 -0.8652 +vn -0.4899 0.6959 -0.5250 +vn -0.5400 0.7976 -0.2688 +vn -0.6344 0.6697 -0.3860 +vn -0.8200 0.5001 -0.2783 +vn 0.6753 0.6510 -0.3467 +vn 0.8330 0.5239 -0.1779 +vn 0.6572 0.7537 -0.0046 +vn -0.0869 -0.7979 0.5965 +vn 0.0840 -0.6213 0.7790 +vn -0.0987 -0.5342 0.8396 +vn 0.0715 -0.5710 0.8179 +vn 0.0741 -0.7491 0.6583 +vn -0.1043 -0.7855 0.6100 +vn 0.0901 -0.8782 0.4698 +vn -0.0666 -0.9165 0.3944 +vn 0.0776 -0.9632 0.2572 +vn -0.1179 -0.9685 0.2194 +vn 0.0809 -0.9825 0.1679 +vn -0.0723 -0.9695 0.2343 +vn 0.0959 -0.9609 0.2599 +vn 0.1256 -0.9314 0.3415 +vn -0.1324 -0.9176 0.3747 +vn 0.0638 -0.8920 0.4475 +vn -0.0775 -0.8322 0.5490 +vn 0.1112 -0.8268 0.5513 +vn -0.1225 -0.7035 0.7001 +vn 0.1414 -0.7425 0.6548 +vn 0.0870 -0.5929 0.8006 +vn -0.1113 -0.5847 0.8036 +vn -0.1248 -0.4712 0.8732 +vn 0.0898 -0.4520 0.8875 +vn -0.0746 -0.3393 0.9377 +vn 0.1310 -0.3339 0.9335 +vn -0.0706 -0.1759 0.9819 +vn 0.0823 -0.1589 0.9839 +vn 0.9583 -0.0415 0.2828 +vn 0.8798 -0.0367 0.4740 +vn 0.7673 -0.0663 0.6379 +vn 0.6185 -0.0830 0.7814 +vn 0.4457 -0.0898 0.8906 +vn 0.1825 -0.0993 0.9782 +vn 0.9565 -0.1578 0.2455 +vn 0.8726 -0.1517 0.4643 +vn 0.8870 -0.2294 0.4009 +vn 0.7699 -0.1932 0.6083 +vn 0.7689 -0.3152 0.5563 +vn 0.8677 -0.3590 0.3438 +vn 0.6278 -0.2401 0.7404 +vn 0.9655 -0.2017 0.1648 +vn 0.9088 -0.3337 0.2505 +vn 0.5896 -0.4065 0.6979 +vn 0.7722 -0.4337 0.4644 +vn 0.4499 -0.2766 0.8492 +vn 0.6320 -0.5350 0.5606 +vn 0.2042 -0.3021 0.9311 +vn 0.3605 -0.4663 0.8078 +vn 0.7791 -0.5213 0.3481 +vn 0.4468 -0.6187 0.6462 +vn 0.2603 -0.5865 0.7670 +vn 0.9341 -0.3268 0.1438 +vn 0.6280 -0.6534 0.4227 +vn 0.9844 -0.1626 0.0672 +vn 0.2659 -0.7331 0.6260 +vn 0.8377 -0.5101 0.1949 +vn 0.4451 -0.7521 0.4860 +vn 0.7132 -0.6414 0.2827 +vn 0.2694 -0.8421 0.4673 +vn 0.6033 -0.7526 0.2640 +vn 0.4489 -0.8285 0.3349 +vn 0.2685 -0.9232 0.2751 +vn 0.7844 -0.6087 0.1193 +vn 0.9109 -0.4047 0.0801 +vn 0.4325 -0.8908 0.1392 +vn 0.6842 -0.7234 0.0922 +vn 0.5615 -0.8217 0.0974 +vn 0.2670 -0.9580 0.1042 +vn 0.2514 -0.9651 0.0730 +vn 0.9624 -0.2651 0.0595 +vn 0.3177 -0.9416 0.1113 +vn 0.8805 -0.4684 0.0726 +vn 0.5483 -0.8324 0.0805 +vn 0.7390 -0.6687 0.0822 +vn 0.9621 -0.2453 0.1193 +vn 0.9165 -0.3751 0.1392 +vn 0.8286 -0.5378 0.1556 +vn 0.6898 -0.7070 0.1560 +vn 0.4867 -0.8543 0.1827 +vn 0.2608 -0.9410 0.2157 +vn 0.6807 -0.6897 0.2468 +vn 0.5228 -0.8099 0.2661 +vn 0.3490 -0.8825 0.3153 +vn 0.8273 -0.5003 0.2555 +vn 0.9821 -0.1330 0.1335 +vn 0.9289 -0.2614 0.2623 +vn 0.7208 -0.5950 0.3556 +vn 0.8555 -0.4171 0.3067 +vn 0.6027 -0.7017 0.3799 +vn 0.4486 -0.7822 0.4324 +vn 0.2573 -0.8473 0.4646 +vn 0.9388 -0.1509 0.3095 +vn 0.6981 -0.5480 0.4608 +vn 0.8264 -0.3557 0.4366 +vn 0.5309 -0.6437 0.5512 +vn 0.9768 -0.0023 0.2140 +vn 0.3500 -0.7160 0.6040 +vn 0.6681 -0.4697 0.5771 +vn 0.9207 -0.0697 0.3839 +vn 0.8283 -0.2446 0.5041 +vn 0.9171 -0.0053 0.3987 +vn 0.6912 -0.3549 0.6295 +vn 0.4490 -0.5462 0.7071 +vn 0.8273 -0.1343 0.5454 +vn 0.2595 -0.6185 0.7417 +vn 0.4992 -0.4146 0.7609 +vn 0.8175 -0.0418 0.5744 +vn 0.6939 -0.2545 0.6736 +vn 0.6937 -0.1658 0.7009 +vn 0.2596 -0.4788 0.8387 +vn 0.5344 -0.2575 0.8051 +vn 0.6453 -0.0988 0.7575 +vn 0.6506 -0.0209 0.7591 +vn 0.3449 -0.3426 0.8738 +vn 0.3616 -0.2433 0.9000 +vn 0.4468 -0.1260 0.8857 +vn 0.2402 -0.2235 0.9446 +vn 0.4558 -0.0265 0.8897 +vn 0.2506 -0.1084 0.9620 +vn 0.2730 -0.0247 0.9617 +vn 0.6759 0.5648 0.4734 +vn 0.4285 0.5636 0.7062 +vn -0.9259 -0.0299 0.3767 +vn -0.8300 -0.0574 0.5548 +vn -0.6989 -0.0792 0.7108 +vn -0.5311 -0.0888 0.8427 +vn -0.2473 -0.0660 0.9667 +vn -0.9365 -0.1177 0.3302 +vn -0.8805 -0.1228 0.4578 +vn -0.9064 -0.2652 0.3288 +vn -0.8641 -0.2444 0.4400 +vn -0.7675 -0.1854 0.6136 +vn -0.7735 -0.3065 0.5548 +vn -0.6208 -0.2297 0.7496 +vn -0.9317 -0.2893 0.2195 +vn -0.7456 -0.4461 0.4951 +vn -0.6226 -0.3869 0.6802 +vn -0.4451 -0.2772 0.8515 +vn -0.2399 -0.2826 0.9287 +vn -0.4472 -0.4448 0.7760 +vn -0.8291 -0.4582 0.3203 +vn -0.5435 -0.5648 0.6210 +vn -0.2533 -0.4256 0.8688 +vn -0.6620 -0.6125 0.4320 +vn -0.9443 -0.3105 0.1094 +vn -0.3150 -0.6153 0.7226 +vn -0.8644 -0.4574 0.2089 +vn -0.4570 -0.7344 0.5018 +vn -0.7736 -0.5861 0.2410 +vn -0.2460 -0.7418 0.6239 +vn -0.6134 -0.7333 0.2935 +vn -0.2625 -0.8700 0.4173 +vn -0.4204 -0.8606 0.2876 +vn -0.8517 -0.5138 0.1028 +vn -0.7093 -0.6933 0.1273 +vn -0.5713 -0.8087 0.1400 +vn -0.4311 -0.8961 0.1059 +vn -0.2588 -0.9605 0.1022 +vn -0.9637 -0.2619 0.0519 +vn -0.2697 -0.9591 0.0858 +vn -0.8818 -0.4646 0.0813 +vn -0.4649 -0.8814 0.0837 +vn -0.7676 -0.6339 0.0942 +vn -0.6210 -0.7754 0.1145 +vn -0.4509 -0.8788 0.1560 +vn -0.2547 -0.9547 0.1539 +vn -0.9259 -0.3521 0.1368 +vn -0.8325 -0.5227 0.1837 +vn -0.7015 -0.6788 0.2171 +vn -0.5410 -0.8034 0.2490 +vn -0.3588 -0.8938 0.2689 +vn -0.2013 -0.9391 0.2784 +vn -0.9667 -0.2024 0.1568 +vn -0.9186 -0.2991 0.2583 +vn -0.8258 -0.4824 0.2923 +vn -0.7034 -0.6469 0.2945 +vn -0.5352 -0.7689 0.3499 +vn -0.3450 -0.8589 0.3785 +vn -0.6587 -0.6272 0.4156 +vn -0.9594 -0.1376 0.2462 +vn -0.4510 -0.7481 0.4868 +vn -0.2548 -0.8142 0.5217 +vn -0.8321 -0.3865 0.3978 +vn -0.8755 -0.2325 0.4236 +vn -0.6975 -0.5207 0.4923 +vn -0.9577 -0.0463 0.2840 +vn -0.5321 -0.6191 0.5776 +vn -0.7319 -0.4011 0.5508 +vn -0.3472 -0.6919 0.6330 +vn -0.8903 -0.1039 0.4434 +vn -0.7365 -0.2661 0.6219 +vn -0.5354 -0.5092 0.6738 +vn -0.9220 -0.0148 0.3868 +vn -0.3453 -0.5736 0.7428 +vn -0.8061 -0.1447 0.5738 +vn -0.5696 -0.3946 0.7210 +vn -0.8336 -0.0420 0.5508 +vn -0.6805 -0.1839 0.7093 +vn -0.5302 -0.3204 0.7850 +vn -0.3568 -0.4532 0.8169 +vn -0.6592 -0.0983 0.7455 +vn -0.4972 -0.2332 0.8357 +vn -0.7213 -0.0242 0.6922 +vn -0.3072 -0.3675 0.8778 +vn -0.5701 -0.0288 0.8211 +vn -0.2493 -0.2664 0.9311 +vn -0.4463 -0.1410 0.8837 +vn -0.4445 -0.0551 0.8941 +vn -0.2569 -0.1500 0.9547 +vn -0.2713 -0.0441 0.9615 +vn -0.7218 0.5740 0.3866 +vn -0.5751 0.5748 0.5821 +vn -0.3749 0.5741 0.7279 +vn -0.1583 0.8202 -0.5498 +vn -0.2503 0.3166 0.9149 +vn -0.1880 0.1941 -0.9628 +vn -0.2403 0.8172 0.5239 +vn -0.3084 0.8384 -0.4494 +vn -0.4388 0.8161 0.3760 +vn -0.4313 0.8946 -0.1165 +vn -0.6273 0.7737 0.0881 +vn -0.7622 0.6094 0.2184 +vn -0.6270 0.0458 -0.7776 +vn -0.4624 0.2012 0.8635 +vn -0.5376 0.0933 -0.8381 +vn -0.5136 0.1165 0.8501 +vn -0.4093 -0.0473 -0.9112 +vn -0.5065 0.0189 0.8620 +vn -0.1398 -0.2016 -0.9694 +vn -0.1820 -0.0414 0.9824 +vn -0.4996 -0.1804 -0.8473 +vn -0.5114 -0.1672 0.8429 +vn -0.5667 -0.3009 -0.7670 +vn -0.5655 -0.4352 0.7006 +vn -0.4497 -0.5194 -0.7267 +vn -0.1564 -0.6134 0.7742 +vn -0.4700 -0.8803 -0.0643 +vn -0.6647 -0.7282 -0.1672 +vn -0.4533 -0.8808 0.1369 +vn -0.3835 -0.8621 -0.3313 +vn -0.2356 -0.9110 0.3386 +vn 0.3390 -0.6583 -0.6721 +vn 0.2508 -0.4557 0.8541 +vn 0.0477 -0.3578 -0.9326 +vn 0.4507 -0.6860 0.5712 +vn 0.5178 -0.1039 0.8491 +vn 0.5114 -0.1672 -0.8429 +vn 0.4062 0.4546 -0.7927 +vn 0.1955 0.2527 0.9476 +vn 0.6041 -0.2395 0.7601 +vn 0.5655 -0.4352 -0.7006 +vn 0.5115 -0.3640 0.7784 +vn 0.1564 -0.6134 -0.7741 +vn 0.7088 -0.7037 0.0497 +vn 0.4326 -0.8925 0.1272 +vn 0.4533 -0.8808 -0.1369 +vn 0.2394 -0.9182 0.3155 +vn 0.2356 -0.9110 -0.3386 +vn 0.4916 0.3735 0.7866 +vn 0.5203 0.1812 -0.8345 +vn 0.2923 0.9563 0.0089 +vn 0.2670 0.9637 -0.0066 +vn 0.0487 0.0433 -0.9979 +vn -0.5247 0.2586 0.8111 +vn 0.4623 0.8569 0.2281 +vn 0.4500 0.8587 -0.2453 +vn 0.5418 0.6951 0.4725 +vn 0.5706 0.6906 -0.4444 +vn 0.6266 0.4767 -0.6165 +vn 0.5585 0.3914 0.7314 +vn 0.5833 0.2662 -0.7674 +vn 0.5090 0.1785 0.8421 +vn 0.5136 0.1165 -0.8501 +vn -0.9629 0.0203 0.2693 +vn 0.8757 0.1019 -0.4720 +vn -0.8180 0.2841 -0.5001 +vn 0.9448 0.0076 0.3275 +vn 0.1102 0.1332 0.9849 +vn 0.0329 -0.0061 -0.9994 +vn -0.0718 0.0270 -0.9971 +vn -0.0865 0.9957 -0.0323 +vn 0.2137 0.0107 -0.9768 +vn 0.4077 -0.0082 -0.9131 +vn -0.2021 0.1729 0.9640 +vn 0.5893 0.0096 -0.8079 +vn 0.7444 0.0068 -0.6677 +vn -0.7857 0.0897 0.6120 +vn 0.8669 0.0096 -0.4984 +vn 0.9509 -0.0077 -0.3094 +vn -0.9632 0.0207 0.2679 +vn 0.3112 0.5457 0.7781 +vn -0.7478 0.2078 -0.6306 +vn 0.9440 0.0075 0.3300 +vn -0.4319 -0.2167 0.8755 +vn 0.0758 -0.4149 0.9067 +vn -0.0585 0.0436 0.9973 +vn -0.3037 -0.8085 0.5041 +vn -0.1543 -0.9859 0.0651 +vn -0.0132 -0.0032 0.9999 +vn -0.0089 0.2429 0.9700 +vn 0.0233 -0.0760 0.9968 +vn -0.0554 0.4966 0.8662 +vn 0.1653 -0.3477 0.9229 +vn 0.0208 -0.0156 0.9997 +vn -0.0208 0.0027 0.9998 +vn -0.2302 0.5681 0.7901 +vn 0.0252 -0.0078 0.9997 +vn -0.6596 0.0373 0.7507 +vn -0.1108 -0.2172 0.9698 +vn -0.0875 0.3693 0.9252 +vn -0.0294 0.4042 0.9142 +vn -0.5129 0.0738 0.8553 +vn 0.3727 0.3948 0.8398 +vn 0.5441 0.0911 0.8341 +vn 0.6470 0.2617 0.7162 +vn 0.4215 0.2524 0.8710 +vn 0.2015 0.8841 0.4215 +vn -0.2738 0.6382 0.7195 +vn 0.3644 0.8747 0.3197 +vn -0.2635 0.4225 0.8672 +vn 0.5020 0.8432 0.1923 +vn -0.5716 0.4816 0.6643 +vn -0.5969 0.6944 0.4018 +vn -0.6601 0.7476 0.0739 +vn 0.7663 0.6352 0.0961 +vn 0.6654 0.7448 0.0494 +vn -0.8082 0.5888 -0.0051 +vn 0.2159 -0.8512 -0.4783 +vn 0.2602 -0.0809 -0.9622 +vn 0.0237 0.0432 -0.9988 +vn 0.1229 0.1527 -0.9806 +vn -0.0079 -0.0041 -1.0000 +vn -0.2254 0.3545 -0.9075 +vn 0.0279 -0.0283 -0.9992 +vn -0.0753 -0.4319 -0.8988 +vn -0.0868 0.2213 -0.9713 +vn -0.0364 -0.0120 -0.9993 +vn 0.0131 -0.0046 -0.9999 +vn 0.2280 0.5737 -0.7867 +vn -0.0208 -0.0841 -0.9962 +vn 0.3217 0.5866 -0.7432 +vn 0.1933 0.6293 -0.7527 +vn 0.0805 0.3728 -0.9244 +vn -0.0286 0.3638 -0.9310 +vn -0.6493 -0.2839 -0.7056 +vn -0.3863 0.6260 -0.6775 +vn 0.6476 0.2871 -0.7058 +vn 0.6166 0.0734 -0.7839 +vn 0.8164 0.3362 -0.4695 +vn -0.1516 0.6240 -0.7666 +vn 0.3556 0.8764 -0.3248 +vn -0.2799 0.6578 -0.6992 +vn -0.6220 0.2615 -0.7381 +vn 0.4906 0.8175 -0.3017 +vn -0.8729 0.3420 -0.3479 +vn -0.8239 0.4906 -0.2837 +vn 0.6723 0.7398 0.0266 +vn 0.7429 -0.1573 -0.6506 +vn -0.6451 0.7568 -0.1050 +vn -0.7512 0.6601 -0.0003 +vn -0.1431 0.0010 -0.9897 +vn -0.3943 0.0114 -0.9189 +vn 0.2465 -0.1073 0.9632 +vn -0.5886 0.0088 -0.8084 +vn 0.6437 -0.0905 0.7599 +vn -0.7448 -0.0329 -0.6665 +vn -0.8665 0.0084 -0.4991 +vn 0.8969 -0.1084 0.4287 +vn -0.9510 -0.0109 -0.3091 +vn -0.9939 -0.0207 -0.1085 +vn 0.5265 0.0739 0.8469 +vn 0.8034 0.0796 0.5901 +vn -0.3518 -0.0120 -0.9360 +vn -0.5510 -0.0128 -0.8344 +vn -0.7354 -0.0183 -0.6774 +vn -0.8868 -0.0122 -0.4620 +vn -0.9659 0.0103 -0.2588 +vn 0.9302 -0.2933 0.2206 +vn -0.6954 -0.6811 0.2292 +vn -0.8739 -0.4015 -0.2739 +vn 0.7197 -0.6326 0.2860 +vn -0.5739 -0.7205 0.3892 +vn 0.5576 -0.7119 0.4270 +vn 0.4470 -0.7417 0.5000 +vn -0.4239 -0.6992 0.5757 +vn 0.2680 -0.6995 0.6625 +vn -0.3410 -0.6194 0.7072 +vn -0.2091 -0.5190 0.8288 +vn 0.1259 -0.4468 0.8857 +vn -0.0669 -0.3509 0.9340 +vn 0.0098 -0.2542 0.9671 +vn -0.8919 0.2350 0.3863 +vn 0.9026 0.0317 0.4294 +vn 0.2902 0.0016 -0.9570 +vn -0.3442 -0.0934 0.9342 +vn 0.3521 -0.0089 -0.9359 +vn 0.6513 0.0057 -0.7588 +vn -0.7263 -0.0930 0.6811 +vn 0.7382 0.0184 -0.6743 +vn 0.9517 -0.0009 -0.3069 +vn -0.9494 -0.0992 0.2978 +vn 0.9695 -0.0111 -0.2448 +vn 0.9993 -0.0230 0.0288 +vn -0.6469 -0.5799 0.4953 +vn 0.7731 -0.3785 0.5089 +vn 0.9148 -0.3016 0.2686 +vn -0.6464 -0.7295 0.2235 +vn -0.9118 -0.3744 -0.1686 +vn 0.6399 -0.7339 0.2279 +vn -0.5010 -0.7631 0.4083 +vn 0.5596 -0.7346 0.3836 +vn 0.4395 -0.6988 0.5643 +vn -0.3431 -0.7265 0.5954 +vn 0.2618 -0.6706 0.6941 +vn -0.2665 -0.6354 0.7248 +vn -0.1428 -0.5265 0.8381 +vn 0.1441 -0.5882 0.7958 +vn 0.0131 -0.3538 0.9352 +vn 0.0362 -0.4335 0.9004 +vn -0.0070 -0.2138 -0.9768 +vn 0.0452 0.3286 0.9434 +vn -0.0190 -0.4072 -0.9132 +vn 0.0598 0.4691 0.8811 +vn 0.0095 -0.5893 -0.8079 +vn -0.0067 -0.7439 -0.6683 +vn 0.0971 0.5383 0.8371 +vn -0.0081 -0.8666 -0.4990 +vn 0.0458 0.9208 0.3874 +vn -0.0074 -0.9510 -0.3092 +vn 0.0247 0.9948 0.0990 +vn 0.0017 -0.9946 -0.1038 +vn -0.0403 0.2600 0.9648 +vn 0.0040 -0.2845 -0.9587 +vn -0.0285 0.4530 0.8911 +vn -0.0489 -0.3500 -0.9355 +vn -0.0103 -0.6734 -0.7392 +vn -0.0367 0.6282 0.7772 +vn -0.0061 -0.7227 -0.6912 +vn -0.0640 0.7751 0.6285 +vn 0.0060 -0.7936 -0.6084 +vn -0.0409 0.8899 0.4543 +vn 0.0087 -0.9027 -0.4302 +vn -0.0392 0.9645 0.2612 +vn 0.0074 -0.9724 -0.2333 +vn -0.0424 0.9958 0.0813 +vn 0.0099 -0.9978 -0.0650 +vn 0.1115 0.9927 0.0460 +vn 0.4486 -0.8825 -0.1412 +vn 0.2919 0.8575 -0.4236 +vn 0.7061 -0.6477 0.2860 +vn 0.1338 0.9906 0.0279 +vn 0.7132 -0.5520 0.4319 +vn 0.0870 0.9850 0.1491 +vn 0.6935 -0.4261 0.5810 +vn 0.0258 0.9756 0.2180 +vn 0.6194 -0.3410 0.7072 +vn 0.5206 -0.1831 0.8339 +vn 0.2106 0.9601 0.1840 +vn 0.0097 0.9513 0.3081 +vn 0.3514 -0.0482 0.9350 +vn 0.3074 0.0266 0.9512 +vn 0.0042 -0.7433 0.6689 +vn 0.0251 -0.9886 0.1483 +vn -0.4844 0.6578 0.5768 +vn -0.2737 -0.9279 0.2534 +vn 0.0160 0.9985 0.0533 +vn 0.3726 0.4742 0.7977 +vn 0.3518 -0.0519 0.9347 +vn 0.2825 -0.0785 0.9561 +vn 0.1919 0.2451 0.9503 +vn 0.1778 -0.2591 0.9493 +vn 0.0788 0.0490 0.9957 +vn 0.0871 -0.4373 0.8951 +vn -0.3633 0.8293 0.4246 +vn 0.0221 -0.5491 0.8354 +vn -0.2634 -0.4974 0.8266 +vn 0.0812 0.5542 0.8284 +vn -0.5409 -0.1764 0.8224 +vn -0.3518 0.0520 0.9346 +vn -0.6022 0.6575 0.4527 +vn -0.4002 -0.9154 0.0429 +vn -0.2824 0.0801 0.9559 +vn -0.6364 -0.1430 0.7580 +vn -0.1787 0.2439 0.9532 +vn -0.3461 -0.4665 0.8140 +vn -0.0880 0.4191 0.9037 +vn -0.6108 -0.5678 0.5518 +vn -0.4615 0.8399 0.2855 +vn 0.4010 -0.1850 0.8972 +vn -0.0052 0.7543 0.6566 +vn -0.2506 -0.8918 -0.3767 +vn -0.0860 -0.9706 0.2247 +vn -0.5811 0.7744 -0.2504 +vn -0.9368 -0.0081 0.3498 +vn -0.0635 -0.9792 0.1928 +vn -0.8568 0.0592 0.5123 +vn -0.1457 -0.9866 0.0729 +vn -0.7631 0.1384 0.6313 +vn -0.0629 -0.9818 0.1791 +vn -0.6357 0.2645 0.7252 +vn -0.4948 0.3395 0.8000 +vn -0.0812 -0.9635 0.2551 +vn -0.1298 -0.9580 0.2557 +vn -0.2899 0.5112 0.8091 +vn 0.0000 0.0022 -1.0000 +vn 0.0000 -0.0022 -1.0000 +vn -0.1699 0.0020 -0.9855 +vn 0.4132 0.0011 -0.9106 +vn 0.1690 -0.0009 -0.9856 +vn -0.4132 -0.0011 -0.9106 +vn -0.9705 0.0104 -0.2410 +vn -0.0093 0.9704 0.2412 +vn -0.0035 0.9970 -0.0775 +vn -0.9970 0.0040 0.0777 +vn -0.0000 0.0022 1.0000 +vn -0.4132 0.0011 0.9106 +vn 0.0035 0.9970 0.0776 +vn 0.0093 0.9704 -0.2412 +vn -0.9705 -0.0104 0.2410 +vn -0.1699 -0.0020 0.9855 +vn -0.9970 -0.0040 -0.0776 +vn 0.9705 0.0104 0.2410 +vn 0.9970 0.0040 -0.0777 +vn 0.1699 0.0020 0.9855 +vn -0.0092 -0.9704 -0.2412 +vn -0.0035 -0.9970 0.0775 +vn 0.0000 -0.0022 1.0000 +vn 0.4136 -0.0024 0.9105 +vn 0.9970 -0.0066 0.0769 +vn 0.9701 -0.0063 -0.2428 +vn 0.0056 -0.9701 0.2428 +vn 0.0058 -0.9970 -0.0769 +vn -0.1774 -0.1097 0.9780 +vn -0.0573 0.6011 0.7971 +vn 0.0035 -0.1817 -0.9833 +vn 0.8924 0.4403 0.0989 +vn 0.3021 -0.4601 0.8349 +vn 0.3071 -0.1333 -0.9423 +vn 0.2528 -0.5069 -0.8241 +vn -0.1632 0.4213 0.8921 +vn -0.1790 0.2555 0.9501 +vn -0.0432 0.0673 -0.9968 +vn 0.0672 -0.6751 -0.7346 +vn -0.2329 0.8433 0.4843 +vn 0.0579 -0.9872 -0.1487 +vn -0.1370 -0.6192 0.7732 +vn -0.2729 0.9338 -0.2314 +vn 0.3231 0.7074 0.6286 +vn -0.0629 -0.6920 -0.7192 +vn 0.2925 0.4397 -0.8492 +vn 0.2768 0.5624 0.7791 +vn -0.3470 -0.9020 -0.2568 +vn -0.0354 0.9984 0.0444 +vn -0.0175 -0.2420 0.9701 +vn -0.2826 0.3815 -0.8801 +vn 0.0618 0.1160 0.9913 +vn -0.2645 0.1314 0.9554 +vn 0.0854 0.1242 -0.9886 +vn 0.3309 -0.3390 0.8807 +vn 0.0241 -0.9966 -0.0789 +vn -0.0903 0.9879 -0.1260 +vn 0.3658 0.8949 -0.2555 +vn 0.3088 0.1101 0.9447 +vn 0.2944 0.6273 0.7210 +vn 0.3156 0.5019 -0.8053 +vn -0.7530 -0.4986 0.4293 +vn -0.9215 0.3825 -0.0674 +vn 0.3799 0.4300 0.8190 +vn 0.0437 0.5417 -0.8394 +vn 0.0742 0.7846 -0.6156 +vn 0.6094 0.7305 -0.3081 +vn -0.1191 0.7738 -0.6221 +vn 0.3262 0.8689 -0.3722 +vn 0.8850 0.4253 0.1897 +vn -0.5623 0.7637 -0.3170 +vn -0.7647 0.6100 0.2076 +vn 0.4170 -0.2613 0.8705 +vn -0.2898 0.7806 0.5538 +vn -0.2916 0.1162 0.9494 +vn 0.4058 0.8403 0.3596 +vn -0.1486 0.5712 0.8072 +vn -0.1929 0.1690 0.9666 +vn 0.2167 0.1974 0.9561 +vn 0.3686 0.7282 0.5778 +vn 0.0055 0.1987 0.9800 +vn -0.0793 -0.1192 0.9897 +vn -0.1170 -0.1163 0.9863 +vn -0.1143 -0.0535 0.9920 +vn -0.0030 0.3043 0.9526 +vn -0.3575 0.0987 0.9287 +vn -0.5205 0.0145 0.8537 +vn -0.8512 0.3143 0.4203 +vn -0.6659 -0.2192 0.7131 +vn 0.4469 0.0688 0.8920 +vn -0.4272 0.0017 0.9042 +vn -0.1835 -0.1603 0.9699 +vn 0.2272 -0.0710 0.9712 +vn 0.7628 -0.5982 0.2457 +vn -0.0485 -0.1216 0.9914 +vn -0.0060 -0.1371 0.9905 +vn -0.2236 0.1306 0.9659 +vn 0.7221 0.6657 0.1879 +vn 0.0125 -0.1233 0.9923 +vn -0.7253 0.3198 0.6097 +vn -0.0596 0.9640 0.2593 +vn 0.4721 -0.8028 0.3642 +vn -0.5983 0.5061 0.6212 +vn 0.6290 0.5715 0.5271 +vn -0.4064 0.1664 0.8984 +vn 0.4640 0.8550 0.2317 +vn -0.1652 0.8486 0.5026 +vn 0.4945 0.5228 0.6943 +vn 0.4608 0.8566 -0.2323 +vn -0.1476 0.9875 0.0552 +vn -0.4717 0.8783 0.0781 +vn 0.3522 0.3562 -0.8655 +vn 0.1153 0.7156 -0.6890 +vn -0.8729 -0.3571 -0.3325 +vn -0.4273 -0.1053 -0.8980 +vn 0.5816 0.6016 -0.5476 +vn 0.7072 -0.0344 -0.7062 +vn -0.7399 0.5588 -0.3746 +vn 0.4612 -0.0886 -0.8828 +vn -0.0774 0.2297 -0.9702 +vn 0.4770 0.3362 -0.8120 +vn -0.0996 -0.0792 -0.9919 +vn -0.1044 0.2212 -0.9696 +vn 0.7337 0.5920 -0.3334 +vn -0.1616 0.1723 -0.9717 +vn -0.1471 -0.0119 -0.9891 +vn 0.2497 0.9295 -0.2716 +vn 0.6034 -0.7609 -0.2385 +vn 0.1454 0.0690 -0.9870 +vn 0.3671 -0.0704 -0.9275 +vn 0.2078 -0.0791 -0.9750 +vn -0.4818 0.2505 -0.8397 +vn -0.3694 0.0746 -0.9263 +vn -0.4707 0.0865 -0.8780 +vn 0.3746 0.0240 -0.9269 +vn 0.2240 0.1652 -0.9605 +vn 0.5310 -0.7852 -0.3187 +vn 0.0924 -0.2044 -0.9745 +vn -0.1048 -0.1288 -0.9861 +vn -0.1033 -0.0440 -0.9937 +vn -0.3020 0.1010 -0.9480 +vn -0.3347 0.0803 -0.9389 +vn -0.5344 0.0168 -0.8451 +vn -0.3730 -0.4769 -0.7959 +vn -0.6749 -0.5413 -0.5014 +vn 0.1584 0.1435 -0.9769 +vn -0.0955 0.2399 -0.9661 +vn 0.0689 0.1386 -0.9880 +vn -0.6049 0.5152 -0.6072 +vn 0.3845 -0.0596 0.9212 +vn 0.1233 0.2387 0.9632 +vn 0.5033 -0.7301 0.4623 +vn 0.9089 -0.0592 0.4127 +vn 0.2628 0.2694 0.9265 +vn -0.1928 0.3665 0.9102 +vn -0.5084 0.4923 0.7065 +vn -0.3641 -0.8937 -0.2623 +vn 0.5107 0.8597 -0.0118 +vn -0.3801 -0.8971 0.2251 +vn 0.3778 0.9258 0.0063 +vn -0.6089 -0.7677 0.1996 +vn 0.4177 0.0126 0.9085 +vn 0.8440 0.3912 -0.3670 +vn 0.0285 -0.4643 -0.8852 +vn 0.7876 0.3005 0.5380 +vn 0.9585 0.0976 0.2679 +vn 0.9153 -0.2151 -0.3404 +vn 0.7108 0.2735 0.6480 +vn 0.8270 -0.2982 0.4766 +vn 0.6412 -0.7544 -0.1402 +vn -0.2832 -0.6903 -0.6658 +vn 0.3077 -0.8121 -0.4958 +vn -0.2385 -0.9546 0.1787 +vn -0.0026 -0.8706 0.4919 +vn 0.1942 -0.4381 0.8777 +vn 0.4036 0.8322 0.3801 +vn -0.0203 -0.0770 0.9968 +vn -0.0986 0.0769 -0.9922 +vn -0.7024 -0.6885 -0.1803 +vn -0.2500 0.4307 0.8672 +vn -0.8130 0.3362 -0.4754 +vn -0.3444 -0.4509 0.8235 +vn 0.1643 0.2956 0.9411 +vn -0.0504 -0.4360 -0.8985 +vn 0.2247 0.1264 -0.9662 +vn 0.4787 0.2416 0.8441 +vn -0.0352 -0.8932 -0.4484 +vn 0.5928 0.7019 0.3949 +vn 0.1078 -0.6416 0.7594 +vn -0.2361 0.7161 0.6569 +vn -0.3978 0.7874 0.4709 +vn -0.0443 0.0849 -0.9954 +vn 0.0597 -0.8254 -0.5613 +vn -0.1073 -0.9862 0.1262 +vn 0.0882 0.9960 -0.0112 +vn 0.2887 0.0871 0.9534 +vn 0.4636 0.7454 -0.4790 +vn 0.3063 0.6186 0.7235 +vn 0.2758 0.3023 0.9125 +vn -0.0315 0.4058 -0.9134 +vn 0.2399 -0.9689 0.0600 +vn -0.1931 0.9144 -0.3559 +vn -0.0358 0.9993 0.0121 +vn 0.0226 -0.8559 0.5167 +vn -0.0223 -0.2222 0.9747 +vn -0.3781 0.4913 -0.7846 +vn 0.0277 0.2631 0.9644 +vn 0.4618 0.4339 -0.7737 +vn 0.9125 0.1247 0.3897 +vn -0.2785 0.1403 0.9501 +vn 0.0012 0.1809 -0.9835 +vn -0.0179 -0.3774 -0.9259 +vn -0.4375 0.5237 -0.7310 +vn 0.3496 0.8195 -0.4541 +vn -0.4266 0.9044 -0.0100 +vn 0.5404 0.7697 -0.3399 +vn -0.5713 0.6284 -0.5279 +vn -0.8789 0.4730 -0.0620 +vn 0.5530 0.8327 0.0266 +vn -0.1200 -0.0555 0.9912 +vn 0.7246 -0.6002 0.3386 +vn -0.3413 0.0876 0.9359 +vn 0.4179 0.5978 0.6840 +vn 0.8112 0.2510 0.5282 +vn 0.7770 0.1601 0.6088 +vn -0.2716 0.1932 0.9428 +vn -0.2936 0.4043 0.8662 +vn 0.1859 0.1724 0.9673 +vn 0.0619 -0.1274 0.9899 +vn 0.1047 -0.1289 0.9861 +vn 0.0205 -0.1051 0.9943 +vn 0.6737 0.7386 -0.0238 +vn 0.6086 -0.4048 0.6825 +vn 0.7109 0.2015 0.6738 +vn 0.3472 0.0917 0.9333 +vn 0.1669 0.3986 0.9018 +vn 0.0610 -0.3787 0.9235 +vn -0.4314 -0.0100 0.9021 +vn 0.4111 0.0453 0.9105 +vn 0.2534 -0.0559 0.9658 +vn -0.1965 -0.1503 0.9689 +vn 0.1543 -0.1246 0.9801 +vn -0.1256 -0.1994 0.9718 +vn -0.1735 -0.2964 0.9392 +vn -0.7734 0.1267 0.6211 +vn -0.0461 -0.2775 0.9596 +vn -0.7258 0.3186 0.6097 +vn 0.4846 -0.2957 0.8232 +vn 0.2750 0.1077 0.9554 +vn 0.1257 0.2185 0.9677 +vn 0.1254 0.2416 0.9622 +vn -0.4352 0.3601 0.8252 +vn 0.4587 0.8575 0.2331 +vn 0.1140 0.9674 0.2262 +vn -0.7303 0.6804 -0.0619 +vn 0.3552 0.6412 0.6803 +vn 0.7102 0.3827 0.5908 +vn -0.3902 0.9175 -0.0775 +vn 0.4364 0.8736 -0.2155 +vn -0.4094 0.0095 -0.9123 +vn 0.1501 -0.0346 -0.9881 +vn 0.8222 0.0931 -0.5615 +vn 0.7283 0.2841 -0.6236 +vn 0.5540 0.6255 -0.5494 +vn -0.6339 0.6346 -0.4421 +vn 0.2975 -0.8919 -0.3405 +vn -0.0764 0.2229 -0.9718 +vn 0.4676 0.3211 -0.8235 +vn 0.6929 -0.2151 -0.6882 +vn -0.1043 0.2210 -0.9697 +vn -0.1217 -0.0220 -0.9923 +vn 0.6522 0.7120 -0.2602 +vn -0.1605 0.1706 -0.9722 +vn 0.6142 0.7703 -0.1714 +vn -0.0902 -0.6777 -0.7298 +vn 0.1552 0.0718 -0.9853 +vn 0.7642 0.4631 -0.4489 +vn -0.4853 0.1297 -0.8647 +vn -0.3025 0.0012 -0.9531 +vn -0.2655 -0.0517 -0.9627 +vn -0.1935 -0.1438 -0.9705 +vn 0.2031 -0.1146 -0.9724 +vn 0.8369 0.2426 -0.4906 +vn 0.7025 -0.0271 -0.7112 +vn 0.1642 -0.9825 -0.0882 +vn 0.4465 -0.8900 -0.0922 +vn 0.9024 -0.4232 -0.0815 +vn 0.1232 0.1862 -0.9748 +vn 0.2452 0.1234 -0.9616 +vn 0.3757 0.0778 -0.9235 +vn 0.7486 0.0980 -0.6557 +vn 0.8838 -0.3091 -0.3513 +vn 0.2805 0.1844 -0.9420 +vn -0.2140 0.2682 -0.9393 +vn 0.1597 0.1464 -0.9763 +vn -0.0301 0.2040 -0.9785 +vn 0.4469 0.3647 -0.8169 +vn 0.8448 -0.5329 -0.0471 +vn -0.2843 -0.3423 0.8955 +vn 0.1538 -0.0796 0.9849 +vn 0.1655 0.6061 0.7779 +vn 0.4970 -0.2503 0.8309 +vn -0.5077 0.0707 0.8586 +vn 0.7949 -0.0062 0.6067 +vn -0.5828 0.6850 0.4371 +vn -0.1821 -0.8675 -0.4629 +vn -0.4633 0.8853 -0.0394 +vn -0.6735 0.7391 0.0098 +vn 0.3614 -0.8914 0.2736 +vn -0.7561 0.5703 0.3210 +vn 0.0212 -0.4219 0.9064 +vn 0.1352 -0.8799 -0.4555 +vn -0.7749 0.6034 -0.1882 +vn -0.8368 -0.3298 -0.4371 +vn -0.8575 0.0759 -0.5088 +vn -0.4479 0.4520 -0.7714 +vn -0.9502 0.2762 0.1440 +vn -0.9481 -0.3142 -0.0484 +vn -0.9179 0.0067 0.3967 +vn 0.4880 -0.8676 -0.0959 +vn 0.1885 -0.9391 -0.2875 +vn 0.0020 -0.7701 -0.6380 +vn 0.0590 -0.9412 0.3326 +vn 0.6093 -0.3630 0.7050 +vn -0.2399 -0.8572 0.4556 +vn 0.2424 -0.7338 0.6346 +vn -0.2180 -0.0467 0.9748 +vn -0.4459 -0.8211 0.3562 +vn 0.0886 -0.2538 0.9632 +vn -0.1373 -0.8149 0.5632 +vn 0.1149 -0.9779 0.1745 +vn 0.1181 -0.3784 0.9181 +vn -0.1379 -0.2151 0.9668 +vn 0.1297 -0.2476 0.9601 +vn 0.9940 0.1092 0.0028 +vn -0.0938 -0.0867 0.9918 +vn 0.2345 -0.9031 0.3597 +vn 0.1307 -0.2446 0.9608 +vn -0.1014 -0.2330 0.9672 +vn -0.2262 0.0759 0.9711 +vn 0.0349 -0.1177 0.9924 +vn 0.0892 -0.1341 0.9869 +vn -0.2711 -0.2090 0.9396 +vn -0.1345 0.2351 0.9626 +vn -0.2919 -0.0277 0.9560 +vn -0.0451 0.2242 0.9735 +vn 0.0029 0.3892 0.9211 +vn 0.3209 0.8375 0.4423 +vn -0.3020 -0.1895 0.9343 +vn 0.1111 -0.1851 0.9764 +vn -0.1828 -0.4980 0.8477 +vn 0.2790 0.5216 0.8063 +vn 0.3817 -0.0822 0.9206 +vn 0.4926 -0.6946 0.5242 +vn 0.5979 -0.0622 0.7991 +vn -0.3611 -0.7967 0.4846 +vn -0.1823 -0.2502 0.9509 +vn 0.2726 -0.1978 0.9416 +vn 0.0959 -0.2966 0.9502 +vn -0.0329 0.0984 0.9946 +vn -0.1036 -0.2985 0.9488 +vn -0.5320 -0.1792 0.8276 +vn -0.5007 -0.3951 0.7702 +vn -0.7518 -0.5282 0.3947 +vn 0.0855 0.1917 0.9777 +vn -0.0932 -0.3333 0.9382 +vn -0.1877 0.1243 0.9743 +vn 0.0956 0.0267 0.9951 +vn 0.1742 0.2043 0.9633 +vn -0.2534 -0.2141 0.9434 +vn 0.9656 0.1175 0.2320 +vn -0.1768 -0.0050 0.9842 +vn 0.0680 -0.0082 0.9977 +vn 0.1367 0.0992 0.9856 +vn -0.2133 -0.0261 0.9766 +vn 0.0840 -0.3066 0.9481 +vn -0.0484 -0.0252 0.9985 +vn 0.1761 -0.0659 0.9822 +vn -0.3010 -0.4574 0.8367 +vn 0.9819 0.0759 0.1736 +vn 0.9034 0.2452 0.3517 +vn 0.3961 0.0961 0.9132 +vn -0.3874 0.0849 0.9180 +vn -0.0544 -0.4673 0.8824 +vn 0.1293 -0.0536 0.9902 +vn -0.1580 0.2311 0.9600 +vn 0.3677 0.3171 0.8742 +vn 0.1461 -0.1309 0.9806 +vn 0.2090 -0.2289 0.9507 +vn 0.6316 -0.4372 0.6402 +vn 0.1856 -0.0387 0.9819 +vn -0.2675 0.2035 0.9418 +vn -0.2824 0.2431 0.9280 +vn -0.7433 0.3301 0.5818 +vn -0.3950 -0.3268 0.8586 +vn 0.0201 0.1592 0.9870 +vn -0.0964 0.2167 0.9715 +vn -0.0941 0.2215 0.9706 +vn 0.0866 0.0904 0.9921 +vn 0.0809 -0.0590 0.9950 +vn 0.6354 -0.4746 0.6091 +vn 0.0179 0.1383 0.9902 +vn 0.0188 0.1377 0.9903 +vn 0.2809 0.2255 0.9329 +vn -0.2212 0.2367 0.9461 +vn 0.1646 0.0126 0.9863 +vn -0.0709 0.3320 0.9406 +vn 0.1032 0.2965 0.9494 +vn 0.6982 -0.1155 0.7066 +vn -0.8867 0.4232 0.1859 +vn 0.0645 0.3376 0.9391 +vn 0.1202 -0.2745 0.9540 +vn 0.8607 0.1519 -0.4859 +vn 0.9910 0.1335 0.0063 +vn 0.4792 0.4236 -0.7688 +vn 0.4639 0.2086 -0.8610 +vn 0.5573 0.1554 -0.8156 +vn -0.3350 0.6450 -0.6869 +vn 0.2180 0.1564 -0.9633 +vn 0.5137 -0.2576 -0.8184 +vn 0.3056 -0.4433 -0.8427 +vn 0.5050 0.0260 -0.8627 +vn 0.3054 0.5968 -0.7420 +vn 0.3339 0.3870 0.8595 +vn 0.6618 -0.5542 -0.5048 +vn 0.3080 0.4743 0.8247 +vn 0.4556 0.0413 -0.8892 +vn -0.0189 -0.2862 0.9580 +vn 0.6191 -0.6502 -0.4404 +vn 0.2239 0.9746 0.0008 +vn 0.3395 -0.8409 -0.4214 +vn -0.3522 0.9193 0.1755 +vn -0.0102 0.5953 -0.8035 +vn 0.2001 -0.0579 -0.9781 +vn 0.2057 -0.4181 0.8848 +vn -0.0001 0.9756 -0.2197 +vn 0.0706 -0.9772 0.2003 +vn 0.1062 0.9910 0.0819 +vn -0.0692 0.0929 -0.9933 +vn 0.4019 -0.8510 0.3381 +vn -0.6921 0.2184 -0.6880 +vn 0.5992 0.0351 -0.7998 +vn -0.1590 -0.0818 -0.9839 +vn 0.7903 0.2161 -0.5734 +vn 0.6341 -0.4776 -0.6081 +vn -0.7388 -0.0708 -0.6702 +vn -0.1128 -0.5505 -0.8272 +vn -0.6821 -0.1856 -0.7074 +vn 0.1224 -0.4476 -0.8858 +vn 0.2659 -0.5242 -0.8090 +vn -0.0787 -0.2083 -0.9749 +vn 0.2173 -0.6951 -0.6853 +vn -0.1027 -0.9664 -0.2357 +vn 0.0217 -0.2220 -0.9748 +vn 0.1596 -0.2736 -0.9485 +vn 0.0599 -0.3155 -0.9470 +vn -0.0548 -0.0974 -0.9937 +vn -0.0240 0.2767 -0.9607 +vn 0.0436 -0.0812 -0.9957 +vn -0.4396 -0.8762 -0.1975 +vn -0.5168 -0.7608 -0.3926 +vn -0.5726 -0.5425 -0.6147 +vn 0.0869 -0.0681 -0.9939 +vn -0.9677 0.1916 -0.1640 +vn 0.1321 -0.1734 -0.9759 +vn 0.0456 -0.1098 -0.9929 +vn -0.1281 0.2400 -0.9623 +vn 0.3297 0.8525 -0.4055 +vn 0.0467 0.2430 -0.9689 +vn 0.0012 0.3869 -0.9221 +vn 0.1511 0.1748 -0.9729 +vn 0.4570 -0.2214 -0.8615 +vn 0.0593 -0.2074 -0.9765 +vn -0.0268 -0.2528 -0.9672 +vn -0.5700 -0.3517 -0.7426 +vn -0.0596 0.1388 -0.9885 +vn 0.0677 0.1783 -0.9817 +vn -0.0051 0.2162 -0.9763 +vn 0.4986 -0.3979 -0.7702 +vn 0.1152 0.0339 -0.9928 +vn 0.2903 -0.8769 -0.3832 +vn -0.6270 -0.0343 -0.7783 +vn -0.4251 -0.6846 -0.5921 +vn -0.1022 0.2073 -0.9729 +vn -0.0587 0.0339 -0.9977 +vn 0.2069 0.0655 -0.9762 +vn -0.1668 0.1009 -0.9808 +vn -0.1493 0.0666 -0.9865 +vn -0.0585 0.0161 -0.9982 +vn 0.0615 -0.0836 -0.9946 +vn 0.2425 -0.0812 -0.9668 +vn 0.1264 -0.0726 -0.9893 +vn -0.2565 -0.3680 -0.8938 +vn -0.2652 -0.5414 -0.7978 +vn -0.1338 -0.0497 -0.9898 +vn 0.0552 -0.0799 -0.9953 +vn -0.0263 0.0338 -0.9991 +vn -0.1624 -0.0408 -0.9859 +vn 0.1762 -0.0610 -0.9825 +vn 0.2068 -0.2201 -0.9533 +vn 0.1526 -0.0496 -0.9870 +vn -0.0703 -0.1510 -0.9860 +vn -0.5424 0.0464 -0.8388 +vn 0.1018 0.0717 -0.9922 +vn 0.0123 -0.0537 -0.9985 +vn -0.6192 0.4082 -0.6708 +vn -0.0927 -0.1273 -0.9875 +vn -0.7382 0.5661 -0.3669 +vn -0.1248 0.2625 -0.9568 +vn -0.9588 0.0437 -0.2809 +vn -0.1900 0.4632 -0.8656 +vn -0.0361 0.2159 -0.9757 +vn 0.5274 0.7179 -0.4544 +vn -0.0000 -0.0789 -0.9969 +vn -0.8369 0.2970 -0.4597 +vn -0.2765 -0.8843 -0.3762 +vn -0.0167 -0.1193 -0.9927 +vn -0.0732 -0.0773 -0.9943 +vn -0.1817 -0.1581 -0.9706 +vn -0.5440 -0.6275 -0.5571 +vn 0.0283 0.4296 -0.9026 +vn 0.0536 0.8342 -0.5488 +vn -0.5763 0.7991 -0.1712 +vn -0.5733 0.8085 0.1327 +vn 0.0489 0.2611 0.9641 +vn -0.9191 -0.3708 0.1336 +vn 0.0737 0.7525 0.6545 +vn -0.3658 0.4672 0.8049 +vn -0.4884 0.2158 0.8455 +vn -0.0737 -0.5201 0.8509 +vn -0.7008 0.2274 0.6761 +vn -0.6234 -0.5063 0.5958 +vn 0.7405 -0.4566 0.4931 +vn -0.4781 -0.8584 -0.1856 +vn 0.3922 -0.5958 -0.7008 +vn -0.7233 -0.6343 -0.2730 +vn -0.4440 -0.5616 -0.6982 +vn 0.7532 -0.6573 -0.0233 +vn -0.7492 -0.6609 0.0435 +vn -0.2860 -0.5063 -0.8135 +vn -0.2119 -0.7585 -0.6163 +vn -0.8288 -0.5347 0.1648 +vn -0.5070 -0.8184 0.2705 +vn -0.4571 -0.8753 -0.1576 +vn -0.7138 -0.6891 0.1246 +vn 0.6794 -0.5753 0.4555 +vn -0.3246 -0.9456 -0.0193 +vn -0.0640 -0.8552 0.5144 +vn 0.6671 -0.7427 0.0583 +vn -0.8822 -0.1967 0.4278 +vn -0.8241 -0.5398 0.1715 +vn 0.6225 -0.7800 0.0640 +vn 0.2200 -0.9744 -0.0458 +vn 0.7538 -0.3838 0.5334 +vn 0.1357 0.9561 0.2597 +vn -0.0279 0.9151 -0.4022 +vn 0.6940 -0.6653 -0.2751 +vn 0.8128 -0.3732 -0.4473 +vn 0.9811 -0.1787 -0.0736 +vn 0.7653 0.0062 0.6437 +vn 0.6040 -0.4245 -0.6745 +vn -0.1476 0.9271 0.3445 +vn 0.1280 0.9892 -0.0718 +vn 0.3416 0.7314 -0.5902 +vn -0.2748 -0.9604 0.0466 +vn -0.6207 -0.7809 -0.0695 +vn -0.1031 0.7178 0.6886 +vn -0.6514 -0.7210 0.2363 +vn -0.7384 -0.4003 -0.5427 +vn -0.0328 0.9653 -0.2590 +vn -0.7904 -0.5465 0.2768 +vn -0.9965 -0.0794 0.0247 +vn -0.6028 -0.4654 0.6481 +vn -0.7168 0.0213 -0.6969 +vn -0.2688 0.8414 -0.4688 +vn -0.1016 0.9799 -0.1718 +vn 0.0738 0.8805 -0.4682 +vn -0.5044 0.3662 0.7820 +vn 0.1858 -0.6030 -0.7758 +vn 0.1127 -0.5021 -0.8574 +vn -0.1894 -0.5860 -0.7879 +vn -0.0724 -0.6007 -0.7962 +vn 0.2244 0.5437 -0.8087 +vn 0.1474 0.5825 -0.7993 +vn -0.1189 0.5125 -0.8504 +vn -0.1956 0.6015 -0.7745 +vn 0.4825 0.2664 -0.8344 +vn 0.4708 -0.2433 -0.8480 +vn 0.1716 0.2086 -0.9628 +vn 0.1358 -0.2351 -0.9625 +vn 0.7480 0.0875 -0.6579 +vn 0.7320 -0.1259 -0.6696 +vn 0.7339 0.1375 -0.6652 +vn 0.6890 -0.1489 -0.7093 +vn 0.4040 -0.3233 -0.8557 +vn 0.4509 0.3405 -0.8251 +vn -0.1504 -0.2002 -0.9681 +vn -0.4631 0.2586 -0.8477 +vn -0.1602 0.2272 -0.9606 +vn -0.4841 -0.2367 -0.8424 +vn -0.7333 -0.1000 -0.6726 +vn -0.7191 0.1457 -0.6795 +vn -0.6290 0.1415 -0.7644 +vn -0.7561 -0.0787 -0.6497 +vn -0.5123 -0.2705 -0.8151 +vn -0.3799 -0.4374 -0.8151 +vn -0.3958 0.3972 -0.8280 +vn 0.5200 0.0570 -0.8523 +vn -0.5803 -0.0463 -0.8131 +vn -0.5694 0.0118 -0.8220 +vn -0.2085 0.5475 0.8104 +vn 0.1131 0.6053 0.7879 +vn 0.1383 0.2182 0.9661 +vn -0.2220 0.1295 0.9664 +vn 0.1798 -0.1396 0.9737 +vn -0.2181 -0.0969 0.9711 +vn 0.1461 -0.6233 0.7682 +vn -0.1291 -0.6261 0.7690 +vn -0.6356 0.1565 0.7560 +vn -0.5104 -0.1145 0.8523 +vn -0.7463 -0.1538 0.6477 +vn -0.6763 -0.2680 0.6862 +vn -0.4676 0.3706 0.8025 +vn -0.0939 0.3430 0.9346 +vn -0.1578 -0.3588 0.9200 +vn -0.5264 -0.3899 0.7556 +vn 0.1433 -0.3877 0.9106 +vn 0.5471 -0.1311 0.8267 +vn 0.4301 0.1600 0.8885 +vn 0.7097 0.1451 0.6894 +vn 0.7904 -0.1041 0.6037 +vn 0.4128 0.4516 0.7910 +vn 0.4093 -0.4425 0.7979 +vn 0.6479 -0.3236 0.6896 +vn -0.1954 -0.1141 0.9741 +vn -0.1145 -0.9585 0.2610 +vn 0.0704 -0.4778 0.8757 +vn 0.0833 -0.2408 0.9670 +vn -0.1374 -0.8142 0.5642 +vn 0.1148 -0.9828 0.1449 +vn 0.0817 -0.3858 0.9190 +vn -0.1416 -0.2102 0.9673 +vn 0.1367 -0.2722 0.9525 +vn 0.9516 0.3049 0.0386 +vn -0.0929 -0.0723 0.9931 +vn 0.1137 -0.8732 0.4739 +vn 0.1230 -0.2294 0.9655 +vn -0.1022 -0.2327 0.9672 +vn 0.0103 0.3251 0.9456 +vn 0.0585 -0.0946 0.9938 +vn 0.0908 -0.1276 0.9877 +vn -0.1570 -0.2062 0.9658 +vn -0.1381 0.2309 0.9631 +vn -0.2938 -0.0320 0.9553 +vn -0.0724 0.2063 0.9758 +vn -0.0096 0.3876 0.9218 +vn 0.3362 0.8297 0.4456 +vn -0.2092 -0.3788 0.9015 +vn 0.1120 -0.2012 0.9731 +vn 0.0524 -0.1006 0.9935 +vn 0.2792 0.5220 0.8059 +vn 0.3880 -0.0880 0.9174 +vn 0.3175 -0.7436 0.5884 +vn 0.5712 -0.1070 0.8138 +vn -0.3848 -0.6513 0.6540 +vn -0.1822 -0.2495 0.9511 +vn 0.2469 -0.2203 0.9437 +vn 0.0876 -0.2979 0.9506 +vn -0.0362 0.1017 0.9942 +vn -0.0696 -0.3238 0.9436 +vn -0.4912 0.0540 0.8694 +vn -0.5437 -0.1647 0.8229 +vn -0.5358 -0.3987 0.7443 +vn -0.7382 -0.4259 0.5232 +vn 0.0953 0.2166 0.9716 +vn -0.1889 0.1006 0.9768 +vn 0.0820 0.0432 0.9957 +vn 0.1907 0.1851 0.9640 +vn -0.2089 -0.2658 0.9411 +vn 0.9508 0.1861 0.2479 +vn 0.0666 -0.0147 0.9977 +vn 0.1519 0.0555 0.9868 +vn -0.3405 -0.1713 0.9245 +vn -0.1698 -0.0335 0.9849 +vn -0.4232 -0.0544 0.9044 +vn 0.1714 -0.0624 0.9832 +vn -0.1300 -0.3104 0.9417 +vn -0.1043 -0.0253 0.9942 +vn -0.0560 -0.0163 0.9983 +vn 0.5945 0.6416 0.4847 +vn 0.7940 -0.4725 0.3825 +vn 0.3394 0.1273 0.9320 +vn -0.3965 0.0912 0.9135 +vn -0.2423 -0.4733 0.8469 +vn -0.2135 -0.5737 0.7907 +vn -0.0354 -0.4850 0.8738 +vn 0.3484 0.2039 0.9149 +vn 0.0521 -0.0161 0.9985 +vn 0.1112 -0.1405 0.9838 +vn -0.2576 0.2144 0.9422 +vn 0.1304 -0.1090 0.9854 +vn 0.0927 -0.1271 0.9875 +vn 0.1811 -0.0467 0.9824 +vn -0.2696 0.2033 0.9413 +vn -0.3285 0.2989 0.8960 +vn -0.1555 0.7141 0.6826 +vn -0.1880 -0.1785 0.9658 +vn 0.0176 0.1597 0.9870 +vn -0.0988 0.2161 0.9714 +vn -0.1342 0.2324 0.9633 +vn 0.1018 0.0426 0.9939 +vn 0.5033 0.2108 0.8380 +vn 0.6531 -0.3103 0.6907 +vn 0.0330 0.1493 0.9882 +vn -0.0035 0.1746 0.9846 +vn 0.2310 0.2492 0.9405 +vn -0.2601 0.2303 0.9377 +vn -0.0941 0.3059 0.9474 +vn 0.1566 0.0413 0.9868 +vn -0.8303 0.2365 0.5047 +vn 0.0852 0.3178 0.9443 +vn 0.7815 -0.0647 0.6206 +vn 0.1288 -0.2674 0.9549 +vn 0.1212 0.2034 0.9716 +vn 0.0294 0.4907 0.8708 +vn 0.8639 0.3518 -0.3603 +vn 0.9922 0.1235 0.0139 +vn 0.6928 0.2033 -0.6919 +vn 0.1386 0.6737 -0.7259 +vn 0.0172 0.2734 -0.9618 +vn -0.4725 0.5078 -0.7203 +vn 0.4500 -0.5310 -0.7180 +vn 0.6216 0.0674 -0.7804 +vn 0.4501 0.0224 -0.8927 +vn 0.3030 0.5970 -0.7428 +vn 0.6206 0.4965 0.6069 +vn 0.5774 -0.5817 -0.5730 +vn 0.3073 0.4744 0.8249 +vn 0.4555 0.0414 -0.8893 +vn 0.3397 -0.8410 -0.4211 +vn -0.3546 0.9185 0.1752 +vn -0.0052 0.5938 -0.8046 +vn 0.1995 -0.0582 -0.9782 +vn 0.2384 -0.5624 0.7917 +vn -0.0743 0.8943 -0.4412 +vn -0.0806 -0.9957 0.0462 +vn 0.0893 0.9931 0.0763 +vn -0.0671 0.0913 -0.9936 +vn 0.4011 -0.8510 0.3390 +vn -0.6950 0.2168 -0.6855 +vn 0.5256 0.0095 -0.8507 +vn -0.1027 -0.0989 -0.9898 +vn 0.7995 0.2082 -0.5634 +vn 0.5202 -0.5066 -0.6876 +vn -0.5287 0.0864 -0.8444 +vn -0.2072 -0.5258 -0.8250 +vn 0.2374 -0.9005 -0.3642 +vn -0.3690 -0.1612 -0.9154 +vn 0.2705 -0.7553 -0.5970 +vn -0.0777 -0.2088 -0.9749 +vn 0.2166 -0.6953 -0.6853 +vn -0.1041 -0.9572 -0.2701 +vn 0.1825 -0.3529 -0.9177 +vn 0.0546 -0.2835 -0.9574 +vn 0.0613 -0.3088 -0.9491 +vn -0.0629 -0.0894 -0.9940 +vn -0.0202 0.3089 -0.9509 +vn 0.0688 -0.0785 -0.9945 +vn -0.4407 -0.8754 -0.1986 +vn -0.4554 -0.8062 -0.3777 +vn -0.9892 -0.1326 -0.0619 +vn 0.0992 -0.0820 -0.9917 +vn 0.1351 -0.1746 -0.9753 +vn 0.0272 -0.1318 -0.9909 +vn -0.1316 0.2357 -0.9629 +vn -0.0087 0.4979 -0.8672 +vn 0.0695 0.2084 -0.9756 +vn 0.0062 0.3863 -0.9223 +vn 0.1503 0.1690 -0.9741 +vn 0.3768 -0.2316 -0.8969 +vn -0.4761 -0.3139 -0.8214 +vn 0.0673 0.0946 -0.9932 +vn -0.0067 -0.2521 -0.9677 +vn -0.0581 0.1445 -0.9878 +vn 0.0400 0.1301 -0.9907 +vn -0.0033 0.2162 -0.9763 +vn 0.6741 -0.4721 -0.5681 +vn 0.1326 0.0641 -0.9891 +vn 0.2151 -0.7129 -0.6674 +vn -0.6713 -0.1839 -0.7180 +vn -0.8873 -0.1645 -0.4308 +vn -0.1020 0.2056 -0.9733 +vn -0.0585 0.0334 -0.9977 +vn 0.2023 0.0675 -0.9770 +vn -0.1388 0.1077 -0.9844 +vn -0.1575 0.0790 -0.9844 +vn -0.0603 0.0168 -0.9980 +vn 0.0708 -0.1151 -0.9908 +vn 0.2372 -0.0818 -0.9680 +vn 0.1702 -0.0189 -0.9852 +vn -0.5740 -0.5475 -0.6089 +vn -0.7781 -0.5164 -0.3576 +vn 0.1506 -0.2808 -0.9479 +vn -0.1505 -0.0568 -0.9870 +vn 0.0740 -0.0811 -0.9940 +vn -0.9811 0.0025 -0.1935 +vn -0.1379 -0.0352 -0.9898 +vn -0.0384 -0.1785 -0.9832 +vn 0.1456 -0.1068 -0.9836 +vn -0.0702 -0.1483 -0.9865 +vn -0.0072 -0.0731 -0.9973 +vn -0.3920 0.3805 -0.8376 +vn 0.0898 0.0799 -0.9928 +vn -0.9528 -0.1727 -0.2497 +vn -0.2801 -0.7916 -0.5431 +vn -0.3211 -0.1902 -0.9277 +vn -0.7442 0.5581 -0.3671 +vn -0.1452 0.2542 -0.9562 +vn -0.8915 0.3517 -0.2855 +vn -0.0595 0.2121 -0.9754 +vn 0.5334 0.7021 -0.4718 +vn -0.0075 -0.0940 -0.9955 +vn -0.8603 -0.1793 -0.4771 +vn -0.8748 0.3233 -0.3609 +vn -0.0114 -0.1189 -0.9928 +vn -0.0768 -0.0868 -0.9933 +vn -0.1752 -0.1588 -0.9716 +vn -0.5257 -0.6322 -0.5692 +vn 0.0468 0.4292 -0.9020 +vn 0.0508 0.8351 -0.5478 +vn -0.6042 0.7594 -0.2412 +vn -0.5726 0.8091 0.1325 +vn 0.0489 0.2612 0.9641 +vn -0.3691 0.4596 0.8078 +vn -0.5948 0.2165 0.7742 +vn -0.0731 -0.4351 0.8974 +vn -0.7720 0.2332 0.5913 +vn 0.8245 -0.4588 0.3312 +vn -0.6177 -0.7219 -0.3120 +vn 0.1556 -0.6929 -0.7040 +vn -0.7237 -0.6349 -0.2706 +vn -0.4915 -0.7342 -0.4684 +vn 0.6843 -0.7149 0.1433 +vn -0.2860 -0.5062 -0.8136 +vn -0.2119 -0.7584 -0.6164 +vn -0.8290 -0.5346 0.1643 +vn -0.1245 -0.9368 0.3271 +vn -0.2020 -0.6076 0.7681 +vn -0.7158 -0.6878 0.1205 +vn 0.6769 -0.5798 0.4535 +vn -0.3171 -0.9484 0.0019 +vn -0.4684 -0.7032 0.5349 +vn 0.6491 -0.7573 0.0717 +vn -0.9501 -0.1353 0.2811 +vn 0.6220 -0.7804 0.0643 +vn 0.2735 -0.9608 -0.0446 +vn 0.7307 -0.4009 0.5525 +vn -0.3520 0.9117 0.2120 +vn -0.3034 0.8278 -0.4720 +vn 0.7010 -0.6791 -0.2176 +vn 0.7907 -0.5485 -0.2720 +vn 0.9960 -0.0894 0.0064 +vn 0.5452 0.1594 0.8230 +vn 0.5696 -0.3444 -0.7463 +vn 0.2242 0.7713 0.5957 +vn 0.3525 0.9354 0.0280 +vn -0.3330 0.7133 0.6167 +vn 0.3802 0.4962 -0.7805 +vn -0.2731 -0.9610 0.0441 +vn -0.6221 -0.7802 -0.0658 +vn 0.0051 0.6870 0.7267 +vn -0.6274 -0.7261 0.2815 +vn -0.7853 -0.3101 -0.5358 +vn -0.3999 0.7929 -0.4597 +vn -0.8273 -0.2389 0.5084 +vn -0.9850 -0.1657 0.0491 +vn -0.5273 -0.4796 0.7014 +vn 0.1687 0.9346 -0.3130 +vn -0.0105 0.9937 0.1118 +vn -0.3991 0.4258 0.8120 +vn 0.2050 -0.5984 -0.7745 +vn 0.1724 -0.5011 -0.8481 +vn -0.1884 -0.5870 -0.7873 +vn -0.0740 -0.5993 -0.7971 +vn 0.1730 0.4950 -0.8515 +vn 0.1451 0.5769 -0.8038 +vn -0.2094 0.4939 -0.8439 +vn -0.2029 0.6021 -0.7722 +vn 0.4867 0.2689 -0.8312 +vn 0.4937 -0.2195 -0.8415 +vn 0.1706 0.2094 -0.9628 +vn 0.1391 -0.2366 -0.9616 +vn 0.7468 0.1006 -0.6574 +vn 0.7446 -0.1311 -0.6545 +vn 0.7266 0.1747 -0.6645 +vn 0.7146 -0.1078 -0.6912 +vn 0.4779 -0.3399 -0.8100 +vn 0.4378 0.4611 -0.7718 +vn -0.1506 -0.2005 -0.9681 +vn -0.4827 0.2465 -0.8404 +vn -0.1610 0.2337 -0.9589 +vn -0.4836 -0.2390 -0.8420 +vn -0.7285 -0.1036 -0.6771 +vn -0.7381 0.1533 -0.6570 +vn -0.7258 0.0806 -0.6831 +vn -0.6696 -0.0607 -0.7402 +vn -0.5007 -0.2900 -0.8156 +vn -0.3791 -0.4366 -0.8159 +vn -0.4503 0.3589 -0.8176 +vn 0.5811 0.0680 -0.8110 +vn -0.1221 0.6447 0.7546 +vn 0.0977 0.6095 0.7868 +vn 0.1519 0.2116 0.9655 +vn -0.2002 0.1318 0.9708 +vn 0.1732 -0.1419 0.9746 +vn -0.2139 -0.1019 0.9715 +vn 0.1565 -0.6187 0.7698 +vn -0.1427 -0.6189 0.7724 +vn -0.5048 0.1681 0.8467 +vn -0.5185 -0.1145 0.8474 +vn -0.7332 -0.1441 0.6646 +vn -0.7179 0.1598 0.6775 +vn -0.4140 0.4448 0.7942 +vn -0.0978 0.3770 0.9211 +vn -0.1576 -0.3589 0.9200 +vn -0.5055 -0.4032 0.7628 +vn 0.1500 -0.3948 0.9064 +vn 0.5188 -0.1171 0.8468 +vn 0.4883 0.1148 0.8651 +vn 0.7490 -0.1454 0.6465 +vn 0.7701 0.0927 0.6311 +vn 0.8433 -0.0034 0.5375 +vn 0.5576 0.3439 0.7556 +vn 0.3136 0.4850 0.8163 +vn 0.4770 -0.4030 0.7811 +# UV coordinates: 1 'general' dummy, 4 for the backplate +vt 0 1 0 +vt 0.997862 1.79999 0 +vt 0.00213805 1.79999 0 +vt 1 0.799992 0 +vt 0 0.799992 0 +f 1/1/1 2/1/2 3/1/3 +f 4/1/4 1/1/1 3/1/3 +f 5/1/5 4/1/4 3/1/3 +f 6/1/6 5/1/5 3/1/3 +f 324/1/7 6/1/6 3/1/3 +f 331/1/8 324/1/7 3/1/3 +f 7/1/9 331/1/8 3/1/3 +f 8/1/10 7/1/9 3/1/3 +f 1/1/1 9/1/11 2/1/2 +f 9/1/11 10/1/12 2/1/2 +f 4/1/4 11/1/13 1/1/1 +f 10/1/12 12/1/14 2/1/2 +f 10/1/12 13/1/15 12/1/14 +f 10/1/12 14/1/16 13/1/15 +f 10/1/12 214/1/17 14/1/16 +f 8/1/10 15/1/18 7/1/9 +f 15/1/18 16/1/19 7/1/9 +f 15/1/18 17/1/20 16/1/19 +f 20/1/21 21/1/22 19/1/23 +f 22/1/24 20/1/21 19/1/23 +f 21/1/22 23/1/25 19/1/23 +f 24/1/26 22/1/24 19/1/23 +f 23/1/25 18/1/27 19/1/23 +f 25/1/28 22/1/24 24/1/26 +f 26/1/29 25/1/28 24/1/26 +f 27/1/30 26/1/29 24/1/26 +f 28/1/31 27/1/30 24/1/26 +f 29/1/32 18/1/27 23/1/25 +f 30/1/33 18/1/27 29/1/32 +f 31/1/34 32/1/35 33/1/36 +f 32/1/35 34/1/37 33/1/36 +f 34/1/37 35/1/38 33/1/36 +f 35/1/38 36/1/39 33/1/36 +f 36/1/39 37/1/40 33/1/36 +f 37/1/40 38/1/41 33/1/36 +f 39/1/42 32/1/35 31/1/34 +f 40/1/43 39/1/42 31/1/34 +f 464/1/44 34/1/37 32/1/35 +f 41/1/45 40/1/43 31/1/34 +f 42/1/46 40/1/43 41/1/45 +f 43/1/47 40/1/43 42/1/46 +f 500/1/48 38/1/41 37/1/40 +f 516/1/49 38/1/41 500/1/48 +f 504/1/50 516/1/49 500/1/48 +f 44/1/51 516/1/49 504/1/50 +f 47/1/52 45/1/53 46/1/54 +f 45/1/53 48/1/55 46/1/54 +f 49/1/56 47/1/52 46/1/54 +f 48/1/55 50/1/57 46/1/54 +f 51/1/58 49/1/56 46/1/54 +f 48/1/55 52/1/59 50/1/57 +f 52/1/59 53/1/60 50/1/57 +f 53/1/60 54/1/61 50/1/57 +f 51/1/58 55/1/62 49/1/56 +f 58/1/63 59/1/64 56/1/65 +f 60/1/66 61/1/67 57/1/68 +f 61/1/67 62/1/69 57/1/68 +f 63/1/70 59/1/64 58/1/63 +f 61/1/67 64/1/71 62/1/69 +f 65/1/72 63/1/70 58/1/63 +f 66/1/73 65/1/72 58/1/63 +f 64/1/71 67/1/74 62/1/69 +f 68/1/75 65/1/72 66/1/73 +f 64/1/71 69/1/76 67/1/74 +f 69/1/76 70/1/77 67/1/74 +f 71/1/78 65/1/72 68/1/75 +f 72/1/79 71/1/78 68/1/75 +f 69/1/76 73/1/80 70/1/77 +f 73/1/80 74/1/81 70/1/77 +f 75/1/82 71/1/78 72/1/79 +f 76/1/83 75/1/82 72/1/79 +f 73/1/80 77/1/84 74/1/81 +f 77/1/84 78/1/85 74/1/81 +f 79/1/86 75/1/82 76/1/83 +f 80/1/87 79/1/86 76/1/83 +f 77/1/84 81/1/88 78/1/85 +f 81/1/88 82/1/89 78/1/85 +f 83/1/90 79/1/86 80/1/87 +f 84/1/91 83/1/90 80/1/87 +f 81/1/88 85/1/92 82/1/89 +f 85/1/92 84/1/91 82/1/89 +f 85/1/92 83/1/90 84/1/91 +f 86/1/93 87/1/94 88/1/95 +f 89/1/96 87/1/94 86/1/93 +f 90/1/97 91/1/98 92/1/99 +f 87/1/94 91/1/98 90/1/97 +f 97/1/100 95/1/101 96/1/102 +f 95/1/101 98/1/103 96/1/102 +f 99/1/104 95/1/101 97/1/100 +f 100/1/105 94/1/106 93/1/107 +f 95/1/101 101/1/108 98/1/103 +f 102/1/109 95/1/101 99/1/104 +f 103/1/110 94/1/106 100/1/105 +f 104/1/111 94/1/106 103/1/110 +f 105/1/112 106/1/113 101/1/108 +f 95/1/101 105/1/112 101/1/108 +f 107/1/114 95/1/101 102/1/109 +f 108/1/115 109/1/116 107/1/114 +f 109/1/116 95/1/101 107/1/114 +f 110/1/117 106/1/113 105/1/112 +f 111/1/118 94/1/106 104/1/111 +f 110/1/117 112/1/119 106/1/113 +f 113/1/120 94/1/106 111/1/118 +f 114/1/121 113/1/120 111/1/118 +f 110/1/117 115/1/122 112/1/119 +f 110/1/117 113/1/120 114/1/121 +f 115/1/122 110/1/117 114/1/121 +f 118/1/123 119/1/124 120/1/125 +f 121/1/126 118/1/123 120/1/125 +f 118/1/123 122/1/127 119/1/124 +f 116/1/128 123/1/129 117/1/130 +f 118/1/123 124/1/131 122/1/127 +f 125/1/132 118/1/123 121/1/126 +f 116/1/128 126/1/133 123/1/129 +f 127/1/134 118/1/123 125/1/132 +f 128/1/135 127/1/134 125/1/132 +f 118/1/123 129/1/136 124/1/131 +f 118/1/123 130/1/137 129/1/136 +f 128/1/135 131/1/138 127/1/134 +f 132/1/139 130/1/137 118/1/123 +f 116/1/128 133/1/140 126/1/133 +f 134/1/141 131/1/138 128/1/135 +f 135/1/142 136/1/143 133/1/140 +f 116/1/128 135/1/142 133/1/140 +f 137/1/144 131/1/138 134/1/141 +f 135/1/142 137/1/144 136/1/143 +f 135/1/142 131/1/138 137/1/144 +f 138/1/145 139/1/146 140/1/147 +f 56/1/65 141/1/148 142/1/149 +f 143/1/150 139/1/146 138/1/145 +f 141/1/148 144/1/151 142/1/149 +f 145/1/152 146/1/153 144/1/151 +f 141/1/148 145/1/152 144/1/151 +f 147/1/154 139/1/146 143/1/150 +f 148/1/155 146/1/153 145/1/152 +f 56/1/65 149/1/156 141/1/148 +f 150/1/157 139/1/146 147/1/154 +f 148/1/155 151/1/158 146/1/153 +f 59/1/64 149/1/156 56/1/65 +f 152/1/159 139/1/146 150/1/157 +f 148/1/155 153/1/160 151/1/158 +f 154/1/161 139/1/146 152/1/159 +f 148/1/155 154/1/161 152/1/159 +f 153/1/160 148/1/155 152/1/159 +f 154/1/161 155/1/162 139/1/146 +f 155/1/162 156/1/163 139/1/146 +f 156/1/163 157/1/164 139/1/146 +f 157/1/164 158/1/165 139/1/146 +f 158/1/165 159/1/166 139/1/146 +f 159/1/166 160/1/167 139/1/146 +f 160/1/167 161/1/168 139/1/146 +f 162/1/169 161/1/168 160/1/167 +f 163/1/170 161/1/168 162/1/169 +f 164/1/171 163/1/170 162/1/169 +f 165/1/172 163/1/170 164/1/171 +f 166/1/173 163/1/170 165/1/172 +f 167/1/174 163/1/170 166/1/173 +f 113/1/120 168/1/175 94/1/106 +f 168/1/175 169/1/176 94/1/106 +f 169/1/176 170/1/177 94/1/106 +f 170/1/177 171/1/178 94/1/106 +f 171/1/178 172/1/179 94/1/106 +f 172/1/179 173/1/180 94/1/106 +f 173/1/180 174/1/181 94/1/106 +f 175/1/182 174/1/181 173/1/180 +f 176/1/183 174/1/181 175/1/182 +f 177/1/184 176/1/183 175/1/182 +f 178/1/185 176/1/183 177/1/184 +f 179/1/186 176/1/183 178/1/185 +f 180/1/187 176/1/183 179/1/186 +f 181/1/188 176/1/183 180/1/187 +f 174/1/181 176/1/183 293/1/189 +f 176/1/183 295/1/190 293/1/189 +f 161/1/168 163/1/170 182/1/191 +f 163/1/170 183/1/192 182/1/191 +f 184/1/193 185/1/194 116/1/128 +f 185/1/194 135/1/142 116/1/128 +f 186/1/195 184/1/193 116/1/128 +f 187/1/196 186/1/195 116/1/128 +f 188/1/197 187/1/196 116/1/128 +f 189/1/198 188/1/197 116/1/128 +f 182/1/191 189/1/198 116/1/128 +f 182/1/191 183/1/192 189/1/198 +f 183/1/192 190/1/199 189/1/198 +f 183/1/192 191/1/200 190/1/199 +f 183/1/192 192/1/201 191/1/200 +f 183/1/192 193/1/202 192/1/201 +f 194/1/203 205/1/204 132/1/139 +f 149/1/156 194/1/203 132/1/139 +f 205/1/204 202/1/205 132/1/139 +f 202/1/205 130/1/137 132/1/139 +f 59/1/64 63/1/70 149/1/156 +f 63/1/70 194/1/203 149/1/156 +f 61/1/67 60/1/66 195/1/206 +f 196/1/207 200/1/208 195/1/206 +f 200/1/208 64/1/71 195/1/206 +f 64/1/71 61/1/67 195/1/206 +f 197/1/209 198/1/210 196/1/207 +f 198/1/210 557/1/211 196/1/207 +f 557/1/211 200/1/208 196/1/207 +f 65/1/72 194/1/203 63/1/70 +f 71/1/78 194/1/203 65/1/72 +f 200/1/208 69/1/76 64/1/71 +f 199/1/212 194/1/203 71/1/78 +f 88/1/95 291/1/213 71/1/78 +f 291/1/213 199/1/212 71/1/78 +f 200/1/208 73/1/80 69/1/76 +f 75/1/82 88/1/95 71/1/78 +f 200/1/208 77/1/84 73/1/80 +f 201/1/214 202/1/205 205/1/204 +f 198/1/210 203/1/215 557/1/211 +f 203/1/215 204/1/216 557/1/211 +f 79/1/86 88/1/95 75/1/82 +f 81/1/88 77/1/84 200/1/208 +f 88/1/95 85/1/92 200/1/208 +f 85/1/92 81/1/88 200/1/208 +f 204/1/216 556/1/217 557/1/211 +f 206/1/218 88/1/95 200/1/208 +f 207/1/219 201/1/214 205/1/204 +f 204/1/216 555/1/220 556/1/217 +f 83/1/90 88/1/95 79/1/86 +f 204/1/216 552/1/221 555/1/220 +f 204/1/216 208/1/222 552/1/221 +f 211/1/223 201/1/214 207/1/219 +f 85/1/92 88/1/95 83/1/90 +f 210/1/224 209/1/225 207/1/219 +f 209/1/225 211/1/223 207/1/219 +f 86/1/93 88/1/95 206/1/218 +f 213/1/226 212/1/227 552/1/221 +f 208/1/222 213/1/226 552/1/221 +f 154/1/161 148/1/155 135/1/142 +f 148/1/155 131/1/138 135/1/142 +f 262/1/228 316/1/229 113/1/120 +f 110/1/117 262/1/228 113/1/120 +f 189/1/198 160/1/167 188/1/197 +f 189/1/198 162/1/169 160/1/167 +f 214/1/17 215/1/230 25/1/28 +f 216/1/231 215/1/230 214/1/17 +f 217/1/232 216/1/231 214/1/17 +f 218/1/233 217/1/232 214/1/17 +f 219/1/234 217/1/232 218/1/233 +f 220/1/235 219/1/234 218/1/233 +f 245/1/236 220/1/235 218/1/233 +f 221/1/237 220/1/235 245/1/236 +f 91/1/98 239/1/238 210/1/224 +f 239/1/238 209/1/225 210/1/224 +f 223/1/239 222/1/240 690/1/241 +f 220/1/235 223/1/239 690/1/241 +f 222/1/240 224/1/242 690/1/241 +f 225/5/243 589/2/244 690/3/241 +f 224/1/242 225/1/243 690/1/241 +f 226/1/245 448/1/246 589/1/244 +f 227/1/247 226/1/245 589/1/244 +f 225/5/243 228/4/248 589/2/244 +f 228/1/248 229/1/249 589/1/244 +f 229/1/249 227/1/247 589/1/244 +f 230/1/250 228/1/248 225/1/243 +f 87/1/94 89/1/96 225/1/243 +f 89/1/96 232/1/251 225/1/243 +f 232/1/251 231/1/252 225/1/243 +f 231/1/252 230/1/250 225/1/243 +f 233/1/253 91/1/98 225/1/243 +f 91/1/98 87/1/94 225/1/243 +f 234/1/254 448/1/246 226/1/245 +f 220/1/235 235/1/255 223/1/239 +f 236/1/256 91/1/98 233/1/253 +f 221/1/237 237/1/257 235/1/255 +f 220/1/235 221/1/237 235/1/255 +f 238/1/258 448/1/246 234/1/254 +f 239/1/238 91/1/98 236/1/256 +f 89/1/96 240/1/259 232/1/251 +f 243/1/260 241/1/261 242/1/262 +f 241/1/261 244/1/263 242/1/262 +f 244/1/263 218/1/233 242/1/262 +f 109/1/116 108/1/115 242/1/262 +f 108/1/115 243/1/260 242/1/262 +f 245/1/236 218/1/233 244/1/263 +f 3/1/3 24/1/26 19/1/23 +f 2/1/2 24/1/26 3/1/3 +f 568/1/264 246/1/265 247/1/266 +f 626/1/267 246/1/265 568/1/264 +f 581/1/268 582/1/269 781/1/270 +f 582/1/269 684/1/271 781/1/270 +f 248/1/272 175/1/182 249/1/273 +f 175/1/182 173/1/180 249/1/273 +f 108/1/115 224/1/242 243/1/260 +f 225/1/243 224/1/242 108/1/115 +f 130/1/137 225/1/243 108/1/115 +f 202/1/205 225/1/243 130/1/137 +f 129/1/136 130/1/137 107/1/114 +f 130/1/137 108/1/115 107/1/114 +f 116/1/128 93/1/107 94/1/106 +f 117/1/130 93/1/107 116/1/128 +f 123/1/129 126/1/133 103/1/110 +f 126/1/133 104/1/111 103/1/110 +f 136/1/143 137/1/144 114/1/121 +f 137/1/144 115/1/122 114/1/121 +f 106/1/113 125/1/132 101/1/108 +f 106/1/113 128/1/135 125/1/132 +f 120/1/125 119/1/124 96/1/102 +f 119/1/124 97/1/100 96/1/102 +f 250/1/274 341/1/275 144/1/151 +f 146/1/153 250/1/274 144/1/151 +f 337/1/276 339/1/277 152/1/159 +f 339/1/277 153/1/160 152/1/159 +f 340/1/278 147/1/154 143/1/150 +f 251/1/279 147/1/154 340/1/278 +f 252/1/280 138/1/145 140/1/147 +f 253/1/281 138/1/145 252/1/280 +f 254/1/282 56/1/65 142/1/149 +f 57/1/68 56/1/65 254/1/282 +f 57/1/68 68/1/75 56/1/65 +f 72/1/79 68/1/75 57/1/68 +f 68/1/75 58/1/63 56/1/65 +f 80/1/87 76/1/83 57/1/68 +f 62/1/69 82/1/89 57/1/68 +f 82/1/89 84/1/91 57/1/68 +f 84/1/91 80/1/87 57/1/68 +f 76/1/83 72/1/79 57/1/68 +f 74/1/81 78/1/85 62/1/69 +f 78/1/85 82/1/89 62/1/69 +f 68/1/75 66/1/73 58/1/63 +f 67/1/74 74/1/81 62/1/69 +f 70/1/77 74/1/81 67/1/74 +f 255/1/283 256/1/284 105/1/112 +f 95/1/101 255/1/283 105/1/112 +f 257/1/285 266/1/286 261/1/287 +f 265/1/288 266/1/286 257/1/285 +f 256/1/284 110/1/117 105/1/112 +f 258/1/289 110/1/117 256/1/284 +f 259/1/290 110/1/117 258/1/289 +f 260/1/291 110/1/117 259/1/290 +f 11/1/13 261/1/287 1/1/1 +f 257/1/285 110/1/117 260/1/291 +f 11/1/13 262/1/228 261/1/287 +f 262/1/228 257/1/285 261/1/287 +f 262/1/228 110/1/117 257/1/285 +f 109/1/116 255/1/283 95/1/101 +f 109/1/116 263/1/292 255/1/283 +f 109/1/116 264/1/293 263/1/292 +f 109/1/116 265/1/288 264/1/293 +f 266/1/286 10/1/12 9/1/11 +f 242/1/262 10/1/12 266/1/286 +f 265/1/288 109/1/116 266/1/286 +f 109/1/116 242/1/262 266/1/286 +f 267/1/294 268/1/295 145/1/152 +f 141/1/148 267/1/294 145/1/152 +f 282/1/296 273/1/297 270/1/298 +f 269/1/299 273/1/297 282/1/296 +f 270/1/298 271/1/300 272/1/301 +f 270/1/298 273/1/297 271/1/300 +f 272/1/301 274/1/302 279/1/303 +f 271/1/300 274/1/302 272/1/301 +f 275/1/304 118/1/123 127/1/134 +f 275/1/304 276/1/305 118/1/123 +f 268/1/295 148/1/155 145/1/152 +f 131/1/138 275/1/304 127/1/134 +f 131/1/138 277/1/306 275/1/304 +f 131/1/138 278/1/307 277/1/306 +f 131/1/138 279/1/303 278/1/307 +f 131/1/138 270/1/298 279/1/303 +f 270/1/298 272/1/301 279/1/303 +f 280/1/308 148/1/155 268/1/295 +f 281/1/309 148/1/155 280/1/308 +f 282/1/296 148/1/155 281/1/309 +f 148/1/155 282/1/296 270/1/298 +f 131/1/138 148/1/155 270/1/298 +f 149/1/156 267/1/294 141/1/148 +f 276/1/305 132/1/139 118/1/123 +f 283/1/310 132/1/139 276/1/305 +f 284/1/311 132/1/139 283/1/310 +f 285/1/312 132/1/139 284/1/311 +f 274/1/302 132/1/139 285/1/312 +f 271/1/300 132/1/139 274/1/302 +f 273/1/297 132/1/139 271/1/300 +f 149/1/156 286/1/313 267/1/294 +f 149/1/156 287/1/314 286/1/313 +f 149/1/156 288/1/315 287/1/314 +f 149/1/156 269/1/299 288/1/315 +f 149/1/156 132/1/139 273/1/297 +f 269/1/299 149/1/156 273/1/297 +f 351/1/316 344/1/317 289/1/318 +f 344/1/317 290/1/319 289/1/318 +f 92/1/99 348/1/320 353/1/321 +f 91/1/98 210/1/224 92/1/99 +f 210/1/224 348/1/320 92/1/99 +f 210/1/224 207/1/219 348/1/320 +f 88/1/95 90/1/97 347/1/322 +f 342/1/323 88/1/95 347/1/322 +f 88/1/95 87/1/94 90/1/97 +f 291/1/213 88/1/95 342/1/323 +f 190/1/199 162/1/169 189/1/198 +f 190/1/199 164/1/171 162/1/169 +f 191/1/200 164/1/171 190/1/199 +f 191/1/200 165/1/172 164/1/171 +f 192/1/201 165/1/172 191/1/200 +f 192/1/201 166/1/173 165/1/172 +f 193/1/202 166/1/173 192/1/201 +f 193/1/202 167/1/174 166/1/173 +f 183/1/192 167/1/174 193/1/202 +f 183/1/192 163/1/170 167/1/174 +f 299/1/324 175/1/182 248/1/272 +f 299/1/324 177/1/184 175/1/182 +f 301/1/325 177/1/184 299/1/324 +f 301/1/325 178/1/185 177/1/184 +f 304/1/326 178/1/185 301/1/325 +f 304/1/326 179/1/186 178/1/185 +f 306/1/327 179/1/186 304/1/326 +f 309/1/328 179/1/186 306/1/327 +f 309/1/328 180/1/187 179/1/186 +f 181/1/188 180/1/187 309/1/328 +f 312/1/329 181/1/188 309/1/328 +f 176/1/183 181/1/188 312/1/329 +f 295/1/190 176/1/183 312/1/329 +f 135/1/142 155/1/162 154/1/161 +f 185/1/194 155/1/162 135/1/142 +f 185/1/194 156/1/163 155/1/162 +f 184/1/193 156/1/163 185/1/194 +f 184/1/193 157/1/164 156/1/163 +f 186/1/195 157/1/164 184/1/193 +f 186/1/195 158/1/165 157/1/164 +f 187/1/196 158/1/165 186/1/195 +f 187/1/196 159/1/166 158/1/165 +f 188/1/197 159/1/166 187/1/196 +f 188/1/197 160/1/167 159/1/166 +f 316/1/229 168/1/175 113/1/120 +f 317/1/330 168/1/175 316/1/229 +f 319/1/331 168/1/175 317/1/330 +f 319/1/331 169/1/176 168/1/175 +f 321/1/332 169/1/176 319/1/331 +f 321/1/332 170/1/177 169/1/176 +f 322/1/333 170/1/177 321/1/332 +f 322/1/333 171/1/178 170/1/177 +f 326/1/334 171/1/178 322/1/333 +f 327/1/335 171/1/178 326/1/334 +f 327/1/335 172/1/179 171/1/178 +f 330/1/336 172/1/179 327/1/335 +f 330/1/336 173/1/180 172/1/179 +f 333/1/337 173/1/180 330/1/336 +f 249/1/273 173/1/180 333/1/337 +f 8/1/10 292/1/338 15/1/18 +f 293/1/189 292/1/338 8/1/10 +f 293/1/189 294/1/339 292/1/338 +f 293/1/189 295/1/190 294/1/339 +f 298/1/340 297/1/341 296/1/342 +f 298/1/340 299/1/324 297/1/341 +f 299/1/324 248/1/272 297/1/341 +f 16/1/19 296/1/342 7/1/9 +f 16/1/19 300/1/343 296/1/342 +f 300/1/343 298/1/340 296/1/342 +f 300/1/343 299/1/324 298/1/340 +f 300/1/343 301/1/325 299/1/324 +f 303/1/344 300/1/343 16/1/19 +f 303/1/344 301/1/325 300/1/343 +f 302/1/345 303/1/344 16/1/19 +f 304/1/326 301/1/325 303/1/344 +f 17/1/20 302/1/345 16/1/19 +f 17/1/20 305/1/346 302/1/345 +f 305/1/346 303/1/344 302/1/345 +f 305/1/346 304/1/326 303/1/344 +f 306/1/327 304/1/326 305/1/346 +f 307/1/347 305/1/346 17/1/20 +f 307/1/347 308/1/348 305/1/346 +f 308/1/348 306/1/327 305/1/346 +f 308/1/348 309/1/328 306/1/327 +f 15/1/18 307/1/347 17/1/20 +f 15/1/18 310/1/349 307/1/347 +f 310/1/349 308/1/348 307/1/347 +f 310/1/349 311/1/350 308/1/348 +f 311/1/350 309/1/328 308/1/348 +f 292/1/338 310/1/349 15/1/18 +f 311/1/350 312/1/329 309/1/328 +f 292/1/338 294/1/339 310/1/349 +f 294/1/339 311/1/350 310/1/349 +f 294/1/339 312/1/329 311/1/350 +f 294/1/339 295/1/190 312/1/329 +f 313/1/351 297/1/341 249/1/273 +f 297/1/341 248/1/272 249/1/273 +f 7/1/9 296/1/342 331/1/8 +f 296/1/342 332/1/352 331/1/8 +f 296/1/342 313/1/351 332/1/352 +f 296/1/342 297/1/341 313/1/351 +f 5/1/5 314/1/353 4/1/4 +f 314/1/353 315/1/354 4/1/4 +f 314/1/353 317/1/330 315/1/354 +f 317/1/330 316/1/229 315/1/354 +f 318/1/355 317/1/330 314/1/353 +f 5/1/5 318/1/355 314/1/353 +f 318/1/355 319/1/331 317/1/330 +f 5/1/5 320/1/356 318/1/355 +f 321/1/332 319/1/331 318/1/355 +f 320/1/356 321/1/332 318/1/355 +f 6/1/6 320/1/356 5/1/5 +f 322/1/333 321/1/332 320/1/356 +f 323/1/357 320/1/356 6/1/6 +f 323/1/357 322/1/333 320/1/356 +f 324/1/7 325/1/358 6/1/6 +f 325/1/358 323/1/357 6/1/6 +f 325/1/358 326/1/334 323/1/357 +f 326/1/334 322/1/333 323/1/357 +f 327/1/335 326/1/334 325/1/358 +f 328/1/359 325/1/358 324/1/7 +f 328/1/359 329/1/360 325/1/358 +f 329/1/360 327/1/335 325/1/358 +f 329/1/360 330/1/336 327/1/335 +f 331/1/8 328/1/359 324/1/7 +f 331/1/8 332/1/352 328/1/359 +f 332/1/352 329/1/360 328/1/359 +f 332/1/352 333/1/337 329/1/360 +f 333/1/337 330/1/336 329/1/360 +f 313/1/351 333/1/337 332/1/352 +f 313/1/351 249/1/273 333/1/337 +f 315/1/354 11/1/13 4/1/4 +f 262/1/228 11/1/13 315/1/354 +f 316/1/229 262/1/228 315/1/354 +f 242/1/262 214/1/17 10/1/12 +f 242/1/262 218/1/233 214/1/17 +f 2/1/2 28/1/31 24/1/26 +f 2/1/2 12/1/14 28/1/31 +f 12/1/14 27/1/30 28/1/31 +f 12/1/14 13/1/15 27/1/30 +f 13/1/15 26/1/29 27/1/30 +f 13/1/15 14/1/16 26/1/29 +f 14/1/16 25/1/28 26/1/29 +f 214/1/17 25/1/28 14/1/16 +f 286/1/313 280/1/308 268/1/295 +f 267/1/294 286/1/313 268/1/295 +f 286/1/313 287/1/314 280/1/308 +f 287/1/314 281/1/309 280/1/308 +f 287/1/314 288/1/315 281/1/309 +f 288/1/315 282/1/296 281/1/309 +f 288/1/315 269/1/299 282/1/296 +f 275/1/304 283/1/310 276/1/305 +f 277/1/306 283/1/310 275/1/304 +f 277/1/306 284/1/311 283/1/310 +f 278/1/307 284/1/311 277/1/306 +f 278/1/307 285/1/312 284/1/311 +f 279/1/303 285/1/312 278/1/307 +f 279/1/303 274/1/302 285/1/312 +f 263/1/292 258/1/289 256/1/284 +f 255/1/283 263/1/292 256/1/284 +f 263/1/292 259/1/290 258/1/289 +f 263/1/292 264/1/293 259/1/290 +f 264/1/293 260/1/291 259/1/290 +f 264/1/293 265/1/288 260/1/291 +f 265/1/288 257/1/285 260/1/291 +f 351/1/316 345/1/361 344/1/317 +f 352/1/362 345/1/361 351/1/316 +f 334/1/363 345/1/361 352/1/362 +f 335/1/364 345/1/361 334/1/363 +f 205/1/204 335/1/364 334/1/363 +f 194/1/203 335/1/364 205/1/204 +f 336/1/365 150/1/157 147/1/154 +f 251/1/279 336/1/365 147/1/154 +f 337/1/276 152/1/159 150/1/157 +f 336/1/365 337/1/276 150/1/157 +f 151/1/158 250/1/274 146/1/153 +f 151/1/158 338/1/366 250/1/274 +f 153/1/160 338/1/366 151/1/158 +f 153/1/160 339/1/277 338/1/366 +f 253/1/281 143/1/150 138/1/145 +f 253/1/281 340/1/278 143/1/150 +f 117/1/130 100/1/105 93/1/107 +f 117/1/130 123/1/129 100/1/105 +f 123/1/129 103/1/110 100/1/105 +f 126/1/133 133/1/140 104/1/111 +f 133/1/140 111/1/118 104/1/111 +f 133/1/140 136/1/143 111/1/118 +f 136/1/143 114/1/121 111/1/118 +f 112/1/119 128/1/135 106/1/113 +f 112/1/119 134/1/141 128/1/135 +f 115/1/122 134/1/141 112/1/119 +f 115/1/122 137/1/144 134/1/141 +f 98/1/103 120/1/125 96/1/102 +f 98/1/103 121/1/126 120/1/125 +f 101/1/108 121/1/126 98/1/103 +f 101/1/108 125/1/132 121/1/126 +f 119/1/124 99/1/104 97/1/100 +f 119/1/124 122/1/127 99/1/104 +f 122/1/127 124/1/131 99/1/104 +f 124/1/131 102/1/109 99/1/104 +f 124/1/131 129/1/136 102/1/109 +f 129/1/136 107/1/114 102/1/109 +f 142/1/149 341/1/275 254/1/282 +f 144/1/151 341/1/275 142/1/149 +f 201/1/214 225/1/243 202/1/205 +f 233/1/253 225/1/243 201/1/214 +f 211/1/223 233/1/253 201/1/214 +f 236/1/256 233/1/253 211/1/223 +f 222/1/240 241/1/261 243/1/260 +f 224/1/242 222/1/240 243/1/260 +f 222/1/240 223/1/239 241/1/261 +f 223/1/239 244/1/263 241/1/261 +f 223/1/239 235/1/255 244/1/263 +f 239/1/238 236/1/256 209/1/225 +f 236/1/256 211/1/223 209/1/225 +f 237/1/257 245/1/236 244/1/263 +f 237/1/257 221/1/237 245/1/236 +f 235/1/255 237/1/257 244/1/263 +f 1/1/1 266/1/286 9/1/11 +f 261/1/287 266/1/286 1/1/1 +f 345/1/361 343/1/367 344/1/317 +f 345/1/361 346/1/368 343/1/367 +f 346/1/368 342/1/323 343/1/367 +f 346/1/368 291/1/213 342/1/323 +f 335/1/364 346/1/368 345/1/361 +f 346/1/368 199/1/212 291/1/213 +f 335/1/364 194/1/203 346/1/368 +f 194/1/203 199/1/212 346/1/368 +f 344/1/317 343/1/367 290/1/319 +f 343/1/367 347/1/322 290/1/319 +f 343/1/367 342/1/323 347/1/322 +f 352/1/362 351/1/316 350/1/369 +f 349/1/370 352/1/362 350/1/369 +f 207/1/219 352/1/362 349/1/370 +f 348/1/320 207/1/219 349/1/370 +f 352/1/362 205/1/204 334/1/363 +f 207/1/219 205/1/204 352/1/362 +f 350/1/369 351/1/316 289/1/318 +f 349/1/370 350/1/369 289/1/318 +f 353/1/321 349/1/370 289/1/318 +f 348/1/320 349/1/370 353/1/321 +f 354/1/371 89/1/96 355/1/372 +f 240/1/259 89/1/96 354/1/371 +f 358/1/373 359/1/124 360/1/125 +f 361/1/126 358/1/373 360/1/125 +f 358/1/373 362/1/127 359/1/124 +f 356/1/374 363/1/129 357/1/130 +f 358/1/373 364/1/131 362/1/127 +f 365/1/132 358/1/373 361/1/126 +f 356/1/374 366/1/375 363/1/129 +f 367/1/376 358/1/373 365/1/132 +f 368/1/135 367/1/376 365/1/132 +f 358/1/373 369/1/136 364/1/131 +f 358/1/373 370/1/377 369/1/136 +f 368/1/135 371/1/378 367/1/376 +f 372/1/379 370/1/377 358/1/373 +f 356/1/374 373/1/380 366/1/375 +f 374/1/141 371/1/378 368/1/135 +f 375/1/381 376/1/382 373/1/380 +f 356/1/374 375/1/381 373/1/380 +f 377/1/383 371/1/378 374/1/141 +f 375/1/381 377/1/383 376/1/382 +f 375/1/381 371/1/378 377/1/383 +f 382/1/100 380/1/384 381/1/385 +f 380/1/384 383/1/103 381/1/385 +f 384/1/104 380/1/384 382/1/100 +f 385/1/105 379/1/386 378/1/387 +f 380/1/384 386/1/108 383/1/103 +f 387/1/109 380/1/384 384/1/104 +f 388/1/110 379/1/386 385/1/105 +f 389/1/111 379/1/386 388/1/110 +f 390/1/388 391/1/389 386/1/108 +f 380/1/384 390/1/388 386/1/108 +f 392/1/390 380/1/384 387/1/109 +f 197/1/209 196/1/207 392/1/390 +f 196/1/207 380/1/384 392/1/390 +f 393/1/391 391/1/389 390/1/388 +f 394/1/392 379/1/386 389/1/111 +f 393/1/391 395/1/393 391/1/389 +f 396/1/394 379/1/386 394/1/392 +f 397/1/395 396/1/394 394/1/392 +f 393/1/391 398/1/122 395/1/393 +f 393/1/391 396/1/394 397/1/395 +f 398/1/122 393/1/391 397/1/395 +f 399/1/396 253/1/281 252/1/280 +f 400/1/397 57/1/68 254/1/282 +f 341/1/275 400/1/397 254/1/282 +f 399/1/396 340/1/278 253/1/281 +f 401/1/398 400/1/397 341/1/275 +f 250/1/274 401/1/398 341/1/275 +f 399/1/396 251/1/279 340/1/278 +f 250/1/274 402/1/399 401/1/398 +f 195/1/206 57/1/68 400/1/397 +f 399/1/396 336/1/365 251/1/279 +f 338/1/366 402/1/399 250/1/274 +f 195/1/206 60/1/66 57/1/68 +f 399/1/396 337/1/276 336/1/365 +f 339/1/277 402/1/399 338/1/366 +f 399/1/396 403/1/400 337/1/276 +f 403/1/400 339/1/277 337/1/276 +f 403/1/400 402/1/399 339/1/277 +f 404/1/401 405/1/402 399/1/396 +f 405/1/402 403/1/400 399/1/396 +f 406/1/403 404/1/401 399/1/396 +f 407/1/404 406/1/403 399/1/396 +f 408/1/405 407/1/404 399/1/396 +f 409/1/406 408/1/405 399/1/396 +f 410/1/407 409/1/406 399/1/396 +f 410/1/407 411/1/408 409/1/406 +f 411/1/408 412/1/409 409/1/406 +f 411/1/408 413/1/410 412/1/409 +f 411/1/408 414/1/411 413/1/410 +f 411/1/408 415/1/412 414/1/411 +f 416/1/413 375/1/381 356/1/374 +f 417/1/414 416/1/413 356/1/374 +f 418/1/415 417/1/414 356/1/374 +f 419/1/416 420/1/417 356/1/374 +f 420/1/417 418/1/415 356/1/374 +f 421/1/418 419/1/416 356/1/374 +f 422/1/419 421/1/418 356/1/374 +f 423/1/420 422/1/419 356/1/374 +f 423/1/420 424/1/421 422/1/419 +f 424/1/421 425/1/422 422/1/419 +f 424/1/421 426/1/423 425/1/422 +f 424/1/421 427/1/424 426/1/423 +f 424/1/421 428/1/425 427/1/424 +f 498/1/426 499/1/427 423/1/420 +f 499/1/427 424/1/421 423/1/420 +f 429/1/428 430/1/429 410/1/407 +f 430/1/429 411/1/408 410/1/407 +f 396/1/394 431/1/430 379/1/386 +f 431/1/430 432/1/431 379/1/386 +f 432/1/431 433/1/432 379/1/386 +f 433/1/432 434/1/433 379/1/386 +f 434/1/433 435/1/434 379/1/386 +f 435/1/434 436/1/435 379/1/386 +f 436/1/435 429/1/428 379/1/386 +f 437/1/169 429/1/428 436/1/435 +f 430/1/429 429/1/428 437/1/169 +f 438/1/436 430/1/429 437/1/169 +f 439/1/437 430/1/429 438/1/436 +f 440/1/438 430/1/429 439/1/437 +f 441/1/174 430/1/429 440/1/438 +f 393/1/391 402/1/399 403/1/400 +f 396/1/394 393/1/391 403/1/400 +f 525/1/439 371/1/378 375/1/381 +f 442/1/440 371/1/378 525/1/439 +f 409/1/406 436/1/435 408/1/405 +f 409/1/406 437/1/169 436/1/435 +f 52/1/59 443/1/441 43/1/47 +f 443/1/441 444/1/442 43/1/47 +f 444/1/442 445/1/443 43/1/47 +f 445/1/443 446/1/444 43/1/47 +f 445/1/443 447/1/445 446/1/444 +f 447/1/445 448/1/246 446/1/444 +f 446/1/444 238/1/258 449/1/446 +f 448/1/246 238/1/258 446/1/444 +f 213/1/226 240/1/259 212/1/227 +f 232/1/251 240/1/259 213/1/226 +f 452/1/447 370/1/377 372/1/379 +f 450/1/448 452/1/447 372/1/379 +f 451/1/449 452/1/447 450/1/448 +f 453/1/450 451/1/449 450/1/448 +f 446/1/444 453/1/450 450/1/448 +f 446/1/444 449/1/446 453/1/450 +f 449/1/446 454/1/451 453/1/450 +f 50/1/57 31/1/34 46/1/54 +f 31/1/34 33/1/36 46/1/54 +f 422/1/419 455/1/452 421/1/418 +f 455/1/452 456/1/453 421/1/418 +f 197/1/209 229/1/249 198/1/210 +f 370/1/377 229/1/249 197/1/209 +f 452/1/447 227/1/247 370/1/377 +f 227/1/247 229/1/249 370/1/377 +f 370/1/377 197/1/209 392/1/390 +f 369/1/136 370/1/377 392/1/390 +f 356/1/374 378/1/387 379/1/386 +f 357/1/130 378/1/387 356/1/374 +f 366/1/375 389/1/111 388/1/110 +f 363/1/129 366/1/375 388/1/110 +f 377/1/383 398/1/122 397/1/395 +f 376/1/382 377/1/383 397/1/395 +f 391/1/389 365/1/132 386/1/108 +f 391/1/389 368/1/135 365/1/132 +f 359/1/124 382/1/100 381/1/385 +f 360/1/125 359/1/124 381/1/385 +f 457/1/454 358/1/373 367/1/376 +f 457/1/454 458/1/455 358/1/373 +f 463/1/456 459/1/457 462/1/458 +f 468/1/459 459/1/457 463/1/456 +f 371/1/378 457/1/454 367/1/376 +f 371/1/378 460/1/460 457/1/454 +f 371/1/378 461/1/461 460/1/460 +f 371/1/378 462/1/458 461/1/461 +f 463/1/456 464/1/44 32/1/35 +f 442/1/440 464/1/44 463/1/456 +f 371/1/378 463/1/456 462/1/458 +f 371/1/378 442/1/440 463/1/456 +f 458/1/455 372/1/379 358/1/373 +f 465/1/462 372/1/379 458/1/455 +f 466/1/463 372/1/379 465/1/462 +f 467/1/464 372/1/379 466/1/463 +f 40/1/43 468/1/459 39/1/42 +f 459/1/457 372/1/379 467/1/464 +f 40/1/43 469/1/465 468/1/459 +f 450/1/448 372/1/379 459/1/457 +f 468/1/459 450/1/448 459/1/457 +f 469/1/465 450/1/448 468/1/459 +f 470/1/466 400/1/397 401/1/398 +f 470/1/466 471/1/467 400/1/397 +f 476/1/468 491/1/469 472/1/470 +f 474/1/471 491/1/469 476/1/468 +f 473/1/472 474/1/471 475/1/473 +f 474/1/471 476/1/468 475/1/473 +f 477/1/474 473/1/472 475/1/473 +f 488/1/475 473/1/472 477/1/474 +f 380/1/384 478/1/476 390/1/388 +f 478/1/476 479/1/477 390/1/388 +f 402/1/399 470/1/466 401/1/398 +f 479/1/477 393/1/391 390/1/388 +f 480/1/478 393/1/391 479/1/477 +f 481/1/479 393/1/391 480/1/478 +f 482/1/480 393/1/391 481/1/479 +f 477/1/474 393/1/391 482/1/480 +f 393/1/391 477/1/474 475/1/473 +f 476/1/468 393/1/391 475/1/473 +f 402/1/399 483/1/481 470/1/466 +f 402/1/399 484/1/482 483/1/481 +f 402/1/399 485/1/483 484/1/482 +f 402/1/399 472/1/470 485/1/483 +f 402/1/399 476/1/468 472/1/470 +f 402/1/399 393/1/391 476/1/468 +f 471/1/467 195/1/206 400/1/397 +f 196/1/207 478/1/476 380/1/384 +f 196/1/207 486/1/484 478/1/476 +f 196/1/207 487/1/485 486/1/484 +f 196/1/207 488/1/475 487/1/485 +f 196/1/207 474/1/471 488/1/475 +f 474/1/471 473/1/472 488/1/475 +f 489/1/486 195/1/206 471/1/467 +f 490/1/487 195/1/206 489/1/486 +f 491/1/469 195/1/206 490/1/487 +f 474/1/471 195/1/206 491/1/469 +f 196/1/207 195/1/206 474/1/471 +f 547/1/488 554/1/489 492/1/490 +f 554/1/489 493/1/491 492/1/490 +f 212/1/227 354/1/371 559/1/492 +f 552/1/221 212/1/227 559/1/492 +f 212/1/227 240/1/259 354/1/371 +f 355/1/372 544/1/493 550/1/494 +f 89/1/96 86/1/93 355/1/372 +f 86/1/93 544/1/493 355/1/372 +f 86/1/93 206/1/218 544/1/493 +f 412/1/409 437/1/169 409/1/406 +f 412/1/409 438/1/436 437/1/169 +f 413/1/410 438/1/436 412/1/409 +f 413/1/410 439/1/437 438/1/436 +f 414/1/411 439/1/437 413/1/410 +f 414/1/411 440/1/438 439/1/437 +f 415/1/412 440/1/438 414/1/411 +f 415/1/412 441/1/174 440/1/438 +f 411/1/408 441/1/174 415/1/412 +f 411/1/408 430/1/429 441/1/174 +f 422/1/419 494/1/495 455/1/452 +f 425/1/422 494/1/495 422/1/419 +f 425/1/422 506/1/496 494/1/495 +f 426/1/423 506/1/496 425/1/422 +f 426/1/423 507/1/497 506/1/496 +f 426/1/423 510/1/498 507/1/497 +f 427/1/424 510/1/498 426/1/423 +f 427/1/424 512/1/499 510/1/498 +f 427/1/424 515/1/500 512/1/499 +f 428/1/425 515/1/500 427/1/424 +f 428/1/425 518/1/501 515/1/500 +f 424/1/421 518/1/501 428/1/425 +f 424/1/421 499/1/427 518/1/501 +f 403/1/400 431/1/430 396/1/394 +f 405/1/402 431/1/430 403/1/400 +f 405/1/402 432/1/431 431/1/430 +f 404/1/401 432/1/431 405/1/402 +f 404/1/401 433/1/432 432/1/431 +f 406/1/403 433/1/432 404/1/401 +f 406/1/403 434/1/433 433/1/432 +f 407/1/404 434/1/433 406/1/403 +f 407/1/404 435/1/434 434/1/433 +f 408/1/405 435/1/434 407/1/404 +f 408/1/405 436/1/435 435/1/434 +f 416/1/413 525/1/439 375/1/381 +f 416/1/413 526/1/502 525/1/439 +f 416/1/413 527/1/503 526/1/502 +f 417/1/414 527/1/503 416/1/413 +f 417/1/414 529/1/504 527/1/503 +f 417/1/414 532/1/505 529/1/504 +f 418/1/415 532/1/505 417/1/414 +f 418/1/415 534/1/506 532/1/505 +f 420/1/417 534/1/506 418/1/415 +f 420/1/417 536/1/507 534/1/506 +f 420/1/417 538/1/508 536/1/507 +f 419/1/416 538/1/508 420/1/417 +f 419/1/416 540/1/509 538/1/508 +f 421/1/418 540/1/509 419/1/416 +f 421/1/418 456/1/453 540/1/509 +f 495/1/510 38/1/41 516/1/49 +f 495/1/510 496/1/511 38/1/41 +f 497/1/512 496/1/511 495/1/510 +f 497/1/512 498/1/426 496/1/511 +f 499/1/427 498/1/426 497/1/512 +f 502/1/513 500/1/48 501/1/514 +f 455/1/452 502/1/513 501/1/514 +f 503/1/515 502/1/513 455/1/452 +f 494/1/495 503/1/515 455/1/452 +f 502/1/513 504/1/50 500/1/48 +f 505/1/516 504/1/50 502/1/513 +f 503/1/515 505/1/516 502/1/513 +f 506/1/496 505/1/516 503/1/515 +f 494/1/495 506/1/496 503/1/515 +f 507/1/497 505/1/516 506/1/496 +f 508/1/517 44/1/51 504/1/50 +f 505/1/516 508/1/517 504/1/50 +f 509/1/518 508/1/517 505/1/516 +f 507/1/497 509/1/518 505/1/516 +f 510/1/498 509/1/518 507/1/497 +f 511/1/519 44/1/51 508/1/517 +f 509/1/518 511/1/519 508/1/517 +f 512/1/499 511/1/519 509/1/518 +f 510/1/498 512/1/499 509/1/518 +f 513/1/520 511/1/519 512/1/499 +f 511/1/519 514/1/521 44/1/51 +f 514/1/521 516/1/49 44/1/51 +f 513/1/520 514/1/521 511/1/519 +f 515/1/500 513/1/520 512/1/499 +f 517/1/522 514/1/521 513/1/520 +f 515/1/500 517/1/522 513/1/520 +f 517/1/522 516/1/49 514/1/521 +f 517/1/522 495/1/510 516/1/49 +f 515/1/500 518/1/501 517/1/522 +f 497/1/512 495/1/510 517/1/522 +f 518/1/501 497/1/512 517/1/522 +f 499/1/427 497/1/512 518/1/501 +f 501/1/514 500/1/48 37/1/40 +f 455/1/452 519/1/523 456/1/453 +f 520/1/524 501/1/514 37/1/40 +f 455/1/452 520/1/524 519/1/523 +f 455/1/452 501/1/514 520/1/524 +f 522/1/525 34/1/37 521/1/526 +f 523/1/527 522/1/525 521/1/526 +f 524/1/528 35/1/38 34/1/37 +f 522/1/525 524/1/528 34/1/37 +f 526/1/502 522/1/525 523/1/527 +f 525/1/439 526/1/502 523/1/527 +f 526/1/502 527/1/503 522/1/525 +f 528/1/529 524/1/528 522/1/525 +f 527/1/503 528/1/529 522/1/525 +f 529/1/504 528/1/529 527/1/503 +f 530/1/530 35/1/38 524/1/528 +f 528/1/529 530/1/530 524/1/528 +f 531/1/531 530/1/530 528/1/529 +f 529/1/504 531/1/531 528/1/529 +f 532/1/505 531/1/531 529/1/504 +f 533/1/532 35/1/38 530/1/530 +f 531/1/531 533/1/532 530/1/530 +f 533/1/532 36/1/39 35/1/38 +f 534/1/506 533/1/532 531/1/531 +f 532/1/505 534/1/506 531/1/531 +f 535/1/533 36/1/39 533/1/532 +f 534/1/506 535/1/533 533/1/532 +f 536/1/507 535/1/533 534/1/506 +f 537/1/534 535/1/533 536/1/507 +f 538/1/508 537/1/534 536/1/507 +f 535/1/533 37/1/40 36/1/39 +f 539/1/535 37/1/40 535/1/533 +f 537/1/534 539/1/535 535/1/533 +f 537/1/534 540/1/509 539/1/535 +f 538/1/508 540/1/509 537/1/534 +f 520/1/524 37/1/40 539/1/535 +f 540/1/509 520/1/524 539/1/535 +f 519/1/523 520/1/524 540/1/509 +f 456/1/453 519/1/523 540/1/509 +f 464/1/44 521/1/526 34/1/37 +f 442/1/440 523/1/527 464/1/44 +f 523/1/527 521/1/526 464/1/44 +f 442/1/440 525/1/439 523/1/527 +f 43/1/47 469/1/465 40/1/43 +f 43/1/47 446/1/444 469/1/465 +f 446/1/444 450/1/448 469/1/465 +f 50/1/57 41/1/45 31/1/34 +f 50/1/57 54/1/61 41/1/45 +f 54/1/61 53/1/60 41/1/45 +f 53/1/60 42/1/46 41/1/45 +f 53/1/60 52/1/59 42/1/46 +f 52/1/59 43/1/47 42/1/46 +f 483/1/481 471/1/467 470/1/466 +f 483/1/481 489/1/486 471/1/467 +f 484/1/482 489/1/486 483/1/481 +f 484/1/482 490/1/487 489/1/486 +f 485/1/483 490/1/487 484/1/482 +f 485/1/483 491/1/469 490/1/487 +f 472/1/470 491/1/469 485/1/483 +f 478/1/476 480/1/478 479/1/477 +f 478/1/476 486/1/484 480/1/478 +f 486/1/484 481/1/479 480/1/478 +f 486/1/484 487/1/485 481/1/479 +f 487/1/485 482/1/480 481/1/479 +f 487/1/485 488/1/475 482/1/480 +f 488/1/475 477/1/474 482/1/480 +f 460/1/460 458/1/455 457/1/454 +f 460/1/460 465/1/462 458/1/455 +f 460/1/460 466/1/463 465/1/462 +f 461/1/461 466/1/463 460/1/460 +f 461/1/461 467/1/464 466/1/463 +f 462/1/458 467/1/464 461/1/461 +f 462/1/458 459/1/457 467/1/464 +f 541/1/536 554/1/489 547/1/488 +f 541/1/536 542/1/537 554/1/489 +f 541/1/536 543/1/538 542/1/537 +f 543/1/538 557/1/211 542/1/537 +f 200/1/208 557/1/211 543/1/538 +f 357/1/130 385/1/105 378/1/387 +f 357/1/130 363/1/129 385/1/105 +f 363/1/129 388/1/110 385/1/105 +f 373/1/380 394/1/392 389/1/111 +f 366/1/375 373/1/380 389/1/111 +f 376/1/382 397/1/395 394/1/392 +f 373/1/380 376/1/382 394/1/392 +f 395/1/393 368/1/135 391/1/389 +f 395/1/393 374/1/141 368/1/135 +f 398/1/122 374/1/141 395/1/393 +f 398/1/122 377/1/383 374/1/141 +f 383/1/103 360/1/125 381/1/385 +f 383/1/103 361/1/126 360/1/125 +f 386/1/108 361/1/126 383/1/103 +f 386/1/108 365/1/132 361/1/126 +f 359/1/124 384/1/104 382/1/100 +f 359/1/124 362/1/127 384/1/104 +f 364/1/131 387/1/109 384/1/104 +f 362/1/127 364/1/131 384/1/104 +f 369/1/136 392/1/390 387/1/109 +f 364/1/131 369/1/136 387/1/109 +f 228/1/248 203/1/215 198/1/210 +f 229/1/249 228/1/248 198/1/210 +f 228/1/248 204/1/216 203/1/215 +f 228/1/248 230/1/250 204/1/216 +f 230/1/250 208/1/222 204/1/216 +f 230/1/250 231/1/252 208/1/222 +f 451/1/449 227/1/247 452/1/447 +f 226/1/245 227/1/247 451/1/449 +f 453/1/450 226/1/245 451/1/449 +f 234/1/254 226/1/245 453/1/450 +f 208/1/222 231/1/252 213/1/226 +f 231/1/252 232/1/251 213/1/226 +f 238/1/258 454/1/451 449/1/446 +f 238/1/258 234/1/254 454/1/451 +f 234/1/254 453/1/450 454/1/451 +f 39/1/42 468/1/459 32/1/35 +f 468/1/459 463/1/456 32/1/35 +f 548/1/539 547/1/488 546/1/540 +f 548/1/539 541/1/536 547/1/488 +f 546/1/540 549/1/541 548/1/539 +f 545/1/542 549/1/541 546/1/540 +f 544/1/493 206/1/218 545/1/542 +f 549/1/541 541/1/536 548/1/539 +f 545/1/542 206/1/218 549/1/541 +f 549/1/541 206/1/218 541/1/536 +f 200/1/208 543/1/538 541/1/536 +f 206/1/218 200/1/208 541/1/536 +f 546/1/540 547/1/488 492/1/490 +f 550/1/494 546/1/540 492/1/490 +f 545/1/542 546/1/540 550/1/494 +f 544/1/493 545/1/542 550/1/494 +f 542/1/537 553/1/543 554/1/489 +f 555/1/220 551/1/544 553/1/543 +f 555/1/220 552/1/221 551/1/544 +f 542/1/537 556/1/217 553/1/543 +f 556/1/217 555/1/220 553/1/543 +f 557/1/211 556/1/217 542/1/537 +f 554/1/489 558/1/545 493/1/491 +f 554/1/489 553/1/543 558/1/545 +f 553/1/543 551/1/544 558/1/545 +f 551/1/544 559/1/492 558/1/545 +f 551/1/544 552/1/221 559/1/492 +f 589/1/244 560/1/546 690/1/241 +f 607/1/547 560/1/546 589/1/244 +f 607/1/547 561/1/548 560/1/546 +f 562/1/549 561/1/548 607/1/547 +f 563/1/550 564/1/551 562/1/549 +f 564/1/551 561/1/548 562/1/549 +f 565/1/552 564/1/551 563/1/550 +f 566/1/553 564/1/551 565/1/552 +f 567/1/554 566/1/553 565/1/552 +f 720/1/555 566/1/553 567/1/554 +f 247/1/266 720/1/555 567/1/554 +f 568/1/264 247/1/266 567/1/554 +f 569/1/556 246/1/265 626/1/267 +f 570/1/557 246/1/265 569/1/556 +f 571/1/558 570/1/557 569/1/556 +f 642/1/559 572/1/560 571/1/558 +f 572/1/560 570/1/557 571/1/558 +f 573/1/561 572/1/560 642/1/559 +f 573/1/561 574/1/562 572/1/560 +f 575/1/563 574/1/562 573/1/561 +f 575/1/563 755/1/564 574/1/562 +f 657/1/565 755/1/564 575/1/563 +f 576/1/566 755/1/564 657/1/565 +f 576/1/566 763/1/567 755/1/564 +f 769/1/568 763/1/567 576/1/566 +f 577/1/569 769/1/568 576/1/566 +f 578/1/570 769/1/568 577/1/569 +f 675/1/571 578/1/570 577/1/569 +f 579/1/572 578/1/570 675/1/571 +f 580/1/573 579/1/572 675/1/571 +f 581/1/268 579/1/572 580/1/573 +f 582/1/269 581/1/268 580/1/573 +f 48/1/55 443/1/441 52/1/59 +f 583/1/574 443/1/441 48/1/55 +f 584/1/575 443/1/441 583/1/574 +f 584/1/575 444/1/442 443/1/441 +f 585/1/576 444/1/442 584/1/575 +f 585/1/576 445/1/443 444/1/442 +f 586/1/577 445/1/443 585/1/576 +f 587/1/578 445/1/443 586/1/577 +f 587/1/578 447/1/445 445/1/443 +f 588/1/579 447/1/445 587/1/578 +f 588/1/579 448/1/246 447/1/445 +f 589/1/244 448/1/246 588/1/579 +f 45/1/53 583/1/574 48/1/55 +f 591/1/580 583/1/574 45/1/53 +f 590/1/581 584/1/575 583/1/574 +f 591/1/580 590/1/581 583/1/574 +f 592/1/582 590/1/581 591/1/580 +f 590/1/581 585/1/576 584/1/575 +f 593/1/583 585/1/576 590/1/581 +f 592/1/582 593/1/583 590/1/581 +f 594/1/584 593/1/583 592/1/582 +f 593/1/583 586/1/577 585/1/576 +f 595/1/585 592/1/582 591/1/580 +f 596/1/586 586/1/577 593/1/583 +f 598/1/587 591/1/580 45/1/53 +f 597/1/588 595/1/585 591/1/580 +f 594/1/584 596/1/586 593/1/583 +f 599/1/589 596/1/586 594/1/584 +f 595/1/585 600/1/590 592/1/582 +f 600/1/590 594/1/584 592/1/582 +f 598/1/587 597/1/588 591/1/580 +f 596/1/586 587/1/578 586/1/577 +f 601/1/591 587/1/578 596/1/586 +f 47/1/52 598/1/587 45/1/53 +f 599/1/589 601/1/591 596/1/586 +f 600/1/590 599/1/589 594/1/584 +f 602/1/592 599/1/589 600/1/590 +f 601/1/591 588/1/579 587/1/578 +f 603/1/593 588/1/579 601/1/591 +f 604/1/594 601/1/591 599/1/589 +f 597/1/588 605/1/595 595/1/585 +f 605/1/595 600/1/590 595/1/585 +f 604/1/594 603/1/593 601/1/591 +f 603/1/593 589/1/244 588/1/579 +f 607/1/547 589/1/244 603/1/593 +f 606/1/596 599/1/589 602/1/592 +f 607/1/547 603/1/593 604/1/594 +f 605/1/595 602/1/592 600/1/590 +f 606/1/596 604/1/594 599/1/589 +f 608/1/597 607/1/547 604/1/594 +f 598/1/587 609/1/598 597/1/588 +f 606/1/596 608/1/597 604/1/594 +f 610/1/599 602/1/592 605/1/595 +f 608/1/597 562/1/549 607/1/547 +f 611/1/600 609/1/598 598/1/587 +f 610/1/599 606/1/596 602/1/592 +f 606/1/596 612/1/601 608/1/597 +f 609/1/598 613/1/602 597/1/588 +f 613/1/602 605/1/595 597/1/588 +f 610/1/599 614/1/603 606/1/596 +f 608/1/597 563/1/550 562/1/549 +f 612/1/601 563/1/550 608/1/597 +f 614/1/603 612/1/601 606/1/596 +f 613/1/602 615/1/604 605/1/595 +f 615/1/604 610/1/599 605/1/595 +f 614/1/603 616/1/605 612/1/601 +f 616/1/605 563/1/550 612/1/601 +f 616/1/605 565/1/552 563/1/550 +f 47/1/52 611/1/600 598/1/587 +f 615/1/604 617/1/606 610/1/599 +f 617/1/606 614/1/603 610/1/599 +f 617/1/606 618/1/607 614/1/603 +f 618/1/607 616/1/605 614/1/603 +f 618/1/607 619/1/608 616/1/605 +f 619/1/608 565/1/552 616/1/605 +f 619/1/608 567/1/554 565/1/552 +f 613/1/602 620/1/609 615/1/604 +f 621/1/610 613/1/602 609/1/598 +f 620/1/609 617/1/606 615/1/604 +f 617/1/606 622/1/611 618/1/607 +f 622/1/611 619/1/608 618/1/607 +f 611/1/600 621/1/610 609/1/598 +f 621/1/610 620/1/609 613/1/602 +f 620/1/609 623/1/612 617/1/606 +f 623/1/612 624/1/613 617/1/606 +f 624/1/613 622/1/611 617/1/606 +f 622/1/611 625/1/614 619/1/608 +f 619/1/608 625/1/614 567/1/554 +f 625/1/614 568/1/264 567/1/554 +f 49/1/56 611/1/600 47/1/52 +f 625/1/614 627/1/615 568/1/264 +f 627/1/615 626/1/267 568/1/264 +f 49/1/56 628/1/616 611/1/600 +f 628/1/616 621/1/610 611/1/600 +f 622/1/611 632/1/617 625/1/614 +f 632/1/617 627/1/615 625/1/614 +f 628/1/616 629/1/618 621/1/610 +f 624/1/613 630/1/619 622/1/611 +f 630/1/619 632/1/617 622/1/611 +f 629/1/618 620/1/609 621/1/610 +f 629/1/618 631/1/620 620/1/609 +f 631/1/620 623/1/612 620/1/609 +f 623/1/612 631/1/620 624/1/613 +f 631/1/620 630/1/619 624/1/613 +f 632/1/617 569/1/556 626/1/267 +f 627/1/615 632/1/617 626/1/267 +f 49/1/56 633/1/621 628/1/616 +f 634/1/622 629/1/618 628/1/616 +f 633/1/621 634/1/622 628/1/616 +f 635/1/623 631/1/620 629/1/618 +f 634/1/622 635/1/623 629/1/618 +f 635/1/623 636/1/624 631/1/620 +f 636/1/624 630/1/619 631/1/620 +f 636/1/624 637/1/625 630/1/619 +f 637/1/625 632/1/617 630/1/619 +f 638/1/626 571/1/558 569/1/556 +f 632/1/617 638/1/626 569/1/556 +f 637/1/625 638/1/626 632/1/617 +f 635/1/623 639/1/627 636/1/624 +f 636/1/624 640/1/628 637/1/625 +f 639/1/627 640/1/628 636/1/624 +f 641/1/629 638/1/626 637/1/625 +f 640/1/628 641/1/629 637/1/625 +f 642/1/559 571/1/558 638/1/626 +f 641/1/629 642/1/559 638/1/626 +f 634/1/622 643/1/630 635/1/623 +f 49/1/56 648/1/631 633/1/621 +f 643/1/630 639/1/627 635/1/623 +f 644/1/632 634/1/622 633/1/621 +f 648/1/631 644/1/632 633/1/621 +f 643/1/630 645/1/633 639/1/627 +f 644/1/632 646/1/634 634/1/622 +f 646/1/634 643/1/630 634/1/622 +f 645/1/633 647/1/635 639/1/627 +f 647/1/635 640/1/628 639/1/627 +f 647/1/635 649/1/636 640/1/628 +f 649/1/636 641/1/629 640/1/628 +f 649/1/636 650/1/637 641/1/629 +f 650/1/637 642/1/559 641/1/629 +f 55/1/62 648/1/631 49/1/56 +f 650/1/637 573/1/561 642/1/559 +f 55/1/62 651/1/638 648/1/631 +f 646/1/634 645/1/633 643/1/630 +f 650/1/637 575/1/563 573/1/561 +f 651/1/638 644/1/632 648/1/631 +f 646/1/634 652/1/639 645/1/633 +f 652/1/639 647/1/635 645/1/633 +f 653/1/640 646/1/634 644/1/632 +f 654/1/641 649/1/636 647/1/635 +f 652/1/639 654/1/641 647/1/635 +f 51/1/58 655/1/642 55/1/62 +f 653/1/640 652/1/639 646/1/634 +f 656/1/643 650/1/637 649/1/636 +f 654/1/641 656/1/643 649/1/636 +f 651/1/638 653/1/640 644/1/632 +f 657/1/565 575/1/563 650/1/637 +f 656/1/643 657/1/565 650/1/637 +f 653/1/640 658/1/644 652/1/639 +f 659/1/645 651/1/638 55/1/62 +f 660/1/646 653/1/640 651/1/638 +f 658/1/644 654/1/641 652/1/639 +f 655/1/642 659/1/645 55/1/62 +f 660/1/646 658/1/644 653/1/640 +f 661/1/647 659/1/645 655/1/642 +f 662/1/648 658/1/644 660/1/646 +f 659/1/645 660/1/646 651/1/638 +f 658/1/644 663/1/649 654/1/641 +f 663/1/649 656/1/643 654/1/641 +f 664/1/650 660/1/646 659/1/645 +f 663/1/649 665/1/651 656/1/643 +f 665/1/651 657/1/565 656/1/643 +f 665/1/651 576/1/566 657/1/565 +f 666/1/652 663/1/649 658/1/644 +f 662/1/648 666/1/652 658/1/644 +f 667/1/653 664/1/650 659/1/645 +f 661/1/647 667/1/653 659/1/645 +f 668/1/654 662/1/648 660/1/646 +f 664/1/650 668/1/654 660/1/646 +f 669/1/655 668/1/654 664/1/650 +f 663/1/649 670/1/656 665/1/651 +f 668/1/654 666/1/652 662/1/648 +f 670/1/656 576/1/566 665/1/651 +f 666/1/652 670/1/656 663/1/649 +f 667/1/653 669/1/655 664/1/650 +f 671/1/657 666/1/652 668/1/654 +f 672/1/658 669/1/655 667/1/653 +f 669/1/655 671/1/657 668/1/654 +f 670/1/656 577/1/569 576/1/566 +f 673/1/659 672/1/658 667/1/653 +f 674/1/660 670/1/656 666/1/652 +f 671/1/657 674/1/660 666/1/652 +f 672/1/658 671/1/657 669/1/655 +f 675/1/571 577/1/569 670/1/656 +f 674/1/660 675/1/571 670/1/656 +f 676/1/661 674/1/660 671/1/657 +f 677/1/662 671/1/657 672/1/658 +f 676/1/661 675/1/571 674/1/660 +f 677/1/662 676/1/661 671/1/657 +f 673/1/659 677/1/662 672/1/658 +f 676/1/661 678/1/663 675/1/571 +f 679/1/664 677/1/662 673/1/659 +f 678/1/663 676/1/661 677/1/662 +f 678/1/663 580/1/573 675/1/571 +f 680/1/665 678/1/663 677/1/662 +f 679/1/664 680/1/665 677/1/662 +f 680/1/665 580/1/573 678/1/663 +f 681/1/666 680/1/665 679/1/664 +f 680/1/665 582/1/269 580/1/573 +f 681/1/666 582/1/269 680/1/665 +f 661/1/647 655/1/642 51/1/58 +f 682/1/667 661/1/647 51/1/58 +f 667/1/653 661/1/647 682/1/667 +f 673/1/659 667/1/653 682/1/667 +f 683/1/668 673/1/659 682/1/667 +f 683/1/668 679/1/664 673/1/659 +f 683/1/668 681/1/666 679/1/664 +f 684/1/271 681/1/666 683/1/668 +f 684/1/271 582/1/269 681/1/666 +f 215/1/230 22/1/24 25/1/28 +f 215/1/230 685/1/669 22/1/24 +f 216/1/231 685/1/669 215/1/230 +f 216/1/231 686/1/670 685/1/669 +f 217/1/232 686/1/670 216/1/231 +f 217/1/232 687/1/671 686/1/670 +f 217/1/232 688/1/672 687/1/671 +f 219/1/234 688/1/672 217/1/232 +f 219/1/234 689/1/673 688/1/672 +f 219/1/234 690/1/241 689/1/673 +f 220/1/235 690/1/241 219/1/234 +f 685/1/669 691/1/674 22/1/24 +f 691/1/674 20/1/21 22/1/24 +f 685/1/669 692/1/675 691/1/674 +f 693/1/676 20/1/21 691/1/674 +f 686/1/670 692/1/675 685/1/669 +f 692/1/675 694/1/677 691/1/674 +f 694/1/677 693/1/676 691/1/674 +f 686/1/670 695/1/678 692/1/675 +f 693/1/676 21/1/22 20/1/21 +f 696/1/679 694/1/677 692/1/675 +f 695/1/678 696/1/679 692/1/675 +f 687/1/671 695/1/678 686/1/670 +f 697/1/680 695/1/678 687/1/671 +f 693/1/676 700/1/681 21/1/22 +f 698/1/682 693/1/676 694/1/677 +f 696/1/679 698/1/682 694/1/677 +f 699/1/683 696/1/679 695/1/678 +f 697/1/680 699/1/683 695/1/678 +f 688/1/672 697/1/680 687/1/671 +f 701/1/684 697/1/680 688/1/672 +f 689/1/673 702/1/685 688/1/672 +f 699/1/683 698/1/682 696/1/679 +f 702/1/685 701/1/684 688/1/672 +f 703/1/686 699/1/683 697/1/680 +f 701/1/684 703/1/686 697/1/680 +f 693/1/676 704/1/687 700/1/681 +f 698/1/682 704/1/687 693/1/676 +f 705/1/688 698/1/682 699/1/683 +f 690/1/241 702/1/685 689/1/673 +f 702/1/685 706/1/689 701/1/684 +f 707/1/690 704/1/687 698/1/682 +f 560/1/546 702/1/685 690/1/241 +f 706/1/689 703/1/686 701/1/684 +f 703/1/686 705/1/688 699/1/683 +f 700/1/681 708/1/691 21/1/22 +f 560/1/546 706/1/689 702/1/685 +f 709/1/692 705/1/688 703/1/686 +f 560/1/546 561/1/548 706/1/689 +f 706/1/689 709/1/692 703/1/686 +f 705/1/688 707/1/690 698/1/682 +f 561/1/548 709/1/692 706/1/689 +f 704/1/687 710/1/693 700/1/681 +f 711/1/694 707/1/690 705/1/688 +f 710/1/693 708/1/691 700/1/681 +f 709/1/692 711/1/694 705/1/688 +f 713/1/695 710/1/693 704/1/687 +f 561/1/548 712/1/696 709/1/692 +f 712/1/696 711/1/694 709/1/692 +f 561/1/548 564/1/551 712/1/696 +f 707/1/690 713/1/695 704/1/687 +f 714/1/697 713/1/695 707/1/690 +f 712/1/696 715/1/698 711/1/694 +f 708/1/691 23/1/25 21/1/22 +f 564/1/551 715/1/698 712/1/696 +f 716/1/699 714/1/697 707/1/690 +f 711/1/694 716/1/699 707/1/690 +f 715/1/698 716/1/699 711/1/694 +f 710/1/693 717/1/700 708/1/691 +f 564/1/551 566/1/553 715/1/698 +f 713/1/695 717/1/700 710/1/693 +f 718/1/701 717/1/700 713/1/695 +f 714/1/697 718/1/701 713/1/695 +f 719/1/702 718/1/701 714/1/697 +f 716/1/699 719/1/702 714/1/697 +f 720/1/555 716/1/699 715/1/698 +f 566/1/553 720/1/555 715/1/698 +f 716/1/699 721/1/703 719/1/702 +f 722/1/704 721/1/703 716/1/699 +f 720/1/555 722/1/704 716/1/699 +f 247/1/266 722/1/704 720/1/555 +f 723/1/705 29/1/32 23/1/25 +f 246/1/265 722/1/704 247/1/266 +f 246/1/265 724/1/706 722/1/704 +f 708/1/691 723/1/705 23/1/25 +f 725/1/707 723/1/705 708/1/691 +f 724/1/706 721/1/703 722/1/704 +f 724/1/706 726/1/708 721/1/703 +f 717/1/700 725/1/707 708/1/691 +f 727/1/709 725/1/707 717/1/700 +f 726/1/708 719/1/702 721/1/703 +f 726/1/708 728/1/710 719/1/702 +f 718/1/701 727/1/709 717/1/700 +f 728/1/710 718/1/701 719/1/702 +f 728/1/710 727/1/709 718/1/701 +f 726/1/708 729/1/711 728/1/710 +f 246/1/265 730/1/712 724/1/706 +f 730/1/712 726/1/708 724/1/706 +f 730/1/712 729/1/711 726/1/708 +f 570/1/557 730/1/712 246/1/265 +f 723/1/705 731/1/713 29/1/32 +f 725/1/707 731/1/713 723/1/705 +f 732/1/714 731/1/713 725/1/707 +f 727/1/709 732/1/714 725/1/707 +f 733/1/715 732/1/714 727/1/709 +f 728/1/710 733/1/715 727/1/709 +f 734/1/716 733/1/715 728/1/710 +f 729/1/711 734/1/716 728/1/710 +f 735/1/717 734/1/716 729/1/711 +f 730/1/712 735/1/717 729/1/711 +f 736/1/718 735/1/717 730/1/712 +f 570/1/557 736/1/718 730/1/712 +f 731/1/713 737/1/719 29/1/32 +f 738/1/720 737/1/719 731/1/713 +f 739/1/721 738/1/720 731/1/713 +f 732/1/714 739/1/721 731/1/713 +f 570/1/557 572/1/560 736/1/718 +f 740/1/722 739/1/721 732/1/714 +f 733/1/715 740/1/722 732/1/714 +f 741/1/723 740/1/722 733/1/715 +f 734/1/716 741/1/723 733/1/715 +f 742/1/724 741/1/723 734/1/716 +f 735/1/717 742/1/724 734/1/716 +f 572/1/560 742/1/724 735/1/717 +f 736/1/718 572/1/560 735/1/717 +f 740/1/722 743/1/725 739/1/721 +f 741/1/723 743/1/725 740/1/722 +f 737/1/719 744/1/726 29/1/32 +f 744/1/726 30/1/33 29/1/32 +f 745/1/727 743/1/725 741/1/723 +f 742/1/724 745/1/727 741/1/723 +f 746/1/728 745/1/727 742/1/724 +f 572/1/560 746/1/728 742/1/724 +f 574/1/562 746/1/728 572/1/560 +f 738/1/720 744/1/726 737/1/719 +f 739/1/721 747/1/729 738/1/720 +f 748/1/730 744/1/726 738/1/720 +f 749/1/731 747/1/729 739/1/721 +f 743/1/725 749/1/731 739/1/721 +f 744/1/726 750/1/732 30/1/33 +f 747/1/729 748/1/730 738/1/720 +f 752/1/733 749/1/731 743/1/725 +f 745/1/727 752/1/733 743/1/725 +f 751/1/734 748/1/730 747/1/729 +f 749/1/731 751/1/734 747/1/729 +f 753/1/735 752/1/733 745/1/727 +f 750/1/732 18/1/27 30/1/33 +f 746/1/728 753/1/735 745/1/727 +f 748/1/730 754/1/736 744/1/726 +f 754/1/736 750/1/732 744/1/726 +f 755/1/564 753/1/735 746/1/728 +f 574/1/562 755/1/564 746/1/728 +f 751/1/734 756/1/737 748/1/730 +f 757/1/738 751/1/734 749/1/731 +f 752/1/733 757/1/738 749/1/731 +f 758/1/739 18/1/27 750/1/732 +f 759/1/740 757/1/738 752/1/733 +f 753/1/735 759/1/740 752/1/733 +f 756/1/737 760/1/741 748/1/730 +f 760/1/741 754/1/736 748/1/730 +f 754/1/736 758/1/739 750/1/732 +f 761/1/742 756/1/737 751/1/734 +f 755/1/564 759/1/740 753/1/735 +f 760/1/741 762/1/743 754/1/736 +f 757/1/738 761/1/742 751/1/734 +f 762/1/743 758/1/739 754/1/736 +f 755/1/564 763/1/567 759/1/740 +f 756/1/737 764/1/744 760/1/741 +f 765/1/745 756/1/737 761/1/742 +f 766/1/746 761/1/742 757/1/738 +f 759/1/740 766/1/746 757/1/738 +f 764/1/744 768/1/747 760/1/741 +f 768/1/747 762/1/743 760/1/741 +f 769/1/568 766/1/746 759/1/740 +f 763/1/567 769/1/568 759/1/740 +f 770/1/748 764/1/744 756/1/737 +f 765/1/745 770/1/748 756/1/737 +f 768/1/747 767/1/749 762/1/743 +f 771/1/750 765/1/745 761/1/742 +f 766/1/746 771/1/750 761/1/742 +f 769/1/568 771/1/750 766/1/746 +f 770/1/748 768/1/747 764/1/744 +f 578/1/570 771/1/750 769/1/568 +f 771/1/750 770/1/748 765/1/745 +f 773/1/751 767/1/749 768/1/747 +f 774/1/752 770/1/748 771/1/750 +f 772/1/753 768/1/747 770/1/748 +f 578/1/570 774/1/752 771/1/750 +f 772/1/753 775/1/754 768/1/747 +f 775/1/754 773/1/751 768/1/747 +f 774/1/752 776/1/755 770/1/748 +f 776/1/755 772/1/753 770/1/748 +f 578/1/570 579/1/572 774/1/752 +f 579/1/572 776/1/755 774/1/752 +f 776/1/755 777/1/756 772/1/753 +f 777/1/756 775/1/754 772/1/753 +f 579/1/572 581/1/268 776/1/755 +f 581/1/268 777/1/756 776/1/755 +f 758/1/739 778/1/757 18/1/27 +f 758/1/739 762/1/743 778/1/757 +f 762/1/743 767/1/749 778/1/757 +f 767/1/749 779/1/758 778/1/757 +f 773/1/751 779/1/758 767/1/749 +f 773/1/751 780/1/759 779/1/758 +f 775/1/754 780/1/759 773/1/751 +f 775/1/754 777/1/756 780/1/759 +f 777/1/756 781/1/270 780/1/759 +f 581/1/268 781/1/270 777/1/756 +f 139/1/146 399/1/396 140/1/147 +f 399/1/396 252/1/280 140/1/147 +f 18/1/27 3/1/3 19/1/23 +f 33/1/36 51/1/58 46/1/54 +f 18/1/27 8/1/10 3/1/3 +f 38/1/41 51/1/58 33/1/36 +f 182/1/191 116/1/128 94/1/106 +f 174/1/181 182/1/191 94/1/106 +f 161/1/168 410/1/407 139/1/146 +f 410/1/407 399/1/396 139/1/146 +f 423/1/420 356/1/374 379/1/386 +f 429/1/428 423/1/420 379/1/386 +f 18/1/27 778/1/757 8/1/10 +f 496/1/511 682/1/667 38/1/41 +f 682/1/667 51/1/58 38/1/41 +f 778/1/757 779/1/758 8/1/10 +f 779/1/758 293/1/189 8/1/10 +f 683/1/668 682/1/667 496/1/511 +f 779/1/758 780/1/759 293/1/189 +f 498/1/426 683/1/668 496/1/511 +f 684/1/271 683/1/668 498/1/426 +f 780/1/759 781/1/270 293/1/189 +f 781/1/270 174/1/181 293/1/189 +f 781/1/270 182/1/191 174/1/181 +f 781/1/270 161/1/168 182/1/191 +f 781/1/270 410/1/407 161/1/168 +f 781/1/270 684/1/271 410/1/407 +f 684/1/271 429/1/428 410/1/407 +f 684/1/271 423/1/420 429/1/428 +f 684/1/271 498/1/426 423/1/420 +f 355/1/372 550/1/494 492/1/490 +f 354/1/371 355/1/372 492/1/490 +f 493/1/491 354/1/371 492/1/490 +f 559/1/492 354/1/371 493/1/491 +f 558/1/545 559/1/492 493/1/491 +f 92/1/99 353/1/321 289/1/318 +f 90/1/97 92/1/99 289/1/318 +f 290/1/319 90/1/97 289/1/318 +f 347/1/322 90/1/97 290/1/319 +f 784/1/760 783/1/761 782/1/762 +f 785/1/763 783/1/761 784/1/760 +f 786/1/764 785/1/763 784/1/760 +f 787/1/765 785/1/763 786/1/764 +f 788/1/766 787/1/765 786/1/764 +f 789/1/767 787/1/765 788/1/766 +f 790/1/768 789/1/767 788/1/766 +f 791/1/769 790/1/768 788/1/766 +f 792/1/770 790/1/768 791/1/769 +f 793/1/771 792/1/770 791/1/769 +f 794/1/772 792/1/770 793/1/771 +f 795/1/773 794/1/772 793/1/771 +f 796/1/774 794/1/772 795/1/773 +f 797/1/775 796/1/774 795/1/773 +f 798/1/776 796/1/774 797/1/775 +f 799/1/777 798/1/776 797/1/775 +f 800/1/778 798/1/776 799/1/777 +f 801/1/779 800/1/778 799/1/777 +f 802/1/780 800/1/778 801/1/779 +f 803/1/781 802/1/780 801/1/779 +f 804/1/782 802/1/780 803/1/781 +f 805/1/783 804/1/782 803/1/781 +f 806/1/784 804/1/782 805/1/783 +f 807/1/785 804/1/782 806/1/784 +f 808/1/786 807/1/785 806/1/784 +f 809/1/787 807/1/785 808/1/786 +f 810/1/788 809/1/787 808/1/786 +f 811/1/789 809/1/787 810/1/788 +f 812/1/790 811/1/789 810/1/788 +f 813/1/791 811/1/789 812/1/790 +f 816/1/792 817/1/793 815/1/794 +f 814/1/795 816/1/792 815/1/794 +f 818/1/796 819/1/797 817/1/793 +f 816/1/792 818/1/796 817/1/793 +f 818/1/796 820/1/798 819/1/797 +f 820/1/798 821/1/799 819/1/797 +f 820/1/798 822/1/800 821/1/799 +f 823/1/801 824/1/802 821/1/799 +f 822/1/800 823/1/801 821/1/799 +f 825/1/803 826/1/804 824/1/802 +f 823/1/801 825/1/803 824/1/802 +f 813/1/791 812/1/790 826/1/804 +f 825/1/803 813/1/791 826/1/804 +f 827/1/805 814/1/795 828/1/806 +f 814/1/795 815/1/794 828/1/806 +f 831/1/807 832/1/808 830/1/809 +f 829/1/810 831/1/807 830/1/809 +f 833/1/811 834/1/812 832/1/808 +f 831/1/807 833/1/811 832/1/808 +f 835/1/813 836/1/814 834/1/812 +f 833/1/811 835/1/813 834/1/812 +f 835/1/813 837/1/815 836/1/814 +f 835/1/813 838/1/816 837/1/815 +f 838/1/816 839/1/817 837/1/815 +f 840/1/818 841/1/819 839/1/817 +f 838/1/816 840/1/818 839/1/817 +f 827/1/805 828/1/806 841/1/819 +f 840/1/818 827/1/805 841/1/819 +f 783/1/761 829/1/810 782/1/762 +f 829/1/810 830/1/809 782/1/762 +f 796/1/774 798/1/776 783/1/761 +f 798/1/776 829/1/810 783/1/761 +f 794/1/772 796/1/774 783/1/761 +f 792/1/770 794/1/772 783/1/761 +f 827/1/805 840/1/818 829/1/810 +f 840/1/818 838/1/816 829/1/810 +f 814/1/795 827/1/805 829/1/810 +f 798/1/776 814/1/795 829/1/810 +f 838/1/816 835/1/813 829/1/810 +f 835/1/813 833/1/811 829/1/810 +f 785/1/763 792/1/770 783/1/761 +f 833/1/811 831/1/807 829/1/810 +f 787/1/765 792/1/770 785/1/763 +f 790/1/768 792/1/770 787/1/765 +f 789/1/767 790/1/768 787/1/765 +f 811/1/789 814/1/795 798/1/776 +f 811/1/789 813/1/791 814/1/795 +f 800/1/778 811/1/789 798/1/776 +f 813/1/791 816/1/792 814/1/795 +f 802/1/780 811/1/789 800/1/778 +f 813/1/791 818/1/796 816/1/792 +f 813/1/791 820/1/798 818/1/796 +f 804/1/782 811/1/789 802/1/780 +f 807/1/785 809/1/787 804/1/782 +f 809/1/787 811/1/789 804/1/782 +f 813/1/791 825/1/803 820/1/798 +f 825/1/803 823/1/801 820/1/798 +f 823/1/801 822/1/800 820/1/798 +f 830/1/809 815/1/794 782/1/762 +f 797/1/775 795/1/773 782/1/762 +f 815/1/794 797/1/775 782/1/762 +f 795/1/773 793/1/771 782/1/762 +f 793/1/771 791/1/769 782/1/762 +f 834/1/812 836/1/814 830/1/809 +f 837/1/815 839/1/817 830/1/809 +f 839/1/817 841/1/819 830/1/809 +f 841/1/819 828/1/806 830/1/809 +f 828/1/806 815/1/794 830/1/809 +f 836/1/814 837/1/815 830/1/809 +f 791/1/769 784/1/760 782/1/762 +f 832/1/808 834/1/812 830/1/809 +f 791/1/769 786/1/764 784/1/760 +f 791/1/769 788/1/766 786/1/764 +f 812/1/790 810/1/788 797/1/775 +f 815/1/794 812/1/790 797/1/775 +f 810/1/788 799/1/777 797/1/775 +f 817/1/793 812/1/790 815/1/794 +f 810/1/788 801/1/779 799/1/777 +f 819/1/797 812/1/790 817/1/793 +f 810/1/788 803/1/781 801/1/779 +f 821/1/799 812/1/790 819/1/797 +f 810/1/788 808/1/786 803/1/781 +f 808/1/786 806/1/784 803/1/781 +f 806/1/784 805/1/783 803/1/781 +f 824/1/802 826/1/804 821/1/799 +f 826/1/804 812/1/790 821/1/799 +f 842/1/820 843/1/821 857/1/822 +f 842/1/820 844/1/823 843/1/821 +f 845/1/824 846/1/825 847/1/826 +f 848/1/827 845/1/824 847/1/826 +f 845/1/824 849/1/828 846/1/825 +f 845/1/824 850/1/829 849/1/828 +f 845/1/824 851/1/830 850/1/829 +f 851/1/830 852/1/831 850/1/829 +f 851/1/830 853/1/832 852/1/831 +f 854/1/833 855/1/834 853/1/832 +f 851/1/830 854/1/833 853/1/832 +f 854/1/833 856/1/835 855/1/834 +f 857/1/822 843/1/821 856/1/835 +f 854/1/833 857/1/822 856/1/835 +f 858/1/836 940/1/837 859/1/838 +f 858/1/836 860/1/839 940/1/837 +f 861/1/840 865/1/841 848/1/827 +f 865/1/841 862/1/842 848/1/827 +f 863/1/843 845/1/824 848/1/827 +f 862/1/842 863/1/843 848/1/827 +f 863/1/843 864/1/844 845/1/824 +f 866/1/845 865/1/841 861/1/840 +f 868/1/846 867/1/847 866/1/845 +f 869/1/848 865/1/841 866/1/845 +f 870/1/849 868/1/846 866/1/845 +f 867/1/847 869/1/848 866/1/845 +f 871/1/850 870/1/849 866/1/845 +f 872/1/851 870/1/849 871/1/850 +f 873/1/852 870/1/849 872/1/851 +f 874/1/853 870/1/849 873/1/852 +f 875/1/854 870/1/849 874/1/853 +f 876/1/855 870/1/849 875/1/854 +f 877/1/856 876/1/855 875/1/854 +f 876/1/855 877/1/856 878/1/857 +f 879/1/858 876/1/855 878/1/857 +f 870/1/849 880/1/859 868/1/846 +f 870/1/849 881/1/860 880/1/859 +f 881/1/860 882/1/861 880/1/859 +f 882/1/861 883/1/862 880/1/859 +f 883/1/862 884/1/863 880/1/859 +f 885/1/864 879/1/858 878/1/857 +f 883/1/862 886/1/865 884/1/863 +f 887/1/866 879/1/858 885/1/864 +f 883/1/862 888/1/867 886/1/865 +f 889/1/868 879/1/858 887/1/866 +f 890/1/869 889/1/868 887/1/866 +f 891/1/870 890/1/869 887/1/866 +f 892/1/871 893/1/872 888/1/867 +f 883/1/862 892/1/871 888/1/867 +f 894/1/873 890/1/869 891/1/870 +f 846/1/825 896/1/874 847/1/826 +f 896/1/874 895/1/875 847/1/826 +f 897/1/876 898/1/877 846/1/825 +f 898/1/877 899/1/878 846/1/825 +f 901/1/879 896/1/874 846/1/825 +f 899/1/878 900/1/880 846/1/825 +f 900/1/880 901/1/879 846/1/825 +f 902/1/881 903/1/882 897/1/876 +f 903/1/882 898/1/877 897/1/876 +f 904/1/883 902/1/881 897/1/876 +f 905/1/884 902/1/881 904/1/883 +f 906/1/885 902/1/881 905/1/884 +f 907/1/886 902/1/881 906/1/885 +f 908/1/887 902/1/881 907/1/886 +f 909/1/888 908/1/887 907/1/886 +f 910/1/889 908/1/887 909/1/888 +f 903/1/882 902/1/881 911/1/890 +f 902/1/881 921/1/891 911/1/890 +f 912/1/892 908/1/887 910/1/889 +f 913/1/893 914/1/894 912/1/892 +f 914/1/894 908/1/887 912/1/892 +f 915/1/895 913/1/893 912/1/892 +f 921/1/891 916/1/896 911/1/890 +f 917/1/897 915/1/895 912/1/892 +f 921/1/891 918/1/898 916/1/896 +f 921/1/891 919/1/899 918/1/898 +f 920/1/900 915/1/895 917/1/897 +f 921/1/891 922/1/901 919/1/899 +f 922/1/901 923/1/902 919/1/899 +f 924/1/903 925/1/904 920/1/900 +f 925/1/904 915/1/895 920/1/900 +f 923/1/902 926/1/905 919/1/899 +f 923/1/902 927/1/906 926/1/905 +f 866/1/845 861/1/840 895/1/875 +f 896/1/874 866/1/845 895/1/875 +f 871/1/850 866/1/845 896/1/874 +f 901/1/879 871/1/850 896/1/874 +f 872/1/851 871/1/850 901/1/879 +f 873/1/852 872/1/851 901/1/879 +f 900/1/880 873/1/852 901/1/879 +f 874/1/853 873/1/852 900/1/880 +f 899/1/878 874/1/853 900/1/880 +f 875/1/854 874/1/853 899/1/878 +f 898/1/877 875/1/854 899/1/878 +f 877/1/856 875/1/854 898/1/877 +f 903/1/882 877/1/856 898/1/877 +f 878/1/857 877/1/856 911/1/890 +f 877/1/856 903/1/882 911/1/890 +f 902/1/881 879/1/858 921/1/891 +f 876/1/855 879/1/858 902/1/881 +f 916/1/896 878/1/857 911/1/890 +f 885/1/864 878/1/857 916/1/896 +f 918/1/898 885/1/864 916/1/896 +f 919/1/899 885/1/864 918/1/898 +f 887/1/866 885/1/864 919/1/899 +f 891/1/870 887/1/866 919/1/899 +f 926/1/905 891/1/870 919/1/899 +f 927/1/906 891/1/870 926/1/905 +f 894/1/873 891/1/870 927/1/906 +f 923/1/902 894/1/873 927/1/906 +f 890/1/869 894/1/873 923/1/902 +f 922/1/901 890/1/869 923/1/902 +f 889/1/868 890/1/869 922/1/901 +f 921/1/891 889/1/868 922/1/901 +f 879/1/858 889/1/868 921/1/891 +f 864/1/844 863/1/843 897/1/876 +f 863/1/843 904/1/883 897/1/876 +f 862/1/842 905/1/884 904/1/883 +f 863/1/843 862/1/842 904/1/883 +f 862/1/842 906/1/885 905/1/884 +f 862/1/842 865/1/841 906/1/885 +f 865/1/841 907/1/886 906/1/885 +f 865/1/841 869/1/848 907/1/886 +f 867/1/847 909/1/888 907/1/886 +f 869/1/848 867/1/847 907/1/886 +f 867/1/847 910/1/889 909/1/888 +f 867/1/847 868/1/846 910/1/889 +f 868/1/846 880/1/859 910/1/889 +f 880/1/859 912/1/892 910/1/889 +f 870/1/849 908/1/887 914/1/894 +f 881/1/860 870/1/849 914/1/894 +f 880/1/859 884/1/863 912/1/892 +f 884/1/863 917/1/897 912/1/892 +f 884/1/863 886/1/865 917/1/897 +f 888/1/867 920/1/900 917/1/897 +f 886/1/865 888/1/867 917/1/897 +f 888/1/867 924/1/903 920/1/900 +f 888/1/867 893/1/872 924/1/903 +f 892/1/871 925/1/904 924/1/903 +f 893/1/872 892/1/871 924/1/903 +f 883/1/862 915/1/895 925/1/904 +f 892/1/871 883/1/862 925/1/904 +f 882/1/861 913/1/893 915/1/895 +f 883/1/862 882/1/861 915/1/895 +f 881/1/860 914/1/894 913/1/893 +f 882/1/861 881/1/860 913/1/893 +f 861/1/840 928/1/907 895/1/875 +f 861/1/840 929/1/908 928/1/907 +f 861/1/840 930/1/909 929/1/908 +f 930/1/909 931/1/910 929/1/908 +f 932/1/911 933/1/912 931/1/910 +f 930/1/909 932/1/911 931/1/910 +f 932/1/911 934/1/913 933/1/912 +f 935/1/914 936/1/915 934/1/913 +f 932/1/911 935/1/914 934/1/913 +f 935/1/914 937/1/916 936/1/915 +f 938/1/917 930/1/909 848/1/827 +f 930/1/909 861/1/840 848/1/827 +f 939/1/918 932/1/911 938/1/917 +f 932/1/911 930/1/909 938/1/917 +f 940/1/837 935/1/914 939/1/918 +f 935/1/914 932/1/911 939/1/918 +f 895/1/875 928/1/907 847/1/826 +f 928/1/907 941/1/919 847/1/826 +f 928/1/907 929/1/908 941/1/919 +f 929/1/908 942/1/920 941/1/919 +f 929/1/908 931/1/910 942/1/920 +f 931/1/910 943/1/921 942/1/920 +f 931/1/910 933/1/912 943/1/921 +f 933/1/912 934/1/913 943/1/921 +f 934/1/913 944/1/922 943/1/921 +f 934/1/913 936/1/915 944/1/922 +f 936/1/915 945/1/923 944/1/922 +f 936/1/915 937/1/916 945/1/923 +f 937/1/916 859/1/838 945/1/923 +f 946/1/924 948/1/925 947/1/926 +f 946/1/924 949/1/927 948/1/925 +f 949/1/927 950/1/928 948/1/925 +f 949/1/927 951/1/929 950/1/928 +f 951/1/929 952/1/930 950/1/928 +f 952/1/930 953/1/931 950/1/928 +f 952/1/930 954/1/932 953/1/931 +f 954/1/932 955/1/933 953/1/931 +f 954/1/932 956/1/934 955/1/933 +f 954/1/932 957/1/935 956/1/934 +f 957/1/935 958/1/936 956/1/934 +f 957/1/935 959/1/937 958/1/936 +f 959/1/937 960/1/938 958/1/936 +f 959/1/937 961/1/939 960/1/938 +f 960/1/938 860/1/839 858/1/836 +f 960/1/938 961/1/939 860/1/839 +f 946/1/924 935/1/914 940/1/837 +f 860/1/839 946/1/924 940/1/837 +f 860/1/839 961/1/939 946/1/924 +f 961/1/939 949/1/927 946/1/924 +f 961/1/939 951/1/929 949/1/927 +f 961/1/939 952/1/930 951/1/929 +f 961/1/939 954/1/932 952/1/930 +f 961/1/939 957/1/935 954/1/932 +f 961/1/939 959/1/937 957/1/935 +f 960/1/938 858/1/836 859/1/838 +f 937/1/916 947/1/926 859/1/838 +f 947/1/926 960/1/938 859/1/838 +f 948/1/925 960/1/938 947/1/926 +f 950/1/928 960/1/938 948/1/925 +f 953/1/931 960/1/938 950/1/928 +f 955/1/933 960/1/938 953/1/931 +f 956/1/934 960/1/938 955/1/933 +f 958/1/936 960/1/938 956/1/934 +f 946/1/924 947/1/926 937/1/916 +f 935/1/914 946/1/924 937/1/916 +f 962/1/940 864/1/844 897/1/876 +f 963/1/941 864/1/844 962/1/940 +f 964/1/942 963/1/941 962/1/940 +f 965/1/943 963/1/941 964/1/942 +f 966/1/944 963/1/941 965/1/943 +f 967/1/945 966/1/944 965/1/943 +f 968/1/946 966/1/944 967/1/945 +f 969/1/947 966/1/944 968/1/946 +f 970/1/948 969/1/947 968/1/946 +f 971/1/949 969/1/947 970/1/948 +f 963/1/941 845/1/824 864/1/844 +f 963/1/941 851/1/830 845/1/824 +f 966/1/944 851/1/830 963/1/941 +f 966/1/944 854/1/833 851/1/830 +f 969/1/947 854/1/833 966/1/944 +f 969/1/947 857/1/822 854/1/833 +f 846/1/825 962/1/940 897/1/876 +f 849/1/828 962/1/940 846/1/825 +f 849/1/828 964/1/942 962/1/940 +f 850/1/829 964/1/942 849/1/828 +f 850/1/829 965/1/943 964/1/942 +f 852/1/831 965/1/943 850/1/829 +f 852/1/831 967/1/945 965/1/943 +f 853/1/832 967/1/945 852/1/831 +f 855/1/834 967/1/945 853/1/832 +f 855/1/834 968/1/946 967/1/945 +f 856/1/835 968/1/946 855/1/834 +f 856/1/835 970/1/948 968/1/946 +f 843/1/821 970/1/948 856/1/835 +f 843/1/821 971/1/949 970/1/948 +f 987/1/950 844/1/823 842/1/820 +f 987/1/950 972/1/951 844/1/823 +f 973/1/952 975/1/953 974/1/954 +f 973/1/952 976/1/955 975/1/953 +f 976/1/955 977/1/956 975/1/953 +f 976/1/955 978/1/957 977/1/956 +f 979/1/958 980/1/959 977/1/956 +f 978/1/957 979/1/958 977/1/956 +f 981/1/960 982/1/961 980/1/959 +f 979/1/958 981/1/960 980/1/959 +f 981/1/960 983/1/962 982/1/961 +f 981/1/960 984/1/963 983/1/962 +f 984/1/963 985/1/964 983/1/962 +f 984/1/963 986/1/965 985/1/964 +f 986/1/965 987/1/950 985/1/964 +f 986/1/965 972/1/951 987/1/950 +f 969/1/947 974/1/954 857/1/822 +f 987/1/950 842/1/820 857/1/822 +f 974/1/954 987/1/950 857/1/822 +f 975/1/953 987/1/950 974/1/954 +f 977/1/956 987/1/950 975/1/953 +f 980/1/959 987/1/950 977/1/956 +f 982/1/961 987/1/950 980/1/959 +f 983/1/962 987/1/950 982/1/961 +f 985/1/964 987/1/950 983/1/962 +f 971/1/949 973/1/952 969/1/947 +f 973/1/952 974/1/954 969/1/947 +f 973/1/952 971/1/949 843/1/821 +f 844/1/823 973/1/952 843/1/821 +f 844/1/823 972/1/951 973/1/952 +f 972/1/951 976/1/955 973/1/952 +f 972/1/951 978/1/957 976/1/955 +f 972/1/951 979/1/958 978/1/957 +f 972/1/951 981/1/960 979/1/958 +f 972/1/951 984/1/963 981/1/960 +f 972/1/951 986/1/965 984/1/963 +f 870/1/849 988/1/966 908/1/887 +f 989/1/967 990/1/968 988/1/966 +f 870/1/849 989/1/967 988/1/966 +f 991/1/969 992/1/970 990/1/968 +f 989/1/967 991/1/969 990/1/968 +f 991/1/969 993/1/971 992/1/970 +f 991/1/969 994/1/972 993/1/971 +f 994/1/972 995/1/973 993/1/971 +f 996/1/974 997/1/975 995/1/973 +f 994/1/972 996/1/974 995/1/973 +f 998/1/976 999/1/977 997/1/975 +f 996/1/974 998/1/976 997/1/975 +f 1000/1/978 876/1/855 902/1/881 +f 1001/1/979 1000/1/978 902/1/881 +f 1002/1/980 1000/1/978 1001/1/979 +f 1003/1/981 1002/1/980 1001/1/979 +f 1004/1/982 1002/1/980 1003/1/981 +f 1005/1/983 1002/1/980 1004/1/982 +f 1006/1/984 1005/1/983 1004/1/982 +f 1007/1/985 1005/1/983 1006/1/984 +f 1008/1/986 1007/1/985 1006/1/984 +f 1009/1/987 1007/1/985 1008/1/986 +f 1010/1/988 1009/1/987 1008/1/986 +f 1011/1/989 1009/1/987 1010/1/988 +f 1012/1/990 1011/1/989 1010/1/988 +f 1013/1/991 1011/1/989 1012/1/990 +f 1014/1/992 1013/1/991 1012/1/990 +f 1000/1/978 870/1/849 876/1/855 +f 989/1/967 870/1/849 1000/1/978 +f 1002/1/980 989/1/967 1000/1/978 +f 991/1/969 989/1/967 1002/1/980 +f 1005/1/983 991/1/969 1002/1/980 +f 1007/1/985 994/1/972 1005/1/983 +f 994/1/972 991/1/969 1005/1/983 +f 1009/1/987 994/1/972 1007/1/985 +f 996/1/974 994/1/972 1009/1/987 +f 1011/1/989 996/1/974 1009/1/987 +f 998/1/976 996/1/974 1011/1/989 +f 1013/1/991 998/1/976 1011/1/989 +f 908/1/887 988/1/966 902/1/881 +f 988/1/966 1001/1/979 902/1/881 +f 988/1/966 990/1/968 1001/1/979 +f 990/1/968 1003/1/981 1001/1/979 +f 990/1/968 1004/1/982 1003/1/981 +f 990/1/968 992/1/970 1004/1/982 +f 992/1/970 1006/1/984 1004/1/982 +f 992/1/970 993/1/971 1006/1/984 +f 993/1/971 1008/1/986 1006/1/984 +f 993/1/971 995/1/973 1008/1/986 +f 995/1/973 1010/1/988 1008/1/986 +f 995/1/973 997/1/975 1010/1/988 +f 997/1/975 1012/1/990 1010/1/988 +f 997/1/975 999/1/977 1012/1/990 +f 999/1/977 1014/1/992 1012/1/990 +f 1017/1/993 1016/1/994 1015/1/995 +f 1017/1/993 1018/1/996 1016/1/994 +f 1019/1/997 1018/1/996 1017/1/993 +f 1019/1/997 1020/1/998 1018/1/996 +f 1021/1/999 1020/1/998 1019/1/997 +f 1021/1/999 1022/1/1000 1020/1/998 +f 1023/1/1001 1022/1/1000 1021/1/999 +f 1023/1/1001 1024/1/1002 1022/1/1000 +f 1023/1/1001 1025/1/1003 1024/1/1002 +f 1026/1/1004 1025/1/1003 1023/1/1001 +f 1027/1/1005 1025/1/1003 1026/1/1004 +f 1027/1/1005 1028/1/1006 1025/1/1003 +f 1029/1/1007 1028/1/1006 1027/1/1005 +f 1029/1/1007 1030/1/1008 1028/1/1006 +f 1031/1/1009 1030/1/1008 1032/1/1010 +f 1030/1/1008 1029/1/1007 1032/1/1010 +f 1033/1/1011 1031/1/1009 1032/1/1010 +f 1034/1/1012 1033/1/1011 1032/1/1010 +f 1035/1/1013 1033/1/1011 1034/1/1012 +f 1035/1/1013 1036/1/1014 1033/1/1011 +f 1035/1/1013 1037/1/1015 1036/1/1014 +f 1038/1/1016 1037/1/1015 1035/1/1013 +f 1038/1/1016 1039/1/1017 1037/1/1015 +f 1040/1/1018 1039/1/1017 1038/1/1016 +f 1040/1/1018 1041/1/1019 1039/1/1017 +f 1042/1/1020 1041/1/1019 1040/1/1018 +f 1042/1/1020 1043/1/1021 1041/1/1019 +f 1044/1/1022 1043/1/1021 1045/1/1023 +f 1043/1/1021 1042/1/1020 1045/1/1023 +f 1046/1/1024 1047/1/1025 1055/1/1026 +f 1056/1/1027 1046/1/1024 1055/1/1026 +f 1046/1/1024 1048/1/1028 1047/1/1025 +f 1046/1/1024 1049/1/1029 1048/1/1028 +f 1049/1/1029 1050/1/1030 1048/1/1028 +f 1049/1/1029 1051/1/1031 1050/1/1030 +f 1051/1/1031 1052/1/1032 1050/1/1030 +f 1044/1/1022 1045/1/1023 1052/1/1032 +f 1051/1/1031 1044/1/1022 1052/1/1032 +f 1053/1/1033 1055/1/1026 1054/1/1034 +f 1056/1/1027 1055/1/1026 1053/1/1033 +f 1071/1/1035 1053/1/1033 1072/1/1036 +f 1053/1/1033 1054/1/1034 1072/1/1036 +f 1057/1/1037 1059/1/1038 1058/1/1039 +f 1059/1/1038 1060/1/1040 1058/1/1039 +f 1059/1/1038 1061/1/1041 1060/1/1040 +f 1061/1/1041 1062/1/1042 1060/1/1040 +f 1063/1/1043 1064/1/1044 1062/1/1042 +f 1061/1/1041 1063/1/1043 1062/1/1042 +f 1065/1/1045 1066/1/1046 1064/1/1044 +f 1063/1/1043 1065/1/1045 1064/1/1044 +f 1065/1/1045 1067/1/1047 1066/1/1046 +f 1065/1/1045 1068/1/1048 1067/1/1047 +f 1069/1/1049 1070/1/1050 1067/1/1047 +f 1068/1/1048 1069/1/1049 1067/1/1047 +f 1071/1/1035 1072/1/1036 1070/1/1050 +f 1069/1/1049 1071/1/1035 1070/1/1050 +f 1054/1/1034 998/1/976 1013/1/991 +f 1072/1/1036 1054/1/1034 1013/1/991 +f 1058/1/1039 1072/1/1036 1013/1/991 +f 1054/1/1034 1055/1/1026 998/1/976 +f 1055/1/1026 1034/1/1012 998/1/976 +f 1034/1/1012 1032/1/1010 998/1/976 +f 1032/1/1010 1015/1/995 998/1/976 +f 1032/1/1010 1017/1/993 1015/1/995 +f 1060/1/1040 1062/1/1042 1058/1/1039 +f 1062/1/1042 1064/1/1044 1058/1/1039 +f 1064/1/1044 1066/1/1046 1058/1/1039 +f 1066/1/1046 1067/1/1047 1058/1/1039 +f 1067/1/1047 1070/1/1050 1058/1/1039 +f 1070/1/1050 1072/1/1036 1058/1/1039 +f 1032/1/1010 1019/1/997 1017/1/993 +f 1032/1/1010 1021/1/999 1019/1/997 +f 1032/1/1010 1023/1/1001 1021/1/999 +f 1032/1/1010 1026/1/1004 1023/1/1001 +f 1032/1/1010 1027/1/1005 1026/1/1004 +f 1032/1/1010 1029/1/1007 1027/1/1005 +f 1045/1/1023 1042/1/1020 1055/1/1026 +f 1042/1/1020 1034/1/1012 1055/1/1026 +f 1047/1/1025 1048/1/1028 1055/1/1026 +f 1048/1/1028 1050/1/1030 1055/1/1026 +f 1050/1/1030 1052/1/1032 1055/1/1026 +f 1052/1/1032 1045/1/1023 1055/1/1026 +f 1042/1/1020 1035/1/1013 1034/1/1012 +f 1042/1/1020 1038/1/1016 1035/1/1013 +f 1042/1/1020 1040/1/1018 1038/1/1016 +f 1057/1/1037 1058/1/1039 1013/1/991 +f 1014/1/992 1057/1/1037 1013/1/991 +f 999/1/977 1031/1/1009 1014/1/992 +f 1031/1/1009 1053/1/1033 1014/1/992 +f 1053/1/1033 1057/1/1037 1014/1/992 +f 1016/1/994 1031/1/1009 999/1/977 +f 1030/1/1008 1031/1/1009 1016/1/994 +f 1053/1/1033 1059/1/1038 1057/1/1037 +f 1018/1/996 1030/1/1008 1016/1/994 +f 1053/1/1033 1061/1/1041 1059/1/1038 +f 1020/1/998 1030/1/1008 1018/1/996 +f 1053/1/1033 1063/1/1043 1061/1/1041 +f 1022/1/1000 1030/1/1008 1020/1/998 +f 1053/1/1033 1065/1/1045 1063/1/1043 +f 1024/1/1002 1030/1/1008 1022/1/1000 +f 1025/1/1003 1030/1/1008 1024/1/1002 +f 1053/1/1033 1068/1/1048 1065/1/1045 +f 1053/1/1033 1069/1/1049 1068/1/1048 +f 1028/1/1006 1030/1/1008 1025/1/1003 +f 1053/1/1033 1071/1/1035 1069/1/1049 +f 1031/1/1009 1056/1/1027 1053/1/1033 +f 1033/1/1011 1056/1/1027 1031/1/1009 +f 1044/1/1022 1056/1/1027 1033/1/1011 +f 1043/1/1021 1044/1/1022 1033/1/1011 +f 1037/1/1015 1039/1/1017 1033/1/1011 +f 1039/1/1017 1041/1/1019 1033/1/1011 +f 1041/1/1019 1043/1/1021 1033/1/1011 +f 1044/1/1022 1051/1/1031 1056/1/1027 +f 1051/1/1031 1046/1/1024 1056/1/1027 +f 1036/1/1014 1037/1/1015 1033/1/1011 +f 1051/1/1031 1049/1/1029 1046/1/1024 +f 1015/1/995 999/1/977 998/1/976 +f 1015/1/995 1016/1/994 999/1/977 +f 941/1/919 848/1/827 847/1/826 +f 938/1/917 848/1/827 941/1/919 +f 942/1/920 938/1/917 941/1/919 +f 939/1/918 938/1/917 942/1/920 +f 943/1/921 939/1/918 942/1/920 +f 944/1/922 939/1/918 943/1/921 +f 940/1/837 939/1/918 944/1/922 +f 945/1/923 940/1/837 944/1/922 +f 859/1/838 940/1/837 945/1/923 +f 1073/1/1051 1074/1/1052 1075/1/1051 +f 1074/1/1052 1076/1/1052 1075/1/1051 +f 1076/1/1052 1077/1/1053 1075/1/1051 +f 1078/1/1054 1079/1/1055 1073/1/1051 +f 1079/1/1055 1074/1/1052 1073/1/1051 +f 1076/1/1052 1080/1/1056 1077/1/1053 +f 1081/1/1057 1082/1/1058 1083/1/1059 +f 1084/1/1060 1082/1/1058 1081/1/1057 +f 1084/1/1060 1085/1/1061 1082/1/1058 +f 1086/1/1062 1085/1/1061 1084/1/1060 +f 1077/1/1053 1083/1/1059 1075/1/1051 +f 1081/1/1057 1083/1/1059 1077/1/1053 +f 1085/1/1061 1087/1/1061 1082/1/1058 +f 1087/1/1061 1088/1/1063 1082/1/1058 +f 1083/1/1059 1089/1/1064 1075/1/1051 +f 1089/1/1064 1073/1/1051 1075/1/1051 +f 1090/1/1065 1086/1/1062 1084/1/1060 +f 1091/1/1066 1086/1/1062 1090/1/1065 +f 1092/1/1067 1081/1/1057 1080/1/1056 +f 1081/1/1057 1077/1/1053 1080/1/1056 +f 1088/1/1063 1093/1/1068 1089/1/1064 +f 1093/1/1068 1094/1/1069 1089/1/1064 +f 1087/1/1061 1095/1/1070 1088/1/1063 +f 1095/1/1070 1093/1/1068 1088/1/1063 +f 1089/1/1064 1094/1/1069 1073/1/1051 +f 1094/1/1069 1078/1/1054 1073/1/1051 +f 1096/1/1071 1090/1/1065 1092/1/1067 +f 1097/1/1072 1090/1/1065 1096/1/1071 +f 1097/1/1072 1091/1/1066 1090/1/1065 +f 1098/1/1073 1091/1/1066 1097/1/1072 +f 1096/1/1071 1092/1/1067 1076/1/1052 +f 1092/1/1067 1080/1/1056 1076/1/1052 +f 1095/1/1070 1099/1/1074 1093/1/1068 +f 1099/1/1074 1100/1/1075 1093/1/1068 +f 1078/1/1054 1101/1/1076 1079/1/1055 +f 1094/1/1069 1101/1/1076 1078/1/1054 +f 1102/1/1077 1098/1/1073 1097/1/1072 +f 1103/1/1073 1098/1/1073 1102/1/1077 +f 1104/1/1078 1096/1/1071 1074/1/1052 +f 1096/1/1071 1076/1/1052 1074/1/1052 +f 1100/1/1075 1104/1/1078 1101/1/1076 +f 1100/1/1075 1102/1/1077 1104/1/1078 +f 1099/1/1074 1102/1/1077 1100/1/1075 +f 1099/1/1074 1103/1/1073 1102/1/1077 +f 1101/1/1076 1104/1/1078 1074/1/1052 +f 1079/1/1055 1101/1/1076 1074/1/1052 +f 1086/1/1062 1091/1/1066 1085/1/1061 +f 1091/1/1066 1098/1/1073 1085/1/1061 +f 1098/1/1073 1087/1/1061 1085/1/1061 +f 1098/1/1073 1103/1/1073 1087/1/1061 +f 1103/1/1073 1095/1/1070 1087/1/1061 +f 1103/1/1073 1099/1/1074 1095/1/1070 +f 1082/1/1058 1088/1/1063 1083/1/1059 +f 1088/1/1063 1089/1/1064 1083/1/1059 +f 1093/1/1068 1100/1/1075 1094/1/1069 +f 1100/1/1075 1101/1/1076 1094/1/1069 +f 1104/1/1078 1097/1/1072 1096/1/1071 +f 1102/1/1077 1097/1/1072 1104/1/1078 +f 1092/1/1067 1084/1/1060 1081/1/1057 +f 1090/1/1065 1084/1/1060 1092/1/1067 +f 1107/1/1079 1106/1/1080 1105/1/1081 +f 1182/1/1082 1108/1/1083 1192/1/1084 +f 1108/1/1083 1109/1/1085 1192/1/1084 +f 1112/1/1086 1110/1/1087 1111/1/1088 +f 1113/1/1089 1112/1/1086 1111/1/1088 +f 1114/1/1090 1112/1/1086 1113/1/1089 +f 1115/1/1091 1114/1/1090 1113/1/1089 +f 1115/1/1091 1116/1/1092 1114/1/1090 +f 1116/1/1092 1117/1/1093 1114/1/1090 +f 1118/1/1094 1120/1/1095 1119/1/1096 +f 1118/1/1094 1121/1/1097 1120/1/1095 +f 1121/1/1097 1122/1/1098 1120/1/1095 +f 1123/1/1099 1122/1/1098 1121/1/1097 +f 1118/1/1094 1119/1/1096 1109/1/1085 +f 1108/1/1083 1118/1/1094 1109/1/1085 +f 1116/1/1092 1124/1/1100 1117/1/1093 +f 1124/1/1100 1125/1/1101 1117/1/1093 +f 1124/1/1100 1126/1/1102 1125/1/1101 +f 1125/1/1101 1134/1/1103 1135/1/1104 +f 1125/1/1101 1126/1/1102 1134/1/1103 +f 1129/1/1105 1128/1/1106 1127/1/1107 +f 1130/1/1108 1129/1/1105 1127/1/1107 +f 1131/1/1109 1129/1/1105 1130/1/1108 +f 1132/1/1110 1131/1/1109 1130/1/1108 +f 1133/1/1111 1132/1/1110 1130/1/1108 +f 1136/1/1112 1137/1/1113 1135/1/1104 +f 1134/1/1103 1136/1/1112 1135/1/1104 +f 1138/1/1114 1132/1/1110 1139/1/1115 +f 1132/1/1110 1133/1/1111 1139/1/1115 +f 1137/1/1113 1139/1/1115 1135/1/1104 +f 1140/1/1116 1141/1/1117 1139/1/1115 +f 1142/1/1118 1140/1/1116 1139/1/1115 +f 1137/1/1113 1142/1/1118 1139/1/1115 +f 1140/1/1116 1143/1/1119 1141/1/1117 +f 1143/1/1119 1144/1/1120 1141/1/1117 +f 1146/1/1121 1142/1/1118 1137/1/1113 +f 1145/1/1122 1146/1/1121 1137/1/1113 +f 1133/1/1111 1125/1/1101 1135/1/1104 +f 1139/1/1115 1133/1/1111 1135/1/1104 +f 1130/1/1108 1127/1/1107 1117/1/1093 +f 1125/1/1101 1130/1/1108 1117/1/1093 +f 1133/1/1111 1130/1/1108 1125/1/1101 +f 1117/1/1093 1123/1/1099 1114/1/1090 +f 1117/1/1093 1127/1/1107 1123/1/1099 +f 1112/1/1086 1118/1/1094 1110/1/1087 +f 1121/1/1097 1118/1/1094 1112/1/1086 +f 1114/1/1090 1121/1/1097 1112/1/1086 +f 1123/1/1099 1121/1/1097 1114/1/1090 +f 1110/1/1087 1107/1/1079 1148/1/1123 +f 1107/1/1079 1147/1/1124 1148/1/1123 +f 1147/1/1124 1151/1/1125 1148/1/1123 +f 1150/1/1126 1149/1/1127 1148/1/1123 +f 1151/1/1125 1153/1/1128 1148/1/1123 +f 1149/1/1127 1154/1/1129 1148/1/1123 +f 1154/1/1129 1169/1/1130 1148/1/1123 +f 1153/1/1128 1152/1/1131 1148/1/1123 +f 1152/1/1131 1150/1/1126 1148/1/1123 +f 1118/1/1094 1108/1/1083 1110/1/1087 +f 1108/1/1083 1107/1/1079 1110/1/1087 +f 1169/1/1130 1155/1/1132 1148/1/1123 +f 1169/1/1130 1156/1/1133 1155/1/1132 +f 1169/1/1130 1157/1/1134 1156/1/1133 +f 1169/1/1130 1158/1/1135 1157/1/1134 +f 1158/1/1135 1159/1/1136 1157/1/1134 +f 1159/1/1136 1160/1/1137 1157/1/1134 +f 1160/1/1137 1161/1/1138 1157/1/1134 +f 1161/1/1138 1162/1/1139 1157/1/1134 +f 1163/1/1140 1169/1/1130 1154/1/1129 +f 1147/1/1124 1164/1/1141 1151/1/1125 +f 1147/1/1124 1165/1/1142 1164/1/1141 +f 1166/1/1143 1169/1/1130 1163/1/1140 +f 1167/1/1144 1169/1/1130 1166/1/1143 +f 1147/1/1124 1168/1/1145 1165/1/1142 +f 1170/1/1146 1171/1/1147 1167/1/1144 +f 1171/1/1147 1169/1/1130 1167/1/1144 +f 1147/1/1124 1172/1/1148 1168/1/1145 +f 1172/1/1148 1173/1/1149 1168/1/1145 +f 1174/1/1150 1171/1/1147 1170/1/1146 +f 1172/1/1148 1175/1/1151 1173/1/1149 +f 1176/1/1152 1174/1/1150 1170/1/1146 +f 1178/1/1153 1174/1/1150 1176/1/1152 +f 1175/1/1151 1176/1/1152 1173/1/1149 +f 1175/1/1151 1177/1/1154 1176/1/1152 +f 1177/1/1154 1178/1/1153 1176/1/1152 +f 1107/1/1079 1108/1/1083 1106/1/1080 +f 1185/1/1155 1179/1/1156 1180/1/1157 +f 1182/1/1082 1181/1/1158 1179/1/1156 +f 1185/1/1155 1182/1/1082 1179/1/1156 +f 1181/1/1158 1183/1/1159 1179/1/1156 +f 1184/1/1160 1185/1/1155 1180/1/1157 +f 1186/1/1161 1185/1/1155 1184/1/1160 +f 1106/1/1080 1108/1/1083 1185/1/1155 +f 1108/1/1083 1182/1/1082 1185/1/1155 +f 1180/1/1157 1179/1/1156 1187/1/1162 +f 1179/1/1156 1188/1/1163 1187/1/1162 +f 1192/1/1084 1193/1/1164 1187/1/1162 +f 1188/1/1163 1192/1/1084 1187/1/1162 +f 1193/1/1164 1189/1/1165 1187/1/1162 +f 1190/1/1166 1191/1/1167 1188/1/1163 +f 1191/1/1167 1192/1/1084 1188/1/1163 +f 1193/1/1164 1194/1/1168 1189/1/1165 +f 1192/1/1084 1105/1/1081 1193/1/1164 +f 1109/1/1085 1105/1/1081 1192/1/1084 +f 1195/1/1169 1196/1/1170 1197/1/1171 +f 1198/1/1172 1195/1/1169 1197/1/1171 +f 1195/1/1169 1199/1/1173 1196/1/1170 +f 1200/1/1174 1198/1/1172 1197/1/1171 +f 1195/1/1169 1201/1/1175 1199/1/1173 +f 1202/1/1176 1198/1/1172 1200/1/1174 +f 1203/1/1177 1202/1/1176 1200/1/1174 +f 1195/1/1169 1204/1/1178 1201/1/1175 +f 1204/1/1178 1205/1/1179 1201/1/1175 +f 1206/1/1180 1202/1/1176 1203/1/1177 +f 1204/1/1178 1207/1/1181 1205/1/1179 +f 1208/1/1182 1202/1/1176 1206/1/1180 +f 1209/1/1183 1210/1/1184 1206/1/1180 +f 1210/1/1184 1208/1/1182 1206/1/1180 +f 1207/1/1181 1211/1/1185 1205/1/1179 +f 1213/1/1186 1212/1/1187 1205/1/1179 +f 1211/1/1185 1213/1/1186 1205/1/1179 +f 1212/1/1187 1209/1/1183 1206/1/1180 +f 1212/1/1187 1214/1/1188 1205/1/1179 +f 1111/1/1088 1212/1/1187 1206/1/1180 +f 1214/1/1188 1215/1/1189 1205/1/1179 +f 1119/1/1096 1111/1/1088 1206/1/1180 +f 1205/1/1179 1216/1/1190 1217/1/1191 +f 1215/1/1189 1216/1/1190 1205/1/1179 +f 1105/1/1081 1119/1/1096 1206/1/1180 +f 1109/1/1085 1119/1/1096 1105/1/1081 +f 1216/1/1190 1218/1/1192 1217/1/1191 +f 1216/1/1190 1219/1/1193 1218/1/1192 +f 1216/1/1190 1220/1/1194 1219/1/1193 +f 1216/1/1190 1221/1/1195 1220/1/1194 +f 1222/1/1196 1212/1/1187 1213/1/1186 +f 1212/1/1187 1223/1/1197 1209/1/1183 +f 1224/1/1198 1212/1/1187 1222/1/1196 +f 1212/1/1187 1225/1/1199 1223/1/1197 +f 1225/1/1199 1212/1/1187 1224/1/1198 +f 1119/1/1096 1113/1/1089 1111/1/1088 +f 1119/1/1096 1120/1/1095 1113/1/1089 +f 1120/1/1095 1115/1/1091 1113/1/1089 +f 1120/1/1095 1122/1/1098 1115/1/1091 +f 1128/1/1106 1116/1/1092 1115/1/1091 +f 1122/1/1098 1128/1/1106 1115/1/1091 +f 1128/1/1106 1129/1/1105 1116/1/1092 +f 1129/1/1105 1131/1/1109 1116/1/1092 +f 1131/1/1109 1124/1/1100 1116/1/1092 +f 1131/1/1109 1132/1/1110 1124/1/1100 +f 1132/1/1110 1126/1/1102 1124/1/1100 +f 1126/1/1102 1138/1/1114 1134/1/1103 +f 1126/1/1102 1132/1/1110 1138/1/1114 +f 1138/1/1114 1228/1/1200 1134/1/1103 +f 1228/1/1200 1226/1/1201 1134/1/1103 +f 1226/1/1201 1136/1/1112 1134/1/1103 +f 1227/1/1202 1228/1/1200 1138/1/1114 +f 1229/1/1203 1230/1/1204 1227/1/1202 +f 1230/1/1204 1228/1/1200 1227/1/1202 +f 1226/1/1201 1231/1/1205 1136/1/1112 +f 1226/1/1201 1232/1/1206 1231/1/1205 +f 1226/1/1201 1228/1/1200 1142/1/1118 +f 1228/1/1200 1140/1/1116 1142/1/1118 +f 1105/1/1081 1185/1/1155 1193/1/1164 +f 1105/1/1081 1106/1/1080 1185/1/1155 +f 1141/1/1117 1138/1/1114 1139/1/1115 +f 1141/1/1117 1227/1/1202 1138/1/1114 +f 1196/1/1170 1178/1/1153 1197/1/1171 +f 1178/1/1153 1177/1/1154 1197/1/1171 +f 1199/1/1173 1178/1/1153 1196/1/1170 +f 1177/1/1154 1175/1/1151 1197/1/1171 +f 1175/1/1151 1200/1/1174 1197/1/1171 +f 1174/1/1150 1178/1/1153 1199/1/1173 +f 1201/1/1175 1174/1/1150 1199/1/1173 +f 1175/1/1151 1172/1/1148 1200/1/1174 +f 1172/1/1148 1203/1/1177 1200/1/1174 +f 1171/1/1147 1174/1/1150 1201/1/1175 +f 1205/1/1179 1171/1/1147 1201/1/1175 +f 1172/1/1148 1147/1/1124 1203/1/1177 +f 1147/1/1124 1206/1/1180 1203/1/1177 +f 1169/1/1130 1171/1/1147 1205/1/1179 +f 1158/1/1135 1169/1/1130 1217/1/1191 +f 1169/1/1130 1205/1/1179 1217/1/1191 +f 1218/1/1192 1158/1/1135 1217/1/1191 +f 1159/1/1136 1158/1/1135 1218/1/1192 +f 1219/1/1193 1159/1/1136 1218/1/1192 +f 1160/1/1137 1159/1/1136 1219/1/1193 +f 1220/1/1194 1160/1/1137 1219/1/1193 +f 1161/1/1138 1160/1/1137 1220/1/1194 +f 1221/1/1195 1161/1/1138 1220/1/1194 +f 1162/1/1139 1161/1/1138 1221/1/1195 +f 1216/1/1190 1162/1/1139 1221/1/1195 +f 1157/1/1134 1162/1/1139 1216/1/1190 +f 1215/1/1189 1157/1/1134 1216/1/1190 +f 1156/1/1133 1157/1/1134 1215/1/1189 +f 1214/1/1188 1156/1/1133 1215/1/1189 +f 1155/1/1132 1156/1/1133 1214/1/1188 +f 1212/1/1187 1155/1/1132 1214/1/1188 +f 1148/1/1123 1155/1/1132 1212/1/1187 +f 1111/1/1088 1148/1/1123 1212/1/1187 +f 1110/1/1087 1148/1/1123 1111/1/1088 +f 1147/1/1124 1107/1/1079 1206/1/1180 +f 1107/1/1079 1105/1/1081 1206/1/1180 +f 1198/1/1172 1176/1/1152 1195/1/1169 +f 1173/1/1149 1176/1/1152 1198/1/1172 +f 1176/1/1152 1170/1/1146 1195/1/1169 +f 1202/1/1176 1173/1/1149 1198/1/1172 +f 1170/1/1146 1204/1/1178 1195/1/1169 +f 1168/1/1145 1173/1/1149 1202/1/1176 +f 1170/1/1146 1167/1/1144 1204/1/1178 +f 1167/1/1144 1207/1/1181 1204/1/1178 +f 1165/1/1142 1168/1/1145 1202/1/1176 +f 1208/1/1182 1165/1/1142 1202/1/1176 +f 1167/1/1144 1166/1/1143 1207/1/1181 +f 1166/1/1143 1211/1/1185 1207/1/1181 +f 1166/1/1143 1163/1/1140 1211/1/1185 +f 1210/1/1184 1164/1/1141 1208/1/1182 +f 1164/1/1141 1165/1/1142 1208/1/1182 +f 1163/1/1140 1213/1/1186 1211/1/1185 +f 1209/1/1183 1151/1/1125 1210/1/1184 +f 1151/1/1125 1164/1/1141 1210/1/1184 +f 1163/1/1140 1154/1/1129 1213/1/1186 +f 1154/1/1129 1222/1/1196 1213/1/1186 +f 1223/1/1197 1153/1/1128 1209/1/1183 +f 1153/1/1128 1151/1/1125 1209/1/1183 +f 1154/1/1129 1149/1/1127 1222/1/1196 +f 1149/1/1127 1224/1/1198 1222/1/1196 +f 1225/1/1199 1152/1/1131 1223/1/1197 +f 1152/1/1131 1153/1/1128 1223/1/1197 +f 1149/1/1127 1150/1/1126 1224/1/1198 +f 1150/1/1126 1225/1/1199 1224/1/1198 +f 1150/1/1126 1152/1/1131 1225/1/1199 +f 1233/1/1207 1122/1/1098 1123/1/1099 +f 1234/1/1208 1233/1/1207 1123/1/1099 +f 1235/1/1209 1236/1/1210 1127/1/1107 +f 1128/1/1106 1235/1/1209 1127/1/1107 +f 1127/1/1107 1236/1/1210 1123/1/1099 +f 1236/1/1210 1234/1/1208 1123/1/1099 +f 1233/1/1207 1235/1/1209 1122/1/1098 +f 1235/1/1209 1128/1/1106 1122/1/1098 +f 1237/1/1211 1238/1/1212 1236/1/1210 +f 1235/1/1209 1237/1/1211 1236/1/1210 +f 1239/1/1213 1233/1/1207 1234/1/1208 +f 1239/1/1213 1240/1/1214 1233/1/1207 +f 1236/1/1210 1239/1/1213 1234/1/1208 +f 1241/1/1215 1242/1/1216 1239/1/1213 +f 1236/1/1210 1238/1/1212 1239/1/1213 +f 1238/1/1212 1241/1/1215 1239/1/1213 +f 1242/1/1216 1243/1/1217 1239/1/1213 +f 1238/1/1212 1244/1/1218 1241/1/1215 +f 1244/1/1218 1245/1/1219 1241/1/1215 +f 1237/1/1211 1235/1/1209 1233/1/1207 +f 1240/1/1214 1237/1/1211 1233/1/1207 +f 1248/1/1220 1237/1/1211 1240/1/1214 +f 1246/1/1221 1248/1/1220 1240/1/1214 +f 1247/1/1222 1248/1/1220 1246/1/1221 +f 1249/1/1223 1237/1/1211 1248/1/1220 +f 1250/1/1224 1237/1/1211 1249/1/1223 +f 1251/1/1225 1237/1/1211 1250/1/1224 +f 1241/1/1215 1248/1/1220 1242/1/1216 +f 1241/1/1215 1249/1/1223 1248/1/1220 +f 1239/1/1213 1246/1/1221 1240/1/1214 +f 1243/1/1217 1246/1/1221 1239/1/1213 +f 1243/1/1217 1247/1/1222 1246/1/1221 +f 1242/1/1216 1247/1/1222 1243/1/1217 +f 1242/1/1216 1248/1/1220 1247/1/1222 +f 1245/1/1219 1249/1/1223 1241/1/1215 +f 1245/1/1219 1250/1/1224 1249/1/1223 +f 1244/1/1218 1250/1/1224 1245/1/1219 +f 1244/1/1218 1251/1/1225 1250/1/1224 +f 1238/1/1212 1251/1/1225 1244/1/1218 +f 1238/1/1212 1237/1/1211 1251/1/1225 +f 1136/1/1112 1231/1/1205 1137/1/1113 +f 1231/1/1205 1145/1/1122 1137/1/1113 +f 1231/1/1205 1232/1/1206 1145/1/1122 +f 1232/1/1206 1146/1/1121 1145/1/1122 +f 1232/1/1206 1226/1/1201 1146/1/1121 +f 1226/1/1201 1142/1/1118 1146/1/1121 +f 1189/1/1165 1180/1/1157 1187/1/1162 +f 1184/1/1160 1180/1/1157 1189/1/1165 +f 1194/1/1168 1184/1/1160 1189/1/1165 +f 1186/1/1161 1184/1/1160 1194/1/1168 +f 1193/1/1164 1186/1/1161 1194/1/1168 +f 1185/1/1155 1186/1/1161 1193/1/1164 +f 1179/1/1156 1183/1/1159 1188/1/1163 +f 1183/1/1159 1190/1/1166 1188/1/1163 +f 1183/1/1159 1181/1/1158 1190/1/1166 +f 1181/1/1158 1191/1/1167 1190/1/1166 +f 1181/1/1158 1182/1/1082 1191/1/1167 +f 1182/1/1082 1192/1/1084 1191/1/1167 +f 1144/1/1120 1227/1/1202 1141/1/1117 +f 1229/1/1203 1227/1/1202 1144/1/1120 +f 1143/1/1119 1229/1/1203 1144/1/1120 +f 1230/1/1204 1229/1/1203 1143/1/1119 +f 1140/1/1116 1230/1/1204 1143/1/1119 +f 1228/1/1200 1230/1/1204 1140/1/1116 +f 1252/1/1226 1254/1/1227 1253/1/1228 +f 1255/1/1229 1328/1/1230 1257/1/1231 +f 1255/1/1229 1256/1/1232 1328/1/1230 +f 1258/1/1233 1260/1/1234 1259/1/1235 +f 1258/1/1233 1261/1/1236 1260/1/1234 +f 1261/1/1236 1262/1/1237 1260/1/1234 +f 1263/1/1238 1262/1/1237 1261/1/1236 +f 1263/1/1238 1264/1/1239 1262/1/1237 +f 1267/1/1240 1265/1/1241 1266/1/1242 +f 1268/1/1243 1267/1/1240 1266/1/1242 +f 1269/1/1244 1267/1/1240 1268/1/1243 +f 1270/1/1245 1267/1/1240 1269/1/1244 +f 1266/1/1242 1256/1/1232 1255/1/1229 +f 1265/1/1241 1256/1/1232 1266/1/1242 +f 1271/1/1246 1264/1/1239 1263/1/1238 +f 1272/1/1247 1271/1/1246 1263/1/1238 +f 1273/1/1248 1271/1/1246 1272/1/1247 +f 1281/1/1249 1273/1/1248 1282/1/1250 +f 1273/1/1248 1272/1/1247 1282/1/1250 +f 1274/1/1251 1275/1/1252 1276/1/1253 +f 1274/1/1251 1277/1/1254 1275/1/1252 +f 1277/1/1254 1278/1/1255 1275/1/1252 +f 1278/1/1255 1279/1/1256 1275/1/1252 +f 1278/1/1255 1280/1/1257 1279/1/1256 +f 1283/1/1258 1281/1/1249 1282/1/1250 +f 1283/1/1258 1284/1/1259 1281/1/1249 +f 1285/1/1260 1286/1/1261 1287/1/1262 +f 1279/1/1256 1285/1/1260 1287/1/1262 +f 1279/1/1256 1280/1/1257 1285/1/1260 +f 1288/1/1263 1289/1/1264 1286/1/1261 +f 1289/1/1264 1282/1/1250 1286/1/1261 +f 1289/1/1264 1294/1/1265 1282/1/1250 +f 1294/1/1265 1283/1/1258 1282/1/1250 +f 1294/1/1265 1290/1/1266 1283/1/1258 +f 1291/1/1267 1289/1/1264 1288/1/1263 +f 1292/1/1268 1289/1/1264 1291/1/1267 +f 1294/1/1265 1293/1/1269 1290/1/1266 +f 1286/1/1261 1282/1/1250 1287/1/1262 +f 1282/1/1250 1272/1/1247 1287/1/1262 +f 1272/1/1247 1279/1/1256 1287/1/1262 +f 1275/1/1252 1263/1/1238 1276/1/1253 +f 1272/1/1247 1263/1/1238 1275/1/1252 +f 1279/1/1256 1272/1/1247 1275/1/1252 +f 1276/1/1253 1261/1/1236 1270/1/1245 +f 1276/1/1253 1263/1/1238 1261/1/1236 +f 1267/1/1240 1258/1/1233 1265/1/1241 +f 1261/1/1236 1258/1/1233 1267/1/1240 +f 1270/1/1245 1261/1/1236 1267/1/1240 +f 1258/1/1233 1295/1/1270 1265/1/1241 +f 1295/1/1270 1254/1/1227 1265/1/1241 +f 1254/1/1227 1256/1/1232 1265/1/1241 +f 1296/1/1271 1295/1/1270 1258/1/1233 +f 1297/1/1272 1299/1/1273 1296/1/1271 +f 1298/1/1274 1295/1/1270 1296/1/1271 +f 1301/1/1275 1302/1/1276 1296/1/1271 +f 1299/1/1273 1300/1/1277 1296/1/1271 +f 1300/1/1277 1303/1/1278 1296/1/1271 +f 1303/1/1278 1298/1/1274 1296/1/1271 +f 1302/1/1276 1297/1/1272 1296/1/1271 +f 1304/1/1279 1301/1/1275 1296/1/1271 +f 1305/1/1280 1301/1/1275 1304/1/1279 +f 1306/1/1281 1301/1/1275 1305/1/1280 +f 1312/1/1282 1301/1/1275 1306/1/1281 +f 1308/1/1283 1309/1/1284 1306/1/1281 +f 1309/1/1284 1310/1/1285 1306/1/1281 +f 1310/1/1285 1307/1/1286 1306/1/1281 +f 1307/1/1286 1312/1/1282 1306/1/1281 +f 1311/1/1287 1308/1/1283 1306/1/1281 +f 1301/1/1275 1313/1/1288 1302/1/1276 +f 1314/1/1289 1295/1/1270 1298/1/1274 +f 1315/1/1290 1295/1/1270 1314/1/1289 +f 1301/1/1275 1316/1/1291 1313/1/1288 +f 1317/1/1292 1295/1/1270 1315/1/1290 +f 1301/1/1275 1318/1/1293 1316/1/1291 +f 1319/1/1294 1295/1/1270 1317/1/1292 +f 1320/1/1295 1295/1/1270 1319/1/1294 +f 1301/1/1275 1321/1/1296 1318/1/1293 +f 1323/1/1297 1320/1/1295 1319/1/1294 +f 1322/1/1298 1323/1/1297 1319/1/1294 +f 1301/1/1275 1324/1/1299 1322/1/1298 +f 1324/1/1299 1325/1/1300 1322/1/1298 +f 1325/1/1300 1326/1/1301 1322/1/1298 +f 1327/1/1302 1323/1/1297 1322/1/1298 +f 1326/1/1301 1327/1/1302 1322/1/1298 +f 1301/1/1275 1322/1/1298 1321/1/1296 +f 1256/1/1232 1254/1/1227 1252/1/1226 +f 1328/1/1230 1330/1/1303 1329/1/1304 +f 1331/1/1305 1328/1/1230 1329/1/1304 +f 1332/1/1306 1333/1/1307 1330/1/1303 +f 1328/1/1230 1332/1/1306 1330/1/1303 +f 1334/1/1308 1331/1/1305 1329/1/1304 +f 1333/1/1307 1335/1/1309 1330/1/1303 +f 1256/1/1232 1252/1/1226 1328/1/1230 +f 1252/1/1226 1332/1/1306 1328/1/1230 +f 1329/1/1304 1330/1/1303 1336/1/1310 +f 1330/1/1303 1337/1/1311 1336/1/1310 +f 1337/1/1311 1253/1/1228 1336/1/1310 +f 1253/1/1228 1257/1/1231 1336/1/1310 +f 1339/1/1312 1253/1/1228 1337/1/1311 +f 1338/1/1313 1339/1/1312 1337/1/1311 +f 1340/1/1314 1338/1/1313 1337/1/1311 +f 1257/1/1231 1341/1/1315 1336/1/1310 +f 1253/1/1228 1255/1/1229 1257/1/1231 +f 1342/1/1316 1344/1/1317 1343/1/1318 +f 1342/1/1316 1345/1/1319 1344/1/1317 +f 1345/1/1319 1346/1/1320 1344/1/1317 +f 1347/1/1321 1342/1/1316 1343/1/1318 +f 1348/1/1322 1347/1/1321 1343/1/1318 +f 1345/1/1319 1349/1/1323 1346/1/1320 +f 1350/1/1324 1347/1/1321 1348/1/1322 +f 1345/1/1319 1351/1/1325 1349/1/1323 +f 1351/1/1325 1352/1/1326 1349/1/1323 +f 1353/1/1327 1347/1/1321 1350/1/1324 +f 1356/1/1328 1347/1/1321 1353/1/1327 +f 1355/1/1329 1354/1/1330 1353/1/1327 +f 1354/1/1330 1356/1/1328 1353/1/1327 +f 1357/1/1331 1355/1/1329 1353/1/1327 +f 1351/1/1325 1358/1/1332 1352/1/1326 +f 1360/1/1333 1359/1/1334 1352/1/1326 +f 1359/1/1334 1357/1/1331 1352/1/1326 +f 1358/1/1332 1360/1/1333 1352/1/1326 +f 1361/1/1335 1357/1/1331 1353/1/1327 +f 1362/1/1336 1361/1/1335 1353/1/1327 +f 1259/1/1235 1266/1/1242 1255/1/1229 +f 1253/1/1228 1259/1/1235 1255/1/1229 +f 1357/1/1331 1259/1/1235 1253/1/1228 +f 1352/1/1326 1357/1/1331 1253/1/1228 +f 1363/1/1337 1362/1/1336 1353/1/1327 +f 1364/1/1338 1363/1/1337 1353/1/1327 +f 1365/1/1339 1363/1/1337 1364/1/1338 +f 1366/1/1340 1363/1/1337 1365/1/1339 +f 1367/1/1341 1363/1/1337 1366/1/1340 +f 1368/1/1342 1363/1/1337 1367/1/1341 +f 1369/1/1343 1357/1/1331 1359/1/1334 +f 1357/1/1331 1370/1/1344 1355/1/1329 +f 1371/1/1345 1357/1/1331 1369/1/1343 +f 1357/1/1331 1372/1/1346 1370/1/1344 +f 1357/1/1331 1373/1/1347 1372/1/1346 +f 1373/1/1347 1357/1/1331 1371/1/1345 +f 1374/1/1348 1363/1/1337 1368/1/1342 +f 1259/1/1235 1260/1/1234 1266/1/1242 +f 1260/1/1234 1268/1/1243 1266/1/1242 +f 1260/1/1234 1262/1/1237 1268/1/1243 +f 1262/1/1237 1269/1/1244 1268/1/1243 +f 1262/1/1237 1264/1/1239 1269/1/1244 +f 1264/1/1239 1274/1/1251 1269/1/1244 +f 1264/1/1239 1277/1/1254 1274/1/1251 +f 1271/1/1246 1278/1/1255 1277/1/1254 +f 1264/1/1239 1271/1/1246 1277/1/1254 +f 1273/1/1248 1280/1/1257 1278/1/1255 +f 1271/1/1246 1273/1/1248 1278/1/1255 +f 1280/1/1257 1281/1/1249 1285/1/1260 +f 1280/1/1257 1273/1/1248 1281/1/1249 +f 1281/1/1249 1375/1/1349 1285/1/1260 +f 1284/1/1259 1375/1/1349 1281/1/1249 +f 1379/1/1350 1376/1/1351 1375/1/1349 +f 1284/1/1259 1379/1/1350 1375/1/1349 +f 1377/1/1352 1379/1/1350 1284/1/1259 +f 1376/1/1351 1378/1/1353 1375/1/1349 +f 1380/1/1354 1379/1/1350 1377/1/1352 +f 1376/1/1351 1381/1/1355 1378/1/1353 +f 1376/1/1351 1379/1/1350 1289/1/1264 +f 1379/1/1350 1294/1/1265 1289/1/1264 +f 1252/1/1226 1253/1/1228 1339/1/1312 +f 1332/1/1306 1252/1/1226 1339/1/1312 +f 1285/1/1260 1375/1/1349 1286/1/1261 +f 1375/1/1349 1288/1/1263 1286/1/1261 +f 1344/1/1317 1327/1/1302 1343/1/1318 +f 1327/1/1302 1326/1/1301 1343/1/1318 +f 1346/1/1320 1327/1/1302 1344/1/1317 +f 1326/1/1301 1325/1/1300 1343/1/1318 +f 1325/1/1300 1348/1/1322 1343/1/1318 +f 1323/1/1297 1327/1/1302 1346/1/1320 +f 1349/1/1323 1323/1/1297 1346/1/1320 +f 1325/1/1300 1324/1/1299 1348/1/1322 +f 1324/1/1299 1350/1/1324 1348/1/1322 +f 1320/1/1295 1323/1/1297 1349/1/1323 +f 1352/1/1326 1320/1/1295 1349/1/1323 +f 1324/1/1299 1353/1/1327 1350/1/1324 +f 1295/1/1270 1320/1/1295 1352/1/1326 +f 1324/1/1299 1301/1/1275 1353/1/1327 +f 1301/1/1275 1312/1/1282 1353/1/1327 +f 1312/1/1282 1364/1/1338 1353/1/1327 +f 1312/1/1282 1307/1/1286 1364/1/1338 +f 1307/1/1286 1365/1/1339 1364/1/1338 +f 1307/1/1286 1310/1/1285 1365/1/1339 +f 1310/1/1285 1366/1/1340 1365/1/1339 +f 1310/1/1285 1309/1/1284 1366/1/1340 +f 1309/1/1284 1367/1/1341 1366/1/1340 +f 1309/1/1284 1308/1/1283 1367/1/1341 +f 1308/1/1283 1368/1/1342 1367/1/1341 +f 1308/1/1283 1311/1/1287 1368/1/1342 +f 1311/1/1287 1374/1/1348 1368/1/1342 +f 1311/1/1287 1306/1/1281 1374/1/1348 +f 1306/1/1281 1363/1/1337 1374/1/1348 +f 1306/1/1281 1305/1/1280 1363/1/1337 +f 1305/1/1280 1362/1/1336 1363/1/1337 +f 1305/1/1280 1304/1/1279 1362/1/1336 +f 1304/1/1279 1361/1/1335 1362/1/1336 +f 1304/1/1279 1296/1/1271 1361/1/1335 +f 1296/1/1271 1357/1/1331 1361/1/1335 +f 1357/1/1331 1258/1/1233 1259/1/1235 +f 1296/1/1271 1258/1/1233 1357/1/1331 +f 1254/1/1227 1295/1/1270 1253/1/1228 +f 1295/1/1270 1352/1/1326 1253/1/1228 +f 1322/1/1298 1345/1/1319 1342/1/1316 +f 1347/1/1321 1321/1/1296 1342/1/1316 +f 1321/1/1296 1322/1/1298 1342/1/1316 +f 1322/1/1298 1319/1/1294 1345/1/1319 +f 1319/1/1294 1351/1/1325 1345/1/1319 +f 1318/1/1293 1321/1/1296 1347/1/1321 +f 1356/1/1328 1318/1/1293 1347/1/1321 +f 1319/1/1294 1317/1/1292 1351/1/1325 +f 1317/1/1292 1358/1/1332 1351/1/1325 +f 1316/1/1291 1318/1/1293 1356/1/1328 +f 1354/1/1330 1316/1/1291 1356/1/1328 +f 1317/1/1292 1315/1/1290 1358/1/1332 +f 1315/1/1290 1360/1/1333 1358/1/1332 +f 1355/1/1329 1313/1/1288 1354/1/1330 +f 1313/1/1288 1316/1/1291 1354/1/1330 +f 1315/1/1290 1314/1/1289 1360/1/1333 +f 1314/1/1289 1359/1/1334 1360/1/1333 +f 1314/1/1289 1298/1/1274 1359/1/1334 +f 1302/1/1276 1313/1/1288 1355/1/1329 +f 1298/1/1274 1369/1/1343 1359/1/1334 +f 1370/1/1344 1302/1/1276 1355/1/1329 +f 1297/1/1272 1302/1/1276 1370/1/1344 +f 1298/1/1274 1303/1/1278 1369/1/1343 +f 1303/1/1278 1371/1/1345 1369/1/1343 +f 1372/1/1346 1297/1/1272 1370/1/1344 +f 1299/1/1273 1297/1/1272 1372/1/1346 +f 1303/1/1278 1300/1/1277 1371/1/1345 +f 1373/1/1347 1299/1/1273 1372/1/1346 +f 1300/1/1277 1373/1/1347 1371/1/1345 +f 1300/1/1277 1299/1/1273 1373/1/1347 +f 1269/1/1244 1382/1/1356 1270/1/1245 +f 1382/1/1356 1383/1/1357 1270/1/1245 +f 1384/1/1358 1274/1/1251 1276/1/1253 +f 1385/1/1359 1274/1/1251 1384/1/1358 +f 1384/1/1358 1276/1/1253 1270/1/1245 +f 1383/1/1357 1384/1/1358 1270/1/1245 +f 1274/1/1251 1382/1/1356 1269/1/1244 +f 1274/1/1251 1385/1/1359 1382/1/1356 +f 1386/1/1360 1385/1/1359 1384/1/1358 +f 1386/1/1360 1387/1/1361 1385/1/1359 +f 1382/1/1356 1388/1/1362 1383/1/1357 +f 1388/1/1362 1389/1/1363 1383/1/1357 +f 1386/1/1360 1384/1/1358 1383/1/1357 +f 1389/1/1363 1386/1/1360 1383/1/1357 +f 1390/1/1364 1386/1/1360 1389/1/1363 +f 1391/1/1365 1390/1/1364 1389/1/1363 +f 1392/1/1366 1391/1/1365 1389/1/1363 +f 1393/1/1367 1386/1/1360 1390/1/1364 +f 1394/1/1368 1386/1/1360 1393/1/1367 +f 1395/1/1369 1386/1/1360 1394/1/1368 +f 1396/1/1370 1388/1/1362 1382/1/1356 +f 1385/1/1359 1396/1/1370 1382/1/1356 +f 1396/1/1370 1397/1/1371 1388/1/1362 +f 1397/1/1371 1398/1/1372 1388/1/1362 +f 1385/1/1359 1387/1/1361 1396/1/1370 +f 1387/1/1361 1399/1/1373 1396/1/1370 +f 1387/1/1361 1400/1/1374 1399/1/1373 +f 1400/1/1374 1401/1/1375 1399/1/1373 +f 1399/1/1373 1393/1/1367 1390/1/1364 +f 1396/1/1370 1399/1/1373 1390/1/1364 +f 1388/1/1362 1392/1/1366 1389/1/1363 +f 1388/1/1362 1398/1/1372 1392/1/1366 +f 1398/1/1372 1391/1/1365 1392/1/1366 +f 1398/1/1372 1397/1/1371 1391/1/1365 +f 1397/1/1371 1390/1/1364 1391/1/1365 +f 1397/1/1371 1396/1/1370 1390/1/1364 +f 1399/1/1373 1401/1/1375 1393/1/1367 +f 1401/1/1375 1394/1/1368 1393/1/1367 +f 1401/1/1375 1400/1/1374 1394/1/1368 +f 1400/1/1374 1395/1/1369 1394/1/1368 +f 1400/1/1374 1387/1/1361 1395/1/1369 +f 1387/1/1361 1386/1/1360 1395/1/1369 +f 1290/1/1266 1284/1/1259 1283/1/1258 +f 1377/1/1352 1284/1/1259 1290/1/1266 +f 1293/1/1269 1377/1/1352 1290/1/1266 +f 1380/1/1354 1377/1/1352 1293/1/1269 +f 1294/1/1265 1380/1/1354 1293/1/1269 +f 1379/1/1350 1380/1/1354 1294/1/1265 +f 1335/1/1309 1340/1/1314 1337/1/1311 +f 1330/1/1303 1335/1/1309 1337/1/1311 +f 1333/1/1307 1338/1/1313 1340/1/1314 +f 1335/1/1309 1333/1/1307 1340/1/1314 +f 1332/1/1306 1339/1/1312 1338/1/1313 +f 1333/1/1307 1332/1/1306 1338/1/1313 +f 1334/1/1308 1329/1/1304 1336/1/1310 +f 1341/1/1315 1334/1/1308 1336/1/1310 +f 1257/1/1231 1331/1/1305 1341/1/1315 +f 1331/1/1305 1334/1/1308 1341/1/1315 +f 1328/1/1230 1331/1/1305 1257/1/1231 +f 1375/1/1349 1291/1/1267 1288/1/1263 +f 1375/1/1349 1378/1/1353 1291/1/1267 +f 1378/1/1353 1381/1/1355 1291/1/1267 +f 1381/1/1355 1292/1/1268 1291/1/1267 +f 1381/1/1355 1376/1/1351 1292/1/1268 +f 1376/1/1351 1289/1/1264 1292/1/1268 +f 1403/1/1376 1408/1/1377 1402/1/1378 +f 1404/1/1379 1406/1/1380 1405/1/1381 +f 1407/1/1382 1408/1/1377 1403/1/1376 +f 1409/1/1383 1406/1/1380 1404/1/1379 +f 1410/1/1384 1408/1/1377 1407/1/1382 +f 1411/1/1385 1412/1/1386 1408/1/1377 +f 1413/1/1387 1411/1/1385 1408/1/1377 +f 1410/1/1384 1413/1/1387 1408/1/1377 +f 1414/1/1388 1415/1/1389 1404/1/1379 +f 1416/1/1390 1414/1/1388 1404/1/1379 +f 1417/1/1391 1416/1/1390 1404/1/1379 +f 1415/1/1389 1409/1/1383 1404/1/1379 +f 1411/1/1385 1418/1/1392 1412/1/1386 +f 1419/1/1393 1416/1/1390 1417/1/1391 +f 1411/1/1385 1420/1/1394 1418/1/1392 +f 1421/1/1395 1422/1/1396 1419/1/1393 +f 1422/1/1396 1423/1/1397 1419/1/1393 +f 1423/1/1397 1424/1/1398 1419/1/1393 +f 1424/1/1398 1416/1/1390 1419/1/1393 +f 1425/1/1399 1421/1/1395 1419/1/1393 +f 1426/1/1400 1411/1/1385 1413/1/1387 +f 1427/1/1401 1425/1/1399 1419/1/1393 +f 1420/1/1394 1428/1/1402 1418/1/1392 +f 1428/1/1402 1710/1/1403 1418/1/1392 +f 1430/1/1404 1431/1/1405 1429/1/1406 +f 1431/1/1405 1426/1/1400 1429/1/1406 +f 1431/1/1405 1411/1/1385 1426/1/1400 +f 1710/1/1403 1432/1/1407 1418/1/1392 +f 1710/1/1403 1709/1/1408 1432/1/1407 +f 1709/1/1408 1433/1/1409 1432/1/1407 +f 1433/1/1409 1434/1/1410 1432/1/1407 +f 1435/1/1411 1419/1/1393 1434/1/1410 +f 1433/1/1409 1435/1/1411 1434/1/1410 +f 1435/1/1411 1427/1/1401 1419/1/1393 +f 1416/1/1390 1436/1/1412 1414/1/1388 +f 1436/1/1412 1437/1/1413 1414/1/1388 +f 1436/1/1412 1438/1/1414 1437/1/1413 +f 1439/1/1415 1710/1/1403 1428/1/1402 +f 1440/1/1416 1416/1/1390 1424/1/1398 +f 1411/1/1385 1441/1/1417 1420/1/1394 +f 1442/1/1418 1710/1/1403 1439/1/1415 +f 1443/1/1419 1440/1/1416 1424/1/1398 +f 1702/1/1420 1427/1/1401 1435/1/1411 +f 1444/1/1421 1445/1/1422 1441/1/1417 +f 1411/1/1385 1444/1/1421 1441/1/1417 +f 1446/1/1423 1710/1/1403 1442/1/1418 +f 1447/1/1424 1440/1/1416 1443/1/1419 +f 1448/1/1425 1427/1/1401 1702/1/1420 +f 1449/1/1426 1450/1/1427 1448/1/1425 +f 1451/1/1428 1449/1/1426 1448/1/1425 +f 1450/1/1427 1427/1/1401 1448/1/1425 +f 1444/1/1421 1452/1/1429 1445/1/1422 +f 1453/1/1430 1710/1/1403 1446/1/1423 +f 1454/1/1431 1440/1/1416 1447/1/1424 +f 1453/1/1430 1681/1/1432 1710/1/1403 +f 1684/1/1433 1451/1/1428 1448/1/1425 +f 1455/1/1434 1452/1/1429 1444/1/1421 +f 1454/1/1431 1456/1/1435 1440/1/1416 +f 1456/1/1435 1457/1/1436 1440/1/1416 +f 1458/1/1437 1681/1/1432 1453/1/1430 +f 1459/1/1438 1455/1/1434 1444/1/1421 +f 1456/1/1435 1460/1/1439 1457/1/1436 +f 1460/1/1439 1461/1/1440 1457/1/1436 +f 1462/1/1441 1459/1/1438 1444/1/1421 +f 1463/1/1442 1464/1/1443 1457/1/1436 +f 1464/1/1443 1465/1/1444 1457/1/1436 +f 1461/1/1440 1467/1/1445 1457/1/1436 +f 1467/1/1445 1466/1/1446 1457/1/1436 +f 1466/1/1446 1468/1/1447 1457/1/1436 +f 1468/1/1447 1463/1/1442 1457/1/1436 +f 1469/1/1448 1470/1/1449 1681/1/1432 +f 1458/1/1437 1471/1/1450 1681/1/1432 +f 1471/1/1450 1472/1/1451 1681/1/1432 +f 1472/1/1451 1469/1/1448 1681/1/1432 +f 1470/1/1449 1473/1/1452 1681/1/1432 +f 1473/1/1452 1474/1/1453 1681/1/1432 +f 1474/1/1453 1707/1/1454 1681/1/1432 +f 1467/1/1445 1451/1/1428 1684/1/1433 +f 1693/1/1455 1467/1/1445 1684/1/1433 +f 1475/1/1456 1459/1/1438 1462/1/1441 +f 1701/1/1457 1467/1/1445 1693/1/1455 +f 1474/1/1453 1708/1/1458 1707/1/1454 +f 1476/1/1459 1467/1/1445 1701/1/1457 +f 1474/1/1453 1476/1/1459 1708/1/1458 +f 1476/1/1459 1701/1/1457 1708/1/1458 +f 1464/1/1443 1477/1/1460 1465/1/1444 +f 1479/1/1461 1469/1/1448 1459/1/1438 +f 1469/1/1448 1478/1/1462 1459/1/1438 +f 1475/1/1456 1479/1/1461 1459/1/1438 +f 1478/1/1462 1469/1/1448 1472/1/1451 +f 1451/1/1428 1467/1/1445 1461/1/1440 +f 1481/1/1463 1475/1/1456 1462/1/1441 +f 1480/1/1464 1481/1/1463 1462/1/1441 +f 1481/1/1463 1479/1/1461 1475/1/1456 +f 1481/1/1463 1482/1/1465 1479/1/1461 +f 1483/1/1466 1469/1/1448 1479/1/1461 +f 1482/1/1465 1483/1/1466 1479/1/1461 +f 1484/1/1467 1470/1/1449 1469/1/1448 +f 1483/1/1466 1484/1/1467 1469/1/1448 +f 1484/1/1467 1485/1/1468 1470/1/1449 +f 1485/1/1468 1473/1/1452 1470/1/1449 +f 1486/1/1469 1474/1/1453 1473/1/1452 +f 1485/1/1468 1486/1/1469 1473/1/1452 +f 1487/1/1470 1431/1/1405 1430/1/1404 +f 1488/1/1471 1487/1/1470 1430/1/1404 +f 1489/1/1472 1411/1/1385 1431/1/1405 +f 1487/1/1470 1489/1/1472 1431/1/1405 +f 1491/1/1473 1596/1/1474 1600/1/1475 +f 1491/1/1473 1490/1/1476 1596/1/1474 +f 1494/1/1477 1493/1/1478 1492/1/1479 +f 1495/1/1480 1493/1/1478 1494/1/1477 +f 1496/1/1481 1495/1/1480 1494/1/1477 +f 1497/1/1482 1495/1/1480 1496/1/1481 +f 1492/1/1479 1493/1/1478 1490/1/1476 +f 1491/1/1473 1492/1/1479 1490/1/1476 +f 1499/1/1483 1476/1/1459 1498/1/1484 +f 1499/1/1483 1500/1/1485 1476/1/1459 +f 1499/1/1483 1501/1/1486 1500/1/1485 +f 1501/1/1486 1502/1/1487 1500/1/1485 +f 1501/1/1486 1503/1/1488 1502/1/1487 +f 1504/1/1489 1432/1/1407 1505/1/1490 +f 1506/1/1491 1504/1/1489 1507/1/1492 +f 1508/1/1493 1506/1/1491 1507/1/1492 +f 1504/1/1489 1509/1/1494 1507/1/1492 +f 1509/1/1494 1510/1/1495 1507/1/1492 +f 1511/1/1496 1506/1/1491 1508/1/1493 +f 1512/1/1497 1511/1/1496 1508/1/1493 +f 1513/1/1498 1517/1/1499 1514/1/1500 +f 1515/1/1501 1518/1/1502 1516/1/1503 +f 1515/1/1501 1519/1/1504 1518/1/1502 +f 1513/1/1498 1520/1/1505 1517/1/1499 +f 1513/1/1498 1524/1/1506 1520/1/1505 +f 1522/1/1507 1521/1/1508 1513/1/1498 +f 1521/1/1508 1523/1/1509 1513/1/1498 +f 1523/1/1509 1524/1/1506 1513/1/1498 +f 1525/1/1510 1526/1/1511 1519/1/1504 +f 1526/1/1511 1527/1/1512 1519/1/1504 +f 1527/1/1512 1528/1/1513 1519/1/1504 +f 1515/1/1501 1525/1/1510 1519/1/1504 +f 1527/1/1512 1529/1/1514 1528/1/1513 +f 1530/1/1515 1521/1/1508 1522/1/1507 +f 1529/1/1514 1531/1/1516 1528/1/1513 +f 1532/1/1517 1521/1/1508 1530/1/1515 +f 1533/1/1518 1534/1/1519 1530/1/1515 +f 1534/1/1519 1535/1/1520 1530/1/1515 +f 1535/1/1520 1532/1/1517 1530/1/1515 +f 1529/1/1514 1536/1/1521 1531/1/1516 +f 1537/1/1522 1533/1/1518 1530/1/1515 +f 1540/1/1523 1537/1/1522 1530/1/1515 +f 1536/1/1521 1538/1/1524 1531/1/1516 +f 1539/1/1525 1540/1/1523 1530/1/1515 +f 1541/1/1526 1540/1/1523 1539/1/1525 +f 1544/1/1527 1541/1/1526 1539/1/1525 +f 1536/1/1521 1542/1/1528 1538/1/1524 +f 1523/1/1509 1487/1/1470 1543/1/1529 +f 1487/1/1470 1488/1/1471 1543/1/1529 +f 1489/1/1472 1487/1/1470 1523/1/1509 +f 1521/1/1508 1489/1/1472 1523/1/1509 +f 1504/1/1489 1544/1/1527 1539/1/1525 +f 1506/1/1491 1544/1/1527 1504/1/1489 +f 1538/1/1524 1542/1/1528 1506/1/1491 +f 1545/1/1530 1544/1/1527 1506/1/1491 +f 1542/1/1528 1545/1/1530 1506/1/1491 +f 1547/1/1531 1546/1/1532 1526/1/1511 +f 1546/1/1532 1527/1/1512 1526/1/1511 +f 1548/1/1533 1546/1/1532 1547/1/1531 +f 1549/1/1534 1545/1/1530 1542/1/1528 +f 1550/1/1535 1545/1/1530 1549/1/1534 +f 1529/1/1514 1551/1/1536 1536/1/1521 +f 1552/1/1537 1521/1/1508 1532/1/1517 +f 1553/1/1538 1540/1/1523 1541/1/1526 +f 1554/1/1539 1667/1/1540 1550/1/1535 +f 1667/1/1540 1666/1/1541 1550/1/1535 +f 1666/1/1541 1545/1/1530 1550/1/1535 +f 1529/1/1514 1555/1/1542 1551/1/1536 +f 1556/1/1543 1521/1/1508 1552/1/1537 +f 1557/1/1544 1667/1/1540 1554/1/1539 +f 1564/1/1545 1540/1/1523 1553/1/1538 +f 1558/1/1546 1521/1/1508 1556/1/1543 +f 1559/1/1547 1555/1/1542 1529/1/1514 +f 1556/1/1543 1560/1/1548 1558/1/1546 +f 1561/1/1549 1562/1/1550 1559/1/1547 +f 1562/1/1550 1563/1/1551 1559/1/1547 +f 1563/1/1551 1555/1/1542 1559/1/1547 +f 1564/1/1545 1674/1/1552 1540/1/1523 +f 1560/1/1548 1565/1/1553 1558/1/1546 +f 1565/1/1553 1480/1/1464 1558/1/1546 +f 1566/1/1554 1567/1/1555 1540/1/1523 +f 1674/1/1552 1566/1/1554 1540/1/1523 +f 1568/1/1556 1667/1/1540 1557/1/1544 +f 1565/1/1553 1569/1/1557 1480/1/1464 +f 1485/1/1468 1484/1/1467 1480/1/1464 +f 1486/1/1469 1485/1/1468 1480/1/1464 +f 1484/1/1467 1483/1/1466 1480/1/1464 +f 1482/1/1465 1481/1/1463 1480/1/1464 +f 1483/1/1466 1482/1/1465 1480/1/1464 +f 1569/1/1557 1498/1/1484 1480/1/1464 +f 1498/1/1484 1486/1/1469 1480/1/1464 +f 1570/1/1558 1571/1/1559 1559/1/1547 +f 1572/1/1560 1573/1/1561 1559/1/1547 +f 1573/1/1561 1570/1/1558 1559/1/1547 +f 1571/1/1559 1575/1/1562 1559/1/1547 +f 1575/1/1562 1574/1/1563 1559/1/1547 +f 1574/1/1563 1566/1/1554 1559/1/1547 +f 1566/1/1554 1561/1/1549 1559/1/1547 +f 1566/1/1554 1576/1/1564 1567/1/1555 +f 1566/1/1554 1667/1/1540 1568/1/1556 +f 1577/1/1565 1573/1/1561 1572/1/1560 +f 1566/1/1554 1498/1/1484 1576/1/1564 +f 1578/1/1566 1566/1/1554 1568/1/1556 +f 1498/1/1484 1579/1/1567 1576/1/1564 +f 1580/1/1568 1566/1/1554 1578/1/1566 +f 1667/1/1540 1566/1/1554 1674/1/1552 +f 1498/1/1484 1581/1/1569 1579/1/1567 +f 1581/1/1569 1498/1/1484 1569/1/1557 +f 1582/1/1570 1566/1/1554 1580/1/1568 +f 1566/1/1554 1582/1/1570 1561/1/1549 +f 1566/1/1554 1499/1/1483 1498/1/1484 +f 1566/1/1554 1583/1/1571 1499/1/1483 +f 1583/1/1571 1501/1/1486 1499/1/1483 +f 1583/1/1571 1584/1/1572 1501/1/1486 +f 1584/1/1572 1585/1/1573 1501/1/1486 +f 1585/1/1573 1503/1/1488 1501/1/1486 +f 1585/1/1573 1586/1/1574 1497/1/1482 +f 1503/1/1488 1585/1/1573 1497/1/1482 +f 1493/1/1478 1588/1/1575 1587/1/1576 +f 1495/1/1480 1588/1/1575 1493/1/1478 +f 1495/1/1480 1589/1/1577 1588/1/1575 +f 1497/1/1482 1589/1/1577 1495/1/1480 +f 1497/1/1482 1586/1/1574 1589/1/1577 +f 1587/1/1576 1590/1/1578 1490/1/1476 +f 1493/1/1478 1587/1/1576 1490/1/1476 +f 1490/1/1476 1591/1/1579 1592/1/1580 +f 1596/1/1474 1490/1/1476 1592/1/1580 +f 1590/1/1578 1593/1/1581 1591/1/1579 +f 1490/1/1476 1590/1/1578 1591/1/1579 +f 1593/1/1581 1594/1/1582 1591/1/1579 +f 1595/1/1583 1596/1/1474 1592/1/1580 +f 1591/1/1579 1597/1/1584 1598/1/1585 +f 1592/1/1580 1591/1/1579 1598/1/1585 +f 1491/1/1473 1600/1/1475 1598/1/1585 +f 1599/1/1586 1491/1/1473 1598/1/1585 +f 1597/1/1584 1599/1/1586 1598/1/1585 +f 1603/1/1587 1599/1/1586 1597/1/1584 +f 1600/1/1475 1601/1/1588 1598/1/1585 +f 1602/1/1589 1603/1/1587 1597/1/1584 +f 1599/1/1586 1492/1/1479 1491/1/1473 +f 1604/1/1590 1492/1/1479 1599/1/1586 +f 1604/1/1590 1494/1/1477 1492/1/1479 +f 1605/1/1591 1494/1/1477 1604/1/1590 +f 1605/1/1591 1496/1/1481 1494/1/1477 +f 1606/1/1592 1496/1/1481 1605/1/1591 +f 1606/1/1592 1607/1/1593 1502/1/1487 +f 1496/1/1481 1606/1/1592 1502/1/1487 +f 1500/1/1485 1467/1/1445 1476/1/1459 +f 1608/1/1594 1467/1/1445 1500/1/1485 +f 1502/1/1487 1608/1/1594 1500/1/1485 +f 1607/1/1593 1608/1/1594 1502/1/1487 +f 1505/1/1490 1434/1/1410 1609/1/1595 +f 1432/1/1407 1434/1/1410 1505/1/1490 +f 1613/1/1596 1505/1/1490 1610/1/1597 +f 1505/1/1490 1611/1/1598 1610/1/1597 +f 1612/1/1599 1613/1/1596 1610/1/1597 +f 1505/1/1490 1609/1/1595 1611/1/1598 +f 1609/1/1595 1615/1/1600 1611/1/1598 +f 1615/1/1600 1614/1/1601 1611/1/1598 +f 1611/1/1598 1507/1/1492 1610/1/1597 +f 1508/1/1493 1507/1/1492 1611/1/1598 +f 1509/1/1494 1504/1/1489 1613/1/1596 +f 1504/1/1489 1505/1/1490 1613/1/1596 +f 1486/1/1469 1498/1/1484 1474/1/1453 +f 1498/1/1484 1476/1/1459 1474/1/1453 +f 1426/1/1400 1543/1/1529 1429/1/1406 +f 1523/1/1509 1543/1/1529 1426/1/1400 +f 1514/1/1500 1403/1/1376 1402/1/1378 +f 1514/1/1500 1517/1/1499 1403/1/1376 +f 1517/1/1499 1407/1/1382 1403/1/1376 +f 1402/1/1378 1513/1/1498 1514/1/1500 +f 1408/1/1377 1513/1/1498 1402/1/1378 +f 1517/1/1499 1520/1/1505 1407/1/1382 +f 1520/1/1505 1410/1/1384 1407/1/1382 +f 1520/1/1505 1524/1/1506 1410/1/1384 +f 1412/1/1386 1513/1/1498 1408/1/1377 +f 1412/1/1386 1522/1/1507 1513/1/1498 +f 1524/1/1506 1413/1/1387 1410/1/1384 +f 1524/1/1506 1523/1/1509 1413/1/1387 +f 1418/1/1392 1522/1/1507 1412/1/1386 +f 1418/1/1392 1530/1/1515 1522/1/1507 +f 1432/1/1407 1539/1/1525 1418/1/1392 +f 1504/1/1489 1539/1/1525 1432/1/1407 +f 1532/1/1517 1535/1/1520 1428/1/1402 +f 1420/1/1394 1532/1/1517 1428/1/1402 +f 1535/1/1520 1439/1/1415 1428/1/1402 +f 1534/1/1519 1439/1/1415 1535/1/1520 +f 1533/1/1518 1439/1/1415 1534/1/1519 +f 1441/1/1417 1532/1/1517 1420/1/1394 +f 1533/1/1518 1442/1/1418 1439/1/1415 +f 1552/1/1537 1532/1/1517 1441/1/1417 +f 1445/1/1422 1552/1/1537 1441/1/1417 +f 1533/1/1518 1446/1/1423 1442/1/1418 +f 1537/1/1522 1446/1/1423 1533/1/1518 +f 1556/1/1543 1552/1/1537 1445/1/1422 +f 1452/1/1429 1556/1/1543 1445/1/1422 +f 1537/1/1522 1453/1/1430 1446/1/1423 +f 1540/1/1523 1453/1/1430 1537/1/1522 +f 1560/1/1548 1556/1/1543 1452/1/1429 +f 1455/1/1434 1560/1/1548 1452/1/1429 +f 1540/1/1523 1458/1/1437 1453/1/1430 +f 1567/1/1555 1458/1/1437 1540/1/1523 +f 1576/1/1564 1458/1/1437 1567/1/1555 +f 1565/1/1553 1560/1/1548 1455/1/1434 +f 1576/1/1564 1471/1/1450 1458/1/1437 +f 1459/1/1438 1565/1/1553 1455/1/1434 +f 1569/1/1557 1565/1/1553 1459/1/1438 +f 1579/1/1567 1471/1/1450 1576/1/1564 +f 1579/1/1567 1472/1/1451 1471/1/1450 +f 1581/1/1569 1472/1/1451 1579/1/1567 +f 1581/1/1569 1569/1/1557 1459/1/1438 +f 1478/1/1462 1581/1/1569 1459/1/1438 +f 1581/1/1569 1478/1/1462 1472/1/1451 +f 1616/1/1602 1497/1/1482 1496/1/1481 +f 1503/1/1488 1617/1/1603 1502/1/1487 +f 1502/1/1487 1617/1/1603 1496/1/1481 +f 1617/1/1603 1616/1/1602 1496/1/1481 +f 1618/1/1604 1497/1/1482 1616/1/1602 +f 1618/1/1604 1619/1/1605 1497/1/1482 +f 1620/1/1606 1621/1/1607 1617/1/1603 +f 1503/1/1488 1620/1/1606 1617/1/1603 +f 1617/1/1603 1622/1/1608 1616/1/1602 +f 1622/1/1608 1623/1/1609 1616/1/1602 +f 1623/1/1609 1618/1/1604 1616/1/1602 +f 1621/1/1607 1622/1/1608 1617/1/1603 +f 1623/1/1609 1624/1/1610 1618/1/1604 +f 1625/1/1611 1622/1/1608 1621/1/1607 +f 1627/1/1612 1503/1/1488 1497/1/1482 +f 1619/1/1605 1627/1/1612 1497/1/1482 +f 1626/1/1613 1620/1/1606 1503/1/1488 +f 1627/1/1612 1626/1/1613 1503/1/1488 +f 1626/1/1613 1628/1/1614 1620/1/1606 +f 1622/1/1608 1627/1/1612 1623/1/1609 +f 1626/1/1613 1627/1/1612 1622/1/1608 +f 1539/1/1525 1530/1/1515 1418/1/1392 +f 1523/1/1509 1426/1/1400 1413/1/1387 +f 1488/1/1471 1430/1/1404 1429/1/1406 +f 1543/1/1529 1488/1/1471 1429/1/1406 +f 1507/1/1492 1510/1/1495 1610/1/1597 +f 1510/1/1495 1612/1/1599 1610/1/1597 +f 1510/1/1495 1509/1/1494 1612/1/1599 +f 1509/1/1494 1613/1/1596 1612/1/1599 +f 1601/1/1588 1592/1/1580 1598/1/1585 +f 1595/1/1583 1592/1/1580 1601/1/1588 +f 1600/1/1475 1596/1/1474 1601/1/1588 +f 1596/1/1474 1595/1/1583 1601/1/1588 +f 1620/1/1606 1625/1/1611 1621/1/1607 +f 1620/1/1606 1628/1/1614 1625/1/1611 +f 1628/1/1614 1626/1/1613 1625/1/1611 +f 1626/1/1613 1622/1/1608 1625/1/1611 +f 1624/1/1610 1619/1/1605 1618/1/1604 +f 1627/1/1612 1619/1/1605 1624/1/1610 +f 1623/1/1609 1627/1/1612 1624/1/1610 +f 1521/1/1508 1411/1/1385 1489/1/1472 +f 1521/1/1508 1444/1/1421 1411/1/1385 +f 1558/1/1546 1444/1/1421 1521/1/1508 +f 1480/1/1464 1444/1/1421 1558/1/1546 +f 1480/1/1464 1462/1/1441 1444/1/1421 +f 1465/1/1444 1572/1/1560 1457/1/1436 +f 1465/1/1444 1577/1/1565 1572/1/1560 +f 1477/1/1460 1577/1/1565 1465/1/1444 +f 1477/1/1460 1573/1/1561 1577/1/1565 +f 1464/1/1443 1573/1/1561 1477/1/1460 +f 1464/1/1443 1570/1/1558 1573/1/1561 +f 1463/1/1442 1570/1/1558 1464/1/1443 +f 1463/1/1442 1571/1/1559 1570/1/1558 +f 1468/1/1447 1571/1/1559 1463/1/1442 +f 1468/1/1447 1575/1/1562 1571/1/1559 +f 1466/1/1446 1575/1/1562 1468/1/1447 +f 1466/1/1446 1574/1/1563 1575/1/1562 +f 1436/1/1412 1548/1/1533 1438/1/1414 +f 1436/1/1412 1546/1/1532 1548/1/1533 +f 1416/1/1390 1546/1/1532 1436/1/1412 +f 1416/1/1390 1527/1/1512 1546/1/1532 +f 1590/1/1578 1599/1/1586 1603/1/1587 +f 1593/1/1581 1590/1/1578 1603/1/1587 +f 1588/1/1575 1604/1/1590 1587/1/1576 +f 1588/1/1575 1605/1/1591 1604/1/1590 +f 1588/1/1575 1589/1/1577 1605/1/1591 +f 1589/1/1577 1606/1/1592 1605/1/1591 +f 1589/1/1577 1586/1/1574 1606/1/1592 +f 1587/1/1576 1599/1/1586 1590/1/1578 +f 1587/1/1576 1604/1/1590 1599/1/1586 +f 1583/1/1571 1566/1/1554 1467/1/1445 +f 1608/1/1594 1584/1/1572 1467/1/1445 +f 1584/1/1572 1583/1/1571 1467/1/1445 +f 1585/1/1573 1584/1/1572 1608/1/1594 +f 1607/1/1593 1585/1/1573 1608/1/1594 +f 1434/1/1410 1506/1/1491 1609/1/1595 +f 1609/1/1595 1511/1/1496 1615/1/1600 +f 1609/1/1595 1506/1/1491 1511/1/1496 +f 1566/1/1554 1574/1/1563 1467/1/1445 +f 1574/1/1563 1466/1/1446 1467/1/1445 +f 1437/1/1413 1526/1/1511 1414/1/1388 +f 1547/1/1531 1526/1/1511 1437/1/1413 +f 1516/1/1503 1518/1/1502 1405/1/1381 +f 1406/1/1380 1516/1/1503 1405/1/1381 +f 1518/1/1502 1404/1/1379 1405/1/1381 +f 1406/1/1380 1515/1/1501 1516/1/1503 +f 1518/1/1502 1519/1/1504 1404/1/1379 +f 1409/1/1383 1515/1/1501 1406/1/1380 +f 1528/1/1513 1417/1/1391 1404/1/1379 +f 1519/1/1504 1528/1/1513 1404/1/1379 +f 1415/1/1389 1515/1/1501 1409/1/1383 +f 1415/1/1389 1525/1/1510 1515/1/1501 +f 1531/1/1516 1419/1/1393 1417/1/1391 +f 1528/1/1513 1531/1/1516 1417/1/1391 +f 1414/1/1388 1525/1/1510 1415/1/1389 +f 1414/1/1388 1526/1/1511 1525/1/1510 +f 1419/1/1393 1506/1/1491 1434/1/1410 +f 1538/1/1524 1506/1/1491 1419/1/1393 +f 1549/1/1534 1542/1/1528 1423/1/1397 +f 1422/1/1396 1549/1/1534 1423/1/1397 +f 1542/1/1528 1424/1/1398 1423/1/1397 +f 1536/1/1521 1424/1/1398 1542/1/1528 +f 1550/1/1535 1549/1/1534 1422/1/1396 +f 1421/1/1395 1550/1/1535 1422/1/1396 +f 1536/1/1521 1443/1/1419 1424/1/1398 +f 1551/1/1536 1443/1/1419 1536/1/1521 +f 1554/1/1539 1550/1/1535 1421/1/1395 +f 1551/1/1536 1447/1/1424 1443/1/1419 +f 1425/1/1399 1554/1/1539 1421/1/1395 +f 1555/1/1542 1447/1/1424 1551/1/1536 +f 1557/1/1544 1554/1/1539 1425/1/1399 +f 1427/1/1401 1557/1/1544 1425/1/1399 +f 1555/1/1542 1454/1/1431 1447/1/1424 +f 1563/1/1551 1454/1/1431 1555/1/1542 +f 1568/1/1556 1557/1/1544 1427/1/1401 +f 1450/1/1427 1568/1/1556 1427/1/1401 +f 1563/1/1551 1456/1/1435 1454/1/1431 +f 1562/1/1550 1456/1/1435 1563/1/1551 +f 1578/1/1566 1568/1/1556 1450/1/1427 +f 1562/1/1550 1460/1/1439 1456/1/1435 +f 1449/1/1426 1578/1/1566 1450/1/1427 +f 1580/1/1568 1578/1/1566 1449/1/1426 +f 1562/1/1550 1461/1/1440 1460/1/1439 +f 1561/1/1549 1461/1/1440 1562/1/1550 +f 1451/1/1428 1580/1/1568 1449/1/1426 +f 1582/1/1570 1580/1/1568 1451/1/1428 +f 1561/1/1549 1451/1/1428 1461/1/1440 +f 1582/1/1570 1451/1/1428 1561/1/1549 +f 1586/1/1574 1629/1/1615 1606/1/1592 +f 1630/1/1616 1585/1/1573 1607/1/1593 +f 1629/1/1615 1607/1/1593 1606/1/1592 +f 1629/1/1615 1630/1/1616 1607/1/1593 +f 1586/1/1574 1631/1/1617 1629/1/1615 +f 1631/1/1617 1632/1/1618 1629/1/1615 +f 1633/1/1619 1585/1/1573 1630/1/1616 +f 1633/1/1619 1634/1/1620 1585/1/1573 +f 1637/1/1621 1630/1/1616 1629/1/1615 +f 1632/1/1618 1637/1/1621 1629/1/1615 +f 1637/1/1621 1635/1/1622 1630/1/1616 +f 1635/1/1622 1633/1/1619 1630/1/1616 +f 1636/1/1623 1637/1/1621 1632/1/1618 +f 1635/1/1622 1638/1/1624 1633/1/1619 +f 1585/1/1573 1641/1/1625 1586/1/1574 +f 1641/1/1625 1639/1/1626 1586/1/1574 +f 1639/1/1626 1631/1/1617 1586/1/1574 +f 1634/1/1620 1641/1/1625 1585/1/1573 +f 1640/1/1627 1641/1/1625 1634/1/1620 +f 1639/1/1626 1642/1/1628 1631/1/1617 +f 1639/1/1626 1641/1/1625 1637/1/1621 +f 1641/1/1625 1635/1/1622 1637/1/1621 +f 1538/1/1524 1419/1/1393 1531/1/1516 +f 1438/1/1414 1547/1/1531 1437/1/1413 +f 1438/1/1414 1548/1/1533 1547/1/1531 +f 1614/1/1601 1508/1/1493 1611/1/1598 +f 1512/1/1497 1508/1/1493 1614/1/1601 +f 1615/1/1600 1512/1/1497 1614/1/1601 +f 1511/1/1496 1512/1/1497 1615/1/1600 +f 1591/1/1579 1594/1/1582 1597/1/1584 +f 1594/1/1582 1602/1/1589 1597/1/1584 +f 1594/1/1582 1593/1/1581 1602/1/1589 +f 1593/1/1581 1603/1/1587 1602/1/1589 +f 1638/1/1624 1634/1/1620 1633/1/1619 +f 1640/1/1627 1634/1/1620 1638/1/1624 +f 1635/1/1622 1640/1/1627 1638/1/1624 +f 1641/1/1625 1640/1/1627 1635/1/1622 +f 1631/1/1617 1642/1/1628 1632/1/1618 +f 1642/1/1628 1636/1/1623 1632/1/1618 +f 1642/1/1628 1639/1/1626 1636/1/1623 +f 1639/1/1626 1637/1/1621 1636/1/1623 +f 1529/1/1514 1527/1/1512 1416/1/1390 +f 1440/1/1416 1529/1/1514 1416/1/1390 +f 1559/1/1547 1529/1/1514 1440/1/1416 +f 1457/1/1436 1559/1/1547 1440/1/1416 +f 1572/1/1560 1559/1/1547 1457/1/1436 +f 1650/1/1629 1655/1/1630 1660/1/1631 +f 1655/1/1630 1643/1/1632 1660/1/1631 +f 1668/1/1633 1644/1/1634 1672/1/1635 +f 1644/1/1634 1645/1/1636 1672/1/1635 +f 1651/1/1637 1647/1/1638 1652/1/1639 +f 1647/1/1638 1646/1/1640 1652/1/1639 +f 1653/1/1641 1648/1/1642 1651/1/1637 +f 1648/1/1642 1647/1/1638 1651/1/1637 +f 1671/1/1643 1649/1/1644 1653/1/1641 +f 1649/1/1644 1648/1/1642 1653/1/1641 +f 1650/1/1629 1646/1/1640 1647/1/1638 +f 1651/1/1637 1652/1/1639 1644/1/1634 +f 1649/1/1644 1654/1/1645 1648/1/1642 +f 1654/1/1645 1647/1/1638 1648/1/1642 +f 1654/1/1645 1650/1/1629 1647/1/1638 +f 1654/1/1645 1655/1/1630 1650/1/1629 +f 1651/1/1637 1644/1/1634 1668/1/1633 +f 1669/1/1646 1651/1/1637 1668/1/1633 +f 1653/1/1641 1651/1/1637 1669/1/1646 +f 1671/1/1643 1653/1/1641 1669/1/1646 +f 1656/1/1647 1661/1/1648 1662/1/1649 +f 1656/1/1647 1657/1/1650 1661/1/1648 +f 1657/1/1650 1658/1/1651 1661/1/1648 +f 1658/1/1651 1663/1/1652 1661/1/1648 +f 1658/1/1651 1676/1/1653 1663/1/1652 +f 1658/1/1651 1659/1/1654 1676/1/1653 +f 1656/1/1647 1660/1/1631 1657/1/1650 +f 1662/1/1649 1661/1/1648 1645/1/1636 +f 1664/1/1655 1659/1/1654 1658/1/1651 +f 1657/1/1650 1664/1/1655 1658/1/1651 +f 1665/1/1656 1664/1/1655 1657/1/1650 +f 1660/1/1631 1665/1/1656 1657/1/1650 +f 1643/1/1632 1665/1/1656 1660/1/1631 +f 1645/1/1636 1675/1/1657 1672/1/1635 +f 1645/1/1636 1661/1/1648 1675/1/1657 +f 1661/1/1648 1663/1/1652 1675/1/1657 +f 1663/1/1652 1676/1/1653 1675/1/1657 +f 1670/1/1658 1666/1/1541 1671/1/1643 +f 1666/1/1541 1649/1/1644 1671/1/1643 +f 1545/1/1530 1666/1/1541 1670/1/1658 +f 1666/1/1541 1654/1/1645 1649/1/1644 +f 1667/1/1540 1654/1/1645 1666/1/1541 +f 1667/1/1540 1655/1/1630 1654/1/1645 +f 1545/1/1530 1669/1/1646 1544/1/1527 +f 1669/1/1646 1668/1/1633 1544/1/1527 +f 1670/1/1658 1669/1/1646 1545/1/1530 +f 1670/1/1658 1671/1/1643 1669/1/1646 +f 1655/1/1630 1674/1/1552 1643/1/1632 +f 1667/1/1540 1674/1/1552 1655/1/1630 +f 1544/1/1527 1672/1/1635 1541/1/1526 +f 1668/1/1633 1672/1/1635 1544/1/1527 +f 1664/1/1655 1673/1/1659 1659/1/1654 +f 1664/1/1655 1564/1/1545 1673/1/1659 +f 1665/1/1656 1674/1/1552 1664/1/1655 +f 1674/1/1552 1564/1/1545 1664/1/1655 +f 1674/1/1552 1665/1/1656 1643/1/1632 +f 1672/1/1635 1675/1/1657 1541/1/1526 +f 1675/1/1657 1553/1/1538 1541/1/1526 +f 1675/1/1657 1676/1/1653 1553/1/1538 +f 1676/1/1653 1677/1/1660 1553/1/1538 +f 1659/1/1654 1677/1/1660 1676/1/1653 +f 1659/1/1654 1673/1/1659 1677/1/1660 +f 1673/1/1659 1553/1/1538 1677/1/1660 +f 1673/1/1659 1564/1/1545 1553/1/1538 +f 1701/1/1457 1687/1/1661 1700/1/1662 +f 1708/1/1458 1701/1/1457 1700/1/1662 +f 1678/1/1663 1682/1/1664 1696/1/1665 +f 1682/1/1664 1692/1/1666 1696/1/1665 +f 1679/1/1667 1680/1/1668 1433/1/1409 +f 1680/1/1668 1435/1/1411 1433/1/1409 +f 1682/1/1664 1683/1/1669 1692/1/1666 +f 1683/1/1669 1691/1/1670 1692/1/1666 +f 1683/1/1669 1690/1/1671 1691/1/1670 +f 1683/1/1669 1684/1/1433 1690/1/1671 +f 1684/1/1433 1694/1/1672 1690/1/1671 +f 1682/1/1664 1685/1/1673 1683/1/1669 +f 1687/1/1661 1685/1/1673 1682/1/1664 +f 1686/1/1674 1687/1/1661 1682/1/1664 +f 1689/1/1675 1688/1/1676 1680/1/1668 +f 1689/1/1675 1691/1/1670 1688/1/1676 +f 1691/1/1670 1690/1/1671 1688/1/1676 +f 1692/1/1666 1691/1/1670 1689/1/1675 +f 1686/1/1674 1682/1/1664 1678/1/1663 +f 1700/1/1662 1686/1/1674 1678/1/1663 +f 1687/1/1661 1686/1/1674 1700/1/1662 +f 1693/1/1455 1684/1/1433 1683/1/1669 +f 1685/1/1673 1693/1/1455 1683/1/1669 +f 1687/1/1661 1693/1/1455 1685/1/1673 +f 1701/1/1457 1693/1/1455 1687/1/1661 +f 1684/1/1433 1448/1/1425 1694/1/1672 +f 1680/1/1668 1688/1/1676 1435/1/1411 +f 1688/1/1676 1702/1/1420 1435/1/1411 +f 1688/1/1676 1694/1/1672 1702/1/1420 +f 1688/1/1676 1690/1/1671 1694/1/1672 +f 1689/1/1675 1680/1/1668 1679/1/1667 +f 1695/1/1677 1689/1/1675 1679/1/1667 +f 1692/1/1666 1689/1/1675 1695/1/1677 +f 1696/1/1665 1692/1/1666 1695/1/1677 +f 1705/1/1678 1697/1/1679 1696/1/1665 +f 1697/1/1679 1678/1/1663 1696/1/1665 +f 1698/1/1680 1697/1/1679 1705/1/1678 +f 1706/1/1681 1698/1/1680 1705/1/1678 +f 1710/1/1403 1681/1/1432 1706/1/1681 +f 1681/1/1432 1698/1/1680 1706/1/1681 +f 1699/1/1682 1678/1/1663 1697/1/1679 +f 1699/1/1682 1697/1/1679 1698/1/1680 +f 1699/1/1682 1700/1/1662 1678/1/1663 +f 1694/1/1672 1448/1/1425 1702/1/1420 +f 1703/1/1683 1695/1/1677 1679/1/1667 +f 1704/1/1684 1705/1/1678 1703/1/1683 +f 1703/1/1683 1696/1/1665 1695/1/1677 +f 1703/1/1683 1705/1/1678 1696/1/1665 +f 1706/1/1681 1705/1/1678 1704/1/1684 +f 1681/1/1432 1707/1/1454 1698/1/1680 +f 1707/1/1454 1699/1/1682 1698/1/1680 +f 1707/1/1454 1708/1/1458 1699/1/1682 +f 1708/1/1458 1700/1/1662 1699/1/1682 +f 1703/1/1683 1679/1/1667 1433/1/1409 +f 1709/1/1408 1703/1/1683 1433/1/1409 +f 1704/1/1684 1703/1/1683 1709/1/1408 +f 1706/1/1681 1704/1/1684 1709/1/1408 +f 1710/1/1403 1706/1/1681 1709/1/1408 +f 1644/1/1634 1662/1/1649 1645/1/1636 +f 1652/1/1639 1662/1/1649 1644/1/1634 +f 1646/1/1640 1660/1/1631 1656/1/1647 +f 1650/1/1629 1660/1/1631 1646/1/1640 +f 1652/1/1639 1656/1/1647 1662/1/1649 +f 1646/1/1640 1656/1/1647 1652/1/1639 +f 1717/1/1685 1714/1/1686 1711/1/1687 +f 1712/1/1688 1715/1/1689 1713/1/1690 +f 1716/1/1691 1717/1/1685 1711/1/1687 +f 1718/1/1692 1715/1/1689 1712/1/1688 +f 1719/1/1693 1717/1/1685 1716/1/1691 +f 1720/1/1694 1721/1/1695 1717/1/1685 +f 1722/1/1696 1720/1/1694 1717/1/1685 +f 1719/1/1693 1722/1/1696 1717/1/1685 +f 1723/1/1697 1724/1/1698 1712/1/1688 +f 1725/1/1699 1723/1/1697 1712/1/1688 +f 1726/1/1700 1725/1/1699 1712/1/1688 +f 1724/1/1698 1718/1/1692 1712/1/1688 +f 1720/1/1694 1727/1/1701 1721/1/1695 +f 1728/1/1702 1725/1/1699 1726/1/1700 +f 1720/1/1694 1729/1/1703 1727/1/1701 +f 1730/1/1704 1731/1/1705 1728/1/1702 +f 1731/1/1705 1732/1/1706 1728/1/1702 +f 1732/1/1706 1733/1/1707 1728/1/1702 +f 1733/1/1707 1725/1/1699 1728/1/1702 +f 1734/1/1708 1730/1/1704 1728/1/1702 +f 1735/1/1709 1720/1/1694 1722/1/1696 +f 1736/1/1710 1734/1/1708 1728/1/1702 +f 1729/1/1703 1737/1/1711 1727/1/1701 +f 1737/1/1711 2016/1/1712 1727/1/1701 +f 1739/1/1713 1740/1/1714 1738/1/1715 +f 1740/1/1714 1735/1/1709 1738/1/1715 +f 1740/1/1714 1720/1/1694 1735/1/1709 +f 2016/1/1712 1741/1/1716 1727/1/1701 +f 2016/1/1712 2015/1/1717 1741/1/1716 +f 2015/1/1717 1742/1/1718 1741/1/1716 +f 1742/1/1718 1743/1/1719 1741/1/1716 +f 1744/1/1720 1736/1/1710 1743/1/1719 +f 1742/1/1718 1744/1/1720 1743/1/1719 +f 1744/1/1720 1734/1/1708 1736/1/1710 +f 1725/1/1699 1745/1/1721 1723/1/1697 +f 1745/1/1721 1746/1/1722 1723/1/1697 +f 1746/1/1722 1747/1/1723 1723/1/1697 +f 1746/1/1722 1748/1/1724 1747/1/1723 +f 1749/1/1725 2016/1/1712 1737/1/1711 +f 1720/1/1694 1750/1/1726 1729/1/1703 +f 1751/1/1727 2016/1/1712 1749/1/1725 +f 1752/1/1728 1725/1/1699 1733/1/1707 +f 2007/1/1729 1734/1/1708 1744/1/1720 +f 1720/1/1694 1753/1/1730 1750/1/1726 +f 1754/1/1731 2016/1/1712 1751/1/1727 +f 1755/1/1732 1725/1/1699 1752/1/1728 +f 2008/1/1733 1734/1/1708 2007/1/1729 +f 1753/1/1730 1756/1/1734 1750/1/1726 +f 2009/1/1735 1734/1/1708 2008/1/1733 +f 1758/1/1736 1759/1/1737 2009/1/1735 +f 1759/1/1737 1757/1/1738 2009/1/1735 +f 1757/1/1738 1760/1/1739 2009/1/1735 +f 1760/1/1739 1734/1/1708 2009/1/1735 +f 1761/1/1740 2016/1/1712 1754/1/1731 +f 1762/1/1741 1725/1/1699 1755/1/1732 +f 1761/1/1740 2014/1/1742 2016/1/1712 +f 1986/1/1743 1758/1/1736 2009/1/1735 +f 1753/1/1730 1763/1/1744 1756/1/1734 +f 1764/1/1745 1725/1/1699 1762/1/1741 +f 1765/1/1746 1763/1/1744 1753/1/1730 +f 1762/1/1741 1767/1/1747 1764/1/1745 +f 1766/1/1748 2014/1/1742 1761/1/1740 +f 1767/1/1747 1768/1/1749 1764/1/1745 +f 1768/1/1749 1769/1/1750 1764/1/1745 +f 1770/1/1751 1765/1/1746 1753/1/1730 +f 1768/1/1749 1771/1/1752 1769/1/1750 +f 1772/1/1753 1770/1/1751 1753/1/1730 +f 1773/1/1754 1774/1/1755 1769/1/1750 +f 1774/1/1755 1791/1/1756 1769/1/1750 +f 1771/1/1752 1776/1/1757 1769/1/1750 +f 1776/1/1757 1775/1/1758 1769/1/1750 +f 1775/1/1758 1777/1/1759 1769/1/1750 +f 1777/1/1759 1773/1/1754 1769/1/1750 +f 1778/1/1760 1779/1/1761 2014/1/1742 +f 1766/1/1748 1780/1/1762 2014/1/1742 +f 1780/1/1762 1781/1/1763 2014/1/1742 +f 1781/1/1763 1778/1/1760 2014/1/1742 +f 1779/1/1761 1782/1/1764 2014/1/1742 +f 1782/1/1764 1783/1/1765 2014/1/1742 +f 1783/1/1765 1784/1/1766 2014/1/1742 +f 1776/1/1757 1758/1/1736 1986/1/1743 +f 1998/1/1767 1776/1/1757 1986/1/1743 +f 1999/1/1768 1776/1/1757 1998/1/1767 +f 1785/1/1769 1770/1/1751 1772/1/1753 +f 1791/1/1756 1786/1/1770 1769/1/1750 +f 1783/1/1765 2013/1/1771 1784/1/1766 +f 1787/1/1772 1776/1/1757 1999/1/1768 +f 1783/1/1765 1787/1/1772 2013/1/1771 +f 1787/1/1772 1999/1/1768 2013/1/1771 +f 1778/1/1760 1789/1/1773 1770/1/1751 +f 1788/1/1774 1778/1/1760 1770/1/1751 +f 1790/1/1775 1788/1/1774 1770/1/1751 +f 1785/1/1769 1790/1/1775 1770/1/1751 +f 1789/1/1773 1778/1/1760 1781/1/1763 +f 1758/1/1736 1776/1/1757 1771/1/1752 +f 1793/1/1776 1785/1/1769 1772/1/1753 +f 1792/1/1777 1793/1/1776 1772/1/1753 +f 1794/1/1778 1790/1/1775 1785/1/1769 +f 1793/1/1776 1794/1/1778 1785/1/1769 +f 1794/1/1778 1788/1/1774 1790/1/1775 +f 1794/1/1778 1795/1/1779 1788/1/1774 +f 1795/1/1779 1778/1/1760 1788/1/1774 +f 1796/1/1780 1779/1/1761 1778/1/1760 +f 1795/1/1779 1796/1/1780 1778/1/1760 +f 1796/1/1780 1782/1/1764 1779/1/1761 +f 1796/1/1780 1797/1/1781 1782/1/1764 +f 1797/1/1781 1783/1/1765 1782/1/1764 +f 1798/1/1782 1740/1/1714 1739/1/1713 +f 1798/1/1782 1799/1/1783 1740/1/1714 +f 1799/1/1783 1720/1/1694 1740/1/1714 +f 1799/1/1783 1800/1/1784 1720/1/1694 +f 1802/1/1785 1803/1/1786 1907/1/1787 +f 1802/1/1785 1801/1/1788 1803/1/1786 +f 1806/1/1789 1805/1/1478 1804/1/1479 +f 1807/1/1480 1805/1/1478 1806/1/1789 +f 1808/1/1790 1807/1/1480 1806/1/1789 +f 1809/1/1791 1807/1/1480 1808/1/1790 +f 1804/1/1479 1805/1/1478 1801/1/1788 +f 1802/1/1785 1804/1/1479 1801/1/1788 +f 1811/1/1792 1787/1/1772 1810/1/1793 +f 1811/1/1792 1812/1/1794 1787/1/1772 +f 1811/1/1792 1813/1/1795 1812/1/1794 +f 1813/1/1795 1814/1/1796 1812/1/1794 +f 1813/1/1795 1815/1/1797 1814/1/1796 +f 1816/1/1798 1741/1/1716 1817/1/1799 +f 1818/1/1800 1816/1/1798 1819/1/1801 +f 1820/1/1802 1818/1/1800 1819/1/1801 +f 1816/1/1798 1821/1/1803 1819/1/1801 +f 1821/1/1803 1822/1/1804 1819/1/1801 +f 1824/1/1805 1818/1/1800 1820/1/1802 +f 1823/1/1806 1824/1/1805 1820/1/1802 +f 1829/1/1807 1825/1/1808 1826/1/1809 +f 1827/1/1810 1830/1/1811 1828/1/1812 +f 1825/1/1808 1831/1/1813 1826/1/1809 +f 1827/1/1810 1832/1/1814 1830/1/1811 +f 1825/1/1808 1836/1/1815 1831/1/1813 +f 1834/1/1816 1833/1/1817 1825/1/1808 +f 1833/1/1817 1835/1/1818 1825/1/1808 +f 1835/1/1818 1836/1/1815 1825/1/1808 +f 1837/1/1819 1838/1/1820 1832/1/1814 +f 1838/1/1820 1839/1/1821 1832/1/1814 +f 1839/1/1821 1840/1/1822 1832/1/1814 +f 1827/1/1810 1837/1/1819 1832/1/1814 +f 1841/1/1823 1833/1/1817 1834/1/1816 +f 1839/1/1821 1842/1/1824 1840/1/1822 +f 1843/1/1825 1833/1/1817 1841/1/1823 +f 1844/1/1826 1845/1/1827 1841/1/1823 +f 1845/1/1827 1846/1/1828 1841/1/1823 +f 1846/1/1828 1843/1/1825 1841/1/1823 +f 1839/1/1821 1847/1/1829 1842/1/1824 +f 1848/1/1830 1844/1/1826 1841/1/1823 +f 1849/1/1831 1850/1/1832 1841/1/1823 +f 1850/1/1832 1848/1/1830 1841/1/1823 +f 1847/1/1829 1851/1/1833 1842/1/1824 +f 1852/1/1834 1850/1/1832 1849/1/1831 +f 1855/1/1835 1852/1/1834 1849/1/1831 +f 1847/1/1829 1853/1/1836 1851/1/1833 +f 1835/1/1818 1798/1/1782 1854/1/1837 +f 1800/1/1784 1799/1/1783 1835/1/1818 +f 1833/1/1817 1800/1/1784 1835/1/1818 +f 1799/1/1783 1798/1/1782 1835/1/1818 +f 1816/1/1798 1855/1/1835 1849/1/1831 +f 1818/1/1800 1855/1/1835 1816/1/1798 +f 1851/1/1833 1853/1/1836 1818/1/1800 +f 1974/1/1838 1855/1/1835 1818/1/1800 +f 1853/1/1836 1974/1/1838 1818/1/1800 +f 1857/1/1839 1858/1/1840 1838/1/1820 +f 1858/1/1840 1856/1/1841 1838/1/1820 +f 1856/1/1841 1839/1/1821 1838/1/1820 +f 1859/1/1842 1974/1/1838 1853/1/1836 +f 1860/1/1843 1974/1/1838 1859/1/1842 +f 1839/1/1821 1861/1/1844 1847/1/1829 +f 1862/1/1845 1833/1/1817 1843/1/1825 +f 1863/1/1846 1850/1/1832 1852/1/1834 +f 1864/1/1847 1971/1/1848 1860/1/1843 +f 1971/1/1848 1970/1/1849 1860/1/1843 +f 1970/1/1849 1974/1/1838 1860/1/1843 +f 1839/1/1821 1865/1/1850 1861/1/1844 +f 1866/1/1851 1833/1/1817 1862/1/1845 +f 1867/1/1852 1971/1/1848 1864/1/1847 +f 1839/1/1821 1868/1/1853 1865/1/1850 +f 1977/1/1854 1850/1/1832 1863/1/1846 +f 1869/1/1855 1833/1/1817 1866/1/1851 +f 1870/1/1856 1868/1/1853 1839/1/1821 +f 1866/1/1851 1871/1/1857 1869/1/1855 +f 1872/1/1858 1873/1/1859 1870/1/1856 +f 1873/1/1859 1868/1/1853 1870/1/1856 +f 1978/1/1860 1874/1/1861 1850/1/1832 +f 1977/1/1854 1978/1/1860 1850/1/1832 +f 1871/1/1857 1792/1/1777 1869/1/1855 +f 1875/1/1862 1872/1/1858 1870/1/1856 +f 1978/1/1860 1876/1/1863 1874/1/1861 +f 1877/1/1864 1971/1/1848 1867/1/1852 +f 1878/1/1865 1879/1/1866 1792/1/1777 +f 1871/1/1857 1878/1/1865 1792/1/1777 +f 1797/1/1781 1796/1/1780 1792/1/1777 +f 1796/1/1780 1795/1/1779 1792/1/1777 +f 1795/1/1779 1794/1/1778 1792/1/1777 +f 1794/1/1778 1793/1/1776 1792/1/1777 +f 1879/1/1866 1810/1/1793 1792/1/1777 +f 1810/1/1793 1797/1/1781 1792/1/1777 +f 1880/1/1867 1881/1/1868 1875/1/1862 +f 1882/1/1869 1880/1/1867 1875/1/1862 +f 1881/1/1868 1884/1/1870 1875/1/1862 +f 1884/1/1870 1883/1/1871 1875/1/1862 +f 1883/1/1871 1876/1/1863 1875/1/1862 +f 1876/1/1863 1872/1/1858 1875/1/1862 +f 1876/1/1863 1885/1/1872 1874/1/1861 +f 1876/1/1863 1971/1/1848 1877/1/1864 +f 1876/1/1863 1810/1/1793 1885/1/1872 +f 1886/1/1873 1876/1/1863 1877/1/1864 +f 1887/1/1874 1882/1/1869 1875/1/1862 +f 1810/1/1793 1888/1/1875 1885/1/1872 +f 1971/1/1848 1876/1/1863 1978/1/1860 +f 1889/1/1876 1876/1/1863 1886/1/1873 +f 1810/1/1793 1890/1/1877 1888/1/1875 +f 1890/1/1877 1810/1/1793 1879/1/1866 +f 1891/1/1878 1876/1/1863 1889/1/1876 +f 1876/1/1863 1891/1/1878 1872/1/1858 +f 1876/1/1863 1811/1/1792 1810/1/1793 +f 1876/1/1863 1892/1/1879 1811/1/1792 +f 1892/1/1879 1813/1/1795 1811/1/1792 +f 1892/1/1879 1893/1/1880 1813/1/1795 +f 1893/1/1880 1894/1/1881 1813/1/1795 +f 1894/1/1881 1815/1/1797 1813/1/1795 +f 1894/1/1881 1895/1/1882 1809/1/1791 +f 1815/1/1797 1894/1/1881 1809/1/1791 +f 1805/1/1478 1897/1/1883 1896/1/1576 +f 1807/1/1480 1897/1/1883 1805/1/1478 +f 1807/1/1480 1898/1/1577 1897/1/1883 +f 1809/1/1791 1898/1/1577 1807/1/1480 +f 1809/1/1791 1895/1/1882 1898/1/1577 +f 1896/1/1576 1899/1/1884 1801/1/1788 +f 1805/1/1478 1896/1/1576 1801/1/1788 +f 1801/1/1788 1900/1/1885 1901/1/1886 +f 1803/1/1786 1801/1/1788 1901/1/1886 +f 1899/1/1884 1902/1/1887 1900/1/1885 +f 1801/1/1788 1899/1/1884 1900/1/1885 +f 1903/1/1888 1803/1/1786 1901/1/1886 +f 1900/1/1885 1904/1/1889 1905/1/1890 +f 1901/1/1886 1900/1/1885 1905/1/1890 +f 1802/1/1785 1907/1/1787 1905/1/1890 +f 1906/1/1891 1802/1/1785 1905/1/1890 +f 1904/1/1889 1906/1/1891 1905/1/1890 +f 1909/1/1892 1906/1/1891 1904/1/1889 +f 1907/1/1787 1908/1/1893 1905/1/1890 +f 1906/1/1891 1804/1/1479 1802/1/1785 +f 1910/1/1894 1804/1/1479 1906/1/1891 +f 1910/1/1894 1806/1/1789 1804/1/1479 +f 1911/1/1895 1806/1/1789 1910/1/1894 +f 1911/1/1895 1808/1/1790 1806/1/1789 +f 1912/1/1896 1808/1/1790 1911/1/1895 +f 1912/1/1896 1913/1/1897 1814/1/1796 +f 1808/1/1790 1912/1/1896 1814/1/1796 +f 1812/1/1794 1914/1/1898 1787/1/1772 +f 1914/1/1898 1776/1/1757 1787/1/1772 +f 1913/1/1897 1914/1/1898 1812/1/1794 +f 1814/1/1796 1913/1/1897 1812/1/1794 +f 1817/1/1799 1743/1/1719 1915/1/1899 +f 1741/1/1716 1743/1/1719 1817/1/1799 +f 1919/1/1900 1817/1/1799 1916/1/1901 +f 1817/1/1799 1917/1/1902 1916/1/1901 +f 1918/1/1903 1919/1/1900 1916/1/1901 +f 1817/1/1799 1915/1/1899 1917/1/1902 +f 1915/1/1899 1920/1/1904 1917/1/1902 +f 1917/1/1902 1819/1/1801 1916/1/1901 +f 1820/1/1802 1819/1/1801 1917/1/1902 +f 1821/1/1803 1816/1/1798 1919/1/1900 +f 1816/1/1798 1817/1/1799 1919/1/1900 +f 1797/1/1781 1810/1/1793 1783/1/1765 +f 1810/1/1793 1787/1/1772 1783/1/1765 +f 1735/1/1709 1854/1/1837 1738/1/1715 +f 1835/1/1818 1854/1/1837 1735/1/1709 +f 1714/1/1686 1826/1/1809 1711/1/1687 +f 1714/1/1686 1829/1/1807 1826/1/1809 +f 1831/1/1813 1716/1/1691 1711/1/1687 +f 1826/1/1809 1831/1/1813 1711/1/1687 +f 1717/1/1685 1829/1/1807 1714/1/1686 +f 1717/1/1685 1825/1/1808 1829/1/1807 +f 1831/1/1813 1719/1/1693 1716/1/1691 +f 1831/1/1813 1836/1/1815 1719/1/1693 +f 1721/1/1695 1825/1/1808 1717/1/1685 +f 1721/1/1695 1834/1/1816 1825/1/1808 +f 1836/1/1815 1722/1/1696 1719/1/1693 +f 1836/1/1815 1835/1/1818 1722/1/1696 +f 1727/1/1701 1834/1/1816 1721/1/1695 +f 1727/1/1701 1841/1/1823 1834/1/1816 +f 1741/1/1716 1849/1/1831 1727/1/1701 +f 1816/1/1798 1849/1/1831 1741/1/1716 +f 1843/1/1825 1846/1/1828 1737/1/1711 +f 1729/1/1703 1843/1/1825 1737/1/1711 +f 1846/1/1828 1749/1/1725 1737/1/1711 +f 1845/1/1827 1749/1/1725 1846/1/1828 +f 1750/1/1726 1843/1/1825 1729/1/1703 +f 1845/1/1827 1751/1/1727 1749/1/1725 +f 1844/1/1826 1751/1/1727 1845/1/1827 +f 1862/1/1845 1843/1/1825 1750/1/1726 +f 1844/1/1826 1754/1/1731 1751/1/1727 +f 1756/1/1734 1862/1/1845 1750/1/1726 +f 1848/1/1830 1754/1/1731 1844/1/1826 +f 1866/1/1851 1862/1/1845 1756/1/1734 +f 1848/1/1830 1761/1/1740 1754/1/1731 +f 1850/1/1832 1761/1/1740 1848/1/1830 +f 1763/1/1744 1866/1/1851 1756/1/1734 +f 1850/1/1832 1766/1/1748 1761/1/1740 +f 1874/1/1861 1766/1/1748 1850/1/1832 +f 1871/1/1857 1866/1/1851 1763/1/1744 +f 1765/1/1746 1871/1/1857 1763/1/1744 +f 1874/1/1861 1780/1/1762 1766/1/1748 +f 1885/1/1872 1780/1/1762 1874/1/1861 +f 1878/1/1865 1871/1/1857 1765/1/1746 +f 1770/1/1751 1878/1/1865 1765/1/1746 +f 1885/1/1872 1781/1/1763 1780/1/1762 +f 1888/1/1875 1781/1/1763 1885/1/1872 +f 1879/1/1866 1878/1/1865 1770/1/1751 +f 1890/1/1877 1781/1/1763 1888/1/1875 +f 1890/1/1877 1879/1/1866 1770/1/1751 +f 1789/1/1773 1890/1/1877 1770/1/1751 +f 1890/1/1877 1789/1/1773 1781/1/1763 +f 1921/1/1905 1809/1/1791 1808/1/1790 +f 1815/1/1797 1922/1/1906 1814/1/1796 +f 1814/1/1796 1922/1/1906 1808/1/1790 +f 1922/1/1906 1921/1/1905 1808/1/1790 +f 1923/1/1907 1809/1/1791 1921/1/1905 +f 1923/1/1907 1924/1/1908 1809/1/1791 +f 1925/1/1909 1926/1/1910 1922/1/1906 +f 1815/1/1797 1925/1/1909 1922/1/1906 +f 1922/1/1906 1929/1/1911 1921/1/1905 +f 1929/1/1911 1927/1/1912 1921/1/1905 +f 1927/1/1912 1923/1/1907 1921/1/1905 +f 1926/1/1910 1929/1/1911 1922/1/1906 +f 1927/1/1912 1928/1/1913 1923/1/1907 +f 1930/1/1914 1929/1/1911 1926/1/1910 +f 1932/1/1915 1815/1/1797 1809/1/1791 +f 1924/1/1908 1932/1/1915 1809/1/1791 +f 1931/1/1916 1925/1/1909 1815/1/1797 +f 1932/1/1915 1931/1/1916 1815/1/1797 +f 1933/1/1917 1932/1/1915 1924/1/1908 +f 1931/1/1916 1934/1/1918 1925/1/1909 +f 1929/1/1911 1932/1/1915 1927/1/1912 +f 1931/1/1916 1932/1/1915 1929/1/1911 +f 1849/1/1831 1841/1/1823 1727/1/1701 +f 1835/1/1818 1735/1/1709 1722/1/1696 +f 1854/1/1837 1739/1/1713 1738/1/1715 +f 1854/1/1837 1798/1/1782 1739/1/1713 +f 1819/1/1801 1822/1/1804 1916/1/1901 +f 1822/1/1804 1918/1/1903 1916/1/1901 +f 1822/1/1804 1821/1/1803 1918/1/1903 +f 1821/1/1803 1919/1/1900 1918/1/1903 +f 1908/1/1893 1901/1/1886 1905/1/1890 +f 1903/1/1888 1901/1/1886 1908/1/1893 +f 1907/1/1787 1903/1/1888 1908/1/1893 +f 1803/1/1786 1903/1/1888 1907/1/1787 +f 1925/1/1909 1934/1/1918 1926/1/1910 +f 1934/1/1918 1930/1/1914 1926/1/1910 +f 1934/1/1918 1931/1/1916 1930/1/1914 +f 1931/1/1916 1929/1/1911 1930/1/1914 +f 1928/1/1913 1924/1/1908 1923/1/1907 +f 1933/1/1917 1924/1/1908 1928/1/1913 +f 1927/1/1912 1933/1/1917 1928/1/1913 +f 1932/1/1915 1933/1/1917 1927/1/1912 +f 1833/1/1817 1720/1/1694 1800/1/1784 +f 1833/1/1817 1753/1/1730 1720/1/1694 +f 1869/1/1855 1753/1/1730 1833/1/1817 +f 1792/1/1777 1753/1/1730 1869/1/1855 +f 1792/1/1777 1772/1/1753 1753/1/1730 +f 1786/1/1770 1875/1/1862 1769/1/1750 +f 1786/1/1770 1887/1/1874 1875/1/1862 +f 1791/1/1756 1887/1/1874 1786/1/1770 +f 1791/1/1756 1882/1/1869 1887/1/1874 +f 1774/1/1755 1882/1/1869 1791/1/1756 +f 1774/1/1755 1880/1/1867 1882/1/1869 +f 1773/1/1754 1880/1/1867 1774/1/1755 +f 1773/1/1754 1881/1/1868 1880/1/1867 +f 1777/1/1759 1881/1/1868 1773/1/1754 +f 1777/1/1759 1884/1/1870 1881/1/1868 +f 1775/1/1758 1884/1/1870 1777/1/1759 +f 1775/1/1758 1883/1/1871 1884/1/1870 +f 1746/1/1722 1858/1/1840 1748/1/1724 +f 1746/1/1722 1856/1/1841 1858/1/1840 +f 1745/1/1721 1856/1/1841 1746/1/1722 +f 1745/1/1721 1839/1/1821 1856/1/1841 +f 1899/1/1884 1906/1/1891 1909/1/1892 +f 1902/1/1887 1899/1/1884 1909/1/1892 +f 1897/1/1883 1910/1/1894 1896/1/1576 +f 1897/1/1883 1911/1/1895 1910/1/1894 +f 1897/1/1883 1898/1/1577 1911/1/1895 +f 1898/1/1577 1912/1/1896 1911/1/1895 +f 1898/1/1577 1895/1/1882 1912/1/1896 +f 1896/1/1576 1906/1/1891 1899/1/1884 +f 1896/1/1576 1910/1/1894 1906/1/1891 +f 1914/1/1898 1892/1/1879 1776/1/1757 +f 1892/1/1879 1876/1/1863 1776/1/1757 +f 1893/1/1880 1892/1/1879 1914/1/1898 +f 1913/1/1897 1893/1/1880 1914/1/1898 +f 1894/1/1881 1893/1/1880 1913/1/1897 +f 1743/1/1719 1818/1/1800 1915/1/1899 +f 1915/1/1899 1824/1/1805 1920/1/1904 +f 1915/1/1899 1818/1/1800 1824/1/1805 +f 1876/1/1863 1883/1/1871 1776/1/1757 +f 1883/1/1871 1775/1/1758 1776/1/1757 +f 1747/1/1723 1838/1/1820 1723/1/1697 +f 1857/1/1839 1838/1/1820 1747/1/1723 +f 1828/1/1812 1830/1/1811 1713/1/1690 +f 1715/1/1689 1828/1/1812 1713/1/1690 +f 1830/1/1811 1712/1/1688 1713/1/1690 +f 1715/1/1689 1827/1/1810 1828/1/1812 +f 1830/1/1811 1832/1/1814 1712/1/1688 +f 1718/1/1692 1827/1/1810 1715/1/1689 +f 1840/1/1822 1726/1/1700 1712/1/1688 +f 1832/1/1814 1840/1/1822 1712/1/1688 +f 1724/1/1698 1827/1/1810 1718/1/1692 +f 1724/1/1698 1837/1/1819 1827/1/1810 +f 1842/1/1824 1728/1/1702 1726/1/1700 +f 1840/1/1822 1842/1/1824 1726/1/1700 +f 1723/1/1697 1837/1/1819 1724/1/1698 +f 1723/1/1697 1838/1/1820 1837/1/1819 +f 1736/1/1710 1818/1/1800 1743/1/1719 +f 1851/1/1833 1818/1/1800 1736/1/1710 +f 1859/1/1842 1853/1/1836 1732/1/1706 +f 1731/1/1705 1859/1/1842 1732/1/1706 +f 1853/1/1836 1733/1/1707 1732/1/1706 +f 1847/1/1829 1733/1/1707 1853/1/1836 +f 1860/1/1843 1859/1/1842 1731/1/1705 +f 1730/1/1704 1860/1/1843 1731/1/1705 +f 1847/1/1829 1752/1/1728 1733/1/1707 +f 1861/1/1844 1752/1/1728 1847/1/1829 +f 1864/1/1847 1860/1/1843 1730/1/1704 +f 1861/1/1844 1755/1/1732 1752/1/1728 +f 1734/1/1708 1864/1/1847 1730/1/1704 +f 1865/1/1850 1755/1/1732 1861/1/1844 +f 1867/1/1852 1864/1/1847 1734/1/1708 +f 1865/1/1850 1762/1/1741 1755/1/1732 +f 1868/1/1853 1762/1/1741 1865/1/1850 +f 1760/1/1739 1867/1/1852 1734/1/1708 +f 1877/1/1864 1867/1/1852 1760/1/1739 +f 1868/1/1853 1767/1/1747 1762/1/1741 +f 1873/1/1859 1767/1/1747 1868/1/1853 +f 1757/1/1738 1877/1/1864 1760/1/1739 +f 1873/1/1859 1768/1/1749 1767/1/1747 +f 1886/1/1873 1877/1/1864 1757/1/1738 +f 1872/1/1858 1768/1/1749 1873/1/1859 +f 1872/1/1858 1771/1/1752 1768/1/1749 +f 1889/1/1876 1886/1/1873 1757/1/1738 +f 1759/1/1737 1889/1/1876 1757/1/1738 +f 1758/1/1736 1889/1/1876 1759/1/1737 +f 1891/1/1878 1889/1/1876 1758/1/1736 +f 1872/1/1858 1758/1/1736 1771/1/1752 +f 1891/1/1878 1758/1/1736 1872/1/1858 +f 1895/1/1882 1935/1/1919 1912/1/1896 +f 1936/1/1920 1894/1/1881 1913/1/1897 +f 1935/1/1919 1913/1/1897 1912/1/1896 +f 1935/1/1919 1936/1/1920 1913/1/1897 +f 1895/1/1882 1937/1/1921 1935/1/1919 +f 1937/1/1921 1938/1/1922 1935/1/1919 +f 1939/1/1923 1894/1/1881 1936/1/1920 +f 1939/1/1923 1940/1/1924 1894/1/1881 +f 1942/1/1925 1936/1/1920 1935/1/1919 +f 1938/1/1922 1942/1/1925 1935/1/1919 +f 1942/1/1925 1943/1/1926 1936/1/1920 +f 1943/1/1926 1939/1/1923 1936/1/1920 +f 1941/1/1927 1942/1/1925 1938/1/1922 +f 1894/1/1881 1945/1/1928 1895/1/1882 +f 1945/1/1928 1944/1/1929 1895/1/1882 +f 1944/1/1929 1937/1/1921 1895/1/1882 +f 1940/1/1924 1945/1/1928 1894/1/1881 +f 1944/1/1929 1946/1/1930 1937/1/1921 +f 1944/1/1929 1945/1/1928 1942/1/1925 +f 1945/1/1928 1943/1/1926 1942/1/1925 +f 1842/1/1824 1736/1/1710 1728/1/1702 +f 1851/1/1833 1736/1/1710 1842/1/1824 +f 1748/1/1724 1857/1/1839 1747/1/1723 +f 1748/1/1724 1858/1/1840 1857/1/1839 +f 1823/1/1806 1820/1/1802 1917/1/1902 +f 1920/1/1904 1823/1/1806 1917/1/1902 +f 1824/1/1805 1823/1/1806 1920/1/1904 +f 1900/1/1885 1902/1/1887 1904/1/1889 +f 1902/1/1887 1909/1/1892 1904/1/1889 +f 1943/1/1926 1940/1/1924 1939/1/1923 +f 1945/1/1928 1940/1/1924 1943/1/1926 +f 1937/1/1921 1946/1/1930 1938/1/1922 +f 1946/1/1930 1941/1/1927 1938/1/1922 +f 1946/1/1930 1944/1/1929 1941/1/1927 +f 1944/1/1929 1942/1/1925 1941/1/1927 +f 1725/1/1699 1839/1/1821 1745/1/1721 +f 1870/1/1856 1839/1/1821 1725/1/1699 +f 1764/1/1745 1870/1/1856 1725/1/1699 +f 1875/1/1862 1870/1/1856 1764/1/1745 +f 1769/1/1750 1875/1/1862 1764/1/1745 +f 1954/1/1931 1959/1/1932 1964/1/1933 +f 1959/1/1932 1947/1/1934 1964/1/1933 +f 1972/1/1935 1948/1/1936 1979/1/1937 +f 1948/1/1936 1949/1/1938 1979/1/1937 +f 1955/1/1939 1951/1/1940 1956/1/1941 +f 1951/1/1940 1950/1/1942 1956/1/1941 +f 1957/1/1943 1951/1/1940 1955/1/1939 +f 1952/1/1944 1951/1/1940 1957/1/1943 +f 1976/1/1945 1953/1/1946 1957/1/1943 +f 1953/1/1946 1952/1/1944 1957/1/1943 +f 1954/1/1931 1950/1/1942 1951/1/1940 +f 1955/1/1939 1956/1/1941 1948/1/1936 +f 1953/1/1946 1958/1/1947 1952/1/1944 +f 1958/1/1947 1951/1/1940 1952/1/1944 +f 1958/1/1947 1959/1/1932 1951/1/1940 +f 1959/1/1932 1954/1/1931 1951/1/1940 +f 1973/1/1948 1948/1/1936 1972/1/1935 +f 1955/1/1939 1948/1/1936 1973/1/1948 +f 1957/1/1943 1955/1/1939 1973/1/1948 +f 1976/1/1945 1957/1/1943 1973/1/1948 +f 1960/1/1949 1965/1/1950 1966/1/1951 +f 1960/1/1949 1961/1/1952 1965/1/1950 +f 1961/1/1952 1962/1/1953 1965/1/1950 +f 1962/1/1953 1967/1/1954 1965/1/1950 +f 1962/1/1953 1981/1/1955 1967/1/1954 +f 1962/1/1953 1963/1/1956 1981/1/1955 +f 1960/1/1949 1964/1/1933 1961/1/1952 +f 1966/1/1951 1965/1/1950 1949/1/1938 +f 1968/1/1957 1963/1/1956 1962/1/1953 +f 1961/1/1952 1968/1/1957 1962/1/1953 +f 1969/1/1958 1968/1/1957 1961/1/1952 +f 1964/1/1933 1969/1/1958 1961/1/1952 +f 1947/1/1934 1969/1/1958 1964/1/1933 +f 1949/1/1938 1965/1/1950 1979/1/1937 +f 1965/1/1950 1980/1/1959 1979/1/1937 +f 1965/1/1950 1967/1/1954 1980/1/1959 +f 1967/1/1954 1981/1/1955 1980/1/1959 +f 1975/1/1960 1970/1/1849 1976/1/1945 +f 1970/1/1849 1953/1/1946 1976/1/1945 +f 1974/1/1838 1970/1/1849 1975/1/1960 +f 1970/1/1849 1958/1/1947 1953/1/1946 +f 1971/1/1848 1958/1/1947 1970/1/1849 +f 1971/1/1848 1959/1/1932 1958/1/1947 +f 1974/1/1838 1972/1/1935 1855/1/1835 +f 1973/1/1948 1972/1/1935 1974/1/1838 +f 1975/1/1960 1973/1/1948 1974/1/1838 +f 1975/1/1960 1976/1/1945 1973/1/1948 +f 1959/1/1932 1978/1/1860 1947/1/1934 +f 1971/1/1848 1978/1/1860 1959/1/1932 +f 1855/1/1835 1979/1/1937 1852/1/1834 +f 1972/1/1935 1979/1/1937 1855/1/1835 +f 1968/1/1957 1977/1/1854 1963/1/1956 +f 1969/1/1958 1978/1/1860 1968/1/1957 +f 1978/1/1860 1977/1/1854 1968/1/1957 +f 1978/1/1860 1969/1/1958 1947/1/1934 +f 1979/1/1937 1863/1/1846 1852/1/1834 +f 1979/1/1937 1980/1/1959 1863/1/1846 +f 1981/1/1955 1863/1/1846 1980/1/1959 +f 1963/1/1956 1863/1/1846 1981/1/1955 +f 1963/1/1956 1977/1/1854 1863/1/1846 +f 1999/1/1768 1992/1/1961 2006/1/1962 +f 2013/1/1771 1999/1/1768 2006/1/1962 +f 1982/1/1963 1987/1/1964 2001/1/1965 +f 1987/1/1964 1997/1/1966 2001/1/1965 +f 1983/1/1967 1984/1/1968 1742/1/1718 +f 1984/1/1968 1744/1/1720 1742/1/1718 +f 1987/1/1964 1988/1/1969 1997/1/1966 +f 1988/1/1969 1996/1/1970 1997/1/1966 +f 1988/1/1969 1995/1/1971 1996/1/1970 +f 1988/1/1969 1989/1/1972 1995/1/1971 +f 1989/1/1972 1986/1/1743 1995/1/1971 +f 1986/1/1743 2009/1/1735 1995/1/1971 +f 1991/1/1973 1988/1/1969 1987/1/1964 +f 1990/1/1974 1991/1/1973 1987/1/1964 +f 1988/1/1969 1991/1/1973 1989/1/1972 +f 1990/1/1974 1992/1/1961 1991/1/1973 +f 1994/1/1975 1993/1/1976 1984/1/1968 +f 1994/1/1975 1996/1/1970 1993/1/1976 +f 1996/1/1970 1995/1/1971 1993/1/1976 +f 1997/1/1966 1996/1/1970 1994/1/1975 +f 1990/1/1974 1987/1/1964 1982/1/1963 +f 2006/1/1962 1990/1/1974 1982/1/1963 +f 1992/1/1961 1990/1/1974 2006/1/1962 +f 1998/1/1767 1986/1/1743 1989/1/1972 +f 1991/1/1973 1998/1/1767 1989/1/1972 +f 1999/1/1768 1998/1/1767 1991/1/1973 +f 1992/1/1961 1999/1/1768 1991/1/1973 +f 1984/1/1968 2007/1/1729 1744/1/1720 +f 1984/1/1968 1993/1/1976 2007/1/1729 +f 1993/1/1976 2008/1/1733 2007/1/1729 +f 1993/1/1976 1995/1/1971 2008/1/1733 +f 1995/1/1971 2009/1/1735 2008/1/1733 +f 1994/1/1975 1984/1/1968 1983/1/1967 +f 2000/1/1977 1994/1/1975 1983/1/1967 +f 1997/1/1966 1994/1/1975 2000/1/1977 +f 2001/1/1965 1997/1/1966 2000/1/1977 +f 2012/1/1978 2002/1/1979 2001/1/1965 +f 2002/1/1979 1982/1/1963 2001/1/1965 +f 2011/1/1980 2003/1/1981 2012/1/1978 +f 2003/1/1981 2002/1/1979 2012/1/1978 +f 2016/1/1712 1985/1/1982 2011/1/1980 +f 1985/1/1982 2003/1/1981 2011/1/1980 +f 2003/1/1981 2004/1/1983 2002/1/1979 +f 2005/1/1984 1982/1/1963 2002/1/1979 +f 2004/1/1983 2005/1/1984 2002/1/1979 +f 2005/1/1984 2006/1/1962 1982/1/1963 +f 2010/1/1985 2000/1/1977 1983/1/1967 +f 2010/1/1985 2001/1/1965 2000/1/1977 +f 2010/1/1985 2012/1/1978 2001/1/1965 +f 2011/1/1980 2012/1/1978 2010/1/1985 +f 2014/1/1742 2004/1/1983 2003/1/1981 +f 1985/1/1982 2014/1/1742 2003/1/1981 +f 2014/1/1742 1784/1/1766 2004/1/1983 +f 1784/1/1766 2005/1/1984 2004/1/1983 +f 1784/1/1766 2013/1/1771 2005/1/1984 +f 2013/1/1771 2006/1/1962 2005/1/1984 +f 2010/1/1985 1983/1/1967 1742/1/1718 +f 2015/1/1717 2010/1/1985 1742/1/1718 +f 2011/1/1980 2010/1/1985 2015/1/1717 +f 2016/1/1712 2011/1/1980 2015/1/1717 +f 2014/1/1742 1985/1/1982 2016/1/1712 +f 1948/1/1936 1966/1/1951 1949/1/1938 +f 1956/1/1941 1966/1/1951 1948/1/1936 +f 1950/1/1942 1964/1/1933 1960/1/1949 +f 1954/1/1931 1964/1/1933 1950/1/1942 +f 1956/1/1941 1960/1/1949 1966/1/1951 +f 1950/1/1942 1960/1/1949 1956/1/1941 diff --git a/resources/quality/ultimaker_s3 b/resources/quality/ultimaker_s3 deleted file mode 120000 index f2a52666c7..0000000000 --- a/resources/quality/ultimaker_s3 +++ /dev/null @@ -1 +0,0 @@ -/home/ruben/Projects/cura-private-data/resources/quality/ultimaker_s3 \ No newline at end of file diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.25_ABS_Normal_Quality.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.25_ABS_Normal_Quality.inst.cfg new file mode 100644 index 0000000000..3116222771 --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.25_ABS_Normal_Quality.inst.cfg @@ -0,0 +1,20 @@ +[general] +version = 4 +name = Fine +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = normal +weight = 0 +material = generic_abs +variant = AA 0.25 + +[values] +cool_fan_speed = 40 +infill_overlap = 15 +material_final_print_temperature = =material_print_temperature - 5 +retraction_prime_speed = 25 +speed_topbottom = =math.ceil(speed_print * 30 / 55) +wall_thickness = 0.92 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.25_CPE_Normal_Quality.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.25_CPE_Normal_Quality.inst.cfg new file mode 100644 index 0000000000..350985ef89 --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.25_CPE_Normal_Quality.inst.cfg @@ -0,0 +1,20 @@ +[general] +version = 4 +name = Fine +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = normal +weight = 0 +material = generic_cpe +variant = AA 0.25 + +[values] +retraction_combing_max_distance = 50 +retraction_extrusion_window = 0.5 +speed_infill = =math.ceil(speed_print * 40 / 55) +speed_topbottom = =math.ceil(speed_print * 30 / 55) +top_bottom_thickness = 0.8 +wall_thickness = 0.92 \ No newline at end of file diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.25_Nylon_Normal_Quality.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.25_Nylon_Normal_Quality.inst.cfg new file mode 100644 index 0000000000..882bb06cd4 --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.25_Nylon_Normal_Quality.inst.cfg @@ -0,0 +1,35 @@ +[general] +version = 4 +name = Fine +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = normal +weight = 0 +material = generic_nylon +variant = AA 0.25 + +[values] +cool_min_layer_time_fan_speed_max = 20 +cool_min_speed = 12 +infill_line_width = =round(line_width * 0.5 / 0.4, 2) +machine_nozzle_cool_down_speed = 0.9 +machine_nozzle_heat_up_speed = 1.4 +ooze_shield_angle = 40 +raft_acceleration = =acceleration_layer_0 +raft_airgap = =round(layer_height_0 * 0.85, 2) +raft_interface_thickness = =round(machine_nozzle_size * 0.3 / 0.4, 3) +raft_jerk = =jerk_layer_0 +raft_margin = 10 +raft_surface_thickness = =round(machine_nozzle_size * 0.2 / 0.4, 2) +retraction_min_travel = 5 +skin_overlap = 50 +speed_print = 70 +speed_topbottom = =math.ceil(speed_print * 30 / 70) +speed_wall = =math.ceil(speed_print * 30 / 70) +switch_extruder_prime_speed = 30 +switch_extruder_retraction_amount = 30 +switch_extruder_retraction_speeds = 40 +wall_line_width_x = =wall_line_width diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.25_PC_Normal_Quality.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.25_PC_Normal_Quality.inst.cfg new file mode 100644 index 0000000000..5e34121579 --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.25_PC_Normal_Quality.inst.cfg @@ -0,0 +1,55 @@ +[general] +version = 4 +name = Fine - Experimental +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = normal +weight = 0 +material = generic_pc +variant = AA 0.25 +is_experimental = True + +[values] +acceleration_enabled = True +acceleration_print = 4000 +adhesion_type = brim +brim_width = 20 +cool_fan_full_at_height = =layer_height_0 + layer_height +cool_fan_speed_max = 50 +cool_min_layer_time_fan_speed_max = 5 +cool_min_speed = 5 +infill_line_width = =line_width +infill_pattern = triangles +infill_wipe_dist = 0.1 +jerk_enabled = True +jerk_print = 25 +machine_min_cool_heat_time_window = 15 +multiple_mesh_overlap = 0 +ooze_shield_angle = 40 +prime_tower_enable = True +prime_tower_wipe_enabled = True +raft_airgap = 0.25 +raft_interface_thickness = =max(layer_height * 1.5, 0.225) +retraction_count_max = 80 +retraction_hop = 2 +retraction_hop_only_when_collides = True +retraction_min_travel = 0.8 +retraction_prime_speed = 15 +skin_overlap = 30 +speed_layer_0 = =math.ceil(speed_print * 25 / 50) +speed_print = 50 +speed_topbottom = =math.ceil(speed_print * 25 / 50) +speed_wall = =math.ceil(speed_print * 40 / 50) +speed_wall_0 = =math.ceil(speed_wall * 25 / 40) +support_bottom_distance = =support_z_distance +support_interface_density = 87.5 +support_interface_pattern = lines +switch_extruder_prime_speed = 15 +switch_extruder_retraction_amount = 20 +switch_extruder_retraction_speeds = 35 +wall_0_inset = 0 +wall_line_width_x = =line_width +wall_thickness = 1.2 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.25_PLA_Normal_Quality.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.25_PLA_Normal_Quality.inst.cfg new file mode 100644 index 0000000000..b216eac68a --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.25_PLA_Normal_Quality.inst.cfg @@ -0,0 +1,36 @@ +[general] +version = 4 +name = Fine +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = normal +weight = 0 +material = generic_pla +variant = AA 0.25 + +[values] +brim_width = 8 +cool_fan_full_at_height = =layer_height_0 +cool_min_speed = 10 +infill_overlap = 10 +infill_pattern = grid +machine_nozzle_cool_down_speed = 0.9 +machine_nozzle_heat_up_speed = 1.4 +material_final_print_temperature = =max(-273.15, material_print_temperature - 15) +material_initial_print_temperature = =max(-273.15, material_print_temperature - 10) +material_print_temperature = 190 +retraction_hop = 0.2 +skin_overlap = 5 +speed_layer_0 = =speed_print +speed_print = 30 +speed_travel_layer_0 = 120 +speed_wall = =math.ceil(speed_print * 25 / 30) +speed_wall_0 = =math.ceil(speed_print * 20 / 30) +top_bottom_thickness = 0.72 +travel_avoid_distance = 0.4 +wall_0_inset = 0.015 +wall_0_wipe_dist = 0.25 +wall_thickness = 0.7 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.25_PP_Normal_Quality.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.25_PP_Normal_Quality.inst.cfg new file mode 100644 index 0000000000..32c40c3787 --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.25_PP_Normal_Quality.inst.cfg @@ -0,0 +1,59 @@ +[general] +version = 4 +name = Fine - Experimental +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = normal +weight = 0 +material = generic_pp +variant = AA 0.25 +is_experimental = True + +[values] +acceleration_enabled = True +acceleration_print = 4000 +brim_width = 10 +cool_fan_speed_max = 100 +cool_min_layer_time_fan_speed_max = 5 +cool_min_speed = 2.5 +infill_line_width = =round(line_width * 0.38 / 0.38, 2) +infill_pattern = tetrahedral +infill_wipe_dist = 0.1 +jerk_enabled = True +jerk_print = 25 +line_width = =machine_nozzle_size * 0.92 +machine_min_cool_heat_time_window = 15 +material_bed_temperature_layer_0 = =material_bed_temperature + 5 +material_final_print_temperature = =material_print_temperature - 10 +material_initial_print_temperature = =material_print_temperature - 5 +material_print_temperature = =default_material_print_temperature - 15 +material_print_temperature_layer_0 = =material_print_temperature + 3 +multiple_mesh_overlap = 0 +prime_tower_enable = False +prime_tower_size = 16 +prime_tower_wipe_enabled = True +retraction_count_max = 6 +retraction_extra_prime_amount = 0.2 +retraction_extrusion_window = 6.5 +retraction_hop = 2 +retraction_hop_only_when_collides = True +retraction_min_travel = 0.8 +retraction_prime_speed = 13 +speed_equalize_flow_enabled = True +speed_layer_0 = =math.ceil(speed_print * 15 / 25) +speed_print = 25 +speed_travel_layer_0 = 50 +speed_wall = =math.ceil(speed_print * 25 / 25) +speed_wall_0 = =math.ceil(speed_wall * 25 / 25) +support_angle = 50 +switch_extruder_prime_speed = 15 +switch_extruder_retraction_amount = 20 +switch_extruder_retraction_speeds = 35 +top_bottom_thickness = 1 +travel_avoid_distance = 3 +wall_0_inset = 0 +wall_line_width_x = =line_width +wall_thickness = =line_width * 3 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.25_TPLA_Normal_Quality.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.25_TPLA_Normal_Quality.inst.cfg new file mode 100644 index 0000000000..bc04462e00 --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.25_TPLA_Normal_Quality.inst.cfg @@ -0,0 +1,40 @@ +[general] +version = 4 +name = Fine +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = normal +weight = 0 +material = generic_tough_pla +variant = AA 0.25 + +[values] +brim_width = 8 +cool_fan_full_at_height = =layer_height_0 +cool_min_speed = 7 +infill_line_width = =line_width +infill_overlap = 10 +infill_pattern = grid +line_width = =machine_nozzle_size * 0.92 +machine_nozzle_cool_down_speed = 0.9 +machine_nozzle_heat_up_speed = 1.4 +material_final_print_temperature = =max(-273.15, material_print_temperature - 15) +material_initial_print_temperature = =max(-273.15, material_print_temperature - 10) +material_print_temperature = =default_material_print_temperature - 15 +skin_overlap = 5 +speed_layer_0 = =math.ceil(speed_print * 30 / 30) +speed_print = 30 +speed_topbottom = =math.ceil(speed_print * 20 / 30) +speed_travel_layer_0 = 120 +speed_wall = =math.ceil(speed_print * 25 / 30) +speed_wall_0 = =math.ceil(speed_print * 20 / 30) +top_bottom_thickness = 0.72 +wall_0_inset = 0.015 +wall_0_wipe_dist = 0.25 +wall_line_width = =line_width +wall_line_width_x= =line_width +wall_thickness = 0.7 + diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_ABS_Draft_Print.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_ABS_Draft_Print.inst.cfg new file mode 100644 index 0000000000..7ffab11e22 --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_ABS_Draft_Print.inst.cfg @@ -0,0 +1,31 @@ +[general] +version = 4 +name = Fast +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = draft +weight = -2 +material = generic_abs +variant = AA 0.4 + +[values] +machine_nozzle_cool_down_speed = 0.85 +machine_nozzle_heat_up_speed = 1.5 +material_print_temperature = =default_material_print_temperature + 20 +material_initial_print_temperature = =material_print_temperature - 15 +material_final_print_temperature = =material_print_temperature - 20 +prime_tower_enable = False +skin_overlap = 20 +speed_print = 60 +speed_layer_0 = =math.ceil(speed_print * 20 / 60) +speed_topbottom = =math.ceil(speed_print * 35 / 60) +speed_wall = =math.ceil(speed_print * 45 / 60) +speed_wall_0 = =math.ceil(speed_wall * 35 / 45) +wall_thickness = 1 + +infill_line_width = =round(line_width * 0.4 / 0.35, 2) +speed_infill = =math.ceil(speed_print * 50 / 60) + diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_ABS_Fast_Print.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_ABS_Fast_Print.inst.cfg new file mode 100644 index 0000000000..e5fd572624 --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_ABS_Fast_Print.inst.cfg @@ -0,0 +1,30 @@ +[general] +version = 4 +name = Normal +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = fast +weight = -1 +material = generic_abs +variant = AA 0.4 + +[values] +cool_min_speed = 7 +machine_nozzle_cool_down_speed = 0.85 +machine_nozzle_heat_up_speed = 1.5 +material_print_temperature = =default_material_print_temperature + 15 +material_initial_print_temperature = =material_print_temperature - 15 +material_final_print_temperature = =material_print_temperature - 20 +prime_tower_enable = False +speed_print = 60 +speed_layer_0 = =math.ceil(speed_print * 20 / 60) +speed_topbottom = =math.ceil(speed_print * 30 / 60) +speed_wall = =math.ceil(speed_print * 40 / 60) +speed_wall_0 = =math.ceil(speed_wall * 30 / 40) + +infill_line_width = =round(line_width * 0.4 / 0.35, 2) +speed_infill = =math.ceil(speed_print * 45 / 60) + diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_ABS_High_Quality.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_ABS_High_Quality.inst.cfg new file mode 100644 index 0000000000..8ec152171b --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_ABS_High_Quality.inst.cfg @@ -0,0 +1,29 @@ +[general] +version = 4 +name = Extra Fine +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = high +weight = 1 +material = generic_abs +variant = AA 0.4 + +[values] +cool_min_speed = 12 +machine_nozzle_cool_down_speed = 0.8 +machine_nozzle_heat_up_speed = 1.5 +material_print_temperature = =default_material_print_temperature + 5 +material_initial_print_temperature = =material_print_temperature - 15 +material_final_print_temperature = =material_print_temperature - 20 +prime_tower_enable = False +speed_print = 50 +speed_layer_0 = =math.ceil(speed_print * 20 / 50) +speed_topbottom = =math.ceil(speed_print * 30 / 50) +speed_wall = =math.ceil(speed_print * 30 / 50) + +infill_line_width = =round(line_width * 0.4 / 0.35, 2) +speed_infill = =math.ceil(speed_print * 40 / 50) + diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_ABS_Normal_Quality.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_ABS_Normal_Quality.inst.cfg new file mode 100644 index 0000000000..4f9a156b22 --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_ABS_Normal_Quality.inst.cfg @@ -0,0 +1,27 @@ +[general] +version = 4 +name = Fine +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = normal +weight = 0 +material = generic_abs +variant = AA 0.4 + +[values] +machine_nozzle_cool_down_speed = 0.85 +machine_nozzle_heat_up_speed = 1.5 +material_print_temperature = =default_material_print_temperature + 10 +material_initial_print_temperature = =material_print_temperature - 15 +material_final_print_temperature = =material_print_temperature - 20 +prime_tower_enable = False +speed_print = 55 +speed_layer_0 = =math.ceil(speed_print * 20 / 55) +speed_topbottom = =math.ceil(speed_print * 30 / 55) +speed_wall = =math.ceil(speed_print * 30 / 55) + +infill_line_width = =round(line_width * 0.4 / 0.35, 2) +speed_infill = =math.ceil(speed_print * 40 / 55) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_BAM_Draft_Print.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_BAM_Draft_Print.inst.cfg new file mode 100644 index 0000000000..98e79c0475 --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_BAM_Draft_Print.inst.cfg @@ -0,0 +1,40 @@ +[general] +version = 4 +name = Fast +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = draft +weight = -2 +material = generic_bam +variant = AA 0.4 + +[values] +brim_replaces_support = False +cool_fan_full_at_height = =layer_height_0 + 2 * layer_height +cool_fan_speed_max = =cool_fan_speed +machine_nozzle_cool_down_speed = 0.75 +machine_nozzle_heat_up_speed = 1.6 +material_print_temperature = =default_material_print_temperature + 5 +# prime_tower_enable: see CURA-4248 +prime_tower_enable = =min(extruderValues('material_surface_energy')) < 100 +skin_overlap = 20 +speed_layer_0 = =math.ceil(speed_print * 20 / 70) +speed_topbottom = =math.ceil(speed_print * 35 / 70) +speed_wall = =math.ceil(speed_print * 50 / 70) +speed_wall_0 = =math.ceil(speed_wall * 35 / 50) +top_bottom_thickness = 1 +wall_thickness = 1 +support_brim_enable = True +support_interface_enable = True +support_interface_density = =min(extruderValues('material_surface_energy')) +support_interface_pattern = ='lines' if support_interface_density < 100 else 'concentric' +support_top_distance = =math.ceil(min(extruderValues('material_adhesion_tendency')) / 2) * layer_height +support_bottom_distance = =math.ceil(min(extruderValues('material_adhesion_tendency')) / 2) * layer_height +support_angle = 45 +support_join_distance = 5 +support_offset = 2 +support_pattern = triangles +support_infill_rate = =10 if support_enable else 0 if support_tree_enable else 10 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_BAM_Fast_Print.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_BAM_Fast_Print.inst.cfg new file mode 100644 index 0000000000..10b8791943 --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_BAM_Fast_Print.inst.cfg @@ -0,0 +1,39 @@ +[general] +version = 4 +name = Normal +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = fast +weight = -1 +material = generic_bam +variant = AA 0.4 + +[values] +brim_replaces_support = False +cool_fan_full_at_height = =layer_height_0 + 2 * layer_height +cool_fan_speed_max = =cool_fan_speed +machine_nozzle_cool_down_speed = 0.75 +machine_nozzle_heat_up_speed = 1.6 +# prime_tower_enable: see CURA-4248 +prime_tower_enable = =min(extruderValues('material_surface_energy')) < 100 +speed_print = 80 +speed_layer_0 = =math.ceil(speed_print * 20 / 80) +speed_topbottom = =math.ceil(speed_print * 30 / 80) +speed_wall = =math.ceil(speed_print * 40 / 80) +speed_wall_0 = =math.ceil(speed_wall * 30 / 40) +top_bottom_thickness = 1 +wall_thickness = 1 +support_brim_enable = True +support_interface_enable = True +support_interface_density = =min(extruderValues('material_surface_energy')) +support_interface_pattern = ='lines' if support_interface_density < 100 else 'concentric' +support_top_distance = =math.ceil(min(extruderValues('material_adhesion_tendency')) / 1) * layer_height +support_bottom_distance = =math.ceil(min(extruderValues('material_adhesion_tendency')) / 2) * layer_height +support_angle = 45 +support_join_distance = 5 +support_offset = 2 +support_pattern = triangles +support_infill_rate = =10 if support_enable else 0 if support_tree_enable else 10 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_BAM_Normal_Quality.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_BAM_Normal_Quality.inst.cfg new file mode 100644 index 0000000000..00c8f60b74 --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_BAM_Normal_Quality.inst.cfg @@ -0,0 +1,38 @@ +[general] +version = 4 +name = Fine +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = normal +weight = 0 +material = generic_bam +variant = AA 0.4 + +[values] +brim_replaces_support = False +cool_fan_full_at_height = =layer_height_0 + 2 * layer_height +cool_fan_speed_max = =cool_fan_speed +cool_min_speed = 7 +machine_nozzle_cool_down_speed = 0.75 +machine_nozzle_heat_up_speed = 1.6 +material_print_temperature = =default_material_print_temperature - 10 +# prime_tower_enable: see CURA-4248 +prime_tower_enable = =min(extruderValues('material_surface_energy')) < 100 +skin_overlap = 10 +speed_layer_0 = =math.ceil(speed_print * 20 / 70) +support_brim_enable = True +support_interface_enable = True +support_interface_density = =min(extruderValues('material_surface_energy')) +support_interface_pattern = ='lines' if support_interface_density < 100 else 'concentric' +support_top_distance = =math.ceil(min(extruderValues('material_adhesion_tendency')) / 1) * layer_height +support_bottom_distance = =math.ceil(min(extruderValues('material_adhesion_tendency')) / 2) * layer_height +support_angle = 45 +support_join_distance = 5 +support_offset = 2 +support_pattern = triangles +support_infill_rate = =10 if support_enable else 0 if support_tree_enable else 10 +top_bottom_thickness = 1 +wall_thickness = 1 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_CPEP_Draft_Print.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_CPEP_Draft_Print.inst.cfg new file mode 100644 index 0000000000..4e6feee81a --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_CPEP_Draft_Print.inst.cfg @@ -0,0 +1,48 @@ +[general] +version = 4 +name = Fast +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = draft +weight = -2 +material = generic_cpe_plus +variant = AA 0.4 + +[values] +acceleration_enabled = True +acceleration_print = 4000 +cool_fan_speed_max = 80 +cool_min_speed = 5 +infill_line_width = =round(line_width * 0.35 / 0.35, 2) +infill_overlap = 0 +infill_wipe_dist = 0 +jerk_enabled = True +jerk_print = 25 +machine_min_cool_heat_time_window = 15 +material_final_print_temperature = =material_print_temperature - 10 +material_initial_print_temperature = =material_print_temperature - 5 +material_print_temperature = =default_material_print_temperature + 10 +material_print_temperature_layer_0 = =material_print_temperature +multiple_mesh_overlap = 0 +prime_tower_enable = True +prime_tower_wipe_enabled = True +retraction_combing_max_distance = 50 +retraction_extrusion_window = 1 +retraction_hop = 0.2 +retraction_hop_enabled = False +retraction_hop_only_when_collides = True +skin_overlap = 20 +speed_layer_0 = =math.ceil(speed_print * 20 / 50) +speed_print = 50 +speed_topbottom = =math.ceil(speed_print * 40 / 50) + +speed_wall = =math.ceil(speed_print * 50 / 50) +speed_wall_0 = =math.ceil(speed_wall * 40 / 50) +support_bottom_distance = =support_z_distance +support_z_distance = =layer_height +wall_0_inset = 0 +wall_thickness = 1 + diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_CPEP_Fast_Print.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_CPEP_Fast_Print.inst.cfg new file mode 100644 index 0000000000..49fcd51a8f --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_CPEP_Fast_Print.inst.cfg @@ -0,0 +1,46 @@ +[general] +version = 4 +name = Normal +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = fast +weight = -1 +material = generic_cpe_plus +variant = AA 0.4 + +[values] +acceleration_enabled = True +acceleration_print = 4000 +cool_fan_speed_max = 80 +cool_min_speed = 6 +infill_line_width = =round(line_width * 0.35 / 0.35, 2) +infill_overlap = 0 +infill_wipe_dist = 0 +jerk_enabled = True +jerk_print = 25 +machine_min_cool_heat_time_window = 15 +material_final_print_temperature = =material_print_temperature - 10 +material_initial_print_temperature = =material_print_temperature - 5 +material_print_temperature = =default_material_print_temperature + 10 +material_print_temperature_layer_0 = =material_print_temperature +multiple_mesh_overlap = 0 +prime_tower_enable = True +prime_tower_wipe_enabled = True +retraction_combing_max_distance = 50 +retraction_extrusion_window = 1 +retraction_hop = 0.2 +retraction_hop_enabled = False +retraction_hop_only_when_collides = True +skin_overlap = 20 +speed_layer_0 = =math.ceil(speed_print * 20 / 45) +speed_print = 45 +speed_topbottom = =math.ceil(speed_print * 35 / 45) + +speed_wall = =math.ceil(speed_print * 45 / 45) +speed_wall_0 = =math.ceil(speed_wall * 35 / 45) +support_bottom_distance = =support_z_distance +support_z_distance = =layer_height +wall_0_inset = 0 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_CPEP_High_Quality.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_CPEP_High_Quality.inst.cfg new file mode 100644 index 0000000000..6e0408d82d --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_CPEP_High_Quality.inst.cfg @@ -0,0 +1,48 @@ +[general] +version = 4 +name = Extra Fine +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = high +weight = 1 +material = generic_cpe_plus +variant = AA 0.4 + +[values] +acceleration_enabled = True +acceleration_print = 4000 +cool_fan_speed_max = 50 +cool_min_speed = 5 +infill_line_width = =round(line_width * 0.35 / 0.35, 2) +infill_overlap = 0 +infill_wipe_dist = 0 +jerk_enabled = True +jerk_print = 25 +machine_min_cool_heat_time_window = 15 +machine_nozzle_cool_down_speed = 0.85 +machine_nozzle_heat_up_speed = 1.5 +material_final_print_temperature = =material_print_temperature - 10 +material_initial_print_temperature = =material_print_temperature - 5 +material_print_temperature = =default_material_print_temperature + 2 +material_print_temperature_layer_0 = =material_print_temperature +multiple_mesh_overlap = 0 +prime_tower_enable = True +prime_tower_wipe_enabled = True +retraction_combing_max_distance = 50 +retraction_extrusion_window = 1 +retraction_hop = 0.2 +retraction_hop_enabled = False +retraction_hop_only_when_collides = True +skin_overlap = 20 +speed_layer_0 = =math.ceil(speed_print * 20 / 40) +speed_print = 40 +speed_topbottom = =math.ceil(speed_print * 30 / 35) + +speed_wall = =math.ceil(speed_print * 35 / 40) +speed_wall_0 = =math.ceil(speed_wall * 30 / 35) +support_bottom_distance = =support_z_distance +support_z_distance = =layer_height +wall_0_inset = 0 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_CPEP_Normal_Quality.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_CPEP_Normal_Quality.inst.cfg new file mode 100644 index 0000000000..e24a84d32b --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_CPEP_Normal_Quality.inst.cfg @@ -0,0 +1,48 @@ +[general] +version = 4 +name = Fine +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = normal +weight = 0 +material = generic_cpe_plus +variant = AA 0.4 + +[values] +acceleration_enabled = True +acceleration_print = 4000 +cool_fan_speed_max = 50 +cool_min_speed = 7 +infill_line_width = =round(line_width * 0.35 / 0.35, 2) +infill_overlap = 0 +infill_wipe_dist = 0 +jerk_enabled = True +jerk_print = 25 +machine_min_cool_heat_time_window = 15 +machine_nozzle_cool_down_speed = 0.85 +machine_nozzle_heat_up_speed = 1.5 +material_final_print_temperature = =material_print_temperature - 10 +material_initial_print_temperature = =material_print_temperature - 5 +material_print_temperature = =default_material_print_temperature + 5 +material_print_temperature_layer_0 = =material_print_temperature +multiple_mesh_overlap = 0 +prime_tower_enable = True +prime_tower_wipe_enabled = True +retraction_combing_max_distance = 50 +retraction_extrusion_window = 1 +retraction_hop = 0.2 +retraction_hop_enabled = False +retraction_hop_only_when_collides = True +skin_overlap = 20 +speed_layer_0 = =math.ceil(speed_print * 20 / 40) +speed_print = 40 +speed_topbottom = =math.ceil(speed_print * 30 / 35) + +speed_wall = =math.ceil(speed_print * 35 / 40) +speed_wall_0 = =math.ceil(speed_wall * 30 / 35) +support_bottom_distance = =support_z_distance +support_z_distance = =layer_height +wall_0_inset = 0 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_CPE_Draft_Print.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_CPE_Draft_Print.inst.cfg new file mode 100644 index 0000000000..284cef4107 --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_CPE_Draft_Print.inst.cfg @@ -0,0 +1,29 @@ +[general] +version = 4 +name = Fast +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = draft +weight = -2 +material = generic_cpe +variant = AA 0.4 + +[values] +material_print_temperature = =default_material_print_temperature + 10 +material_initial_print_temperature = =material_print_temperature - 5 +material_final_print_temperature = =material_print_temperature - 10 +retraction_combing_max_distance = 50 +skin_overlap = 20 +speed_print = 60 +speed_layer_0 = =math.ceil(speed_print * 20 / 60) +speed_topbottom = =math.ceil(speed_print * 35 / 60) +speed_wall = =math.ceil(speed_print * 45 / 60) +speed_wall_0 = =math.ceil(speed_wall * 35 / 45) +wall_thickness = 1 + + +infill_pattern = triangles +speed_infill = =math.ceil(speed_print * 50 / 60) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_CPE_Fast_Print.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_CPE_Fast_Print.inst.cfg new file mode 100644 index 0000000000..487ad68099 --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_CPE_Fast_Print.inst.cfg @@ -0,0 +1,27 @@ +[general] +version = 4 +name = Normal +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = fast +weight = -1 +material = generic_cpe +variant = AA 0.4 + +[values] +cool_min_speed = 7 +material_print_temperature = =default_material_print_temperature + 5 +material_initial_print_temperature = =material_print_temperature - 5 +material_final_print_temperature = =material_print_temperature - 10 +retraction_combing_max_distance = 50 +speed_print = 60 +speed_layer_0 = =math.ceil(speed_print * 20 / 60) +speed_topbottom = =math.ceil(speed_print * 30 / 60) +speed_wall = =math.ceil(speed_print * 40 / 60) +speed_wall_0 = =math.ceil(speed_wall * 30 / 40) + +infill_pattern = triangles +speed_infill = =math.ceil(speed_print * 50 / 60) \ No newline at end of file diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_CPE_High_Quality.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_CPE_High_Quality.inst.cfg new file mode 100644 index 0000000000..9de2de588e --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_CPE_High_Quality.inst.cfg @@ -0,0 +1,28 @@ +[general] +version = 4 +name = Extra Fine +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = high +weight = 1 +material = generic_cpe +variant = AA 0.4 + +[values] +cool_min_speed = 12 +machine_nozzle_cool_down_speed = 0.85 +machine_nozzle_heat_up_speed = 1.5 +material_print_temperature = =default_material_print_temperature - 5 +material_initial_print_temperature = =material_print_temperature - 5 +material_final_print_temperature = =material_print_temperature - 10 +retraction_combing_max_distance = 50 +speed_print = 50 +speed_layer_0 = =math.ceil(speed_print * 20 / 50) +speed_topbottom = =math.ceil(speed_print * 30 / 50) +speed_wall = =math.ceil(speed_print * 30 / 50) + +infill_pattern = triangles +speed_infill = =math.ceil(speed_print * 40 / 50) \ No newline at end of file diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_CPE_Normal_Quality.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_CPE_Normal_Quality.inst.cfg new file mode 100644 index 0000000000..0cfa9778ff --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_CPE_Normal_Quality.inst.cfg @@ -0,0 +1,26 @@ +[general] +version = 4 +name = Fine +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = normal +weight = 0 +material = generic_cpe +variant = AA 0.4 + +[values] +machine_nozzle_cool_down_speed = 0.85 +machine_nozzle_heat_up_speed = 1.5 +material_initial_print_temperature = =material_print_temperature - 5 +material_final_print_temperature = =material_print_temperature - 10 +retraction_combing_max_distance = 50 +speed_print = 55 +speed_layer_0 = =math.ceil(speed_print * 20 / 55) +speed_topbottom = =math.ceil(speed_print * 30 / 55) +speed_wall = =math.ceil(speed_print * 30 / 55) + +infill_pattern = triangles +speed_infill = =math.ceil(speed_print * 45 / 55) \ No newline at end of file diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_Nylon_Draft_Print.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_Nylon_Draft_Print.inst.cfg new file mode 100644 index 0000000000..98ae2900f7 --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_Nylon_Draft_Print.inst.cfg @@ -0,0 +1,38 @@ +[general] +version = 4 +name = Fast +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = draft +weight = -2 +material = generic_nylon +variant = AA 0.4 + +[values] +adhesion_type = brim +cool_min_layer_time_fan_speed_max = 20 +cool_min_speed = 10 +infill_line_width = =round(line_width * 0.5 / 0.4, 2) +line_width = =machine_nozzle_size +material_print_temperature = =default_material_print_temperature + 10 +material_initial_print_temperature = =material_print_temperature - 5 +material_final_print_temperature = =material_print_temperature - 10 +material_standby_temperature = 100 +ooze_shield_angle = 40 +raft_acceleration = =acceleration_layer_0 +raft_airgap = =round(layer_height_0 * 0.85, 2) +raft_interface_thickness = =round(machine_nozzle_size * 0.3 / 0.4, 2) +raft_jerk = =jerk_layer_0 +raft_margin = 10 +raft_surface_thickness = =round(machine_nozzle_size * 0.2 / 0.4, 2) +skin_overlap = 50 +speed_layer_0 = =math.ceil(speed_print * 20 / 70) +switch_extruder_prime_speed = 30 +switch_extruder_retraction_amount = 30 +switch_extruder_retraction_speeds = 40 +wall_line_width_x = =wall_line_width + +jerk_travel = 50 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_Nylon_Fast_Print.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_Nylon_Fast_Print.inst.cfg new file mode 100644 index 0000000000..afe5c03f8e --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_Nylon_Fast_Print.inst.cfg @@ -0,0 +1,38 @@ +[general] +version = 4 +name = Normal +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = fast +weight = -1 +material = generic_nylon +variant = AA 0.4 + +[values] +adhesion_type = brim +cool_min_layer_time_fan_speed_max = 20 +cool_min_speed = 10 +infill_line_width = =round(line_width * 0.5 / 0.4, 2) +line_width = =machine_nozzle_size +material_print_temperature = =default_material_print_temperature + 5 +material_initial_print_temperature = =material_print_temperature - 5 +material_final_print_temperature = =material_print_temperature - 10 +material_standby_temperature = 100 +ooze_shield_angle = 40 +raft_acceleration = =acceleration_layer_0 +raft_airgap = =round(layer_height_0 * 0.85, 2) +raft_interface_thickness = =round(machine_nozzle_size * 0.3 / 0.4, 2) +raft_jerk = =jerk_layer_0 +raft_margin = 10 +raft_surface_thickness = =round(machine_nozzle_size * 0.2 / 0.4, 2) +skin_overlap = 50 +speed_layer_0 = =math.ceil(speed_print * 20 / 70) +switch_extruder_prime_speed = 30 +switch_extruder_retraction_amount = 30 +switch_extruder_retraction_speeds = 40 +wall_line_width_x = =wall_line_width + +jerk_travel = 50 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_Nylon_High_Quality.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_Nylon_High_Quality.inst.cfg new file mode 100644 index 0000000000..64a8dfe7cf --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_Nylon_High_Quality.inst.cfg @@ -0,0 +1,37 @@ +[general] +version = 4 +name = Extra Fine +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = high +weight = 1 +material = generic_nylon +variant = AA 0.4 + +[values] +adhesion_type = brim +cool_min_layer_time_fan_speed_max = 20 +cool_min_speed = 15 +infill_line_width = =round(line_width * 0.5 / 0.4, 2) +line_width = =machine_nozzle_size +material_initial_print_temperature = =material_print_temperature - 5 +material_final_print_temperature = =material_print_temperature - 10 +material_standby_temperature = 100 +ooze_shield_angle = 40 +raft_acceleration = =acceleration_layer_0 +raft_airgap = =round(layer_height_0 * 0.85, 2) +raft_interface_thickness = =round(machine_nozzle_size * 0.3 / 0.4, 2) +raft_jerk = =jerk_layer_0 +raft_margin = 10 +raft_surface_thickness = =round(machine_nozzle_size * 0.2 / 0.4, 2) +skin_overlap = 50 +speed_layer_0 = =math.ceil(speed_print * 20 / 70) +switch_extruder_prime_speed = 30 +switch_extruder_retraction_amount = 30 +switch_extruder_retraction_speeds = 40 +wall_line_width_x = =wall_line_width + +jerk_travel = 50 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_Nylon_Normal_Quality.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_Nylon_Normal_Quality.inst.cfg new file mode 100644 index 0000000000..3ee447eb2d --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_Nylon_Normal_Quality.inst.cfg @@ -0,0 +1,37 @@ +[general] +version = 4 +name = Fine +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = normal +weight = 0 +material = generic_nylon +variant = AA 0.4 + +[values] +adhesion_type = brim +cool_min_layer_time_fan_speed_max = 20 +cool_min_speed = 12 +infill_line_width = =round(line_width * 0.5 / 0.4, 2) +line_width = =machine_nozzle_size +material_initial_print_temperature = =material_print_temperature - 5 +material_final_print_temperature = =material_print_temperature - 10 +material_standby_temperature = 100 +ooze_shield_angle = 40 +raft_acceleration = =acceleration_layer_0 +raft_airgap = =round(layer_height_0 * 0.85, 2) +raft_interface_thickness = =round(machine_nozzle_size * 0.3 / 0.4, 2) +raft_jerk = =jerk_layer_0 +raft_margin = 10 +raft_surface_thickness = =round(machine_nozzle_size * 0.2 / 0.4, 2) +skin_overlap = 50 +speed_layer_0 = =math.ceil(speed_print * 20 / 70) +switch_extruder_prime_speed = 30 +switch_extruder_retraction_amount = 30 +switch_extruder_retraction_speeds = 40 +wall_line_width_x = =wall_line_width + +jerk_travel = 50 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_PC_Draft_Print.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_PC_Draft_Print.inst.cfg new file mode 100644 index 0000000000..63985bfcd2 --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_PC_Draft_Print.inst.cfg @@ -0,0 +1,63 @@ +[general] +version = 4 +name = Fast +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = draft +weight = -2 +material = generic_pc +variant = AA 0.4 + +[values] +acceleration_enabled = True +acceleration_print = 4000 +adhesion_type = brim +brim_width = 20 +cool_fan_full_at_height = =layer_height_0 + layer_height +cool_fan_speed_max = 90 +cool_min_layer_time_fan_speed_max = 5 +cool_min_speed = 6 +infill_line_width = =round(line_width * 0.4 / 0.35, 2) +infill_overlap = 0 +infill_overlap_mm = 0.05 +infill_pattern = triangles +infill_wipe_dist = 0.1 +jerk_enabled = True +jerk_print = 25 +machine_min_cool_heat_time_window = 15 +machine_nozzle_cool_down_speed = 0.85 +machine_nozzle_heat_up_speed = 1.5 +material_final_print_temperature = =material_print_temperature - 10 +material_initial_print_temperature = =material_print_temperature - 5 +material_print_temperature = =default_material_print_temperature + 10 +material_standby_temperature = 100 +multiple_mesh_overlap = 0 +ooze_shield_angle = 40 +prime_tower_enable = True +prime_tower_wipe_enabled = True +raft_airgap = 0.25 +raft_interface_thickness = =max(layer_height * 1.5, 0.225) +retraction_count_max = 80 +retraction_extrusion_window = 1 +retraction_hop = 2 +retraction_hop_only_when_collides = True +retraction_min_travel = 0.8 +retraction_prime_speed = 15 +skin_overlap = 30 +speed_layer_0 = =math.ceil(speed_print * 25 / 50) +speed_print = 50 +speed_topbottom = =math.ceil(speed_print * 25 / 50) +speed_wall = =math.ceil(speed_print * 40 / 50) +speed_wall_0 = =math.ceil(speed_wall * 25 / 40) +support_bottom_distance = =support_z_distance +support_interface_density = 87.5 +support_interface_pattern = lines +switch_extruder_prime_speed = 15 +switch_extruder_retraction_amount = 20 +switch_extruder_retraction_speeds = 35 +wall_0_inset = 0 +wall_line_width_x = =round(line_width * 0.4 / 0.35, 2) +wall_thickness = 1.2 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_PC_Fast_Print.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_PC_Fast_Print.inst.cfg new file mode 100644 index 0000000000..548cdbdb0d --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_PC_Fast_Print.inst.cfg @@ -0,0 +1,63 @@ +[general] +version = 4 +name = Normal +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = fast +weight = -1 +material = generic_pc +variant = AA 0.4 + +[values] +acceleration_enabled = True +acceleration_print = 4000 +adhesion_type = brim +brim_width = 20 +cool_fan_full_at_height = =layer_height_0 + layer_height +cool_fan_speed_max = 85 +cool_min_layer_time_fan_speed_max = 5 +cool_min_speed = 7 +infill_line_width = =round(line_width * 0.4 / 0.35, 2) +infill_overlap_mm = 0.05 +infill_pattern = triangles +infill_wipe_dist = 0.1 +jerk_enabled = True +jerk_print = 25 +machine_min_cool_heat_time_window = 15 +machine_nozzle_cool_down_speed = 0.85 +machine_nozzle_heat_up_speed = 1.5 +material_final_print_temperature = =material_print_temperature - 10 +material_initial_print_temperature = =material_print_temperature - 5 +material_print_temperature = =default_material_print_temperature + 10 +material_standby_temperature = 100 +multiple_mesh_overlap = 0 +ooze_shield_angle = 40 +prime_tower_enable = True +prime_tower_wipe_enabled = True +raft_airgap = 0.25 +raft_interface_thickness = =max(layer_height * 1.5, 0.225) +retraction_count_max = 80 +retraction_extrusion_window = 1 +retraction_hop = 2 +retraction_hop_only_when_collides = True +retraction_min_travel = 0.8 +retraction_prime_speed = 15 +skin_overlap = 30 +speed_layer_0 = =math.ceil(speed_print * 25 / 50) +speed_print = 50 +speed_topbottom = =math.ceil(speed_print * 25 / 50) + +speed_wall = =math.ceil(speed_print * 40 / 50) +speed_wall_0 = =math.ceil(speed_wall * 25 / 40) +support_bottom_distance = =support_z_distance +support_interface_density = 87.5 +support_interface_pattern = lines +switch_extruder_prime_speed = 15 +switch_extruder_retraction_amount = 20 +switch_extruder_retraction_speeds = 35 +wall_0_inset = 0 +wall_line_width_x = =round(line_width * 0.4 / 0.35, 2) +wall_thickness = 1.2 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_PC_High_Quality.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_PC_High_Quality.inst.cfg new file mode 100644 index 0000000000..f840c296b4 --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_PC_High_Quality.inst.cfg @@ -0,0 +1,64 @@ +[general] +version = 4 +name = Extra Fine +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = high +weight = 1 +material = generic_pc +variant = AA 0.4 + +[values] +acceleration_enabled = True +acceleration_print = 4000 +adhesion_type = brim +brim_width = 20 +cool_fan_full_at_height = =layer_height_0 + layer_height +cool_fan_speed_max = 50 +cool_min_layer_time_fan_speed_max = 5 +cool_min_speed = 8 +infill_line_width = =round(line_width * 0.4 / 0.35, 2) +infill_overlap = 0 +infill_overlap_mm = 0.05 +infill_pattern = triangles +infill_wipe_dist = 0.1 +jerk_enabled = True +jerk_print = 25 +machine_min_cool_heat_time_window = 15 +machine_nozzle_cool_down_speed = 0.85 +machine_nozzle_heat_up_speed = 1.5 +material_final_print_temperature = =material_print_temperature - 10 +material_initial_print_temperature = =material_print_temperature - 5 +material_print_temperature = =default_material_print_temperature - 10 +material_standby_temperature = 100 +multiple_mesh_overlap = 0 +ooze_shield_angle = 40 +prime_tower_enable = True +prime_tower_wipe_enabled = True +raft_airgap = 0.25 +raft_interface_thickness = =max(layer_height * 1.5, 0.225) +retraction_count_max = 80 +retraction_extrusion_window = 1 +retraction_hop = 2 +retraction_hop_only_when_collides = True +retraction_min_travel = 0.8 +retraction_prime_speed = 15 +skin_overlap = 30 +speed_layer_0 = =math.ceil(speed_print * 25 / 50) +speed_print = 50 +speed_topbottom = =math.ceil(speed_print * 25 / 50) + +speed_wall = =math.ceil(speed_print * 40 / 50) +speed_wall_0 = =math.ceil(speed_wall * 25 / 40) +support_bottom_distance = =support_z_distance +support_interface_density = 87.5 +support_interface_pattern = lines +switch_extruder_prime_speed = 15 +switch_extruder_retraction_amount = 20 +switch_extruder_retraction_speeds = 35 +wall_0_inset = 0 +wall_line_width_x = =round(line_width * 0.4 / 0.35, 2) +wall_thickness = 1.2 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_PC_Normal_Quality.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_PC_Normal_Quality.inst.cfg new file mode 100644 index 0000000000..c93903293e --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_PC_Normal_Quality.inst.cfg @@ -0,0 +1,62 @@ +[general] +version = 4 +name = Fine +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = normal +weight = 0 +material = generic_pc +variant = AA 0.4 + +[values] +acceleration_enabled = True +acceleration_print = 4000 +adhesion_type = brim +brim_width = 20 +cool_fan_full_at_height = =layer_height_0 + layer_height +cool_fan_speed_max = 50 +cool_min_layer_time_fan_speed_max = 5 +cool_min_speed = 5 +infill_line_width = =round(line_width * 0.4 / 0.35, 2) +infill_overlap = 0 +infill_pattern = triangles +infill_wipe_dist = 0.1 +jerk_enabled = True +jerk_print = 25 +machine_min_cool_heat_time_window = 15 +machine_nozzle_cool_down_speed = 0.85 +machine_nozzle_heat_up_speed = 1.5 +material_final_print_temperature = =material_print_temperature - 10 +material_initial_print_temperature = =material_print_temperature - 5 +material_standby_temperature = 100 +multiple_mesh_overlap = 0 +ooze_shield_angle = 40 +prime_tower_enable = True +prime_tower_wipe_enabled = True +raft_airgap = 0.25 +raft_interface_thickness = =max(layer_height * 1.5, 0.225) +retraction_count_max = 80 +retraction_extrusion_window = 1 +retraction_hop = 2 +retraction_hop_only_when_collides = True +retraction_min_travel = 0.8 +retraction_prime_speed = 15 +skin_overlap = 30 +speed_layer_0 = =math.ceil(speed_print * 25 / 50) +speed_print = 50 +speed_topbottom = =math.ceil(speed_print * 25 / 50) + +speed_wall = =math.ceil(speed_print * 40 / 50) +speed_wall_0 = =math.ceil(speed_wall * 25 / 40) +support_bottom_distance = =support_z_distance +support_interface_density = 87.5 +support_interface_pattern = lines +switch_extruder_prime_speed = 15 +switch_extruder_retraction_amount = 20 +switch_extruder_retraction_speeds = 35 +wall_0_inset = 0 +wall_line_width_x = =round(line_width * 0.4 / 0.35, 2) +wall_thickness = 1.2 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_PLA_Draft_Print.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_PLA_Draft_Print.inst.cfg new file mode 100644 index 0000000000..1dfa09e923 --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_PLA_Draft_Print.inst.cfg @@ -0,0 +1,35 @@ +[general] +version = 4 +name = Fast +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = draft +weight = -2 +material = generic_pla +variant = AA 0.4 + +[values] +cool_fan_full_at_height = =layer_height_0 + 2 * layer_height +cool_fan_speed_max = =cool_fan_speed +machine_nozzle_cool_down_speed = 0.75 +machine_nozzle_heat_up_speed = 1.6 +material_print_temperature = =default_material_print_temperature + 5 +material_standby_temperature = 100 +prime_tower_enable = False +skin_overlap = 20 +speed_layer_0 = =math.ceil(speed_print * 20 / 70) +speed_topbottom = =math.ceil(speed_print * 40 / 70) +speed_wall = =math.ceil(speed_print * 55 / 70) +speed_wall_0 = =math.ceil(speed_wall * 45 / 50) +top_bottom_thickness = 0.8 +wall_thickness = 0.8 + +jerk_travel = 50 +infill_line_width = =round(line_width * 0.42 / 0.35, 2) +infill_sparse_density = 15 +layer_height_0 = 0.2 +acceleration_wall = 2000 +acceleration_wall_0 = 2000 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_PLA_Fast_Print.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_PLA_Fast_Print.inst.cfg new file mode 100644 index 0000000000..1c2b49839e --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_PLA_Fast_Print.inst.cfg @@ -0,0 +1,31 @@ +[general] +version = 4 +name = Normal +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = fast +weight = -1 +material = generic_pla +variant = AA 0.4 + +[values] +cool_fan_full_at_height = =layer_height_0 + 2 * layer_height +cool_fan_speed_max = =cool_fan_speed +machine_nozzle_cool_down_speed = 0.75 +machine_nozzle_heat_up_speed = 1.6 +material_standby_temperature = 100 +prime_tower_enable = False +speed_print = 70 +speed_layer_0 = =math.ceil(speed_print * 20 / 70) +speed_topbottom = =math.ceil(speed_print * 35 / 70) +speed_wall = =math.ceil(speed_print * 45 / 70) +speed_wall_0 = =math.ceil(speed_wall * 35 / 70) +top_bottom_thickness = 1 +wall_thickness = 1 + +jerk_travel = 50 +infill_line_width = =round(line_width * 0.42 / 0.35, 2) +layer_height_0 = 0.2 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_PLA_High_Quality.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_PLA_High_Quality.inst.cfg new file mode 100644 index 0000000000..8863835f09 --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_PLA_High_Quality.inst.cfg @@ -0,0 +1,33 @@ +[general] +version = 4 +name = Extra Fine +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = high +weight = 1 +material = generic_pla +variant = AA 0.4 + +[values] +cool_fan_full_at_height = =layer_height_0 + 2 * layer_height +cool_fan_speed_max = =cool_fan_speed +cool_min_speed = 10 +machine_nozzle_cool_down_speed = 0.75 +machine_nozzle_heat_up_speed = 1.6 +material_print_temperature = =default_material_print_temperature - 5 +material_standby_temperature = 100 +prime_tower_enable = False +skin_overlap = 10 +speed_print = 50 +speed_layer_0 = =math.ceil(speed_print * 20 / 50) +speed_topbottom = =math.ceil(speed_print * 35 / 50) +speed_wall = =math.ceil(speed_print * 35 / 50) +top_bottom_thickness = 1 +wall_thickness = 1 + +jerk_travel = 50 +infill_line_width = =round(line_width * 0.42 / 0.35, 2) +layer_height_0 = 0.2 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_PLA_Normal_Quality.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_PLA_Normal_Quality.inst.cfg new file mode 100644 index 0000000000..1cf0cbef92 --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_PLA_Normal_Quality.inst.cfg @@ -0,0 +1,29 @@ +[general] +version = 4 +name = Fine +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = normal +weight = 0 +material = generic_pla +variant = AA 0.4 + +[values] +cool_fan_full_at_height = =layer_height_0 + 2 * layer_height +cool_fan_speed_max = =cool_fan_speed +cool_min_speed = 7 +machine_nozzle_cool_down_speed = 0.75 +machine_nozzle_heat_up_speed = 1.6 +material_standby_temperature = 100 +prime_tower_enable = False +skin_overlap = 10 +speed_layer_0 = =math.ceil(speed_print * 20 / 70) +top_bottom_thickness = 1 +wall_thickness = 1 + +jerk_travel = 50 +infill_line_width = =round(line_width * 0.42 / 0.35, 2) +layer_height_0 = 0.2 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_PP_Draft_Print.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_PP_Draft_Print.inst.cfg new file mode 100644 index 0000000000..dc46520c97 --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_PP_Draft_Print.inst.cfg @@ -0,0 +1,62 @@ +[general] +version = 4 +name = Fast +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = draft +weight = -2 +material = generic_pp +variant = AA 0.4 + +[values] +acceleration_enabled = True +acceleration_print = 4000 +brim_width = 20 +cool_fan_speed_max = 100 +cool_min_layer_time = 7 +cool_min_layer_time_fan_speed_max = 7 +cool_min_speed = 2.5 +infill_line_width = =round(line_width * 0.38 / 0.38, 2) +infill_overlap = 0 +infill_pattern = tetrahedral +infill_wipe_dist = 0.1 +jerk_enabled = True +jerk_print = 25 +line_width = =machine_nozzle_size * 0.95 +machine_min_cool_heat_time_window = 15 +machine_nozzle_cool_down_speed = 0.85 +machine_nozzle_heat_up_speed = 1.5 +material_bed_temperature_layer_0 = =material_bed_temperature + 5 +material_final_print_temperature = =material_print_temperature - 10 +material_initial_print_temperature = =material_print_temperature - 5 +material_print_temperature = =default_material_print_temperature - 5 +material_print_temperature_layer_0 = =material_print_temperature + 5 +material_standby_temperature = 100 +multiple_mesh_overlap = 0 +prime_tower_enable = False +prime_tower_size = 16 +prime_tower_wipe_enabled = True +retraction_count_max = 12 +retraction_extra_prime_amount = 0.8 +retraction_extrusion_window = 1 +retraction_hop = 2 +retraction_hop_only_when_collides = True +retraction_min_travel = 0.8 +retraction_prime_speed = 18 +speed_equalize_flow_enabled = True +speed_layer_0 = =math.ceil(speed_print * 15 / 25) +speed_print = 25 +speed_topbottom = =math.ceil(speed_print * 25 / 25) +speed_travel_layer_0 = 50 +speed_wall = =math.ceil(speed_print * 25 / 25) +speed_wall_0 = =math.ceil(speed_wall * 25 / 25) +support_angle = 50 +switch_extruder_prime_speed = 15 +switch_extruder_retraction_amount = 20 +switch_extruder_retraction_speeds = 35 +wall_0_inset = 0 +wall_line_width_x = =line_width +wall_thickness = =line_width * 3 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_PP_Fast_Print.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_PP_Fast_Print.inst.cfg new file mode 100644 index 0000000000..fb047fc502 --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_PP_Fast_Print.inst.cfg @@ -0,0 +1,64 @@ +[general] +version = 4 +name = Normal +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = fast +weight = -1 +material = generic_pp +variant = AA 0.4 + +[values] +acceleration_enabled = True +acceleration_print = 4000 +brim_width = 20 +cool_fan_speed_max = 100 +cool_min_layer_time = 7 +cool_min_layer_time_fan_speed_max = 7 +cool_min_speed = 2.5 +infill_line_width = =round(line_width * 0.38 / 0.38, 2) +infill_overlap = 0 +infill_pattern = tetrahedral +infill_wipe_dist = 0.1 +jerk_enabled = True +jerk_print = 25 +line_width = =machine_nozzle_size * 0.95 +machine_min_cool_heat_time_window = 15 +machine_nozzle_cool_down_speed = 0.85 +machine_nozzle_heat_up_speed = 1.5 +material_bed_temperature_layer_0 = =material_bed_temperature + 5 +material_final_print_temperature = =material_print_temperature - 12 +material_initial_print_temperature = =material_print_temperature - 2 +material_print_temperature = =default_material_print_temperature - 13 +material_print_temperature_layer_0 = =material_print_temperature + 3 +material_standby_temperature = 100 +multiple_mesh_overlap = 0 +prime_tower_enable = False +prime_tower_size = 16 +prime_tower_wipe_enabled = True +retraction_count_max = 12 +retraction_extra_prime_amount = 0.8 +retraction_extrusion_window = 1 +retraction_hop = 2 +retraction_hop_only_when_collides = True +retraction_min_travel = 0.8 +retraction_prime_speed = 18 +speed_equalize_flow_enabled = True +speed_layer_0 = =math.ceil(speed_print * 15 / 25) +speed_print = 25 +speed_topbottom = =math.ceil(speed_print * 25 / 25) + +speed_travel_layer_0 = 50 +speed_wall = =math.ceil(speed_print * 25 / 25) +speed_wall_0 = =math.ceil(speed_wall * 25 / 25) +support_angle = 50 +switch_extruder_prime_speed = 15 +switch_extruder_retraction_amount = 20 +switch_extruder_retraction_speeds = 35 +top_bottom_thickness = 1.1 +wall_0_inset = 0 +wall_line_width_x = =line_width +wall_thickness = =line_width * 3 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_PP_Normal_Quality.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_PP_Normal_Quality.inst.cfg new file mode 100644 index 0000000000..b49d3945d4 --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_PP_Normal_Quality.inst.cfg @@ -0,0 +1,64 @@ +[general] +version = 4 +name = Fine +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = normal +weight = 0 +material = generic_pp +variant = AA 0.4 + +[values] +acceleration_enabled = True +acceleration_print = 4000 +brim_width = 20 +cool_fan_speed_max = 100 +cool_min_layer_time = 7 +cool_min_layer_time_fan_speed_max = 7 +cool_min_speed = 2.5 +infill_line_width = =round(line_width * 0.38 / 0.38, 2) +infill_overlap = 0 +infill_pattern = tetrahedral +infill_wipe_dist = 0.1 +jerk_enabled = True +jerk_print = 25 +line_width = =machine_nozzle_size * 0.95 +machine_min_cool_heat_time_window = 15 +machine_nozzle_cool_down_speed = 0.85 +machine_nozzle_heat_up_speed = 1.5 +material_bed_temperature_layer_0 = =material_bed_temperature + 5 +material_final_print_temperature = =material_print_temperature - 10 +material_initial_print_temperature = =material_print_temperature - 5 +material_print_temperature = =default_material_print_temperature - 15 +material_print_temperature_layer_0 = =material_print_temperature + 3 +material_standby_temperature = 100 +multiple_mesh_overlap = 0 +prime_tower_enable = False +prime_tower_size = 16 +prime_tower_wipe_enabled = True +retraction_count_max = 12 +retraction_extra_prime_amount = 0.8 +retraction_extrusion_window = 1 +retraction_hop = 2 +retraction_hop_only_when_collides = True +retraction_min_travel = 0.8 +retraction_prime_speed = 18 +speed_equalize_flow_enabled = True +speed_layer_0 = =math.ceil(speed_print * 15 / 25) +speed_print = 25 +speed_topbottom = =math.ceil(speed_print * 25 / 25) + +speed_travel_layer_0 = 50 +speed_wall = =math.ceil(speed_print * 25 / 25) +speed_wall_0 = =math.ceil(speed_wall * 25 / 25) +support_angle = 50 +switch_extruder_prime_speed = 15 +switch_extruder_retraction_amount = 20 +switch_extruder_retraction_speeds = 35 +top_bottom_thickness = 1 +wall_0_inset = 0 +wall_line_width_x = =line_width +wall_thickness = =line_width * 3 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_TPLA_Draft_Print.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_TPLA_Draft_Print.inst.cfg new file mode 100644 index 0000000000..c02c4c642d --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_TPLA_Draft_Print.inst.cfg @@ -0,0 +1,38 @@ +[general] +version = 4 +name = Fast +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = draft +weight = -2 +material = generic_tough_pla +variant = AA 0.4 + +[values] +cool_fan_full_at_height = =layer_height_0 + 2 * layer_height +cool_fan_speed_max = =cool_fan_speed +cool_min_speed = 7 +infill_line_width = =round(line_width * 0.45/0.35,2) +jerk_print = 25 +jerk_roofing = 1 +layer_height_0 = 0.2 +machine_nozzle_cool_down_speed = 0.75 +machine_nozzle_heat_up_speed = 1.6 +material_print_temperature = =default_material_print_temperature -10 +material_standby_temperature = 100 +prime_tower_enable = False +roofing_layer_count = 2 +skin_outline_count = 0 +skin_overlap = 20 +speed_layer_0 = =math.ceil(speed_print * 20 / 50) +speed_print = 50 +speed_roofing = =math.ceil(speed_wall * 20 / 24) +speed_topbottom = =math.ceil(speed_print * 25 / 50) +speed_wall = =math.ceil(speed_print * 36 / 50) +speed_wall_0 = =math.ceil(speed_print * 26 / 50) +top_bottom_thickness = 1.2 +wall_line_width_x = =round(line_width * 0.35/0.35,2) +wall_thickness = 1.2 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_TPLA_Fast_Print.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_TPLA_Fast_Print.inst.cfg new file mode 100644 index 0000000000..bf37d1dd4d --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_TPLA_Fast_Print.inst.cfg @@ -0,0 +1,31 @@ +[general] +version = 4 +name = Normal +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = fast +weight = -1 +material = generic_tough_pla +variant = AA 0.4 + +[values] +cool_fan_full_at_height = =layer_height_0 + 2 * layer_height +cool_fan_speed_max = =cool_fan_speed +infill_line_width = =round(line_width * 1.285, 2) +layer_height_0 = 0.2 +machine_nozzle_cool_down_speed = 0.75 +machine_nozzle_heat_up_speed = 1.6 +material_print_temperature = =default_material_print_temperature -10 +material_standby_temperature = 100 +prime_tower_enable = False +speed_layer_0 = =math.ceil(speed_print * 20 / 45) +speed_print = 45 +speed_topbottom = =math.ceil(speed_print * 35 / 45) +speed_wall = =math.ceil(speed_print * 40 / 45) +speed_wall_0 = =math.ceil(speed_wall * 35 / 45) +top_bottom_thickness = 1.2 +wall_line_width_x = =round(line_width * 0.35/0.35,2) +wall_thickness = 1.23 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_TPLA_High_Quality.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_TPLA_High_Quality.inst.cfg new file mode 100644 index 0000000000..6333124f22 --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_TPLA_High_Quality.inst.cfg @@ -0,0 +1,36 @@ +[general] +version = 4 +name = Extra Fine +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = high +weight = 1 +material = generic_tough_pla +variant = AA 0.4 + +[values] +cool_fan_full_at_height = =layer_height_0 + 2 * layer_height +cool_fan_speed_max = =cool_fan_speed +cool_min_speed = 10 +machine_nozzle_cool_down_speed = 0.75 +machine_nozzle_heat_up_speed = 1.6 +material_print_temperature = =default_material_print_temperature - 15 +material_standby_temperature = 100 +prime_tower_enable = False +skin_overlap = 10 +speed_print = 45 +speed_layer_0 = =math.ceil(speed_print * 20 / 45) +speed_topbottom = =math.ceil(speed_print * 35 / 45) +speed_wall = =math.ceil(speed_print * 40 / 45) +speed_wall_0 = =math.ceil(speed_wall * 35 / 45) +top_bottom_thickness = 1.2 +wall_thickness = 1.23 + +layer_height_0 = 0.2 + +line_width = =round(machine_nozzle_size * 1.025, 3) +wall_line_width_x = =line_width +infill_line_width = =line_width diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_TPLA_Normal_Quality.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_TPLA_Normal_Quality.inst.cfg new file mode 100644 index 0000000000..9de9001f11 --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_TPLA_Normal_Quality.inst.cfg @@ -0,0 +1,33 @@ +[general] +version = 4 +name = Fine +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = normal +weight = 0 +material = generic_tough_pla +variant = AA 0.4 + +[values] +cool_fan_full_at_height = =layer_height_0 + 2 * layer_height +cool_fan_speed_max = =cool_fan_speed +cool_min_speed = 7 +infill_line_width = =round(line_width * 1.285, 2) +layer_height_0 = 0.2 +machine_nozzle_cool_down_speed = 0.75 +machine_nozzle_heat_up_speed = 1.6 +material_print_temperature = =default_material_print_temperature - 15 +material_standby_temperature = 100 +prime_tower_enable = False +skin_overlap = 10 +speed_layer_0 = =math.ceil(speed_print * 20 / 45) +speed_print = 45 +speed_topbottom = =math.ceil(speed_print * 35 / 45) +speed_wall = =math.ceil(speed_print * 40 / 45) +speed_wall_0 = =math.ceil(speed_wall * 35 / 45) +top_bottom_thickness = 1.2 +wall_thickness = 1.23 + diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_TPU_Draft_Print.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_TPU_Draft_Print.inst.cfg new file mode 100644 index 0000000000..33a03d7d81 --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_TPU_Draft_Print.inst.cfg @@ -0,0 +1,63 @@ +[general] +version = 4 +name = Fast +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = draft +weight = -2 +material = generic_tpu +variant = AA 0.4 + +[values] +acceleration_enabled = True +acceleration_print = 4000 +brim_width = 8.75 +cool_fan_speed_max = 100 +cool_min_layer_time_fan_speed_max = 6 +cool_min_speed = 4 +gradual_infill_step_height = =5 * layer_height +infill_line_width = =round(line_width * 0.38 / 0.38, 2) +infill_overlap = 0 +infill_pattern = cross_3d +infill_sparse_density = 10 +infill_wipe_dist = 0.1 +jerk_enabled = True +jerk_print = 25 +line_width = =machine_nozzle_size * 0.95 +machine_min_cool_heat_time_window = 15 +machine_nozzle_cool_down_speed = 0.5 +machine_nozzle_heat_up_speed = 2.5 +material_final_print_temperature = =material_print_temperature +material_flow = 106 +material_initial_print_temperature = =material_print_temperature +material_print_temperature = =default_material_print_temperature + 2 +material_print_temperature_layer_0 = =material_print_temperature + 15 +material_standby_temperature = 100 +multiple_mesh_overlap = 0 +prime_tower_wipe_enabled = True +retraction_count_max = 12 +retraction_extra_prime_amount = 0.8 +retraction_extrusion_window = 1 +retraction_hop_only_when_collides = True +retraction_min_travel = =line_width * 2 +retraction_prime_speed = 15 +skin_overlap = 5 +speed_equalize_flow_enabled = True +speed_layer_0 = =math.ceil(speed_print * 18 / 25) +speed_print = 25 +speed_topbottom = =math.ceil(speed_print * 25 / 25) + +speed_wall = =math.ceil(speed_print * 25 / 25) +speed_wall_0 = =math.ceil(speed_wall * 25 / 25) +support_angle = 50 +switch_extruder_prime_speed = 15 +switch_extruder_retraction_amount = 20 +switch_extruder_retraction_speeds = 35 +top_bottom_thickness = 0.7 +travel_avoid_distance = 1.5 +wall_0_inset = 0 +wall_line_width_x = =line_width +wall_thickness = 0.76 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_TPU_Fast_Print.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_TPU_Fast_Print.inst.cfg new file mode 100644 index 0000000000..566a368dd4 --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_TPU_Fast_Print.inst.cfg @@ -0,0 +1,64 @@ +[general] +version = 4 +name = Normal +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = fast +weight = -1 +material = generic_tpu +variant = AA 0.4 + +[values] +acceleration_enabled = True +acceleration_print = 4000 +brim_width = 8.75 +cool_fan_speed_max = 100 +cool_min_layer_time_fan_speed_max = 6 +cool_min_speed = 4 +gradual_infill_step_height = =5 * layer_height +infill_line_width = =round(line_width * 0.38 / 0.38, 2) +infill_overlap = 0 +infill_pattern = cross_3d +infill_sparse_density = 10 +infill_wipe_dist = 0.1 +jerk_enabled = True +jerk_print = 25 +line_width = =machine_nozzle_size * 0.95 +machine_min_cool_heat_time_window = 15 +machine_nozzle_cool_down_speed = 0.5 +machine_nozzle_heat_up_speed = 2.5 +material_final_print_temperature = =material_print_temperature +material_flow = 106 +material_initial_print_temperature = =material_print_temperature +material_print_temperature = =default_material_print_temperature + 2 +material_print_temperature_layer_0 = =material_print_temperature + 15 +material_standby_temperature = 100 +multiple_mesh_overlap = 0 +prime_tower_wipe_enabled = True +retraction_count_max = 12 +retraction_extra_prime_amount = 0.8 +retraction_extrusion_window = 1 +retraction_hop_only_when_collides = True +retraction_min_travel = =line_width * 2 +retraction_prime_speed = 15 +skin_overlap = 5 +speed_equalize_flow_enabled = True +speed_layer_0 = =math.ceil(speed_print * 18 / 25) +speed_print = 25 +speed_topbottom = =math.ceil(speed_print * 25 / 25) + +speed_wall = =math.ceil(speed_print * 25 / 25) +speed_wall_0 = =math.ceil(speed_wall * 25 / 25) +support_angle = 50 +switch_extruder_prime_speed = 15 +switch_extruder_retraction_amount = 20 +switch_extruder_retraction_speeds = 35 +top_bottom_thickness = 0.7 +travel_avoid_distance = 1.5 +wall_0_inset = 0 +wall_line_width_x = =line_width +wall_thickness = 0.76 + diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_TPU_Normal_Quality.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_TPU_Normal_Quality.inst.cfg new file mode 100644 index 0000000000..fe37bfe94a --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_TPU_Normal_Quality.inst.cfg @@ -0,0 +1,63 @@ +[general] +version = 4 +name = Fine +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = normal +weight = 0 +material = generic_tpu +variant = AA 0.4 + +[values] +acceleration_enabled = True +acceleration_print = 4000 +brim_width = 8.75 +cool_fan_speed_max = 100 +cool_min_layer_time_fan_speed_max = 6 +cool_min_speed = 4 +gradual_infill_step_height = =5 * layer_height +infill_line_width = =round(line_width * 0.38 / 0.38, 2) +infill_overlap = 0 +infill_pattern = cross_3d +infill_sparse_density = 10 +infill_wipe_dist = 0.1 +jerk_enabled = True +jerk_print = 25 +line_width = =machine_nozzle_size * 0.95 +machine_min_cool_heat_time_window = 15 +machine_nozzle_cool_down_speed = 0.5 +machine_nozzle_heat_up_speed = 2.5 +material_final_print_temperature = =material_print_temperature +material_flow = 106 +material_initial_print_temperature = =material_print_temperature +material_print_temperature_layer_0 = =material_print_temperature + 17 +material_standby_temperature = 100 +multiple_mesh_overlap = 0 +prime_tower_wipe_enabled = True +retraction_count_max = 12 +retraction_extra_prime_amount = 0.8 +retraction_extrusion_window = 1 +retraction_hop_only_when_collides = True +retraction_min_travel = =line_width * 2 +retraction_prime_speed = 15 +skin_overlap = 5 +speed_equalize_flow_enabled = True +speed_layer_0 = =math.ceil(speed_print * 18 / 25) +speed_print = 25 +speed_topbottom = =math.ceil(speed_print * 25 / 25) + +speed_wall = =math.ceil(speed_print * 25 / 25) +speed_wall_0 = =math.ceil(speed_wall * 25 / 25) +support_angle = 50 +switch_extruder_prime_speed = 15 +switch_extruder_retraction_amount = 20 +switch_extruder_retraction_speeds = 35 +top_bottom_thickness = 0.7 +travel_avoid_distance = 1.5 +wall_0_inset = 0 +wall_line_width_x = =line_width +wall_thickness = 0.76 + diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_ABS_Draft_Print.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_ABS_Draft_Print.inst.cfg new file mode 100644 index 0000000000..8e4b1415f9 --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_ABS_Draft_Print.inst.cfg @@ -0,0 +1,22 @@ +[general] +version = 4 +name = Fast +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = draft +weight = -2 +material = generic_abs +variant = AA 0.8 + +[values] +line_width = =machine_nozzle_size * 0.875 +material_print_temperature = =default_material_print_temperature + 20 +material_standby_temperature = 100 +speed_print = 50 +speed_topbottom = =math.ceil(speed_print * 30 / 50) +speed_wall = =math.ceil(speed_print * 40 / 50) +speed_wall_0 = =math.ceil(speed_wall * 30 / 40) +retract_at_layer_change = False diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_ABS_Superdraft_Print.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_ABS_Superdraft_Print.inst.cfg new file mode 100644 index 0000000000..f4b1588f39 --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_ABS_Superdraft_Print.inst.cfg @@ -0,0 +1,22 @@ +[general] +version = 4 +name = Sprint +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = superdraft +weight = -4 +material = generic_abs +variant = AA 0.8 + +[values] +line_width = =machine_nozzle_size * 0.875 +material_print_temperature = =default_material_print_temperature + 25 +material_standby_temperature = 100 +speed_print = 50 +speed_topbottom = =math.ceil(speed_print * 30 / 50) +speed_wall = =math.ceil(speed_print * 40 / 50) +speed_wall_0 = =math.ceil(speed_wall * 30 / 40) +retract_at_layer_change = False diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_ABS_Verydraft_Print.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_ABS_Verydraft_Print.inst.cfg new file mode 100644 index 0000000000..a303655ec5 --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_ABS_Verydraft_Print.inst.cfg @@ -0,0 +1,22 @@ +[general] +version = 4 +name = Extra Fast +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = verydraft +weight = -3 +material = generic_abs +variant = AA 0.8 + +[values] +line_width = =machine_nozzle_size * 0.875 +material_print_temperature = =default_material_print_temperature + 22 +material_standby_temperature = 100 +speed_print = 50 +speed_topbottom = =math.ceil(speed_print * 30 / 50) +speed_wall = =math.ceil(speed_print * 40 / 50) +speed_wall_0 = =math.ceil(speed_wall * 30 / 40) +retract_at_layer_change = False diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_CPEP_Fast_Print.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_CPEP_Fast_Print.inst.cfg new file mode 100644 index 0000000000..1465d5bb99 --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_CPEP_Fast_Print.inst.cfg @@ -0,0 +1,39 @@ +[general] +version = 4 +name = Fast - Experimental +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = draft +weight = -2 +material = generic_cpe_plus +variant = AA 0.8 +is_experimental = True + +[values] +brim_width = 14 +cool_fan_full_at_height = =layer_height_0 + 14 * layer_height +infill_before_walls = True +line_width = =machine_nozzle_size * 0.9375 +machine_nozzle_cool_down_speed = 0.9 +machine_nozzle_heat_up_speed = 1.4 +material_print_temperature = =default_material_print_temperature - 10 +material_print_temperature_layer_0 = =material_print_temperature +material_standby_temperature = 100 +prime_tower_enable = True +retraction_combing_max_distance = 50 +retraction_hop = 0.1 +retraction_hop_enabled = False +skin_overlap = 0 +speed_layer_0 = =math.ceil(speed_print * 15 / 50) +speed_print = 50 +speed_slowdown_layers = 15 +speed_topbottom = =math.ceil(speed_print * 35 / 50) +speed_wall = =math.ceil(speed_print * 40 / 50) +speed_wall_0 = =math.ceil(speed_wall * 35 / 40) +support_bottom_distance = =support_z_distance +support_line_width = =round(line_width * 0.6 / 0.7, 2) +support_z_distance = =layer_height +top_bottom_thickness = 1.2 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_CPEP_Superdraft_Print.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_CPEP_Superdraft_Print.inst.cfg new file mode 100644 index 0000000000..18ba654a63 --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_CPEP_Superdraft_Print.inst.cfg @@ -0,0 +1,39 @@ +[general] +version = 4 +name = Sprint - Experimental +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = superdraft +weight = -4 +material = generic_cpe_plus +variant = AA 0.8 +is_experimental = True + +[values] +brim_width = 14 +cool_fan_full_at_height = =layer_height_0 + 7 * layer_height +infill_before_walls = True +line_width = =machine_nozzle_size * 0.9375 +machine_nozzle_cool_down_speed = 0.9 +machine_nozzle_heat_up_speed = 1.4 +material_print_temperature = =default_material_print_temperature - 5 +material_print_temperature_layer_0 = =material_print_temperature +material_standby_temperature = 100 +prime_tower_enable = True +retraction_combing_max_distance = 50 +retraction_hop = 0.1 +retraction_hop_enabled = False +skin_overlap = 0 +speed_layer_0 = =math.ceil(speed_print * 15 / 50) +speed_print = 50 +speed_slowdown_layers = 8 +speed_topbottom = =math.ceil(speed_print * 35 / 50) +speed_wall = =math.ceil(speed_print * 40 / 50) +speed_wall_0 = =math.ceil(speed_wall * 35 / 40) +support_bottom_distance = =support_z_distance +support_line_width = =round(line_width * 0.6 / 0.7, 2) +support_z_distance = =layer_height +top_bottom_thickness = 1.2 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_CPEP_Verydraft_Print.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_CPEP_Verydraft_Print.inst.cfg new file mode 100644 index 0000000000..8683d9f498 --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_CPEP_Verydraft_Print.inst.cfg @@ -0,0 +1,39 @@ +[general] +version = 4 +name = Extra Fast - Experimental +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = verydraft +weight = -3 +material = generic_cpe_plus +variant = AA 0.8 +is_experimental = True + +[values] +brim_width = 14 +cool_fan_full_at_height = =layer_height_0 + 9 * layer_height +infill_before_walls = True +line_width = =machine_nozzle_size * 0.9375 +machine_nozzle_cool_down_speed = 0.9 +machine_nozzle_heat_up_speed = 1.4 +material_print_temperature = =default_material_print_temperature - 7 +material_print_temperature_layer_0 = =material_print_temperature +material_standby_temperature = 100 +prime_tower_enable = True +retraction_combing_max_distance = 50 +retraction_hop = 0.1 +retraction_hop_enabled = False +skin_overlap = 0 +speed_layer_0 = =math.ceil(speed_print * 15 / 50) +speed_print = 50 +speed_slowdown_layers = 10 +speed_topbottom = =math.ceil(speed_print * 35 / 50) +speed_wall = =math.ceil(speed_print * 40 / 50) +speed_wall_0 = =math.ceil(speed_wall * 35 / 40) +support_bottom_distance = =support_z_distance +support_line_width = =round(line_width * 0.6 / 0.7, 2) +support_z_distance = =layer_height +top_bottom_thickness = 1.2 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_CPE_Draft_Print.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_CPE_Draft_Print.inst.cfg new file mode 100644 index 0000000000..dabff34ce6 --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_CPE_Draft_Print.inst.cfg @@ -0,0 +1,25 @@ +[general] +version = 4 +name = Fast +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = draft +weight = -2 +material = generic_cpe +variant = AA 0.8 + +[values] +brim_width = 15 +line_width = =machine_nozzle_size * 0.875 +material_print_temperature = =default_material_print_temperature + 15 +material_standby_temperature = 100 +prime_tower_enable = True +retraction_combing_max_distance = 50 +speed_print = 40 +speed_topbottom = =math.ceil(speed_print * 25 / 40) +speed_wall = =math.ceil(speed_print * 30 / 40) + +jerk_travel = 50 \ No newline at end of file diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_CPE_Superdraft_Print.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_CPE_Superdraft_Print.inst.cfg new file mode 100644 index 0000000000..6371ce1337 --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_CPE_Superdraft_Print.inst.cfg @@ -0,0 +1,26 @@ +[general] +version = 4 +name = Sprint +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = superdraft +weight = -4 +material = generic_cpe +variant = AA 0.8 + +[values] +brim_width = 15 +line_width = =machine_nozzle_size * 0.875 +material_print_temperature = =default_material_print_temperature + 20 +material_standby_temperature = 100 +prime_tower_enable = True +retraction_combing_max_distance = 50 +speed_print = 45 +speed_topbottom = =math.ceil(speed_print * 30 / 45) +speed_wall = =math.ceil(speed_print * 40 / 45) +speed_wall_0 = =math.ceil(speed_wall * 30 / 40) + +jerk_travel = 50 \ No newline at end of file diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_CPE_Verydraft_Print.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_CPE_Verydraft_Print.inst.cfg new file mode 100644 index 0000000000..d3f5fb50be --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_CPE_Verydraft_Print.inst.cfg @@ -0,0 +1,25 @@ +[general] +version = 4 +name = Extra Fast +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = verydraft +weight = -3 +material = generic_cpe +variant = AA 0.8 + +[values] +brim_width = 15 +line_width = =machine_nozzle_size * 0.875 +material_print_temperature = =default_material_print_temperature + 17 +material_standby_temperature = 100 +prime_tower_enable = True +retraction_combing_max_distance = 50 +speed_print = 40 +speed_topbottom = =math.ceil(speed_print * 25 / 40) +speed_wall = =math.ceil(speed_print * 30 / 40) + +jerk_travel = 50 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_Nylon_Draft_Print.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_Nylon_Draft_Print.inst.cfg new file mode 100644 index 0000000000..b09f0f00df --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_Nylon_Draft_Print.inst.cfg @@ -0,0 +1,35 @@ +[general] +version = 4 +name = Fast +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = draft +weight = -2 +material = generic_nylon +variant = AA 0.8 + +[values] +brim_width = 5.6 +cool_min_layer_time_fan_speed_max = 20 +cool_min_speed = 10 +infill_before_walls = True +infill_line_width = =line_width +machine_nozzle_cool_down_speed = 0.9 +machine_nozzle_heat_up_speed = 1.4 +material_standby_temperature = 100 +ooze_shield_angle = 40 +prime_tower_enable = True +raft_acceleration = =acceleration_layer_0 +raft_airgap = =round(layer_height_0 * 0.85, 2) +raft_interface_thickness = =round(machine_nozzle_size * 0.3 / 0.4, 2) +raft_margin = 10 +raft_surface_thickness = =round(machine_nozzle_size * 0.2 / 0.4, 2) +support_angle = 70 +support_line_width = =line_width * 0.75 +support_xy_distance = =wall_line_width_0 * 1.5 +switch_extruder_prime_speed = 30 +switch_extruder_retraction_amount = 30 +switch_extruder_retraction_speeds = 40 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_Nylon_Superdraft_Print.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_Nylon_Superdraft_Print.inst.cfg new file mode 100644 index 0000000000..639ceb2348 --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_Nylon_Superdraft_Print.inst.cfg @@ -0,0 +1,35 @@ +[general] +version = 4 +name = Sprint +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = superdraft +weight = -4 +material = generic_nylon +variant = AA 0.8 + +[values] +brim_width = 5.6 +cool_min_layer_time_fan_speed_max = 20 +cool_min_speed = 10 +infill_before_walls = True +infill_line_width = =line_width +machine_nozzle_cool_down_speed = 0.9 +machine_nozzle_heat_up_speed = 1.4 +material_standby_temperature = 100 +ooze_shield_angle = 40 +prime_tower_enable = True +raft_acceleration = =acceleration_layer_0 +raft_airgap = =round(layer_height_0 * 0.85, 2) +raft_interface_thickness = =round(machine_nozzle_size * 0.3 / 0.4, 2) +raft_margin = 10 +raft_surface_thickness = =round(machine_nozzle_size * 0.2 / 0.4, 2) +support_angle = 70 +support_line_width = =line_width * 0.75 +support_xy_distance = =wall_line_width_0 * 1.5 +switch_extruder_prime_speed = 30 +switch_extruder_retraction_amount = 30 +switch_extruder_retraction_speeds = 40 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_Nylon_Verydraft_Print.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_Nylon_Verydraft_Print.inst.cfg new file mode 100644 index 0000000000..6477e2d0a0 --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_Nylon_Verydraft_Print.inst.cfg @@ -0,0 +1,35 @@ +[general] +version = 4 +name = Extra Fast +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = verydraft +weight = -3 +material = generic_nylon +variant = AA 0.8 + +[values] +brim_width = 5.6 +cool_min_layer_time_fan_speed_max = 20 +cool_min_speed = 10 +infill_before_walls = True +infill_line_width = =line_width +machine_nozzle_cool_down_speed = 0.9 +machine_nozzle_heat_up_speed = 1.4 +material_standby_temperature = 100 +ooze_shield_angle = 40 +prime_tower_enable = True +raft_acceleration = =acceleration_layer_0 +raft_airgap = =round(layer_height_0 * 0.85, 2) +raft_interface_thickness = =round(machine_nozzle_size * 0.3 / 0.4, 2) +raft_margin = 10 +raft_surface_thickness = =round(machine_nozzle_size * 0.2 / 0.4, 2) +support_angle = 70 +support_line_width = =line_width * 0.75 +support_xy_distance = =wall_line_width_0 * 1.5 +switch_extruder_prime_speed = 30 +switch_extruder_retraction_amount = 30 +switch_extruder_retraction_speeds = 40 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_PC_Fast_Print.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_PC_Fast_Print.inst.cfg new file mode 100644 index 0000000000..d1d716858d --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_PC_Fast_Print.inst.cfg @@ -0,0 +1,32 @@ +[general] +version = 4 +name = Fast - Experimental +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = draft +weight = -2 +material = generic_pc +variant = AA 0.8 +is_experimental = True + +[values] +brim_width = 14 +cool_fan_full_at_height = =layer_height_0 + 14 * layer_height +infill_before_walls = True +line_width = =machine_nozzle_size * 0.875 +material_print_temperature = =default_material_print_temperature - 5 +material_print_temperature_layer_0 = =material_print_temperature +material_standby_temperature = 100 +raft_airgap = 0.5 +raft_margin = 15 +skin_overlap = 0 +speed_layer_0 = =math.ceil(speed_print * 15 / 50) +speed_print = 50 +speed_slowdown_layers = 15 +speed_topbottom = =math.ceil(speed_print * 25 / 50) +speed_wall = =math.ceil(speed_print * 40 / 50) +speed_wall_0 = =math.ceil(speed_wall * 30 / 40) +support_line_width = =round(line_width * 0.6 / 0.7, 2) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_PC_Superdraft_Print.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_PC_Superdraft_Print.inst.cfg new file mode 100644 index 0000000000..e6a742599b --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_PC_Superdraft_Print.inst.cfg @@ -0,0 +1,31 @@ +[general] +version = 4 +name = Sprint - Experimental +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = superdraft +weight = -4 +material = generic_pc +variant = AA 0.8 +is_experimental = True + +[values] +brim_width = 14 +cool_fan_full_at_height = =layer_height_0 + 7 * layer_height +infill_before_walls = True +line_width = =machine_nozzle_size * 0.875 +material_print_temperature_layer_0 = =material_print_temperature +material_standby_temperature = 100 +raft_airgap = 0.5 +raft_margin = 15 +skin_overlap = 0 +speed_layer_0 = =math.ceil(speed_print * 15 / 50) +speed_print = 50 +speed_slowdown_layers = 8 +speed_topbottom = =math.ceil(speed_print * 25 / 50) +speed_wall = =math.ceil(speed_print * 40 / 50) +speed_wall_0 = =math.ceil(speed_wall * 30 / 40) +support_line_width = =round(line_width * 0.6 / 0.7, 2) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_PC_Verydraft_Print.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_PC_Verydraft_Print.inst.cfg new file mode 100644 index 0000000000..01b63d5ac5 --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_PC_Verydraft_Print.inst.cfg @@ -0,0 +1,32 @@ +[general] +version = 4 +name = Extra Fast - Experimental +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = verydraft +weight = -3 +material = generic_pc +variant = AA 0.8 +is_experimental = True + +[values] +brim_width = 14 +cool_fan_full_at_height = =layer_height_0 + 9 * layer_height +infill_before_walls = True +line_width = =machine_nozzle_size * 0.875 +material_print_temperature = =default_material_print_temperature - 2 +material_print_temperature_layer_0 = =material_print_temperature +material_standby_temperature = 100 +raft_airgap = 0.5 +raft_margin = 15 +skin_overlap = 0 +speed_layer_0 = =math.ceil(speed_print * 15 / 50) +speed_print = 50 +speed_slowdown_layers = 10 +speed_topbottom = =math.ceil(speed_print * 25 / 50) +speed_wall = =math.ceil(speed_print * 40 / 50) +speed_wall_0 = =math.ceil(speed_wall * 30 / 40) +support_line_width = =round(line_width * 0.6 / 0.7, 2) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_PLA_Draft_Print.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_PLA_Draft_Print.inst.cfg new file mode 100644 index 0000000000..50acc663ab --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_PLA_Draft_Print.inst.cfg @@ -0,0 +1,42 @@ +[general] +version = 4 +name = Fast +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = draft +weight = -2 +material = generic_pla +variant = AA 0.8 + +[values] +cool_fan_full_at_height = =layer_height_0 + 2 * layer_height +cool_fan_speed_max = =100 +cool_min_speed = 2 +gradual_infill_step_height = =3 * layer_height +infill_line_width = =round(line_width * 0.65 / 0.75, 2) +line_width = =machine_nozzle_size * 0.9375 +machine_nozzle_cool_down_speed = 0.75 +machine_nozzle_heat_up_speed = 1.6 +material_final_print_temperature = =max(-273.15, material_print_temperature - 15) +material_initial_print_temperature = =max(-273.15, material_print_temperature - 10) +material_print_temperature = =default_material_print_temperature + 10 +prime_tower_enable = True +support_angle = 70 +support_line_width = =line_width * 0.75 +support_xy_distance = =wall_line_width_0 * 1.5 +top_bottom_thickness = =layer_height * 4 +wall_line_width = =round(line_width * 0.75 / 0.75, 2) +wall_line_width_x = =round(wall_line_width * 0.625 / 0.75, 2) +wall_thickness = =wall_line_width_0 + wall_line_width_x + +retract_at_layer_change = False +speed_print = 45 +speed_topbottom = =math.ceil(speed_print * 35 / 45) +speed_wall = =math.ceil(speed_print * 40 / 45) +speed_wall_x = =speed_wall +speed_wall_0 = =math.ceil(speed_wall * 35 / 40) +infill_sparse_density = 15 +layer_height_0 = 0.4 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_PLA_Superdraft_Print.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_PLA_Superdraft_Print.inst.cfg new file mode 100644 index 0000000000..e4e6c1a75d --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_PLA_Superdraft_Print.inst.cfg @@ -0,0 +1,42 @@ +[general] +version = 4 +name = Sprint +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = superdraft +weight = -4 +material = generic_pla +variant = AA 0.8 + +[values] +cool_fan_full_at_height = =layer_height_0 + 2 * layer_height +cool_fan_speed_max = =100 +cool_min_speed = 2 +gradual_infill_step_height = =3 * layer_height +infill_line_width = =round(line_width * 0.65 / 0.75, 2) +line_width = =machine_nozzle_size * 0.9375 +machine_nozzle_cool_down_speed = 0.75 +machine_nozzle_heat_up_speed = 1.6 +material_final_print_temperature = =max(-273.15, material_print_temperature - 15) +material_initial_print_temperature = =max(-273.15, material_print_temperature - 10) +material_print_temperature = =default_material_print_temperature + 15 +prime_tower_enable = True +raft_margin = 10 +support_angle = 70 +support_line_width = =line_width * 0.75 +support_xy_distance = =wall_line_width_0 * 1.5 +top_bottom_thickness = =layer_height * 4 +wall_line_width = =round(line_width * 0.75 / 0.75, 2) +wall_line_width_x = =round(wall_line_width * 0.625 / 0.75, 2) +wall_thickness = =wall_line_width_0 + wall_line_width_x +retract_at_layer_change = False +speed_print = 45 +speed_topbottom = =math.ceil(speed_print * 35 / 45) +speed_wall = =math.ceil(speed_print * 40 / 45) +speed_wall_x = =speed_wall +speed_wall_0 = =math.ceil(speed_wall * 35 / 40) +infill_sparse_density = 15 +layer_height_0 = 0.4 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_PLA_Verydraft_Print.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_PLA_Verydraft_Print.inst.cfg new file mode 100644 index 0000000000..005aaf3e04 --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_PLA_Verydraft_Print.inst.cfg @@ -0,0 +1,41 @@ +[general] +version = 4 +name = Extra Fast +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = verydraft +weight = -3 +material = generic_pla +variant = AA 0.8 + +[values] +cool_fan_full_at_height = =layer_height_0 + 2 * layer_height +cool_fan_speed_max = =100 +cool_min_speed = 2 +gradual_infill_step_height = =3 * layer_height +infill_line_width = =round(line_width * 0.65 / 0.75, 2) +line_width = =machine_nozzle_size * 0.9375 +machine_nozzle_cool_down_speed = 0.75 +machine_nozzle_heat_up_speed = 1.6 +material_final_print_temperature = =max(-273.15, material_print_temperature - 15) +material_initial_print_temperature = =max(-273.15, material_print_temperature - 10) +material_print_temperature = =default_material_print_temperature + 10 +prime_tower_enable = True +support_angle = 70 +support_line_width = =line_width * 0.75 +support_xy_distance = =wall_line_width_0 * 1.5 +top_bottom_thickness = =layer_height * 4 +wall_line_width = =round(line_width * 0.75 / 0.75, 2) +wall_line_width_x = =round(wall_line_width * 0.625 / 0.75, 2) +wall_thickness = =wall_line_width_0 + wall_line_width_x +retract_at_layer_change = False +speed_print = 45 +speed_topbottom = =math.ceil(speed_print * 35 / 45) +speed_wall = =math.ceil(speed_print * 40 / 45) +speed_wall_x = =speed_wall +speed_wall_0 = =math.ceil(speed_wall * 35 / 40) +infill_sparse_density = 15 +layer_height_0 = 0.4 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_PP_Draft_Print.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_PP_Draft_Print.inst.cfg new file mode 100644 index 0000000000..ea17ee7b2d --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_PP_Draft_Print.inst.cfg @@ -0,0 +1,52 @@ +[general] +version = 4 +name = Fast +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = draft +weight = -2 +material = generic_pp +variant = AA 0.8 + +[values] +brim_width = 25 +cool_min_layer_time_fan_speed_max = 6 +cool_min_speed = 17 +top_skin_expand_distance = =line_width * 2 +infill_before_walls = True +infill_line_width = =round(line_width * 0.7 / 0.8, 2) +infill_pattern = tetrahedral +jerk_prime_tower = =math.ceil(jerk_print * 25 / 25) +jerk_support = =math.ceil(jerk_print * 25 / 25) +jerk_wall_0 = =math.ceil(jerk_wall * 15 / 25) +material_bed_temperature_layer_0 = =material_bed_temperature +material_print_temperature = =default_material_print_temperature - 2 +material_print_temperature_layer_0 = =default_material_print_temperature + 2 +material_standby_temperature = 100 +multiple_mesh_overlap = 0.2 +prime_tower_enable = True +prime_tower_flow = 100 +prime_tower_min_volume = 10 +retract_at_layer_change = False +retraction_count_max = 12 +retraction_extra_prime_amount = 0.5 +retraction_hop = 0.5 +retraction_min_travel = 1.5 +retraction_prime_speed = 15 +skin_line_width = =round(line_width * 0.78 / 0.8, 2) + +speed_wall_x = =math.ceil(speed_wall * 30 / 30) +support_bottom_distance = =support_z_distance +support_line_width = =round(line_width * 0.7 / 0.8, 2) +support_offset = =line_width +switch_extruder_prime_speed = 15 +switch_extruder_retraction_amount = 20 +switch_extruder_retraction_speeds = 45 +top_bottom_thickness = 1.6 +travel_compensate_overlapping_walls_0_enabled = False +wall_0_wipe_dist = =line_width * 2 +wall_line_width_x = =round(line_width * 0.8 / 0.8, 2) +wall_thickness = 1.6 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_PP_Superdraft_Print.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_PP_Superdraft_Print.inst.cfg new file mode 100644 index 0000000000..cce48c4d79 --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_PP_Superdraft_Print.inst.cfg @@ -0,0 +1,52 @@ +[general] +version = 4 +name = Sprint +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = superdraft +weight = -4 +material = generic_pp +variant = AA 0.8 + +[values] +brim_width = 25 +cool_min_layer_time_fan_speed_max = 6 +cool_min_speed = 17 +top_skin_expand_distance = =line_width * 2 +infill_before_walls = True +infill_line_width = =round(line_width * 0.7 / 0.8, 2) +infill_pattern = tetrahedral +jerk_prime_tower = =math.ceil(jerk_print * 25 / 25) +jerk_support = =math.ceil(jerk_print * 25 / 25) +jerk_wall_0 = =math.ceil(jerk_wall * 15 / 25) +material_bed_temperature_layer_0 = =material_bed_temperature +material_print_temperature = =default_material_print_temperature + 2 +material_print_temperature_layer_0 = =default_material_print_temperature + 2 +material_standby_temperature = 100 +multiple_mesh_overlap = 0.2 +prime_tower_enable = True +prime_tower_flow = 100 +prime_tower_min_volume = 20 +retract_at_layer_change = False +retraction_count_max = 12 +retraction_extra_prime_amount = 0.5 +retraction_hop = 0.5 +retraction_min_travel = 1.5 +retraction_prime_speed = 15 +skin_line_width = =round(line_width * 0.78 / 0.8, 2) + +speed_wall_x = =math.ceil(speed_wall * 30 / 30) +support_bottom_distance = =support_z_distance +support_line_width = =round(line_width * 0.7 / 0.8, 2) +support_offset = =line_width +switch_extruder_prime_speed = 15 +switch_extruder_retraction_amount = 20 +switch_extruder_retraction_speeds = 45 +top_bottom_thickness = 1.6 +travel_compensate_overlapping_walls_0_enabled = False +wall_0_wipe_dist = =line_width * 2 +wall_line_width_x = =round(line_width * 0.8 / 0.8, 2) +wall_thickness = 1.6 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_PP_Verydraft_Print.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_PP_Verydraft_Print.inst.cfg new file mode 100644 index 0000000000..9b7bfd217b --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_PP_Verydraft_Print.inst.cfg @@ -0,0 +1,51 @@ +[general] +version = 4 +name = Extra Fast +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = verydraft +weight = -3 +material = generic_pp +variant = AA 0.8 + +[values] +brim_width = 25 +cool_min_layer_time_fan_speed_max = 6 +cool_min_speed = 17 +top_skin_expand_distance = =line_width * 2 +infill_before_walls = True +infill_line_width = =round(line_width * 0.7 / 0.8, 2) +infill_pattern = tetrahedral +jerk_prime_tower = =math.ceil(jerk_print * 25 / 25) +jerk_support = =math.ceil(jerk_print * 25 / 25) +jerk_wall_0 = =math.ceil(jerk_wall * 15 / 25) +material_bed_temperature_layer_0 = =material_bed_temperature +material_print_temperature_layer_0 = =default_material_print_temperature + 2 +material_standby_temperature = 100 +multiple_mesh_overlap = 0.2 +prime_tower_enable = True +prime_tower_flow = 100 +prime_tower_min_volume = 15 +retract_at_layer_change = False +retraction_count_max = 12 +retraction_extra_prime_amount = 0.5 +retraction_hop = 0.5 +retraction_min_travel = 1.5 +retraction_prime_speed = 15 +skin_line_width = =round(line_width * 0.78 / 0.8, 2) + +speed_wall_x = =math.ceil(speed_wall * 30 / 30) +support_bottom_distance = =support_z_distance +support_line_width = =round(line_width * 0.7 / 0.8, 2) +support_offset = =line_width +switch_extruder_prime_speed = 15 +switch_extruder_retraction_amount = 20 +switch_extruder_retraction_speeds = 45 +top_bottom_thickness = 1.6 +travel_compensate_overlapping_walls_0_enabled = False +wall_0_wipe_dist = =line_width * 2 +wall_line_width_x = =round(line_width * 0.8 / 0.8, 2) +wall_thickness = 1.6 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_TPLA_Draft_Print.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_TPLA_Draft_Print.inst.cfg new file mode 100644 index 0000000000..1c628f57c8 --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_TPLA_Draft_Print.inst.cfg @@ -0,0 +1,40 @@ +[general] +version = 4 +name = Fast +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = draft +weight = -2 +material = generic_tough_pla +variant = AA 0.8 + +[values] +cool_fan_full_at_height = =layer_height_0 + 2 * layer_height +cool_fan_speed_max = =100 +cool_min_speed = 2 +gradual_infill_step_height = =3 * layer_height +infill_line_width = =round(line_width * 0.75 / 0.75, 2) +infill_pattern = cubic +layer_height_0 = 0.4 +line_width = =machine_nozzle_size * 0.9375 +machine_nozzle_cool_down_speed = 0.75 +machine_nozzle_heat_up_speed = 1.6 +material_final_print_temperature = =max(-273.15, material_print_temperature - 15) +material_initial_print_temperature = =max(-273.15, material_print_temperature - 10) +material_print_temperature = =default_material_print_temperature + 0 +prime_tower_enable = False +retract_at_layer_change = False +speed_print = 45 +speed_topbottom = =round(speed_print * 35 / 45) +speed_wall = =round(speed_print * 40 / 45) +speed_wall_0 = =round(speed_print * 35 / 45) +support_angle = 70 +support_line_width = =line_width * 0.75 +support_xy_distance = =wall_line_width_0 * 1.5 +top_bottom_thickness = =layer_height * 6 +wall_line_width = =round(line_width * 0.75 / 0.75, 2) +wall_line_width_x = =round(wall_line_width * 0.75 / 0.75, 2) +wall_thickness = =wall_line_width_0 + wall_line_width_x \ No newline at end of file diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_TPLA_Superdraft_Print.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_TPLA_Superdraft_Print.inst.cfg new file mode 100644 index 0000000000..f0adc177a3 --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_TPLA_Superdraft_Print.inst.cfg @@ -0,0 +1,41 @@ +[general] +version = 4 +name = Sprint +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = superdraft +weight = -4 +material = generic_tough_pla +variant = AA 0.8 + +[values] +cool_fan_full_at_height = =layer_height_0 + 2 * layer_height +cool_fan_speed_max = =100 +cool_min_speed = 2 +gradual_infill_step_height = =3 * layer_height +infill_line_width = =round(line_width * 0.75 / 0.75, 2) +infill_pattern = cubic +layer_height_0 = 0.4 +line_width = =machine_nozzle_size * 0.9375 +machine_nozzle_cool_down_speed = 0.75 +machine_nozzle_heat_up_speed = 1.6 +material_final_print_temperature = =max(-273.15, material_print_temperature - 15) +material_initial_print_temperature = =max(-273.15, material_print_temperature - 10) +material_print_temperature = =default_material_print_temperature + 5 +prime_tower_enable = False +raft_margin = 10 +retract_at_layer_change = False +speed_infill = =math.ceil(speed_print * 30 / 30) +speed_print = 30 +speed_topbottom = =math.ceil(speed_print * 20 / 30) +speed_wall = =math.ceil(speed_print * 25/ 30) +speed_wall_0 = =math.ceil(speed_print * 20 / 30) +support_angle = 70 +support_line_width = =line_width * 0.75 +support_xy_distance = =wall_line_width_0 * 1.5 +top_bottom_thickness = =layer_height * 4 +wall_line_width = =round(line_width * 0.75 / 0.75, 2) +wall_thickness = =wall_line_width_0 + wall_line_width_x diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_TPLA_Verydraft_Print.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_TPLA_Verydraft_Print.inst.cfg new file mode 100644 index 0000000000..818426141e --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_TPLA_Verydraft_Print.inst.cfg @@ -0,0 +1,43 @@ +[general] +version = 4 +name = Extra Fast +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = verydraft +weight = -3 +material = generic_tough_pla +variant = AA 0.8 + +[values] +cool_fan_full_at_height = =layer_height_0 + 2 * layer_height +cool_fan_speed_max = =100 +cool_min_speed = 2 +gradual_infill_step_height = =3 * layer_height +infill_line_width = =round(line_width * 0.75 / 0.75, 2) +infill_pattern = cubic +layer_height_0 = 0.4 +line_width = =machine_nozzle_size * 0.9375 +machine_nozzle_cool_down_speed = 0.75 +machine_nozzle_heat_up_speed = 1.6 +material_final_print_temperature = =max(-273.15, material_print_temperature - 15) +material_initial_print_temperature = =max(-273.15, material_print_temperature - 10) +material_print_temperature = =default_material_print_temperature + 5 +material_print_temperature_layer_0 = =material_print_temperature +material_standby_temperature = 100 +prime_tower_enable = False +retract_at_layer_change = False +speed_infill = =math.ceil(speed_print * 30 / 35) +speed_print = 35 +speed_topbottom = =math.ceil(speed_print * 20 / 35) +speed_wall = =math.ceil(speed_print * 25/ 35) +speed_wall_0 = =math.ceil(speed_print * 20 / 35) +support_angle = 70 +support_line_width = =line_width * 0.75 +support_xy_distance = =wall_line_width_0 * 1.5 +top_bottom_thickness = =layer_height * 4 +wall_line_width = =round(line_width * 0.75 / 0.75, 2) +wall_line_width_x = =round(wall_line_width * 0.75 / 0.75, 2) +wall_thickness = =wall_line_width_0 + wall_line_width_x diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_TPU_Draft_Print.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_TPU_Draft_Print.inst.cfg new file mode 100644 index 0000000000..439f6a7063 --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_TPU_Draft_Print.inst.cfg @@ -0,0 +1,62 @@ +[general] +version = 4 +name = Fast +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = draft +weight = -2 +material = generic_tpu +variant = AA 0.8 + +[values] +brim_width = 8.75 +cool_min_layer_time_fan_speed_max = 6 +top_skin_expand_distance = =line_width * 2 +infill_before_walls = True +infill_line_width = =round(line_width * 0.7 / 0.8, 2) +infill_pattern = cross_3d +jerk_prime_tower = =math.ceil(jerk_print * 25 / 25) +jerk_support = =math.ceil(jerk_print * 25 / 25) +jerk_wall_0 = =math.ceil(jerk_wall * 15 / 25) +machine_nozzle_cool_down_speed = 0.5 +machine_nozzle_heat_up_speed = 2.5 +material_final_print_temperature = =material_print_temperature +material_flow = 105 +material_initial_print_temperature = =material_print_temperature +material_print_temperature = =default_material_print_temperature - 2 +material_print_temperature_layer_0 = =material_print_temperature + 19 +material_standby_temperature = 100 +multiple_mesh_overlap = 0.2 +prime_tower_enable = True +prime_tower_flow = 100 +retract_at_layer_change = False +retraction_count_max = 12 +retraction_extra_prime_amount = 0.5 +retraction_hop = 1.5 +retraction_hop_only_when_collides = False +retraction_min_travel = =line_width * 2 +retraction_prime_speed = 15 +skin_line_width = =round(line_width * 0.78 / 0.8, 2) +speed_print = 30 +speed_topbottom = =math.ceil(speed_print * 25 / 30) + +speed_wall = =math.ceil(speed_print * 30 / 30) +speed_wall_x = =math.ceil(speed_wall * 30 / 30) +support_angle = 50 +support_bottom_distance = =support_z_distance +support_line_width = =round(line_width * 0.7 / 0.8, 2) +support_offset = =line_width +switch_extruder_prime_speed = 15 +switch_extruder_retraction_amount = 20 +switch_extruder_retraction_speeds = 45 +top_bottom_thickness = 1.2 +travel_avoid_distance = 1.5 +travel_compensate_overlapping_walls_0_enabled = False +wall_0_wipe_dist = =line_width * 2 +wall_line_width_x = =round(line_width * 0.6 / 0.8, 2) +wall_thickness = 1.3 + +jerk_travel = 50 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_TPU_Superdraft_Print.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_TPU_Superdraft_Print.inst.cfg new file mode 100644 index 0000000000..dcef8ddf72 --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_TPU_Superdraft_Print.inst.cfg @@ -0,0 +1,63 @@ +[general] +version = 4 +name = Sprint +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = superdraft +weight = -4 +material = generic_tpu +variant = AA 0.8 + +[values] +brim_width = 8.75 +cool_min_layer_time_fan_speed_max = 6 +top_skin_expand_distance = =line_width * 2 +infill_before_walls = True +infill_line_width = =round(line_width * 0.7 / 0.8, 2) +infill_pattern = cross_3d +infill_sparse_density = 10 +jerk_prime_tower = =math.ceil(jerk_print * 25 / 25) +jerk_support = =math.ceil(jerk_print * 25 / 25) +jerk_wall_0 = =math.ceil(jerk_wall * 15 / 25) +machine_nozzle_cool_down_speed = 0.5 +machine_nozzle_heat_up_speed = 2.5 +material_final_print_temperature = =material_print_temperature +material_flow = 105 +material_initial_print_temperature = =material_print_temperature +material_print_temperature = =default_material_print_temperature + 2 +material_print_temperature_layer_0 = =material_print_temperature + 15 +material_standby_temperature = 100 +multiple_mesh_overlap = 0.2 +prime_tower_enable = True +prime_tower_flow = 100 +retract_at_layer_change = False +retraction_count_max = 12 +retraction_extra_prime_amount = 0.5 +retraction_hop = 1.5 +retraction_hop_only_when_collides = False +retraction_min_travel = =line_width * 2 +retraction_prime_speed = 15 +skin_line_width = =round(line_width * 0.78 / 0.8, 2) +speed_print = 30 +speed_topbottom = =math.ceil(speed_print * 20 / 30) + +speed_wall = =math.ceil(speed_print * 30 / 30) +speed_wall_x = =math.ceil(speed_wall * 30 / 30) +support_angle = 50 +support_bottom_distance = =support_z_distance +support_line_width = =round(line_width * 0.7 / 0.8, 2) +support_offset = =line_width +switch_extruder_prime_speed = 15 +switch_extruder_retraction_amount = 20 +switch_extruder_retraction_speeds = 45 +top_bottom_thickness = 1.2 +travel_avoid_distance = 1.5 +travel_compensate_overlapping_walls_0_enabled = False +wall_0_wipe_dist = =line_width * 2 +wall_line_width_x = =round(line_width * 0.6 / 0.8, 2) +wall_thickness = 1.3 + +jerk_travel = 50 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_TPU_Verydraft_Print.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_TPU_Verydraft_Print.inst.cfg new file mode 100644 index 0000000000..3bd6295712 --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_TPU_Verydraft_Print.inst.cfg @@ -0,0 +1,62 @@ +[general] +version = 4 +name = Extra Fast +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = verydraft +weight = -3 +material = generic_tpu +variant = AA 0.8 + +[values] +brim_width = 8.75 +cool_min_layer_time_fan_speed_max = 6 +top_skin_expand_distance = =line_width * 2 +infill_before_walls = True +infill_line_width = =round(line_width * 0.7 / 0.8, 2) +infill_pattern = cross_3d +infill_sparse_density = 10 +jerk_prime_tower = =math.ceil(jerk_print * 25 / 25) +jerk_support = =math.ceil(jerk_print * 25 / 25) +jerk_wall_0 = =math.ceil(jerk_wall * 15 / 25) +machine_nozzle_cool_down_speed = 0.5 +machine_nozzle_heat_up_speed = 2.5 +material_final_print_temperature = =material_print_temperature +material_flow = 105 +material_initial_print_temperature = =material_print_temperature +material_print_temperature_layer_0 = =material_print_temperature + 17 +material_standby_temperature = 100 +multiple_mesh_overlap = 0.2 +prime_tower_enable = True +prime_tower_flow = 100 +retract_at_layer_change = False +retraction_count_max = 12 +retraction_extra_prime_amount = 0.5 +retraction_hop = 1.5 +retraction_hop_only_when_collides = False +retraction_min_travel = =line_width * 2 +retraction_prime_speed = 15 +skin_line_width = =round(line_width * 0.78 / 0.8, 2) +speed_print = 30 +speed_topbottom = =math.ceil(speed_print * 23 / 30) + +speed_wall = =math.ceil(speed_print * 30 / 30) +speed_wall_x = =math.ceil(speed_wall * 30 / 30) +support_angle = 50 +support_bottom_distance = =support_z_distance +support_line_width = =round(line_width * 0.7 / 0.8, 2) +support_offset = =line_width +switch_extruder_prime_speed = 15 +switch_extruder_retraction_amount = 20 +switch_extruder_retraction_speeds = 45 +top_bottom_thickness = 1.2 +travel_avoid_distance = 1.5 +travel_compensate_overlapping_walls_0_enabled = False +wall_0_wipe_dist = =line_width * 2 +wall_line_width_x = =round(line_width * 0.6 / 0.8, 2) +wall_thickness = 1.3 + +jerk_travel = 50 diff --git a/resources/quality/ultimaker_s3/um_s3_bb0.4_PVA_Draft_Print.inst.cfg b/resources/quality/ultimaker_s3/um_s3_bb0.4_PVA_Draft_Print.inst.cfg new file mode 100644 index 0000000000..7e94ba6a7c --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_bb0.4_PVA_Draft_Print.inst.cfg @@ -0,0 +1,20 @@ +[general] +version = 4 +name = Fast +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = draft +weight = -2 +material = generic_pva +variant = BB 0.4 + +[values] +brim_replaces_support = False +material_print_temperature = =default_material_print_temperature + 10 +material_standby_temperature = 100 +prime_tower_enable = False +skin_overlap = 20 +support_brim_enable = True diff --git a/resources/quality/ultimaker_s3/um_s3_bb0.4_PVA_Fast_Print.inst.cfg b/resources/quality/ultimaker_s3/um_s3_bb0.4_PVA_Fast_Print.inst.cfg new file mode 100644 index 0000000000..4a8b11eef2 --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_bb0.4_PVA_Fast_Print.inst.cfg @@ -0,0 +1,21 @@ +[general] +version = 4 +name = Normal +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = fast +weight = -1 +material = generic_pva +variant = BB 0.4 + +[values] +brim_replaces_support = False +material_print_temperature = =default_material_print_temperature + 5 +material_standby_temperature = 100 +prime_tower_enable = False +skin_overlap = 15 +support_brim_enable = True +support_infill_sparse_thickness = 0.3 diff --git a/resources/quality/ultimaker_s3/um_s3_bb0.4_PVA_High_Quality.inst.cfg b/resources/quality/ultimaker_s3/um_s3_bb0.4_PVA_High_Quality.inst.cfg new file mode 100644 index 0000000000..aa83fa6a3b --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_bb0.4_PVA_High_Quality.inst.cfg @@ -0,0 +1,19 @@ +[general] +version = 4 +name = Extra Fine +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = high +weight = 1 +material = generic_pva +variant = BB 0.4 + +[values] +brim_replaces_support = False +material_standby_temperature = 100 +prime_tower_enable = False +support_brim_enable = True +support_infill_sparse_thickness = 0.18 diff --git a/resources/quality/ultimaker_s3/um_s3_bb0.4_PVA_Normal_Quality.inst.cfg b/resources/quality/ultimaker_s3/um_s3_bb0.4_PVA_Normal_Quality.inst.cfg new file mode 100644 index 0000000000..1c9814a87d --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_bb0.4_PVA_Normal_Quality.inst.cfg @@ -0,0 +1,18 @@ +[general] +version = 4 +name = Fine +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = normal +weight = 0 +material = generic_pva +variant = BB 0.4 + +[values] +brim_replaces_support = False +material_standby_temperature = 100 +prime_tower_enable = False +support_brim_enable = True diff --git a/resources/quality/ultimaker_s3/um_s3_bb0.8_PVA_Draft_Print.inst.cfg b/resources/quality/ultimaker_s3/um_s3_bb0.8_PVA_Draft_Print.inst.cfg new file mode 100644 index 0000000000..aebbed3d5f --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_bb0.8_PVA_Draft_Print.inst.cfg @@ -0,0 +1,18 @@ +[general] +version = 4 +name = Fast +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = draft +weight = -2 +material = generic_pva +variant = BB 0.8 + +[values] +brim_replaces_support = False +material_print_temperature = =default_material_print_temperature + 5 +material_standby_temperature = 100 +support_brim_enable = True diff --git a/resources/quality/ultimaker_s3/um_s3_bb0.8_PVA_Superdraft_Print.inst.cfg b/resources/quality/ultimaker_s3/um_s3_bb0.8_PVA_Superdraft_Print.inst.cfg new file mode 100644 index 0000000000..c9179b1480 --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_bb0.8_PVA_Superdraft_Print.inst.cfg @@ -0,0 +1,18 @@ +[general] +version = 4 +name = Sprint +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = superdraft +weight = -4 +material = generic_pva +variant = BB 0.8 + +[values] +brim_replaces_support = False +material_standby_temperature = 100 +support_brim_enable = True +support_interface_height = 0.9 diff --git a/resources/quality/ultimaker_s3/um_s3_bb0.8_PVA_Verydraft_Print.inst.cfg b/resources/quality/ultimaker_s3/um_s3_bb0.8_PVA_Verydraft_Print.inst.cfg new file mode 100644 index 0000000000..57019cb91f --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_bb0.8_PVA_Verydraft_Print.inst.cfg @@ -0,0 +1,19 @@ +[general] +version = 4 +name = Extra Fast +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = verydraft +weight = -3 +material = generic_pva +variant = BB 0.8 + +[values] +brim_replaces_support = False +material_standby_temperature = 100 +support_brim_enable = True +support_infill_sparse_thickness = 0.3 +support_interface_height = 1.2 diff --git a/resources/quality/ultimaker_s3/um_s3_cc0.6_CFFCPE_Draft_Print.inst.cfg b/resources/quality/ultimaker_s3/um_s3_cc0.6_CFFCPE_Draft_Print.inst.cfg new file mode 100644 index 0000000000..846679e355 --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_cc0.6_CFFCPE_Draft_Print.inst.cfg @@ -0,0 +1,31 @@ +[general] +version = 4 +name = Fast +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = draft +weight = -2 +material = generic_cffcpe +variant = CC 0.6 + +[values] +adhesion_type = skirt +cool_fan_enabled = True +cool_min_layer_time = 7 +cool_min_layer_time_fan_speed_max = 15 +cool_min_speed = 6 +infill_line_width = =line_width +initial_layer_line_width_factor = 130.0 +line_width = =machine_nozzle_size * (0.58/0.6) +material_bed_temperature_layer_0 = =material_bed_temperature + 5 +material_print_temperature = =default_material_print_temperature +material_print_temperature_layer_0 = =material_print_temperature +material_standby_temperature = 100 +skin_overlap = 20 +support_bottom_distance = =support_z_distance / 2 +support_top_distance = =support_z_distance +support_z_distance = =layer_height * 2 +wall_line_width_x = =line_width diff --git a/resources/quality/ultimaker_s3/um_s3_cc0.6_CFFPA_Draft_Print.inst.cfg b/resources/quality/ultimaker_s3/um_s3_cc0.6_CFFPA_Draft_Print.inst.cfg new file mode 100644 index 0000000000..228045c134 --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_cc0.6_CFFPA_Draft_Print.inst.cfg @@ -0,0 +1,31 @@ +[general] +version = 4 +name = Fast +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = draft +weight = -2 +material = generic_cffpa +variant = CC 0.6 + +[values] +adhesion_type = skirt +cool_fan_enabled = True +cool_min_layer_time = 7 +cool_min_layer_time_fan_speed_max = 15 +cool_min_speed = 6 +infill_line_width = =line_width +initial_layer_line_width_factor = 130.0 +line_width = =machine_nozzle_size * (0.58/0.6) +material_bed_temperature_layer_0 = =material_bed_temperature + 5 +material_print_temperature = =default_material_print_temperature +material_print_temperature_layer_0 = =material_print_temperature +material_standby_temperature = 100 +skin_overlap = 20 +support_bottom_distance = =support_z_distance / 2 +support_top_distance = =support_z_distance +support_z_distance = =layer_height * 2 +wall_line_width_x = =line_width diff --git a/resources/quality/ultimaker_s3/um_s3_cc0.6_GFFCPE_Draft_Print.inst.cfg b/resources/quality/ultimaker_s3/um_s3_cc0.6_GFFCPE_Draft_Print.inst.cfg new file mode 100644 index 0000000000..ae9c23d1a8 --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_cc0.6_GFFCPE_Draft_Print.inst.cfg @@ -0,0 +1,31 @@ +[general] +version = 4 +name = Fast +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = draft +weight = -2 +material = generic_gffcpe +variant = CC 0.6 + +[values] +adhesion_type = brim +cool_fan_enabled = True +cool_min_layer_time = 7 +cool_min_layer_time_fan_speed_max = 15 +cool_min_speed = 6 +infill_line_width = =line_width +initial_layer_line_width_factor = 130.0 +line_width = =machine_nozzle_size * (0.58/0.6) +material_bed_temperature_layer_0 = =material_bed_temperature + 5 +material_print_temperature = =default_material_print_temperature +material_print_temperature_layer_0 = =material_print_temperature +material_standby_temperature = 100 +skin_overlap = 20 +support_bottom_distance = =support_z_distance / 2 +support_top_distance = =support_z_distance +support_z_distance = =layer_height * 2 +wall_line_width_x = =line_width diff --git a/resources/quality/ultimaker_s3/um_s3_cc0.6_GFFPA_Draft_Print.inst.cfg b/resources/quality/ultimaker_s3/um_s3_cc0.6_GFFPA_Draft_Print.inst.cfg new file mode 100644 index 0000000000..56de714613 --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_cc0.6_GFFPA_Draft_Print.inst.cfg @@ -0,0 +1,31 @@ +[general] +version = 4 +name = Fast +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = draft +weight = -2 +material = generic_gffpa +variant = CC 0.6 + +[values] +adhesion_type = brim +cool_fan_enabled = True +cool_min_layer_time = 7 +cool_min_layer_time_fan_speed_max = 15 +cool_min_speed = 6 +infill_line_width = =line_width +initial_layer_line_width_factor = 130.0 +line_width = =machine_nozzle_size * (0.58/0.6) +material_bed_temperature_layer_0 = =material_bed_temperature + 5 +material_print_temperature = =default_material_print_temperature +material_print_temperature_layer_0 = =material_print_temperature +material_standby_temperature = 100 +skin_overlap = 20 +support_bottom_distance = =support_z_distance / 2 +support_top_distance = =support_z_distance +support_z_distance = =layer_height * 2 +wall_line_width_x = =line_width diff --git a/resources/quality/ultimaker_s3/um_s3_cc0.6_PLA_Draft_Print.inst.cfg b/resources/quality/ultimaker_s3/um_s3_cc0.6_PLA_Draft_Print.inst.cfg new file mode 100644 index 0000000000..a5bdfad16a --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_cc0.6_PLA_Draft_Print.inst.cfg @@ -0,0 +1,43 @@ +[general] +version = 4 +name = Fast +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = draft +weight = -3 +material = generic_pla +variant = CC 0.6 +is_experimental = True + +[values] +cool_fan_full_at_height = =layer_height_0 + 2 * layer_height +cool_fan_speed_max = =100 +cool_min_speed = 2 +gradual_infill_step_height = =3 * layer_height +infill_line_width = =round(line_width * 0.65 / 0.75, 2) +infill_pattern = triangles +line_width = =machine_nozzle_size * 0.9375 +machine_nozzle_cool_down_speed = 0.75 +machine_nozzle_heat_up_speed = 1.6 +material_final_print_temperature = =max(-273.15, material_print_temperature - 15) +material_initial_print_temperature = =max(-273.15, material_print_temperature - 10) +material_print_temperature = =default_material_print_temperature + 10 +material_standby_temperature = 100 +prime_tower_enable = True +retract_at_layer_change = False +speed_print = 45 +speed_topbottom = =math.ceil(speed_print * 35 / 45) +speed_wall = =math.ceil(speed_print * 40 / 45) +speed_wall_x = =speed_wall +speed_wall_0 = =math.ceil(speed_wall * 35 / 40) +support_angle = 70 +support_line_width = =line_width * 0.75 +support_pattern = ='triangles' +support_xy_distance = =wall_line_width_0 * 1.5 +top_bottom_thickness = =layer_height * 4 +wall_line_width = =round(line_width * 0.75 / 0.75, 2) +wall_line_width_x = =round(wall_line_width * 0.625 / 0.75, 2) +wall_thickness = =wall_line_width_0 + wall_line_width_x diff --git a/resources/quality/ultimaker_s3/um_s3_cc0.6_PLA_Fast_Print.inst.cfg b/resources/quality/ultimaker_s3/um_s3_cc0.6_PLA_Fast_Print.inst.cfg new file mode 100644 index 0000000000..f8bb270616 --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_cc0.6_PLA_Fast_Print.inst.cfg @@ -0,0 +1,43 @@ +[general] +version = 4 +name = Normal +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = fast +weight = -2 +material = generic_pla +variant = CC 0.6 +is_experimental = True + +[values] +cool_fan_full_at_height = =layer_height_0 + 2 * layer_height +cool_fan_speed_max = =100 +cool_min_speed = 2 +gradual_infill_step_height = =3 * layer_height +infill_line_width = =round(line_width * 0.65 / 0.75, 2) +infill_pattern = triangles +line_width = =machine_nozzle_size * 0.9375 +machine_nozzle_cool_down_speed = 0.75 +machine_nozzle_heat_up_speed = 1.6 +material_final_print_temperature = =max(-273.15, material_print_temperature - 15) +material_initial_print_temperature = =max(-273.15, material_print_temperature - 10) +material_print_temperature = =default_material_print_temperature + 10 +material_standby_temperature = 100 +prime_tower_enable = True +retract_at_layer_change = False +speed_print = 45 +speed_topbottom = =math.ceil(speed_print * 35 / 45) +speed_wall = =math.ceil(speed_print * 40 / 45) +speed_wall_x = =speed_wall +speed_wall_0 = =math.ceil(speed_wall * 35 / 40) +support_angle = 70 +support_line_width = =line_width * 0.75 +support_pattern = ='triangles' +support_xy_distance = =wall_line_width_0 * 1.5 +top_bottom_thickness = =layer_height * 4 +wall_line_width = =round(line_width * 0.75 / 0.75, 2) +wall_line_width_x = =round(wall_line_width * 0.625 / 0.75, 2) +wall_thickness = =wall_line_width_0 + wall_line_width_x diff --git a/resources/quality/ultimaker_s3/um_s3_global_Draft_Quality.inst.cfg b/resources/quality/ultimaker_s3/um_s3_global_Draft_Quality.inst.cfg new file mode 100644 index 0000000000..f2203eddbc --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_global_Draft_Quality.inst.cfg @@ -0,0 +1,14 @@ +[general] +version = 4 +name = Fast +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = draft +weight = -2 +global_quality = True + +[values] +layer_height = 0.2 diff --git a/resources/quality/ultimaker_s3/um_s3_global_Fast_Quality.inst.cfg b/resources/quality/ultimaker_s3/um_s3_global_Fast_Quality.inst.cfg new file mode 100644 index 0000000000..7d05340547 --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_global_Fast_Quality.inst.cfg @@ -0,0 +1,14 @@ +[general] +version = 4 +name = Normal +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = fast +weight = -1 +global_quality = True + +[values] +layer_height = 0.15 diff --git a/resources/quality/ultimaker_s3/um_s3_global_High_Quality.inst.cfg b/resources/quality/ultimaker_s3/um_s3_global_High_Quality.inst.cfg new file mode 100644 index 0000000000..4f12ea611f --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_global_High_Quality.inst.cfg @@ -0,0 +1,14 @@ +[general] +version = 4 +name = Extra Fine +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = high +weight = 1 +global_quality = True + +[values] +layer_height = 0.06 diff --git a/resources/quality/ultimaker_s3/um_s3_global_Normal_Quality.inst.cfg b/resources/quality/ultimaker_s3/um_s3_global_Normal_Quality.inst.cfg new file mode 100644 index 0000000000..5fd3f6d3a6 --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_global_Normal_Quality.inst.cfg @@ -0,0 +1,14 @@ +[general] +version = 4 +name = Fine +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = normal +weight = 0 +global_quality = True + +[values] +layer_height = 0.1 diff --git a/resources/quality/ultimaker_s3/um_s3_global_Superdraft_Quality.inst.cfg b/resources/quality/ultimaker_s3/um_s3_global_Superdraft_Quality.inst.cfg new file mode 100644 index 0000000000..eccb41a73e --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_global_Superdraft_Quality.inst.cfg @@ -0,0 +1,14 @@ +[general] +version = 4 +name = Sprint +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = superdraft +weight = -4 +global_quality = True + +[values] +layer_height = 0.4 diff --git a/resources/quality/ultimaker_s3/um_s3_global_Verydraft_Quality.inst.cfg b/resources/quality/ultimaker_s3/um_s3_global_Verydraft_Quality.inst.cfg new file mode 100644 index 0000000000..716a75d9e9 --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_global_Verydraft_Quality.inst.cfg @@ -0,0 +1,14 @@ +[general] +version = 4 +name = Extra Fast +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = quality +quality_type = verydraft +weight = -3 +global_quality = True + +[values] +layer_height = 0.3 diff --git a/resources/variants/ultimaker_s3_aa0.25.inst.cfg b/resources/variants/ultimaker_s3_aa0.25.inst.cfg deleted file mode 120000 index 781ec8859a..0000000000 --- a/resources/variants/ultimaker_s3_aa0.25.inst.cfg +++ /dev/null @@ -1 +0,0 @@ -/home/ruben/Projects/cura-private-data/resources/variants/ultimaker_s3_aa0.25.inst.cfg \ No newline at end of file diff --git a/resources/variants/ultimaker_s3_aa0.25.inst.cfg b/resources/variants/ultimaker_s3_aa0.25.inst.cfg new file mode 100644 index 0000000000..7bcf71852f --- /dev/null +++ b/resources/variants/ultimaker_s3_aa0.25.inst.cfg @@ -0,0 +1,50 @@ +[general] +name = AA 0.25 +version = 4 +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = variant +hardware_type = nozzle + +[values] +brim_width = 7 +infill_line_width = 0.23 +layer_height_0 = 0.17 +line_width = 0.23 +machine_nozzle_cool_down_speed = 0.85 +machine_nozzle_heat_up_speed = 1.5 +machine_nozzle_id = AA 0.25 +machine_nozzle_size = 0.25 +machine_nozzle_tip_outer_diameter = 0.65 +material_final_print_temperature = =material_print_temperature - 10 +material_initial_print_temperature = =material_print_temperature - 5 +raft_airgap = 0.3 +raft_base_thickness = =resolveOrValue('layer_height_0') * 1.2 +raft_interface_line_spacing = =raft_interface_line_width + 0.2 +raft_interface_line_width = =line_width * 2 +raft_interface_thickness = =layer_height * 1.5 +raft_jerk = =jerk_print +raft_margin = 15 +raft_surface_layers = 2 +retraction_count_max = 25 +retraction_extrusion_window = 1 +retraction_min_travel = 0.7 +retraction_prime_speed = =retraction_speed +skin_overlap = 15 +speed_layer_0 = 20 +speed_print = 55 +speed_topbottom = 20 +speed_wall = =math.ceil(speed_print * 30 / 55) +support_angle = 60 +support_bottom_distance = =support_z_distance / 2 +support_pattern = zigzag +support_top_distance = =support_z_distance +support_use_towers = True +support_z_distance = =layer_height * 2 +switch_extruder_prime_speed = =switch_extruder_retraction_speeds +switch_extruder_retraction_amount = =machine_heat_zone_length +top_bottom_thickness = 1.2 +wall_line_width_x = 0.23 +wall_thickness = 1.3 diff --git a/resources/variants/ultimaker_s3_aa0.8.inst.cfg b/resources/variants/ultimaker_s3_aa0.8.inst.cfg deleted file mode 120000 index 05d969096a..0000000000 --- a/resources/variants/ultimaker_s3_aa0.8.inst.cfg +++ /dev/null @@ -1 +0,0 @@ -/home/ruben/Projects/cura-private-data/resources/variants/ultimaker_s3_aa0.8.inst.cfg \ No newline at end of file diff --git a/resources/variants/ultimaker_s3_aa0.8.inst.cfg b/resources/variants/ultimaker_s3_aa0.8.inst.cfg new file mode 100644 index 0000000000..d272c05c43 --- /dev/null +++ b/resources/variants/ultimaker_s3_aa0.8.inst.cfg @@ -0,0 +1,67 @@ +[general] +name = AA 0.8 +version = 4 +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = variant +hardware_type = nozzle + +[values] +acceleration_enabled = True +acceleration_print = 4000 +brim_width = 7 +cool_fan_speed = 7 +cool_fan_speed_max = 100 +cool_min_speed = 5 +default_material_print_temperature = 200 +infill_before_walls = False +infill_line_width = =round(line_width * 0.6 / 0.7, 2) +infill_overlap = 0 +infill_pattern = triangles +infill_wipe_dist = 0 +jerk_enabled = True +jerk_print = 25 +jerk_topbottom = =math.ceil(jerk_print * 25 / 25) +jerk_wall = =math.ceil(jerk_print * 25 / 25) +jerk_wall_0 = =math.ceil(jerk_wall * 25 / 25) +layer_height = 0.2 +line_width = =machine_nozzle_size +machine_min_cool_heat_time_window = 15 +machine_nozzle_cool_down_speed = 0.85 +machine_nozzle_heat_up_speed = 1.5 +machine_nozzle_id = AA 0.8 +machine_nozzle_size = 0.8 +machine_nozzle_tip_outer_diameter = 2.0 +material_final_print_temperature = =material_print_temperature - 10 +material_initial_print_temperature = =material_print_temperature - 5 +material_standby_temperature = 100 +multiple_mesh_overlap = 0 +prime_tower_enable = False +prime_tower_wipe_enabled = True +retract_at_layer_change = =not magic_spiralize +retraction_amount = 6.5 +retraction_count_max = 25 +retraction_extrusion_window = 1 +retraction_hop = 2 +retraction_hop_only_when_collides = True +retraction_min_travel = =line_width * 2 +skin_overlap = 5 +speed_equalize_flow_enabled = True +speed_layer_0 = 20 +speed_print = 35 +speed_topbottom = =math.ceil(speed_print * 25 / 35) +speed_wall_0 = =math.ceil(speed_wall * 25 / 30) +support_angle = 60 +support_bottom_distance = =support_z_distance / 2 +support_pattern = zigzag +support_top_distance = =support_z_distance +support_z_distance = =layer_height * 2 +switch_extruder_prime_speed = 20 +switch_extruder_retraction_amount = 16.5 +top_bottom_thickness = 1.4 +wall_0_inset = 0 +wall_line_width_0 = =wall_line_width +wall_line_width_x = =wall_line_width +wall_thickness = 2 diff --git a/resources/variants/ultimaker_s3_aa04.inst.cfg b/resources/variants/ultimaker_s3_aa04.inst.cfg deleted file mode 120000 index ea67c735cf..0000000000 --- a/resources/variants/ultimaker_s3_aa04.inst.cfg +++ /dev/null @@ -1 +0,0 @@ -/home/ruben/Projects/cura-private-data/resources/variants/ultimaker_s3_aa04.inst.cfg \ No newline at end of file diff --git a/resources/variants/ultimaker_s3_aa04.inst.cfg b/resources/variants/ultimaker_s3_aa04.inst.cfg new file mode 100644 index 0000000000..91e7d774c7 --- /dev/null +++ b/resources/variants/ultimaker_s3_aa04.inst.cfg @@ -0,0 +1,42 @@ +[general] +name = AA 0.4 +version = 4 +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = variant +hardware_type = nozzle + +[values] +brim_width = 7 +machine_nozzle_cool_down_speed = 0.9 +machine_nozzle_id = AA 0.4 +machine_nozzle_tip_outer_diameter = 1.0 +raft_acceleration = =acceleration_print +raft_airgap = 0.3 +raft_base_thickness = =resolveOrValue('layer_height_0') * 1.2 +raft_interface_line_spacing = =raft_interface_line_width + 0.2 +raft_interface_line_width = =line_width * 2 +raft_interface_thickness = =layer_height * 1.5 +raft_jerk = =jerk_print +raft_margin = 15 +raft_surface_layers = 2 +retraction_amount = 6.5 +retraction_count_max = 25 +retraction_min_travel = =line_width * 2 +retraction_prime_speed = =retraction_speed +skin_overlap = 15 +speed_print = 70 +speed_topbottom = =math.ceil(speed_print * 30 / 70) +speed_wall = =math.ceil(speed_print * 30 / 70) +support_angle = 60 +support_bottom_distance = =support_z_distance / 2 +support_pattern = zigzag +support_top_distance = =support_z_distance +support_use_towers = True +support_z_distance = =layer_height * 2 +switch_extruder_prime_speed = =switch_extruder_retraction_speeds +switch_extruder_retraction_amount = =machine_heat_zone_length +top_bottom_thickness = 1.2 +wall_thickness = 1.3 diff --git a/resources/variants/ultimaker_s3_bb0.8.inst.cfg b/resources/variants/ultimaker_s3_bb0.8.inst.cfg deleted file mode 120000 index d9cc34e168..0000000000 --- a/resources/variants/ultimaker_s3_bb0.8.inst.cfg +++ /dev/null @@ -1 +0,0 @@ -/home/ruben/Projects/cura-private-data/resources/variants/ultimaker_s3_bb0.8.inst.cfg \ No newline at end of file diff --git a/resources/variants/ultimaker_s3_bb0.8.inst.cfg b/resources/variants/ultimaker_s3_bb0.8.inst.cfg new file mode 100644 index 0000000000..611d351d4f --- /dev/null +++ b/resources/variants/ultimaker_s3_bb0.8.inst.cfg @@ -0,0 +1,93 @@ +[general] +name = BB 0.8 +version = 4 +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = variant +hardware_type = nozzle + +[values] +acceleration_enabled = True +acceleration_print = 4000 +acceleration_support = =math.ceil(acceleration_print * 2000 / 4000) +acceleration_support_interface = =math.ceil(acceleration_support * 1500 / 2000) +acceleration_support_bottom = =math.ceil(acceleration_support_interface * 100 / 1500) +acceleration_prime_tower = =math.ceil(acceleration_print * 200 / 4000) +brim_width = 3 +cool_fan_speed = 50 +cool_min_speed = 5 +gradual_support_infill_step_height = 1.6 +gradual_support_infill_steps = 2 +infill_line_width = =round(line_width * 0.8 / 0.7, 2) +infill_overlap = 0 +infill_pattern = triangles +infill_wipe_dist = 0 +jerk_enabled = True +jerk_prime_tower = =math.ceil(jerk_print * 2 / 25) +jerk_print = 25 +jerk_support = =math.ceil(jerk_print * 15 / 25) +jerk_support_interface = =math.ceil(jerk_support * 10 / 15) +jerk_support_bottom = =math.ceil(jerk_support_interface * 1 / 10) +layer_height = 0.2 +machine_min_cool_heat_time_window = 15 +machine_nozzle_heat_up_speed = 1.5 +machine_nozzle_id = BB 0.8 +machine_nozzle_size = 0.8 +machine_nozzle_tip_outer_diameter = 2.0 +material_print_temperature = =default_material_print_temperature + 10 +material_standby_temperature = 100 +multiple_mesh_overlap = 0 +prime_tower_enable = False +prime_tower_wipe_enabled = True +raft_acceleration = =acceleration_layer_0 +raft_airgap = 0 +raft_base_speed = 20 +raft_base_thickness = 0.3 +raft_interface_line_spacing = 0.5 +raft_interface_line_width = 0.5 +raft_interface_speed = 20 +raft_interface_thickness = 0.2 +raft_margin = 10 +raft_speed = 25 +raft_surface_layers = 1 +retraction_amount = 4.5 +retraction_count_max = 15 +retraction_extrusion_window = =retraction_amount +retraction_hop = 2 +retraction_hop_only_when_collides = True +retraction_min_travel = =line_width * 3 +retraction_prime_speed = 15 +skin_overlap = 5 +speed_layer_0 = 20 +speed_print = 35 +speed_support = =math.ceil(speed_print * 25 / 35) +speed_support_interface = =math.ceil(speed_support * 20 / 25) +speed_support_bottom = =math.ceil(speed_support_interface * 10 / 20) +speed_wall_0 = =math.ceil(speed_wall * 25 / 30) +speed_prime_tower = =math.ceil(speed_print * 7 / 35) +support_angle = 60 +support_bottom_height = =layer_height * 2 +support_bottom_pattern = zigzag +support_bottom_stair_step_height = =layer_height +support_infill_rate = 50 +support_infill_sparse_thickness = 0.4 +support_interface_enable = True +support_interface_height = 0.6 +support_interface_skip_height = =layer_height +support_join_distance = 3 +support_line_width = =round(line_width * 0.4 / 0.35, 2) +support_offset = 1.5 +support_pattern = triangles +support_use_towers = False +support_xy_distance = =round(wall_line_width_0 * 0.75, 2) +support_xy_distance_overhang = =wall_line_width_0 / 4 +support_z_distance = 0 +switch_extruder_prime_speed = 15 +switch_extruder_retraction_amount = 12 +top_bottom_thickness = 1 +wall_0_inset = 0 +wall_line_width_0 = =wall_line_width +wall_line_width_x = =wall_line_width +wall_thickness = 1 diff --git a/resources/variants/ultimaker_s3_bb04.inst.cfg b/resources/variants/ultimaker_s3_bb04.inst.cfg deleted file mode 120000 index b7a6d15e1f..0000000000 --- a/resources/variants/ultimaker_s3_bb04.inst.cfg +++ /dev/null @@ -1 +0,0 @@ -/home/ruben/Projects/cura-private-data/resources/variants/ultimaker_s3_bb04.inst.cfg \ No newline at end of file diff --git a/resources/variants/ultimaker_s3_bb04.inst.cfg b/resources/variants/ultimaker_s3_bb04.inst.cfg new file mode 100644 index 0000000000..198181c33b --- /dev/null +++ b/resources/variants/ultimaker_s3_bb04.inst.cfg @@ -0,0 +1,51 @@ +[general] +name = BB 0.4 +version = 4 +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = variant +hardware_type = nozzle + +[values] +acceleration_support = =math.ceil(acceleration_print * 2000 / 4000) +acceleration_support_interface = =math.ceil(acceleration_support * 1500 / 2000) +acceleration_support_bottom = =math.ceil(acceleration_support_interface * 100 / 1500) +acceleration_prime_tower = =math.ceil(acceleration_print * 200 / 4000) +cool_fan_speed_max = =cool_fan_speed +gradual_support_infill_steps = 2 +jerk_prime_tower = =math.ceil(jerk_print * 2 / 25) +jerk_support = =math.ceil(jerk_print * 15 / 25) +jerk_support_interface = =math.ceil(jerk_support * 10 / 15) +jerk_support_bottom = =math.ceil(jerk_support_interface * 1 / 10) +machine_nozzle_heat_up_speed = 1.5 +machine_nozzle_id = BB 0.4 +machine_nozzle_tip_outer_diameter = 1.0 +raft_base_speed = 20 +raft_interface_speed = 20 +raft_speed = 25 +retraction_amount = 4.5 +retraction_count_max = 20 +retraction_extrusion_window = =retraction_amount +retraction_min_travel = =3 * line_width +speed_layer_0 = 20 +speed_prime_tower = =math.ceil(speed_print * 10 / 35) +speed_support = =math.ceil(speed_print * 25 / 35) +speed_support_interface = =math.ceil(speed_support * 20 / 25) +speed_support_bottom = =math.ceil(speed_support_interface * 10 / 20) +speed_wall_0 = =math.ceil(speed_wall * 25 / 30) +support_bottom_height = =layer_height * 2 +support_bottom_pattern = zigzag +support_bottom_stair_step_height = =layer_height +support_infill_rate = 50 +support_infill_sparse_thickness = 0.2 +support_interface_enable = True +support_interface_height = 0.6 +support_interface_skip_height = =layer_height +support_join_distance = 3 +support_line_width = =round(line_width * 0.4 / 0.35, 2) +support_offset = 3 +support_xy_distance = =round(wall_line_width_0 * 0.75, 2) +support_xy_distance_overhang = =wall_line_width_0 / 2 +switch_extruder_retraction_amount = 12 diff --git a/resources/variants/ultimaker_s3_cc06.inst.cfg b/resources/variants/ultimaker_s3_cc06.inst.cfg deleted file mode 120000 index 7b69f2657b..0000000000 --- a/resources/variants/ultimaker_s3_cc06.inst.cfg +++ /dev/null @@ -1 +0,0 @@ -/home/ruben/Projects/cura-private-data/resources/variants/ultimaker_s3_cc06.inst.cfg \ No newline at end of file diff --git a/resources/variants/ultimaker_s3_cc06.inst.cfg b/resources/variants/ultimaker_s3_cc06.inst.cfg new file mode 100644 index 0000000000..01a9350cfe --- /dev/null +++ b/resources/variants/ultimaker_s3_cc06.inst.cfg @@ -0,0 +1,46 @@ +[general] +name = CC 0.6 +version = 4 +definition = ultimaker_s3 + +[metadata] +setting_version = 9 +type = variant +hardware_type = nozzle + +[values] +brim_width = 7 +machine_nozzle_cool_down_speed = 0.9 +machine_nozzle_id = CC 0.6 +machine_nozzle_size = 0.6 +raft_acceleration = =acceleration_print +raft_airgap = 0.3 +raft_base_thickness = =resolveOrValue('layer_height_0') * 1.2 +raft_interface_line_spacing = =raft_interface_line_width + 0.2 +raft_interface_line_width = =line_width * 2 +raft_interface_thickness = =layer_height * 1.5 +raft_jerk = =jerk_print +raft_margin = 15 +raft_surface_layers = 2 +retraction_count_max = 25 +retraction_min_travel = =line_width * 2 +retraction_prime_speed = =retraction_speed +speed_infill = =speed_print +speed_layer_0 = 20 +speed_print = 45 +speed_support = =speed_topbottom +speed_topbottom = =math.ceil(speed_print * 25 / 45) +speed_travel_layer_0 = 50 +speed_wall = =math.ceil(speed_print * 30 / 45) +speed_wall_0 = =math.ceil(speed_wall * 25 / 30) +speed_wall_x = =speed_wall +support_angle = 60 +support_bottom_distance = =support_z_distance / 2 +support_pattern = zigzag +support_top_distance = =support_z_distance +support_use_towers = True +support_z_distance = =layer_height * 2 +switch_extruder_prime_speed = =switch_extruder_retraction_speeds +switch_extruder_retraction_amount = =machine_heat_zone_length +top_bottom_thickness = =layer_height * 6 +wall_thickness = =line_width * 3 From ebd3b4b9bf5a6e7a8993a7b725068efba7ac467e Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Wed, 4 Sep 2019 10:26:48 +0200 Subject: [PATCH 087/158] Change the URL to check for new firmware Contributes to CURA-6742. --- resources/definitions/ultimaker_s3.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/ultimaker_s3.def.json b/resources/definitions/ultimaker_s3.def.json index c380fcbc50..0fbf4acd77 100644 --- a/resources/definitions/ultimaker_s3.def.json +++ b/resources/definitions/ultimaker_s3.def.json @@ -32,7 +32,7 @@ "weight": -1, "firmware_update_info": { "id": 213482, - "check_urls": ["https://software.ultimaker.com/releases/firmware/213482/stable/version.txt"], + "check_urls": ["https://software.ultimaker.com/releases/firmware/213482/stable/um-update.swu.version"], "update_url": "https://ultimaker.com/firmware" } }, From f051c48b9e64d36668993421d94a998e37e9433f Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Wed, 4 Sep 2019 14:11:57 +0200 Subject: [PATCH 088/158] Add a printer to the list of translation IDs Contributes to CURA-6742. --- plugins/XmlMaterialProfile/product_to_id.json | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/XmlMaterialProfile/product_to_id.json b/plugins/XmlMaterialProfile/product_to_id.json index 6b78d3fe64..a48eb20a18 100644 --- a/plugins/XmlMaterialProfile/product_to_id.json +++ b/plugins/XmlMaterialProfile/product_to_id.json @@ -6,6 +6,7 @@ "Ultimaker 2+": "ultimaker2_plus", "Ultimaker 3": "ultimaker3", "Ultimaker 3 Extended": "ultimaker3_extended", + "Ultimaker S3": "ultimaker_s3", "Ultimaker S5": "ultimaker_s5", "Ultimaker Original": "ultimaker_original", "Ultimaker Original+": "ultimaker_original_plus", From cadbde7b92b722a2da87f6240efa0118f9126fb1 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 4 Sep 2019 14:32:53 +0200 Subject: [PATCH 089/158] Add workaround for GLTF loading CURA-6739 --- plugins/TrimeshReader/TrimeshReader.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/plugins/TrimeshReader/TrimeshReader.py b/plugins/TrimeshReader/TrimeshReader.py index 41992ddbd1..bd34df6114 100644 --- a/plugins/TrimeshReader/TrimeshReader.py +++ b/plugins/TrimeshReader/TrimeshReader.py @@ -84,7 +84,17 @@ class TrimeshReader(MeshReader): # types that Trimesh can read. It will not be checked again. # \return A scene node that contains the file's contents. def _read(self, file_name: str) -> Union["SceneNode", List["SceneNode"]]: - mesh_or_scene = trimesh.load(file_name) + # CURA-6739 + # GLTF files are essentially JSON files. If you directly give a file name to trimesh.load(), it will + # try to figure out the format, but for GLTF, it loads it as a binary file with flags "rb", and the json.load() + # doesn't like it. For some reason, this seems to happen with 3.5.7, but not 3.7.1. Below is a workaround to + # pass a file object that has been opened with "r" instead "rb" to load a GLTF file. + if file_name.endswith(".gltf"): + mesh_or_scene = trimesh.load(open(file_name, "r", encoding="utf-8"), + file_type = file_name.split(".")[-1].lower()) + else: + mesh_or_scene = trimesh.load(file_name) + meshes = [] # type: List[Union[trimesh.Trimesh, trimesh.Scene, Any]] if isinstance(mesh_or_scene, trimesh.Trimesh): meshes = [mesh_or_scene] From 16ea437255f059d7de2e9d76a4aba4e0d2cb74ab Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Wed, 4 Sep 2019 14:52:54 +0200 Subject: [PATCH 090/158] Make 3MF-reader aware of setting-version for introduction Intent. --- cura/Settings/CuraContainerStack.py | 21 ++++++++++++++++++- plugins/3MFReader/ThreeMFWorkspaceReader.py | 23 ++++++++++++--------- 2 files changed, 33 insertions(+), 11 deletions(-) diff --git a/cura/Settings/CuraContainerStack.py b/cura/Settings/CuraContainerStack.py index c141ac9b0e..c1c2544c6e 100755 --- a/cura/Settings/CuraContainerStack.py +++ b/cura/Settings/CuraContainerStack.py @@ -1,7 +1,7 @@ # Copyright (c) 2018 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. -from typing import Any, cast, List, Optional +from typing import Any, cast, Dict, List, Optional from PyQt5.QtCore import pyqtProperty, pyqtSignal, QObject from UM.Application import Application @@ -364,3 +364,22 @@ class _ContainerIndexes: # Reverse lookup: type -> index TypeIndexMap = dict([(v, k) for k, v in IndexTypeMap.items()]) + + # Mapping to old values before Intent introduction. Used for reading older versions of input files. + IndexToOldIndexMap = { + UserChanges: 0, + QualityChanges: 1, + Intent: -1, # Wasn't there in the old 'format'! + Quality: 2, + Material: 3, + Variant: 4, + DefinitionChanges: 5, + Definition: 6, + } + + # Reverse lookup: old index -> new index + OldIndexToIndexMap = dict([(v, k) for k, v in IndexToOldIndexMap.items()]) + + @classmethod + def getIndexMapping(cls, setting_version: int) -> Dict[int, int]: + return dict([(x, x) for x in list(range(99))]) if setting_version >= 10 else cls.IndexToOldIndexMap diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index d7cc2f0b70..7d01421d81 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -368,7 +368,8 @@ class ThreeMFWorkspaceReader(WorkspaceReader): # Get quality type parser = ConfigParser(interpolation = None) parser.read_string(serialized) - quality_container_id = parser["containers"][str(_ContainerIndexes.Quality)] + index_map_version = _ContainerIndexes.getIndexMapping(int(parser["metadata"]["setting_version"])) + quality_container_id = parser["containers"][str(index_map_version[_ContainerIndexes.Quality])] quality_type = "empty_quality" if quality_container_id not in ("empty", "empty_quality"): quality_type = instance_container_info_dict[quality_container_id].parser["metadata"]["quality_type"] @@ -378,10 +379,11 @@ class ThreeMFWorkspaceReader(WorkspaceReader): serialized = GlobalStack._updateSerialized(serialized, global_stack_file) parser = ConfigParser(interpolation = None) parser.read_string(serialized) - definition_changes_id = parser["containers"][str(_ContainerIndexes.DefinitionChanges)] + index_map_version = _ContainerIndexes.getIndexMapping(int(parser["metadata"]["setting_version"])) + definition_changes_id = parser["containers"][str(index_map_version[_ContainerIndexes.DefinitionChanges])] if definition_changes_id not in ("empty", "empty_definition_changes"): self._machine_info.definition_changes_info = instance_container_info_dict[definition_changes_id] - user_changes_id = parser["containers"][str(_ContainerIndexes.UserChanges)] + user_changes_id = parser["containers"][str(index_map_version[_ContainerIndexes.UserChanges])] if user_changes_id not in ("empty", "empty_user_changes"): self._machine_info.user_changes_info = instance_container_info_dict[user_changes_id] @@ -391,8 +393,8 @@ class ThreeMFWorkspaceReader(WorkspaceReader): extruder_info = ExtruderInfo() extruder_info.position = position - variant_id = parser["containers"][str(_ContainerIndexes.Variant)] - material_id = parser["containers"][str(_ContainerIndexes.Material)] + variant_id = parser["containers"][str(index_map_version[_ContainerIndexes.Variant])] + material_id = parser["containers"][str(index_map_version[_ContainerIndexes.Material])] if variant_id not in ("empty", "empty_variant"): extruder_info.variant_info = instance_container_info_dict[variant_id] if material_id not in ("empty", "empty_material"): @@ -400,7 +402,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): extruder_info.root_material_id = root_material_id self._machine_info.extruder_info_dict[position] = extruder_info else: - variant_id = parser["containers"][str(_ContainerIndexes.Variant)] + variant_id = parser["containers"][str(index_map_version[_ContainerIndexes.Variant])] if variant_id not in ("empty", "empty_variant"): self._machine_info.variant_info = instance_container_info_dict[variant_id] @@ -412,13 +414,14 @@ class ThreeMFWorkspaceReader(WorkspaceReader): serialized = ExtruderStack._updateSerialized(serialized, extruder_stack_file) parser = ConfigParser(interpolation = None) parser.read_string(serialized) + index_map_version = _ContainerIndexes.getIndexMapping(int(parser["metadata"]["setting_version"])) # The check should be done for the extruder stack that's associated with the existing global stack, # and those extruder stacks may have different IDs. # So we check according to the positions position = parser["metadata"]["position"] - variant_id = parser["containers"][str(_ContainerIndexes.Variant)] - material_id = parser["containers"][str(_ContainerIndexes.Material)] + variant_id = parser["containers"][str(index_map_version[_ContainerIndexes.Variant])] + material_id = parser["containers"][str(index_map_version[_ContainerIndexes.Material])] extruder_info = ExtruderInfo() extruder_info.position = position @@ -432,11 +435,11 @@ class ThreeMFWorkspaceReader(WorkspaceReader): root_material_id = reverse_material_id_dict[material_id] extruder_info.root_material_id = root_material_id - definition_changes_id = parser["containers"][str(_ContainerIndexes.DefinitionChanges)] + definition_changes_id = parser["containers"][str(index_map_version[_ContainerIndexes.DefinitionChanges])] if definition_changes_id not in ("empty", "empty_definition_changes"): extruder_info.definition_changes_info = instance_container_info_dict[definition_changes_id] - user_changes_id = parser["containers"][str(_ContainerIndexes.UserChanges)] + user_changes_id = parser["containers"][str(index_map_version[_ContainerIndexes.UserChanges])] if user_changes_id not in ("empty", "empty_user_changes"): extruder_info.user_changes_info = instance_container_info_dict[user_changes_id] self._machine_info.extruder_info_dict[position] = extruder_info From b67944cac11f0cf12113786455cf0ad78be01e25 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 4 Sep 2019 15:25:52 +0200 Subject: [PATCH 091/158] Fix workaround for GLTF loading CURA-6739 --- plugins/TrimeshReader/TrimeshReader.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/plugins/TrimeshReader/TrimeshReader.py b/plugins/TrimeshReader/TrimeshReader.py index bd34df6114..7d1f182720 100644 --- a/plugins/TrimeshReader/TrimeshReader.py +++ b/plugins/TrimeshReader/TrimeshReader.py @@ -90,8 +90,7 @@ class TrimeshReader(MeshReader): # doesn't like it. For some reason, this seems to happen with 3.5.7, but not 3.7.1. Below is a workaround to # pass a file object that has been opened with "r" instead "rb" to load a GLTF file. if file_name.endswith(".gltf"): - mesh_or_scene = trimesh.load(open(file_name, "r", encoding="utf-8"), - file_type = file_name.split(".")[-1].lower()) + mesh_or_scene = trimesh.load(open(file_name, "r", encoding = "utf-8"), file_type = "gltf") else: mesh_or_scene = trimesh.load(file_name) From 7e97bc4e17aecadd97b634afc3402f426c80ae8e Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 4 Sep 2019 16:23:34 +0200 Subject: [PATCH 092/158] Add workaround for GLTF loading on OSX CURA-6739 --- cura_app.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/cura_app.py b/cura_app.py index b2cd317243..63f107a112 100755 --- a/cura_app.py +++ b/cura_app.py @@ -141,5 +141,19 @@ import Arcus #@UnusedImport import Savitar #@UnusedImport from cura.CuraApplication import CuraApplication + +# WORKAROUND: CURA-6739 +# The CTM file loading module in Trimesh requires the OpenCTM library to be dynamically loaded. It uses +# ctypes.util.find_library() to find libopenctm.dylib, but this doesn't seem to look in the ".app" application folder +# on Mac OS X. Adding the search path to environment variables such as DYLD_LIBRARY_PATH and DYLD_FALLBACK_LIBRARY_PATH +# makes it work. The workaround here uses DYLD_FALLBACK_LIBRARY_PATH. +if Platform.isOSX() and getattr(sys, "frozen", False): + old_env = os.environ["DYLD_FALLBACK_LIBRARY_PATH"] + search_path = os.path.join(CuraApplication.getInstallPrefix(), "MacOS") + path_list = old_env.split(":") + if search_path not in path_list: + path_list.append(search_path) + os.environ["DYLD_FALLBACK_LIBRARY_PATH"] = ":".join(path_list) + app = CuraApplication() app.run() From 2dbfbecd12c179b964d70a9f5f6fe81a07a3e55a Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 4 Sep 2019 16:37:10 +0200 Subject: [PATCH 093/158] Ensure that show/hide behavior of the qualities intent menu is correct It would previously blink if you pressed the button, as a click outside would hide it due to close policy, but a mouse release would show it again (as it's hidden and that's what the on clicked of the button did) CURA-6598 --- .../qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml b/resources/qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml index 18088d50b9..e6bc798307 100644 --- a/resources/qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml +++ b/resources/qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml @@ -18,7 +18,7 @@ Popup property color borderColor: UM.Theme.getColor("lining") padding: 0 - + closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutsideParent background: Cura.RoundedRectangle { color: backgroundColor From f2ef363c015958c474e20760c224ddafc9d3c35d Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 4 Sep 2019 16:39:06 +0200 Subject: [PATCH 094/158] Fix GLTF workaround for OSX CURA-6739 --- cura_app.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura_app.py b/cura_app.py index 63f107a112..42581f134e 100755 --- a/cura_app.py +++ b/cura_app.py @@ -148,7 +148,7 @@ from cura.CuraApplication import CuraApplication # on Mac OS X. Adding the search path to environment variables such as DYLD_LIBRARY_PATH and DYLD_FALLBACK_LIBRARY_PATH # makes it work. The workaround here uses DYLD_FALLBACK_LIBRARY_PATH. if Platform.isOSX() and getattr(sys, "frozen", False): - old_env = os.environ["DYLD_FALLBACK_LIBRARY_PATH"] + old_env = os.environ.get("DYLD_FALLBACK_LIBRARY_PATH", "") search_path = os.path.join(CuraApplication.getInstallPrefix(), "MacOS") path_list = old_env.split(":") if search_path not in path_list: From 53aaaab891acab130e4c74fbd765c2a61e5ba544 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 4 Sep 2019 16:43:59 +0200 Subject: [PATCH 095/158] Add a topMargin for the qualities menu CURA-6598 --- .../Custom/QualitiesWithIntentMenu.qml | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/resources/qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml b/resources/qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml index e6bc798307..ccc3d3d71a 100644 --- a/resources/qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml +++ b/resources/qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml @@ -36,11 +36,17 @@ Popup contentItem: Column { - anchors.left: parent.left - anchors.leftMargin: UM.Theme.getSize("default_lining").width - anchors.rightMargin: UM.Theme.getSize("default_lining").width - anchors.right: parent.right - anchors.top: parent.top + anchors + { + left: parent.left + leftMargin: UM.Theme.getSize("default_lining").width + + right: parent.right + rightMargin: UM.Theme.getSize("default_lining").width + + top: parent.top + topMargin: UM.Theme.getSize("narrow_margin").height + } // This repeater adds the intent labels Repeater From 7f3b55a28670ef2f1770caf56165c1408d6709be Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 4 Sep 2019 16:48:06 +0200 Subject: [PATCH 096/158] Remove unknown reference CURA-6598 --- resources/qml/LabelBar.qml | 1 - 1 file changed, 1 deletion(-) diff --git a/resources/qml/LabelBar.qml b/resources/qml/LabelBar.qml index 571c9f0bfb..a6b54225f5 100644 --- a/resources/qml/LabelBar.qml +++ b/resources/qml/LabelBar.qml @@ -22,7 +22,6 @@ Item { anchors.left: parent.left anchors.right: parent.right - height: label.height spacing: 0 Repeater { From 994e0e53ccf99c34da0e307e912d6f3ff6c32f57 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 4 Sep 2019 16:54:35 +0200 Subject: [PATCH 097/158] Switch the anchors to paddings Otherwise the bottomb button would extend from the popup. CURA-6598 --- .../Custom/QualitiesWithIntentMenu.qml | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/resources/qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml b/resources/qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml index ccc3d3d71a..888a6ab309 100644 --- a/resources/qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml +++ b/resources/qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml @@ -17,6 +17,9 @@ Popup property color backgroundColor: UM.Theme.getColor("main_background") property color borderColor: UM.Theme.getColor("lining") + topPadding: UM.Theme.getSize("narrow_margin").height + rightPadding: UM.Theme.getSize("default_lining").width + leftPadding: UM.Theme.getSize("default_lining").width padding: 0 closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutsideParent background: Cura.RoundedRectangle @@ -36,18 +39,6 @@ Popup contentItem: Column { - anchors - { - left: parent.left - leftMargin: UM.Theme.getSize("default_lining").width - - right: parent.right - rightMargin: UM.Theme.getSize("default_lining").width - - top: parent.top - topMargin: UM.Theme.getSize("narrow_margin").height - } - // This repeater adds the intent labels Repeater { From 423b4ad8693fbe848a871f8999f65813b0c7d11b Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 4 Sep 2019 17:16:07 +0200 Subject: [PATCH 098/158] Fix binding loop CURA-6598 --- resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml | 2 ++ .../qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml | 1 + 2 files changed, 3 insertions(+) diff --git a/resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml b/resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml index d38dfc14f8..682aefa821 100644 --- a/resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml +++ b/resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml @@ -61,6 +61,8 @@ Item height: textLabel.contentHeight + 2 * UM.Theme.getSize("narrow_margin").height hoverEnabled: true + baselineOffset: null // If we don't do this, there is a binding loop. WHich is a bit weird, since we override the contentItem anyway... + contentItem: Label { id: textLabel diff --git a/resources/qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml b/resources/qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml index 888a6ab309..96c8431112 100644 --- a/resources/qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml +++ b/resources/qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml @@ -20,6 +20,7 @@ Popup topPadding: UM.Theme.getSize("narrow_margin").height rightPadding: UM.Theme.getSize("default_lining").width leftPadding: UM.Theme.getSize("default_lining").width + padding: 0 closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutsideParent background: Cura.RoundedRectangle From bb11c695e24b3df92e388ecaf28dba9fb9e90c88 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 4 Sep 2019 17:40:01 +0200 Subject: [PATCH 099/158] Update S3 definition CURA-6742 --- resources/definitions/ultimaker_s3.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/ultimaker_s3.def.json b/resources/definitions/ultimaker_s3.def.json index 0fbf4acd77..c380fcbc50 100644 --- a/resources/definitions/ultimaker_s3.def.json +++ b/resources/definitions/ultimaker_s3.def.json @@ -32,7 +32,7 @@ "weight": -1, "firmware_update_info": { "id": 213482, - "check_urls": ["https://software.ultimaker.com/releases/firmware/213482/stable/um-update.swu.version"], + "check_urls": ["https://software.ultimaker.com/releases/firmware/213482/stable/version.txt"], "update_url": "https://ultimaker.com/firmware" } }, From 4364d94423b94a682c7e2299be19d57aa566ddbc Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Wed, 4 Sep 2019 18:54:53 +0200 Subject: [PATCH 100/158] Reduce logging and network activity during print job upload --- .../UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py | 3 --- plugins/UM3NetworkPrinting/src/Network/SendMaterialJob.py | 2 -- 2 files changed, 5 deletions(-) diff --git a/plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py b/plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py index a5a885a4ed..fd9a9e2f60 100644 --- a/plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py +++ b/plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py @@ -122,9 +122,6 @@ class LocalClusterOutputDevice(UltimakerNetworkedPrinterOutputDevice): self.writeStarted.emit(self) - # Make sure the printer is aware of all new materials as the new print job might contain one. - self.sendMaterialProfiles() - # Export the scene to the correct file type. job = ExportFileJob(file_handler=file_handler, nodes=nodes, firmware_version=self.firmwareVersion) job.finished.connect(self._onPrintJobCreated) diff --git a/plugins/UM3NetworkPrinting/src/Network/SendMaterialJob.py b/plugins/UM3NetworkPrinting/src/Network/SendMaterialJob.py index 83b88341fb..2ad21d2f29 100644 --- a/plugins/UM3NetworkPrinting/src/Network/SendMaterialJob.py +++ b/plugins/UM3NetworkPrinting/src/Network/SendMaterialJob.py @@ -104,7 +104,6 @@ class SendMaterialJob(Job): parts.append(self.device.createFormPart("name=\"signature_file\"; filename=\"{file_name}\"" .format(file_name = signature_file_name), f.read())) - Logger.log("d", "Syncing material %s with cluster.", material_id) # FIXME: move form posting to API client self.device.postFormWithParts(target = "/cluster-api/v1/materials/", parts = parts, on_finished = self._sendingFinished) @@ -117,7 +116,6 @@ class SendMaterialJob(Job): body = reply.readAll().data().decode('utf8') if "not added" in body: # For some reason the cluster returns a 200 sometimes even when syncing failed. - Logger.log("w", "Error while syncing material: %s", body) return # Inform the user that materials have been synced. This message only shows itself when not already visible. # Because of the guards above it is not shown when syncing failed (which is not always an actual problem). From 06d54f397096771ce3655c62a46f9413a6430369 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Wed, 4 Sep 2019 19:19:49 +0200 Subject: [PATCH 101/158] Remove network manager re-creation that was causing issues --- cura/PrinterOutput/NetworkedPrinterOutputDevice.py | 9 --------- 1 file changed, 9 deletions(-) diff --git a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py index e23341ba8a..392df7bded 100644 --- a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py +++ b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py @@ -35,8 +35,6 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): def __init__(self, device_id, address: str, properties: Dict[bytes, bytes], connection_type: ConnectionType = ConnectionType.NetworkConnection, parent: QObject = None) -> None: super().__init__(device_id = device_id, connection_type = connection_type, parent = parent) self._manager = None # type: Optional[QNetworkAccessManager] - self._last_manager_create_time = None # type: Optional[float] - self._recreate_network_manager_time = 30 self._timeout_time = 10 # After how many seconds of no response should a timeout occur? self._last_response_time = None # type: Optional[float] @@ -133,12 +131,6 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): self.setConnectionState(ConnectionState.Closed) - # We need to check if the manager needs to be re-created. If we don't, we get some issues when OSX goes to - # sleep. - if time_since_last_response > self._recreate_network_manager_time: - if self._last_manager_create_time is None or time() - self._last_manager_create_time > self._recreate_network_manager_time: - self._createNetworkManager() - assert(self._manager is not None) elif self._connection_state == ConnectionState.Closed: # Go out of timeout. if self._connection_state_before_timeout is not None: # sanity check, but it should never be None here @@ -317,7 +309,6 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): self._manager = QNetworkAccessManager() self._manager.finished.connect(self._handleOnFinished) - self._last_manager_create_time = time() self._manager.authenticationRequired.connect(self._onAuthenticationRequired) if self._properties.get(b"temporary", b"false") != b"true": From b309680fb7602a9d773d8a03166259c2364ad656 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 4 Sep 2019 18:25:29 +0200 Subject: [PATCH 102/158] Fix CTM loading on Linux CURA-6739 Note that this doesn't work with Python 3.5.7, but with 3.6 and 3.7. To make Python 3.5.7 work, a fix needs to be backported from 3.6 for ctypes.util.find_library() for Linux. --- cura_app.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/cura_app.py b/cura_app.py index 42581f134e..44bef048f2 100755 --- a/cura_app.py +++ b/cura_app.py @@ -155,5 +155,20 @@ if Platform.isOSX() and getattr(sys, "frozen", False): path_list.append(search_path) os.environ["DYLD_FALLBACK_LIBRARY_PATH"] = ":".join(path_list) +# WORKAROUND: CURA-6739 +# Similar CTM file loading fix for Linux, but NOTE THAT this doesn't work directly with Python 3.5.7. There's a fix +# for ctypes.util.find_library() in Python 3.6 and 3.7. That fix makes sure that find_library() will check +# LD_LIBRARY_PATH. With Python 3.5, that fix needs to be backported to make this workaround work. +if Platform.isLinux() and getattr(sys, "frozen", False): + old_env = os.environ.get("LD_LIBRARY_PATH", "") + # This is where libopenctm.so is in the AppImage. + search_path = os.path.join(CuraApplication.getInstallPrefix(), "bin") + path_list = old_env.split(":") + if search_path not in path_list: + path_list.append(search_path) + os.environ["LD_LIBRARY_PATH"] = ":".join(path_list) + import trimesh.exchange.load + os.environ["LD_LIBRARY_PATH"] = old_env + app = CuraApplication() app.run() From 1e1ae95c60813804c298fb31f2af2864b4490b12 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 4 Sep 2019 19:21:47 +0200 Subject: [PATCH 103/158] Only use DYLD_FALLBACK_LIBRARY_PATH once for trimesh.load CURA-6739 --- cura_app.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cura_app.py b/cura_app.py index 44bef048f2..080479ee92 100755 --- a/cura_app.py +++ b/cura_app.py @@ -149,11 +149,14 @@ from cura.CuraApplication import CuraApplication # makes it work. The workaround here uses DYLD_FALLBACK_LIBRARY_PATH. if Platform.isOSX() and getattr(sys, "frozen", False): old_env = os.environ.get("DYLD_FALLBACK_LIBRARY_PATH", "") + # This is where libopenctm.so is in the .app folder. search_path = os.path.join(CuraApplication.getInstallPrefix(), "MacOS") path_list = old_env.split(":") if search_path not in path_list: path_list.append(search_path) os.environ["DYLD_FALLBACK_LIBRARY_PATH"] = ":".join(path_list) + import trimesh.exchange.load + os.environ["DYLD_FALLBACK_LIBRARY_PATH"] = old_env # WORKAROUND: CURA-6739 # Similar CTM file loading fix for Linux, but NOTE THAT this doesn't work directly with Python 3.5.7. There's a fix From 13011e375b7dd120f5cfe5df75bb4dc58819df14 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 5 Sep 2019 09:00:53 +0200 Subject: [PATCH 104/158] Fix quality layer label alignment CURA-6598 --- resources/qml/LabelBar.qml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/resources/qml/LabelBar.qml b/resources/qml/LabelBar.qml index a6b54225f5..9a870811ca 100644 --- a/resources/qml/LabelBar.qml +++ b/resources/qml/LabelBar.qml @@ -53,6 +53,10 @@ Item right: index + 1 === repeater.count ? parent.right: undefined left: index + 1 === repeater.count || index === 0 ? undefined: parent.left leftMargin: Math.round((itemSize - contentWidth) * 0.5) + + // For some reason, the last label in the row gets misaligned with Qt 5.10. This lines seems to + // fix it. + verticalCenter: parent.verticalCenter } } } From c7c859f02cb6ba38c36433ac3f17f5fabbbc56bd Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 5 Sep 2019 09:14:36 +0200 Subject: [PATCH 105/158] Revert "Update S3 definition" CURA-6742 This reverts commit bb11c695e24b3df92e388ecaf28dba9fb9e90c88. --- resources/definitions/ultimaker_s3.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/ultimaker_s3.def.json b/resources/definitions/ultimaker_s3.def.json index c380fcbc50..0fbf4acd77 100644 --- a/resources/definitions/ultimaker_s3.def.json +++ b/resources/definitions/ultimaker_s3.def.json @@ -32,7 +32,7 @@ "weight": -1, "firmware_update_info": { "id": 213482, - "check_urls": ["https://software.ultimaker.com/releases/firmware/213482/stable/version.txt"], + "check_urls": ["https://software.ultimaker.com/releases/firmware/213482/stable/um-update.swu.version"], "update_url": "https://ultimaker.com/firmware" } }, From 210843a7bbf3726d8845ae88074147601413a993 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Thu, 5 Sep 2019 10:47:15 +0200 Subject: [PATCH 106/158] Improve adding/connecting to output devices --- .../src/Cloud/CloudOutputDeviceManager.py | 10 +++++++--- .../src/Network/LocalClusterOutputDeviceManager.py | 10 +++++++--- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py index 168d209db8..1da099dadc 100644 --- a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py +++ b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py @@ -171,7 +171,11 @@ class CloudOutputDeviceManager: machine.setName(device.name) machine.setMetaDataEntry(self.META_CLUSTER_ID, device.key) machine.setMetaDataEntry("group_name", device.name) - - device.connect() machine.addConfiguredConnectionType(device.connectionType.value) - CuraApplication.getInstance().getOutputDeviceManager().addOutputDevice(device) + + if not device.isConnected(): + device.connect() + + output_device_manager = CuraApplication.getInstance().getOutputDeviceManager() + if device.key not in output_device_manager.getOutputDeviceIds(): + output_device_manager.addOutputDevice(device) diff --git a/plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDeviceManager.py b/plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDeviceManager.py index e5ae7b83ac..e55eb12fed 100644 --- a/plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDeviceManager.py +++ b/plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDeviceManager.py @@ -236,7 +236,11 @@ class LocalClusterOutputDeviceManager: machine.setName(device.name) machine.setMetaDataEntry(self.META_NETWORK_KEY, device.key) machine.setMetaDataEntry("group_name", device.name) - - device.connect() machine.addConfiguredConnectionType(device.connectionType.value) - CuraApplication.getInstance().getOutputDeviceManager().addOutputDevice(device) + + if not device.isConnected(): + device.connect() + + output_device_manager = CuraApplication.getInstance().getOutputDeviceManager() + if device.key not in output_device_manager.getOutputDeviceIds(): + output_device_manager.addOutputDevice(device) From a04bcbb3e9d7a193a30684cc07a55ad8141f9a0b Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Thu, 5 Sep 2019 11:05:26 +0200 Subject: [PATCH 107/158] Revert "Remove network manager re-creation that was causing issues" This reverts commit 06d54f397096771ce3655c62a46f9413a6430369. --- cura/PrinterOutput/NetworkedPrinterOutputDevice.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py index 392df7bded..e23341ba8a 100644 --- a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py +++ b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py @@ -35,6 +35,8 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): def __init__(self, device_id, address: str, properties: Dict[bytes, bytes], connection_type: ConnectionType = ConnectionType.NetworkConnection, parent: QObject = None) -> None: super().__init__(device_id = device_id, connection_type = connection_type, parent = parent) self._manager = None # type: Optional[QNetworkAccessManager] + self._last_manager_create_time = None # type: Optional[float] + self._recreate_network_manager_time = 30 self._timeout_time = 10 # After how many seconds of no response should a timeout occur? self._last_response_time = None # type: Optional[float] @@ -131,6 +133,12 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): self.setConnectionState(ConnectionState.Closed) + # We need to check if the manager needs to be re-created. If we don't, we get some issues when OSX goes to + # sleep. + if time_since_last_response > self._recreate_network_manager_time: + if self._last_manager_create_time is None or time() - self._last_manager_create_time > self._recreate_network_manager_time: + self._createNetworkManager() + assert(self._manager is not None) elif self._connection_state == ConnectionState.Closed: # Go out of timeout. if self._connection_state_before_timeout is not None: # sanity check, but it should never be None here @@ -309,6 +317,7 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): self._manager = QNetworkAccessManager() self._manager.finished.connect(self._handleOnFinished) + self._last_manager_create_time = time() self._manager.authenticationRequired.connect(self._onAuthenticationRequired) if self._properties.get(b"temporary", b"false") != b"true": From da4fcc8ee6b25a6ecd39d4662f913177cb754883 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Thu, 5 Sep 2019 14:08:18 +0200 Subject: [PATCH 108/158] Revert "Revert "Remove network manager re-creation that was causing issues"" This reverts commit a04bcbb3e9d7a193a30684cc07a55ad8141f9a0b. --- cura/PrinterOutput/NetworkedPrinterOutputDevice.py | 9 --------- 1 file changed, 9 deletions(-) diff --git a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py index e23341ba8a..392df7bded 100644 --- a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py +++ b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py @@ -35,8 +35,6 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): def __init__(self, device_id, address: str, properties: Dict[bytes, bytes], connection_type: ConnectionType = ConnectionType.NetworkConnection, parent: QObject = None) -> None: super().__init__(device_id = device_id, connection_type = connection_type, parent = parent) self._manager = None # type: Optional[QNetworkAccessManager] - self._last_manager_create_time = None # type: Optional[float] - self._recreate_network_manager_time = 30 self._timeout_time = 10 # After how many seconds of no response should a timeout occur? self._last_response_time = None # type: Optional[float] @@ -133,12 +131,6 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): self.setConnectionState(ConnectionState.Closed) - # We need to check if the manager needs to be re-created. If we don't, we get some issues when OSX goes to - # sleep. - if time_since_last_response > self._recreate_network_manager_time: - if self._last_manager_create_time is None or time() - self._last_manager_create_time > self._recreate_network_manager_time: - self._createNetworkManager() - assert(self._manager is not None) elif self._connection_state == ConnectionState.Closed: # Go out of timeout. if self._connection_state_before_timeout is not None: # sanity check, but it should never be None here @@ -317,7 +309,6 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): self._manager = QNetworkAccessManager() self._manager.finished.connect(self._handleOnFinished) - self._last_manager_create_time = time() self._manager.authenticationRequired.connect(self._onAuthenticationRequired) if self._properties.get(b"temporary", b"false") != b"true": From 564472107305cd16896f4f6882fda05ee4d7d588 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 5 Sep 2019 14:17:49 +0200 Subject: [PATCH 109/158] Fix UFPReader due to gcode reader readFromStream() change --- plugins/UFPReader/UFPReader.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/UFPReader/UFPReader.py b/plugins/UFPReader/UFPReader.py index 18527e6450..71061f938b 100644 --- a/plugins/UFPReader/UFPReader.py +++ b/plugins/UFPReader/UFPReader.py @@ -39,4 +39,4 @@ class UFPReader(MeshReader): # Open the GCodeReader to parse the data gcode_reader = PluginRegistry.getInstance().getPluginObject("GCodeReader") # type: ignore gcode_reader.preReadFromStream(gcode_stream) # type: ignore - return gcode_reader.readFromStream(gcode_stream) # type: ignore + return gcode_reader.readFromStream(gcode_stream, file_name) # type: ignore From 46a15762aa6602dcc812c09ef60a56a65596da08 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 5 Sep 2019 14:19:48 +0200 Subject: [PATCH 110/158] Add doc for the need of filename in processGCodeStream() --- plugins/GCodeReader/FlavorParser.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/plugins/GCodeReader/FlavorParser.py b/plugins/GCodeReader/FlavorParser.py index 89812e7202..d05338ae4d 100644 --- a/plugins/GCodeReader/FlavorParser.py +++ b/plugins/GCodeReader/FlavorParser.py @@ -294,6 +294,11 @@ class FlavorParser: extruder.getProperty("machine_nozzle_offset_y", "value")] return result + # + # CURA-6643 + # This function needs the filename so it can be set to the SceneNode. Otherwise, if you load a GCode file and press + # F5, that gcode SceneNode will be removed because it doesn't have a file to be reloaded from. + # def processGCodeStream(self, stream: str, filename: str) -> Optional["CuraSceneNode"]: Logger.log("d", "Preparing to load GCode") self._cancelled = False From 9a6f76c069d894dae00b8b06d61c165fb5a4832b Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 5 Sep 2019 16:32:34 +0200 Subject: [PATCH 111/158] Add typing for get---ManagementModel Just to have my IDE find usages properly, really. Contributes to issue CURA-6600. --- cura/CuraApplication.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index f42f8b2798..157f673594 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -979,13 +979,13 @@ class CuraApplication(QtApplication): return self._machine_action_manager @pyqtSlot(result = QObject) - def getMaterialManagementModel(self): + def getMaterialManagementModel(self) -> MaterialManagementModel: if not self._material_management_model: self._material_management_model = MaterialManagementModel(parent = self) return self._material_management_model @pyqtSlot(result = QObject) - def getQualityManagementModel(self): + def getQualityManagementModel(self) -> QualityManagementModel: if not self._quality_management_model: self._quality_management_model = QualityManagementModel(parent = self) return self._quality_management_model From 71b94f6d5b058bbe6746c7f7150953f1d1a849bf Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 5 Sep 2019 17:26:48 +0200 Subject: [PATCH 112/158] Create own quality changes profiles instead of asking quality manager It was a protected function call on a different class anyway, so that should never have gotten accepted. Contributes to issue CURA-6600. --- cura/Settings/ContainerManager.py | 18 +++++++++++++----- plugins/GCodeWriter/GCodeWriter.py | 17 +++++++++++++---- 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/cura/Settings/ContainerManager.py b/cura/Settings/ContainerManager.py index d1c25530e3..d0b856a872 100644 --- a/cura/Settings/ContainerManager.py +++ b/cura/Settings/ContainerManager.py @@ -20,7 +20,9 @@ from UM.Settings.ContainerRegistry import ContainerRegistry from UM.Settings.ContainerStack import ContainerStack from UM.Settings.DefinitionContainer import DefinitionContainer from UM.Settings.InstanceContainer import InstanceContainer + import cura.CuraApplication +from cura.Machines.ContainerTree import ContainerTree from cura.Machines.MaterialManager import MaterialManager if TYPE_CHECKING: @@ -271,24 +273,30 @@ class ContainerManager(QObject): # \return \type{bool} True if successful, False if not. @pyqtSlot(result = bool) def updateQualityChanges(self) -> bool: - global_stack = cura.CuraApplication.CuraApplication.getInstance().getMachineManager().activeMachine + application = cura.CuraApplication.CuraApplication.getInstance() + global_stack = application.getMachineManager().activeMachine if not global_stack: return False - cura.CuraApplication.CuraApplication.getInstance().getMachineManager().blurSettings.emit() + application.getMachineManager().blurSettings.emit() current_quality_changes_name = global_stack.qualityChanges.getName() current_quality_type = global_stack.quality.getMetaDataEntry("quality_type") extruder_stacks = list(global_stack.extruders.values()) container_registry = cura.CuraApplication.CuraApplication.getInstance().getContainerRegistry() - quality_manager = QualityManager.getInstance() + machine_definition_id = ContainerTree.getInstance().definitions[global_stack.definition.getId()].quality_definition for stack in [global_stack] + extruder_stacks: # Find the quality_changes container for this stack and merge the contents of the top container into it. quality_changes = stack.qualityChanges if quality_changes.getId() == "empty_quality_changes": - quality_changes = quality_manager._createQualityChanges(current_quality_type, current_quality_changes_name, - global_stack, stack) + quality_changes = InstanceContainer(container_registry.uniqueName((stack.getId() + "_" + current_quality_changes_name).lower().replace(" ", "_"))) + quality_changes.setName(current_quality_changes_name) + quality_changes.setMetaDataEntry("type", "quality_changes") + quality_changes.setMetaDataEntry("quality_type", current_quality_type) + quality_changes.setMetaDataEntry("position", stack.getMetaDataEntry("position")) + quality_changes.setMetaDataEntry("setting_version", application.SettingVersion) + quality_changes.setDefinition(machine_definition_id) container_registry.addContainer(quality_changes) stack.qualityChanges = quality_changes diff --git a/plugins/GCodeWriter/GCodeWriter.py b/plugins/GCodeWriter/GCodeWriter.py index 9f9d6ebb79..edd0cebc96 100644 --- a/plugins/GCodeWriter/GCodeWriter.py +++ b/plugins/GCodeWriter/GCodeWriter.py @@ -116,17 +116,22 @@ class GCodeWriter(MeshWriter): # \return A serialised string of the settings. def _serialiseSettings(self, stack): container_registry = self._application.getContainerRegistry() - quality_manager = self._application.getQualityManager() prefix = self._setting_keyword + str(GCodeWriter.version) + " " # The prefix to put before each line. prefix_length = len(prefix) quality_type = stack.quality.getMetaDataEntry("quality_type") container_with_profile = stack.qualityChanges + machine_definition_id_for_quality = ContainerTree.getInstance().machines[stack.definition.getId()].quality_definition if container_with_profile.getId() == "empty_quality_changes": # If the global quality changes is empty, create a new one quality_name = container_registry.uniqueName(stack.quality.getName()) - container_with_profile = quality_manager._createQualityChanges(quality_type, quality_name, stack, None) + quality_id = container_registry.uniqueName((stack.definition.getId() + "_" + quality_name).lower().replace(" ", "_")) + container_with_profile = InstanceContainer(quality_id) + container_with_profile.setName(quality_name) + container_with_profile.setMetaDataEntry("type", "quality_changes") + container_with_profile.setMetaDataEntry("quality_type", quality_type) + container_with_profile.setDefinition(machine_definition_id_for_quality) flat_global_container = self._createFlattenedContainerInstance(stack.userChanges, container_with_profile) # If the quality changes is not set, we need to set type manually @@ -138,7 +143,6 @@ class GCodeWriter(MeshWriter): flat_global_container.setMetaDataEntry("quality_type", stack.quality.getMetaDataEntry("quality_type", "normal")) # Get the machine definition ID for quality profiles - machine_definition_id_for_quality = ContainerTree.getInstance().machines[stack.definition.getId()].quality_definition flat_global_container.setMetaDataEntry("definition", machine_definition_id_for_quality) serialized = flat_global_container.serialize() @@ -150,7 +154,12 @@ class GCodeWriter(MeshWriter): if extruder_quality.getId() == "empty_quality_changes": # Same story, if quality changes is empty, create a new one quality_name = container_registry.uniqueName(stack.quality.getName()) - extruder_quality = quality_manager._createQualityChanges(quality_type, quality_name, stack, None) + quality_id = container_registry.uniqueName((stack.definition.getId() + "_" + quality_name).lower().replace(" ", "_")) + extruder_quality = InstanceContainer(quality_id) + extruder_quality.setName(quality_name) + extruder_quality.setMetaDataEntry("type", "quality_changes") + extruder_quality.setMetaDataEntry("quality_type", quality_type) + extruder_quality.setDefinition(machine_definition_id_for_quality) flat_extruder_quality = self._createFlattenedContainerInstance(extruder.userChanges, extruder_quality) # If the quality changes is not set, we need to set type manually From ab3f6271774548d1258264e94d5bcb6f771ef7a1 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Thu, 5 Sep 2019 18:01:04 +0200 Subject: [PATCH 113/158] Check if printerConfiguration is actually set before trying to access it --- .../src/Models/Http/ClusterPrinterStatus.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/plugins/UM3NetworkPrinting/src/Models/Http/ClusterPrinterStatus.py b/plugins/UM3NetworkPrinting/src/Models/Http/ClusterPrinterStatus.py index 2d2806050a..90d52a3eae 100644 --- a/plugins/UM3NetworkPrinting/src/Models/Http/ClusterPrinterStatus.py +++ b/plugins/UM3NetworkPrinting/src/Models/Http/ClusterPrinterStatus.py @@ -80,6 +80,11 @@ class ClusterPrinterStatus(BaseModel): model.updateBuildplate(self.build_plate.type if self.build_plate else "glass") model.setCameraUrl(QUrl("http://{}:8080/?action=stream".format(self.ip_address))) + if not model.printerConfiguration: + # Prevent accessing printer configuration when not available. + # This sometimes happens when a printer was just added to a group and Cura is connected to that group. + return + # Set the possible configurations based on whether a Material Station is present or not. if self.material_station and self.material_station.material_slots: self._updateAvailableConfigurations(model) From 549b724a4f6f490b05fb85b94bbe31d9eb7a4c36 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Fri, 6 Sep 2019 09:37:43 +0200 Subject: [PATCH 114/158] Use 2 extruders at all times for now --- .../UM3NetworkPrinting/src/Models/Http/ClusterPrinterStatus.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/UM3NetworkPrinting/src/Models/Http/ClusterPrinterStatus.py b/plugins/UM3NetworkPrinting/src/Models/Http/ClusterPrinterStatus.py index 90d52a3eae..df2365011a 100644 --- a/plugins/UM3NetworkPrinting/src/Models/Http/ClusterPrinterStatus.py +++ b/plugins/UM3NetworkPrinting/src/Models/Http/ClusterPrinterStatus.py @@ -66,7 +66,7 @@ class ClusterPrinterStatus(BaseModel): ## Creates a new output model. # \param controller - The controller of the model. def createOutputModel(self, controller: PrinterOutputController) -> PrinterOutputModel: - model = PrinterOutputModel(controller, len(self.configuration), firmware_version = self.firmware_version) + model = PrinterOutputModel(controller, 2, firmware_version = self.firmware_version) self.updateOutputModel(model) return model From 5f480f753caa081ac0604585b7e70a4132ca9175 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Fri, 6 Sep 2019 09:50:15 +0200 Subject: [PATCH 115/158] Add fixme note to hardcoded extruder count --- .../src/Models/Http/ClusterPrinterStatus.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/plugins/UM3NetworkPrinting/src/Models/Http/ClusterPrinterStatus.py b/plugins/UM3NetworkPrinting/src/Models/Http/ClusterPrinterStatus.py index df2365011a..69daa1f08b 100644 --- a/plugins/UM3NetworkPrinting/src/Models/Http/ClusterPrinterStatus.py +++ b/plugins/UM3NetworkPrinting/src/Models/Http/ClusterPrinterStatus.py @@ -66,6 +66,10 @@ class ClusterPrinterStatus(BaseModel): ## Creates a new output model. # \param controller - The controller of the model. def createOutputModel(self, controller: PrinterOutputController) -> PrinterOutputModel: + # FIXME + # Note that we're using '2' here as extruder count. We have hardcoded this for now to prevent issues where the + # amount of extruders coming back from the API is actually lower (which it can be if a printer was just added + # to a cluster). This should be fixed in the future, probably also on the cluster API side. model = PrinterOutputModel(controller, 2, firmware_version = self.firmware_version) self.updateOutputModel(model) return model From 0235ad69305096c4d842c42cacb891cd1dcf852b Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 6 Sep 2019 09:51:26 +0200 Subject: [PATCH 116/158] Check gltf extension against lower() filename CURA-6739 --- plugins/TrimeshReader/TrimeshReader.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/TrimeshReader/TrimeshReader.py b/plugins/TrimeshReader/TrimeshReader.py index 7d1f182720..91f8423579 100644 --- a/plugins/TrimeshReader/TrimeshReader.py +++ b/plugins/TrimeshReader/TrimeshReader.py @@ -89,7 +89,7 @@ class TrimeshReader(MeshReader): # try to figure out the format, but for GLTF, it loads it as a binary file with flags "rb", and the json.load() # doesn't like it. For some reason, this seems to happen with 3.5.7, but not 3.7.1. Below is a workaround to # pass a file object that has been opened with "r" instead "rb" to load a GLTF file. - if file_name.endswith(".gltf"): + if file_name.lower().endswith(".gltf"): mesh_or_scene = trimesh.load(open(file_name, "r", encoding = "utf-8"), file_type = "gltf") else: mesh_or_scene = trimesh.load(file_name) From db604cdd16c184d598f41c7919479ea4b67b213d Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 6 Sep 2019 11:16:12 +0200 Subject: [PATCH 117/158] Ensure that PerObjectContainer stack doesn't trigger a save --- cura/Settings/PerObjectContainerStack.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cura/Settings/PerObjectContainerStack.py b/cura/Settings/PerObjectContainerStack.py index 7ed9eb6fb7..a4f1f6ed06 100644 --- a/cura/Settings/PerObjectContainerStack.py +++ b/cura/Settings/PerObjectContainerStack.py @@ -12,6 +12,10 @@ from .CuraContainerStack import CuraContainerStack class PerObjectContainerStack(CuraContainerStack): + def isDirty(self): + # This stack should never be auto saved, so always return that there is nothing to save. + return False + @override(CuraContainerStack) def getProperty(self, key: str, property_name: str, context: Optional[PropertyEvaluationContext] = None) -> Any: if context is None: From b7cc48131c606cadd0718cfce452c33f9126821f Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Fri, 6 Sep 2019 11:23:02 +0200 Subject: [PATCH 118/158] Add bom_numbers field to definitions CS-171 --- resources/definitions/ultimaker3.def.json | 5 ++++- resources/definitions/ultimaker3_extended.def.json | 5 ++++- resources/definitions/ultimaker_s3.def.json | 5 ++++- resources/definitions/ultimaker_s5.def.json | 5 ++++- 4 files changed, 16 insertions(+), 4 deletions(-) diff --git a/resources/definitions/ultimaker3.def.json b/resources/definitions/ultimaker3.def.json index bd7e96448a..b34ff3bdba 100644 --- a/resources/definitions/ultimaker3.def.json +++ b/resources/definitions/ultimaker3.def.json @@ -33,7 +33,10 @@ "https://software.ultimaker.com/releases/firmware/9066/stable/um-update.swu.version" ], "update_url": "https://ultimaker.com/firmware" - } + }, + "bom_numbers": [ + 9066 + ] }, diff --git a/resources/definitions/ultimaker3_extended.def.json b/resources/definitions/ultimaker3_extended.def.json index c0d099366d..ba9824896f 100644 --- a/resources/definitions/ultimaker3_extended.def.json +++ b/resources/definitions/ultimaker3_extended.def.json @@ -30,7 +30,10 @@ "https://software.ultimaker.com/releases/firmware/9066/stable/um-update.swu.version" ], "update_url": "https://ultimaker.com/firmware" - } + }, + "bom_numbers": [ + 9511 + ] }, "overrides": { diff --git a/resources/definitions/ultimaker_s3.def.json b/resources/definitions/ultimaker_s3.def.json index 0fbf4acd77..f7f3a038fe 100644 --- a/resources/definitions/ultimaker_s3.def.json +++ b/resources/definitions/ultimaker_s3.def.json @@ -34,7 +34,10 @@ "id": 213482, "check_urls": ["https://software.ultimaker.com/releases/firmware/213482/stable/um-update.swu.version"], "update_url": "https://ultimaker.com/firmware" - } + }, + "bom_numbers": [ + 213482 + ] }, "overrides": { diff --git a/resources/definitions/ultimaker_s5.def.json b/resources/definitions/ultimaker_s5.def.json index 81b3a704ff..fef8c87c27 100644 --- a/resources/definitions/ultimaker_s5.def.json +++ b/resources/definitions/ultimaker_s5.def.json @@ -35,7 +35,10 @@ "id": 9051, "check_urls": ["https://software.ultimaker.com/releases/firmware/9051/stable/um-update.swu.version"], "update_url": "https://ultimaker.com/firmware" - } + }, + "bom_numbers": [ + 9051, 214475 + ] }, "overrides": { From 7674905f1c4c0e5750a6ea0afc127f3bd30c4075 Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Fri, 6 Sep 2019 11:23:28 +0200 Subject: [PATCH 119/158] Extend found_machine_type_identifiers to include R2 CS-171 --- .../src/Network/LocalClusterOutputDeviceManager.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDeviceManager.py b/plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDeviceManager.py index e55eb12fed..bfeb2f0be4 100644 --- a/plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDeviceManager.py +++ b/plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDeviceManager.py @@ -135,10 +135,13 @@ class LocalClusterOutputDeviceManager: ultimaker_machines = container_registry.findContainersMetadata(type="machine", manufacturer="Ultimaker B.V.") found_machine_type_identifiers = {} # type: Dict[str, str] for machine in ultimaker_machines: - machine_bom_number = machine.get("firmware_update_info", {}).get("id", None) machine_type = machine.get("id", None) - if machine_bom_number and machine_type: - found_machine_type_identifiers[str(machine_bom_number)] = machine_type + machine_bom_numbers = machine.get("bom_numbers", []) + if machine_type and machine_bom_numbers: + for bom_number in machine_bom_numbers: + # This produces a n:1 mapping of bom numberss to machine types + # allowing the S5R1 and S5R2 hardware to use a single S5 definition. + found_machine_type_identifiers[str(bom_number)] = machine_type return found_machine_type_identifiers ## Add a new device. From f49cf8dfd57ee23aa8f60535016b7d65519fa109 Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Fri, 6 Sep 2019 11:30:42 +0200 Subject: [PATCH 120/158] Fix typo CS-171 --- .../src/Network/LocalClusterOutputDeviceManager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDeviceManager.py b/plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDeviceManager.py index bfeb2f0be4..89fd71d03c 100644 --- a/plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDeviceManager.py +++ b/plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDeviceManager.py @@ -139,7 +139,7 @@ class LocalClusterOutputDeviceManager: machine_bom_numbers = machine.get("bom_numbers", []) if machine_type and machine_bom_numbers: for bom_number in machine_bom_numbers: - # This produces a n:1 mapping of bom numberss to machine types + # This produces a n:1 mapping of bom numbers to machine types # allowing the S5R1 and S5R2 hardware to use a single S5 definition. found_machine_type_identifiers[str(bom_number)] = machine_type return found_machine_type_identifiers From 2abda861622a343b20cf52b7a412824c3378a125 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 6 Sep 2019 11:38:53 +0200 Subject: [PATCH 121/158] Add retract-continue script Contributes to issue CURA-6755. --- .../scripts/RetractContinue.py | 75 +++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 plugins/PostProcessingPlugin/scripts/RetractContinue.py diff --git a/plugins/PostProcessingPlugin/scripts/RetractContinue.py b/plugins/PostProcessingPlugin/scripts/RetractContinue.py new file mode 100644 index 0000000000..31e542fd81 --- /dev/null +++ b/plugins/PostProcessingPlugin/scripts/RetractContinue.py @@ -0,0 +1,75 @@ +# Copyright (c) 2019 Ultimaker B.V. +# The PostProcessingPlugin is released under the terms of the AGPLv3 or higher. + +import math + +from ..Script import Script + +## Continues retracting during all travel moves. +class RetractContinue(Script): + def getSettingDataString(self): + return """{ + "name": "Retract Continue", + "key": "RetractContinue", + "metadata": {}, + "version": 2, + "settings": + { + "extra_retraction_speed": + { + "label": "Extra Retraction Speed", + "description": "How much does it retract during the travel move, by ratio of the travel length.", + "type": "float", + "default_value": 0.05 + } + } + }""" + + def execute(self, data): + current_e = 0 + current_x = 0 + current_y = 0 + extra_retraction_speed = self.getSettingValueByKey("extra_retraction_speed") + + for layer_number, layer in enumerate(data): + lines = layer.split("\n") + for line_number, line in enumerate(lines): + if self.getValue(line, "G") in {0, 1}: # Track X,Y location. + current_x = self.getValue(line, "X", current_x) + current_y = self.getValue(line, "Y", current_y) + if self.getValue(line, "G") == 1: + if self.getValue(line, "E"): + new_e = self.getValue(line, "E") + if new_e >= current_e: # Not a retraction. + continue + # A retracted travel move may consist of multiple commands, due to combing. + # This continues retracting over all of these moves and only unretracts at the end. + delta_line = 1 + dx = current_x # Track the difference in X for this move only to compute the length of the travel. + dy = current_y + while line_number + delta_line < len(lines) and self.getValue(lines[line_number + delta_line], "G") != 1: + travel_move = lines[line_number + delta_line] + if self.getValue(travel_move, "G") != 0: + delta_line += 1 + continue + travel_x = self.getValue(travel_move, "X", dx) + travel_y = self.getValue(travel_move, "Y", dy) + f = self.getValue(travel_move, "F", "no f") + length = math.sqrt((travel_x - dx) * (travel_x - dx) + (travel_y - dy) * (travel_y - dy)) # Length of the travel move. + new_e -= length * extra_retraction_speed # New retraction is by ratio of this travel move. + if f == "no f": + new_travel_move = "G1 X{travel_x} Y{travel_y} E{new_e}".format(travel_x = travel_x, travel_y = travel_y, new_e = new_e) + else: + new_travel_move = "G1 F{f} X{travel_x} Y{travel_y} E{new_e}".format(f = f, travel_x = travel_x, travel_y = travel_y, new_e = new_e) + lines[line_number + delta_line] = new_travel_move + + delta_line += 1 + dx = travel_x + dy = travel_y + + current_e = new_e + + new_layer = "\n".join(lines) + data[layer_number] = new_layer + + return data \ No newline at end of file From 138d76e7d9e06852f9c6b7152cb2a998e313367a Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 6 Sep 2019 11:46:59 +0200 Subject: [PATCH 122/158] Rename speed to ratio Contributes to issue CURA-6755. --- plugins/PostProcessingPlugin/scripts/RetractContinue.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/PostProcessingPlugin/scripts/RetractContinue.py b/plugins/PostProcessingPlugin/scripts/RetractContinue.py index 31e542fd81..b0af9cd95e 100644 --- a/plugins/PostProcessingPlugin/scripts/RetractContinue.py +++ b/plugins/PostProcessingPlugin/scripts/RetractContinue.py @@ -17,7 +17,7 @@ class RetractContinue(Script): { "extra_retraction_speed": { - "label": "Extra Retraction Speed", + "label": "Extra Retraction Ratio", "description": "How much does it retract during the travel move, by ratio of the travel length.", "type": "float", "default_value": 0.05 From c1b4bcebec0d1de587f121266d8793a9a5b00b77 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 6 Sep 2019 12:41:09 +0200 Subject: [PATCH 123/158] Add message while pausing This way you can display instructions during the print. Implements issue CURA-6759. --- .../scripts/DisplayFilenameAndLayerOnLCD.py | 2 +- .../PostProcessingPlugin/scripts/PauseAtHeight.py | 12 +++++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/plugins/PostProcessingPlugin/scripts/DisplayFilenameAndLayerOnLCD.py b/plugins/PostProcessingPlugin/scripts/DisplayFilenameAndLayerOnLCD.py index 25194568e7..001beecd3b 100644 --- a/plugins/PostProcessingPlugin/scripts/DisplayFilenameAndLayerOnLCD.py +++ b/plugins/PostProcessingPlugin/scripts/DisplayFilenameAndLayerOnLCD.py @@ -69,7 +69,7 @@ class DisplayFilenameAndLayerOnLCD(Script): else: lcd_text = "M117 Printing Layer " else: - lcd_text = "M117 Printing " + name + " - Layer " + lcd_text = "M117 Printing " + name + " - Layer " i = self.getSettingValueByKey("startNum") for layer in data: display_text = lcd_text + str(i) + " " + name diff --git a/plugins/PostProcessingPlugin/scripts/PauseAtHeight.py b/plugins/PostProcessingPlugin/scripts/PauseAtHeight.py index 50d365da0b..cc83b7b76c 100644 --- a/plugins/PostProcessingPlugin/scripts/PauseAtHeight.py +++ b/plugins/PostProcessingPlugin/scripts/PauseAtHeight.py @@ -106,10 +106,17 @@ class PauseAtHeight(Script): "standby_temperature": { "label": "Standby Temperature", - "description": "Change the temperature during the pause", + "description": "Change the temperature during the pause.", "unit": "°C", "type": "int", "default_value": 0 + }, + "display_text": + { + "label": "Display Text", + "description": "Text that should appear on the display while paused.", + "type": "str", + "default_value": "Print paused." } } }""" @@ -144,6 +151,7 @@ class PauseAtHeight(Script): firmware_retract = Application.getInstance().getGlobalContainerStack().getProperty("machine_firmware_retract", "value") control_temperatures = Application.getInstance().getGlobalContainerStack().getProperty("machine_nozzle_temp_enabled", "value") initial_layer_height = Application.getInstance().getGlobalContainerStack().getProperty("layer_height_0", "value") + display_text = self.getSettingValueByKey("display_text") is_griffin = False @@ -287,6 +295,8 @@ class PauseAtHeight(Script): # Set extruder standby temperature prepend_gcode += self.putValue(M = 104, S = standby_temperature) + " ; standby temperature\n" + prepend_gcode += "M117 " + display_text + "\n" + # Wait till the user continues printing prepend_gcode += self.putValue(M = 0) + " ; Do the actual pause\n" From b20e5bfd989d579853e5f29c0d703bc9beed0a26 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 6 Sep 2019 12:42:15 +0200 Subject: [PATCH 124/158] Don't display any message if setting is empty Contributes to issue CURA-6759. --- plugins/PostProcessingPlugin/scripts/PauseAtHeight.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/plugins/PostProcessingPlugin/scripts/PauseAtHeight.py b/plugins/PostProcessingPlugin/scripts/PauseAtHeight.py index cc83b7b76c..913be4e966 100644 --- a/plugins/PostProcessingPlugin/scripts/PauseAtHeight.py +++ b/plugins/PostProcessingPlugin/scripts/PauseAtHeight.py @@ -114,9 +114,9 @@ class PauseAtHeight(Script): "display_text": { "label": "Display Text", - "description": "Text that should appear on the display while paused.", + "description": "Text that should appear on the display while paused. If left empty, there will not be any message.", "type": "str", - "default_value": "Print paused." + "default_value": "" } } }""" @@ -295,7 +295,8 @@ class PauseAtHeight(Script): # Set extruder standby temperature prepend_gcode += self.putValue(M = 104, S = standby_temperature) + " ; standby temperature\n" - prepend_gcode += "M117 " + display_text + "\n" + if display_text: + prepend_gcode += "M117 " + display_text + "\n" # Wait till the user continues printing prepend_gcode += self.putValue(M = 0) + " ; Do the actual pause\n" From f5aa2921ffdced69bb30ad48cfd504e61c7d73fa Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 6 Sep 2019 14:34:40 +0200 Subject: [PATCH 125/158] Add space before comments Some pause commands on some printers (looking at you, Repetier) seem to require a space after it, which is not obvious to the user. So we'll put a space there for them. Fixes #6295. --- plugins/PostProcessingPlugin/scripts/TimeLapse.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/plugins/PostProcessingPlugin/scripts/TimeLapse.py b/plugins/PostProcessingPlugin/scripts/TimeLapse.py index 36d0f6a058..53e55a9454 100644 --- a/plugins/PostProcessingPlugin/scripts/TimeLapse.py +++ b/plugins/PostProcessingPlugin/scripts/TimeLapse.py @@ -77,10 +77,10 @@ class TimeLapse(Script): gcode_to_append = ";TimeLapse Begin\n" if park_print_head: - gcode_to_append += self.putValue(G = 1, F = feed_rate, X = x_park, Y = y_park) + ";Park print head\n" - gcode_to_append += self.putValue(M = 400) + ";Wait for moves to finish\n" - gcode_to_append += trigger_command + ";Snap Photo\n" - gcode_to_append += self.putValue(G = 4, P = pause_length) + ";Wait for camera\n" + gcode_to_append += self.putValue(G = 1, F = feed_rate, X = x_park, Y = y_park) + " ;Park print head\n" + gcode_to_append += self.putValue(M = 400) + " ;Wait for moves to finish\n" + gcode_to_append += trigger_command + " ;Snap Photo\n" + gcode_to_append += self.putValue(G = 4, P = pause_length) + " ;Wait for camera\n" gcode_to_append += ";TimeLapse End\n" for layer in data: # Check that a layer is being printed From c3f9d65de140cbad7e40ade1d77b6ce331ebd9b6 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 6 Sep 2019 14:35:00 +0200 Subject: [PATCH 126/158] Ignore SettingsGuide plug-in --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index a66c1086a7..eed686fda7 100644 --- a/.gitignore +++ b/.gitignore @@ -35,7 +35,7 @@ cura.desktop .pydevproject .settings -#Externally located plug-ins. +#Externally located plug-ins commonly installed by our devs. plugins/cura-big-flame-graph plugins/cura-god-mode-plugin plugins/cura-siemensnx-plugin @@ -52,6 +52,7 @@ plugins/FlatProfileExporter plugins/GodMode plugins/OctoPrintPlugin plugins/ProfileFlattener +plugins/SettingsGuide plugins/X3GWriter #Build stuff From f540abbd73acee940403b0e7fba771b14389b38a Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 6 Sep 2019 15:13:25 +0200 Subject: [PATCH 127/158] Expand the createUniqueName test --- tests/Settings/TestCuraContainerRegistry.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/Settings/TestCuraContainerRegistry.py b/tests/Settings/TestCuraContainerRegistry.py index 40ae630e4d..cf30cbbee3 100644 --- a/tests/Settings/TestCuraContainerRegistry.py +++ b/tests/Settings/TestCuraContainerRegistry.py @@ -36,6 +36,12 @@ def test_createUniqueName(container_registry): # It should add a #2 to test2 assert container_registry.createUniqueName("user", "test", "test2", "nope") == "test2 #2" + # The provided suggestion is already correct, so nothing to do + assert container_registry.createUniqueName("user", "test", "test2 #2", "nope") == "test2 #2" + + # In case we don't provide a new name, use the fallback + assert container_registry.createUniqueName("user", "test", "", "nope") == "nope" + ## Tests whether addContainer properly converts to ExtruderStack. def test_addContainerExtruderStack(container_registry, definition_container, definition_changes_container): From 608ca3e92af478652f6c67f814f39417e039247a Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 6 Sep 2019 15:18:50 +0200 Subject: [PATCH 128/158] Convert some functions to static --- plugins/XmlMaterialProfile/XmlMaterialProfile.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index 8d0177c165..12b46af6b8 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -409,7 +409,8 @@ class XmlMaterialProfile(InstanceContainer): self._combineElement(self._expandMachinesXML(result), self._expandMachinesXML(second)) return result - def _createKey(self, element): + @staticmethod + def _createKey(element): key = element.tag.split("}")[-1] if "key" in element.attrib: key += " key:" + element.attrib["key"] @@ -425,15 +426,15 @@ class XmlMaterialProfile(InstanceContainer): # Recursively merges XML elements. Updates either the text or children if another element is found in first. # If it does not exist, copies it from second. - def _combineElement(self, first, second): + @staticmethod + def _combineElement(first, second): # Create a mapping from tag name to element. - mapping = {} for element in first: - key = self._createKey(element) + key = XmlMaterialProfile._createKey(element) mapping[key] = element for element in second: - key = self._createKey(element) + key = XmlMaterialProfile._createKey(element) if len(element): # Check if element has children. try: if "setting" in element.tag and not "settings" in element.tag: @@ -443,7 +444,7 @@ class XmlMaterialProfile(InstanceContainer): for child in element: mapping[key].append(child) else: - self._combineElement(mapping[key], element) # Multiple elements, handle those. + XmlMaterialProfile._combineElement(mapping[key], element) # Multiple elements, handle those. except KeyError: mapping[key] = element first.append(element) From 82aa0492ea659ba9eb48b59e282681ff78aaa012 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 6 Sep 2019 14:00:04 +0000 Subject: [PATCH 129/158] Revert "CS-171 Add R2 support" --- cura/PrinterOutput/FirmwareUpdater.py | 2 +- plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.qml | 2 -- .../src/Network/LocalClusterOutputDeviceManager.py | 9 +++------ plugins/USBPrinting/AvrFirmwareUpdater.py | 3 --- plugins/USBPrinting/avr_isp/intelHex.py | 7 ++----- resources/definitions/ultimaker3.def.json | 5 +---- resources/definitions/ultimaker3_extended.def.json | 5 +---- resources/definitions/ultimaker_s3.def.json | 5 +---- resources/definitions/ultimaker_s5.def.json | 5 +---- 9 files changed, 10 insertions(+), 33 deletions(-) diff --git a/cura/PrinterOutput/FirmwareUpdater.py b/cura/PrinterOutput/FirmwareUpdater.py index d33015920a..3f20e0f3c4 100644 --- a/cura/PrinterOutput/FirmwareUpdater.py +++ b/cura/PrinterOutput/FirmwareUpdater.py @@ -75,4 +75,4 @@ class FirmwareUpdateState(IntEnum): communication_error = 4 io_error = 5 firmware_not_found_error = 6 - invalid_firmware_error = 7 + diff --git a/plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.qml b/plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.qml index 90a27c24e1..b5b6c15f50 100644 --- a/plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.qml +++ b/plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.qml @@ -151,8 +151,6 @@ Cura.MachineAction return catalog.i18nc("@label","Firmware update failed due to an input/output error."); case 6: return catalog.i18nc("@label","Firmware update failed due to missing firmware."); - case 7: - return catalog.i18nc("@label","Firmware update failed due to invalid firmware file."); } } diff --git a/plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDeviceManager.py b/plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDeviceManager.py index 89fd71d03c..e55eb12fed 100644 --- a/plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDeviceManager.py +++ b/plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDeviceManager.py @@ -135,13 +135,10 @@ class LocalClusterOutputDeviceManager: ultimaker_machines = container_registry.findContainersMetadata(type="machine", manufacturer="Ultimaker B.V.") found_machine_type_identifiers = {} # type: Dict[str, str] for machine in ultimaker_machines: + machine_bom_number = machine.get("firmware_update_info", {}).get("id", None) machine_type = machine.get("id", None) - machine_bom_numbers = machine.get("bom_numbers", []) - if machine_type and machine_bom_numbers: - for bom_number in machine_bom_numbers: - # This produces a n:1 mapping of bom numbers to machine types - # allowing the S5R1 and S5R2 hardware to use a single S5 definition. - found_machine_type_identifiers[str(bom_number)] = machine_type + if machine_bom_number and machine_type: + found_machine_type_identifiers[str(machine_bom_number)] = machine_type return found_machine_type_identifiers ## Add a new device. diff --git a/plugins/USBPrinting/AvrFirmwareUpdater.py b/plugins/USBPrinting/AvrFirmwareUpdater.py index ded2036efe..0f7146560d 100644 --- a/plugins/USBPrinting/AvrFirmwareUpdater.py +++ b/plugins/USBPrinting/AvrFirmwareUpdater.py @@ -27,9 +27,6 @@ class AvrFirmwareUpdater(FirmwareUpdater): except (FileNotFoundError, AssertionError): Logger.log("e", "Unable to read provided hex file. Could not update firmware.") self._setFirmwareUpdateState(FirmwareUpdateState.firmware_not_found_error) - except Exception: - Logger.logException("e", "Failed to read hex file '%s'", self._firmware_file) - self._setFirmwareUpdateState(FirmwareUpdateState.invalid_firmware_error) return programmer = stk500v2.Stk500v2() diff --git a/plugins/USBPrinting/avr_isp/intelHex.py b/plugins/USBPrinting/avr_isp/intelHex.py index 3c5c66d805..671f1788f7 100644 --- a/plugins/USBPrinting/avr_isp/intelHex.py +++ b/plugins/USBPrinting/avr_isp/intelHex.py @@ -5,16 +5,13 @@ See: http://en.wikipedia.org/wiki/Intel_HEX This is a python 3 conversion of the code created by David Braam for the Cura project. """ import io -from typing import List - from UM.Logger import Logger - -def readHex(filename: str) -> List[int]: +def readHex(filename): """ Read an verify an intel hex file. Return the data as an list of bytes. """ - data = [] # type: List[int] + data = [] extra_addr = 0 f = io.open(filename, "r", encoding = "utf-8") for line in f: diff --git a/resources/definitions/ultimaker3.def.json b/resources/definitions/ultimaker3.def.json index b34ff3bdba..bd7e96448a 100644 --- a/resources/definitions/ultimaker3.def.json +++ b/resources/definitions/ultimaker3.def.json @@ -33,10 +33,7 @@ "https://software.ultimaker.com/releases/firmware/9066/stable/um-update.swu.version" ], "update_url": "https://ultimaker.com/firmware" - }, - "bom_numbers": [ - 9066 - ] + } }, diff --git a/resources/definitions/ultimaker3_extended.def.json b/resources/definitions/ultimaker3_extended.def.json index ba9824896f..c0d099366d 100644 --- a/resources/definitions/ultimaker3_extended.def.json +++ b/resources/definitions/ultimaker3_extended.def.json @@ -30,10 +30,7 @@ "https://software.ultimaker.com/releases/firmware/9066/stable/um-update.swu.version" ], "update_url": "https://ultimaker.com/firmware" - }, - "bom_numbers": [ - 9511 - ] + } }, "overrides": { diff --git a/resources/definitions/ultimaker_s3.def.json b/resources/definitions/ultimaker_s3.def.json index f7f3a038fe..0fbf4acd77 100644 --- a/resources/definitions/ultimaker_s3.def.json +++ b/resources/definitions/ultimaker_s3.def.json @@ -34,10 +34,7 @@ "id": 213482, "check_urls": ["https://software.ultimaker.com/releases/firmware/213482/stable/um-update.swu.version"], "update_url": "https://ultimaker.com/firmware" - }, - "bom_numbers": [ - 213482 - ] + } }, "overrides": { diff --git a/resources/definitions/ultimaker_s5.def.json b/resources/definitions/ultimaker_s5.def.json index fef8c87c27..81b3a704ff 100644 --- a/resources/definitions/ultimaker_s5.def.json +++ b/resources/definitions/ultimaker_s5.def.json @@ -35,10 +35,7 @@ "id": 9051, "check_urls": ["https://software.ultimaker.com/releases/firmware/9051/stable/um-update.swu.version"], "update_url": "https://ultimaker.com/firmware" - }, - "bom_numbers": [ - 9051, 214475 - ] + } }, "overrides": { From dfc23d994fe233ab122d6ebdcdff28408b7d5773 Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Fri, 6 Sep 2019 11:23:02 +0200 Subject: [PATCH 130/158] Add bom_numbers field to definitions CS-171 --- resources/definitions/ultimaker3.def.json | 5 ++++- resources/definitions/ultimaker3_extended.def.json | 5 ++++- resources/definitions/ultimaker_s3.def.json | 5 ++++- resources/definitions/ultimaker_s5.def.json | 5 ++++- 4 files changed, 16 insertions(+), 4 deletions(-) diff --git a/resources/definitions/ultimaker3.def.json b/resources/definitions/ultimaker3.def.json index bd7e96448a..b34ff3bdba 100644 --- a/resources/definitions/ultimaker3.def.json +++ b/resources/definitions/ultimaker3.def.json @@ -33,7 +33,10 @@ "https://software.ultimaker.com/releases/firmware/9066/stable/um-update.swu.version" ], "update_url": "https://ultimaker.com/firmware" - } + }, + "bom_numbers": [ + 9066 + ] }, diff --git a/resources/definitions/ultimaker3_extended.def.json b/resources/definitions/ultimaker3_extended.def.json index c0d099366d..ba9824896f 100644 --- a/resources/definitions/ultimaker3_extended.def.json +++ b/resources/definitions/ultimaker3_extended.def.json @@ -30,7 +30,10 @@ "https://software.ultimaker.com/releases/firmware/9066/stable/um-update.swu.version" ], "update_url": "https://ultimaker.com/firmware" - } + }, + "bom_numbers": [ + 9511 + ] }, "overrides": { diff --git a/resources/definitions/ultimaker_s3.def.json b/resources/definitions/ultimaker_s3.def.json index 0fbf4acd77..f7f3a038fe 100644 --- a/resources/definitions/ultimaker_s3.def.json +++ b/resources/definitions/ultimaker_s3.def.json @@ -34,7 +34,10 @@ "id": 213482, "check_urls": ["https://software.ultimaker.com/releases/firmware/213482/stable/um-update.swu.version"], "update_url": "https://ultimaker.com/firmware" - } + }, + "bom_numbers": [ + 213482 + ] }, "overrides": { diff --git a/resources/definitions/ultimaker_s5.def.json b/resources/definitions/ultimaker_s5.def.json index 81b3a704ff..fef8c87c27 100644 --- a/resources/definitions/ultimaker_s5.def.json +++ b/resources/definitions/ultimaker_s5.def.json @@ -35,7 +35,10 @@ "id": 9051, "check_urls": ["https://software.ultimaker.com/releases/firmware/9051/stable/um-update.swu.version"], "update_url": "https://ultimaker.com/firmware" - } + }, + "bom_numbers": [ + 9051, 214475 + ] }, "overrides": { From e0194d87211f9550afc2449b0bfd53a58f35ea12 Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Fri, 6 Sep 2019 11:23:28 +0200 Subject: [PATCH 131/158] Extend found_machine_type_identifiers to include R2 CS-171 --- .../src/Network/LocalClusterOutputDeviceManager.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDeviceManager.py b/plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDeviceManager.py index e55eb12fed..bfeb2f0be4 100644 --- a/plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDeviceManager.py +++ b/plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDeviceManager.py @@ -135,10 +135,13 @@ class LocalClusterOutputDeviceManager: ultimaker_machines = container_registry.findContainersMetadata(type="machine", manufacturer="Ultimaker B.V.") found_machine_type_identifiers = {} # type: Dict[str, str] for machine in ultimaker_machines: - machine_bom_number = machine.get("firmware_update_info", {}).get("id", None) machine_type = machine.get("id", None) - if machine_bom_number and machine_type: - found_machine_type_identifiers[str(machine_bom_number)] = machine_type + machine_bom_numbers = machine.get("bom_numbers", []) + if machine_type and machine_bom_numbers: + for bom_number in machine_bom_numbers: + # This produces a n:1 mapping of bom numberss to machine types + # allowing the S5R1 and S5R2 hardware to use a single S5 definition. + found_machine_type_identifiers[str(bom_number)] = machine_type return found_machine_type_identifiers ## Add a new device. From f517beba7668030138c3c6cf69e1bfd3259bfaf0 Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Fri, 6 Sep 2019 11:30:42 +0200 Subject: [PATCH 132/158] Fix typo CS-171 --- .../src/Network/LocalClusterOutputDeviceManager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDeviceManager.py b/plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDeviceManager.py index bfeb2f0be4..89fd71d03c 100644 --- a/plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDeviceManager.py +++ b/plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDeviceManager.py @@ -139,7 +139,7 @@ class LocalClusterOutputDeviceManager: machine_bom_numbers = machine.get("bom_numbers", []) if machine_type and machine_bom_numbers: for bom_number in machine_bom_numbers: - # This produces a n:1 mapping of bom numberss to machine types + # This produces a n:1 mapping of bom numbers to machine types # allowing the S5R1 and S5R2 hardware to use a single S5 definition. found_machine_type_identifiers[str(bom_number)] = machine_type return found_machine_type_identifiers From d618f2df7168ec60b48f2b31b06a6aefdaf1851d Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 6 Sep 2019 17:06:32 +0200 Subject: [PATCH 133/158] Add test for getCurrentQualityGroups The test succeeded but in writing it I discovered a bug. I'll fix that soon. Contributes to issue CURA-6600. --- tests/Machines/TestContainerTree.py | 42 ++++++++++++++++++++++++----- 1 file changed, 36 insertions(+), 6 deletions(-) diff --git a/tests/Machines/TestContainerTree.py b/tests/Machines/TestContainerTree.py index 5d269fc6a9..e82ce2384d 100644 --- a/tests/Machines/TestContainerTree.py +++ b/tests/Machines/TestContainerTree.py @@ -10,15 +10,30 @@ import cura.CuraApplication # DEBUG! def createMockedStack(definition_id: str): result = MagicMock(spec = GlobalStack) result.definition.getId = MagicMock(return_value = definition_id) + + extruder_left_mock = MagicMock() + extruder_left_mock.variant.getName = MagicMock(return_value = definition_id + "_left_variant_name") + extruder_left_mock.material.getMetaDataEntry = MagicMock(return_value = definition_id + "_left_material_base_file") + extruder_left_mock.isEnabled = True + extruder_right_mock = MagicMock() + extruder_right_mock.variant.getName = MagicMock(return_value = definition_id + "_right_variant_name") + extruder_right_mock.material.getMetaDataEntry = MagicMock(return_value = definition_id + "_right_material_base_file") + extruder_right_mock.isEnabled = True + extruder_dict = {"1": extruder_right_mock, "0": extruder_left_mock} + result.extruders = extruder_dict return result @pytest.fixture def container_registry(): result = MagicMock() - result.findContainerStacks = MagicMock(return_value=[createMockedStack("machine_1"), createMockedStack("machine_2")]) + result.findContainerStacks = MagicMock(return_value = [createMockedStack("machine_1"), createMockedStack("machine_2")]) return result +@pytest.fixture +def application(): + return MagicMock(getGlobalContainerStack = MagicMock(return_value = createMockedStack("current_global_stack"))) + def test_containerTreeInit(container_registry): with patch("UM.Settings.ContainerRegistry.ContainerRegistry.getInstance", MagicMock(return_value=container_registry)): @@ -32,7 +47,7 @@ def test_newMachineAdded(container_registry): mocked_definition_container = MagicMock(spec=DefinitionContainer) mocked_definition_container.getId = MagicMock(return_value = "machine_3") - with patch("UM.Settings.ContainerRegistry.ContainerRegistry.getInstance", MagicMock(return_value=container_registry)): + with patch("UM.Settings.ContainerRegistry.ContainerRegistry.getInstance", MagicMock(return_value = container_registry)): container_tree = ContainerTree() # machine_3 shouldn't be there, as on init it wasn't in the registry assert "machine_3" not in container_tree.machines @@ -46,10 +61,10 @@ def test_newMachineAdded(container_registry): def test_alreadyKnownMachineAdded(container_registry): - mocked_definition_container = MagicMock(spec=DefinitionContainer) - mocked_definition_container.getId = MagicMock(return_value="machine_2") + mocked_definition_container = MagicMock(spec = DefinitionContainer) + mocked_definition_container.getId = MagicMock(return_value = "machine_2") - with patch("UM.Settings.ContainerRegistry.ContainerRegistry.getInstance", MagicMock(return_value=container_registry)): + with patch("UM.Settings.ContainerRegistry.ContainerRegistry.getInstance", MagicMock(return_value = container_registry)): container_tree = ContainerTree() assert len(container_tree.machines) == 2 @@ -63,4 +78,19 @@ def test_getCurrentQualityGroupsNoGlobalStack(container_registry): container_tree = ContainerTree() result = container_tree.getCurrentQualityGroups() - assert len(result) == 0 \ No newline at end of file + assert len(result) == 0 + +def test_getCurrentQualityGroups(container_registry, application): + with patch("UM.Settings.ContainerRegistry.ContainerRegistry.getInstance", MagicMock(return_value = container_registry)): + container_tree = ContainerTree() + container_tree.machines["current_global_stack"] = MagicMock() # Mock so that we can track whether the getQualityGroups function gets called with correct parameters. + + with patch("cura.CuraApplication.CuraApplication.getInstance", MagicMock(return_value = application)): + result = container_tree.getCurrentQualityGroups() + + # As defined in the fixture for application. + expected_variant_names = ["current_global_stack_left_variant_name", "current_global_stack_right_variant_name"] + expected_material_base_files = ["current_global_stack_left_material_base_file", "current_global_stack_right_material_base_file"] + expected_is_enabled = [True, True] + + container_tree.machines["current_global_stack"].getQualityGroups.assert_called_with(expected_variant_names, expected_material_base_files, expected_is_enabled) \ No newline at end of file From 4bdc819f129061b5554c27fde120bba1a42469c0 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 6 Sep 2019 17:15:45 +0200 Subject: [PATCH 134/158] Fix nondetermistic result with dictionary values list Because global_stack.extruders.values can be returned in any order, the configurations matching with the lists doesn't always give a result. It happened to work on my computer with the test, but there is no guarantee of that. This is probably also going wrong in other places. I don't think we should use the .extruders property anywhere really! Contributes to issue CURA-6600. --- cura/Machines/ContainerTree.py | 6 +++--- tests/Machines/TestContainerTree.py | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/cura/Machines/ContainerTree.py b/cura/Machines/ContainerTree.py index eb2ed7d159..12a77083c4 100644 --- a/cura/Machines/ContainerTree.py +++ b/cura/Machines/ContainerTree.py @@ -53,9 +53,9 @@ class ContainerTree: global_stack = cura.CuraApplication.CuraApplication.getInstance().getGlobalContainerStack() if global_stack is None: return {} - variant_names = [extruder.variant.getName() for extruder in global_stack.extruders.values()] - material_bases = [extruder.material.getMetaDataEntry("base_file") for extruder in global_stack.extruders.values()] - extruder_enabled = [extruder.isEnabled for extruder in global_stack.extruders.values()] + variant_names = [extruder.variant.getName() for extruder in global_stack.extrudersList] + material_bases = [extruder.material.getMetaDataEntry("base_file") for extruder in global_stack.extrudersList] + extruder_enabled = [extruder.isEnabled for extruder in global_stack.extrudersList] return self.machines[global_stack.definition.getId()].getQualityGroups(variant_names, material_bases, extruder_enabled) ## Get the quality changes groups available for the currently activated diff --git a/tests/Machines/TestContainerTree.py b/tests/Machines/TestContainerTree.py index e82ce2384d..ed54774acd 100644 --- a/tests/Machines/TestContainerTree.py +++ b/tests/Machines/TestContainerTree.py @@ -19,8 +19,8 @@ def createMockedStack(definition_id: str): extruder_right_mock.variant.getName = MagicMock(return_value = definition_id + "_right_variant_name") extruder_right_mock.material.getMetaDataEntry = MagicMock(return_value = definition_id + "_right_material_base_file") extruder_right_mock.isEnabled = True - extruder_dict = {"1": extruder_right_mock, "0": extruder_left_mock} - result.extruders = extruder_dict + extruder_list = [extruder_left_mock, extruder_right_mock] + result.extrudersList = extruder_list return result From 94b6f7864f9d896abcc6d6d5f9fa75760ad00f35 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 6 Sep 2019 17:19:23 +0200 Subject: [PATCH 135/158] Add some tests for XMLMaterialProfile --- .../XmlMaterialProfile/XmlMaterialProfile.py | 5 +- .../tests/TestXmlMaterialProfile.py | 65 +++++++++++++++++++ 2 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 plugins/XmlMaterialProfile/tests/TestXmlMaterialProfile.py diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index 12b46af6b8..b6eed915d9 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -19,7 +19,10 @@ from UM.ConfigurationErrorMessage import ConfigurationErrorMessage from cura.CuraApplication import CuraApplication from cura.Machines.VariantType import VariantType -from .XmlMaterialValidator import XmlMaterialValidator +try: + from .XmlMaterialValidator import XmlMaterialValidator +except (ImportError, SystemError): + import XmlMaterialValidator # type: ignore # This fixes the tests not being able to import. ## Handles serializing and deserializing material containers from an XML file diff --git a/plugins/XmlMaterialProfile/tests/TestXmlMaterialProfile.py b/plugins/XmlMaterialProfile/tests/TestXmlMaterialProfile.py new file mode 100644 index 0000000000..9658328c8a --- /dev/null +++ b/plugins/XmlMaterialProfile/tests/TestXmlMaterialProfile.py @@ -0,0 +1,65 @@ +from unittest.mock import patch, MagicMock +import sys +import os + +# Prevents error: "PyCapsule_GetPointer called with incorrect name" with conflicting SIP configurations between Arcus and PyQt: Import Arcus and Savitar first! +import Savitar # Dont remove this line +import Arcus # No really. Don't. It needs to be there! +from UM.Qt.QtApplication import QtApplication # QtApplication import is required, even though it isn't used. + +import pytest +import XmlMaterialProfile + +def createXmlMaterialProfile(material_id): + try: + return XmlMaterialProfile.XmlMaterialProfile.XmlMaterialProfile(material_id) + except AttributeError: + return XmlMaterialProfile.XmlMaterialProfile(material_id) + + +def test_setName(): + material_1 = createXmlMaterialProfile("herpderp") + material_2 = createXmlMaterialProfile("OMGZOMG") + + material_1.getMetaData()["base_file"] = "herpderp" + material_2.getMetaData()["base_file"] = "herpderp" + + container_registry = MagicMock() + container_registry.isReadOnly = MagicMock(return_value = False) + container_registry.findInstanceContainers = MagicMock(return_value = [material_1, material_2]) + + with patch("UM.Settings.ContainerRegistry.ContainerRegistry.getInstance", MagicMock(return_value = container_registry)): + material_1.setName("beep!") + + assert material_1.getName() == "beep!" + assert material_2.getName() == "beep!" + + +def test_setDirty(): + material_1 = createXmlMaterialProfile("herpderp") + material_2 = createXmlMaterialProfile("OMGZOMG") + + material_1.getMetaData()["base_file"] = "herpderp" + material_2.getMetaData()["base_file"] = "herpderp" + + container_registry = MagicMock() + container_registry.isReadOnly = MagicMock(return_value=False) + container_registry.findContainers = MagicMock(return_value=[material_1, material_2]) + + # Sanity check. Since we did a hacky thing to set the metadata, the container should not be dirty. + # But this test assumes that it works like that, so we need to validate that. + assert not material_1.isDirty() + assert not material_2.isDirty() + + with patch("UM.Settings.ContainerRegistry.ContainerRegistry.getInstance", MagicMock(return_value=container_registry)): + material_2.setDirty(True) + + assert material_1.isDirty() + assert material_2.isDirty() + + # Setting the base material dirty does not set it's child as dirty. + with patch("UM.Settings.ContainerRegistry.ContainerRegistry.getInstance", MagicMock(return_value=container_registry)): + material_1.setDirty(False) + + assert not material_1.isDirty() + assert material_2.isDirty() \ No newline at end of file From 8bcd9b339abcac70b24966f2d06caac3cddceb4e Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 6 Sep 2019 17:20:03 +0200 Subject: [PATCH 136/158] Use GlobalStack.extrudersList instead of GlobalStack.extruders to iterate Otherwise the iteration can happen in any arbitrary order (due to the dict) and this can cause the result to not match to the desired combination of configurations per extruder. Contributes to issue CURA-6600. --- cura/Machines/ContainerTree.py | 6 +++--- cura/Machines/QualityManager.py | 12 ++++++------ plugins/Toolbox/src/Toolbox.py | 6 +++--- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/cura/Machines/ContainerTree.py b/cura/Machines/ContainerTree.py index 12a77083c4..c75f305885 100644 --- a/cura/Machines/ContainerTree.py +++ b/cura/Machines/ContainerTree.py @@ -69,9 +69,9 @@ class ContainerTree: global_stack = cura.CuraApplication.CuraApplication.getInstance().getGlobalContainerStack() if global_stack is None: return [] - variant_names = [extruder.variant.getName() for extruder in global_stack.extruders.values()] - material_bases = [extruder.material.getMetaDataEntry("base_file") for extruder in global_stack.extruders.values()] - extruder_enabled = [extruder.isEnabled for extruder in global_stack.extruders.values()] + variant_names = [extruder.variant.getName() for extruder in global_stack.extrudersList] + material_bases = [extruder.material.getMetaDataEntry("base_file") for extruder in global_stack.extrudersList] + extruder_enabled = [extruder.isEnabled for extruder in global_stack.extrudersList] return self.machines[global_stack.definition.getId()].getQualityChangesGroups(variant_names, material_bases, extruder_enabled) ## Builds the initial container tree. diff --git a/cura/Machines/QualityManager.py b/cura/Machines/QualityManager.py index cc359b00dd..699e6731a0 100644 --- a/cura/Machines/QualityManager.py +++ b/cura/Machines/QualityManager.py @@ -77,9 +77,9 @@ class QualityManager(QObject): # Returns a dict of "custom profile name" -> QualityChangesGroup def getQualityChangesGroups(self, machine: "GlobalStack") -> List[QualityChangesGroup]: - variant_names = [extruder.variant.getName() for extruder in machine.extruders.values()] - material_bases = [extruder.material.getMetaDataEntry("base_file") for extruder in machine.extruders.values()] - extruder_enabled = [extruder.isEnabled for extruder in machine.extruders.values()] + variant_names = [extruder.variant.getName() for extruder in machine.extrudersList] + material_bases = [extruder.material.getMetaDataEntry("base_file") for extruder in machine.extrudersList] + extruder_enabled = [extruder.isEnabled for extruder in machine.extrudersList] machine_node = ContainerTree.getInstance().machines[machine.definition.getId()] return machine_node.getQualityChangesGroups(variant_names, material_bases, extruder_enabled) @@ -92,9 +92,9 @@ class QualityManager(QObject): # for those types as values. def getQualityGroups(self, global_stack: "GlobalStack") -> Dict[str, QualityGroup]: # Gather up the variant names and material base files for each extruder. - variant_names = [extruder.variant.getName() for extruder in global_stack.extruders.values()] - material_bases = [extruder.material.getMetaDataEntry("base_file") for extruder in global_stack.extruders.values()] - extruder_enabled = [extruder.isEnabled for extruder in global_stack.extruders.values()] + variant_names = [extruder.variant.getName() for extruder in global_stack.extrudersList] + material_bases = [extruder.material.getMetaDataEntry("base_file") for extruder in global_stack.extrudersList] + extruder_enabled = [extruder.isEnabled for extruder in global_stack.extrudersList] definition_id = global_stack.definition.getId() return ContainerTree.getInstance().machines[definition_id].getQualityGroups(variant_names, material_bases, extruder_enabled) diff --git a/plugins/Toolbox/src/Toolbox.py b/plugins/Toolbox/src/Toolbox.py index 5f73d563c7..40aacac056 100644 --- a/plugins/Toolbox/src/Toolbox.py +++ b/plugins/Toolbox/src/Toolbox.py @@ -368,9 +368,9 @@ class Toolbox(QObject, Extension): default_material_node = material_manager.getDefaultMaterial(global_stack, extruder_nr, global_stack.extruders[extruder_nr].variant.getName()) machine_manager.setMaterial(extruder_nr, default_material_node, global_stack = global_stack) for global_stack, extruder_nr, container_id in self._package_used_qualities: - variant_names = [extruder.variant.getName() for extruder in global_stack.extruders.values()] - material_bases = [extruder.material.getMetaDataEntry("base_file") for extruder in global_stack.extruders.values()] - extruder_enabled = [extruder.isEnabled for extruder in global_stack.extruders.values()] + variant_names = [extruder.variant.getName() for extruder in global_stack.extrudersList] + material_bases = [extruder.material.getMetaDataEntry("base_file") for extruder in global_stack.extrudersList] + extruder_enabled = [extruder.isEnabled for extruder in global_stack.extrudersList] definition_id = global_stack.definition.getId() machine_node = container_tree.machines[definition_id] default_quality_group = machine_node.getQualityGroups(variant_names, material_bases, extruder_enabled)[machine_node.preferred_quality_type] From ea5530c507e02c4edb97ed12416fb94ed22d4dcc Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 6 Sep 2019 17:21:56 +0200 Subject: [PATCH 137/158] Add test for getting quality changes groups without global stack Shouldn't crash. Instead it should give no quality changes groups. Contributes to issue CURA-6600. --- tests/Machines/TestContainerTree.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/tests/Machines/TestContainerTree.py b/tests/Machines/TestContainerTree.py index ed54774acd..c6fbccc266 100644 --- a/tests/Machines/TestContainerTree.py +++ b/tests/Machines/TestContainerTree.py @@ -93,4 +93,12 @@ def test_getCurrentQualityGroups(container_registry, application): expected_material_base_files = ["current_global_stack_left_material_base_file", "current_global_stack_right_material_base_file"] expected_is_enabled = [True, True] - container_tree.machines["current_global_stack"].getQualityGroups.assert_called_with(expected_variant_names, expected_material_base_files, expected_is_enabled) \ No newline at end of file + container_tree.machines["current_global_stack"].getQualityGroups.assert_called_with(expected_variant_names, expected_material_base_files, expected_is_enabled) + +def test_getCurrentQualityChangesGroupsNoGlobalStack(container_registry): + with patch("UM.Settings.ContainerRegistry.ContainerRegistry.getInstance", MagicMock(return_value = container_registry)): + with patch("cura.CuraApplication.CuraApplication.getInstance", MagicMock(return_value = MagicMock(getGlobalContainerStack = MagicMock(return_value = None)))): + container_tree = ContainerTree() + result = container_tree.getCurrentQualityChangesGroups() + + assert len(result) == 0 \ No newline at end of file From 09025edffab2f382e7a7587955f1b6d5fcd25550 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 6 Sep 2019 17:22:40 +0200 Subject: [PATCH 138/158] Convert some class functions to static Since they didn't access any class attributes, there is no need for them to be classMethods --- .../XmlMaterialProfile/XmlMaterialProfile.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index b6eed915d9..9bacfedf50 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -43,11 +43,11 @@ class XmlMaterialProfile(InstanceContainer): # # \param xml_version: The version number found in an XML file. # \return The corresponding setting_version. - @classmethod - def xmlVersionToSettingVersion(cls, xml_version: str) -> int: + @staticmethod + def xmlVersionToSettingVersion(xml_version: str) -> int: if xml_version == "1.3": return CuraApplication.SettingVersion - return 0 #Older than 1.3. + return 0 # Older than 1.3. def getInheritedFiles(self): return self._inherited_files @@ -1134,8 +1134,8 @@ class XmlMaterialProfile(InstanceContainer): builder.data(data) builder.end(tag_name) - @classmethod - def _profile_name(cls, material_name, color_name): + @staticmethod + def _profile_name(material_name, color_name): if material_name is None: return "Unknown Material" if color_name != "Generic": @@ -1143,8 +1143,8 @@ class XmlMaterialProfile(InstanceContainer): else: return material_name - @classmethod - def getPossibleDefinitionIDsFromName(cls, name): + @staticmethod + def getPossibleDefinitionIDsFromName(name): name_parts = name.lower().split(" ") merged_name_parts = [] for part in name_parts: @@ -1182,8 +1182,8 @@ class XmlMaterialProfile(InstanceContainer): return product_to_id_map ## Parse the value of the "material compatible" property. - @classmethod - def _parseCompatibleValue(cls, value: str): + @staticmethod + def _parseCompatibleValue(value: str): return value in {"yes", "unknown"} ## Small string representation for debugging. From 7f192ce36fa53f17c4bc2ad9dc156f9a9beb7643 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 6 Sep 2019 17:25:07 +0200 Subject: [PATCH 139/158] Add test for getting current quality changes groups Similar to getting the current quality groups. Contributes to issue CURA-6600. --- tests/Machines/TestContainerTree.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/tests/Machines/TestContainerTree.py b/tests/Machines/TestContainerTree.py index c6fbccc266..173d607f2c 100644 --- a/tests/Machines/TestContainerTree.py +++ b/tests/Machines/TestContainerTree.py @@ -101,4 +101,19 @@ def test_getCurrentQualityChangesGroupsNoGlobalStack(container_registry): container_tree = ContainerTree() result = container_tree.getCurrentQualityChangesGroups() - assert len(result) == 0 \ No newline at end of file + assert len(result) == 0 + +def test_getCurrentQualityChangesGroups(container_registry, application): + with patch("UM.Settings.ContainerRegistry.ContainerRegistry.getInstance", MagicMock(return_value = container_registry)): + container_tree = ContainerTree() + container_tree.machines["current_global_stack"] = MagicMock() # Mock so that we can track whether the getQualityGroups function gets called with correct parameters. + + with patch("cura.CuraApplication.CuraApplication.getInstance", MagicMock(return_value = application)): + result = container_tree.getCurrentQualityChangesGroups() + + # As defined in the fixture for application. + expected_variant_names = ["current_global_stack_left_variant_name", "current_global_stack_right_variant_name"] + expected_material_base_files = ["current_global_stack_left_material_base_file", "current_global_stack_right_material_base_file"] + expected_is_enabled = [True, True] + + container_tree.machines["current_global_stack"].getQualityChangesGroups.assert_called_with(expected_variant_names, expected_material_base_files, expected_is_enabled) \ No newline at end of file From 6f92537305e60360643f3dee42194f59d0292029 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 6 Sep 2019 17:26:28 +0200 Subject: [PATCH 140/158] Add unhappy test for serializing nonbase material --- .../tests/TestXmlMaterialProfile.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/plugins/XmlMaterialProfile/tests/TestXmlMaterialProfile.py b/plugins/XmlMaterialProfile/tests/TestXmlMaterialProfile.py index 9658328c8a..e794117946 100644 --- a/plugins/XmlMaterialProfile/tests/TestXmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/tests/TestXmlMaterialProfile.py @@ -62,4 +62,19 @@ def test_setDirty(): material_1.setDirty(False) assert not material_1.isDirty() - assert material_2.isDirty() \ No newline at end of file + assert material_2.isDirty() + + +def test_serializeNonBaseMaterial(): + material_1 = createXmlMaterialProfile("herpderp") + material_1.getMetaData()["base_file"] = "omgzomg" + + container_registry = MagicMock() + container_registry.isReadOnly = MagicMock(return_value=False) + container_registry.findContainers = MagicMock(return_value=[material_1]) + + with patch("UM.Settings.ContainerRegistry.ContainerRegistry.getInstance", MagicMock(return_value=container_registry)): + with pytest.raises(NotImplementedError): + # This material is not a base material, so it can't be serialized! + material_1.serialize() + \ No newline at end of file From 5106d3b7c1cf64452c052141099318481e346488 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 6 Sep 2019 17:26:38 +0200 Subject: [PATCH 141/158] Test if we actually return the result of the call to getQuality[Changes]Groups Contributes to issue CURA-6600. --- tests/Machines/TestContainerTree.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/Machines/TestContainerTree.py b/tests/Machines/TestContainerTree.py index 173d607f2c..833f2b651e 100644 --- a/tests/Machines/TestContainerTree.py +++ b/tests/Machines/TestContainerTree.py @@ -94,6 +94,7 @@ def test_getCurrentQualityGroups(container_registry, application): expected_is_enabled = [True, True] container_tree.machines["current_global_stack"].getQualityGroups.assert_called_with(expected_variant_names, expected_material_base_files, expected_is_enabled) + assert result == container_tree.machines["current_global_stack"].getQualityGroups.return_value def test_getCurrentQualityChangesGroupsNoGlobalStack(container_registry): with patch("UM.Settings.ContainerRegistry.ContainerRegistry.getInstance", MagicMock(return_value = container_registry)): @@ -116,4 +117,5 @@ def test_getCurrentQualityChangesGroups(container_registry, application): expected_material_base_files = ["current_global_stack_left_material_base_file", "current_global_stack_right_material_base_file"] expected_is_enabled = [True, True] - container_tree.machines["current_global_stack"].getQualityChangesGroups.assert_called_with(expected_variant_names, expected_material_base_files, expected_is_enabled) \ No newline at end of file + container_tree.machines["current_global_stack"].getQualityChangesGroups.assert_called_with(expected_variant_names, expected_material_base_files, expected_is_enabled) + assert result == container_tree.machines["current_global_stack"].getQualityChangesGroups.return_value \ No newline at end of file From 7d3a2c60d4996c54bdc38e24aeedd2005a0c535f Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 6 Sep 2019 17:38:22 +0200 Subject: [PATCH 142/158] Added some missing typing --- plugins/XmlMaterialProfile/XmlMaterialProfile.py | 10 +++++----- .../XmlMaterialProfile/tests/TestXmlMaterialProfile.py | 1 - 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index 9bacfedf50..04ed112aa1 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -6,7 +6,7 @@ import io import json #To parse the product-to-id mapping file. import os.path #To find the product-to-id mapping. import sys -from typing import Any, Dict, List, Optional, Tuple, cast, Set +from typing import Any, Dict, List, Optional, Tuple, cast, Set, Union import xml.etree.ElementTree as ET from UM.Resources import Resources @@ -837,9 +837,9 @@ class XmlMaterialProfile(InstanceContainer): ContainerRegistry.getInstance().addContainer(container_to_add) @classmethod - def _getSettingsDictForNode(cls, node) -> Tuple[dict, dict]: - node_mapped_settings_dict = dict() - node_unmapped_settings_dict = dict() + def _getSettingsDictForNode(cls, node) -> Tuple[Dict[str, Any], Dict[str, Any]]: + node_mapped_settings_dict = dict() # type: Dict[str, Any] + node_unmapped_settings_dict = dict() # type: Dict[str, Any] # Fetch settings in the "um" namespace um_settings = node.iterfind("./um:setting", cls.__namespaces) @@ -1212,7 +1212,7 @@ class XmlMaterialProfile(InstanceContainer): "break position": "material_break_retracted_position", "break speed": "material_break_speed", "break temperature": "material_break_temperature" - } + } # type: Dict[str, str] __unmapped_settings = [ "hardware compatible", "hardware recommended" diff --git a/plugins/XmlMaterialProfile/tests/TestXmlMaterialProfile.py b/plugins/XmlMaterialProfile/tests/TestXmlMaterialProfile.py index e794117946..1bc19f773a 100644 --- a/plugins/XmlMaterialProfile/tests/TestXmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/tests/TestXmlMaterialProfile.py @@ -77,4 +77,3 @@ def test_serializeNonBaseMaterial(): with pytest.raises(NotImplementedError): # This material is not a base material, so it can't be serialized! material_1.serialize() - \ No newline at end of file From 178887d8e511d06475b4099bc3283cffc991c855 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 6 Sep 2019 17:40:31 +0200 Subject: [PATCH 143/158] Add test for getting metadata from machine node Contributes to issue CURA-6600. --- tests/Machines/TestMachineNode.py | 34 ++++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/tests/Machines/TestMachineNode.py b/tests/Machines/TestMachineNode.py index 43aa6f0476..d2ab108251 100644 --- a/tests/Machines/TestMachineNode.py +++ b/tests/Machines/TestMachineNode.py @@ -4,14 +4,24 @@ import pytest from UM.Settings.Interfaces import ContainerInterface from cura.Machines.MachineNode import MachineNode -metadata_dict = {} +metadata_dict = { + "has_materials": "false", + "has_variants": "true", + "has_machine_materials": "true", + "has_machine_quality": "true", + "quality_definition": "test_quality_definition", + "exclude_materials": ["excluded_material_1", "excluded_material_2"], + "preferred_variant_name": "beautiful_nozzle", + "preferred_material": "beautiful_material", + "preferred_quality_type": "beautiful_quality_type" +} @pytest.fixture def container_registry(): result = MagicMock() result.findInstanceContainersMetadata = MagicMock(return_value = [{"id": "variant_1", "name": "Variant One", "quality_type": "normal"}, {"id": "variant_2", "name": "Variant Two", "quality_type": "great"}]) - result.findContainersMetadata = MagicMock(return_value = [{"has_variants": True}]) + result.findContainersMetadata = MagicMock(return_value = [metadata_dict]) return result @@ -21,14 +31,14 @@ def getMetadataEntrySideEffect(*args, **kwargs): def createMockedInstanceContainer(): result = MagicMock(spec = ContainerInterface) - result.getMetaDataEntry = MagicMock(side_effect=getMetadataEntrySideEffect) + result.getMetaDataEntry = MagicMock(side_effect = getMetadataEntrySideEffect) return result def createMachineNode(container_id, container_registry): with patch("cura.Machines.MachineNode.VariantNode"): # We're not testing the variant node here, so patch it out. with patch("cura.Machines.MachineNode.QualityNode"): - with patch("UM.Settings.ContainerRegistry.ContainerRegistry.getInstance", MagicMock(return_value=container_registry)): + with patch("UM.Settings.ContainerRegistry.ContainerRegistry.getInstance", MagicMock(return_value = container_registry)): return MachineNode(container_id) @@ -38,4 +48,18 @@ def test_machineNodeInit(container_registry): # As variants get stored by name, we want to check if those get added. assert "Variant One" in machine_node.variants assert "Variant Two" in machine_node.variants - assert len(machine_node.variants) == 2 # And ensure that *only* those two got added. \ No newline at end of file + assert len(machine_node.variants) == 2 # And ensure that *only* those two got added. + +def test_metadataProperties(container_registry): + node = createMachineNode("machine_1", container_registry) + + # Check if each of the metadata entries got stored properly. + assert not node.has_materials + assert node.has_variants + assert node.has_machine_materials + assert node.has_machine_quality + assert node.quality_definition == metadata_dict["quality_definition"] + assert node.exclude_materials == metadata_dict["exclude_materials"] + assert node.preferred_variant_name == metadata_dict["preferred_variant_name"] + assert node.preferred_material == metadata_dict["preferred_material"] + assert node.preferred_quality_type == metadata_dict["preferred_quality_type"] \ No newline at end of file From 5e302c6a676b336e0cd223770a3533c057680ed1 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 18 Jul 2019 23:32:30 +0200 Subject: [PATCH 144/158] Fix display of Z Hop After Extruder Switch Height on single extruder If the setting is enabled on a single extruder printer, it'll show the Z Hop Height setting anyway even though it has no effect. --- 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 3a0d80c27b..226e66c9ae 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -3890,7 +3890,7 @@ "value": "retraction_hop", "minimum_value_warning": "0", "maximum_value_warning": "10", - "enabled": "retraction_enable and retraction_hop_after_extruder_switch", + "enabled": "retraction_enable and retraction_hop_after_extruder_switch and extruders_enabled_count > 1", "settable_per_mesh": false, "settable_per_extruder": true } From 354729b6216e069130815b43ecd71b11dc4c83dc Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Sat, 7 Sep 2019 23:19:59 +0200 Subject: [PATCH 145/158] Only show support flow if support is enabled --- resources/definitions/fdmprinter.def.json | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 226e66c9ae..9ad2964e0d 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -2510,6 +2510,7 @@ "minimum_value": "5", "minimum_value_warning": "50", "maximum_value_warning": "150", + "enabled": "support_enable", "limit_to_extruder": "support_infill_extruder_nr", "settable_per_mesh": false, "settable_per_extruder": true From 5463f7600bcfb6594417f612849ff5063a7e09bd Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 9 Sep 2019 09:08:18 +0200 Subject: [PATCH 146/158] Add processEvent calls so progress bar moves while loading CURA-6572 --- plugins/3MFReader/ThreeMFWorkspaceReader.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index de1049403e..7154a114a9 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -33,6 +33,8 @@ from cura.Settings.CuraContainerStack import _ContainerIndexes from cura.CuraApplication import CuraApplication from cura.Utils.Threading import call_on_qt_thread +from PyQt5.QtCore import QCoreApplication + from .WorkspaceDialog import WorkspaceDialog i18n_catalog = i18nCatalog("cura") @@ -230,6 +232,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): else: Logger.log("w", "Unknown definition container type %s for %s", definition_container_type, definition_container_file) + QCoreApplication.processEvents() # Ensure that the GUI does not freeze. Job.yieldThread() if machine_definition_container_count != 1: @@ -256,6 +259,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): containers_found_dict["material"] = True if not self._container_registry.isReadOnly(container_id): # Only non readonly materials can be in conflict material_conflict = True + QCoreApplication.processEvents() # Ensure that the GUI does not freeze. Job.yieldThread() # Check if any quality_changes instance container is in conflict. @@ -325,7 +329,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): # Ignore certain instance container types Logger.log("w", "Ignoring instance container [%s] with type [%s]", container_id, container_type) continue - + QCoreApplication.processEvents() # Ensure that the GUI does not freeze. Job.yieldThread() if self._machine_info.quality_changes_info.global_info is None: @@ -402,7 +406,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): variant_id = parser["containers"][str(_ContainerIndexes.Variant)] if variant_id not in ("empty", "empty_variant"): self._machine_info.variant_info = instance_container_info_dict[variant_id] - + QCoreApplication.processEvents() # Ensure that the GUI does not freeze. Job.yieldThread() # if the global stack is found, we check if there are conflicts in the extruder stacks @@ -657,6 +661,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): definition_container = self._container_registry.findDefinitionContainers(id = "fdmprinter")[0] #Fall back to defaults. self._container_registry.addContainer(definition_container) Job.yieldThread() + QCoreApplication.processEvents() # Ensure that the GUI does not freeze. Logger.log("d", "Workspace loading is checking materials...") # Get all the material files and check if they exist. If not, add them. @@ -706,6 +711,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): material_container.setDirty(True) self._container_registry.addContainer(material_container) Job.yieldThread() + QCoreApplication.processEvents() # Ensure that the GUI does not freeze. # Handle quality changes if any self._processQualityChanges(global_stack) From 669fb39f40a85eac8f3b739903c3a3c4f30f22c6 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Mon, 9 Sep 2019 10:44:17 +0200 Subject: [PATCH 147/158] Catch type errors when trying to populate models from API response --- plugins/UM3NetworkPrinting/src/Network/ClusterApiClient.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/UM3NetworkPrinting/src/Network/ClusterApiClient.py b/plugins/UM3NetworkPrinting/src/Network/ClusterApiClient.py index 951b69977d..f61982b9a8 100644 --- a/plugins/UM3NetworkPrinting/src/Network/ClusterApiClient.py +++ b/plugins/UM3NetworkPrinting/src/Network/ClusterApiClient.py @@ -135,7 +135,7 @@ class ClusterApiClient: result = model_class(**response) # type: ClusterApiClientModel on_finished_item = cast(Callable[[ClusterApiClientModel], Any], on_finished) on_finished_item(result) - except JSONDecodeError: + except (JSONDecodeError, TypeError): Logger.log("e", "Could not parse response from network: %s", str(response)) ## Creates a callback function so that it includes the parsing of the response into the correct model. From ea8b7ebd0216bffcc5a01c2aad125c86e82bcf93 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 9 Sep 2019 11:49:14 +0200 Subject: [PATCH 148/158] Fix remove all nodes for loaded gcode Fixes the problem caused in UM commit 69057b48a1fc3df7c5c6f3e754a3beb285a94678 --- cura/CuraApplication.py | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index bb64d7fd8e..ef85bf7457 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -1821,3 +1821,40 @@ class CuraApplication(QtApplication): return main_window.height() else: return 0 + + @pyqtSlot() + def deleteAll(self, only_selectable: bool = True) -> None: + super().deleteAll(only_selectable = only_selectable) + + # Also remove nodes with LayerData + self._removeNodesWithLayerData(only_selectable = only_selectable) + + def _removeNodesWithLayerData(self, only_selectable: bool = True) -> None: + Logger.log("i", "Clearing scene") + nodes = [] + for node in DepthFirstIterator(self.getController().getScene().getRoot()): + if not isinstance(node, SceneNode): + continue + if not node.isEnabled(): + continue + 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 only_selectable and not node.isSelectable(): + continue # Only remove nodes that are selectable. + if not node.callDecoration("isSliceable") and not node.callDecoration("getLayerData") and not node.callDecoration("isGroup"): + continue # Grouped nodes don't need resetting as their parent (the group) is resetted) + nodes.append(node) + if nodes: + from UM.Operations.GroupedOperation import GroupedOperation + op = GroupedOperation() + + for node in nodes: + from UM.Operations.RemoveSceneNodeOperation import RemoveSceneNodeOperation + op.addOperation(RemoveSceneNodeOperation(node)) + + # Reset the print information + self.getController().getScene().sceneChanged.emit(node) + + op.push() + from UM.Scene.Selection import Selection + Selection.clear() From eb401defdf21b26f5ee153eb933a74696634a2a5 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 9 Sep 2019 14:21:28 +0200 Subject: [PATCH 149/158] Add deprecated marker on extruders: Use extruderList Extruders is dangerous because it's a dict of which the values are randomly ordered. The keys are often cast to int so you can't use anything else than integer numbers. And then they are often cast back so if you're not properly counting from 0 you're also in trouble. So please, only use the list. Eventually we can switch the data structure around. --- cura/Settings/GlobalStack.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/cura/Settings/GlobalStack.py b/cura/Settings/GlobalStack.py index 7efc263180..bead31b4e4 100755 --- a/cura/Settings/GlobalStack.py +++ b/cura/Settings/GlobalStack.py @@ -1,4 +1,4 @@ -# Copyright (c) 2018 Ultimaker B.V. +# Copyright (c) 2019 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. from collections import defaultdict @@ -8,7 +8,7 @@ import uuid from PyQt5.QtCore import pyqtProperty, pyqtSlot, pyqtSignal -from UM.Decorators import override +from UM.Decorators import deprecated, override from UM.MimeTypeDatabase import MimeType, MimeTypeDatabase from UM.Settings.ContainerStack import ContainerStack from UM.Settings.SettingInstance import InstanceState @@ -61,12 +61,13 @@ class GlobalStack(CuraContainerStack): # # \return The extruders registered with this stack. @pyqtProperty("QVariantMap", notify = extrudersChanged) + @deprecated("Please use extruderList instead.", "4.4") def extruders(self) -> Dict[str, "ExtruderStack"]: return self._extruders @pyqtProperty("QVariantList", notify = extrudersChanged) def extruderList(self) -> List["ExtruderStack"]: - result_tuple_list = sorted(list(self.extruders.items()), key=lambda x: int(x[0])) + result_tuple_list = sorted(list(self._extruders.items()), key=lambda x: int(x[0])) result_list = [item[1] for item in result_tuple_list] machine_extruder_count = self.getProperty("machine_extruder_count", "value") From 04e2ecde9355a7dd5838b4a178418c0a0d6ec1bb Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 9 Sep 2019 16:12:35 +0200 Subject: [PATCH 150/158] Init intent to empty_intent_container for new machine stacks CURA-6598 --- cura/Settings/CuraStackBuilder.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cura/Settings/CuraStackBuilder.py b/cura/Settings/CuraStackBuilder.py index 30eb0b009c..33b0fd8d2e 100644 --- a/cura/Settings/CuraStackBuilder.py +++ b/cura/Settings/CuraStackBuilder.py @@ -160,6 +160,7 @@ class CuraStackBuilder: stack.variant = variant_container stack.material = material_container stack.quality = quality_container + stack.intent = application.empty_intent_container stack.qualityChanges = application.empty_quality_changes_container stack.userChanges = user_container @@ -208,6 +209,7 @@ class CuraStackBuilder: stack.variant = variant_container stack.material = material_container stack.quality = quality_container + stack.intent = application.empty_intent_container stack.qualityChanges = application.empty_quality_changes_container stack.userChanges = user_container From dba3b77f61fa265f0e284a6a8304fa9c47902658 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 9 Sep 2019 16:45:03 +0200 Subject: [PATCH 151/158] Fix tests CURA-6598 --- tests/Settings/TestCuraStackBuilder.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/tests/Settings/TestCuraStackBuilder.py b/tests/Settings/TestCuraStackBuilder.py index 9f2db2cf19..7a1e05296c 100644 --- a/tests/Settings/TestCuraStackBuilder.py +++ b/tests/Settings/TestCuraStackBuilder.py @@ -28,6 +28,14 @@ def quality_container(): return container +@pytest.fixture +def intent_container(): + container = InstanceContainer(container_id="intent container") + container.setMetaDataEntry("type", "intent") + + return container + + @pytest.fixture def quality_changes_container(): container = InstanceContainer(container_id="quality changes container") @@ -44,7 +52,8 @@ def test_createMachineWithUnknownDefinition(application, container_registry): assert mocked_config_error.addFaultyContainers.called_with("NOPE") -def test_createMachine(application, container_registry, definition_container, global_variant, material_instance_container, quality_container, quality_changes_container): +def test_createMachine(application, container_registry, definition_container, global_variant, material_instance_container, + quality_container, intent_container, quality_changes_container): variant_manager = MagicMock(name = "Variant Manager") quality_manager = MagicMock(name = "Quality Manager") global_variant_node = MagicMock( name = "global variant node") @@ -61,6 +70,7 @@ def test_createMachine(application, container_registry, definition_container, gl application.getQualityManager = MagicMock(return_value = quality_manager) application.empty_material_container = material_instance_container application.empty_quality_container = quality_container + application.empty_intent_container = intent_container application.empty_quality_changes_container = quality_changes_container application.empty_variant_container = global_variant @@ -83,9 +93,11 @@ def test_createMachine(application, container_registry, definition_container, gl assert machine.variant == global_variant -def test_createExtruderStack(application, definition_container, global_variant, material_instance_container, quality_container, quality_changes_container): +def test_createExtruderStack(application, definition_container, global_variant, material_instance_container, + quality_container, intent_container, quality_changes_container): application.empty_material_container = material_instance_container application.empty_quality_container = quality_container + application.empty_intent_container = intent_container application.empty_quality_changes_container = quality_changes_container with patch("cura.CuraApplication.CuraApplication.getInstance", MagicMock(return_value=application)): extruder_stack = CuraStackBuilder.createExtruderStack("Whatever", definition_container, "meh", 0, global_variant, material_instance_container, quality_container) From 5debdd4cf677b7a67f848374dbfe844241c6a824 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 9 Sep 2019 16:47:29 +0200 Subject: [PATCH 152/158] Fix getting extruder list everywhere Didn't test this beyond my own automated test, it seems. Contributes to issue CURA-6600. --- cura/Machines/ContainerTree.py | 12 ++++++------ cura/Machines/QualityManager.py | 12 ++++++------ plugins/Toolbox/src/Toolbox.py | 6 +++--- tests/Machines/TestContainerTree.py | 2 +- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/cura/Machines/ContainerTree.py b/cura/Machines/ContainerTree.py index c75f305885..2af022601a 100644 --- a/cura/Machines/ContainerTree.py +++ b/cura/Machines/ContainerTree.py @@ -53,9 +53,9 @@ class ContainerTree: global_stack = cura.CuraApplication.CuraApplication.getInstance().getGlobalContainerStack() if global_stack is None: return {} - variant_names = [extruder.variant.getName() for extruder in global_stack.extrudersList] - material_bases = [extruder.material.getMetaDataEntry("base_file") for extruder in global_stack.extrudersList] - extruder_enabled = [extruder.isEnabled for extruder in global_stack.extrudersList] + variant_names = [extruder.variant.getName() for extruder in global_stack.extruderList] + material_bases = [extruder.material.getMetaDataEntry("base_file") for extruder in global_stack.extruderList] + extruder_enabled = [extruder.isEnabled for extruder in global_stack.extruderList] return self.machines[global_stack.definition.getId()].getQualityGroups(variant_names, material_bases, extruder_enabled) ## Get the quality changes groups available for the currently activated @@ -69,9 +69,9 @@ class ContainerTree: global_stack = cura.CuraApplication.CuraApplication.getInstance().getGlobalContainerStack() if global_stack is None: return [] - variant_names = [extruder.variant.getName() for extruder in global_stack.extrudersList] - material_bases = [extruder.material.getMetaDataEntry("base_file") for extruder in global_stack.extrudersList] - extruder_enabled = [extruder.isEnabled for extruder in global_stack.extrudersList] + variant_names = [extruder.variant.getName() for extruder in global_stack.extruderList] + material_bases = [extruder.material.getMetaDataEntry("base_file") for extruder in global_stack.extruderList] + extruder_enabled = [extruder.isEnabled for extruder in global_stack.extruderList] return self.machines[global_stack.definition.getId()].getQualityChangesGroups(variant_names, material_bases, extruder_enabled) ## Builds the initial container tree. diff --git a/cura/Machines/QualityManager.py b/cura/Machines/QualityManager.py index 699e6731a0..4a5a4c0885 100644 --- a/cura/Machines/QualityManager.py +++ b/cura/Machines/QualityManager.py @@ -77,9 +77,9 @@ class QualityManager(QObject): # Returns a dict of "custom profile name" -> QualityChangesGroup def getQualityChangesGroups(self, machine: "GlobalStack") -> List[QualityChangesGroup]: - variant_names = [extruder.variant.getName() for extruder in machine.extrudersList] - material_bases = [extruder.material.getMetaDataEntry("base_file") for extruder in machine.extrudersList] - extruder_enabled = [extruder.isEnabled for extruder in machine.extrudersList] + variant_names = [extruder.variant.getName() for extruder in machine.extruderList] + material_bases = [extruder.material.getMetaDataEntry("base_file") for extruder in machine.extruderList] + extruder_enabled = [extruder.isEnabled for extruder in machine.extruderList] machine_node = ContainerTree.getInstance().machines[machine.definition.getId()] return machine_node.getQualityChangesGroups(variant_names, material_bases, extruder_enabled) @@ -92,9 +92,9 @@ class QualityManager(QObject): # for those types as values. def getQualityGroups(self, global_stack: "GlobalStack") -> Dict[str, QualityGroup]: # Gather up the variant names and material base files for each extruder. - variant_names = [extruder.variant.getName() for extruder in global_stack.extrudersList] - material_bases = [extruder.material.getMetaDataEntry("base_file") for extruder in global_stack.extrudersList] - extruder_enabled = [extruder.isEnabled for extruder in global_stack.extrudersList] + variant_names = [extruder.variant.getName() for extruder in global_stack.extruderList] + material_bases = [extruder.material.getMetaDataEntry("base_file") for extruder in global_stack.extruderList] + extruder_enabled = [extruder.isEnabled for extruder in global_stack.extruderList] definition_id = global_stack.definition.getId() return ContainerTree.getInstance().machines[definition_id].getQualityGroups(variant_names, material_bases, extruder_enabled) diff --git a/plugins/Toolbox/src/Toolbox.py b/plugins/Toolbox/src/Toolbox.py index 40aacac056..641340db17 100644 --- a/plugins/Toolbox/src/Toolbox.py +++ b/plugins/Toolbox/src/Toolbox.py @@ -368,9 +368,9 @@ class Toolbox(QObject, Extension): default_material_node = material_manager.getDefaultMaterial(global_stack, extruder_nr, global_stack.extruders[extruder_nr].variant.getName()) machine_manager.setMaterial(extruder_nr, default_material_node, global_stack = global_stack) for global_stack, extruder_nr, container_id in self._package_used_qualities: - variant_names = [extruder.variant.getName() for extruder in global_stack.extrudersList] - material_bases = [extruder.material.getMetaDataEntry("base_file") for extruder in global_stack.extrudersList] - extruder_enabled = [extruder.isEnabled for extruder in global_stack.extrudersList] + variant_names = [extruder.variant.getName() for extruder in global_stack.extruderList] + material_bases = [extruder.material.getMetaDataEntry("base_file") for extruder in global_stack.extruderList] + extruder_enabled = [extruder.isEnabled for extruder in global_stack.extruderList] definition_id = global_stack.definition.getId() machine_node = container_tree.machines[definition_id] default_quality_group = machine_node.getQualityGroups(variant_names, material_bases, extruder_enabled)[machine_node.preferred_quality_type] diff --git a/tests/Machines/TestContainerTree.py b/tests/Machines/TestContainerTree.py index 833f2b651e..1c7b0de1da 100644 --- a/tests/Machines/TestContainerTree.py +++ b/tests/Machines/TestContainerTree.py @@ -20,7 +20,7 @@ def createMockedStack(definition_id: str): extruder_right_mock.material.getMetaDataEntry = MagicMock(return_value = definition_id + "_right_material_base_file") extruder_right_mock.isEnabled = True extruder_list = [extruder_left_mock, extruder_right_mock] - result.extrudersList = extruder_list + result.extruderList = extruder_list return result From a43de1911314b01a0ae87fd977d09e7a3fa00012 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 9 Sep 2019 17:36:14 +0200 Subject: [PATCH 153/158] Reduce size of print head without fans for one-at-a-time mode This allows you to place models more compactly. According to the discussion at #5590, this was tested to work well. Fixes #5590. --- resources/definitions/creality_ender3.def.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/resources/definitions/creality_ender3.def.json b/resources/definitions/creality_ender3.def.json index 4b7da65e4e..645be52bc8 100644 --- a/resources/definitions/creality_ender3.def.json +++ b/resources/definitions/creality_ender3.def.json @@ -13,10 +13,10 @@ "machine_depth": { "default_value": 220 }, "machine_height": { "default_value": 250 }, "machine_head_polygon": { "default_value": [ - [-26, 34], - [-26, -32], - [22, -32], - [22, 34] + [-1, 1], + [-1, -1], + [1, -1], + [1, 1] ] }, "machine_head_with_fans_polygon": { "default_value": [ From 8c817e041ee1ca9a98ac4a6dfe6274ee8b5893cd Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 9 Sep 2019 17:36:14 +0200 Subject: [PATCH 154/158] Reduce size of print head without fans for one-at-a-time mode This allows you to place models more compactly. According to the discussion at #5590, this was tested to work well. Fixes #5590. --- resources/definitions/creality_ender3.def.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/resources/definitions/creality_ender3.def.json b/resources/definitions/creality_ender3.def.json index 4b7da65e4e..645be52bc8 100644 --- a/resources/definitions/creality_ender3.def.json +++ b/resources/definitions/creality_ender3.def.json @@ -13,10 +13,10 @@ "machine_depth": { "default_value": 220 }, "machine_height": { "default_value": 250 }, "machine_head_polygon": { "default_value": [ - [-26, 34], - [-26, -32], - [22, -32], - [22, 34] + [-1, 1], + [-1, -1], + [1, -1], + [1, 1] ] }, "machine_head_with_fans_polygon": { "default_value": [ From ef8b9e98d1a8a88d17d40e66bae028044738af6f Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 10 Sep 2019 14:47:36 +0200 Subject: [PATCH 155/158] Remove calls to quality manager's private functions It should never have been called that way. Contributes to issue CURA-6600. --- plugins/3MFReader/ThreeMFWorkspaceReader.py | 64 +++++++++++++++------ 1 file changed, 46 insertions(+), 18 deletions(-) diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index c9efc37bb5..00d7252875 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -1,10 +1,10 @@ -# Copyright (c) 2018 Ultimaker B.V. +# Copyright (c) 2019 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. from configparser import ConfigParser import zipfile import os -from typing import Dict, List, Tuple, cast +from typing import cast, Dict, List, Optional, Tuple import xml.etree.ElementTree as ET @@ -23,8 +23,8 @@ from UM.Settings.ContainerRegistry import ContainerRegistry from UM.MimeTypeDatabase import MimeTypeDatabase, MimeType from UM.Job import Job from UM.Preferences import Preferences -from cura.Machines.ContainerTree import ContainerTree +from cura.Machines.ContainerTree import ContainerTree from cura.Machines.VariantType import VariantType from cura.Settings.CuraStackBuilder import CuraStackBuilder from cura.Settings.ExtruderManager import ExtruderManager @@ -42,7 +42,7 @@ i18n_catalog = i18nCatalog("cura") class ContainerInfo: - def __init__(self, file_name: str, serialized: str, parser: ConfigParser) -> None: + def __init__(self, file_name: Optional[str], serialized: Optional[str], parser: Optional[ConfigParser]) -> None: self.file_name = file_name self.serialized = serialized self.parser = parser @@ -579,9 +579,9 @@ class ThreeMFWorkspaceReader(WorkspaceReader): signals = [container_registry.containerAdded, container_registry.containerRemoved, container_registry.containerMetaDataChanged] - # - # We now have different managers updating their lookup tables upon container changes. It is critical to make - # sure that the managers have a complete set of data when they update. + # The container tree updates its lookup tables upon container changes. + # It is critical to make sure that it has a complete set of data when it + # updates. # # In project loading, lots of the container-related signals are loosely emitted, which can create timing gaps # for incomplete data update or other kinds of issues to happen. @@ -747,7 +747,6 @@ class ThreeMFWorkspaceReader(WorkspaceReader): return application = CuraApplication.getInstance() - quality_manager = application.getQualityManager() # If we have custom profiles, load them quality_changes_name = self._machine_info.quality_changes_info.name @@ -773,11 +772,8 @@ class ThreeMFWorkspaceReader(WorkspaceReader): extruder_stack = None if position is not None: extruder_stack = global_stack.extruders[position] - container = quality_manager._createQualityChanges(quality_changes_quality_type, - quality_changes_name, - global_stack, extruder_stack) + container = self._createNewQualityChanges(quality_changes_quality_type, quality_changes_name, global_stack, extruder_stack) container_info.container = container - container.setDirty(True) self._container_registry.addContainer(container) Logger.log("d", "Created new quality changes container [%s]", container.getId()) @@ -806,10 +802,8 @@ class ThreeMFWorkspaceReader(WorkspaceReader): ExtruderManager.getInstance().fixSingleExtrusionMachineExtruderDefinition(global_stack) extruder_stack = global_stack.extruders["0"] - container = quality_manager._createQualityChanges(quality_changes_quality_type, quality_changes_name, - global_stack, extruder_stack) + container = self._createNewQualityChanges(quality_changes_quality_type, quality_changes_name, global_stack, extruder_stack) container_info.container = container - container.setDirty(True) self._container_registry.addContainer(container) Logger.log("d", "Created new quality changes container [%s]", container.getId()) @@ -835,10 +829,8 @@ class ThreeMFWorkspaceReader(WorkspaceReader): if container_info.container is None: extruder_stack = global_stack.extruders[position] - container = quality_manager._createQualityChanges(quality_changes_quality_type, quality_changes_name, - global_stack, extruder_stack) + container = self._createNewQualityChanges(quality_changes_quality_type, quality_changes_name, global_stack, extruder_stack) container_info.container = container - container.setDirty(True) self._container_registry.addContainer(container) for key, value in container_info.parser["values"].items(): @@ -846,6 +838,42 @@ class ThreeMFWorkspaceReader(WorkspaceReader): self._machine_info.quality_changes_info.name = quality_changes_name + ## Helper class to create a new quality changes profile. + # + # This will then later be filled with the appropriate data. + # \param quality_type The quality type of the new profile. + # \param name The name for the profile. This will later be made unique so + # it doesn't need to be unique yet. + # \param global_stack The global stack showing the configuration that the + # profile should be created for. + # \param extruder_stack The extruder stack showing the configuration that + # the profile should be created for. If this is None, it will be created + # for the global stack. + def _createNewQualityChanges(self, quality_type: str, name: str, global_stack: GlobalStack, extruder_stack: Optional[ExtruderStack]) -> InstanceContainer: + container_registry = CuraApplication.getInstance().getContainerRegistry() + base_id = global_stack.definition.getId() if extruder_stack is None else extruder_stack.getId() + new_id = base_id + "_" + name + new_id = new_id.lower().replace(" ", "_") + new_id = container_registry.uniqueName(new_id) + + # Create a new quality_changes container for the quality. + quality_changes = InstanceContainer(new_id) + quality_changes.setName(name) + quality_changes.setMetaDataEntry("type", "quality_changes") + quality_changes.setMetaDataEntry("quality_type", quality_type) + + # If we are creating a container for an extruder, ensure we add that to the container. + if extruder_stack is not None: + quality_changes.setMetaDataEntry("position", extruder_stack.getMetaDataEntry("position")) + + # If the machine specifies qualities should be filtered, ensure we match the current criteria. + machine_definition_id = ContainerTree.getInstance().machines[global_stack.definition.getId()].quality_definition + quality_changes.setDefinition(machine_definition_id) + + quality_changes.setMetaDataEntry("setting_version", CuraApplication.getInstance().SettingVersion) + quality_changes.setDirty(True) + return quality_changes + @staticmethod def _clearStack(stack): application = CuraApplication.getInstance() From 0d68381e612b758c9c458303829b211b78247904 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 10 Sep 2019 14:52:51 +0200 Subject: [PATCH 156/158] Code style: brackets on new line Contributes to issue CURA-6600. --- resources/qml/Preferences/ProfilesPage.qml | 105 ++++++++++++++------- 1 file changed, 71 insertions(+), 34 deletions(-) diff --git a/resources/qml/Preferences/ProfilesPage.qml b/resources/qml/Preferences/ProfilesPage.qml index 56fdd570a8..4d766e6618 100644 --- a/resources/qml/Preferences/ProfilesPage.qml +++ b/resources/qml/Preferences/ProfilesPage.qml @@ -21,9 +21,11 @@ Item UM.I18nCatalog { id: catalog; name: "cura"; } - Label { + Label + { id: titleLabel - anchors { + anchors + { top: parent.top left: parent.left right: parent.right @@ -35,28 +37,33 @@ Item property var hasCurrentItem: base.currentItem != null - property var currentItem: { + property var currentItem: + { var current_index = qualityListView.currentIndex; return (current_index == -1) ? null : base.qualityManagementModel.getItem(current_index); } property var currentItemName: hasCurrentItem ? base.currentItem.name : "" - property var isCurrentItemActivated: { - if (!base.currentItem) { + property var isCurrentItemActivated: + { + if (!base.currentItem) + { return false; } return base.currentItem.name == Cura.MachineManager.activeQualityOrQualityChangesName; } - property var canCreateProfile: { + property var canCreateProfile: + { return isCurrentItemActivated && Cura.MachineManager.hasUserSettings; } Row // Button Row { id: buttonRow - anchors { + anchors + { left: parent.left right: parent.right top: titleLabel.bottom @@ -70,10 +77,14 @@ Item text: catalog.i18nc("@action:button", "Activate") iconName: "list-activate" enabled: !isCurrentItemActivated - onClicked: { - if (base.currentItem.is_read_only) { + onClicked: + { + if (base.currentItem.is_read_only) + { Cura.MachineManager.setQualityGroup(base.currentItem.quality_group); - } else { + } + else + { Cura.MachineManager.setQualityChangesGroup(base.currentItem.quality_changes_group); } } @@ -88,7 +99,8 @@ Item enabled: base.canCreateProfile && !Cura.MachineManager.stacksHaveErrors visible: base.canCreateProfile - onClicked: { + onClicked: + { createQualityDialog.object = Cura.ContainerManager.makeUniqueName(base.currentItem.name); createQualityDialog.open(); createQualityDialog.selectText(); @@ -104,7 +116,8 @@ Item enabled: !base.canCreateProfile visible: !base.canCreateProfile - onClicked: { + onClicked: + { duplicateQualityDialog.object = Cura.ContainerManager.makeUniqueName(base.currentItem.name); duplicateQualityDialog.open(); duplicateQualityDialog.selectText(); @@ -118,7 +131,8 @@ Item text: catalog.i18nc("@action:button", "Remove") iconName: "list-remove" enabled: base.hasCurrentItem && !base.currentItem.is_read_only && !base.isCurrentItemActivated - onClicked: { + onClicked: + { forceActiveFocus(); confirmRemoveQualityDialog.open(); } @@ -131,7 +145,8 @@ Item text: catalog.i18nc("@action:button", "Rename") iconName: "edit-rename" enabled: base.hasCurrentItem && !base.currentItem.is_read_only - onClicked: { + onClicked: + { renameQualityDialog.object = base.currentItem.name; renameQualityDialog.open(); renameQualityDialog.selectText(); @@ -144,7 +159,8 @@ Item id: importMenuButton text: catalog.i18nc("@action:button", "Import") iconName: "document-import" - onClicked: { + onClicked: + { importDialog.open(); } } @@ -156,7 +172,8 @@ Item text: catalog.i18nc("@action:button", "Export") iconName: "document-export" enabled: base.hasCurrentItem && !base.currentItem.is_read_only - onClicked: { + onClicked: + { exportDialog.open(); } } @@ -285,13 +302,16 @@ Item { var result = Cura.ContainerManager.importProfile(fileUrl); messageDialog.text = result.message; - if (result.status == "ok") { + if (result.status == "ok") + { messageDialog.icon = StandardIcon.Information; } - else if (result.status == "duplicate") { + else if (result.status == "duplicate") + { messageDialog.icon = StandardIcon.Warning; } - else { + else + { messageDialog.icon = StandardIcon.Critical; } messageDialog.open(); @@ -312,7 +332,8 @@ Item var result = Cura.ContainerManager.exportQualityChangesGroup(base.currentItem.quality_changes_group, fileUrl, selectedNameFilter); - if (result && result.status == "error") { + if (result && result.status == "error") + { messageDialog.icon = StandardIcon.Critical; messageDialog.text = result.message; messageDialog.open(); @@ -323,10 +344,12 @@ Item } } - Item { + Item + { id: contentsItem - anchors { + anchors + { top: titleLabel.bottom left: parent.left right: parent.right @@ -340,7 +363,8 @@ Item Item { - anchors { + anchors + { top: buttonRow.bottom topMargin: UM.Theme.getSize("default_margin").height left: parent.left @@ -348,12 +372,16 @@ Item bottom: parent.bottom } - SystemPalette { id: palette } + SystemPalette + { + id: palette + } Label { id: captionLabel - anchors { + anchors + { top: parent.top left: parent.left } @@ -366,14 +394,16 @@ Item ScrollView { id: profileScrollView - anchors { + anchors + { top: captionLabel.visible ? captionLabel.bottom : parent.top topMargin: captionLabel.visible ? UM.Theme.getSize("default_margin").height : 0 bottom: parent.bottom left: parent.left } - Rectangle { + Rectangle + { parent: viewport anchors.fill: parent color: palette.light @@ -445,7 +475,8 @@ Item MouseArea { anchors.fill: parent - onClicked: { + onClicked: + { parent.ListView.view.currentIndex = model.index; } } @@ -458,7 +489,8 @@ Item { id: detailsPanel - anchors { + anchors + { left: profileScrollView.right leftMargin: UM.Theme.getSize("default_margin").width top: parent.top @@ -478,13 +510,15 @@ Item width: parent.width height: childrenRect.height - Label { + Label + { text: base.currentItemName font: UM.Theme.getFont("large_bold") } } - Flow { + Flow + { id: currentSettingsActions visible: base.hasCurrentItem && base.currentItem.name == Cura.MachineManager.activeQualityOrQualityChangesName anchors.left: parent.left @@ -507,7 +541,8 @@ Item } } - Column { + Column + { id: profileNotices anchors.top: currentSettingsActions.visible ? currentSettingsActions.bottom : currentSettingsActions.anchors.top anchors.topMargin: UM.Theme.getSize("default_margin").height @@ -515,14 +550,16 @@ Item anchors.right: parent.right spacing: UM.Theme.getSize("default_margin").height - Label { + Label + { id: defaultsMessage visible: false text: catalog.i18nc("@action:label", "This profile uses the defaults specified by the printer, so it has no settings/overrides in the list below.") wrapMode: Text.WordWrap width: parent.width } - Label { + Label + { id: noCurrentSettingsMessage visible: base.isCurrentItemActivated && !Cura.MachineManager.hasUserSettings text: catalog.i18nc("@action:label", "Your current settings match the selected profile.") From 47e1dbe38da3d1b4acedc72274d3a70622309815 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 10 Sep 2019 14:55:32 +0200 Subject: [PATCH 157/158] Remove usage of Quality Manager This class is deprecated. Constructing it here means that the class gets constructed on the Qt thread and makes it inaccessible for the rest. Contributes to issue CURA-6600. --- resources/qml/Preferences/ProfilesPage.qml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/resources/qml/Preferences/ProfilesPage.qml b/resources/qml/Preferences/ProfilesPage.qml index 4d766e6618..d620c1a37e 100644 --- a/resources/qml/Preferences/ProfilesPage.qml +++ b/resources/qml/Preferences/ProfilesPage.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2018 Ultimaker B.V. +// Copyright (c) 2019 Ultimaker B.V. // Uranium is released under the terms of the LGPLv3 or higher. import QtQuick 2.7 @@ -14,7 +14,6 @@ Item { id: base - property QtObject qualityManager: CuraApplication.getQualityManager() property var resetEnabled: false // Keep PreferencesDialog happy property var extrudersModel: CuraApplication.getExtrudersModel() property var qualityManagementModel: CuraApplication.getQualityManagementModel() @@ -254,7 +253,7 @@ Item object: "" onAccepted: { - base.qualityManager.duplicateQualityChanges(newName, base.currentItem); + base.qualityManagementModel.duplicateQualityChanges(newName, base.currentItem); } } @@ -285,7 +284,7 @@ Item object: "" onAccepted: { - var actualNewName = base.qualityManager.renameQualityChangesGroup(base.currentItem.quality_changes_group, newName); + var actualNewName = base.qualityManagementModel.renameQualityChangesGroup(base.currentItem.quality_changes_group, newName); base.newQualityNameToSelect = actualNewName; // Select the new name after the model gets updated } } From 0b92c3f3dff3b073bb2a9cdc680f13cf7a9b567d Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 10 Sep 2019 14:56:16 +0200 Subject: [PATCH 158/158] Use .container property rather than deprecated getContainer() function Contributes to issue CURA-6600. --- cura/Machines/Models/IntentModel.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/Machines/Models/IntentModel.py b/cura/Machines/Models/IntentModel.py index 61fdecb559..e4b297093f 100644 --- a/cura/Machines/Models/IntentModel.py +++ b/cura/Machines/Models/IntentModel.py @@ -119,7 +119,7 @@ class IntentModel(ListModel): # Get layer_height from the quality profile for the GlobalStack if quality_group.node_for_global is None: return float(default_layer_height) - container = quality_group.node_for_global.getContainer() + container = quality_group.node_for_global.container layer_height = default_layer_height if container and container.hasProperty("layer_height", "value"):