diff --git a/.github/ISSUE_TEMPLATE/SlicingCrash.yaml b/.github/ISSUE_TEMPLATE/SlicingCrash.yaml index 37a70354c6..f4e082e00a 100644 --- a/.github/ISSUE_TEMPLATE/SlicingCrash.yaml +++ b/.github/ISSUE_TEMPLATE/SlicingCrash.yaml @@ -4,7 +4,7 @@ labels: ["Type: Bug", "Status: Triage", "Slicing Error :collision:"] body: - type: markdown attributes: - value: | + value: | ### 💥 Slicing Crash Analysis Tool 💥 We are taking steps to analyze an increase in reported crashes more systematically. We'll need some help with that. 😇 Before filling out the report below, we want you to try a special Cura 5.7 Alpha. diff --git a/.github/workflows/unit-test.yml b/.github/workflows/unit-test.yml index 9a42f4f85d..2165540889 100644 --- a/.github/workflows/unit-test.yml +++ b/.github/workflows/unit-test.yml @@ -55,7 +55,7 @@ jobs: needs: [ conan-recipe-version ] with: recipe_id_full: ${{ needs.conan-recipe-version.outputs.recipe_id_full }} - conan_extra_args: '-g VirtualPythonEnv -o cura:devtools=True -c tools.build:skip_test=False' + conan_extra_args: '-g VirtualPythonEnv -o cura:devtools=True -c tools.build:skip_test=False --options "*:enable_sentry=False"' unit_test_cmd: 'pytest --junitxml=junit_cura.xml' unit_test_dir: 'tests' conan_generator_dir: './venv/bin' diff --git a/UltiMaker-Cura.spec.jinja b/UltiMaker-Cura.spec.jinja index cd939cf736..2dce96282e 100644 --- a/UltiMaker-Cura.spec.jinja +++ b/UltiMaker-Cura.spec.jinja @@ -55,7 +55,8 @@ exe = EXE( target_arch={{ target_arch }}, codesign_identity=os.getenv('CODESIGN_IDENTITY', None), entitlements_file={{ entitlements_file }}, - icon={{ icon }} + icon={{ icon }}, + contents_directory='.' ) coll = COLLECT( @@ -70,188 +71,7 @@ coll = COLLECT( ) {% if macos == true %} -# PyInstaller seems to copy everything in the resource folder for the MacOS, this causes issues with codesigning and notarizing -# The folder structure should adhere to the one specified in Table 2-5 -# https://developer.apple.com/library/archive/documentation/CoreFoundation/Conceptual/CFBundles/BundleTypes/BundleTypes.html#//apple_ref/doc/uid/10000123i-CH101-SW1 -# The class below is basically ducktyping the BUNDLE class of PyInstaller and using our own `assemble` method for more fine-grain and specific -# control. Some code of the method below is copied from: -# https://github.com/pyinstaller/pyinstaller/blob/22d1d2a5378228744cc95f14904dae1664df32c4/PyInstaller/building/osx.py#L115 -#----------------------------------------------------------------------------- -# Copyright (c) 2005-2022, PyInstaller Development Team. -# -# Distributed under the terms of the GNU General Public License (version 2 -# or later) with exception for distributing the bootloader. -# -# The full license is in the file COPYING.txt, distributed with this software. -# -# SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception) -#----------------------------------------------------------------------------- - -import plistlib -import shutil -import PyInstaller.utils.osx as osxutils -from pathlib import Path -from PyInstaller.building.osx import BUNDLE -from PyInstaller.building.utils import (_check_path_overlap, _rmtree, add_suffix_to_extension, checkCache) -from PyInstaller.building.datastruct import logger -from PyInstaller.building.icon import normalize_icon_type - - -class UMBUNDLE(BUNDLE): - def assemble(self): - from PyInstaller.config import CONF - - if _check_path_overlap(self.name) and os.path.isdir(self.name): - _rmtree(self.name) - logger.info("Building BUNDLE %s", self.tocbasename) - - # Create a minimal Mac bundle structure. - macos_path = Path(self.name, "Contents", "MacOS") - resources_path = Path(self.name, "Contents", "Resources") - frameworks_path = Path(self.name, "Contents", "Frameworks") - os.makedirs(macos_path) - os.makedirs(resources_path) - os.makedirs(frameworks_path) - - # Makes sure the icon exists and attempts to convert to the proper format if applicable - self.icon = normalize_icon_type(self.icon, ("icns",), "icns", CONF["workpath"]) - - # Ensure icon path is absolute - self.icon = os.path.abspath(self.icon) - - # Copy icns icon to Resources directory. - shutil.copy(self.icon, os.path.join(self.name, 'Contents', 'Resources')) - - # Key/values for a minimal Info.plist file - info_plist_dict = { - "CFBundleDisplayName": self.appname, - "CFBundleName": self.appname, - - # Required by 'codesign' utility. - # The value for CFBundleIdentifier is used as the default unique name of your program for Code Signing - # purposes. It even identifies the APP for access to restricted OS X areas like Keychain. - # - # The identifier used for signing must be globally unique. The usual form for this identifier is a - # hierarchical name in reverse DNS notation, starting with the toplevel domain, followed by the company - # name, followed by the department within the company, and ending with the product name. Usually in the - # form: com.mycompany.department.appname - # CLI option --osx-bundle-identifier sets this value. - "CFBundleIdentifier": self.bundle_identifier, - "CFBundleExecutable": os.path.basename(self.exename), - "CFBundleIconFile": os.path.basename(self.icon), - "CFBundleInfoDictionaryVersion": "6.0", - "CFBundlePackageType": "APPL", - "CFBundleVersionString": self.version, - "CFBundleShortVersionString": self.version, - } - - # Set some default values. But they still can be overwritten by the user. - if self.console: - # Setting EXE console=True implies LSBackgroundOnly=True. - info_plist_dict['LSBackgroundOnly'] = True - else: - # Let's use high resolution by default. - info_plist_dict['NSHighResolutionCapable'] = True - - # Merge info_plist settings from spec file - if isinstance(self.info_plist, dict) and self.info_plist: - info_plist_dict.update(self.info_plist) - - plist_filename = os.path.join(self.name, "Contents", "Info.plist") - with open(plist_filename, "wb") as plist_fh: - plistlib.dump(info_plist_dict, plist_fh) - - links = [] - _QT_BASE_PATH = {'PySide2', 'PySide6', 'PyQt5', 'PyQt6', 'PySide6'} - for inm, fnm, typ in self.toc: - # Adjust name for extensions, if applicable - inm, fnm, typ = add_suffix_to_extension(inm, fnm, typ) - inm = Path(inm) - fnm = Path(fnm) - # Copy files from cache. This ensures that are used files with relative paths to dynamic library - # dependencies (@executable_path) - if typ in ('EXTENSION', 'BINARY') or (typ == 'DATA' and inm.suffix == '.so'): - if any(['.' in p for p in inm.parent.parts]): - inm = Path(inm.name) - fnm = Path(checkCache( - str(fnm), - strip = self.strip, - upx = self.upx, - upx_exclude = self.upx_exclude, - dist_nm = str(inm), - target_arch = self.target_arch, - codesign_identity = self.codesign_identity, - entitlements_file = self.entitlements_file, - strict_arch_validation = (typ == 'EXTENSION'), - )) - frame_dst = frameworks_path.joinpath(inm) - if not frame_dst.exists(): - if frame_dst.is_dir(): - os.makedirs(frame_dst, exist_ok = True) - else: - os.makedirs(frame_dst.parent, exist_ok = True) - shutil.copy(fnm, frame_dst, follow_symlinks = True) - macos_dst = macos_path.joinpath(inm) - if not macos_dst.exists(): - if macos_dst.is_dir(): - os.makedirs(macos_dst, exist_ok = True) - else: - os.makedirs(macos_dst.parent, exist_ok = True) - - # Create relative symlink to the framework - symlink_to = Path(*[".." for p in macos_dst.relative_to(macos_path).parts], "Frameworks").joinpath( - frame_dst.relative_to(frameworks_path)) - try: - macos_dst.symlink_to(symlink_to) - except FileExistsError: - pass - else: - if typ == 'DATA': - if any(['.' in p for p in inm.parent.parts]) or inm.suffix == '.so': - # Skip info dist egg and some not needed folders in tcl and tk, since they all contain dots in their files - logger.warning(f"Skipping DATA file {inm}") - continue - res_dst = resources_path.joinpath(inm) - if not res_dst.exists(): - if res_dst.is_dir(): - os.makedirs(res_dst, exist_ok = True) - else: - os.makedirs(res_dst.parent, exist_ok = True) - shutil.copy(fnm, res_dst, follow_symlinks = True) - macos_dst = macos_path.joinpath(inm) - if not macos_dst.exists(): - if macos_dst.is_dir(): - os.makedirs(macos_dst, exist_ok = True) - else: - os.makedirs(macos_dst.parent, exist_ok = True) - - # Create relative symlink to the resource - symlink_to = Path(*[".." for p in macos_dst.relative_to(macos_path).parts], "Resources").joinpath( - res_dst.relative_to(resources_path)) - try: - macos_dst.symlink_to(symlink_to) - except FileExistsError: - pass - else: - macos_dst = macos_path.joinpath(inm) - if not macos_dst.exists(): - if macos_dst.is_dir(): - os.makedirs(macos_dst, exist_ok = True) - else: - os.makedirs(macos_dst.parent, exist_ok = True) - shutil.copy(fnm, macos_dst, follow_symlinks = True) - - # Sign the bundle - logger.info('Signing the BUNDLE...') - try: - osxutils.sign_binary(self.name, self.codesign_identity, self.entitlements_file, deep = True) - except Exception as e: - logger.warning(f"Error while signing the bundle: {e}") - logger.warning("You will need to sign the bundle manually!") - - logger.info(f"Building BUNDLE {self.tocbasename} completed successfully.") - -app = UMBUNDLE( +app = BUNDLE( coll, name='{{ display_name }}.app', icon={{ icon }}, @@ -271,9 +91,10 @@ app = UMBUNDLE( 'CFBundleURLSchemes': ['cura', 'slicer'], }], 'CFBundleDocumentTypes': [{ - 'CFBundleTypeRole': 'Viewer', - 'CFBundleTypeExtensions': ['*'], - 'CFBundleTypeName': 'Model Files', - }] - }, -){% endif %} + 'CFBundleTypeRole': 'Viewer', + 'CFBundleTypeExtensions': ['stl', 'obj', '3mf', 'gcode', 'ufp'], + 'CFBundleTypeName': 'Model Files', + }] + }, +) +{% endif %} diff --git a/conandata.yml b/conandata.yml index 486a64c26e..fdfc2dec11 100644 --- a/conandata.yml +++ b/conandata.yml @@ -4,7 +4,7 @@ requirements: - "curaengine/(latest)@ultimaker/testing" - "cura_binary_data/(latest)@ultimaker/testing" - "fdm_materials/(latest)@ultimaker/testing" - - "curaengine_plugin_gradual_flow/0.1.0-beta.2" + - "curaengine_plugin_gradual_flow/0.1.0-beta.3" - "dulcificum/latest@ultimaker/testing" - "pysavitar/5.3.0" - "pynest2d/5.3.0" @@ -118,7 +118,6 @@ pyinstaller: - "sqlite3" - "trimesh" - "win32ctypes" - - "PyQt6" - "PyQt6.QtNetwork" - "PyQt6.sip" - "stl" @@ -160,6 +159,10 @@ pycharm_targets: module_name: Cura name: pytest in TestGCodeListDecorator.py script_name: tests/TestGCodeListDecorator.py + - jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja + module_name: Cura + name: pytest in TestHitChecker.py + script_name: tests/TestHitChecker.py - jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja module_name: Cura name: pytest in TestIntentManager.py @@ -188,6 +191,10 @@ pycharm_targets: module_name: Cura name: pytest in TestPrintInformation.py script_name: tests/TestPrintInformation.py + - jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja + module_name: Cura + name: pytest in TestPrintOrderManager.py + script_name: tests/TestPrintOrderManager.py - jinja_path: .run_templates/pycharm_cura_test.run.xml.jinja module_name: Cura name: pytest in TestProfileRequirements.py diff --git a/conanfile.py b/conanfile.py index 3b48442fa0..ca6b4eabd0 100644 --- a/conanfile.py +++ b/conanfile.py @@ -350,6 +350,7 @@ class CuraConan(ConanFile): self.requires("cpython/3.10.4@ultimaker/stable") self.requires("clipper/6.4.2@ultimaker/stable") self.requires("openssl/3.2.0") + self.requires("protobuf/3.21.12") self.requires("boost/1.82.0") self.requires("spdlog/1.12.0") self.requires("fmt/10.1.1") diff --git a/cura/CuraActions.py b/cura/CuraActions.py index 36c69618dd..835c46bba8 100644 --- a/cura/CuraActions.py +++ b/cura/CuraActions.py @@ -1,6 +1,5 @@ # Copyright (c) 2023 UltiMaker # Cura is released under the terms of the LGPLv3 or higher. - from typing import List, cast from PyQt6.QtCore import QObject, QUrl, pyqtSignal, pyqtProperty @@ -33,7 +32,6 @@ from cura.Operations.SetBuildPlateNumberOperation import SetBuildPlateNumberOper from UM.Logger import Logger from UM.Scene.SceneNode import SceneNode - class CuraActions(QObject): def __init__(self, parent: QObject = None) -> None: super().__init__(parent) @@ -273,7 +271,11 @@ class CuraActions(QObject): # deselect currently selected nodes, and select the new nodes for node in Selection.getAllSelectedObjects(): Selection.remove(node) + + numberOfFixedNodes = len(fixed_nodes) for node in nodes: + numberOfFixedNodes += 1 + node.printOrder = numberOfFixedNodes Selection.add(node) def _openUrl(self, url: QUrl) -> None: diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 67c420028b..86bb53126c 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -104,7 +104,8 @@ from cura.Settings.SettingInheritanceManager import SettingInheritanceManager from cura.Settings.SidebarCustomMenuItemsModel import SidebarCustomMenuItemsModel from cura.Settings.SimpleModeSettingsManager import SimpleModeSettingsManager from cura.TaskManagement.OnExitCallbackManager import OnExitCallbackManager -from cura.UI import CuraSplashScreen, MachineActionManager, PrintInformation +from cura.UI import CuraSplashScreen, PrintInformation +from cura.UI.MachineActionManager import MachineActionManager from cura.UI.AddPrinterPagesModel import AddPrinterPagesModel from cura.UI.MachineSettingsManager import MachineSettingsManager from cura.UI.ObjectsModel import ObjectsModel @@ -125,6 +126,7 @@ from .Machines.Models.CompatibleMachineModel import CompatibleMachineModel from .Machines.Models.MachineListModel import MachineListModel from .Machines.Models.ActiveIntentQualitiesModel import ActiveIntentQualitiesModel from .Machines.Models.IntentSelectionModel import IntentSelectionModel +from .PrintOrderManager import PrintOrderManager from .SingleInstance import SingleInstance if TYPE_CHECKING: @@ -179,6 +181,7 @@ class CuraApplication(QtApplication): # Variables set from CLI self._files_to_open = [] + self._urls_to_open = [] self._use_single_instance = False self._single_instance = None @@ -186,7 +189,7 @@ class CuraApplication(QtApplication): self._cura_formula_functions = None # type: Optional[CuraFormulaFunctions] - self._machine_action_manager = None # type: Optional[MachineActionManager.MachineActionManager] + self._machine_action_manager: Optional[MachineActionManager] = None self.empty_container = None # type: EmptyInstanceContainer self.empty_definition_changes_container = None # type: EmptyInstanceContainer @@ -202,6 +205,7 @@ class CuraApplication(QtApplication): self._container_manager = None self._object_manager = None + self._print_order_manager = None self._extruders_model = None self._extruders_model_with_optional = None self._build_plate_model = None @@ -333,7 +337,7 @@ class CuraApplication(QtApplication): for filename in self._cli_args.file: url = QUrl(filename) if url.scheme() in self._supported_url_schemes: - self._open_url_queue.append(url) + self._urls_to_open.append(url) else: self._files_to_open.append(os.path.abspath(filename)) @@ -352,11 +356,11 @@ class CuraApplication(QtApplication): self.__addAllEmptyContainers() self.__setLatestResouceVersionsForVersionUpgrade() - self._machine_action_manager = MachineActionManager.MachineActionManager(self) + self._machine_action_manager = MachineActionManager(self) self._machine_action_manager.initialize() def __sendCommandToSingleInstance(self): - self._single_instance = SingleInstance(self, self._files_to_open) + self._single_instance = SingleInstance(self, self._files_to_open, self._urls_to_open) # If we use single instance, try to connect to the single instance server, send commands, and then exit. # If we cannot find an existing single instance server, this is the only instance, so just keep going. @@ -373,9 +377,15 @@ class CuraApplication(QtApplication): Resources.addExpectedDirNameInData(dir_name) app_root = os.path.abspath(os.path.join(os.path.dirname(sys.executable))) - Resources.addSecureSearchPath(os.path.join(app_root, "share", "cura", "resources")) - Resources.addSecureSearchPath(os.path.join(self._app_install_dir, "share", "cura", "resources")) + if platform.system() == "Darwin": + Resources.addSecureSearchPath(os.path.join(app_root, "Resources", "share", "cura", "resources")) + Resources.addSecureSearchPath( + os.path.join(self._app_install_dir, "Resources", "share", "cura", "resources")) + else: + Resources.addSecureSearchPath(os.path.join(app_root, "share", "cura", "resources")) + Resources.addSecureSearchPath(os.path.join(self._app_install_dir, "share", "cura", "resources")) + if not hasattr(sys, "frozen"): cura_data_root = os.environ.get('CURA_DATA_ROOT', None) if cura_data_root: @@ -607,6 +617,7 @@ class CuraApplication(QtApplication): preferences.addPreference("view/invert_zoom", False) preferences.addPreference("view/filter_current_build_plate", False) + preferences.addPreference("view/navigation_style", "cura") preferences.addPreference("cura/sidebar_collapsed", False) preferences.addPreference("cura/favorite_materials", "") @@ -899,6 +910,7 @@ class CuraApplication(QtApplication): # initialize info objects self._print_information = PrintInformation.PrintInformation(self) self._cura_actions = CuraActions.CuraActions(self) + self._print_order_manager = PrintOrderManager(self.getObjectsModel().getNodes) self.processEvents() # Initialize setting visibility presets model. self._setting_visibility_presets_model = SettingVisibilityPresetsModel(self.getPreferences(), parent = self) @@ -956,6 +968,8 @@ class CuraApplication(QtApplication): self.callLater(self._openFile, file_name) for file_name in self._open_file_queue: # Open all the files that were queued up while plug-ins were loading. self.callLater(self._openFile, file_name) + for url in self._urls_to_open: + self.callLater(self._openUrl, url) for url in self._open_url_queue: self.callLater(self._openUrl, url) @@ -979,6 +993,7 @@ class CuraApplication(QtApplication): t.setEnabledAxis([ToolHandle.XAxis, ToolHandle.YAxis, ToolHandle.ZAxis]) Selection.selectionChanged.connect(self.onSelectionChanged) + self._print_order_manager.printOrderChanged.connect(self._onPrintOrderChanged) # Set default background color for scene self.getRenderer().setBackgroundColor(QColor(245, 245, 245)) @@ -1068,6 +1083,10 @@ class CuraApplication(QtApplication): def getTextManager(self, *args) -> "TextManager": return self._text_manager + @pyqtSlot() + def setWorkplaceDropToBuildplate(self): + return self._physics.setAppAllModelDropDown() + def getCuraFormulaFunctions(self, *args) -> "CuraFormulaFunctions": if self._cura_formula_functions is None: self._cura_formula_functions = CuraFormulaFunctions(self) @@ -1094,6 +1113,10 @@ class CuraApplication(QtApplication): self._object_manager = ObjectsModel(self) return self._object_manager + @pyqtSlot(str, result = "QVariantList") + def getSupportedActionMachineList(self, definition_id: str) -> List["MachineAction"]: + return self._machine_action_manager.getSupportedActions(self._machine_manager.getDefinitionByMachineId(definition_id)) + @pyqtSlot(result = QObject) def getExtrudersModel(self, *args) -> "ExtrudersModel": if self._extruders_model is None: @@ -1119,6 +1142,16 @@ class CuraApplication(QtApplication): self._build_plate_model = BuildPlateModel(self) return self._build_plate_model + @pyqtSlot() + def exportUcp(self): + writer = self.getMeshFileHandler().getWriter("3MFWriter") + + if writer is None: + Logger.warning("3mf writer is not enabled") + return + + writer.exportUcp() + def getCuraSceneController(self, *args) -> CuraSceneController: if self._cura_scene_controller is None: self._cura_scene_controller = CuraSceneController.createCuraSceneController() @@ -1129,18 +1162,16 @@ class CuraApplication(QtApplication): self._setting_inheritance_manager = SettingInheritanceManager.createSettingInheritanceManager() return self._setting_inheritance_manager - def getMachineActionManager(self, *args: Any) -> MachineActionManager.MachineActionManager: + @pyqtSlot(result = QObject) + def getMachineActionManager(self, *args: Any) -> MachineActionManager: """Get the machine action manager We ignore any *args given to this, as we also register the machine manager as qml singleton. It wants to give this function an engine and script engine, but we don't care about that. """ - return cast(MachineActionManager.MachineActionManager, self._machine_action_manager) + return self._machine_action_manager - @pyqtSlot(result = QObject) - def getMachineActionManagerQml(self)-> MachineActionManager.MachineActionManager: - return cast(QObject, self._machine_action_manager) @pyqtSlot(result = QObject) def getMaterialManagementModel(self) -> MaterialManagementModel: @@ -1250,6 +1281,7 @@ class CuraApplication(QtApplication): self.processEvents() engine.rootContext().setContextProperty("Printer", self) engine.rootContext().setContextProperty("CuraApplication", self) + engine.rootContext().setContextProperty("PrintOrderManager", self._print_order_manager) engine.rootContext().setContextProperty("PrintInformation", self._print_information) engine.rootContext().setContextProperty("CuraActions", self._cura_actions) engine.rootContext().setContextProperty("CuraSDKVersion", ApplicationMetadata.CuraSDKVersion) @@ -1264,7 +1296,7 @@ class CuraApplication(QtApplication): qmlRegisterSingletonType(IntentManager, "Cura", 1, 6, self.getIntentManager, "IntentManager") qmlRegisterSingletonType(SettingInheritanceManager, "Cura", 1, 0, self.getSettingInheritanceManager, "SettingInheritanceManager") qmlRegisterSingletonType(SimpleModeSettingsManager, "Cura", 1, 0, self.getSimpleModeSettingsManagerWrapper, "SimpleModeSettingsManager") - qmlRegisterSingletonType(MachineActionManager.MachineActionManager, "Cura", 1, 0, self.getMachineActionManagerWrapper, "MachineActionManager") + qmlRegisterSingletonType(MachineActionManager, "Cura", 1, 0, self.getMachineActionManagerWrapper, "MachineActionManager") self.processEvents() qmlRegisterType(NetworkingUtil, "Cura", 1, 5, "NetworkingUtil") @@ -1745,8 +1777,12 @@ class CuraApplication(QtApplication): Selection.remove(node) Selection.add(group_node) + all_nodes = self.getObjectsModel().getNodes() + PrintOrderManager.updatePrintOrdersAfterGroupOperation(all_nodes, group_node, selected_nodes) + @pyqtSlot() def ungroupSelected(self) -> None: + all_nodes = self.getObjectsModel().getNodes() selected_objects = Selection.getAllSelectedObjects().copy() for node in selected_objects: if node.callDecoration("isGroup"): @@ -1754,21 +1790,30 @@ class CuraApplication(QtApplication): group_parent = node.getParent() children = node.getChildren().copy() - for child in children: - # Ungroup only 1 level deep - if child.getParent() != node: - continue + # Ungroup only 1 level deep + children_to_ungroup = list(filter(lambda child: child.getParent() == node, children)) + for child in children_to_ungroup: # Set the parent of the children to the parent of the group-node op.addOperation(SetParentOperation(child, group_parent)) # Add all individual nodes to the selection Selection.add(child) + PrintOrderManager.updatePrintOrdersAfterUngroupOperation(all_nodes, node, children_to_ungroup) op.push() # Note: The group removes itself from the scene once all its children have left it, # see GroupDecorator._onChildrenChanged + def _onPrintOrderChanged(self) -> None: + # update object list + scene = self.getController().getScene() + scene.sceneChanged.emit(scene.getRoot()) + + # reset if already was sliced + Application.getInstance().getBackend().needsSlicing() + Application.getInstance().getBackend().tickle() + def _createSplashScreen(self) -> Optional[CuraSplashScreen.CuraSplashScreen]: if self._is_headless: return None @@ -1932,6 +1977,17 @@ class CuraApplication(QtApplication): openProjectFile = pyqtSignal(QUrl, bool, arguments = ["project_file", "add_to_recent_files"]) # Emitted when a project file is about to open. + @pyqtSlot(QUrl, bool) + def readLocalUcpFile(self, file: QUrl, add_to_recent_files: bool = True): + + file_name = QUrl(file).toLocalFile() + workspace_reader = self.getWorkspaceFileHandler() + if workspace_reader is None: + Logger.warning(f"Workspace reader not found, cannot read file {file_name}.") + return + + workspace_reader.readLocalFile(file, add_to_recent_files) + @pyqtSlot(QUrl, str, bool) @pyqtSlot(QUrl, str) @pyqtSlot(QUrl) @@ -2137,6 +2193,12 @@ class CuraApplication(QtApplication): def addNonSliceableExtension(self, extension): self._non_sliceable_extensions.append(extension) + @pyqtSlot(str, result = bool) + def isProjectUcp(self, file_url) -> bool: + file_path = QUrl(file_url).toLocalFile() + workspace_reader = self.getWorkspaceFileHandler().getReaderForFile(file_path) + return workspace_reader.getIsProjectUcp() + @pyqtSlot(str, result=bool) def checkIsValidProjectFile(self, file_url): """Checks if the given file URL is a valid project file. """ @@ -2146,6 +2208,8 @@ class CuraApplication(QtApplication): if workspace_reader is None: return False # non-project files won't get a reader try: + if workspace_reader.getPluginId() == "3MFReader": + workspace_reader.clearOpenAsUcp() result = workspace_reader.preRead(file_path, show_dialog=False) return result == WorkspaceReader.PreReadResult.accepted except: diff --git a/cura/HitChecker.py b/cura/HitChecker.py new file mode 100644 index 0000000000..4b229e6b9b --- /dev/null +++ b/cura/HitChecker.py @@ -0,0 +1,88 @@ +from typing import List, Dict +from cura.Scene.CuraSceneNode import CuraSceneNode + + +class HitChecker: + """Checks if nodes can be printed without causing any collisions and interference""" + + def __init__(self, nodes: List[CuraSceneNode]) -> None: + self._hit_map = self._buildHitMap(nodes) + + def anyTwoNodesBlockEachOther(self, nodes: List[CuraSceneNode]) -> bool: + """Returns True if any 2 nodes block each other""" + for a in nodes: + for b in nodes: + if self._hit_map[a][b] and self._hit_map[b][a]: + return True + return False + + def canPrintBefore(self, node: CuraSceneNode, other_nodes: List[CuraSceneNode]) -> bool: + """Returns True if node doesn't block other_nodes and can be printed before them""" + no_hits = all(not self._hit_map[node][other_node] for other_node in other_nodes) + return no_hits + + def canPrintAfter(self, node: CuraSceneNode, other_nodes: List[CuraSceneNode]) -> bool: + """Returns True if node doesn't hit other nodes and can be printed after them""" + no_hits = all(not self._hit_map[other_node][node] for other_node in other_nodes) + return no_hits + + def calculateScore(self, a: CuraSceneNode, b: CuraSceneNode) -> int: + """Calculate score simply sums the number of other objects it 'blocks' + + :param a: node + :param b: node + :return: sum of the number of other objects + """ + + score_a = sum(self._hit_map[a].values()) + score_b = sum(self._hit_map[b].values()) + return score_a - score_b + + def canPrintNodesInProvidedOrder(self, ordered_nodes: List[CuraSceneNode]) -> bool: + """Returns True If nodes don't have any hits in provided order""" + for node_index, node in enumerate(ordered_nodes): + nodes_before = ordered_nodes[:node_index - 1] if node_index - 1 >= 0 else [] + nodes_after = ordered_nodes[node_index + 1:] if node_index + 1 < len(ordered_nodes) else [] + if not self.canPrintBefore(node, nodes_after) or not self.canPrintAfter(node, nodes_before): + return False + return True + + @staticmethod + def _buildHitMap(nodes: List[CuraSceneNode]) -> Dict[CuraSceneNode, CuraSceneNode]: + """Pre-computes all hits between all objects + + :nodes: nodes that need to be checked for collisions + :return: dictionary where hit_map[node1][node2] is False if there node1 can be printed before node2 + """ + hit_map = {j: {i: HitChecker._checkHit(j, i) for i in nodes} for j in nodes} + return hit_map + + @staticmethod + def _checkHit(a: CuraSceneNode, b: CuraSceneNode) -> bool: + """Checks if a can be printed before b + + :param a: node + :param b: node + :return: False if a can be printed before b + """ + + if a == b: + return False + + a_hit_hull = a.callDecoration("getConvexHullBoundary") + b_hit_hull = b.callDecoration("getConvexHullHeadFull") + overlap = a_hit_hull.intersectsPolygon(b_hit_hull) + + if overlap: + return True + + # Adhesion areas must never overlap, regardless of printing order + # This would cause over-extrusion + a_hit_hull = a.callDecoration("getAdhesionArea") + b_hit_hull = b.callDecoration("getAdhesionArea") + overlap = a_hit_hull.intersectsPolygon(b_hit_hull) + + if overlap: + return True + else: + return False diff --git a/cura/Machines/Models/MachineListModel.py b/cura/Machines/Models/MachineListModel.py index 69a3c53d03..cac52a0e65 100644 --- a/cura/Machines/Models/MachineListModel.py +++ b/cura/Machines/Models/MachineListModel.py @@ -5,7 +5,7 @@ # online cloud connected printers are represented within this ListModel. Additional information such as the number of # connected printers for each printer type is gathered. -from typing import Optional, List, cast +from typing import Optional, List, cast, Dict, Any from PyQt6.QtCore import Qt, QTimer, QObject, pyqtSlot, pyqtProperty, pyqtSignal @@ -30,10 +30,10 @@ class MachineListModel(ListModel): ComponentTypeRole = Qt.ItemDataRole.UserRole + 8 IsNetworkedMachineRole = Qt.ItemDataRole.UserRole + 9 - def __init__(self, parent: Optional[QObject] = None, machines_filter: List[GlobalStack] = None, listenToChanges: bool = True) -> None: + def __init__(self, parent: Optional[QObject] = None, machines_filter: List[GlobalStack] = None, listenToChanges: bool = True, showCloudPrinters: bool = False) -> None: super().__init__(parent) - self._show_cloud_printers = False + self._show_cloud_printers = showCloudPrinters self._machines_filter = machines_filter self._catalog = i18nCatalog("cura") @@ -159,3 +159,8 @@ class MachineListModel(ListModel): "machineCount": machine_count, "catergory": "connected" if is_online else "other", }) + + def getItems(self) -> Dict[str, Any]: + if self.count > 0: + return self.items + return {} \ No newline at end of file diff --git a/cura/OAuth2/AuthorizationHelpers.py b/cura/OAuth2/AuthorizationHelpers.py index 569ba80659..3e7dabaf08 100644 --- a/cura/OAuth2/AuthorizationHelpers.py +++ b/cura/OAuth2/AuthorizationHelpers.py @@ -16,6 +16,7 @@ from UM.TaskManagement.HttpRequestManager import HttpRequestManager # To downlo catalog = i18nCatalog("cura") TOKEN_TIMESTAMP_FORMAT = "%Y-%m-%d %H:%M:%S" +REQUEST_TIMEOUT = 5 # Seconds class AuthorizationHelpers: @@ -53,7 +54,8 @@ class AuthorizationHelpers: data = urllib.parse.urlencode(data).encode("UTF-8"), headers_dict = headers, callback = lambda response: self.parseTokenResponse(response, callback), - error_callback = lambda response, _: self.parseTokenResponse(response, callback) + error_callback = lambda response, _: self.parseTokenResponse(response, callback), + timeout = REQUEST_TIMEOUT ) def getAccessTokenUsingRefreshToken(self, refresh_token: str, callback: Callable[[AuthenticationResponse], None]) -> None: @@ -77,7 +79,9 @@ class AuthorizationHelpers: data = urllib.parse.urlencode(data).encode("UTF-8"), headers_dict = headers, callback = lambda response: self.parseTokenResponse(response, callback), - error_callback = lambda response, _: self.parseTokenResponse(response, callback) + error_callback = lambda response, _: self.parseTokenResponse(response, callback), + urgent = True, + timeout = REQUEST_TIMEOUT ) def parseTokenResponse(self, token_response: QNetworkReply, callback: Callable[[AuthenticationResponse], None]) -> None: @@ -122,7 +126,8 @@ class AuthorizationHelpers: check_token_url, headers_dict = headers, callback = lambda reply: self._parseUserProfile(reply, success_callback, failed_callback), - error_callback = lambda _, _2: failed_callback() if failed_callback is not None else None + error_callback = lambda _, _2: failed_callback() if failed_callback is not None else None, + timeout = REQUEST_TIMEOUT ) def _parseUserProfile(self, reply: QNetworkReply, success_callback: Optional[Callable[[UserProfile], None]], failed_callback: Optional[Callable[[], None]] = None) -> None: diff --git a/cura/OAuth2/AuthorizationService.py b/cura/OAuth2/AuthorizationService.py index 06478e911b..4e8d28173a 100644 --- a/cura/OAuth2/AuthorizationService.py +++ b/cura/OAuth2/AuthorizationService.py @@ -1,4 +1,4 @@ -# Copyright (c) 2021 Ultimaker B.V. +# Copyright (c) 2024 UltiMaker # Cura is released under the terms of the LGPLv3 or higher. import json @@ -6,13 +6,14 @@ from datetime import datetime, timedelta from typing import Callable, Dict, Optional, TYPE_CHECKING, Union from urllib.parse import urlencode, quote_plus -from PyQt6.QtCore import QUrl +from PyQt6.QtCore import QUrl, QTimer from PyQt6.QtGui import QDesktopServices from UM.Logger import Logger from UM.Message import Message from UM.Signal import Signal from UM.i18n import i18nCatalog +from UM.TaskManagement.HttpRequestManager import HttpRequestManager # To download log-in tokens. from cura.OAuth2.AuthorizationHelpers import AuthorizationHelpers, TOKEN_TIMESTAMP_FORMAT from cura.OAuth2.LocalAuthorizationServer import LocalAuthorizationServer from cura.OAuth2.Models import AuthenticationResponse, BaseModel @@ -25,6 +26,8 @@ if TYPE_CHECKING: MYCLOUD_LOGOFF_URL = "https://account.ultimaker.com/logoff?utm_source=cura&utm_medium=software&utm_campaign=change-account-before-adding-printers" +REFRESH_TOKEN_MAX_RETRIES = 15 +REFRESH_TOKEN_RETRY_INTERVAL = 1000 class AuthorizationService: """The authorization service is responsible for handling the login flow, storing user credentials and providing @@ -57,6 +60,12 @@ class AuthorizationService: self.onAuthStateChanged.connect(self._authChanged) + self._refresh_token_retries = 0 + self._refresh_token_retry_timer = QTimer() + self._refresh_token_retry_timer.setInterval(REFRESH_TOKEN_RETRY_INTERVAL) + self._refresh_token_retry_timer.setSingleShot(True) + self._refresh_token_retry_timer.timeout.connect(self.refreshAccessToken) + def _authChanged(self, logged_in): if logged_in and self._unable_to_get_data_message is not None: self._unable_to_get_data_message.hide() @@ -167,16 +176,29 @@ class AuthorizationService: return def process_auth_data(response: AuthenticationResponse) -> None: + self._currently_refreshing_token = False + if response.success: + self._refresh_token_retries = 0 self._storeAuthData(response) + HttpRequestManager.getInstance().setDelayRequests(False) self.onAuthStateChanged.emit(logged_in = True) else: - Logger.warning("Failed to get a new access token from the server.") - self.onAuthStateChanged.emit(logged_in = False) + if self._refresh_token_retries >= REFRESH_TOKEN_MAX_RETRIES: + self._refresh_token_retries = 0 + Logger.warning("Failed to get a new access token from the server, giving up.") + HttpRequestManager.getInstance().setDelayRequests(False) + self.onAuthStateChanged.emit(logged_in = False) + else: + # Retry a bit later, network may be offline right now and will hopefully be back soon + Logger.warning("Failed to get a new access token from the server, retrying later.") + self._refresh_token_retries += 1 + self._refresh_token_retry_timer.start() if self._currently_refreshing_token: Logger.debug("Was already busy refreshing token. Do not start a new request.") return + HttpRequestManager.getInstance().setDelayRequests(True) self._currently_refreshing_token = True self._auth_helpers.getAccessTokenUsingRefreshToken(self._auth_data.refresh_token, process_auth_data) diff --git a/cura/OneAtATimeIterator.py b/cura/OneAtATimeIterator.py index 8bdddba554..1017cfc79e 100644 --- a/cura/OneAtATimeIterator.py +++ b/cura/OneAtATimeIterator.py @@ -7,6 +7,11 @@ from UM.Scene.Iterator import Iterator from UM.Scene.SceneNode import SceneNode from functools import cmp_to_key +from cura.HitChecker import HitChecker +from cura.PrintOrderManager import PrintOrderManager +from cura.Scene.CuraSceneNode import CuraSceneNode + + class OneAtATimeIterator(Iterator.Iterator): """Iterator that returns a list of nodes in the order that they need to be printed @@ -16,8 +21,6 @@ class OneAtATimeIterator(Iterator.Iterator): def __init__(self, scene_node) -> None: super().__init__(scene_node) # Call super to make multiple inheritance work. - self._hit_map = [[]] # type: List[List[bool]] # For each node, which other nodes this hits. A grid of booleans on which nodes hit which. - self._original_node_list = [] # type: List[SceneNode] # The nodes that need to be checked for collisions. def _fillStack(self) -> None: """Fills the ``_node_stack`` with a list of scene nodes that need to be printed in order. """ @@ -38,104 +41,50 @@ class OneAtATimeIterator(Iterator.Iterator): self._node_stack = node_list[:] return - # Copy the list - self._original_node_list = node_list[:] + hit_checker = HitChecker(node_list) - # Initialise the hit map (pre-compute all hits between all objects) - self._hit_map = [[self._checkHit(i, j) for i in node_list] for j in node_list] + if PrintOrderManager.isUserDefinedPrintOrderEnabled(): + self._node_stack = self._getNodesOrderedByUser(hit_checker, node_list) + else: + self._node_stack = self._getNodesOrderedAutomatically(hit_checker, node_list) - # Check if we have to files that block each other. If this is the case, there is no solution! - for a in range(0, len(node_list)): - for b in range(0, len(node_list)): - if a != b and self._hit_map[a][b] and self._hit_map[b][a]: - return + # update print orders so that user can try to arrange the nodes automatically first + # and if result is not satisfactory he/she can switch to manual mode and change it + for index, node in enumerate(self._node_stack): + node.printOrder = index + 1 + + @staticmethod + def _getNodesOrderedByUser(hit_checker: HitChecker, node_list: List[CuraSceneNode]) -> List[CuraSceneNode]: + nodes_ordered_by_user = sorted(node_list, key=lambda n: n.printOrder) + if hit_checker.canPrintNodesInProvidedOrder(nodes_ordered_by_user): + return nodes_ordered_by_user + return [] # No solution + + @staticmethod + def _getNodesOrderedAutomatically(hit_checker: HitChecker, node_list: List[CuraSceneNode]) -> List[CuraSceneNode]: + # Check if we have two files that block each other. If this is the case, there is no solution! + if hit_checker.anyTwoNodesBlockEachOther(node_list): + return [] # No solution # Sort the original list so that items that block the most other objects are at the beginning. # This does not decrease the worst case running time, but should improve it in most cases. - sorted(node_list, key = cmp_to_key(self._calculateScore)) + node_list = sorted(node_list, key = cmp_to_key(hit_checker.calculateScore)) todo_node_list = [_ObjectOrder([], node_list)] while len(todo_node_list) > 0: current = todo_node_list.pop() for node in current.todo: # Check if the object can be placed with what we have and still allows for a solution in the future - if not self._checkHitMultiple(node, current.order) and not self._checkBlockMultiple(node, current.todo): + if hit_checker.canPrintAfter(node, current.order) and hit_checker.canPrintBefore(node, current.todo): # We found a possible result. Create new todo & order list. new_todo_list = current.todo[:] new_todo_list.remove(node) new_order = current.order[:] + [node] if len(new_todo_list) == 0: # We have no more nodes to check, so quit looking. - self._node_stack = new_order - return + return new_order # Solution found! todo_node_list.append(_ObjectOrder(new_order, new_todo_list)) - self._node_stack = [] #No result found! - - - # Check if first object can be printed before the provided list (using the hit map) - def _checkHitMultiple(self, node: SceneNode, other_nodes: List[SceneNode]) -> bool: - node_index = self._original_node_list.index(node) - for other_node in other_nodes: - other_node_index = self._original_node_list.index(other_node) - if self._hit_map[node_index][other_node_index]: - return True - return False - - def _checkBlockMultiple(self, node: SceneNode, other_nodes: List[SceneNode]) -> bool: - """Check for a node whether it hits any of the other nodes. - - :param node: The node to check whether it collides with the other nodes. - :param other_nodes: The nodes to check for collisions. - :return: returns collision between nodes - """ - - node_index = self._original_node_list.index(node) - for other_node in other_nodes: - other_node_index = self._original_node_list.index(other_node) - if self._hit_map[other_node_index][node_index] and node_index != other_node_index: - return True - return False - - def _calculateScore(self, a: SceneNode, b: SceneNode) -> int: - """Calculate score simply sums the number of other objects it 'blocks' - - :param a: node - :param b: node - :return: sum of the number of other objects - """ - - score_a = sum(self._hit_map[self._original_node_list.index(a)]) - score_b = sum(self._hit_map[self._original_node_list.index(b)]) - return score_a - score_b - - def _checkHit(self, a: SceneNode, b: SceneNode) -> bool: - """Checks if a can be printed before b - - :param a: node - :param b: node - :return: true if a can be printed before b - """ - - if a == b: - return False - - a_hit_hull = a.callDecoration("getConvexHullBoundary") - b_hit_hull = b.callDecoration("getConvexHullHeadFull") - overlap = a_hit_hull.intersectsPolygon(b_hit_hull) - - if overlap: - return True - - # Adhesion areas must never overlap, regardless of printing order - # This would cause over-extrusion - a_hit_hull = a.callDecoration("getAdhesionArea") - b_hit_hull = b.callDecoration("getAdhesionArea") - overlap = a_hit_hull.intersectsPolygon(b_hit_hull) - - if overlap: - return True - else: - return False + return [] # No result found! class _ObjectOrder: diff --git a/cura/PlatformPhysics.py b/cura/PlatformPhysics.py index 1ef39de80d..c61f78d86e 100755 --- a/cura/PlatformPhysics.py +++ b/cura/PlatformPhysics.py @@ -39,6 +39,11 @@ class PlatformPhysics: Application.getInstance().getPreferences().addPreference("physics/automatic_push_free", False) Application.getInstance().getPreferences().addPreference("physics/automatic_drop_down", True) + self._app_all_model_drop = False + + def setAppAllModelDropDown(self): + self._app_all_model_drop = True + self._onChangeTimerFinished() def _onSceneChanged(self, source): if not source.callDecoration("isSliceable"): @@ -80,9 +85,9 @@ class PlatformPhysics: # Move it downwards if bottom is above platform move_vector = Vector() - if node.getSetting(SceneNodeSettings.AutoDropDown, app_automatic_drop_down) and not (node.getParent() and node.getParent().callDecoration("isGroup") or node.getParent() != root) and node.isEnabled(): #If an object is grouped, don't move it down + if (node.getSetting(SceneNodeSettings.AutoDropDown, app_automatic_drop_down) or self._app_all_model_drop) and not (node.getParent() and node.getParent().callDecoration("isGroup") or node.getParent() != root) and node.isEnabled(): z_offset = node.callDecoration("getZOffset") if node.getDecorator(ZOffsetDecorator.ZOffsetDecorator) else 0 - move_vector = move_vector.set(y = -bbox.bottom + z_offset) + move_vector = move_vector.set(y=-bbox.bottom + z_offset) # If there is no convex hull for the node, start calculating it and continue. if not node.getDecorator(ConvexHullDecorator) and not node.callDecoration("isNonPrintingMesh") and node.callDecoration("getLayerData") is None: @@ -168,6 +173,8 @@ class PlatformPhysics: op = PlatformPhysicsOperation.PlatformPhysicsOperation(node, move_vector) op.push() + # setting this drop to model same as app_automatic_drop_down + self._app_all_model_drop = False # After moving, we have to evaluate the boundary checks for nodes build_volume.updateNodeBoundaryCheck() diff --git a/cura/PrintOrderManager.py b/cura/PrintOrderManager.py new file mode 100644 index 0000000000..59bbe684f4 --- /dev/null +++ b/cura/PrintOrderManager.py @@ -0,0 +1,174 @@ +from typing import List, Callable, Optional, Any + +from PyQt6.QtCore import pyqtProperty, pyqtSignal, QObject, pyqtSlot +from UM.Application import Application +from UM.Scene.Selection import Selection + +from cura.Scene.CuraSceneNode import CuraSceneNode + + +class PrintOrderManager(QObject): + """Allows to order the object list to set the print sequence manually""" + + def __init__(self, get_nodes: Callable[[], List[CuraSceneNode]]) -> None: + super().__init__() + self._get_nodes = get_nodes + self._configureEvents() + + _settingsChanged = pyqtSignal() + _uiActionsOutdated = pyqtSignal() + printOrderChanged = pyqtSignal() + + @pyqtSlot() + def swapSelectedAndPreviousNodes(self) -> None: + selected_node, previous_node, next_node = self._getSelectedAndNeighborNodes() + self._swapPrintOrders(selected_node, previous_node) + + @pyqtSlot() + def swapSelectedAndNextNodes(self) -> None: + selected_node, previous_node, next_node = self._getSelectedAndNeighborNodes() + self._swapPrintOrders(selected_node, next_node) + + @pyqtProperty(str, notify=_uiActionsOutdated) + def previousNodeName(self) -> str: + selected_node, previous_node, next_node = self._getSelectedAndNeighborNodes() + return self._getNodeName(previous_node) + + @pyqtProperty(str, notify=_uiActionsOutdated) + def nextNodeName(self) -> str: + selected_node, previous_node, next_node = self._getSelectedAndNeighborNodes() + return self._getNodeName(next_node) + + @pyqtProperty(bool, notify=_uiActionsOutdated) + def shouldEnablePrintBeforeAction(self) -> bool: + selected_node, previous_node, next_node = self._getSelectedAndNeighborNodes() + can_swap_with_previous_node = selected_node is not None and previous_node is not None + return can_swap_with_previous_node + + @pyqtProperty(bool, notify=_uiActionsOutdated) + def shouldEnablePrintAfterAction(self) -> bool: + selected_node, previous_node, next_node = self._getSelectedAndNeighborNodes() + can_swap_with_next_node = selected_node is not None and next_node is not None + return can_swap_with_next_node + + @pyqtProperty(bool, notify=_settingsChanged) + def shouldShowEditPrintOrderActions(self) -> bool: + return PrintOrderManager.isUserDefinedPrintOrderEnabled() + + @staticmethod + def isUserDefinedPrintOrderEnabled() -> bool: + stack = Application.getInstance().getGlobalContainerStack() + is_enabled = stack and \ + stack.getProperty("print_sequence", "value") == "one_at_a_time" and \ + stack.getProperty("user_defined_print_order_enabled", "value") + return bool(is_enabled) + + @staticmethod + def initializePrintOrders(nodes: List[CuraSceneNode]) -> None: + """Just created (loaded from file) nodes have print order 0. + + This method initializes print orders with max value to put nodes at the end of object list""" + max_print_order = max(map(lambda n: n.printOrder, nodes), default=0) + for node in nodes: + if node.printOrder == 0: + max_print_order += 1 + node.printOrder = max_print_order + + @staticmethod + def updatePrintOrdersAfterGroupOperation( + all_nodes: List[CuraSceneNode], + group_node: CuraSceneNode, + grouped_nodes: List[CuraSceneNode] + ) -> None: + group_node.printOrder = min(map(lambda n: n.printOrder, grouped_nodes)) + + all_nodes.append(group_node) + for node in grouped_nodes: + all_nodes.remove(node) + + # reassign print orders so there won't be gaps like 1 2 5 6 7 + sorted_nodes = sorted(all_nodes, key=lambda n: n.printOrder) + for i, node in enumerate(sorted_nodes): + node.printOrder = i + 1 + + @staticmethod + def updatePrintOrdersAfterUngroupOperation( + all_nodes: List[CuraSceneNode], + group_node: CuraSceneNode, + ungrouped_nodes: List[CuraSceneNode] + ) -> None: + all_nodes.remove(group_node) + nodes_to_update_print_order = filter(lambda n: n.printOrder > group_node.printOrder, all_nodes) + for node in nodes_to_update_print_order: + node.printOrder += len(ungrouped_nodes) - 1 + + for i, child in enumerate(ungrouped_nodes): + child.printOrder = group_node.printOrder + i + all_nodes.append(child) + + def _swapPrintOrders(self, node1: CuraSceneNode, node2: CuraSceneNode) -> None: + if node1 and node2: + node1.printOrder, node2.printOrder = node2.printOrder, node1.printOrder # swap print orders + self.printOrderChanged.emit() # update object list first + self._uiActionsOutdated.emit() # then update UI actions + + def _getSelectedAndNeighborNodes(self + ) -> (Optional[CuraSceneNode], Optional[CuraSceneNode], Optional[CuraSceneNode]): + nodes = self._get_nodes() + ordered_nodes = sorted(nodes, key=lambda n: n.printOrder) + for i, node in enumerate(ordered_nodes, 1): + node.printOrder = i + + selected_node = PrintOrderManager._getSingleSelectedNode() + if selected_node and selected_node in ordered_nodes: + selected_node_index = ordered_nodes.index(selected_node) + else: + selected_node_index = None + + if selected_node_index is not None and selected_node_index - 1 >= 0: + previous_node = ordered_nodes[selected_node_index - 1] + else: + previous_node = None + + if selected_node_index is not None and selected_node_index + 1 < len(ordered_nodes): + next_node = ordered_nodes[selected_node_index + 1] + else: + next_node = None + + return selected_node, previous_node, next_node + + @staticmethod + def _getNodeName(node: CuraSceneNode, max_length: int = 30) -> str: + node_name = node.getName() if node else "" + truncated_node_name = node_name[:max_length] + return truncated_node_name + + @staticmethod + def _getSingleSelectedNode() -> Optional[CuraSceneNode]: + if len(Selection.getAllSelectedObjects()) == 1: + selected_node = Selection.getSelectedObject(0) + return selected_node + return None + + def _configureEvents(self) -> None: + Selection.selectionChanged.connect(self._onSelectionChanged) + self._global_stack = None + Application.getInstance().globalContainerStackChanged.connect(self._onGlobalStackChanged) + self._onGlobalStackChanged() + + def _onGlobalStackChanged(self) -> None: + if self._global_stack: + self._global_stack.propertyChanged.disconnect(self._onSettingsChanged) + self._global_stack.containersChanged.disconnect(self._onSettingsChanged) + + self._global_stack = Application.getInstance().getGlobalContainerStack() + + if self._global_stack: + self._global_stack.propertyChanged.connect(self._onSettingsChanged) + self._global_stack.containersChanged.connect(self._onSettingsChanged) + + def _onSettingsChanged(self, *args: Any) -> None: + self._settingsChanged.emit() + + def _onSelectionChanged(self) -> None: + self._uiActionsOutdated.emit() diff --git a/cura/Scene/CuraSceneNode.py b/cura/Scene/CuraSceneNode.py index 5fbaded650..65b7c1e593 100644 --- a/cura/Scene/CuraSceneNode.py +++ b/cura/Scene/CuraSceneNode.py @@ -11,6 +11,7 @@ from UM.Scene.SceneNode import SceneNode from UM.Scene.SceneNodeDecorator import SceneNodeDecorator # To cast the deepcopy of every decorator back to SceneNodeDecorator. import cura.CuraApplication # To get the build plate. +from UM.Scene.SceneNodeSettings import SceneNodeSettings from cura.Settings.ExtruderStack import ExtruderStack # For typing. from cura.Settings.SettingOverrideDecorator import SettingOverrideDecorator # For per-object settings. @@ -25,13 +26,26 @@ class CuraSceneNode(SceneNode): if not no_setting_override: self.addDecorator(SettingOverrideDecorator()) # Now we always have a getActiveExtruderPosition, unless explicitly disabled self._outside_buildarea = False + self._print_order = 0 def setOutsideBuildArea(self, new_value: bool) -> None: self._outside_buildarea = new_value + @property + def printOrder(self): + return self._print_order + + @printOrder.setter + def printOrder(self, new_value): + self._print_order = new_value + def isOutsideBuildArea(self) -> bool: return self._outside_buildarea or self.callDecoration("getBuildPlateNumber") < 0 + @property + def isDropDownEnabled(self) ->bool: + return self.getSetting(SceneNodeSettings.AutoDropDown, Application.getInstance().getPreferences().getValue("physics/automatic_drop_down")) + def isVisible(self) -> bool: return super().isVisible() and self.callDecoration("getBuildPlateNumber") == cura.CuraApplication.CuraApplication.getInstance().getMultiBuildPlateModel().activeBuildPlate @@ -157,3 +171,6 @@ class CuraSceneNode(SceneNode): def transformChanged(self) -> None: self._transformChanged() + + def __repr__(self) -> str: + return "{print_order}. {name}".format(print_order = self._print_order, name = self.getName()) diff --git a/cura/SingleInstance.py b/cura/SingleInstance.py index 61ab1204fe..0448ddc647 100644 --- a/cura/SingleInstance.py +++ b/cura/SingleInstance.py @@ -5,16 +5,18 @@ import json import os from typing import List, Optional +from PyQt6.QtCore import QUrl from PyQt6.QtNetwork import QLocalServer, QLocalSocket -from UM.Qt.QtApplication import QtApplication #For typing. +from UM.Qt.QtApplication import QtApplication # For typing. from UM.Logger import Logger class SingleInstance: - def __init__(self, application: QtApplication, files_to_open: Optional[List[str]]) -> None: + def __init__(self, application: QtApplication, files_to_open: Optional[List[str]], url_to_open: Optional[List[str]]) -> None: self._application = application self._files_to_open = files_to_open + self._url_to_open = url_to_open self._single_instance_server = None @@ -33,7 +35,7 @@ class SingleInstance: return False # We only send the files that need to be opened. - if not self._files_to_open: + if not self._files_to_open and not self._url_to_open: Logger.log("i", "No file need to be opened, do nothing.") return True @@ -55,8 +57,12 @@ class SingleInstance: payload = {"command": "open", "filePath": os.path.abspath(filename)} single_instance_socket.write(bytes(json.dumps(payload) + "\n", encoding = "ascii")) + for url in self._url_to_open: + payload = {"command": "open-url", "urlPath": url.toString()} + single_instance_socket.write(bytes(json.dumps(payload) + "\n", encoding="ascii")) + payload = {"command": "close-connection"} - single_instance_socket.write(bytes(json.dumps(payload) + "\n", encoding = "ascii")) + single_instance_socket.write(bytes(json.dumps(payload) + "\n", encoding="ascii")) single_instance_socket.flush() single_instance_socket.waitForDisconnected() @@ -72,7 +78,7 @@ class SingleInstance: def _onClientConnected(self) -> None: Logger.log("i", "New connection received on our single-instance server") - connection = None #type: Optional[QLocalSocket] + connection = None # type: Optional[QLocalSocket] if self._single_instance_server: connection = self._single_instance_server.nextPendingConnection() @@ -81,7 +87,7 @@ class SingleInstance: def __readCommands(self, connection: QLocalSocket) -> None: line = connection.readLine() - while len(line) != 0: # There is also a .canReadLine() + while len(line) != 0: # There is also a .canReadLine() try: payload = json.loads(str(line, encoding = "ascii").strip()) command = payload["command"] @@ -94,13 +100,19 @@ class SingleInstance: elif command == "open": self._application.callLater(lambda f = payload["filePath"]: self._application._openFile(f)) + #command: Load a url link in Cura + elif command == "open-url": + url = QUrl(payload["urlPath"]) + self._application.callLater(lambda: self._application._openUrl(url)) + + # Command: Activate the window and bring it to the top. elif command == "focus": # Operating systems these days prevent windows from moving around by themselves. # 'alert' or flashing the icon in the taskbar is the best thing we do now. main_window = self._application.getMainWindow() if main_window is not None: - self._application.callLater(lambda: main_window.alert(0)) # type: ignore # I don't know why MyPy complains here + self._application.callLater(lambda: main_window.alert(0)) # type: ignore # I don't know why MyPy complains here # Command: Close the socket connection. We're done. elif command == "close-connection": diff --git a/cura/UI/ObjectsModel.py b/cura/UI/ObjectsModel.py index 4f64270247..4d5a4dfc81 100644 --- a/cura/UI/ObjectsModel.py +++ b/cura/UI/ObjectsModel.py @@ -14,6 +14,9 @@ from UM.Scene.SceneNode import SceneNode from UM.Scene.Selection import Selection from UM.i18n import i18nCatalog +from cura.PrintOrderManager import PrintOrderManager +from cura.Scene.CuraSceneNode import CuraSceneNode + catalog = i18nCatalog("cura") @@ -76,6 +79,9 @@ class ObjectsModel(ListModel): self._build_plate_number = nr self._update() + def getNodes(self) -> List[CuraSceneNode]: + return list(map(lambda n: n["node"], self.items)) + def _updateSceneDelayed(self, source) -> None: if not isinstance(source, Camera): self._update_timer.start() @@ -175,6 +181,10 @@ class ObjectsModel(ListModel): all_nodes = self._renameNodes(name_to_node_info_dict) + user_defined_print_order_enabled = PrintOrderManager.isUserDefinedPrintOrderEnabled() + if user_defined_print_order_enabled: + PrintOrderManager.initializePrintOrders(all_nodes) + for node in all_nodes: if hasattr(node, "isOutsideBuildArea"): is_outside_build_area = node.isOutsideBuildArea() # type: ignore @@ -223,8 +233,13 @@ class ObjectsModel(ListModel): # for anti overhang meshes and groups the extruder nr is irrelevant extruder_number = -1 + if not user_defined_print_order_enabled: + name = node.getName() + else: + name = "{print_order}. {name}".format(print_order = node.printOrder, name = node.getName()) + nodes.append({ - "name": node.getName(), + "name": name, "selected": Selection.isSelected(node), "outside_build_area": is_outside_build_area, "buildplate_number": node_build_plate_number, @@ -234,5 +249,5 @@ class ObjectsModel(ListModel): "node": node }) - nodes = sorted(nodes, key=lambda n: n["name"]) + nodes = sorted(nodes, key=lambda n: n["name"] if not user_defined_print_order_enabled else n["node"].printOrder) self.setItems(nodes) diff --git a/plugins/3MFReader/SpecificSettingsModel.py b/plugins/3MFReader/SpecificSettingsModel.py new file mode 100644 index 0000000000..ac8e7af3ef --- /dev/null +++ b/plugins/3MFReader/SpecificSettingsModel.py @@ -0,0 +1,46 @@ +# Copyright (c) 2024 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + +from PyQt6.QtCore import Qt + +from UM.Logger import Logger +from UM.Settings.SettingDefinition import SettingDefinition +from UM.Qt.ListModel import ListModel + + +class SpecificSettingsModel(ListModel): + CategoryRole = Qt.ItemDataRole.UserRole + 1 + LabelRole = Qt.ItemDataRole.UserRole + 2 + ValueRole = Qt.ItemDataRole.UserRole + 3 + + def __init__(self, parent = None): + super().__init__(parent = parent) + self.addRoleName(self.CategoryRole, "category") + self.addRoleName(self.LabelRole, "label") + self.addRoleName(self.ValueRole, "value") + + self._i18n_catalog = None + self._update() + + + def addSettingsFromStack(self, stack, category, settings): + for setting, value in settings.items(): + unit = stack.getProperty(setting, "unit") + + setting_type = stack.getProperty(setting, "type") + if setting_type is not None: + # This is not very good looking, but will do for now + value = str(SettingDefinition.settingValueToString(setting_type, value)) + " " + str(unit) + else: + value = str(value) + + self.appendItem({ + "category": category, + "label": stack.getProperty(setting, "label"), + "value": value + }) + + def _update(self): + Logger.debug(f"Updating {self.__class__.__name__}") + self.setItems([]) + return diff --git a/plugins/3MFReader/ThreeMFReader.py b/plugins/3MFReader/ThreeMFReader.py index 13a97d5a89..99852d84ce 100755 --- a/plugins/3MFReader/ThreeMFReader.py +++ b/plugins/3MFReader/ThreeMFReader.py @@ -16,6 +16,7 @@ from UM.Mesh.MeshReader import MeshReader from UM.MimeTypeDatabase import MimeTypeDatabase, MimeType from UM.Scene.GroupDecorator import GroupDecorator from UM.Scene.SceneNode import SceneNode # For typing. +from UM.Scene.SceneNodeSettings import SceneNodeSettings from cura.CuraApplication import CuraApplication from cura.Machines.ContainerTree import ContainerTree from cura.Scene.BuildPlateDecorator import BuildPlateDecorator @@ -41,7 +42,7 @@ class ThreeMFReader(MeshReader): MimeTypeDatabase.addMimeType( MimeType( - name = "application/vnd.ms-package.3dmanufacturing-3dmodel+xml", + name="application/vnd.ms-package.3dmanufacturing-3dmodel+xml", comment="3MF", suffixes=["3mf"] ) @@ -177,6 +178,12 @@ class ThreeMFReader(MeshReader): else: Logger.log("w", "Unable to find extruder in position %s", setting_value) continue + if key == "print_order": + um_node.printOrder = int(setting_value) + continue + if key =="drop_to_buildplate": + um_node.setSetting(SceneNodeSettings.AutoDropDown, eval(setting_value)) + continue if key in known_setting_keys: setting_container.setProperty(key, "value", setting_value) else: diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index b97cb34b01..e6992611c1 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -5,6 +5,7 @@ from configparser import ConfigParser import zipfile import os import json +import re from typing import cast, Dict, List, Optional, Tuple, Any, Set import xml.etree.ElementTree as ET @@ -57,6 +58,7 @@ _ignored_machine_network_metadata: Set[str] = { "is_abstract_machine" } +USER_SETTINGS_PATH = "Cura/user-settings.json" class ContainerInfo: def __init__(self, file_name: Optional[str], serialized: Optional[str], parser: Optional[ConfigParser]) -> None: @@ -115,6 +117,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): self._supported_extensions = [".3mf"] self._dialog = WorkspaceDialog() self._3mf_mesh_reader = None + self._is_ucp = None self._container_registry = ContainerRegistry.getInstance() # suffixes registered with the MimeTypes don't start with a dot '.' @@ -141,10 +144,16 @@ class ThreeMFWorkspaceReader(WorkspaceReader): self._old_new_materials: Dict[str, str] = {} self._machine_info = None + self._user_settings: Dict[str, Dict[str, Any]] = {} + def _clearState(self): self._id_mapping = {} self._old_new_materials = {} self._machine_info = None + self._user_settings = {} + + def clearOpenAsUcp(self): + self._is_ucp = None def getNewId(self, old_id: str): """Get a unique name based on the old_id. This is different from directly calling the registry in that it caches results. @@ -200,6 +209,16 @@ class ThreeMFWorkspaceReader(WorkspaceReader): return global_stack_file_list[0], extruder_stack_file_list + def _isProjectUcp(self, file_name) -> bool: + if self._is_ucp == None: + archive = zipfile.ZipFile(file_name, "r") + cura_file_names = [name for name in archive.namelist() if name.startswith("Cura/")] + self._is_ucp =True if USER_SETTINGS_PATH in cura_file_names else False + + def getIsProjectUcp(self) -> bool: + return self._is_ucp + + def preRead(self, file_name, show_dialog=True, *args, **kwargs): """Read some info so we can make decisions @@ -208,7 +227,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): we don't want to show a dialog. """ self._clearState() - + self._isProjectUcp(file_name) self._3mf_mesh_reader = Application.getInstance().getMeshFileHandler().getReaderForFile(file_name) if self._3mf_mesh_reader and self._3mf_mesh_reader.preRead(file_name) == WorkspaceReader.PreReadResult.accepted: pass @@ -228,11 +247,14 @@ class ThreeMFWorkspaceReader(WorkspaceReader): self._resolve_strategies = {k: None for k in resolve_strategy_keys} containers_found_dict = {k: False for k in resolve_strategy_keys} + # Check whether the file is a UCP, which changes some import options + is_ucp = USER_SETTINGS_PATH in cura_file_names + # # Read definition containers # machine_definition_id = None - updatable_machines = [] + updatable_machines = None if self._is_ucp else [] machine_definition_container_count = 0 extruder_definition_container_count = 0 definition_container_files = [name for name in cura_file_names if name.endswith(self._definition_container_suffix)] @@ -250,7 +272,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): if definition_container_type == "machine": machine_definition_id = container_id machine_definition_containers = self._container_registry.findDefinitionContainers(id = machine_definition_id) - if machine_definition_containers: + if machine_definition_containers and updatable_machines is not None: updatable_machines = [machine for machine in self._container_registry.findContainerStacks(type = "machine") if machine.definition == machine_definition_containers[0]] machine_type = definition_container["name"] variant_type_name = definition_container.get("variants_name", variant_type_name) @@ -597,6 +619,39 @@ class ThreeMFWorkspaceReader(WorkspaceReader): package_metadata = self._parse_packages_metadata(archive) missing_package_metadata = self._filter_missing_package_metadata(package_metadata) + # Load the user specifically exported settings + self._dialog.exportedSettingModel.clear() + self._dialog.setCurrentMachineName("") + if self._is_ucp: + try: + self._user_settings = json.loads(archive.open("Cura/user-settings.json").read().decode("utf-8")) + any_extruder_stack = ExtruderManager.getInstance().getExtruderStack(0) + actual_global_stack = CuraApplication.getInstance().getGlobalContainerStack() + self._dialog.setCurrentMachineName(actual_global_stack.id) + + for stack_name, settings in self._user_settings.items(): + if stack_name == 'global': + self._dialog.exportedSettingModel.addSettingsFromStack(actual_global_stack, i18n_catalog.i18nc("@label", "Global"), settings) + else: + extruder_match = re.fullmatch('extruder_([0-9]+)', stack_name) + if extruder_match is not None: + extruder_nr = int(extruder_match.group(1)) + self._dialog.exportedSettingModel.addSettingsFromStack(any_extruder_stack, + i18n_catalog.i18nc("@label", + "Extruder {0}", extruder_nr + 1), + settings) + except KeyError as e: + # If there is no user settings file, it's not a UCP, so notify user of failure. + Logger.log("w", "File %s is not a valid UCP.", file_name) + message = Message( + i18n_catalog.i18nc("@info:error Don't translate the XML tags or !", + "Project file {0} is corrupt: {1}.", + file_name, str(e)), + title=i18n_catalog.i18nc("@info:title", "Can't Open Project File"), + message_type=Message.MessageType.ERROR) + message.show() + return WorkspaceReader.PreReadResult.failed + # Show the dialog, informing the user what is about to happen. self._dialog.setMachineConflict(machine_conflict) self._dialog.setIsPrinterGroup(is_printer_group) @@ -617,12 +672,15 @@ class ThreeMFWorkspaceReader(WorkspaceReader): self._dialog.setVariantType(variant_type_name) self._dialog.setHasObjectsOnPlate(Application.getInstance().platformActivity) self._dialog.setMissingPackagesMetadata(missing_package_metadata) + self._dialog.setAllowCreatemachine(not self._is_ucp) + self._dialog.setIsUcp(self._is_ucp) self._dialog.show() + # Choosing the initially selected printer in MachineSelector is_networked_machine = False is_abstract_machine = False - if global_stack and isinstance(global_stack, GlobalStack): + if global_stack and isinstance(global_stack, GlobalStack) and not self._is_ucp: # The machine included in the project file exists locally already, no need to change selected printers. is_networked_machine = global_stack.hasNetworkedConnection() is_abstract_machine = parseBool(existing_global_stack.getMetaDataEntry("is_abstract_machine", False)) @@ -631,7 +689,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): elif self._dialog.updatableMachinesModel.count > 0: # The machine included in the project file does not exist. There is another machine of the same type. # This will always default to an abstract machine first. - machine = self._dialog.updatableMachinesModel.getItem(0) + machine = self._dialog.updatableMachinesModel.getItem(self._dialog.currentMachinePositionIndex) machine_name = machine["name"] is_networked_machine = machine["isNetworked"] is_abstract_machine = machine["isAbstractMachine"] @@ -648,6 +706,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): self._dialog.setIsNetworkedMachine(is_networked_machine) self._dialog.setIsAbstractMachine(is_abstract_machine) self._dialog.setMachineName(machine_name) + self._dialog.updateCompatibleMachine() # Block until the dialog is closed. self._dialog.waitForClose() @@ -669,7 +728,6 @@ class ThreeMFWorkspaceReader(WorkspaceReader): if key not in containers_found_dict or strategy is not None: continue self._resolve_strategies[key] = "override" if containers_found_dict[key] else "new" - return WorkspaceReader.PreReadResult.accepted @call_on_qt_thread @@ -690,16 +748,16 @@ class ThreeMFWorkspaceReader(WorkspaceReader): except EnvironmentError as e: message = Message(i18n_catalog.i18nc("@info:error Don't translate the XML tags or !", "Project file {0} is suddenly inaccessible: {1}.", file_name, str(e)), - title = i18n_catalog.i18nc("@info:title", "Can't Open Project File"), - message_type = Message.MessageType.ERROR) + title = i18n_catalog.i18nc("@info:title", "Can't Open Project File"), + message_type = Message.MessageType.ERROR) message.show() self.setWorkspaceName("") return [], {} except zipfile.BadZipFile as e: message = Message(i18n_catalog.i18nc("@info:error Don't translate the XML tags or !", "Project file {0} is corrupt: {1}.", file_name, str(e)), - title = i18n_catalog.i18nc("@info:title", "Can't Open Project File"), - message_type = Message.MessageType.ERROR) + title = i18n_catalog.i18nc("@info:title", "Can't Open Project File"), + message_type = Message.MessageType.ERROR) message.show() self.setWorkspaceName("") return [], {} @@ -761,9 +819,9 @@ class ThreeMFWorkspaceReader(WorkspaceReader): # Find the machine which will be overridden global_stacks = self._container_registry.findContainerStacks(id = self._dialog.getMachineToOverride(), type = "machine") if not global_stacks: - message = Message(i18n_catalog.i18nc("@info:error Don't translate the XML tag !", + message = Message(i18n_catalog.i18nc("@info:error Don't translate the XML tag !", "Project file {0} is made using profiles that are unknown to this version of UltiMaker Cura.", file_name), - message_type = Message.MessageType.ERROR) + message_type = Message.MessageType.ERROR) message.show() self.setWorkspaceName("") return [], {} @@ -777,84 +835,90 @@ class ThreeMFWorkspaceReader(WorkspaceReader): for stack in extruder_stacks: stack.setNextStack(global_stack, connect_signals = False) - Logger.log("d", "Workspace loading is checking definitions...") - # Get all the definition files & check if they exist. If not, add them. - definition_container_files = [name for name in cura_file_names if name.endswith(self._definition_container_suffix)] - for definition_container_file in definition_container_files: - container_id = self._stripFileToId(definition_container_file) + if not self._is_ucp: + Logger.log("d", "Workspace loading is checking definitions...") + # Get all the definition files & check if they exist. If not, add them. + definition_container_files = [name for name in cura_file_names if name.endswith(self._definition_container_suffix)] + for definition_container_file in definition_container_files: + container_id = self._stripFileToId(definition_container_file) - definitions = self._container_registry.findDefinitionContainersMetadata(id = container_id) - if not definitions: - definition_container = DefinitionContainer(container_id) - try: - definition_container.deserialize(archive.open(definition_container_file).read().decode("utf-8"), - file_name = definition_container_file) - except ContainerFormatError: - # We cannot just skip the definition file because everything else later will just break if the - # machine definition cannot be found. - Logger.logException("e", "Failed to deserialize definition file %s in project file %s", - definition_container_file, file_name) - 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. - xml_material_profile = self._getXmlProfileClass() - if self._material_container_suffix is None: - self._material_container_suffix = ContainerRegistry.getMimeTypeForContainer(xml_material_profile).suffixes[0] - if xml_material_profile: - material_container_files = [name for name in cura_file_names if name.endswith(self._material_container_suffix)] - for material_container_file in material_container_files: - to_deserialize_material = False - container_id = self._stripFileToId(material_container_file) - need_new_name = False - materials = self._container_registry.findInstanceContainers(id = container_id) - - if not materials: - # No material found, deserialize this material later and add it - to_deserialize_material = True - else: - material_container = materials[0] - old_material_root_id = material_container.getMetaDataEntry("base_file") - if old_material_root_id is not None and not self._container_registry.isReadOnly(old_material_root_id): # Only create new materials if they are not read only. - to_deserialize_material = True - - if self._resolve_strategies["material"] == "override": - # Remove the old materials and then deserialize the one from the project - root_material_id = material_container.getMetaDataEntry("base_file") - application.getContainerRegistry().removeContainer(root_material_id) - elif self._resolve_strategies["material"] == "new": - # Note that we *must* deserialize it with a new ID, as multiple containers will be - # auto created & added. - container_id = self.getNewId(container_id) - self._old_new_materials[old_material_root_id] = container_id - need_new_name = True - - if to_deserialize_material: - material_container = xml_material_profile(container_id) + definitions = self._container_registry.findDefinitionContainersMetadata(id = container_id) + if not definitions: + definition_container = DefinitionContainer(container_id) try: - material_container.deserialize(archive.open(material_container_file).read().decode("utf-8"), - file_name = container_id + "." + self._material_container_suffix) + definition_container.deserialize(archive.open(definition_container_file).read().decode("utf-8"), + file_name = definition_container_file) except ContainerFormatError: - Logger.logException("e", "Failed to deserialize material file %s in project file %s", - material_container_file, file_name) - continue - if need_new_name: - new_name = ContainerRegistry.getInstance().uniqueName(material_container.getName()) - material_container.setName(new_name) - material_container.setDirty(True) - self._container_registry.addContainer(material_container) + # We cannot just skip the definition file because everything else later will just break if the + # machine definition cannot be found. + Logger.logException("e", "Failed to deserialize definition file %s in project file %s", + definition_container_file, file_name) + 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. - if global_stack: - # Handle quality changes if any - self._processQualityChanges(global_stack) + Logger.log("d", "Workspace loading is checking materials...") + # Get all the material files and check if they exist. If not, add them. + xml_material_profile = self._getXmlProfileClass() + if self._material_container_suffix is None: + self._material_container_suffix = ContainerRegistry.getMimeTypeForContainer(xml_material_profile).suffixes[0] + if xml_material_profile: + material_container_files = [name for name in cura_file_names if name.endswith(self._material_container_suffix)] + for material_container_file in material_container_files: + to_deserialize_material = False + container_id = self._stripFileToId(material_container_file) + need_new_name = False + materials = self._container_registry.findInstanceContainers(id = container_id) + + if not materials: + # No material found, deserialize this material later and add it + to_deserialize_material = True + else: + material_container = materials[0] + old_material_root_id = material_container.getMetaDataEntry("base_file") + if old_material_root_id is not None and not self._container_registry.isReadOnly(old_material_root_id): # Only create new materials if they are not read only. + to_deserialize_material = True + + if self._resolve_strategies["material"] == "override": + # Remove the old materials and then deserialize the one from the project + root_material_id = material_container.getMetaDataEntry("base_file") + application.getContainerRegistry().removeContainer(root_material_id) + elif self._resolve_strategies["material"] == "new": + # Note that we *must* deserialize it with a new ID, as multiple containers will be + # auto created & added. + container_id = self.getNewId(container_id) + self._old_new_materials[old_material_root_id] = container_id + need_new_name = True + + if to_deserialize_material: + material_container = xml_material_profile(container_id) + try: + material_container.deserialize(archive.open(material_container_file).read().decode("utf-8"), + file_name = container_id + "." + self._material_container_suffix) + except ContainerFormatError: + Logger.logException("e", "Failed to deserialize material file %s in project file %s", + material_container_file, file_name) + continue + if need_new_name: + new_name = ContainerRegistry.getInstance().uniqueName(material_container.getName()) + material_container.setName(new_name) + material_container.setDirty(True) + self._container_registry.addContainer(material_container) + Job.yieldThread() + QCoreApplication.processEvents() # Ensure that the GUI does not freeze. + + if global_stack: + if not self._is_ucp: + # Handle quality changes if any + self._processQualityChanges(global_stack) + + # Prepare the machine + self._applyChangesToMachine(global_stack, extruder_stack_dict) + else: + # Just clear the settings now, so that we can change the active machine without conflicts + self._clearMachineSettings(global_stack, {}) - # Prepare the machine - self._applyChangesToMachine(global_stack, extruder_stack_dict) Logger.log("d", "Workspace loading is notifying rest of the code of changes...") # Actually change the active machine. @@ -864,8 +928,13 @@ class ThreeMFWorkspaceReader(WorkspaceReader): # function is running on the main thread (Qt thread), although those "changed" signals have been emitted, but # they won't take effect until this function is done. # To solve this, we schedule _updateActiveMachine() for later so it will have the latest data. + self._updateActiveMachine(global_stack) + if self._is_ucp: + # Now we have switched, apply the user settings + self._applyUserSettings(global_stack, extruder_stack_dict, self._user_settings) + # Load all the nodes / mesh data of the workspace nodes = self._3mf_mesh_reader.read(file_name) if nodes is None: @@ -874,6 +943,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): base_file_name = os.path.basename(file_name) self.setWorkspaceName(base_file_name) + self._is_ucp = None return nodes, self._loadMetadata(file_name) @staticmethod @@ -1177,21 +1247,44 @@ class ThreeMFWorkspaceReader(WorkspaceReader): material_node = machine_node.variants[extruder_stack.variant.getName()].materials[root_material_id] extruder_stack.material = material_node.container - def _applyChangesToMachine(self, global_stack, extruder_stack_dict): - # Clear all first + def _clearMachineSettings(self, global_stack, extruder_stack_dict): self._clearStack(global_stack) for extruder_stack in extruder_stack_dict.values(): self._clearStack(extruder_stack) + self._quality_changes_to_apply = None + self._quality_type_to_apply = None + self._intent_category_to_apply = None + self._user_settings_to_apply = None + + def _applyUserSettings(self, global_stack, extruder_stack_dict, user_settings): + for stack_name, settings in user_settings.items(): + if stack_name == 'global': + ThreeMFWorkspaceReader._applyUserSettingsOnStack(global_stack, settings) + else: + extruder_match = re.fullmatch('extruder_([0-9]+)', stack_name) + if extruder_match is not None: + extruder_nr = extruder_match.group(1) + if extruder_nr in extruder_stack_dict: + ThreeMFWorkspaceReader._applyUserSettingsOnStack(extruder_stack_dict[extruder_nr], settings) + + @staticmethod + def _applyUserSettingsOnStack(stack, user_settings): + user_settings_container = stack.userChanges + + for setting_to_import, setting_value in user_settings.items(): + user_settings_container.setProperty(setting_to_import, 'value', setting_value) + + def _applyChangesToMachine(self, global_stack, extruder_stack_dict): + # Clear all first + self._clearMachineSettings(global_stack, extruder_stack_dict) + self._applyDefinitionChanges(global_stack, extruder_stack_dict) self._applyUserChanges(global_stack, extruder_stack_dict) self._applyVariants(global_stack, extruder_stack_dict) self._applyMaterials(global_stack, extruder_stack_dict) # prepare the quality to select - self._quality_changes_to_apply = None - self._quality_type_to_apply = None - self._intent_category_to_apply = None if self._machine_info.quality_changes_info is not None: self._quality_changes_to_apply = self._machine_info.quality_changes_info.name else: @@ -1229,39 +1322,40 @@ class ThreeMFWorkspaceReader(WorkspaceReader): machine_manager.setActiveMachine(global_stack.getId()) # Set metadata fields that are missing from the global stack - for key, value in self._machine_info.metadata_dict.items(): - if key not in global_stack.getMetaData() and key not in _ignored_machine_network_metadata: - global_stack.setMetaDataEntry(key, value) + if not self._is_ucp: + for key, value in self._machine_info.metadata_dict.items(): + if key not in global_stack.getMetaData() and key not in _ignored_machine_network_metadata: + global_stack.setMetaDataEntry(key, value) - if self._quality_changes_to_apply: - quality_changes_group_list = container_tree.getCurrentQualityChangesGroups() - quality_changes_group = next((qcg for qcg in quality_changes_group_list if qcg.name == self._quality_changes_to_apply), None) - if not quality_changes_group: - Logger.log("e", "Could not find quality_changes [%s]", self._quality_changes_to_apply) - return - machine_manager.setQualityChangesGroup(quality_changes_group, no_dialog = True) - else: - self._quality_type_to_apply = self._quality_type_to_apply.lower() if self._quality_type_to_apply else None - quality_group_dict = container_tree.getCurrentQualityGroups() - if self._quality_type_to_apply in quality_group_dict: - quality_group = quality_group_dict[self._quality_type_to_apply] + if self._quality_changes_to_apply !=None: + quality_changes_group_list = container_tree.getCurrentQualityChangesGroups() + quality_changes_group = next((qcg for qcg in quality_changes_group_list if qcg.name == self._quality_changes_to_apply), None) + if not quality_changes_group: + Logger.log("e", "Could not find quality_changes [%s]", self._quality_changes_to_apply) + return + machine_manager.setQualityChangesGroup(quality_changes_group, no_dialog = True) else: - Logger.log("i", "Could not find quality type [%s], switch to default", self._quality_type_to_apply) - preferred_quality_type = global_stack.getMetaDataEntry("preferred_quality_type") - quality_group = quality_group_dict.get(preferred_quality_type) - if quality_group is None: - Logger.log("e", "Could not get preferred quality type [%s]", preferred_quality_type) - - if quality_group is not None: - machine_manager.setQualityGroup(quality_group, no_dialog = True) - - # Also apply intent if available - available_intent_category_list = IntentManager.getInstance().currentAvailableIntentCategories() - if self._intent_category_to_apply is not None and self._intent_category_to_apply in available_intent_category_list: - machine_manager.setIntentByCategory(self._intent_category_to_apply) + self._quality_type_to_apply = self._quality_type_to_apply.lower() if self._quality_type_to_apply else None + quality_group_dict = container_tree.getCurrentQualityGroups() + if self._quality_type_to_apply in quality_group_dict: + quality_group = quality_group_dict[self._quality_type_to_apply] else: - # if no intent is provided, reset to the default (balanced) intent - machine_manager.resetIntents() + Logger.log("i", "Could not find quality type [%s], switch to default", self._quality_type_to_apply) + preferred_quality_type = global_stack.getMetaDataEntry("preferred_quality_type") + quality_group = quality_group_dict.get(preferred_quality_type) + if quality_group is None: + Logger.log("e", "Could not get preferred quality type [%s]", preferred_quality_type) + + if quality_group is not None: + machine_manager.setQualityGroup(quality_group, no_dialog = True) + + # Also apply intent if available + available_intent_category_list = IntentManager.getInstance().currentAvailableIntentCategories() + if self._intent_category_to_apply is not None and self._intent_category_to_apply in available_intent_category_list: + machine_manager.setIntentByCategory(self._intent_category_to_apply) + else: + # if no intent is provided, reset to the default (balanced) intent + machine_manager.resetIntents() # Notify everything/one that is to notify about changes. global_stack.containersChanged.emit(global_stack.getTop()) diff --git a/plugins/3MFReader/WorkspaceDialog.py b/plugins/3MFReader/WorkspaceDialog.py index 0203fc92b5..4b9f1eaa6f 100644 --- a/plugins/3MFReader/WorkspaceDialog.py +++ b/plugins/3MFReader/WorkspaceDialog.py @@ -22,6 +22,8 @@ import time from cura.CuraApplication import CuraApplication +from .SpecificSettingsModel import SpecificSettingsModel + i18n_catalog = i18nCatalog("cura") @@ -61,16 +63,22 @@ class WorkspaceDialog(QObject): self._machine_name = "" self._machine_type = "" self._variant_type = "" + self._current_machine_name = "" self._material_labels = [] self._extruders = [] self._objects_on_plate = False self._is_printer_group = False - self._updatable_machines_model = MachineListModel(self, listenToChanges=False) + self._updatable_machines_model = MachineListModel(self, listenToChanges = False, showCloudPrinters = True) self._missing_package_metadata: List[Dict[str, str]] = [] self._plugin_registry: PluginRegistry = CuraApplication.getInstance().getPluginRegistry() self._install_missing_package_dialog: Optional[QObject] = None self._is_abstract_machine = False self._is_networked_machine = False + self._is_compatible_machine = False + self._allow_create_machine = True + self._exported_settings_model = SpecificSettingsModel() + self._current_machine_pos_index = 0 + self._is_ucp = False machineConflictChanged = pyqtSignal() qualityChangesConflictChanged = pyqtSignal() @@ -94,6 +102,8 @@ class WorkspaceDialog(QObject): extrudersChanged = pyqtSignal() isPrinterGroupChanged = pyqtSignal() missingPackagesChanged = pyqtSignal() + isCompatibleMachineChanged = pyqtSignal() + isUcpChanged = pyqtSignal() @pyqtProperty(bool, notify = isPrinterGroupChanged) def isPrinterGroup(self) -> bool: @@ -166,8 +176,30 @@ class WorkspaceDialog(QObject): self._machine_name = machine_name self.machineNameChanged.emit() + def setCurrentMachineName(self, machine: str) -> None: + self._current_machine_name = machine + + @pyqtProperty(str, notify = machineNameChanged) + def currentMachineName(self) -> str: + return self._current_machine_name + + @staticmethod + def getIndexOfCurrentMachine(list_of_dicts, key, value, defaultIndex): + for i, d in enumerate(list_of_dicts): + if d.get(key) == value: # found the dictionary + return i + return defaultIndex + + @pyqtProperty(int, notify = machineNameChanged) + def currentMachinePositionIndex(self): + return self._current_machine_pos_index + @pyqtProperty(QObject, notify = updatableMachinesChanged) def updatableMachinesModel(self) -> MachineListModel: + if self._current_machine_name != "": + self._current_machine_pos_index = self.getIndexOfCurrentMachine(self._updatable_machines_model.getItems(), "id", self._current_machine_name, defaultIndex = 0) + else: + self._current_machine_pos_index = 0 return cast(MachineListModel, self._updatable_machines_model) def setUpdatableMachines(self, updatable_machines: List[GlobalStack]) -> None: @@ -292,6 +324,41 @@ class WorkspaceDialog(QObject): @pyqtSlot(str) def setMachineToOverride(self, machine_name: str) -> None: self._override_machine = machine_name + self.updateCompatibleMachine() + + def updateCompatibleMachine(self): + registry = ContainerRegistry.getInstance() + containers_expected = registry.findDefinitionContainers(name=self._machine_type) + containers_selected = registry.findContainerStacks(id=self._override_machine) + if len(containers_expected) == 1 and len(containers_selected) == 1: + new_compatible_machine = (containers_expected[0] == containers_selected[0].definition) + if new_compatible_machine != self._is_compatible_machine: + self._is_compatible_machine = new_compatible_machine + self.isCompatibleMachineChanged.emit() + + @pyqtProperty(bool, notify = isCompatibleMachineChanged) + def isCompatibleMachine(self) -> bool: + return self._is_compatible_machine + + def setIsUcp(self, isUcp: bool) -> None: + if isUcp != self._is_ucp: + self._is_ucp = isUcp + self.isUcpChanged.emit() + + @pyqtProperty(bool, notify=isUcpChanged) + def isUcp(self): + return self._is_ucp + + def setAllowCreatemachine(self, allow_create_machine): + self._allow_create_machine = allow_create_machine + + @pyqtProperty(bool, constant = True) + def allowCreateMachine(self): + return self._allow_create_machine + + @pyqtProperty(QObject) + def exportedSettingModel(self): + return self._exported_settings_model @pyqtSlot() def closeBackend(self) -> None: diff --git a/plugins/3MFReader/WorkspaceDialog.qml b/plugins/3MFReader/WorkspaceDialog.qml index d5f9b1817d..c8d53a1154 100644 --- a/plugins/3MFReader/WorkspaceDialog.qml +++ b/plugins/3MFReader/WorkspaceDialog.qml @@ -6,13 +6,13 @@ import QtQuick.Controls 2.3 import QtQuick.Layouts 1.3 import QtQuick.Window 2.2 -import UM 1.5 as UM +import UM 1.6 as UM import Cura 1.1 as Cura UM.Dialog { id: workspaceDialog - title: catalog.i18nc("@title:window", "Open Project") + title: manager.isUcp? catalog.i18nc("@title:window", "Open Universal Cura Project (UCP)"): catalog.i18nc("@title:window", "Open Project") margin: UM.Theme.getSize("default_margin").width minimumWidth: UM.Theme.getSize("modal_window_minimum").width @@ -28,7 +28,7 @@ UM.Dialog UM.Label { id: titleLabel - text: catalog.i18nc("@action:title", "Summary - Cura Project") + text: manager.isUcp? catalog.i18nc("@action:title", "Summary - Open Universal Cura Project (UCP)"): catalog.i18nc("@action:title", "Summary - Cura Project") font: UM.Theme.getFont("large") anchors.top: parent.top anchors.left: parent.left @@ -96,7 +96,7 @@ UM.Dialog WorkspaceRow { leftLabelText: catalog.i18nc("@action:label", manager.isPrinterGroup ? "Printer Group" : "Printer Name") - rightLabelText: manager.machineName == catalog.i18nc("@button", "Create new") ? "" : manager.machineName + rightLabelText: manager.isUcp? manager.machineType: manager.machineName == catalog.i18nc("@button", "Create new") ? "" : manager.machineName } } @@ -120,13 +120,17 @@ UM.Dialog minDropDownWidth: machineSelector.width - buttons: [ + Component + { + id: componentNewPrinter + Cura.SecondaryButton { id: createNewPrinter text: catalog.i18nc("@button", "Create new") fixedWidthMode: true width: parent.width - leftPadding * 1.5 + visible: manager.allowCreateMachine onClicked: { toggleContent() @@ -136,7 +140,9 @@ UM.Dialog manager.setIsNetworkedMachine(false) } } - ] + } + + buttons: manager.allowCreateMachine ? [componentNewPrinter.createObject()] : [] onSelectPrinter: function(machine) { @@ -153,7 +159,7 @@ UM.Dialog WorkspaceSection { id: profileSection - title: catalog.i18nc("@action:label", "Profile settings") + title: manager.isUcp? catalog.i18nc("@action:label", "Suggested Profile settings"):catalog.i18nc("@action:label", "Profile settings") iconSource: UM.Theme.getIcon("Sliders") content: Column { @@ -165,26 +171,79 @@ UM.Dialog { leftLabelText: catalog.i18nc("@action:label", "Name") rightLabelText: manager.qualityName + visible: manager.isCompatibleMachine } WorkspaceRow { leftLabelText: catalog.i18nc("@action:label", "Intent") rightLabelText: manager.intentName + visible: manager.isCompatibleMachine } WorkspaceRow { leftLabelText: catalog.i18nc("@action:label", "Not in profile") rightLabelText: catalog.i18ncp("@action:label", "%1 override", "%1 overrides", manager.numUserSettings).arg(manager.numUserSettings) - visible: manager.numUserSettings != 0 + visible: manager.numUserSettings != 0 && manager.isCompatibleMachine } WorkspaceRow { leftLabelText: catalog.i18nc("@action:label", "Derivative from") rightLabelText: catalog.i18ncp("@action:label", "%1, %2 override", "%1, %2 overrides", manager.numSettingsOverridenByQualityChanges).arg(manager.qualityType).arg(manager.numSettingsOverridenByQualityChanges) - visible: manager.numSettingsOverridenByQualityChanges != 0 + visible: manager.numSettingsOverridenByQualityChanges != 0 && manager.isCompatibleMachine + } + } + } + WorkspaceSection + { + id: ucpProfileSection + visible: manager.isUcp + title: catalog.i18nc("@action:label", "Settings Loaded from UCP file") + iconSource: UM.Theme.getIcon("Settings") + + content: Column + { + id: ucpProfileSettingsValuesTable + spacing: UM.Theme.getSize("default_margin").height + leftPadding: UM.Theme.getSize("medium_button_icon").width + UM.Theme.getSize("default_margin").width + + WorkspaceRow + { + leftLabelText: catalog.i18nc("@action:label", "Settings Loaded from UCP file") + rightLabelText: catalog.i18ncp("@action:label", "%1 override", "%1 overrides", manager.exportedSettingModel.rowCount()).arg(manager.exportedSettingModel.rowCount()) + buttonText: tableViewSpecificSettings.shouldBeVisible ? catalog.i18nc("@action:button", "Hide settings") : catalog.i18nc("@action:button", "Show settings") + onButtonClicked: tableViewSpecificSettings.shouldBeVisible = !tableViewSpecificSettings.shouldBeVisible + } + Cura.TableView + { + id: tableViewSpecificSettings + width: parent.width - parent.leftPadding - UM.Theme.getSize("default_margin").width + height: UM.Theme.getSize("card").height + visible: shouldBeVisible && manager.isUcp + property bool shouldBeVisible: true + + columnHeaders: + [ + catalog.i18nc("@title:column", "Applies on"), + catalog.i18nc("@title:column", "Setting"), + catalog.i18nc("@title:column", "Value") + ] + + model: UM.TableModel + { + id: tableModel + headers: ["category", "label", "value"] + rows: manager.exportedSettingModel.items + } + } + + property var modelRows: manager.exportedSettingModel.items + onModelRowsChanged: + { + tableModel.clear() + tableModel.rows = modelRows } } @@ -194,7 +253,7 @@ UM.Dialog id: qualityChangesResolveComboBox model: resolveStrategiesModel textRole: "label" - visible: manager.qualityChangesConflict + visible: manager.qualityChangesConflict && !manager.isUcp contentLeftPadding: UM.Theme.getSize("default_margin").width + UM.Theme.getSize("narrow_margin").width textFont: UM.Theme.getFont("medium") @@ -223,7 +282,7 @@ UM.Dialog WorkspaceSection { id: materialSection - title: catalog.i18nc("@action:label", "Material settings") + title: manager.isUcp? catalog.i18nc("@action:label", "Suggested Material settings"): catalog.i18nc("@action:label", "Material settings") iconSource: UM.Theme.getIcon("Spool") content: Column { @@ -248,7 +307,7 @@ UM.Dialog id: materialResolveComboBox model: resolveStrategiesModel textRole: "label" - visible: manager.materialConflict + visible: manager.materialConflict && !manager.isUcp contentLeftPadding: UM.Theme.getSize("default_margin").width + UM.Theme.getSize("narrow_margin").width textFont: UM.Theme.getFont("medium") @@ -279,6 +338,7 @@ UM.Dialog id: visibilitySection title: catalog.i18nc("@action:label", "Setting visibility") iconSource: UM.Theme.getIcon("Eye") + visible : !manager.isUcp content: Column { spacing: UM.Theme.getSize("default_margin").height @@ -416,12 +476,13 @@ UM.Dialog { if (visible) { - // Force relead the comboboxes + // Force reload the comboboxes // Since this dialog is only created once the first time you open it, these comboxes need to be reloaded // each time it is shown after the first time so that the indexes will update correctly. materialSection.reloadValues() profileSection.reloadValues() printerSection.reloadValues() + ucpProfileSection.reloadValues() } } } diff --git a/plugins/3MFReader/WorkspaceRow.qml b/plugins/3MFReader/WorkspaceRow.qml index 8d9f1f25b3..855b8c18b0 100644 --- a/plugins/3MFReader/WorkspaceRow.qml +++ b/plugins/3MFReader/WorkspaceRow.qml @@ -9,26 +9,38 @@ import QtQuick.Window 2.2 import UM 1.5 as UM import Cura 1.1 as Cura -Row +RowLayout { + id: root + property alias leftLabelText: leftLabel.text property alias rightLabelText: rightLabel.text + property alias buttonText: button.text + signal buttonClicked width: parent.width - height: visible ? childrenRect.height : 0 UM.Label { id: leftLabel text: catalog.i18nc("@action:label", "Type") - width: Math.round(parent.width / 4) + Layout.preferredWidth: Math.round(parent.width / 4) wrapMode: Text.WordWrap } + UM.Label { id: rightLabel text: manager.machineType - width: Math.round(parent.width / 3) wrapMode: Text.WordWrap } + + Cura.TertiaryButton + { + id: button + visible: !text.isEmpty + Layout.maximumHeight: leftLabel.implicitHeight + Layout.fillWidth: true + onClicked: root.buttonClicked() + } } \ No newline at end of file diff --git a/plugins/3MFReader/WorkspaceSection.qml b/plugins/3MFReader/WorkspaceSection.qml index 0c94ab5d6a..7c8b01be7a 100644 --- a/plugins/3MFReader/WorkspaceSection.qml +++ b/plugins/3MFReader/WorkspaceSection.qml @@ -5,7 +5,7 @@ import QtQuick 2.10 import QtQuick.Controls 2.3 -import UM 1.5 as UM +import UM 1.8 as UM Item @@ -80,34 +80,14 @@ Item sourceComponent: combobox } - MouseArea + UM.HelpIcon { - id: helpIconMouseArea anchors.right: parent.right anchors.verticalCenter: comboboxLabel.verticalCenter - width: childrenRect.width - height: childrenRect.height - hoverEnabled: true - - UM.ColorImage - { - width: UM.Theme.getSize("section_icon").width - height: width - - visible: comboboxTooltipText != "" - source: UM.Theme.getIcon("Help") - color: UM.Theme.getColor("text") - - UM.ToolTip - { - text: comboboxTooltipText - visible: helpIconMouseArea.containsMouse - targetPoint: Qt.point(parent.x + Math.round(parent.width / 2), parent.y) - x: 0 - y: parent.y + parent.height + UM.Theme.getSize("default_margin").height - width: UM.Theme.getSize("tooltip").width - } - } + color: UM.Theme.getColor("small_button_text") + icon: UM.Theme.getIcon("Information") + text: comboboxTooltipText + visible: comboboxTooltipText != "" } } diff --git a/plugins/3MFWriter/SettingExport.py b/plugins/3MFWriter/SettingExport.py new file mode 100644 index 0000000000..6702aa1f68 --- /dev/null +++ b/plugins/3MFWriter/SettingExport.py @@ -0,0 +1,38 @@ +# Copyright (c) 2024 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + +from PyQt6.QtCore import QObject, pyqtProperty, pyqtSignal + + +class SettingExport(QObject): + + def __init__(self, id, name, value, selectable): + super().__init__() + self.id = id + self._name = name + self._value = value + self._selected = selectable + self._selectable = selectable + + @pyqtProperty(str, constant=True) + def name(self): + return self._name + + @pyqtProperty(str, constant=True) + def value(self): + return self._value + + selectedChanged = pyqtSignal(bool) + + def setSelected(self, selected): + if selected != self._selected: + self._selected = selected + self.selectedChanged.emit(self._selected) + + @pyqtProperty(bool, fset = setSelected, notify = selectedChanged) + def selected(self): + return self._selected + + @pyqtProperty(bool, constant=True) + def selectable(self): + return self._selectable diff --git a/plugins/3MFWriter/SettingSelection.qml b/plugins/3MFWriter/SettingSelection.qml new file mode 100644 index 0000000000..794a5aacf6 --- /dev/null +++ b/plugins/3MFWriter/SettingSelection.qml @@ -0,0 +1,39 @@ +// Copyright (c) 2024 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 QtQuick.Window 2.2 + +import UM 1.8 as UM +import Cura 1.1 as Cura + +RowLayout +{ + id: settingSelection + + UM.CheckBox + { + text: modelData.name + Layout.preferredWidth: UM.Theme.getSize("setting").width + checked: modelData.selected + onClicked: modelData.selected = checked + tooltip: modelData.selectable ? "" :catalog.i18nc("@tooltip", "This setting may not perform well while exporting to UCP. Users are asked to add it at their own risk.") + } + + UM.Label + { + text: modelData.value + } + + UM.HelpIcon + { + UM.I18nCatalog { id: catalog; name: "cura" } + text: catalog.i18nc("@tooltip", + "This setting may not perform well while exporting to UCP, Users are asked to add it at their own risk.") + visible: !modelData.selectable + } + + +} diff --git a/plugins/3MFWriter/SettingsExportGroup.py b/plugins/3MFWriter/SettingsExportGroup.py new file mode 100644 index 0000000000..cc3fc7b4f5 --- /dev/null +++ b/plugins/3MFWriter/SettingsExportGroup.py @@ -0,0 +1,49 @@ +# Copyright (c) 2024 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + +from enum import IntEnum + +from PyQt6.QtCore import QObject, pyqtProperty, pyqtEnum + + +class SettingsExportGroup(QObject): + + @pyqtEnum + class Category(IntEnum): + Global = 0 + Extruder = 1 + Model = 2 + + def __init__(self, stack, name, category, settings, category_details = '', extruder_index = 0, extruder_color = ''): + super().__init__() + self.stack = stack + self._name = name + self._settings = settings + self._category = category + self._category_details = category_details + self._extruder_index = extruder_index + self._extruder_color = extruder_color + + @pyqtProperty(str, constant=True) + def name(self): + return self._name + + @pyqtProperty(list, constant=True) + def settings(self): + return self._settings + + @pyqtProperty(int, constant=True) + def category(self): + return self._category + + @pyqtProperty(str, constant=True) + def category_details(self): + return self._category_details + + @pyqtProperty(int, constant=True) + def extruder_index(self): + return self._extruder_index + + @pyqtProperty(str, constant=True) + def extruder_color(self): + return self._extruder_color diff --git a/plugins/3MFWriter/SettingsExportModel.py b/plugins/3MFWriter/SettingsExportModel.py new file mode 100644 index 0000000000..99ffad4bac --- /dev/null +++ b/plugins/3MFWriter/SettingsExportModel.py @@ -0,0 +1,135 @@ +# Copyright (c) 2024 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + +from dataclasses import asdict +from typing import Optional, cast, List, Dict, Pattern, Set + +from PyQt6.QtCore import QObject, pyqtProperty + +from UM.Settings.SettingDefinition import SettingDefinition +from UM.Settings.InstanceContainer import InstanceContainer +from UM.Settings.SettingFunction import SettingFunction + +from cura.CuraApplication import CuraApplication +from cura.Settings.ExtruderManager import ExtruderManager +from cura.Settings.GlobalStack import GlobalStack + +from .SettingsExportGroup import SettingsExportGroup +from .SettingExport import SettingExport + + +class SettingsExportModel(QObject): + + EXPORTABLE_SETTINGS = {'infill_sparse_density', + 'adhesion_type', + 'support_enable', + 'infill_pattern', + 'support_type', + 'support_structure', + 'support_angle', + 'support_infill_rate', + 'ironing_enabled', + 'fill_outline_gaps', + 'coasting_enable', + 'skin_monotonic', + 'z_seam_position', + 'infill_before_walls', + 'ironing_only_highest_layer', + 'xy_offset', + 'adaptive_layer_height_enabled', + 'brim_gap', + 'support_offset', + 'brim_outside_only', + 'magic_spiralize', + 'slicing_tolerance', + 'outer_inset_first', + 'magic_fuzzy_skin_outside_only', + 'conical_overhang_enabled', + 'min_infill_area', + 'small_hole_max_size', + 'magic_mesh_surface_mode', + 'carve_multiple_volumes', + 'meshfix_union_all_remove_holes', + 'support_tree_rest_preference', + 'small_feature_max_length', + 'draft_shield_enabled', + 'brim_smart_ordering', + 'ooze_shield_enabled', + 'bottom_skin_preshrink', + 'skin_edge_support_thickness', + 'alternate_carve_order', + 'top_skin_preshrink', + 'interlocking_enable'} + + PER_MODEL_EXPORTABLE_SETTINGS_KEYS = {"anti_overhang_mesh", + "infill_mesh", + "cutting_mesh", + "support_mesh"} + + def __init__(self, parent=None): + super().__init__(parent) + self._settings_groups = [] + + application = CuraApplication.getInstance() + + self._appendGlobalSettings(application) + self._appendExtruderSettings(application) + self._appendModelSettings(application) + + def _appendGlobalSettings(self, application): + global_stack = application.getGlobalContainerStack() + self._settings_groups.append(SettingsExportGroup( + global_stack, "Global settings", SettingsExportGroup.Category.Global, self._exportSettings(global_stack))) + + def _appendExtruderSettings(self, application): + extruders_stacks = ExtruderManager.getInstance().getUsedExtruderStacks() + for extruder_stack in extruders_stacks: + color = extruder_stack.material.getMetaDataEntry("color_code") if extruder_stack.material else "" + self._settings_groups.append(SettingsExportGroup( + extruder_stack, "Extruder settings", SettingsExportGroup.Category.Extruder, + self._exportSettings(extruder_stack), extruder_index=extruder_stack.position, extruder_color=color)) + + def _appendModelSettings(self, application): + scene = application.getController().getScene() + for scene_node in scene.getRoot().getChildren(): + self._appendNodeSettings(scene_node, "Model settings", SettingsExportGroup.Category.Model) + + def _appendNodeSettings(self, node, title_prefix, category): + stack = node.callDecoration("getStack") + if stack: + self._settings_groups.append(SettingsExportGroup( + stack, f"{title_prefix}", category, self._exportSettings(stack), node.getName())) + for child in node.getChildren(): + self._appendNodeSettings(child, f"Children of {node.getName()}", SettingsExportGroup.Category.Model) + + + @pyqtProperty(list, constant=True) + def settingsGroups(self) -> List[SettingsExportGroup]: + return self._settings_groups + + @staticmethod + def _exportSettings(settings_stack): + user_settings_container = settings_stack.userChanges + user_keys = user_settings_container.getAllKeys() + exportable_settings = SettingsExportModel.EXPORTABLE_SETTINGS + settings_export = [] + # Check whether any of the user keys exist in PER_MODEL_EXPORTABLE_SETTINGS_KEYS + is_exportable = any(key in SettingsExportModel.PER_MODEL_EXPORTABLE_SETTINGS_KEYS for key in user_keys) + + for setting_to_export in user_keys: + label = settings_stack.getProperty(setting_to_export, "label") + value = settings_stack.getProperty(setting_to_export, "value") + unit = settings_stack.getProperty(setting_to_export, "unit") + + setting_type = settings_stack.getProperty(setting_to_export, "type") + if setting_type is not None: + value = f"{str(SettingDefinition.settingValueToString(setting_type, value))} {unit}" + else: + value = str(value) + + settings_export.append(SettingExport(setting_to_export, + label, + value, + is_exportable or setting_to_export in exportable_settings)) + + return settings_export diff --git a/plugins/3MFWriter/SettingsSelectionGroup.qml b/plugins/3MFWriter/SettingsSelectionGroup.qml new file mode 100644 index 0000000000..e77ba692bc --- /dev/null +++ b/plugins/3MFWriter/SettingsSelectionGroup.qml @@ -0,0 +1,87 @@ +// Copyright (c) 2024 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 QtQuick.Window 2.2 + +import UM 1.5 as UM +import Cura 1.1 as Cura +import ThreeMFWriter 1.0 as ThreeMFWriter + +ColumnLayout +{ + id: settingsGroup + spacing: UM.Theme.getSize("narrow_margin").width + + RowLayout + { + id: settingsGroupTitleRow + spacing: UM.Theme.getSize("default_margin").width + + Item + { + id: icon + height: UM.Theme.getSize("medium_button_icon").height + width: height + + UM.ColorImage + { + id: settingsMainImage + anchors.fill: parent + source: + { + switch(modelData.category) + { + case ThreeMFWriter.SettingsExportGroup.Global: + return UM.Theme.getIcon("Sliders") + case ThreeMFWriter.SettingsExportGroup.Model: + return UM.Theme.getIcon("View3D") + default: + return "" + } + } + + color: UM.Theme.getColor("text") + } + + Cura.ExtruderIcon + { + id: settingsExtruderIcon + anchors.fill: parent + visible: modelData.category === ThreeMFWriter.SettingsExportGroup.Extruder + text: (modelData.extruder_index + 1).toString() + font: UM.Theme.getFont("tiny_emphasis") + materialColor: modelData.extruder_color + } + } + + UM.Label + { + id: settingsTitle + text: modelData.name + (modelData.category_details ? ' (%1)'.arg(modelData.category_details) : '') + font: UM.Theme.getFont("default_bold") + } + } + + ListView + { + id: settingsExportList + Layout.fillWidth: true + Layout.preferredHeight: contentHeight + spacing: 0 + model: modelData.settings + visible: modelData.settings.length > 0 + + delegate: SettingSelection { } + } + + UM.Label + { + UM.I18nCatalog { id: catalog; name: "cura" } + + text: catalog.i18nc("@label", "No specific value has been set") + visible: modelData.settings.length === 0 + } +} diff --git a/plugins/3MFWriter/ThreeMFWorkspaceWriter.py b/plugins/3MFWriter/ThreeMFWorkspaceWriter.py index e89af5c70a..2536f5dacb 100644 --- a/plugins/3MFWriter/ThreeMFWorkspaceWriter.py +++ b/plugins/3MFWriter/ThreeMFWorkspaceWriter.py @@ -1,9 +1,13 @@ # Copyright (c) 2020 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. +from typing import Optional + import configparser from io import StringIO +from threading import Lock import zipfile +from typing import Dict, Any from UM.Application import Application from UM.Logger import Logger @@ -13,15 +17,23 @@ from UM.Workspace.WorkspaceWriter import WorkspaceWriter from UM.i18n import i18nCatalog catalog = i18nCatalog("cura") -from cura.Utils.Threading import call_on_qt_thread +from .ThreeMFWriter import ThreeMFWriter +from .SettingsExportModel import SettingsExportModel +from .SettingsExportGroup import SettingsExportGroup + +USER_SETTINGS_PATH = "Cura/user-settings.json" class ThreeMFWorkspaceWriter(WorkspaceWriter): def __init__(self): super().__init__() + self._ucp_model: Optional[SettingsExportModel] = None - @call_on_qt_thread - def write(self, stream, nodes, mode=WorkspaceWriter.OutputMode.BinaryMode): + def setExportModel(self, model: SettingsExportModel) -> None: + if self._ucp_model != model: + self._ucp_model = model + + def _write(self, stream, nodes, mode=WorkspaceWriter.OutputMode.BinaryMode): application = Application.getInstance() machine_manager = application.getMachineManager() @@ -34,20 +46,20 @@ class ThreeMFWorkspaceWriter(WorkspaceWriter): global_stack = machine_manager.activeMachine if global_stack is None: - self.setInformation(catalog.i18nc("@error", "There is no workspace yet to write. Please add a printer first.")) + self.setInformation( + catalog.i18nc("@error", "There is no workspace yet to write. Please add a printer first.")) Logger.error("Tried to write a 3MF workspace before there was a global stack.") return False # Indicate that the 3mf mesh writer should not close the archive just yet (we still need to add stuff to it). mesh_writer.setStoreArchive(True) - if not mesh_writer.write(stream, nodes, mode): + if not mesh_writer.write(stream, nodes, mode, self._ucp_model): self.setInformation(mesh_writer.getInformation()) return False archive = mesh_writer.getArchive() if archive is None: # This happens if there was no mesh data to write. - archive = zipfile.ZipFile(stream, "w", compression = zipfile.ZIP_DEFLATED) - + archive = zipfile.ZipFile(stream, "w", compression=zipfile.ZIP_DEFLATED) try: # Add global container stack data to the archive. @@ -62,15 +74,21 @@ class ThreeMFWorkspaceWriter(WorkspaceWriter): self._writeContainerToArchive(extruder_stack, archive) for container in extruder_stack.getContainers(): self._writeContainerToArchive(container, archive) + + # Write user settings data + if self._ucp_model is not None: + user_settings_data = self._getUserSettings(self._ucp_model) + ThreeMFWriter._storeMetadataJson(user_settings_data, archive, USER_SETTINGS_PATH) except PermissionError: self.setInformation(catalog.i18nc("@error:zip", "No permission to write the workspace here.")) Logger.error("No permission to write workspace to this stream.") return False # Write preferences to archive - original_preferences = Application.getInstance().getPreferences() #Copy only the preferences that we use to the workspace. + original_preferences = Application.getInstance().getPreferences() # Copy only the preferences that we use to the workspace. temp_preferences = Preferences() - for preference in {"general/visible_settings", "cura/active_mode", "cura/categories_expanded", "metadata/setting_version"}: + for preference in {"general/visible_settings", "cura/active_mode", "cura/categories_expanded", + "metadata/setting_version"}: temp_preferences.addPreference(preference, None) temp_preferences.setValue(preference, original_preferences.getValue(preference)) preferences_string = StringIO() @@ -81,7 +99,7 @@ class ThreeMFWorkspaceWriter(WorkspaceWriter): # Save Cura version version_file = zipfile.ZipInfo("Cura/version.ini") - version_config_parser = configparser.ConfigParser(interpolation = None) + version_config_parser = configparser.ConfigParser(interpolation=None) version_config_parser.add_section("versions") version_config_parser.set("versions", "cura_version", application.getVersion()) version_config_parser.set("versions", "build_type", application.getBuildType()) @@ -101,11 +119,17 @@ class ThreeMFWorkspaceWriter(WorkspaceWriter): return False except EnvironmentError as e: self.setInformation(catalog.i18nc("@error:zip", str(e))) - Logger.error("EnvironmentError when writing workspace to this stream: {err}".format(err = str(e))) + Logger.error("EnvironmentError when writing workspace to this stream: {err}".format(err=str(e))) return False mesh_writer.setStoreArchive(False) + return True + def write(self, stream, nodes, mode=WorkspaceWriter.OutputMode.BinaryMode): + success = self._write(stream, nodes, mode=WorkspaceWriter.OutputMode.BinaryMode) + self._ucp_model = None + return success + @staticmethod def _writePluginMetadataToArchive(archive: zipfile.ZipFile) -> None: file_name_template = "%s/plugin_metadata.json" @@ -165,4 +189,27 @@ class ThreeMFWorkspaceWriter(WorkspaceWriter): archive.writestr(file_in_archive, serialized_data) except (FileNotFoundError, EnvironmentError): Logger.error("File became inaccessible while writing to it: {archive_filename}".format(archive_filename = archive.fp.name)) - return \ No newline at end of file + return + + @staticmethod + def _getUserSettings(model: SettingsExportModel) -> Dict[str, Dict[str, Any]]: + user_settings = {} + + for group in model.settingsGroups: + category = '' + if group.category == SettingsExportGroup.Category.Global: + category = 'global' + elif group.category == SettingsExportGroup.Category.Extruder: + category = f"extruder_{group.extruder_index}" + + if len(category) > 0: + settings_values = {} + stack = group.stack + + for setting in group.settings: + if setting.selected: + settings_values[setting.id] = stack.getProperty(setting.id, "value") + + user_settings[category] = settings_values + + return user_settings \ No newline at end of file diff --git a/plugins/3MFWriter/ThreeMFWriter.py b/plugins/3MFWriter/ThreeMFWriter.py index 0a939e5b8a..1c14c37cfd 100644 --- a/plugins/3MFWriter/ThreeMFWriter.py +++ b/plugins/3MFWriter/ThreeMFWriter.py @@ -10,6 +10,9 @@ from UM.Math.Vector import Vector from UM.Logger import Logger from UM.Math.Matrix import Matrix from UM.Application import Application +from UM.OutputDevice import OutputDeviceError +from UM.Message import Message +from UM.Resources import Resources from UM.Scene.SceneNode import SceneNode from UM.Settings.ContainerRegistry import ContainerRegistry @@ -17,12 +20,14 @@ from cura.CuraApplication import CuraApplication from cura.CuraPackageManager import CuraPackageManager from cura.Settings import CuraContainerStack from cura.Utils.Threading import call_on_qt_thread +from cura.Scene.CuraSceneNode import CuraSceneNode from cura.Snapshot import Snapshot -from PyQt6.QtCore import QBuffer +from PyQt6.QtCore import Qt, QBuffer +from PyQt6.QtGui import QImage, QPainter import pySavitar as Savitar - +from .UCPDialog import UCPDialog import numpy import datetime @@ -37,6 +42,9 @@ except ImportError: import zipfile import UM.Application +from .SettingsExportModel import SettingsExportModel +from .SettingsExportGroup import SettingsExportGroup + from UM.i18n import i18nCatalog catalog = i18nCatalog("cura") @@ -84,7 +92,9 @@ class ThreeMFWriter(MeshWriter): self._store_archive = store_archive @staticmethod - def _convertUMNodeToSavitarNode(um_node, transformation=Matrix()): + def _convertUMNodeToSavitarNode(um_node, + transformation = Matrix(), + exported_settings: Optional[Dict[str, Set[str]]] = None): """Convenience function that converts an Uranium SceneNode object to a SavitarSceneNode :returns: Uranium Scene node. @@ -126,13 +136,26 @@ class ThreeMFWriter(MeshWriter): if stack is not None: changed_setting_keys = stack.getTop().getAllKeys() - # Ensure that we save the extruder used for this object in a multi-extrusion setup - if stack.getProperty("machine_extruder_count", "value") > 1: - changed_setting_keys.add("extruder_nr") + if exported_settings is None: + # Ensure that we save the extruder used for this object in a multi-extrusion setup + if stack.getProperty("machine_extruder_count", "value") > 1: + changed_setting_keys.add("extruder_nr") - # Get values for all changed settings & save them. - for key in changed_setting_keys: - savitar_node.setSetting("cura:" + key, str(stack.getProperty(key, "value"))) + # Get values for all changed settings & save them. + for key in changed_setting_keys: + savitar_node.setSetting("cura:" + key, str(stack.getProperty(key, "value"))) + else: + # We want to export only the specified settings + if um_node.getName() in exported_settings: + model_exported_settings = exported_settings[um_node.getName()] + + # Get values for all exported settings & save them. + for key in model_exported_settings: + savitar_node.setSetting("cura:" + key, str(stack.getProperty(key, "value"))) + + if isinstance(um_node, CuraSceneNode): + savitar_node.setSetting("cura:print_order", str(um_node.printOrder)) + savitar_node.setSetting("cura:drop_to_buildplate", str(um_node.isDropDownEnabled)) # Store the metadata. for key, value in um_node.metadata.items(): @@ -142,7 +165,8 @@ class ThreeMFWriter(MeshWriter): # only save the nodes on the active build plate if child_node.callDecoration("getBuildPlateNumber") != active_build_plate_nr: continue - savitar_child_node = ThreeMFWriter._convertUMNodeToSavitarNode(child_node) + savitar_child_node = ThreeMFWriter._convertUMNodeToSavitarNode(child_node, + exported_settings = exported_settings) if savitar_child_node is not None: savitar_node.addChild(savitar_child_node) @@ -151,7 +175,24 @@ class ThreeMFWriter(MeshWriter): def getArchive(self): return self._archive - def write(self, stream, nodes, mode = MeshWriter.OutputMode.BinaryMode) -> bool: + def _addLogoToThumbnail(self, primary_image, logo_name): + # Load the icon png image + icon_image = QImage(Resources.getPath(Resources.Images, logo_name)) + + # Resize icon_image to be 1/4 of primary_image size + new_width = int(primary_image.width() / 4) + new_height = int(primary_image.height() / 4) + icon_image = icon_image.scaled(new_width, new_height, Qt.AspectRatioMode.KeepAspectRatio) + # Create a QPainter to draw on the image + painter = QPainter(primary_image) + + # Draw the icon in the top-left corner (adjust coordinates as needed) + icon_position = (10, 10) + painter.drawImage(icon_position[0], icon_position[1], icon_image) + + painter.end() + + def write(self, stream, nodes, mode = MeshWriter.OutputMode.BinaryMode, export_settings_model = None) -> bool: self._archive = None # Reset archive archive = zipfile.ZipFile(stream, "w", compression = zipfile.ZIP_DEFLATED) try: @@ -175,6 +216,10 @@ class ThreeMFWriter(MeshWriter): # Attempt to add a thumbnail snapshot = self._createSnapshot() if snapshot: + if export_settings_model != None: + self._addLogoToThumbnail(snapshot, "cura-share.png") + elif export_settings_model == None and self._store_archive: + self._addLogoToThumbnail(snapshot, "cura-icon.png") thumbnail_buffer = QBuffer() thumbnail_buffer.open(QBuffer.OpenModeFlag.ReadWrite) snapshot.save(thumbnail_buffer, "PNG") @@ -229,14 +274,20 @@ class ThreeMFWriter(MeshWriter): transformation_matrix.preMultiply(translation_matrix) root_node = UM.Application.Application.getInstance().getController().getScene().getRoot() + exported_model_settings = ThreeMFWriter._extractModelExportedSettings(export_settings_model) if export_settings_model != None else None + for node in nodes: if node == root_node: for root_child in node.getChildren(): - savitar_node = ThreeMFWriter._convertUMNodeToSavitarNode(root_child, transformation_matrix) + savitar_node = ThreeMFWriter._convertUMNodeToSavitarNode(root_child, + transformation_matrix, + exported_model_settings) if savitar_node: savitar_scene.addSceneNode(savitar_node) else: - savitar_node = self._convertUMNodeToSavitarNode(node, transformation_matrix) + savitar_node = self._convertUMNodeToSavitarNode(node, + transformation_matrix, + exported_model_settings) if savitar_node: savitar_scene.addSceneNode(savitar_node) @@ -392,3 +443,24 @@ class ThreeMFWriter(MeshWriter): parser = Savitar.ThreeMFParser() scene_string = parser.sceneToString(savitar_scene) return scene_string + + @staticmethod + def _extractModelExportedSettings(model: Optional[SettingsExportModel]) -> Dict[str, Set[str]]: + extra_settings = {} + + if model is not None: + for group in model.settingsGroups: + if group.category == SettingsExportGroup.Category.Model: + exported_model_settings = set() + + for exported_setting in group.settings: + if exported_setting.selected: + exported_model_settings.add(exported_setting.id) + + extra_settings[group.category_details] = exported_model_settings + + return extra_settings + + def exportUcp(self): + self._config_dialog = UCPDialog() + self._config_dialog.show() diff --git a/plugins/3MFWriter/UCPDialog.py b/plugins/3MFWriter/UCPDialog.py new file mode 100644 index 0000000000..bedfb4d0da --- /dev/null +++ b/plugins/3MFWriter/UCPDialog.py @@ -0,0 +1,114 @@ +# Copyright (c) 2024 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + +import os + +from PyQt6.QtCore import pyqtSignal, QObject + +import UM +from UM.FlameProfiler import pyqtSlot +from UM.OutputDevice import OutputDeviceError +from UM.Workspace.WorkspaceWriter import WorkspaceWriter +from UM.i18n import i18nCatalog +from UM.Logger import Logger +from UM.Message import Message + +from cura.CuraApplication import CuraApplication + +from .SettingsExportModel import SettingsExportModel + +i18n_catalog = i18nCatalog("cura") + + +class UCPDialog(QObject): + finished = pyqtSignal(bool) + + def __init__(self, parent = None) -> None: + super().__init__(parent) + + plugin_path = os.path.dirname(__file__) + dialog_path = os.path.join(plugin_path, 'UCPDialog.qml') + self._model = SettingsExportModel() + self._view = CuraApplication.getInstance().createQmlComponent( + dialog_path, + { + "manager": self, + "settingsExportModel": self._model + } + ) + self._view.accepted.connect(self._onAccepted) + self._view.rejected.connect(self._onRejected) + self._finished = False + self._accepted = False + + def show(self) -> None: + self._finished = False + self._accepted = False + self._view.show() + + def getModel(self) -> SettingsExportModel: + return self._model + + @pyqtSlot() + def notifyClosed(self): + self._onFinished() + + def save3mf(self): + application = CuraApplication.getInstance() + workspace_handler = application.getInstance().getWorkspaceFileHandler() + + # Set the model to the workspace writer + mesh_writer = workspace_handler.getWriter("3MFWriter") + mesh_writer.setExportModel(self._model) + + # Open file dialog and write the file + device = application.getOutputDeviceManager().getOutputDevice("local_file") + nodes = [application.getController().getScene().getRoot()] + + device.writeError.connect(lambda: self._onRejected()) + device.writeSuccess.connect(lambda: self._onSuccess()) + device.writeFinished.connect(lambda: self._onFinished()) + + file_name = CuraApplication.getInstance().getPrintInformation().baseName + + try: + device.requestWrite( + nodes, + file_name, + ["application/vnd.ms-package.3dmanufacturing-3dmodel+xml"], + workspace_handler, + preferred_mimetype_list="application/vnd.ms-package.3dmanufacturing-3dmodel+xml" + ) + except OutputDeviceError.UserCanceledError: + self._onRejected() + except Exception as e: + message = Message( + i18n_catalog.i18nc("@info:error", "Unable to write to file: {0}", file_name), + title=i18n_catalog.i18nc("@info:title", "Error"), + message_type=Message.MessageType.ERROR + ) + message.show() + Logger.logException("e", "Unable to write to file %s: %s", file_name, e) + self._onRejected() + + def _onAccepted(self): + self.save3mf() + + def _onRejected(self): + self._onFinished() + + def _onSuccess(self): + self._accepted = True + self._onFinished() + + def _onFinished(self): + # Make sure we don't send the finished signal twice, whatever happens + if self._finished: + return + self._finished = True + + # Reset the model to the workspace writer + mesh_writer = CuraApplication.getInstance().getInstance().getWorkspaceFileHandler().getWriter("3MFWriter") + mesh_writer.setExportModel(None) + + self.finished.emit(self._accepted) diff --git a/plugins/3MFWriter/UCPDialog.qml b/plugins/3MFWriter/UCPDialog.qml new file mode 100644 index 0000000000..5d094f9187 --- /dev/null +++ b/plugins/3MFWriter/UCPDialog.qml @@ -0,0 +1,99 @@ +// Copyright (c) 2024 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 QtQuick.Window 2.2 + +import UM 1.5 as UM +import Cura 1.1 as Cura + +UM.Dialog +{ + id: exportDialog + title: catalog.i18nc("@title:window", "Export Universal Cura Project") + + margin: UM.Theme.getSize("default_margin").width + minimumWidth: UM.Theme.getSize("modal_window_minimum").width + minimumHeight: UM.Theme.getSize("modal_window_minimum").height + + backgroundColor: UM.Theme.getColor("detail_background") + + headerComponent: Rectangle + { + height: childrenRect.height + 2 * UM.Theme.getSize("default_margin").height + color: UM.Theme.getColor("main_background") + + ColumnLayout + { + id: headerColumn + + anchors.top: parent.top + anchors.left: parent.left + anchors.right: parent.right + anchors.topMargin: UM.Theme.getSize("default_margin").height + anchors.leftMargin: UM.Theme.getSize("default_margin").width + anchors.rightMargin: anchors.leftMargin + + UM.Label + { + id: titleLabel + text: catalog.i18nc("@action:title", "Summary - Universal Cura Project") + font: UM.Theme.getFont("large") + } + + UM.Label + { + id: descriptionLabel + text: catalog.i18nc("@action:description", "When exporting a Universal Cura Project, all the models present on the build plate will be included with their current position, orientation and scale. You can also select which per-extruder or per-model settings should be included to ensure a proper printing of the batch, even on different printers.") + font: UM.Theme.getFont("default") + wrapMode: Text.Wrap + Layout.maximumWidth: headerColumn.width + } + } + } + + Rectangle + { + anchors.fill: parent + color: UM.Theme.getColor("main_background") + + UM.I18nCatalog { id: catalog; name: "cura" } + + ListView + { + id: settingsExportList + anchors.fill: parent + anchors.margins: UM.Theme.getSize("default_margin").width + spacing: UM.Theme.getSize("thick_margin").height + model: settingsExportModel.settingsGroups + clip: true + + ScrollBar.vertical: UM.ScrollBar { id: verticalScrollBar } + + delegate: SettingsSelectionGroup { Layout.margins: 0 } + } + } + + rightButtons: + [ + Cura.TertiaryButton + { + text: catalog.i18nc("@action:button", "Cancel") + onClicked: reject() + }, + Cura.PrimaryButton + { + text: catalog.i18nc("@action:button", "Save project") + onClicked: accept() + } + ] + + buttonSpacing: UM.Theme.getSize("wide_margin").width + + onClosing: + { + manager.notifyClosed() + } +} diff --git a/plugins/3MFWriter/__init__.py b/plugins/3MFWriter/__init__.py index eb8a596afe..0b2976c386 100644 --- a/plugins/3MFWriter/__init__.py +++ b/plugins/3MFWriter/__init__.py @@ -2,9 +2,12 @@ # Uranium is released under the terms of the LGPLv3 or higher. import sys +from PyQt6.QtQml import qmlRegisterType + from UM.Logger import Logger try: from . import ThreeMFWriter + from .SettingsExportGroup import SettingsExportGroup threemf_writer_was_imported = True except ImportError: Logger.log("w", "Could not import ThreeMFWriter; libSavitar may be missing") @@ -23,20 +26,24 @@ def getMetaData(): if threemf_writer_was_imported: metaData["mesh_writer"] = { - "output": [{ - "extension": "3mf", - "description": i18n_catalog.i18nc("@item:inlistbox", "3MF file"), - "mime_type": "application/vnd.ms-package.3dmanufacturing-3dmodel+xml", - "mode": ThreeMFWriter.ThreeMFWriter.OutputMode.BinaryMode - }] + "output": [ + { + "extension": "3mf", + "description": i18n_catalog.i18nc("@item:inlistbox", "3MF file"), + "mime_type": "application/vnd.ms-package.3dmanufacturing-3dmodel+xml", + "mode": ThreeMFWriter.ThreeMFWriter.OutputMode.BinaryMode + } + ] } metaData["workspace_writer"] = { - "output": [{ - "extension": workspace_extension, - "description": i18n_catalog.i18nc("@item:inlistbox", "Cura Project 3MF file"), - "mime_type": "application/vnd.ms-package.3dmanufacturing-3dmodel+xml", - "mode": ThreeMFWorkspaceWriter.ThreeMFWorkspaceWriter.OutputMode.BinaryMode - }] + "output": [ + { + "extension": workspace_extension, + "description": i18n_catalog.i18nc("@item:inlistbox", "Cura Project 3MF file"), + "mime_type": "application/vnd.ms-package.3dmanufacturing-3dmodel+xml", + "mode": ThreeMFWorkspaceWriter.ThreeMFWorkspaceWriter.OutputMode.BinaryMode + } + ] } return metaData @@ -44,6 +51,8 @@ def getMetaData(): def register(app): if "3MFWriter.ThreeMFWriter" in sys.modules: + qmlRegisterType(SettingsExportGroup, "ThreeMFWriter", 1, 0, "SettingsExportGroup") + return {"mesh_writer": ThreeMFWriter.ThreeMFWriter(), "workspace_writer": ThreeMFWorkspaceWriter.ThreeMFWorkspaceWriter()} else: diff --git a/plugins/3MFWriter/plugin.json b/plugins/3MFWriter/plugin.json index b59d4ef8e1..254384dc25 100644 --- a/plugins/3MFWriter/plugin.json +++ b/plugins/3MFWriter/plugin.json @@ -2,7 +2,7 @@ "name": "3MF Writer", "author": "Ultimaker B.V.", "version": "1.0.1", - "description": "Provides support for writing 3MF files.", + "description": "Provides support for writing 3MF and UCP files.", "api": 8, "i18n-catalog": "cura" } diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index 0c4003fadc..c73dee2fb0 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -76,6 +76,7 @@ class CuraEngineBackend(QObject, Backend): self._default_engine_location = executable_name search_path = [ + os.path.abspath(os.path.join(os.path.dirname(sys.executable), "..", "Resources")), os.path.abspath(os.path.dirname(sys.executable)), os.path.abspath(os.path.join(os.path.dirname(sys.executable), "bin")), os.path.abspath(os.path.join(os.path.dirname(sys.executable), "..")), @@ -180,7 +181,10 @@ class CuraEngineBackend(QObject, Backend): application.getPreferences().preferenceChanged.connect(self._onPreferencesChanged) self._slicing_error_message = Message( - text = catalog.i18nc("@message", "Slicing failed with an unexpected error. Please consider reporting a bug on our issue tracker."), + text = catalog.i18nc("@message", "Oops! We encountered an unexpected error during your slicing process. " + "Rest assured, we've automatically received the crash logs for analysis, " + "if you have not disabled data sharing in your preferences. To assist us " + "further, consider sharing your project details on our issue tracker."), title = catalog.i18nc("@message:title", "Slicing failed"), message_type = Message.MessageType.ERROR ) diff --git a/plugins/PostProcessingPlugin/scripts/LimitXYAccelJerk.py b/plugins/PostProcessingPlugin/scripts/LimitXYAccelJerk.py index 17d17c9e24..9dac57e218 100644 --- a/plugins/PostProcessingPlugin/scripts/LimitXYAccelJerk.py +++ b/plugins/PostProcessingPlugin/scripts/LimitXYAccelJerk.py @@ -9,6 +9,7 @@ # When setting an accel limit on multi-extruder printers ALL extruders are effected. # This post does not distinguish between Print Accel and Travel Accel. The limit is the limit for all regardless. Example: Skin Accel = 1000 and Outer Wall accel = 500. If the limit is set to 300 then both Skin and Outer Wall will be Accel = 300. # 9/15/2023 added support for RepRap M566 command for Jerk in mm/min +# 2/4/2024 Added a block so the script doesn't run unless Accel Control is enabled in Cura. This should keep users from increasing the Accel Limits. from ..Script import Script from cura.CuraApplication import CuraApplication @@ -45,6 +46,10 @@ class LimitXYAccelJerk(Script): # Warn the user if the printer is multi-extruder------------------ if ext_count > 1: Message(text = " 'Limit the X-Y Accel/Jerk': The post processor treats all extruders the same. If you have multiple extruders they will all be subject to the same Accel and Jerk limits imposed. If you have different Travel and Print Accel they will also be subject to the same limits. If that is not acceptable then you should not use this Post Processor.").show() + + # Warn the user if Accel Control is not enabled in Cura. This keeps the script from being able to increase the Accel limits----------- + if not bool(extruder[0].getProperty("acceleration_enabled", "value")): + Message(title = "[Limit the X-Y Accel/Jerk]", text = "You must have 'Enable Acceleration Control' checked in Cura or the script will exit.").show() def getSettingDataString(self): return """{ @@ -169,6 +174,13 @@ class LimitXYAccelJerk(Script): extruder = mycura.extruderList machine_name = str(mycura.getProperty("machine_name", "value")) print_sequence = str(mycura.getProperty("print_sequence", "value")) + acceleration_enabled = bool(extruder[0].getProperty("acceleration_enabled", "value")) + + # Exit if acceleration control is not enabled---------------- + if not acceleration_enabled: + Message(title = "[Limit the X-Y Accel/Jerk]", text = "DID NOT RUN. You must have 'Enable Acceleration Control' checked in Cura.").show() + data[0] += "; [LimitXYAccelJerk] DID NOT RUN because 'Enable Acceleration Control' is not checked in Cura.\n" + return data # Exit if 'one_at_a_time' is enabled------------------------- if print_sequence == "one_at_a_time": @@ -183,12 +195,8 @@ class LimitXYAccelJerk(Script): return data type_of_change = str(self.getSettingValueByKey("type_of_change")) - accel_print_enabled = bool(extruder[0].getProperty("acceleration_enabled", "value")) - accel_travel_enabled = bool(extruder[0].getProperty("acceleration_travel_enabled", "value")) accel_print = extruder[0].getProperty("acceleration_print", "value") accel_travel = extruder[0].getProperty("acceleration_travel", "value") - jerk_print_enabled = str(extruder[0].getProperty("jerk_enabled", "value")) - jerk_travel_enabled = str(extruder[0].getProperty("jerk_travel_enabled", "value")) jerk_print_old = extruder[0].getProperty("jerk_print", "value") jerk_travel_old = extruder[0].getProperty("jerk_travel", "value") if int(accel_print) >= int(accel_travel): diff --git a/plugins/SliceInfoPlugin/SliceInfo.py b/plugins/SliceInfoPlugin/SliceInfo.py index be021251da..411146d065 100755 --- a/plugins/SliceInfoPlugin/SliceInfo.py +++ b/plugins/SliceInfoPlugin/SliceInfo.py @@ -264,6 +264,7 @@ class SliceInfo(QObject, Extension): # Prime tower settings print_settings["prime_tower_enable"] = global_stack.getProperty("prime_tower_enable", "value") + print_settings["prime_tower_mode"] = global_stack.getProperty("prime_tower_mode", "value") # Infill settings print_settings["infill_sparse_density"] = global_stack.getProperty("infill_sparse_density", "value") diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index 41beb88419..98c0f95e10 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -579,8 +579,9 @@ class XmlMaterialProfile(InstanceContainer): meta_data[tag_name] = entry.text - if tag_name in self.__material_metadata_setting_map: - common_setting_values[self.__material_metadata_setting_map[tag_name]] = entry.text + for tag_name, value in meta_data.items(): + if tag_name in self.__material_metadata_setting_map: + common_setting_values[self.__material_metadata_setting_map[tag_name]] = value if "description" not in meta_data: meta_data["description"] = "" @@ -1222,7 +1223,9 @@ class XmlMaterialProfile(InstanceContainer): "diameter": "material_diameter" } __material_metadata_setting_map = { - "GUID": "material_guid" + "GUID": "material_guid", + "material": "material_type", + "brand": "material_brand", } # Map of recognised namespaces with a proper prefix. diff --git a/requirements-dev.txt b/requirements-dev.txt index a1b191009a..162b33bf15 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -1,5 +1,5 @@ pytest -pyinstaller==5.8.0 +pyinstaller==6.3.0 pyinstaller-hooks-contrib pyyaml sip==6.5.1 diff --git a/resources/definitions/anycubic_kobra2.def.json b/resources/definitions/anycubic_kobra2.def.json index aea6b4d344..965504338b 100644 --- a/resources/definitions/anycubic_kobra2.def.json +++ b/resources/definitions/anycubic_kobra2.def.json @@ -42,7 +42,7 @@ "machine_max_jerk_xy": { "value": 10 }, "machine_max_jerk_z": { "value": 2 }, "machine_name": { "default_value": "Anycubic Kobra 2" }, - "machine_start_gcode": { "default_value": "G21 ;metric values\nG90 ; use absolute coordinates\nM82 ; use absolute distances for extrusion\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 ; home all axes\nM300 S1318 P266\nG1 Z5 F5000 ; lift nozzle\nG1 X5 Y0 F3000\nG1 Z0.3 ; set nozzle height\nG92 E0\nG1 X50 Y0 E20 F500 ; Extrude 20mm of filament in a 5cm line \nG92 E0 ; zero the extruded length again \nG1 E-4.5 F4800 ; Retract a little \nG92 E0\nG1 X120 F4000 ; Quickly wipe away from the filament line\nM117 ; Printing\u2026\nG5" }, + "machine_start_gcode": { "default_value": "G21 ;metric values\nG90 ; use absolute coordinates\nM82 ; use absolute distances for extrusion\nM104 S{material_print_temperature_layer_0} ; set extruder temp\nM140 S{material_bed_temperature_layer_0} ; set bed temp\nM190 S{material_bed_temperature_layer_0} ; wait for bed temp\nM109 S{material_print_temperature_layer_0} ; wait for extruder temp\nG28 ; home all axes\nM300 S1318 P266\nG1 Z5 F5000 ; lift nozzle\nG1 X5 Y0 F3000\nG1 Z0.3 ; set nozzle height\nG92 E0\nG1 X50 Y0 E20 F500 ; Extrude 20mm of filament in a 5cm line \nG92 E0 ; zero the extruded length again \nG1 E-4.5 F4800 ; Retract a little \nG92 E0\nG1 X120 F4000 ; Quickly wipe away from the filament line\nM117 ; Printing\u2026\nG5" }, "machine_width": { "default_value": 220 }, "material_bed_temperature": { "maximum_value_warning": 110 }, "material_bed_temperature_layer_0": { "maximum_value_warning": 110 }, diff --git a/resources/definitions/anycubic_kobra_go.def.json b/resources/definitions/anycubic_kobra_go.def.json index 8c546bdbb7..686734d962 100644 --- a/resources/definitions/anycubic_kobra_go.def.json +++ b/resources/definitions/anycubic_kobra_go.def.json @@ -23,7 +23,7 @@ "machine_heated_bed": { "default_value": true }, "machine_height": { "default_value": 250 }, "machine_name": { "default_value": "Anycubic Kobra Go" }, - "machine_start_gcode": { "default_value": "M140 S[first_layer_bed_temperature]; Heat bed\nM104 S[first_layer_temperature\n ]; Heat extruder\nG21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nG28 ; Home all axes\nG92 E0 ; Reset Extruder\nM420 S1 ; Enable Bed Levelling Mesh\nM190 S[first_layer_bed_temperature\n ]; Wait for bed to get up to temperature\nM109 S[first_layer_temperature\n ]; Wait for extruder to get up to temperature\nG1 Z2.0 F3000 ; Move Z Axis up little to prevent scratching of Heat Bed\nG1 X2 Y20 Z0.3 F5000.0 ; Move to start position\nG1 X2 Y200.0 Z0.3 F1500.0 E15 ; Draw the first line\nG1 X2.4 Y200.0 Z0.3 F5000.0 ; Move to side a little\nG1 X2.4 Y20 Z0.3 F1500.0 E30 ; Draw the second line\nG92 E0 ; Reset Extruder\nG1 Z2.0 F3000 ; Move Z Axis up little to prevent scratching of Heat Bed\nG1 F2400 E-1\nG1 X5 Y20 Z0.3 F5000.0 ; Move over to prevent blob squish" }, + "machine_start_gcode": { "default_value": "M140 S{material_bed_temperature_layer_0}; Heat bed\nM104 S{material_print_temperature_layer_0}; Heat extruder\nG21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nG28 ; Home all axes\nG92 E0 ; Reset Extruder\nM420 S1 ; Enable Bed Levelling Mesh\nM190 S{material_bed_temperature_layer_0}; Wait for bed to get up to temperature\nM109 S{material_print_temperature_layer_0}; Wait for extruder to get up to temperature\nG1 Z2.0 F3000 ; Move Z Axis up little to prevent scratching of Heat Bed\nG1 X2 Y20 Z0.3 F5000.0 ; Move to start position\nG1 X2 Y200.0 Z0.3 F1500.0 E15 ; Draw the first line\nG1 X2.4 Y200.0 Z0.3 F5000.0 ; Move to side a little\nG1 X2.4 Y20 Z0.3 F1500.0 E30 ; Draw the second line\nG92 E0 ; Reset Extruder\nG1 Z2.0 F3000 ; Move Z Axis up little to prevent scratching of Heat Bed\nG1 F2400 E-1\nG1 X5 Y20 Z0.3 F5000.0 ; Move over to prevent blob squish" }, "machine_width": { "default_value": 222 } } } \ No newline at end of file diff --git a/resources/definitions/creality_ender3v2neo.def.json b/resources/definitions/creality_ender3v2neo.def.json new file mode 100644 index 0000000000..b5cc2ed52a --- /dev/null +++ b/resources/definitions/creality_ender3v2neo.def.json @@ -0,0 +1,31 @@ +{ + "version": 2, + "name": "Creality Ender-3 v2 Neo", + "inherits": "creality_base", + "metadata": + { + "visible": true, + "platform": "creality_ender3.3mf", + "quality_definition": "creality_base" + }, + "overrides": + { + "gantry_height": { "value": 25 }, + "machine_depth": { "default_value": 230 }, + "machine_head_with_fans_polygon": + { + "default_value": [ + [-26, 34], + [-26, -32], + [32, -32], + [32, 34] + ] + }, + "machine_height": { "default_value": 250 }, + "machine_name": { "default_value": "Creality Ender-3 v2 Neo" }, + "machine_start_gcode": { "default_value": "G92 E0 ;Reset Extruder\nG28 ;Home\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" }, + "machine_width": { "default_value": 230 }, + "retraction_amount": { "value": 4 }, + "retraction_speed": { "value": 25 } + } +} \ No newline at end of file diff --git a/resources/definitions/creality_ender3v3se.def.json b/resources/definitions/creality_ender3v3se.def.json index 5769e3e493..86d6818166 100644 --- a/resources/definitions/creality_ender3v3se.def.json +++ b/resources/definitions/creality_ender3v3se.def.json @@ -45,7 +45,7 @@ "machine_max_feedrate_y": { "value": 500 }, "machine_max_feedrate_z": { "value": 30 }, "machine_name": { "default_value": "Creality Ender-3 V3 SE" }, - "machine_start_gcode": { "default_value": "M220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\n\nG28 ;Home\n\nM420 S1; Enable mesh leveling\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\nM109 S[material_print_temperature_layer_0]\nG1 X10.1 Y145.0 Z0.28 F1500.0 E15 ;Draw the first line\nG1 X10.4 Y145.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 E-1.0000 F1800 ;Retract a bit\nG1 Z2.0 F3000 ;Move Z Axis up\nG1 E0.0000 F1800 \n" }, + "machine_start_gcode": { "default_value": "M220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\n\nG28 ;Home\n\nM420 S1; Use saved mesh leveling data\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\nM190 S{material_bed_temperature_layer_0} ; Set bed temperature and wait\nM109 S{material_print_temperature_layer_0} ; Set hotend temperature and wait\nG1 X10.1 Y145.0 Z0.28 F1500.0 E15 ;Draw the first line\nG1 X10.4 Y145.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 E-1.0000 F1800 ;Retract a bit\nG1 Z2.0 F3000 ;Move Z Axis up\nG1 E0.0000 F1800 \n" }, "machine_width": { "default_value": 220 }, "retraction_amount": { "value": 0.8 }, "retraction_speed": { "default_value": 40 }, diff --git a/resources/definitions/creality_ender5plus.def.json b/resources/definitions/creality_ender5plus.def.json index b7b11343e5..5ad71ee2df 100644 --- a/resources/definitions/creality_ender5plus.def.json +++ b/resources/definitions/creality_ender5plus.def.json @@ -23,7 +23,7 @@ }, "machine_height": { "default_value": 400 }, "machine_name": { "default_value": "Creality Ender-5 Plus" }, - "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\nM420 S1 Z2 ;Enable ABL using saved Mesh and Fade Height\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_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\nG29 ;Auto bed level\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_width": { "default_value": 350 }, "speed_print": { "value": 80.0 } } diff --git a/resources/definitions/dagoma_sigma_pro.def.json b/resources/definitions/dagoma_sigma_pro.def.json new file mode 100644 index 0000000000..8bbac5a483 --- /dev/null +++ b/resources/definitions/dagoma_sigma_pro.def.json @@ -0,0 +1,32 @@ +{ + "version": 2, + "name": "Dagoma Sigma Pro 500Z", + "inherits": "dagoma_delta", + "metadata": + { + "visible": true, + "author": "Dagoma", + "manufacturer": "Dagoma", + "file_formats": "text/x-gcode", + "platform": "dagoma_sigma_pro.obj", + "first_start_actions": [ "MachineSettingsAction" ], + "has_machine_quality": true, + "has_variants": true, + "machine_extruder_trains": { "0": "dagoma_sigma_pro_extruder" }, + "platform_texture": "dagoma_sigma_pro.png", + "preferred_quality_type": "h0.2", + "preferred_variant_name": "Brass 0.4mm", + "quality_definition": "dagoma_sigma_pro", + "variants_name": "Nozzle" + }, + "overrides": + { + "machine_depth": { "default_value": 200 }, + "machine_end_gcode": { "default_value": ";End Gcode for {machine_name}\n;Author: Dagoma\nM104 S0\nM107 ;stop fan\nM140 S0 ;heated bed heater off (if you have it)\nG92 E0\nG1 E-55 F4600\nG27\nG90 ; Absolute positioning\nT0" }, + "machine_heated_bed": { "default_value": true }, + "machine_height": { "default_value": 501 }, + "machine_name": { "default_value": "Dagoma Sigma Pro 500Z" }, + "machine_start_gcode": { "default_value": ";Start Gcode for {machine_name}\n;Author: Dagoma\n;Sliced: {date} {time}\n;Estimated print time: {print_time}\n;Print speed: {speed_print}mm/s\n;Layer height: {layer_height}mm\n;Wall thickness: {wall_thickness}mm\n;Infill density: {infill_sparse_density}%\n;Infill pattern: {infill_pattern}\n;Support: {support_enable}\n;Print temperature: {material_print_temperature}\u00b0C\n;Flow: {material_flow}%\n;Retraction amount: {retraction_amount}mm\n;Retraction speed: {retraction_retract_speed}mm/s\nG90 ;absolute positioning\nM190 S{material_bed_temperature_layer_0};\nM109 S140;\nG1 F200 E-1.0\nM106 S255 ;Activating layers fans\nG28 ;Homing\nG29 ;Calibration\nM107 ;Off Ventilateur\nM109 S{material_print_temperature_layer_0} ;Temperature for the first layer only\nG92 E0 ;Zero the extruded length again\nG1 X0 Y-105 Z1 F3000\nG1 F{speed_travel}\nM117 Printing...\n" }, + "machine_width": { "default_value": 200 } + } +} \ No newline at end of file diff --git a/resources/definitions/dagoma_sigma_pro_dual.def.json b/resources/definitions/dagoma_sigma_pro_dual.def.json new file mode 100644 index 0000000000..eb11b37603 --- /dev/null +++ b/resources/definitions/dagoma_sigma_pro_dual.def.json @@ -0,0 +1,37 @@ +{ + "version": 2, + "name": "Dagoma Sigma Pro 500Z Dual", + "inherits": "dagoma_delta", + "metadata": + { + "visible": true, + "author": "Dagoma", + "manufacturer": "Dagoma", + "file_formats": "text/x-gcode", + "platform": "dagoma_sigma_pro.obj", + "first_start_actions": [ "MachineSettingsAction" ], + "has_machine_quality": true, + "has_variants": true, + "machine_extruder_trains": + { + "0": "dagoma_sigma_pro_dual_extruder_right", + "1": "dagoma_sigma_pro_dual_extruder_left" + }, + "platform_texture": "dagoma_sigma_pro.png", + "preferred_quality_type": "h0.2", + "preferred_variant_name": "Brass 0.4mm", + "quality_definition": "dagoma_sigma_pro_dual", + "variants_name": "Nozzle" + }, + "overrides": + { + "machine_depth": { "default_value": 200 }, + "machine_end_gcode": { "default_value": ";End Gcode for {machine_name}\n;Author: Dagoma\nM104 S0\nM107 ;stop fan\nM140 S0 ;heated bed heater off (if you have it)\nG92 E0\nG1 E-55 F4600\nG27\nG90 ; Absolute positioning\nT0" }, + "machine_extruder_count": { "default_value": 2 }, + "machine_heated_bed": { "default_value": true }, + "machine_height": { "default_value": 501 }, + "machine_name": { "default_value": "Dagoma Sigma Pro 500Z Dual" }, + "machine_start_gcode": { "default_value": ";Start Gcode for {machine_name}\n;Author: Dagoma\n;Sliced: {date} {time}\n;Estimated print time: {print_time}\n;Print speed: {speed_print}mm/s\n;Layer height: {layer_height}mm\n;Wall thickness: {wall_thickness}mm\n;Infill density: {infill_sparse_density}%\n;Infill pattern: {infill_pattern}\n;Support: {support_enable}\n;Print temperature: {material_print_temperature}\u00b0C\n;Flow: {material_flow}%\n;Retraction amount: {retraction_amount}mm\n;Retraction speed: {retraction_retract_speed}mm/s\nG90 ;absolute positioning\nM190 S{material_bed_temperature_layer_0};\nM109 S140;\nG1 F200 E-1.0\nM106 S255 ;Activating layers fans\nG28 ;Homing\nG29 ;Calibration\nM107 ;Off Ventilateur\nM109 S{material_print_temperature_layer_0} ;Temperature for the first layer only\nG92 E0 ;Zero the extruded length again\nG1 X0 Y-105 Z1 F3000\nG1 F{speed_travel}\nM117 Printing...\n" }, + "machine_width": { "default_value": 200 } + } +} \ No newline at end of file diff --git a/resources/definitions/deltacomb_dc30flux.def.json b/resources/definitions/deltacomb_dc30flux.def.json index 4a42ae4d63..7ba4f4252d 100644 --- a/resources/definitions/deltacomb_dc30flux.def.json +++ b/resources/definitions/deltacomb_dc30flux.def.json @@ -31,7 +31,7 @@ "material_final_print_temperature": { "value": "material_print_temperature" }, "material_initial_print_temperature": { "value": "material_print_temperature" }, "material_standby_temperature": { "value": "material_print_temperature" }, - "prime_tower_enable": { "value": "1" }, + "prime_tower_enable": { "value": "True" }, "prime_tower_min_volume": { "value": "50" }, "switch_extruder_retraction_amount": { "value": "0" } } diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 03850a7344..2abdf0df01 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -76,6 +76,22 @@ "type": "str", "enabled": false }, + "material_type": + { + "label": "Material Type", + "description": "The type of material used.", + "default_value": "", + "type": "str", + "enabled": false + }, + "material_brand": + { + "label": "Material Brand", + "description": "The brand of material used.", + "default_value": "", + "type": "str", + "enabled": false + }, "material_diameter": { "label": "Diameter", @@ -963,7 +979,7 @@ "description": "Width of a single prime tower line.", "type": "float", "unit": "mm", - "enabled": "resolveOrValue('prime_tower_enable')", + "enabled": "prime_tower_enable", "default_value": 0.4, "value": "line_width", "minimum_value": "0.001", @@ -1668,7 +1684,7 @@ "value": "skin_line_width * 2", "default_value": 1, "minimum_value": "0", - "maximum_value_warning": "skin_line_width * 3", + "maximum_value_warning": "skin_line_width * 10", "type": "float", "enabled": "(top_layers > 0 or bottom_layers > 0) and top_bottom_pattern != 'concentric'", "limit_to_extruder": "top_bottom_extruder_nr", @@ -3347,7 +3363,7 @@ "description": "The speed at which the prime tower is printed. Printing the prime tower slower can make it more stable when the adhesion between the different filaments is suboptimal.", "type": "float", "unit": "mm/s", - "enabled": "resolveOrValue('prime_tower_enable')", + "enabled": "prime_tower_enable", "default_value": 60, "value": "speed_print", "minimum_value": "0.1", @@ -3725,7 +3741,7 @@ "maximum_value_warning": "10000", "default_value": 3000, "value": "acceleration_print", - "enabled": "resolveOrValue('prime_tower_enable') and resolveOrValue('acceleration_enabled')", + "enabled": "prime_tower_enable and resolveOrValue('acceleration_enabled')", "settable_per_mesh": false } } @@ -4044,7 +4060,7 @@ "maximum_value_warning": "50", "default_value": 20, "value": "jerk_print", - "enabled": "resolveOrValue('prime_tower_enable') and resolveOrValue('jerk_enabled')", + "enabled": "prime_tower_enable and resolveOrValue('jerk_enabled')", "settable_per_mesh": false } } @@ -5135,7 +5151,7 @@ "unit": "mm", "type": "float", "minimum_value": "0", - "maximum_value_warning": "machine_nozzle_size", + "maximum_value_warning": "5*layer_height", "default_value": 0.1, "limit_to_extruder": "support_interface_extruder_nr if support_interface_enable else support_infill_extruder_nr", "enabled": "support_enable or support_meshes_present", @@ -6789,13 +6805,29 @@ "settable_per_mesh": false, "settable_per_extruder": false }, + "prime_tower_mode": + { + "label": "Prime Tower Type", + "description": "How to generate the prime tower:
  • Normal: create a bucket in which secondary materials are primed
  • Interleaved: create a prime tower as sparse as possible. This will save time and filament, but is only possible if the used materials adhere to each other.
", + "type": "enum", + "value": "'interleaved' if (all(material_type_var == extruderValues('material_type')[0] for material_type_var in extruderValues('material_type')) and all(material_brand_var == extruderValues('material_brand')[0] for material_brand_var in extruderValues('material_brand'))) else 'normal'", + "options": + { + "normal": "Normal", + "interleaved": "Interleaved" + }, + "default_value": "normal", + "enabled": "prime_tower_enable", + "settable_per_mesh": false, + "settable_per_extruder": false + }, "prime_tower_size": { "label": "Prime Tower Size", "description": "The width of the prime tower.", "type": "float", "unit": "mm", - "enabled": "resolveOrValue('prime_tower_enable')", + "enabled": "prime_tower_enable", "default_value": 20, "resolve": "max(extruderValues('prime_tower_size'))", "minimum_value": "0", @@ -6814,7 +6846,20 @@ "default_value": 6, "minimum_value": "0", "maximum_value_warning": "(resolveOrValue('prime_tower_size') * 0.5) ** 2 * 3.14159 * resolveOrValue('layer_height') - sum(extruderValues('prime_tower_min_volume')) + prime_tower_min_volume", - "enabled": "resolveOrValue('prime_tower_enable')", + "enabled": "prime_tower_enable", + "settable_per_mesh": false, + "settable_per_extruder": true + }, + "prime_tower_max_bridging_distance": + { + "label": "Prime Tower Maximum Bridging Distance", + "description": "The maximum length of the branches which may be printed over the air.", + "unit": "mm", + "type": "float", + "default_value": 5, + "minimum_value": "line_width", + "maximum_value_warning": "10.0", + "enabled": "prime_tower_enable", "settable_per_mesh": false, "settable_per_extruder": true }, @@ -6824,9 +6869,9 @@ "description": "The x coordinate of the position of the prime tower.", "type": "float", "unit": "mm", - "enabled": "resolveOrValue('prime_tower_enable')", + "enabled": "prime_tower_enable", "default_value": 200, - "value": "(resolveOrValue('machine_width') / 2 + resolveOrValue('prime_tower_size') / 2) if resolveOrValue('machine_shape') == 'elliptic' else (resolveOrValue('machine_width') - (resolveOrValue('prime_tower_base_size') if (resolveOrValue('adhesion_type') == 'raft' or resolveOrValue('prime_tower_brim_enable')) else 0) - max(max(extruderValues('travel_avoid_distance')) + max(extruderValues('machine_nozzle_offset_x')) + max(extruderValues('support_offset')) + (extruderValue(skirt_brim_extruder_nr, 'skirt_brim_line_width') * extruderValue(skirt_brim_extruder_nr, 'skirt_line_count') * extruderValue(skirt_brim_extruder_nr, 'initial_layer_line_width_factor') / 100 + extruderValue(skirt_brim_extruder_nr, 'skirt_gap') if resolveOrValue('adhesion_type') == 'skirt' else 0) + (resolveOrValue('draft_shield_dist') if resolveOrValue('draft_shield_enabled') else 0), max(map(abs, extruderValues('machine_nozzle_offset_x'))), 1)) - (resolveOrValue('machine_width') / 2 if resolveOrValue('machine_center_is_zero') else 0)", + "value": "((resolveOrValue('machine_width') / 2 + resolveOrValue('prime_tower_size') / 2) if resolveOrValue('machine_shape') == 'elliptic' else (resolveOrValue('machine_width') - (resolveOrValue('prime_tower_base_size') if (resolveOrValue('adhesion_type') == 'raft' or resolveOrValue('prime_tower_brim_enable')) else 0) - max(max(extruderValues('travel_avoid_distance')) + max(extruderValues('machine_nozzle_offset_x')) + max(extruderValues('support_offset')) + (extruderValue(skirt_brim_extruder_nr, 'skirt_brim_line_width') * extruderValue(skirt_brim_extruder_nr, 'skirt_line_count') * extruderValue(skirt_brim_extruder_nr, 'initial_layer_line_width_factor') / 100 + extruderValue(skirt_brim_extruder_nr, 'skirt_gap') if resolveOrValue('adhesion_type') == 'skirt' else 0) + (resolveOrValue('draft_shield_dist') if resolveOrValue('draft_shield_enabled') else 0), max(map(abs, extruderValues('machine_nozzle_offset_x'))), 1))) - (resolveOrValue('machine_width') / 2 if resolveOrValue('machine_center_is_zero') else 0)", "maximum_value": "(machine_width / 2 if machine_center_is_zero else machine_width) - (resolveOrValue('prime_tower_base_size') if (resolveOrValue('adhesion_type') == 'raft' or resolveOrValue('prime_tower_brim_enable')) else 0)", "minimum_value": "resolveOrValue('prime_tower_size') + (resolveOrValue('prime_tower_base_size') if (resolveOrValue('adhesion_type') == 'raft' or resolveOrValue('prime_tower_brim_enable')) else 0) - (machine_width / 2 if machine_center_is_zero else 0)", "settable_per_mesh": false, @@ -6838,7 +6883,7 @@ "description": "The y coordinate of the position of the prime tower.", "type": "float", "unit": "mm", - "enabled": "resolveOrValue('prime_tower_enable')", + "enabled": "prime_tower_enable", "default_value": 200, "value": "machine_depth - prime_tower_size - (resolveOrValue('prime_tower_base_size') if (resolveOrValue('adhesion_type') == 'raft' or resolveOrValue('prime_tower_brim_enable')) else 0) - max(max(extruderValues('travel_avoid_distance')) + max(extruderValues('machine_nozzle_offset_y')) + max(extruderValues('support_offset')) + (extruderValue(skirt_brim_extruder_nr, 'skirt_brim_line_width') * extruderValue(skirt_brim_extruder_nr, 'skirt_line_count') * extruderValue(skirt_brim_extruder_nr, 'initial_layer_line_width_factor') / 100 + extruderValue(skirt_brim_extruder_nr, 'skirt_gap') if resolveOrValue('adhesion_type') == 'skirt' else 0) + (resolveOrValue('draft_shield_dist') if resolveOrValue('draft_shield_enabled') else 0), max(map(abs, extruderValues('machine_nozzle_offset_y'))), 1) - (resolveOrValue('machine_depth') / 2 if resolveOrValue('machine_center_is_zero') else 0)", "maximum_value": "(machine_depth / 2 - resolveOrValue('prime_tower_size') if machine_center_is_zero else machine_depth - resolveOrValue('prime_tower_size')) - (resolveOrValue('prime_tower_base_size') if (resolveOrValue('adhesion_type') == 'raft' or resolveOrValue('prime_tower_brim_enable')) else 0)", @@ -6851,7 +6896,7 @@ "label": "Wipe Inactive Nozzle on Prime Tower", "description": "After printing the prime tower with one nozzle, wipe the oozed material from the other nozzle off on the prime tower.", "type": "bool", - "enabled": "resolveOrValue('prime_tower_enable')", + "enabled": "prime_tower_enable", "default_value": true, "settable_per_mesh": false, "settable_per_extruder": true @@ -6862,7 +6907,7 @@ "label": "Prime Tower Base", "description": "By enabling this setting, your prime-tower will get a brim, even if the model doesn't. If you want a sturdier base for a high tower, you can increase the base height.", "type": "bool", - "enabled": "resolveOrValue('prime_tower_enable') and resolveOrValue('adhesion_type') != 'raft'", + "enabled": "prime_tower_enable and resolveOrValue('adhesion_type') != 'raft'", "default_value": false, "settable_per_mesh": false, "settable_per_extruder": false @@ -6874,7 +6919,7 @@ "description": "The width of the prime tower brim/base. A larger base enhances adhesion to the build plate, but also reduces the effective print area.", "type": "float", "unit": "mm", - "enabled": "resolveOrValue('prime_tower_enable') and (resolveOrValue('prime_tower_brim_enable') or resolveOrValue('adhesion_type') == 'raft')", + "enabled": "prime_tower_enable and (resolveOrValue('prime_tower_brim_enable') or resolveOrValue('adhesion_type') == 'raft')", "default_value": 1.2, "minimum_value": "0", "maximum_value": "min(0.5 * machine_width, 0.5 * machine_depth)", @@ -6888,7 +6933,7 @@ "description": "The height of the prime tower base. Increasing this value will result in a more sturdy prime tower because the base will be wider. If this setting is too low, the prime tower will not have a sturdy base.", "type": "float", "unit": "mm", - "enabled": "resolveOrValue('prime_tower_enable') and (resolveOrValue('prime_tower_brim_enable') or resolveOrValue('adhesion_type') == 'raft')", + "enabled": "prime_tower_enable and (resolveOrValue('prime_tower_brim_enable') or resolveOrValue('adhesion_type') == 'raft')", "default_value": 0, "minimum_value": "0", "maximum_value": "machine_height", @@ -6900,7 +6945,7 @@ "label": "Prime Tower Base Slope", "description": "The magnitude factor used for the slope of the prime tower base. If you increase this value, the base will become slimmer. If you decrease it, the base will become thicker.", "type": "float", - "enabled": "resolveOrValue('prime_tower_enable') and (resolveOrValue('prime_tower_brim_enable') or resolveOrValue('adhesion_type') == 'raft')", + "enabled": "prime_tower_enable and (resolveOrValue('prime_tower_brim_enable') or resolveOrValue('adhesion_type') == 'raft')", "default_value": 4, "minimum_value": "0", "maximum_value": "10", @@ -6918,7 +6963,7 @@ "minimum_value": "0", "minimum_value_warning": "raft_base_line_width", "maximum_value_warning": "100", - "enabled": "resolveOrValue('prime_tower_enable') and resolveOrValue('adhesion_type') == 'raft'", + "enabled": "prime_tower_enable and resolveOrValue('adhesion_type') == 'raft'", "settable_per_mesh": false, "settable_per_extruder": true, "limit_to_extruder": "raft_base_extruder_nr" @@ -7246,6 +7291,16 @@ "settable_per_extruder": false, "settable_per_meshgroup": false }, + "user_defined_print_order_enabled": + { + "label": "Set Print Sequence Manually", + "description": "Allows to order the object list to set the print sequence manually. First object from the list will be printed first.", + "type": "bool", + "default_value": false, + "settable_per_mesh": false, + "settable_per_extruder": false, + "enabled": "print_sequence == 'one_at_a_time'" + }, "infill_mesh": { "label": "Infill Mesh", diff --git a/resources/definitions/ratrig_base.def.json b/resources/definitions/ratrig_base.def.json index ab8f4dccf4..69ab0f139d 100644 --- a/resources/definitions/ratrig_base.def.json +++ b/resources/definitions/ratrig_base.def.json @@ -11,6 +11,7 @@ "exclude_materials": [], "first_start_actions": [ "MachineSettingsAction" ], "has_materials": true, + "machine_extruder_trains": { "0": "ratrig_base_extruder_0" }, "preferred_material": "generic_pla", "preferred_quality_type": "standard", "quality_definition": "ratrig_base", diff --git a/resources/definitions/ratrig_vcore3_200.def.json b/resources/definitions/ratrig_vcore3_200.def.json index d16f15b476..143063b95f 100644 --- a/resources/definitions/ratrig_vcore3_200.def.json +++ b/resources/definitions/ratrig_vcore3_200.def.json @@ -8,7 +8,7 @@ "platform": "ratrig_vcore3_200.stl", "platform_offset": [ 0, - 5, + 0, 0 ], "weight": 16 diff --git a/resources/definitions/ratrig_vcore3_base.def.json b/resources/definitions/ratrig_vcore3_base.def.json index f52f6b9b1a..73049b2020 100644 --- a/resources/definitions/ratrig_vcore3_base.def.json +++ b/resources/definitions/ratrig_vcore3_base.def.json @@ -27,7 +27,6 @@ "cool_fan_full_at_height": { "value": "layer_height_0 + 2 * layer_height" }, "cool_min_layer_time": { "value": 2 }, "fill_outline_gaps": { "value": false }, - "filter_out_tiny_gaps": { "value": false }, "gantry_height": { "value": 30 }, "infill_before_walls": { "value": false }, "infill_overlap": { "value": 30 }, diff --git a/resources/definitions/ratrig_vminion.def.json b/resources/definitions/ratrig_vminion.def.json index 8c20c3c49f..daf0d4f302 100644 --- a/resources/definitions/ratrig_vminion.def.json +++ b/resources/definitions/ratrig_vminion.def.json @@ -11,7 +11,7 @@ "machine_extruder_trains": { "0": "ratrig_base_extruder_0" }, "platform_offset": [ 0, - 5, + 0, 0 ], "preferred_variant_name": "0.4mm Nozzle", @@ -34,7 +34,6 @@ "cool_fan_full_at_height": { "value": "layer_height_0 + 2 * layer_height" }, "cool_min_layer_time": { "value": 2 }, "fill_outline_gaps": { "value": false }, - "filter_out_tiny_gaps": { "value": false }, "gantry_height": { "value": 30 }, "infill_before_walls": { "value": false }, "infill_overlap": { "value": 30 }, diff --git a/resources/definitions/ultimaker.def.json b/resources/definitions/ultimaker.def.json index 1669dd5e00..3821fdefd6 100644 --- a/resources/definitions/ultimaker.def.json +++ b/resources/definitions/ultimaker.def.json @@ -8,8 +8,8 @@ "author": "Ultimaker", "manufacturer": "Ultimaker B.V.", "exclude_materials": [ - "generic_hips", - "structur3d_dap100silicone" + "structur3d_", + "generic_hips" ] }, "overrides": @@ -96,16 +96,14 @@ "raft_interface_thickness": { "value": "(raft_base_thickness + raft_surface_thickness) / 2" }, "raft_speed": { "value": 15 }, "raft_surface_fan_speed": { "value": "cool_fan_speed_min" }, + "raft_surface_monotonic": { "value": true }, "raft_surface_speed": { "value": "speed_topbottom" }, - "relative_extrusion": - { - "enabled": false, - "value": false - }, + "relative_extrusion": { "enabled": false }, "retraction_combing": { "value": "'no_outer_surfaces'" }, "retraction_combing_max_distance": { "value": 15 }, "retraction_count_max": { "value": 25 }, "retraction_extrusion_window": { "value": 1 }, + "retraction_min_travel": { "value": 5 }, "roofing_layer_count": { "value": "1" }, "roofing_material_flow": { "value": "material_flow" }, "skin_angles": { "value": "[] if infill_pattern not in ['cross', 'cross_3d'] else [20, 110]" }, diff --git a/resources/definitions/ultimaker2.def.json b/resources/definitions/ultimaker2.def.json index def26c9b6f..8c0e066cd1 100644 --- a/resources/definitions/ultimaker2.def.json +++ b/resources/definitions/ultimaker2.def.json @@ -10,23 +10,23 @@ "file_formats": "text/x-gcode", "platform": "ultimaker2_platform.obj", "exclude_materials": [ + "generic_bam", + "generic_cffcpe", + "generic_cffpa", + "generic_flexible", + "generic_gffcpe", + "generic_gffpa", "generic_hips", + "generic_petcf", "generic_petg", - "structur3d_dap100silicone", - "ultimaker_petg_red", - "ultimaker_petg_blue", - "ultimaker_petg_grey", - "ultimaker_petg_black", - "ultimaker_petg_green", - "ultimaker_petg_white", - "ultimaker_petg_orange", - "ultimaker_petg_silver", - "ultimaker_petg_yellow", - "ultimaker_petg_transparent", - "ultimaker_petg_red_translucent", - "ultimaker_petg_blue_translucent", - "ultimaker_petg_green_translucent", - "ultimaker_petg_yellow_fluorescent" + "generic_pva", + "generic_tough_pla", + "structur3d_", + "ultimaker_bam", + "ultimaker_petcf", + "ultimaker_petg", + "ultimaker_pva", + "ultimaker_tough_pla" ], "firmware_file": "MarlinUltimaker2.hex", "has_machine_quality": true, diff --git a/resources/definitions/ultimaker2_plus.def.json b/resources/definitions/ultimaker2_plus.def.json index 1b3ddcc953..b5ad30bb8d 100644 --- a/resources/definitions/ultimaker2_plus.def.json +++ b/resources/definitions/ultimaker2_plus.def.json @@ -9,43 +9,23 @@ "file_formats": "text/x-gcode", "platform": "ultimaker2_platform.obj", "exclude_materials": [ - "generic_hips", - "generic_petg", "generic_bam", - "ultimaker_bam", - "generic_pva", - "ultimaker_pva", - "generic_tough_pla", - "ultimaker_tough_pla_black", - "ultimaker_tough_pla_green", - "ultimaker_tough_pla_red", - "ultimaker_tough_pla_white", - "ultimaker_tough_pla_blue", - "ultimaker_tough_pla_gray", - "ultimaker_tough_pla_yellow", "generic_cffcpe", "generic_cffpa", + "generic_flexible", "generic_gffcpe", "generic_gffpa", + "generic_hips", "generic_petcf", - "structur3d_dap100silicone", - "ultimaker_petg_red", - "ultimaker_petg_blue", - "ultimaker_petg_grey", - "ultimaker_petg_black", - "ultimaker_petg_green", - "ultimaker_petg_white", - "ultimaker_petg_orange", - "ultimaker_petg_silver", - "ultimaker_petg_yellow", - "ultimaker_petg_transparent", - "ultimaker_petg_red_translucent", - "ultimaker_petg_blue_translucent", - "ultimaker_petg_green_translucent", - "ultimaker_petg_yellow_fluorescent", - "ultimaker_petcf_black", - "ultimaker_petcf_blue", - "ultimaker_petcf_gray" + "generic_petg", + "generic_pva", + "generic_tough_pla", + "structur3d_", + "ultimaker_bam", + "ultimaker_petcf", + "ultimaker_petg", + "ultimaker_pva", + "ultimaker_tough_pla" ], "firmware_file": "MarlinUltimaker2plus.hex", "first_start_actions": [], diff --git a/resources/definitions/ultimaker2_plus_connect.def.json b/resources/definitions/ultimaker2_plus_connect.def.json index 20e914284f..90e7d6f794 100644 --- a/resources/definitions/ultimaker2_plus_connect.def.json +++ b/resources/definitions/ultimaker2_plus_connect.def.json @@ -9,20 +9,18 @@ "file_formats": "application/x-ufp;text/x-gcode", "platform": "ultimaker2_plus_connect_platform.obj", "exclude_materials": [ - "generic_hips", "generic_bam", - "ultimaker_bam", - "generic_pva", - "ultimaker_pva", - "ultimaker_petcf_black", - "ultimaker_petcf_blue", - "ultimaker_petcf_gray", - "generic_petcf", "generic_cffcpe", "generic_cffpa", + "generic_flexible", "generic_gffcpe", "generic_gffpa", - "structur3d_dap100silicone" + "generic_hips", + "generic_pva", + "structur3d_", + "ultimaker_bam", + "ultimaker_petcf", + "ultimaker_pva" ], "first_start_actions": [], "has_machine_materials": true, diff --git a/resources/definitions/ultimaker3.def.json b/resources/definitions/ultimaker3.def.json index 19df92c08d..173fbdb524 100644 --- a/resources/definitions/ultimaker3.def.json +++ b/resources/definitions/ultimaker3.def.json @@ -13,16 +13,15 @@ 9066 ], "exclude_materials": [ - "generic_hips", "generic_cffcpe", "generic_cffpa", + "generic_flexible", "generic_gffcpe", "generic_gffpa", + "generic_hips", "generic_petcf", - "ultimaker_petcf_black", - "ultimaker_petcf_blue", - "ultimaker_petcf_gray", - "structur3d_dap100silicone" + "structur3d_", + "ultimaker_petcf" ], "firmware_update_info": { @@ -156,7 +155,6 @@ "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_prime_tower": { "value": "speed_topbottom" }, diff --git a/resources/definitions/ultimaker_method_base.def.json b/resources/definitions/ultimaker_method_base.def.json index 1ceb05a43a..22d25f92c7 100644 --- a/resources/definitions/ultimaker_method_base.def.json +++ b/resources/definitions/ultimaker_method_base.def.json @@ -28,7 +28,6 @@ "generic_hips_175", "generic_pc_175", "ultimaker_rapidrinse_175", - "ultimaker_sr30_175", "generic_tpu_175", "goofoo_", "ideagen3D_", @@ -373,19 +372,17 @@ "retraction_hop": { "value": 0.4 }, "retraction_hop_enabled": { "value": true }, "retraction_hop_only_when_collides": { "value": false }, - "retraction_min_travel": { "value": "line_width * 4" }, "retraction_prime_speed": { "value": "retraction_speed" }, "retraction_speed": { "value": 5 }, "roofing_layer_count": { "value": 2 }, - "roofing_material_flow": { "value": "material_flow" }, "roofing_monotonic": { "value": true }, "skin_material_flow": { "value": "0.95*material_flow" }, - "skin_monotonic": { "value": true }, "skin_outline_count": { "value": 0 }, "skin_overlap": { "value": 0 }, "skin_preshrink": { "value": 0 }, "skirt_brim_material_flow": { "value": "material_flow" }, "skirt_brim_minimal_length": { "value": 500 }, + "small_skin_width": { "value": 4 }, "speed_equalize_flow_width_factor": { "value": 0 }, "speed_prime_tower": { "value": "speed_topbottom" }, "speed_print": { "value": 50 }, @@ -426,7 +423,7 @@ "travel_avoid_other_parts": { "value": false }, "wall_0_inset": { "value": 0 }, "wall_0_material_flow": { "value": "material_flow" }, - "wall_0_wipe_dist": { "value": 0 }, + "wall_0_wipe_dist": { "value": 0.8 }, "wall_material_flow": { "value": "material_flow" }, "wall_x_material_flow": { "value": "material_flow" }, "xy_offset": { "value": 0 }, diff --git a/resources/definitions/ultimaker_methodx.def.json b/resources/definitions/ultimaker_methodx.def.json index a6708a0421..9828ba96f2 100644 --- a/resources/definitions/ultimaker_methodx.def.json +++ b/resources/definitions/ultimaker_methodx.def.json @@ -35,7 +35,6 @@ "generic_nylon_175", "generic_hips_175", "generic_pc_175", - "ultimaker_sr30_175", "generic_tpu_175", "goofoo_", "ideagen3D_", diff --git a/resources/definitions/ultimaker_original.def.json b/resources/definitions/ultimaker_original.def.json index 00f4615971..6848cb3c86 100644 --- a/resources/definitions/ultimaker_original.def.json +++ b/resources/definitions/ultimaker_original.def.json @@ -10,43 +10,22 @@ "file_formats": "text/x-gcode", "platform": "ultimaker_platform.3mf", "exclude_materials": [ - "generic_hips", - "generic_petg", - "generic_bam", - "ultimaker_bam", - "generic_pva", - "ultimaker_pva", - "generic_tough_pla", - "ultimaker_tough_pla_black", - "ultimaker_tough_pla_green", - "ultimaker_tough_pla_red", - "ultimaker_tough_pla_white", - "ultimaker_tough_pla_blue", - "ultimaker_tough_pla_gray", - "ultimaker_tough_pla_yellow", "generic_cffcpe", "generic_cffpa", + "generic_flexible", "generic_gffcpe", "generic_gffpa", + "generic_hips", "generic_petcf", - "structur3d_dap100silicone", - "ultimaker_petg_blue", - "ultimaker_petg_grey", - "ultimaker_petg_black", - "ultimaker_petg_green", - "ultimaker_petg_white", - "ultimaker_petg_orange", - "ultimaker_petg_silver", - "ultimaker_petg_yellow", - "ultimaker_petg_transparent", - "ultimaker_petg_red_translucent", - "ultimaker_petg_blue_translucent", - "ultimaker_petg_green_translucent", - "ultimaker_petg_yellow_fluorescent", - "ultimaker_petg_red", - "ultimaker_petcf_black", - "ultimaker_petcf_blue", - "ultimaker_petcf_gray" + "generic_petg", + "generic_pva", + "generic_tough_pla", + "structur3d_", + "ultimaker_bam", + "ultimaker_petcf", + "ultimaker_petg", + "ultimaker_pva", + "ultimaker_tough_pla" ], "firmware_file": "MarlinUltimaker-{baudrate}.hex", "firmware_hbk_file": "MarlinUltimaker-HBK-{baudrate}.hex", diff --git a/resources/definitions/ultimaker_original_dual.def.json b/resources/definitions/ultimaker_original_dual.def.json index a4cd6bfdf0..65fca17df7 100644 --- a/resources/definitions/ultimaker_original_dual.def.json +++ b/resources/definitions/ultimaker_original_dual.def.json @@ -10,43 +10,22 @@ "file_formats": "text/x-gcode", "platform": "ultimaker_platform.3mf", "exclude_materials": [ - "generic_hips", - "generic_petg", - "generic_bam", - "ultimaker_bam", - "generic_pva", - "ultimaker_pva", - "generic_tough_pla", - "ultimaker_tough_pla_black", - "ultimaker_tough_pla_green", - "ultimaker_tough_pla_red", - "ultimaker_tough_pla_white", - "ultimaker_tough_pla_blue", - "ultimaker_tough_pla_gray", - "ultimaker_tough_pla_yellow", "generic_cffcpe", "generic_cffpa", + "generic_flexible", "generic_gffcpe", "generic_gffpa", + "generic_hips", "generic_petcf", - "structur3d_dap100silicone", - "ultimaker_petg_blue", - "ultimaker_petg_grey", - "ultimaker_petg_black", - "ultimaker_petg_green", - "ultimaker_petg_white", - "ultimaker_petg_orange", - "ultimaker_petg_silver", - "ultimaker_petg_yellow", - "ultimaker_petg_transparent", - "ultimaker_petg_red_translucent", - "ultimaker_petg_blue_translucent", - "ultimaker_petg_green_translucent", - "ultimaker_petg_yellow_fluorescent", - "ultimaker_petg_red", - "ultimaker_petcf_black", - "ultimaker_petcf_blue", - "ultimaker_petcf_gray" + "generic_petg", + "generic_pva", + "generic_tough_pla", + "structur3d_", + "ultimaker_bam", + "ultimaker_petcf", + "ultimaker_petg", + "ultimaker_pva", + "ultimaker_tough_pla" ], "firmware_file": "MarlinUltimaker-{baudrate}-dual.hex", "firmware_hbk_file": "MarlinUltimaker-HBK-{baudrate}-dual.hex", diff --git a/resources/definitions/ultimaker_s3.def.json b/resources/definitions/ultimaker_s3.def.json index add1782368..3750b83553 100644 --- a/resources/definitions/ultimaker_s3.def.json +++ b/resources/definitions/ultimaker_s3.def.json @@ -16,7 +16,8 @@ ], "exclude_materials": [ "generic_hips", - "structur3d_dap100silicone" + "generic_flexible", + "structur3d_" ], "firmware_update_info": { @@ -108,7 +109,6 @@ "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" }, "retraction_speed": { "value": "45" }, "speed_prime_tower": { "value": "speed_topbottom" }, diff --git a/resources/definitions/ultimaker_s5.def.json b/resources/definitions/ultimaker_s5.def.json index ec82e6b630..eb3984510e 100644 --- a/resources/definitions/ultimaker_s5.def.json +++ b/resources/definitions/ultimaker_s5.def.json @@ -15,6 +15,11 @@ 214476, 214477 ], + "exclude_materials": [ + "generic_hips", + "generic_flexible", + "structur3d_" + ], "firmware_update_info": { "check_urls": [ "https://software.ultimaker.com/releases/firmware/9051/stable/um-update.swu.version" ], @@ -110,7 +115,6 @@ "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" }, "retraction_speed": { "value": "45" }, "speed_prime_tower": { "value": "speed_topbottom" }, diff --git a/resources/definitions/ultimaker_s7.def.json b/resources/definitions/ultimaker_s7.def.json index f7b45aa0e7..bb3f5a938d 100644 --- a/resources/definitions/ultimaker_s7.def.json +++ b/resources/definitions/ultimaker_s7.def.json @@ -44,6 +44,8 @@ }, "overrides": { - "machine_name": { "default_value": "Ultimaker S7" } + "default_material_print_temperature": { "maximum_value_warning": "320" }, + "machine_name": { "default_value": "Ultimaker S7" }, + "material_print_temperature_layer_0": { "maximum_value_warning": "320" } } } \ No newline at end of file diff --git a/resources/extruders/dagoma_sigma_pro_dual_extruder_left.def.json b/resources/extruders/dagoma_sigma_pro_dual_extruder_left.def.json new file mode 100644 index 0000000000..ac00cd1485 --- /dev/null +++ b/resources/extruders/dagoma_sigma_pro_dual_extruder_left.def.json @@ -0,0 +1,18 @@ +{ + "version": 2, + "name": "Left Extruder", + "inherits": "fdmextruder", + "metadata": + { + "machine": "dagoma_sigma_pro_dual", + "position": "1" + }, + "overrides": + { + "extruder_nr": { "default_value": 1 }, + "machine_extruder_end_code": { "default_value": ";END T1\nG92 E0\nM83\nG1 E-55 F4700\nM82\nG92 E0\n" }, + "machine_extruder_start_code": { "default_value": ";START T1\n;No temperature change\nG1 X0 Y77.5 F8000\nG92 E0\nM83\nG1 E50 F1200\nM82\nG92 E0\n" }, + "machine_nozzle_size": { "default_value": 0.4 }, + "material_diameter": { "default_value": 1.75 } + } +} \ No newline at end of file diff --git a/resources/extruders/dagoma_sigma_pro_dual_extruder_right.def.json b/resources/extruders/dagoma_sigma_pro_dual_extruder_right.def.json new file mode 100644 index 0000000000..9959d5108c --- /dev/null +++ b/resources/extruders/dagoma_sigma_pro_dual_extruder_right.def.json @@ -0,0 +1,18 @@ +{ + "version": 2, + "name": "Right Extruder", + "inherits": "fdmextruder", + "metadata": + { + "machine": "dagoma_sigma_pro_dual", + "position": "0" + }, + "overrides": + { + "extruder_nr": { "default_value": 0 }, + "machine_extruder_end_code": { "default_value": ";END T0\nG92 E0\nM83\nG1 E-55 F4700\nM82\nG92 E0\n" }, + "machine_extruder_start_code": { "default_value": ";START T0\n;No temperature change\nG1 X0 Y77.5 F8000\nG92 E0\nM83\nG1 E50 F1200\nM82\nG92 E0\n" }, + "machine_nozzle_size": { "default_value": 0.4 }, + "material_diameter": { "default_value": 1.75 } + } +} \ No newline at end of file diff --git a/resources/extruders/dagoma_sigma_pro_extruder.def.json b/resources/extruders/dagoma_sigma_pro_extruder.def.json new file mode 100644 index 0000000000..55337bd4a0 --- /dev/null +++ b/resources/extruders/dagoma_sigma_pro_extruder.def.json @@ -0,0 +1,18 @@ +{ + "version": 2, + "name": "Extruder", + "inherits": "fdmextruder", + "metadata": + { + "machine": "dagoma_sigma_pro", + "position": "0" + }, + "overrides": + { + "extruder_nr": { "default_value": 0 }, + "machine_extruder_end_code": { "default_value": ";END T0\nG92 E0\nM83\nG1 E-55 F4700\nM82\nG92 E0\n" }, + "machine_extruder_start_code": { "default_value": ";START T0\n;No temperature change\nG1 X0 Y77.5 F8000\nG92 E0\nM83\nG1 E50 F1200\nM82\nG92 E0\n" }, + "machine_nozzle_size": { "default_value": 0.4 }, + "material_diameter": { "default_value": 1.75 } + } +} \ No newline at end of file diff --git a/resources/extruders/geeetech_A20_1.def.json b/resources/extruders/geeetech_A20_1.def.json new file mode 100644 index 0000000000..96e94fe2f6 --- /dev/null +++ b/resources/extruders/geeetech_A20_1.def.json @@ -0,0 +1,16 @@ +{ + "version": 2, + "name": "Extruder 1", + "inherits": "fdmextruder", + "metadata": + { + "machine": "geeetech_A20", + "position": "0" + }, + "overrides": + { + "extruder_nr": { "default_value": 0 }, + "machine_nozzle_size": { "default_value": 0.4 }, + "material_diameter": { "default_value": 1.75 } + } +} \ No newline at end of file diff --git a/resources/i18n/cs_CZ/cura.po b/resources/i18n/cs_CZ/cura.po index 715af3ea84..3267139490 100644 --- a/resources/i18n/cs_CZ/cura.po +++ b/resources/i18n/cs_CZ/cura.po @@ -4946,6 +4946,14 @@ msgctxt "@action:inmenu menubar:edit" msgid "Ungroup Models" msgstr "Rozdělit modely" +msgctxt "@action:inmenu menubar:edit" +msgid "Print Before" +msgstr "Tisknout před" + +msgctxt "@action:inmenu menubar:edit" +msgid "Print After" +msgstr "Tisknout po" + msgctxt "@button" msgid "Uninstall" msgstr "Odinstalovat" diff --git a/resources/i18n/cs_CZ/fdmprinter.def.json.po b/resources/i18n/cs_CZ/fdmprinter.def.json.po index 7588e81c52..4b697c9cea 100644 --- a/resources/i18n/cs_CZ/fdmprinter.def.json.po +++ b/resources/i18n/cs_CZ/fdmprinter.def.json.po @@ -2583,6 +2583,14 @@ msgctxt "print_sequence label" msgid "Print Sequence" msgstr "Tisková sekvence" +msgctxt "user_defined_print_order_enabled label" +msgid "Set Print Sequence Manually" +msgstr "Nastavit tiskovou sekvenci ručně" + +msgctxt "user_defined_print_order_enabled description" +msgid "Allows to order the object list to set the print sequence manually. First object from the list will be printed first." +msgstr "Umožňuje řadit seznam objektů pro ruční nastavení tiskové sekvence. První objekt ze seznamu bude vytisknut jako první." + msgctxt "speed_print label" msgid "Print Speed" msgstr "Rychlost tisku" diff --git a/resources/i18n/cura.pot b/resources/i18n/cura.pot index 7d5b5f94d6..2fabd97f7e 100644 --- a/resources/i18n/cura.pot +++ b/resources/i18n/cura.pot @@ -4565,6 +4565,14 @@ msgctxt "@action:inmenu menubar:edit" msgid "Ungroup Models" msgstr "" +msgctxt "@action:inmenu menubar:edit" +msgid "Print Before" +msgstr "" + +msgctxt "@action:inmenu menubar:edit" +msgid "Print After" +msgstr "" + msgctxt "@button" msgid "Uninstall" msgstr "" diff --git a/resources/i18n/de_DE/cura.po b/resources/i18n/de_DE/cura.po index f006c75fb6..8ca4de67b4 100644 --- a/resources/i18n/de_DE/cura.po +++ b/resources/i18n/de_DE/cura.po @@ -4930,6 +4930,14 @@ msgctxt "@action:inmenu menubar:edit" msgid "Ungroup Models" msgstr "Gruppierung für Modelle aufheben" +msgctxt "@action:inmenu menubar:edit" +msgid "Print Before" +msgstr "Vor dem Drucken" + +msgctxt "@action:inmenu menubar:edit" +msgid "Print After" +msgstr "Nach dem Drucken" + msgctxt "@button" msgid "Uninstall" msgstr "Deinstallieren" diff --git a/resources/i18n/de_DE/fdmprinter.def.json.po b/resources/i18n/de_DE/fdmprinter.def.json.po index ca893ad149..ff44a4837d 100644 --- a/resources/i18n/de_DE/fdmprinter.def.json.po +++ b/resources/i18n/de_DE/fdmprinter.def.json.po @@ -2580,6 +2580,14 @@ msgctxt "print_sequence label" msgid "Print Sequence" msgstr "Druckreihenfolge" +msgctxt "user_defined_print_order_enabled label" +msgid "Set Print Sequence Manually" +msgstr "Druckreihenfolge manuell einstellen" + +msgctxt "user_defined_print_order_enabled description" +msgid "Allows to order the object list to set the print sequence manually. First object from the list will be printed first." +msgstr "Ermöglicht das Ordnen der Objektliste, um die Druckreihenfolge manuell festzulegen. Das erste Objekt aus der Liste wird zuerst gedruckt." + msgctxt "speed_print label" msgid "Print Speed" msgstr "Druckgeschwindigkeit" diff --git a/resources/i18n/es_ES/cura.po b/resources/i18n/es_ES/cura.po index 07d4ad2d79..aa4c727441 100644 --- a/resources/i18n/es_ES/cura.po +++ b/resources/i18n/es_ES/cura.po @@ -4931,6 +4931,14 @@ msgctxt "@action:inmenu menubar:edit" msgid "Ungroup Models" msgstr "Desagrupar modelos" +msgctxt "@action:inmenu menubar:edit" +msgid "Print Before" +msgstr "Imprimir antes" + +msgctxt "@action:inmenu menubar:edit" +msgid "Print After" +msgstr "Imprimir después" + msgctxt "@button" msgid "Uninstall" msgstr "Desinstalar" diff --git a/resources/i18n/es_ES/fdmprinter.def.json.po b/resources/i18n/es_ES/fdmprinter.def.json.po index 4b797652ed..6811ca05a8 100644 --- a/resources/i18n/es_ES/fdmprinter.def.json.po +++ b/resources/i18n/es_ES/fdmprinter.def.json.po @@ -2580,6 +2580,14 @@ msgctxt "print_sequence label" msgid "Print Sequence" msgstr "Secuencia de impresión" +msgctxt "user_defined_print_order_enabled label" +msgid "Set Print Sequence Manually" +msgstr "Establecer secuencia de impresión manualmente" + +msgctxt "user_defined_print_order_enabled description" +msgid "Allows to order the object list to set the print sequence manually. First object from the list will be printed first." +msgstr "Permite ordenar la lista de objetos para establecer la secuencia de impresión manualmente. El primer objeto de la lista se imprimirá primero." + msgctxt "speed_print label" msgid "Print Speed" msgstr "Velocidad de impresión" diff --git a/resources/i18n/fdmprinter.def.json.pot b/resources/i18n/fdmprinter.def.json.pot index ab63530018..4e858de0a7 100644 --- a/resources/i18n/fdmprinter.def.json.pot +++ b/resources/i18n/fdmprinter.def.json.pot @@ -4588,6 +4588,14 @@ msgctxt "print_sequence option one_at_a_time" msgid "One at a Time" msgstr "" +msgctxt "user_defined_print_order_enabled label" +msgid "Set Print Sequence Manually" +msgstr "" + +msgctxt "user_defined_print_order_enabled description" +msgid "Allows to order the object list to set the print sequence manually. First object from the list will be printed first." +msgstr "" + msgctxt "infill_mesh label" msgid "Infill Mesh" msgstr "" diff --git a/resources/i18n/fi_FI/cura.po b/resources/i18n/fi_FI/cura.po index c3f331c1ef..55a60d50ae 100644 --- a/resources/i18n/fi_FI/cura.po +++ b/resources/i18n/fi_FI/cura.po @@ -4899,6 +4899,14 @@ msgctxt "@action:inmenu menubar:edit" msgid "Ungroup Models" msgstr "Poista mallien ryhmitys" +msgctxt "@action:inmenu menubar:edit" +msgid "Print Before" +msgstr "Tulosta ennen" + +msgctxt "@action:inmenu menubar:edit" +msgid "Print After" +msgstr "Tulosta jälkeen" + msgctxt "@button" msgid "Uninstall" msgstr "" diff --git a/resources/i18n/fi_FI/fdmprinter.def.json.po b/resources/i18n/fi_FI/fdmprinter.def.json.po index 19a83d2f6a..a1e4ab420e 100644 --- a/resources/i18n/fi_FI/fdmprinter.def.json.po +++ b/resources/i18n/fi_FI/fdmprinter.def.json.po @@ -2578,6 +2578,14 @@ msgctxt "print_sequence label" msgid "Print Sequence" msgstr "Tulostusjärjestys" +msgctxt "user_defined_print_order_enabled label" +msgid "Set Print Sequence Manually" +msgstr "Aseta tulostusjärjestys manuaalisesti" + +msgctxt "user_defined_print_order_enabled description" +msgid "Allows to order the object list to set the print sequence manually. First object from the list will be printed first." +msgstr "Mahdollistaa kohteiden järjestämisen tulostusjärjestyksen manuaaliseen asettamiseen. Listan ensimmäinen kohde tulostetaan ensin." + msgctxt "speed_print label" msgid "Print Speed" msgstr "Tulostusnopeus" diff --git a/resources/i18n/fr_FR/cura.po b/resources/i18n/fr_FR/cura.po index b597b2d540..af46346d63 100644 --- a/resources/i18n/fr_FR/cura.po +++ b/resources/i18n/fr_FR/cura.po @@ -4928,6 +4928,14 @@ msgctxt "@action:inmenu menubar:edit" msgid "Ungroup Models" msgstr "Dégrouper les modèles" +msgctxt "@action:inmenu menubar:edit" +msgid "Print Before" +msgstr "Imprimer avant" + +msgctxt "@action:inmenu menubar:edit" +msgid "Print After" +msgstr "Imprimer après" + msgctxt "@button" msgid "Uninstall" msgstr "Désinstaller" diff --git a/resources/i18n/fr_FR/fdmprinter.def.json.po b/resources/i18n/fr_FR/fdmprinter.def.json.po index e4018d33e5..2376820b7c 100644 --- a/resources/i18n/fr_FR/fdmprinter.def.json.po +++ b/resources/i18n/fr_FR/fdmprinter.def.json.po @@ -2580,6 +2580,14 @@ msgctxt "print_sequence label" msgid "Print Sequence" msgstr "Séquence d'impression" +msgctxt "user_defined_print_order_enabled label" +msgid "Set Print Sequence Manually" +msgstr "Définir la séquence d'impression manuellement" + +msgctxt "user_defined_print_order_enabled description" +msgid "Allows to order the object list to set the print sequence manually. First object from the list will be printed first." +msgstr "Permet de classer la liste des objets pour définir manuellement la séquence d'impression. Le premier objet de la liste sera imprimé en premier." + msgctxt "speed_print label" msgid "Print Speed" msgstr "Vitesse d’impression" diff --git a/resources/i18n/hu_HU/cura.po b/resources/i18n/hu_HU/cura.po index 9a502fbdf6..d5f06599a1 100644 --- a/resources/i18n/hu_HU/cura.po +++ b/resources/i18n/hu_HU/cura.po @@ -4913,6 +4913,14 @@ msgctxt "@action:inmenu menubar:edit" msgid "Ungroup Models" msgstr "Csoport bontása" +msgctxt "@action:inmenu menubar:edit" +msgid "Print Before" +msgstr "Nyomtatás előtt" + +msgctxt "@action:inmenu menubar:edit" +msgid "Print After" +msgstr "Nyomtatás után" + msgctxt "@button" msgid "Uninstall" msgstr "" diff --git a/resources/i18n/hu_HU/fdmprinter.def.json.po b/resources/i18n/hu_HU/fdmprinter.def.json.po index 789454be37..27eabd4bbc 100644 --- a/resources/i18n/hu_HU/fdmprinter.def.json.po +++ b/resources/i18n/hu_HU/fdmprinter.def.json.po @@ -2585,6 +2585,14 @@ msgctxt "print_sequence label" msgid "Print Sequence" msgstr "Nyomtatási sorrend" +msgctxt "user_defined_print_order_enabled label" +msgid "Set Print Sequence Manually" +msgstr "Nyomtatási sorrend kézi beállítása" + +msgctxt "user_defined_print_order_enabled description" +msgid "Allows to order the object list to set the print sequence manually. First object from the list will be printed first." +msgstr "Lehetővé teszi az objektumlista rendezését a nyomtatási sorrend kézi beállításához. A lista első objektuma lesz először nyomtatva." + msgctxt "speed_print label" msgid "Print Speed" msgstr "Nyomtatási sebesség" diff --git a/resources/i18n/it_IT/cura.po b/resources/i18n/it_IT/cura.po index 1a131973bf..48918d3883 100644 --- a/resources/i18n/it_IT/cura.po +++ b/resources/i18n/it_IT/cura.po @@ -4931,6 +4931,14 @@ msgctxt "@action:inmenu menubar:edit" msgid "Ungroup Models" msgstr "Separa modelli" +msgctxt "@action:inmenu menubar:edit" +msgid "Print Before" +msgstr "Stampa prima" + +msgctxt "@action:inmenu menubar:edit" +msgid "Print After" +msgstr "Stampa dopo" + msgctxt "@button" msgid "Uninstall" msgstr "Disinstalla" diff --git a/resources/i18n/it_IT/fdmprinter.def.json.po b/resources/i18n/it_IT/fdmprinter.def.json.po index 4565e30aa9..e9fc77ca3c 100644 --- a/resources/i18n/it_IT/fdmprinter.def.json.po +++ b/resources/i18n/it_IT/fdmprinter.def.json.po @@ -2580,6 +2580,14 @@ msgctxt "print_sequence label" msgid "Print Sequence" msgstr "Sequenza di stampa" +msgctxt "user_defined_print_order_enabled label" +msgid "Set Print Sequence Manually" +msgstr "Imposta manualmente la sequenza di stampa" + +msgctxt "user_defined_print_order_enabled description" +msgid "Allows to order the object list to set the print sequence manually. First object from the list will be printed first." +msgstr "Consente di ordinare l'elenco degli oggetti per impostare manualmente la sequenza di stampa. Il primo oggetto dell'elenco sarà stampato per primo." + msgctxt "speed_print label" msgid "Print Speed" msgstr "Velocità di stampa" diff --git a/resources/i18n/ja_JP/cura.po b/resources/i18n/ja_JP/cura.po index 7826e4df9e..bc2f27e825 100644 --- a/resources/i18n/ja_JP/cura.po +++ b/resources/i18n/ja_JP/cura.po @@ -4914,6 +4914,14 @@ msgctxt "@action:inmenu menubar:edit" msgid "Ungroup Models" msgstr "モデルを非グループ化" +msgctxt "@action:inmenu menubar:edit" +msgid "Print Before" +msgstr "印刷前" + +msgctxt "@action:inmenu menubar:edit" +msgid "Print After" +msgstr "印刷後" + msgctxt "@button" msgid "Uninstall" msgstr "アンインストール" diff --git a/resources/i18n/ja_JP/fdmprinter.def.json.po b/resources/i18n/ja_JP/fdmprinter.def.json.po index 8e473e72ae..a4311a63bd 100644 --- a/resources/i18n/ja_JP/fdmprinter.def.json.po +++ b/resources/i18n/ja_JP/fdmprinter.def.json.po @@ -2580,6 +2580,14 @@ msgctxt "print_sequence label" msgid "Print Sequence" msgstr "印刷頻度" +msgctxt "user_defined_print_order_enabled label" +msgid "Set Print Sequence Manually" +msgstr "手動で印刷順序を設定する" + +msgctxt "user_defined_print_order_enabled description" +msgid "Allows to order the object list to set the print sequence manually. First object from the list will be printed first." +msgstr "オブジェクトリストを並べ替えて、手動で印刷順序を設定することができます。リストの最初のオブジェクトが最初に印刷されます。" + msgctxt "speed_print label" msgid "Print Speed" msgstr "印刷速度" diff --git a/resources/i18n/ko_KR/cura.po b/resources/i18n/ko_KR/cura.po index 5926b7c442..6bfbd1bae7 100644 --- a/resources/i18n/ko_KR/cura.po +++ b/resources/i18n/ko_KR/cura.po @@ -4917,6 +4917,14 @@ msgctxt "@action:inmenu menubar:edit" msgid "Ungroup Models" msgstr "모델 그룹 해제" +msgctxt "@action:inmenu menubar:edit" +msgid "Print Before" +msgstr "인쇄 전" + +msgctxt "@action:inmenu menubar:edit" +msgid "Print After" +msgstr "인쇄 후" + msgctxt "@button" msgid "Uninstall" msgstr "설치 제거" diff --git a/resources/i18n/ko_KR/fdmprinter.def.json.po b/resources/i18n/ko_KR/fdmprinter.def.json.po index 7e2974dd37..0cf075c854 100644 --- a/resources/i18n/ko_KR/fdmprinter.def.json.po +++ b/resources/i18n/ko_KR/fdmprinter.def.json.po @@ -2580,6 +2580,14 @@ msgctxt "print_sequence label" msgid "Print Sequence" msgstr "프린팅 순서" +msgctxt "user_defined_print_order_enabled label" +msgid "Set Print Sequence Manually" +msgstr "수동으로 인쇄 순서 설정" + +msgctxt "user_defined_print_order_enabled description" +msgid "Allows to order the object list to set the print sequence manually. First object from the list will be printed first." +msgstr "객체 목록을 정렬하여 수동으로 인쇄 순서를 설정할 수 있습니다. 목록의 첫 번째 객체가 먼저 인쇄됩니다." + msgctxt "speed_print label" msgid "Print Speed" msgstr "프린팅 속도" diff --git a/resources/i18n/nl_NL/cura.po b/resources/i18n/nl_NL/cura.po index f831c7989f..43ca87b01e 100644 --- a/resources/i18n/nl_NL/cura.po +++ b/resources/i18n/nl_NL/cura.po @@ -4925,6 +4925,14 @@ msgctxt "@action:inmenu menubar:edit" msgid "Ungroup Models" msgstr "Groeperen van Modellen Opheffen" +msgctxt "@action:inmenu menubar:edit" +msgid "Print Before" +msgstr "Afdrukken voor" + +msgctxt "@action:inmenu menubar:edit" +msgid "Print After" +msgstr "Afdrukken na" + msgctxt "@button" msgid "Uninstall" msgstr "De-installeren" diff --git a/resources/i18n/nl_NL/fdmprinter.def.json.po b/resources/i18n/nl_NL/fdmprinter.def.json.po index 7d6b32e0ac..8c4ef463a8 100644 --- a/resources/i18n/nl_NL/fdmprinter.def.json.po +++ b/resources/i18n/nl_NL/fdmprinter.def.json.po @@ -2580,6 +2580,14 @@ msgctxt "print_sequence label" msgid "Print Sequence" msgstr "Printvolgorde" +msgctxt "user_defined_print_order_enabled label" +msgid "Set Print Sequence Manually" +msgstr "Handmatig afdrukvolgorde instellen" + +msgctxt "user_defined_print_order_enabled description" +msgid "Allows to order the object list to set the print sequence manually. First object from the list will be printed first." +msgstr "Maakt het mogelijk de objectlijst te ordenen om de afdrukvolgorde handmatig in te stellen. Het eerste object van de lijst wordt als eerste afgedrukt." + msgctxt "speed_print label" msgid "Print Speed" msgstr "Printsnelheid" diff --git a/resources/i18n/pl_PL/cura.po b/resources/i18n/pl_PL/cura.po index ed823e183c..fe9f606141 100644 --- a/resources/i18n/pl_PL/cura.po +++ b/resources/i18n/pl_PL/cura.po @@ -4916,6 +4916,14 @@ msgctxt "@action:inmenu menubar:edit" msgid "Ungroup Models" msgstr "Rozgrupuj modele" +msgctxt "@action:inmenu menubar:edit" +msgid "Print Before" +msgstr "Drukuj przed" + +msgctxt "@action:inmenu menubar:edit" +msgid "Print After" +msgstr "Drukuj po" + msgctxt "@button" msgid "Uninstall" msgstr "" diff --git a/resources/i18n/pl_PL/fdmprinter.def.json.po b/resources/i18n/pl_PL/fdmprinter.def.json.po index b772775d09..7f093c859c 100644 --- a/resources/i18n/pl_PL/fdmprinter.def.json.po +++ b/resources/i18n/pl_PL/fdmprinter.def.json.po @@ -2584,6 +2584,14 @@ msgctxt "print_sequence label" msgid "Print Sequence" msgstr "Sekwencja Wydruku" +msgctxt "user_defined_print_order_enabled label" +msgid "Set Print Sequence Manually" +msgstr "Ręczne ustawienie kolejności drukowania" + +msgctxt "user_defined_print_order_enabled description" +msgid "Allows to order the object list to set the print sequence manually. First object from the list will be printed first." +msgstr "Umożliwia ręczne ustawienie kolejności drukowania na liście obiektów. Pierwszy obiekt z listy zostanie wydrukowany jako pierwszy." + msgctxt "speed_print label" msgid "Print Speed" msgstr "Prędkość Druku" diff --git a/resources/i18n/pt_BR/cura.po b/resources/i18n/pt_BR/cura.po index 1c4590a016..0ae0a56cfd 100644 --- a/resources/i18n/pt_BR/cura.po +++ b/resources/i18n/pt_BR/cura.po @@ -4942,6 +4942,14 @@ msgctxt "@action:inmenu menubar:edit" msgid "Ungroup Models" msgstr "Desagrupar Modelos" +msgctxt "@action:inmenu menubar:edit" +msgid "Print Before" +msgstr "Imprimir antes" + +msgctxt "@action:inmenu menubar:edit" +msgid "Print After" +msgstr "Imprimir depois" + msgctxt "@button" msgid "Uninstall" msgstr "Desinstalar" diff --git a/resources/i18n/pt_BR/fdmprinter.def.json.po b/resources/i18n/pt_BR/fdmprinter.def.json.po index 651837f458..412a020a7e 100644 --- a/resources/i18n/pt_BR/fdmprinter.def.json.po +++ b/resources/i18n/pt_BR/fdmprinter.def.json.po @@ -2585,6 +2585,14 @@ msgctxt "print_sequence label" msgid "Print Sequence" msgstr "Sequência de Impressão" +msgctxt "user_defined_print_order_enabled label" +msgid "Set Print Sequence Manually" +msgstr "Definir sequência de impressão manualmente" + +msgctxt "user_defined_print_order_enabled description" +msgid "Allows to order the object list to set the print sequence manually. First object from the list will be printed first." +msgstr "Permite ordenar a lista de objetos para definir a sequência de impressão manualmente. O primeiro objeto da lista será impresso primeiro." + msgctxt "speed_print label" msgid "Print Speed" msgstr "Velocidade de Impressão" diff --git a/resources/i18n/pt_PT/cura.po b/resources/i18n/pt_PT/cura.po index 48ea1e7c2c..d6e19b222d 100644 --- a/resources/i18n/pt_PT/cura.po +++ b/resources/i18n/pt_PT/cura.po @@ -4932,6 +4932,14 @@ msgctxt "@action:inmenu menubar:edit" msgid "Ungroup Models" msgstr "Desagrupar Modelos" +msgctxt "@action:inmenu menubar:edit" +msgid "Print Before" +msgstr "Imprimir antes" + +msgctxt "@action:inmenu menubar:edit" +msgid "Print After" +msgstr "Imprimir depois" + msgctxt "@button" msgid "Uninstall" msgstr "Desinstalar" diff --git a/resources/i18n/pt_PT/fdmprinter.def.json.po b/resources/i18n/pt_PT/fdmprinter.def.json.po index dea593ffe4..36283bc9de 100644 --- a/resources/i18n/pt_PT/fdmprinter.def.json.po +++ b/resources/i18n/pt_PT/fdmprinter.def.json.po @@ -2580,6 +2580,14 @@ msgctxt "print_sequence label" msgid "Print Sequence" msgstr "Sequência de impressão" +msgctxt "user_defined_print_order_enabled label" +msgid "Set Print Sequence Manually" +msgstr "Definir sequência de impressão manualmente" + +msgctxt "user_defined_print_order_enabled description" +msgid "Allows to order the object list to set the print sequence manually. First object from the list will be printed first." +msgstr "Permite ordenar a lista de objetos para definir a sequência de impressão manualmente. O primeiro objeto da lista será impresso primeiro." + msgctxt "speed_print label" msgid "Print Speed" msgstr "Velocidade de Impressão" diff --git a/resources/i18n/ru_RU/cura.po b/resources/i18n/ru_RU/cura.po index 6494d6b5d2..2960193d7e 100644 --- a/resources/i18n/ru_RU/cura.po +++ b/resources/i18n/ru_RU/cura.po @@ -4955,6 +4955,14 @@ msgctxt "@action:inmenu menubar:edit" msgid "Ungroup Models" msgstr "Разгруппировать модели" +msgctxt "@action:inmenu menubar:edit" +msgid "Print Before" +msgstr "Печатать до" + +msgctxt "@action:inmenu menubar:edit" +msgid "Print After" +msgstr "Печатать после" + msgctxt "@button" msgid "Uninstall" msgstr "Удалить" diff --git a/resources/i18n/ru_RU/fdmprinter.def.json.po b/resources/i18n/ru_RU/fdmprinter.def.json.po index 99036d4865..bba90e21ef 100644 --- a/resources/i18n/ru_RU/fdmprinter.def.json.po +++ b/resources/i18n/ru_RU/fdmprinter.def.json.po @@ -2580,6 +2580,14 @@ msgctxt "print_sequence label" msgid "Print Sequence" msgstr "Последовательная печать" +msgctxt "user_defined_print_order_enabled label" +msgid "Set Print Sequence Manually" +msgstr "Установить последовательность печати вручную" + +msgctxt "user_defined_print_order_enabled description" +msgid "Allows to order the object list to set the print sequence manually. First object from the list will be printed first." +msgstr "Позволяет упорядочить список объектов для ручной настройки последовательности печати. Первый объект из списка будет напечатан первым." + msgctxt "speed_print label" msgid "Print Speed" msgstr "Скорость печати" diff --git a/resources/i18n/tr_TR/cura.po b/resources/i18n/tr_TR/cura.po index d98ff91e72..c3afd0c7c1 100644 --- a/resources/i18n/tr_TR/cura.po +++ b/resources/i18n/tr_TR/cura.po @@ -4931,6 +4931,14 @@ msgctxt "@action:inmenu menubar:edit" msgid "Ungroup Models" msgstr "Model Grubunu Çöz" +msgctxt "@action:inmenu menubar:edit" +msgid "Print Before" +msgstr "Önce Yazdır" + +msgctxt "@action:inmenu menubar:edit" +msgid "Print After" +msgstr "Sonra Yazdır" + msgctxt "@button" msgid "Uninstall" msgstr "Kaldır" diff --git a/resources/i18n/tr_TR/fdmprinter.def.json.po b/resources/i18n/tr_TR/fdmprinter.def.json.po index b57a0cd0bb..0e11895512 100644 --- a/resources/i18n/tr_TR/fdmprinter.def.json.po +++ b/resources/i18n/tr_TR/fdmprinter.def.json.po @@ -2580,6 +2580,14 @@ msgctxt "print_sequence label" msgid "Print Sequence" msgstr "Yazdırma Dizisi" +msgctxt "user_defined_print_order_enabled label" +msgid "Set Print Sequence Manually" +msgstr "Baskı Sırasını Manuel Olarak Ayarla" + +msgctxt "user_defined_print_order_enabled description" +msgid "Allows to order the object list to set the print sequence manually. First object from the list will be printed first." +msgstr "Nesne listesini sıralayarak baskı sırasını manuel olarak ayarlamayı sağlar. Listeden ilk nesne ilk olarak basılacak." + msgctxt "speed_print label" msgid "Print Speed" msgstr "Yazdırma Hızı" diff --git a/resources/i18n/zh_CN/cura.po b/resources/i18n/zh_CN/cura.po index 34b4f1d4dc..cf2ed81f9b 100644 --- a/resources/i18n/zh_CN/cura.po +++ b/resources/i18n/zh_CN/cura.po @@ -4919,6 +4919,14 @@ msgctxt "@action:inmenu menubar:edit" msgid "Ungroup Models" msgstr "拆分模型" +msgctxt "@action:inmenu menubar:edit" +msgid "Print Before" +msgstr "打印前" + +msgctxt "@action:inmenu menubar:edit" +msgid "Print After" +msgstr "打印后" + msgctxt "@button" msgid "Uninstall" msgstr "卸载" diff --git a/resources/i18n/zh_CN/fdmprinter.def.json.po b/resources/i18n/zh_CN/fdmprinter.def.json.po index 1042199d5b..4696832051 100644 --- a/resources/i18n/zh_CN/fdmprinter.def.json.po +++ b/resources/i18n/zh_CN/fdmprinter.def.json.po @@ -2580,6 +2580,14 @@ msgctxt "print_sequence label" msgid "Print Sequence" msgstr "打印序列" +msgctxt "user_defined_print_order_enabled label" +msgid "Set Print Sequence Manually" +msgstr "手动设置打印顺序" + +msgctxt "user_defined_print_order_enabled description" +msgid "Allows to order the object list to set the print sequence manually. First object from the list will be printed first." +msgstr "允许对对象列表进行排序,以手动设置打印顺序。列表中的第一个对象将首先被打印。" + msgctxt "speed_print label" msgid "Print Speed" msgstr "打印速度" diff --git a/resources/i18n/zh_TW/cura.po b/resources/i18n/zh_TW/cura.po index a461fd1fa3..741bde1d14 100644 --- a/resources/i18n/zh_TW/cura.po +++ b/resources/i18n/zh_TW/cura.po @@ -4911,6 +4911,14 @@ msgctxt "@action:inmenu menubar:edit" msgid "Ungroup Models" msgstr "取消模型群組" +msgctxt "@action:inmenu menubar:edit" +msgid "Print Before" +msgstr "列印前" + +msgctxt "@action:inmenu menubar:edit" +msgid "Print After" +msgstr "列印後" + msgctxt "@button" msgid "Uninstall" msgstr "" diff --git a/resources/i18n/zh_TW/fdmprinter.def.json.po b/resources/i18n/zh_TW/fdmprinter.def.json.po index c92a7f861a..aa02299fc1 100644 --- a/resources/i18n/zh_TW/fdmprinter.def.json.po +++ b/resources/i18n/zh_TW/fdmprinter.def.json.po @@ -2585,6 +2585,14 @@ msgctxt "print_sequence label" msgid "Print Sequence" msgstr "列印順序" +msgctxt "user_defined_print_order_enabled label" +msgid "Set Print Sequence Manually" +msgstr "手動設置列印順序" + +msgctxt "user_defined_print_order_enabled description" +msgid "Allows to order the object list to set the print sequence manually. First object from the list will be printed first." +msgstr "允許手動設置物件列表以設定列印順序。列表中的第一個物件將首先被列印。" + msgctxt "speed_print label" msgid "Print Speed" msgstr "列印速度" diff --git a/resources/images/cura-share.png b/resources/images/cura-share.png new file mode 100644 index 0000000000..60de85194c Binary files /dev/null and b/resources/images/cura-share.png differ diff --git a/resources/images/dagoma_sigma_pro.png b/resources/images/dagoma_sigma_pro.png new file mode 100644 index 0000000000..26481a3505 Binary files /dev/null and b/resources/images/dagoma_sigma_pro.png differ diff --git a/resources/intent/ultimaker_methodx/um_methodx_1c_um-asa-175_0.2mm_solid.inst.cfg b/resources/intent/ultimaker_methodx/um_methodx_1c_um-asa-175_0.2mm_solid.inst.cfg new file mode 100644 index 0000000000..23c8807afd --- /dev/null +++ b/resources/intent/ultimaker_methodx/um_methodx_1c_um-asa-175_0.2mm_solid.inst.cfg @@ -0,0 +1,18 @@ +[general] +definition = ultimaker_methodx +name = Solid +version = 4 + +[metadata] +intent_category = solid +is_experimental = True +material = ultimaker_asa_175 +quality_type = draft +setting_version = 22 +type = intent +variant = 1C + +[values] +infill_pattern = lines +infill_sparse_density = 100 + diff --git a/resources/intent/ultimaker_methodx/um_methodx_1c_um-nylon12-cf-175_0.2mm_solid.inst.cfg b/resources/intent/ultimaker_methodx/um_methodx_1c_um-nylon12-cf-175_0.2mm_solid.inst.cfg new file mode 100644 index 0000000000..cdff2f30ce --- /dev/null +++ b/resources/intent/ultimaker_methodx/um_methodx_1c_um-nylon12-cf-175_0.2mm_solid.inst.cfg @@ -0,0 +1,18 @@ +[general] +definition = ultimaker_methodx +name = Solid +version = 4 + +[metadata] +intent_category = solid +is_experimental = True +material = ultimaker_nylon12-cf_175 +quality_type = draft +setting_version = 22 +type = intent +variant = 1C + +[values] +infill_pattern = lines +infill_sparse_density = 100 + diff --git a/resources/intent/ultimaker_methodx/um_methodx_1xa_um-asa-175_0.2mm_solid.inst.cfg b/resources/intent/ultimaker_methodx/um_methodx_1xa_um-asa-175_0.2mm_solid.inst.cfg new file mode 100644 index 0000000000..3a781b61aa --- /dev/null +++ b/resources/intent/ultimaker_methodx/um_methodx_1xa_um-asa-175_0.2mm_solid.inst.cfg @@ -0,0 +1,18 @@ +[general] +definition = ultimaker_methodx +name = Solid +version = 4 + +[metadata] +intent_category = solid +is_experimental = True +material = ultimaker_asa_175 +quality_type = draft +setting_version = 22 +type = intent +variant = 1XA + +[values] +infill_pattern = lines +infill_sparse_density = 100 + diff --git a/resources/intent/ultimaker_methodx/um_methodx_2xa_um-sr30-175_0.2mm_solid.inst.cfg b/resources/intent/ultimaker_methodx/um_methodx_2xa_um-sr30-175_0.2mm_solid.inst.cfg new file mode 100644 index 0000000000..a833556bd8 --- /dev/null +++ b/resources/intent/ultimaker_methodx/um_methodx_2xa_um-sr30-175_0.2mm_solid.inst.cfg @@ -0,0 +1,17 @@ +[general] +definition = ultimaker_methodx +name = Solid +version = 4 + +[metadata] +intent_category = solid +is_experimental = True +material = ultimaker_sr30_175 +quality_type = draft +setting_version = 22 +type = intent +variant = 2XA + +[values] +infill_sparse_density = 100 + diff --git a/resources/intent/ultimaker_methodx/um_methodx_labs_um-asa-175_0.2mm_solid.inst.cfg b/resources/intent/ultimaker_methodx/um_methodx_labs_um-asa-175_0.2mm_solid.inst.cfg new file mode 100644 index 0000000000..87823a01a6 --- /dev/null +++ b/resources/intent/ultimaker_methodx/um_methodx_labs_um-asa-175_0.2mm_solid.inst.cfg @@ -0,0 +1,18 @@ +[general] +definition = ultimaker_methodx +name = Solid +version = 4 + +[metadata] +intent_category = solid +is_experimental = True +material = ultimaker_asa_175 +quality_type = draft +setting_version = 22 +type = intent +variant = LABS + +[values] +infill_pattern = lines +infill_sparse_density = 100 + diff --git a/resources/intent/ultimaker_methodx/um_methodx_labs_um-nylon12-cf-175_0.2mm_solid.inst.cfg b/resources/intent/ultimaker_methodx/um_methodx_labs_um-nylon12-cf-175_0.2mm_solid.inst.cfg new file mode 100644 index 0000000000..bb76919888 --- /dev/null +++ b/resources/intent/ultimaker_methodx/um_methodx_labs_um-nylon12-cf-175_0.2mm_solid.inst.cfg @@ -0,0 +1,18 @@ +[general] +definition = ultimaker_methodx +name = Solid +version = 4 + +[metadata] +intent_category = solid +is_experimental = True +material = ultimaker_nylon12-cf_175 +quality_type = draft +setting_version = 22 +type = intent +variant = LABS + +[values] +infill_pattern = lines +infill_sparse_density = 100 + diff --git a/resources/intent/ultimaker_methodxl/um_methodxl_1c_um-asa-175_0.2mm_solid.inst.cfg b/resources/intent/ultimaker_methodxl/um_methodxl_1c_um-asa-175_0.2mm_solid.inst.cfg new file mode 100644 index 0000000000..12bc3f2708 --- /dev/null +++ b/resources/intent/ultimaker_methodxl/um_methodxl_1c_um-asa-175_0.2mm_solid.inst.cfg @@ -0,0 +1,18 @@ +[general] +definition = ultimaker_methodxl +name = Solid +version = 4 + +[metadata] +intent_category = solid +is_experimental = True +material = ultimaker_asa_175 +quality_type = draft +setting_version = 22 +type = intent +variant = 1C + +[values] +infill_pattern = lines +infill_sparse_density = 100 + diff --git a/resources/intent/ultimaker_methodxl/um_methodxl_1c_um-nylon12-cf-175_0.2mm_solid.inst.cfg b/resources/intent/ultimaker_methodxl/um_methodxl_1c_um-nylon12-cf-175_0.2mm_solid.inst.cfg new file mode 100644 index 0000000000..5533672636 --- /dev/null +++ b/resources/intent/ultimaker_methodxl/um_methodxl_1c_um-nylon12-cf-175_0.2mm_solid.inst.cfg @@ -0,0 +1,18 @@ +[general] +definition = ultimaker_methodxl +name = Solid +version = 4 + +[metadata] +intent_category = solid +is_experimental = True +material = ultimaker_nylon12-cf_175 +quality_type = draft +setting_version = 22 +type = intent +variant = 1C + +[values] +infill_pattern = lines +infill_sparse_density = 100 + diff --git a/resources/intent/ultimaker_methodxl/um_methodxl_1xa_um-asa-175_0.2mm_solid.inst.cfg b/resources/intent/ultimaker_methodxl/um_methodxl_1xa_um-asa-175_0.2mm_solid.inst.cfg new file mode 100644 index 0000000000..82aa8e9bad --- /dev/null +++ b/resources/intent/ultimaker_methodxl/um_methodxl_1xa_um-asa-175_0.2mm_solid.inst.cfg @@ -0,0 +1,18 @@ +[general] +definition = ultimaker_methodxl +name = Solid +version = 4 + +[metadata] +intent_category = solid +is_experimental = True +material = ultimaker_asa_175 +quality_type = draft +setting_version = 22 +type = intent +variant = 1XA + +[values] +infill_pattern = lines +infill_sparse_density = 100 + diff --git a/resources/intent/ultimaker_methodxl/um_methodxl_2xa_um-sr30-175_0.2mm_solid.inst.cfg b/resources/intent/ultimaker_methodxl/um_methodxl_2xa_um-sr30-175_0.2mm_solid.inst.cfg new file mode 100644 index 0000000000..01a55c85a4 --- /dev/null +++ b/resources/intent/ultimaker_methodxl/um_methodxl_2xa_um-sr30-175_0.2mm_solid.inst.cfg @@ -0,0 +1,17 @@ +[general] +definition = ultimaker_methodxl +name = Solid +version = 4 + +[metadata] +intent_category = solid +is_experimental = True +material = ultimaker_sr30_175 +quality_type = draft +setting_version = 22 +type = intent +variant = 2XA + +[values] +infill_sparse_density = 100 + diff --git a/resources/intent/ultimaker_methodxl/um_methodxl_labs_um-asa-175_0.2mm_solid.inst.cfg b/resources/intent/ultimaker_methodxl/um_methodxl_labs_um-asa-175_0.2mm_solid.inst.cfg new file mode 100644 index 0000000000..ae7100bc86 --- /dev/null +++ b/resources/intent/ultimaker_methodxl/um_methodxl_labs_um-asa-175_0.2mm_solid.inst.cfg @@ -0,0 +1,18 @@ +[general] +definition = ultimaker_methodxl +name = Solid +version = 4 + +[metadata] +intent_category = solid +is_experimental = True +material = ultimaker_asa_175 +quality_type = draft +setting_version = 22 +type = intent +variant = LABS + +[values] +infill_pattern = lines +infill_sparse_density = 100 + diff --git a/resources/intent/ultimaker_methodxl/um_methodxl_labs_um-nylon12-cf-175_0.2mm_solid.inst.cfg b/resources/intent/ultimaker_methodxl/um_methodxl_labs_um-nylon12-cf-175_0.2mm_solid.inst.cfg new file mode 100644 index 0000000000..af43c95cd2 --- /dev/null +++ b/resources/intent/ultimaker_methodxl/um_methodxl_labs_um-nylon12-cf-175_0.2mm_solid.inst.cfg @@ -0,0 +1,18 @@ +[general] +definition = ultimaker_methodxl +name = Solid +version = 4 + +[metadata] +intent_category = solid +is_experimental = True +material = ultimaker_nylon12-cf_175 +quality_type = draft +setting_version = 22 +type = intent +variant = LABS + +[values] +infill_pattern = lines +infill_sparse_density = 100 + diff --git a/resources/meshes/dagoma_sigma_pro.obj b/resources/meshes/dagoma_sigma_pro.obj new file mode 100644 index 0000000000..c5fd878e4a --- /dev/null +++ b/resources/meshes/dagoma_sigma_pro.obj @@ -0,0 +1,8456 @@ +o Object.1 +v 99.619469 -8.715574 -0.000001 +v 99.904823 -4.361938 -0.000001 +v 0.000000 0.000000 0.000000 +v 0.000000 0.000000 0.000000 +v 99.144485 -13.052619 -0.000002 +v 99.619469 -8.715574 -0.000001 +v 99.619469 -8.715574 -0.000001 +v 99.144485 -13.052619 -0.000002 +v 99.619469 -8.715573 -5.000001 +v 99.904823 -4.361937 -5.000000 +v 99.619469 -8.715574 -0.000001 +v 99.619469 -8.715573 -5.000001 +v 154.689117 -54.309799 -5.000009 +v 99.904823 -4.361937 -5.000000 +v 99.619469 -8.715573 -5.000001 +v 99.619469 -8.715573 -5.000001 +v 99.144485 -13.052618 -5.000002 +v 154.689117 -54.309799 -5.000009 +v 99.144485 -13.052618 -5.000002 +v 98.480774 -17.364819 -5.000003 +v 154.689117 -54.309799 -5.000009 +v 154.689117 -54.309799 -5.000009 +v 98.480774 -17.364819 -5.000003 +v 97.629601 -21.643961 -5.000003 +v 97.629601 -21.643961 -5.000003 +v 96.592583 -25.881905 -5.000004 +v 154.689117 -54.309799 -5.000009 +v 96.592583 -25.881905 -5.000004 +v 95.371696 -30.070581 -5.000005 +v 154.689117 -54.309799 -5.000009 +v 154.689117 -54.309799 -5.000009 +v 95.371696 -30.070581 -5.000005 +v 155.423599 -55.648598 -5.000009 +v 155.423599 -55.648598 -5.000009 +v 154.689117 -54.309795 -15.000009 +v 154.689117 -54.309799 -5.000009 +v 154.689117 -54.309799 -5.000009 +v 154.689117 -54.309795 -15.000009 +v 30.310890 161.119598 -14.999973 +v 30.310890 161.119598 -4.999974 +v 154.689117 -54.309799 -5.000009 +v 30.310890 161.119598 -14.999973 +v 30.310890 161.119598 -4.999974 +v 30.310890 161.119598 -14.999973 +v 29.535435 162.398788 -14.999973 +v 30.310890 161.119598 -4.999974 +v 29.535435 162.398788 -14.999973 +v 29.535435 162.398788 -4.999974 +v 30.310890 161.119598 -4.999974 +v 29.535435 162.398788 -4.999974 +v 17.364819 98.480774 -4.999984 +v 17.364819 98.480774 -4.999984 +v 21.643961 97.629601 -4.999984 +v 30.310890 161.119598 -4.999974 +v 21.643961 97.629601 -4.999984 +v 25.881905 96.592583 -4.999984 +v 30.310890 161.119598 -4.999974 +v 30.310890 161.119598 -4.999974 +v 25.881905 96.592583 -4.999984 +v 30.070581 95.371696 -4.999984 +v 30.070581 95.371696 -4.999984 +v 34.202015 93.969261 -4.999985 +v 30.310890 161.119598 -4.999974 +v 34.202015 93.969261 -4.999985 +v 38.268341 92.387955 -4.999985 +v 30.310890 161.119598 -4.999974 +v 38.268341 92.387955 -4.999985 +v 42.261829 90.630775 -4.999985 +v 30.310890 161.119598 -4.999974 +v 42.261829 90.630775 -4.999985 +v 46.174862 88.701088 -4.999986 +v 30.310890 161.119598 -4.999974 +v 30.310890 161.119598 -4.999974 +v 46.174862 88.701088 -4.999986 +v 50.000000 86.602539 -4.999986 +v 50.000000 86.602539 -4.999986 +v 53.729961 84.339142 -4.999986 +v 30.310890 161.119598 -4.999974 +v 53.729961 84.339142 -4.999986 +v 57.357643 81.915207 -4.999987 +v 30.310890 161.119598 -4.999974 +v 30.310890 161.119598 -4.999974 +v 57.357643 81.915207 -4.999987 +v 60.876141 79.335335 -4.999987 +v 60.876141 79.335335 -4.999987 +v 64.278763 76.604439 -4.999988 +v 30.310890 161.119598 -4.999974 +v 64.278763 76.604439 -4.999988 +v 67.559021 73.727737 -4.999988 +v 30.310890 161.119598 -4.999974 +v 67.559021 73.727737 -4.999988 +v 70.710678 70.710678 -4.999989 +v 30.310890 161.119598 -4.999974 +v 30.310890 161.119598 -4.999974 +v 70.710678 70.710678 -4.999989 +v 73.727737 67.559021 -4.999989 +v 73.727737 67.559021 -4.999989 +v 76.604439 64.278763 -4.999990 +v 30.310890 161.119598 -4.999974 +v 76.604439 64.278763 -4.999990 +v 79.335335 60.876141 -4.999990 +v 30.310890 161.119598 -4.999974 +v 30.310890 161.119598 -4.999974 +v 79.335335 60.876141 -4.999990 +v 81.915207 57.357643 -4.999990 +v 81.915207 57.357643 -4.999990 +v 84.339142 53.729961 -4.999991 +v 30.310890 161.119598 -4.999974 +v 84.339142 53.729961 -4.999991 +v 86.602539 50.000000 -4.999992 +v 30.310890 161.119598 -4.999974 +v 84.339142 53.729961 -4.999991 +v 86.602539 50.000000 0.000008 +v 86.602539 50.000000 -4.999992 +v 86.602539 50.000000 0.000008 +v 88.701088 46.174862 0.000008 +v 86.602539 50.000000 -4.999992 +v 86.602539 50.000000 -4.999992 +v 88.701088 46.174862 0.000008 +v 88.701088 46.174862 -4.999992 +v 86.602539 50.000000 -4.999992 +v 88.701088 46.174862 -4.999992 +v 154.689117 -54.309799 -5.000009 +v 154.689117 -54.309799 -5.000009 +v 88.701088 46.174862 -4.999992 +v 90.630775 42.261829 -4.999993 +v 90.630775 42.261829 -4.999993 +v 92.387955 38.268341 -4.999994 +v 154.689117 -54.309799 -5.000009 +v 92.387955 38.268341 -4.999994 +v 93.969261 34.202015 -4.999994 +v 154.689117 -54.309799 -5.000009 +v 154.689117 -54.309799 -5.000009 +v 93.969261 34.202015 -4.999994 +v 95.371696 30.070581 -4.999995 +v 95.371696 30.070581 -4.999995 +v 96.592583 25.881905 -4.999996 +v 154.689117 -54.309799 -5.000009 +v 96.592583 25.881905 -4.999996 +v 97.629601 21.643961 -4.999997 +v 154.689117 -54.309799 -5.000009 +v 154.689117 -54.309799 -5.000009 +v 97.629601 21.643961 -4.999997 +v 98.480774 17.364819 -4.999997 +v 98.480774 17.364819 -4.999997 +v 99.144485 13.052620 -4.999998 +v 154.689117 -54.309799 -5.000009 +v 99.144485 13.052620 -4.999998 +v 99.619469 8.715575 -4.999999 +v 154.689117 -54.309799 -5.000009 +v 154.689117 -54.309799 -5.000009 +v 99.619469 8.715575 -4.999999 +v 99.904823 4.361939 -5.000000 +v 99.904823 4.361939 -5.000000 +v 100.000000 0.000001 -5.000000 +v 154.689117 -54.309799 -5.000009 +v 99.904823 4.361939 -5.000000 +v 100.000000 0.000000 0.000000 +v 100.000000 0.000001 -5.000000 +v 100.000000 0.000000 0.000000 +v 99.904823 -4.361938 -0.000001 +v 100.000000 0.000001 -5.000000 +v 100.000000 0.000001 -5.000000 +v 99.904823 -4.361938 -0.000001 +v 99.904823 -4.361937 -5.000000 +v 99.904823 4.361938 0.000001 +v 100.000000 0.000000 0.000000 +v 99.904823 4.361939 -5.000000 +v 0.000000 0.000000 0.000000 +v 100.000000 0.000000 0.000000 +v 99.904823 4.361938 0.000001 +v 99.904823 4.361938 0.000001 +v 99.619469 8.715574 0.000001 +v 0.000000 0.000000 0.000000 +v 99.619469 8.715574 0.000001 +v 99.144485 13.052619 0.000002 +v 0.000000 0.000000 0.000000 +v 0.000000 0.000000 0.000000 +v 99.144485 13.052619 0.000002 +v 98.480774 17.364819 0.000003 +v 98.480774 17.364819 0.000003 +v 97.629601 21.643961 0.000004 +v 0.000000 0.000000 0.000000 +v 97.629601 21.643961 0.000004 +v 96.592583 25.881905 0.000004 +v 0.000000 0.000000 0.000000 +v 0.000000 0.000000 0.000000 +v 96.592583 25.881905 0.000004 +v 95.371696 30.070581 0.000005 +v 95.371696 30.070581 0.000005 +v 93.969261 34.202015 0.000006 +v 0.000000 0.000000 0.000000 +v 93.969261 34.202015 0.000006 +v 92.387955 38.268341 0.000006 +v 0.000000 0.000000 0.000000 +v 0.000000 0.000000 0.000000 +v 92.387955 38.268341 0.000006 +v 90.630775 42.261829 0.000007 +v 90.630775 42.261829 0.000007 +v 88.701088 46.174862 0.000008 +v 0.000000 0.000000 0.000000 +v 90.630775 42.261829 0.000007 +v 92.387955 38.268341 0.000006 +v 90.630775 42.261829 -4.999993 +v 92.387955 38.268341 0.000006 +v 93.969261 34.202015 0.000006 +v 92.387955 38.268341 -4.999994 +v 93.969261 34.202015 0.000006 +v 95.371696 30.070581 0.000005 +v 93.969261 34.202015 -4.999994 +v 95.371696 30.070581 0.000005 +v 96.592583 25.881905 0.000004 +v 95.371696 30.070581 -4.999995 +v 96.592583 25.881905 0.000004 +v 97.629601 21.643961 0.000004 +v 96.592583 25.881905 -4.999996 +v 97.629601 21.643961 0.000004 +v 98.480774 17.364819 0.000003 +v 97.629601 21.643961 -4.999997 +v 98.480774 17.364819 0.000003 +v 99.144485 13.052619 0.000002 +v 98.480774 17.364819 -4.999997 +v 99.144485 13.052619 0.000002 +v 99.619469 8.715574 0.000001 +v 99.144485 13.052620 -4.999998 +v 99.619469 8.715574 0.000001 +v 99.904823 4.361938 0.000001 +v 99.619469 8.715575 -4.999999 +v 99.619469 8.715575 -4.999999 +v 99.904823 4.361938 0.000001 +v 99.904823 4.361939 -5.000000 +v 99.144485 13.052620 -4.999998 +v 99.619469 8.715574 0.000001 +v 99.619469 8.715575 -4.999999 +v 98.480774 17.364819 -4.999997 +v 99.144485 13.052619 0.000002 +v 99.144485 13.052620 -4.999998 +v 97.629601 21.643961 -4.999997 +v 98.480774 17.364819 0.000003 +v 98.480774 17.364819 -4.999997 +v 96.592583 25.881905 -4.999996 +v 97.629601 21.643961 0.000004 +v 97.629601 21.643961 -4.999997 +v 95.371696 30.070581 -4.999995 +v 96.592583 25.881905 0.000004 +v 96.592583 25.881905 -4.999996 +v 93.969261 34.202015 -4.999994 +v 95.371696 30.070581 0.000005 +v 95.371696 30.070581 -4.999995 +v 92.387955 38.268341 -4.999994 +v 93.969261 34.202015 0.000006 +v 93.969261 34.202015 -4.999994 +v 90.630775 42.261829 -4.999993 +v 92.387955 38.268341 0.000006 +v 92.387955 38.268341 -4.999994 +v 88.701088 46.174862 -4.999992 +v 90.630775 42.261829 0.000007 +v 90.630775 42.261829 -4.999993 +v 88.701088 46.174862 0.000008 +v 90.630775 42.261829 0.000007 +v 88.701088 46.174862 -4.999992 +v 88.701088 46.174862 0.000008 +v 86.602539 50.000000 0.000008 +v 0.000000 0.000000 0.000000 +v 0.000000 0.000000 0.000000 +v 86.602539 50.000000 0.000008 +v 84.339142 53.729961 0.000009 +v 84.339142 53.729961 0.000009 +v 81.915207 57.357643 0.000009 +v 0.000000 0.000000 0.000000 +v 81.915207 57.357643 0.000009 +v 79.335335 60.876141 0.000010 +v 0.000000 0.000000 0.000000 +v 0.000000 0.000000 0.000000 +v 79.335335 60.876141 0.000010 +v 76.604439 64.278763 0.000010 +v 76.604439 64.278763 0.000010 +v 73.727737 67.559021 0.000011 +v 0.000000 0.000000 0.000000 +v 73.727737 67.559021 0.000011 +v 70.710678 70.710678 0.000012 +v 0.000000 0.000000 0.000000 +v 0.000000 0.000000 0.000000 +v 70.710678 70.710678 0.000012 +v 67.559021 73.727737 0.000012 +v 67.559021 73.727737 0.000012 +v 64.278763 76.604439 0.000012 +v 0.000000 0.000000 0.000000 +v 64.278763 76.604439 0.000012 +v 60.876141 79.335335 0.000013 +v 0.000000 0.000000 0.000000 +v 0.000000 0.000000 0.000000 +v 60.876141 79.335335 0.000013 +v 57.357643 81.915207 0.000013 +v 57.357643 81.915207 0.000013 +v 53.729961 84.339142 0.000014 +v 0.000000 0.000000 0.000000 +v 53.729961 84.339142 0.000014 +v 50.000000 86.602539 0.000014 +v 0.000000 0.000000 0.000000 +v 0.000000 0.000000 0.000000 +v 50.000000 86.602539 0.000014 +v 46.174862 88.701088 0.000014 +v 46.174862 88.701088 0.000014 +v 42.261829 90.630775 0.000015 +v 0.000000 0.000000 0.000000 +v 42.261829 90.630775 0.000015 +v 38.268341 92.387955 0.000015 +v 0.000000 0.000000 0.000000 +v 0.000000 0.000000 0.000000 +v 38.268341 92.387955 0.000015 +v 34.202015 93.969261 0.000015 +v 34.202015 93.969261 0.000015 +v 30.070581 95.371696 0.000016 +v 0.000000 0.000000 0.000000 +v 30.070581 95.371696 0.000016 +v 25.881905 96.592583 0.000016 +v 0.000000 0.000000 0.000000 +v 0.000000 0.000000 0.000000 +v 25.881905 96.592583 0.000016 +v 21.643961 97.629601 0.000016 +v 21.643961 97.629601 0.000016 +v 17.364819 98.480774 0.000016 +v 0.000000 0.000000 0.000000 +v 17.364819 98.480774 0.000016 +v 13.052619 99.144485 0.000016 +v 0.000000 0.000000 0.000000 +v 0.000000 0.000000 0.000000 +v 13.052619 99.144485 0.000016 +v 8.715574 99.619469 0.000016 +v 8.715574 99.619469 0.000016 +v 4.361938 99.904823 0.000016 +v 0.000000 0.000000 0.000000 +v 4.361938 99.904823 0.000016 +v 0.000000 100.000000 0.000016 +v 0.000000 0.000000 0.000000 +v 0.000000 0.000000 0.000000 +v 0.000000 100.000000 0.000016 +v -4.361938 99.904823 0.000016 +v -4.361938 99.904823 0.000016 +v -8.715574 99.619469 0.000016 +v 0.000000 0.000000 0.000000 +v -8.715574 99.619469 0.000016 +v -13.052619 99.144485 0.000016 +v 0.000000 0.000000 0.000000 +v 0.000000 0.000000 0.000000 +v -13.052619 99.144485 0.000016 +v -17.364819 98.480774 0.000016 +v -17.364819 98.480774 0.000016 +v -21.643961 97.629601 0.000016 +v 0.000000 0.000000 0.000000 +v -21.643961 97.629601 0.000016 +v -25.881905 96.592583 0.000016 +v 0.000000 0.000000 0.000000 +v 0.000000 0.000000 0.000000 +v -25.881905 96.592583 0.000016 +v -30.070581 95.371696 0.000016 +v -30.070581 95.371696 0.000016 +v -34.202015 93.969261 0.000015 +v 0.000000 0.000000 0.000000 +v -34.202015 93.969261 0.000015 +v -38.268341 92.387955 0.000015 +v 0.000000 0.000000 0.000000 +v 0.000000 0.000000 0.000000 +v -38.268341 92.387955 0.000015 +v -42.261829 90.630775 0.000015 +v -42.261829 90.630775 0.000015 +v -46.174862 88.701088 0.000014 +v 0.000000 0.000000 0.000000 +v -46.174862 88.701088 0.000014 +v -50.000000 86.602539 0.000014 +v 0.000000 0.000000 0.000000 +v 0.000000 0.000000 0.000000 +v -50.000000 86.602539 0.000014 +v -53.729961 84.339142 0.000014 +v -53.729961 84.339142 0.000014 +v -57.357643 81.915207 0.000013 +v 0.000000 0.000000 0.000000 +v -57.357643 81.915207 0.000013 +v -60.876141 79.335335 0.000013 +v 0.000000 0.000000 0.000000 +v 0.000000 0.000000 0.000000 +v -60.876141 79.335335 0.000013 +v -64.278763 76.604439 0.000012 +v -64.278763 76.604439 0.000012 +v -67.559021 73.727737 0.000012 +v 0.000000 0.000000 0.000000 +v -67.559021 73.727737 0.000012 +v -70.710678 70.710678 0.000012 +v 0.000000 0.000000 0.000000 +v 0.000000 0.000000 0.000000 +v -70.710678 70.710678 0.000012 +v -73.727737 67.559021 0.000011 +v -73.727737 67.559021 0.000011 +v -76.604439 64.278763 0.000010 +v 0.000000 0.000000 0.000000 +v -76.604439 64.278763 0.000010 +v -79.335335 60.876141 0.000010 +v 0.000000 0.000000 0.000000 +v 0.000000 0.000000 0.000000 +v -79.335335 60.876141 0.000010 +v -81.915207 57.357643 0.000009 +v -81.915207 57.357643 0.000009 +v -84.339142 53.729961 0.000009 +v 0.000000 0.000000 0.000000 +v -84.339142 53.729961 0.000009 +v -86.602539 50.000000 0.000008 +v 0.000000 0.000000 0.000000 +v 0.000000 0.000000 0.000000 +v -86.602539 50.000000 0.000008 +v -88.701088 46.174862 0.000008 +v -88.701088 46.174862 0.000008 +v -90.630775 42.261829 0.000007 +v 0.000000 0.000000 0.000000 +v -90.630775 42.261829 0.000007 +v -92.387955 38.268341 0.000006 +v 0.000000 0.000000 0.000000 +v 0.000000 0.000000 0.000000 +v -92.387955 38.268341 0.000006 +v -93.969261 34.202015 0.000006 +v -93.969261 34.202015 0.000006 +v -95.371696 30.070581 0.000005 +v 0.000000 0.000000 0.000000 +v -95.371696 30.070581 0.000005 +v -96.592583 25.881905 0.000004 +v 0.000000 0.000000 0.000000 +v 0.000000 0.000000 0.000000 +v -96.592583 25.881905 0.000004 +v -97.629601 21.643961 0.000004 +v -97.629601 21.643961 0.000004 +v -98.480774 17.364819 0.000003 +v 0.000000 0.000000 0.000000 +v -98.480774 17.364819 0.000003 +v -99.144485 13.052619 0.000002 +v 0.000000 0.000000 0.000000 +v 0.000000 0.000000 0.000000 +v -99.144485 13.052619 0.000002 +v -99.619469 8.715574 0.000001 +v -99.619469 8.715574 0.000001 +v -99.904823 4.361938 0.000001 +v 0.000000 0.000000 0.000000 +v -99.904823 4.361938 0.000001 +v -100.000000 0.000000 0.000000 +v 0.000000 0.000000 0.000000 +v 0.000000 0.000000 0.000000 +v -100.000000 0.000000 0.000000 +v -99.904823 -4.361938 -0.000001 +v -99.904823 -4.361938 -0.000001 +v -99.619469 -8.715574 -0.000001 +v 0.000000 0.000000 0.000000 +v -99.619469 -8.715574 -0.000001 +v -99.144485 -13.052619 -0.000002 +v 0.000000 0.000000 0.000000 +v 0.000000 0.000000 0.000000 +v -99.144485 -13.052619 -0.000002 +v -98.480774 -17.364819 -0.000003 +v -98.480774 -17.364819 -0.000003 +v -97.629601 -21.643961 -0.000004 +v 0.000000 0.000000 0.000000 +v -97.629601 -21.643961 -0.000004 +v -96.592583 -25.881905 -0.000004 +v 0.000000 0.000000 0.000000 +v 0.000000 0.000000 0.000000 +v -96.592583 -25.881905 -0.000004 +v -95.371696 -30.070581 -0.000005 +v -95.371696 -30.070581 -0.000005 +v -93.969261 -34.202015 -0.000006 +v 0.000000 0.000000 0.000000 +v -93.969261 -34.202015 -0.000006 +v -92.387955 -38.268341 -0.000006 +v 0.000000 0.000000 0.000000 +v 0.000000 0.000000 0.000000 +v -92.387955 -38.268341 -0.000006 +v -90.630775 -42.261829 -0.000007 +v -90.630775 -42.261829 -0.000007 +v -88.701088 -46.174862 -0.000008 +v 0.000000 0.000000 0.000000 +v -88.701088 -46.174862 -0.000008 +v -86.602539 -50.000000 -0.000008 +v 0.000000 0.000000 0.000000 +v 0.000000 0.000000 0.000000 +v -86.602539 -50.000000 -0.000008 +v -84.339142 -53.729961 -0.000009 +v -84.339142 -53.729961 -0.000009 +v -81.915207 -57.357643 -0.000009 +v 0.000000 0.000000 0.000000 +v -81.915207 -57.357643 -0.000009 +v -79.335335 -60.876141 -0.000010 +v 0.000000 0.000000 0.000000 +v 0.000000 0.000000 0.000000 +v -79.335335 -60.876141 -0.000010 +v -76.604439 -64.278763 -0.000010 +v -76.604439 -64.278763 -0.000010 +v -73.727737 -67.559021 -0.000011 +v 0.000000 0.000000 0.000000 +v -73.727737 -67.559021 -0.000011 +v -70.710678 -70.710678 -0.000012 +v 0.000000 0.000000 0.000000 +v 0.000000 0.000000 0.000000 +v -70.710678 -70.710678 -0.000012 +v -67.559021 -73.727737 -0.000012 +v -67.559021 -73.727737 -0.000012 +v -64.278763 -76.604439 -0.000012 +v 0.000000 0.000000 0.000000 +v -64.278763 -76.604439 -0.000012 +v -60.876141 -79.335335 -0.000013 +v 0.000000 0.000000 0.000000 +v 0.000000 0.000000 0.000000 +v -60.876141 -79.335335 -0.000013 +v -57.357643 -81.915207 -0.000013 +v -57.357643 -81.915207 -0.000013 +v -53.729961 -84.339142 -0.000014 +v 0.000000 0.000000 0.000000 +v -53.729961 -84.339142 -0.000014 +v -50.000000 -86.602539 -0.000014 +v 0.000000 0.000000 0.000000 +v 0.000000 0.000000 0.000000 +v -50.000000 -86.602539 -0.000014 +v -46.174862 -88.701088 -0.000014 +v -46.174862 -88.701088 -0.000014 +v -42.261829 -90.630775 -0.000015 +v 0.000000 0.000000 0.000000 +v -42.261829 -90.630775 -0.000015 +v -38.268341 -92.387955 -0.000015 +v 0.000000 0.000000 0.000000 +v 0.000000 0.000000 0.000000 +v -38.268341 -92.387955 -0.000015 +v -34.202015 -93.969261 -0.000015 +v -34.202015 -93.969261 -0.000015 +v -30.070581 -95.371696 -0.000016 +v 0.000000 0.000000 0.000000 +v -30.070581 -95.371696 -0.000016 +v -25.881905 -96.592583 -0.000016 +v 0.000000 0.000000 0.000000 +v 0.000000 0.000000 0.000000 +v -25.881905 -96.592583 -0.000016 +v -21.643961 -97.629601 -0.000016 +v -21.643961 -97.629601 -0.000016 +v -17.364819 -98.480774 -0.000016 +v 0.000000 0.000000 0.000000 +v -17.364819 -98.480774 -0.000016 +v -13.052619 -99.144485 -0.000016 +v 0.000000 0.000000 0.000000 +v 0.000000 0.000000 0.000000 +v -13.052619 -99.144485 -0.000016 +v -8.715574 -99.619469 -0.000016 +v -8.715574 -99.619469 -0.000016 +v -4.361938 -99.904823 -0.000016 +v 0.000000 0.000000 0.000000 +v -4.361938 -99.904823 -0.000016 +v 0.000000 -100.000000 -0.000016 +v 0.000000 0.000000 0.000000 +v 0.000000 0.000000 0.000000 +v 0.000000 -100.000000 -0.000016 +v 4.361938 -99.904823 -0.000016 +v 4.361938 -99.904823 -0.000016 +v 8.715574 -99.619469 -0.000016 +v 0.000000 0.000000 0.000000 +v 8.715574 -99.619469 -0.000016 +v 13.052619 -99.144485 -0.000016 +v 0.000000 0.000000 0.000000 +v 0.000000 0.000000 0.000000 +v 13.052619 -99.144485 -0.000016 +v 17.364819 -98.480774 -0.000016 +v 17.364819 -98.480774 -0.000016 +v 21.643961 -97.629601 -0.000016 +v 0.000000 0.000000 0.000000 +v 21.643961 -97.629601 -0.000016 +v 25.881905 -96.592583 -0.000016 +v 0.000000 0.000000 0.000000 +v 0.000000 0.000000 0.000000 +v 25.881905 -96.592583 -0.000016 +v 30.070581 -95.371696 -0.000016 +v 30.070581 -95.371696 -0.000016 +v 34.202015 -93.969261 -0.000015 +v 0.000000 0.000000 0.000000 +v 34.202015 -93.969261 -0.000015 +v 38.268341 -92.387955 -0.000015 +v 0.000000 0.000000 0.000000 +v 0.000000 0.000000 0.000000 +v 38.268341 -92.387955 -0.000015 +v 42.261829 -90.630775 -0.000015 +v 42.261829 -90.630775 -0.000015 +v 46.174862 -88.701088 -0.000014 +v 0.000000 0.000000 0.000000 +v 46.174862 -88.701088 -0.000014 +v 50.000000 -86.602539 -0.000014 +v 0.000000 0.000000 0.000000 +v 0.000000 0.000000 0.000000 +v 50.000000 -86.602539 -0.000014 +v 53.729961 -84.339142 -0.000014 +v 53.729961 -84.339142 -0.000014 +v 57.357643 -81.915207 -0.000013 +v 0.000000 0.000000 0.000000 +v 57.357643 -81.915207 -0.000013 +v 60.876141 -79.335335 -0.000013 +v 0.000000 0.000000 0.000000 +v 0.000000 0.000000 0.000000 +v 60.876141 -79.335335 -0.000013 +v 64.278763 -76.604439 -0.000012 +v 64.278763 -76.604439 -0.000012 +v 67.559021 -73.727737 -0.000012 +v 0.000000 0.000000 0.000000 +v 67.559021 -73.727737 -0.000012 +v 70.710678 -70.710678 -0.000012 +v 0.000000 0.000000 0.000000 +v 0.000000 0.000000 0.000000 +v 70.710678 -70.710678 -0.000012 +v 73.727737 -67.559021 -0.000011 +v 73.727737 -67.559021 -0.000011 +v 76.604439 -64.278763 -0.000010 +v 0.000000 0.000000 0.000000 +v 76.604439 -64.278763 -0.000010 +v 79.335335 -60.876141 -0.000010 +v 0.000000 0.000000 0.000000 +v 0.000000 0.000000 0.000000 +v 79.335335 -60.876141 -0.000010 +v 81.915207 -57.357643 -0.000009 +v 81.915207 -57.357643 -0.000009 +v 84.339142 -53.729961 -0.000009 +v 0.000000 0.000000 0.000000 +v 84.339142 -53.729961 -0.000009 +v 86.602539 -50.000000 -0.000008 +v 0.000000 0.000000 0.000000 +v 0.000000 0.000000 0.000000 +v 86.602539 -50.000000 -0.000008 +v 88.701088 -46.174862 -0.000008 +v 88.701088 -46.174862 -0.000008 +v 90.630775 -42.261829 -0.000007 +v 0.000000 0.000000 0.000000 +v 90.630775 -42.261829 -0.000007 +v 92.387955 -38.268341 -0.000006 +v 0.000000 0.000000 0.000000 +v 0.000000 0.000000 0.000000 +v 92.387955 -38.268341 -0.000006 +v 93.969261 -34.202015 -0.000006 +v 93.969261 -34.202015 -0.000006 +v 95.371696 -30.070581 -0.000005 +v 0.000000 0.000000 0.000000 +v 95.371696 -30.070581 -0.000005 +v 96.592583 -25.881905 -0.000004 +v 0.000000 0.000000 0.000000 +v 0.000000 0.000000 0.000000 +v 96.592583 -25.881905 -0.000004 +v 97.629601 -21.643961 -0.000004 +v 97.629601 -21.643961 -0.000004 +v 98.480774 -17.364819 -0.000003 +v 0.000000 0.000000 0.000000 +v 98.480774 -17.364819 -0.000003 +v 97.629601 -21.643961 -0.000004 +v 98.480774 -17.364819 -5.000003 +v 97.629601 -21.643961 -0.000004 +v 96.592583 -25.881905 -0.000004 +v 97.629601 -21.643961 -5.000003 +v 96.592583 -25.881905 -0.000004 +v 95.371696 -30.070581 -0.000005 +v 96.592583 -25.881905 -5.000004 +v 95.371696 -30.070581 -0.000005 +v 93.969261 -34.202015 -0.000006 +v 95.371696 -30.070581 -5.000005 +v 95.371696 -30.070581 -5.000005 +v 93.969261 -34.202015 -0.000006 +v 93.969261 -34.202015 -5.000006 +v 93.969261 -34.202015 -0.000006 +v 92.387955 -38.268341 -0.000006 +v 93.969261 -34.202015 -5.000006 +v 93.969261 -34.202015 -5.000006 +v 92.387955 -38.268341 -0.000006 +v 92.387955 -38.268341 -5.000006 +v 92.387955 -38.268341 -5.000006 +v 156.714005 -58.415878 -5.000010 +v 93.969261 -34.202015 -5.000006 +v 156.714005 -58.415878 -5.000010 +v 156.098999 -57.018162 -5.000009 +v 93.969261 -34.202015 -5.000006 +v 93.969261 -34.202015 -5.000006 +v 156.098999 -57.018162 -5.000009 +v 155.423599 -55.648598 -5.000009 +v 156.098999 -57.018162 -5.000009 +v 155.423599 -55.648594 -15.000010 +v 155.423599 -55.648598 -5.000009 +v 156.098999 -57.018158 -15.000010 +v 155.423599 -55.648594 -15.000010 +v 156.098999 -57.018162 -5.000009 +v 124.378220 -106.809799 -15.000017 +v 155.423599 -55.648594 -15.000010 +v 156.098999 -57.018158 -15.000010 +v 156.098999 -57.018158 -15.000010 +v 156.714005 -58.415874 -15.000010 +v 124.378220 -106.809799 -15.000017 +v 156.714005 -58.415874 -15.000010 +v 157.267471 -59.839092 -15.000010 +v 124.378220 -106.809799 -15.000017 +v 124.378220 -106.809799 -15.000017 +v 157.267471 -59.839092 -15.000010 +v 157.758316 -61.285095 -15.000010 +v 157.758316 -61.285095 -15.000010 +v 158.185638 -62.751133 -15.000010 +v 124.378220 -106.809799 -15.000017 +v 158.185638 -62.751133 -15.000010 +v 158.548584 -64.234413 -15.000010 +v 124.378220 -106.809799 -15.000017 +v 124.378220 -106.809799 -15.000017 +v 158.548584 -64.234413 -15.000010 +v 158.846497 -65.732117 -15.000010 +v 158.846497 -65.732117 -15.000010 +v 159.078796 -67.241386 -15.000010 +v 124.378220 -106.809799 -15.000017 +v 159.078796 -67.241386 -15.000010 +v 159.245026 -68.759354 -15.000011 +v 124.378220 -106.809799 -15.000017 +v 159.245026 -68.759354 -15.000011 +v 159.344910 -70.283119 -15.000011 +v 124.378220 -106.809799 -15.000017 +v 159.344910 -70.283119 -15.000011 +v 159.378220 -71.809799 -15.000011 +v 124.378220 -106.809799 -15.000017 +v 124.378220 -106.809799 -15.000017 +v 159.378220 -71.809799 -15.000011 +v 159.344910 -73.336479 -15.000012 +v 159.344910 -73.336479 -15.000012 +v 159.245026 -74.860252 -15.000012 +v 124.378220 -106.809799 -15.000017 +v 159.245026 -74.860252 -15.000012 +v 159.078796 -76.378220 -15.000012 +v 124.378220 -106.809799 -15.000017 +v 124.378220 -106.809799 -15.000017 +v 159.078796 -76.378220 -15.000012 +v 158.846497 -77.887482 -15.000012 +v 125.904900 -106.776489 -15.000017 +v 124.378220 -106.809799 -15.000017 +v 158.846497 -77.887482 -15.000012 +v 125.904900 -106.776489 -15.000017 +v 158.846497 -77.887482 -15.000012 +v 127.428665 -106.676613 -15.000017 +v 125.904900 -106.776489 -15.000017 +v 127.428665 -106.676613 -15.000017 +v 125.904900 -106.776489 -5.000017 +v 124.378220 -106.809799 -5.000017 +v 125.904900 -106.776489 -15.000017 +v 125.904900 -106.776489 -5.000017 +v 124.378220 -106.809799 -5.000017 +v 125.904900 -106.776489 -5.000017 +v 76.604439 -64.278763 -5.000010 +v 76.604439 -64.278763 -5.000010 +v 73.727737 -67.559021 -5.000011 +v 124.378220 -106.809799 -5.000017 +v 73.727737 -67.559021 -5.000011 +v 70.710678 -70.710678 -5.000011 +v 124.378220 -106.809799 -5.000017 +v 70.710678 -70.710678 -5.000011 +v 67.559021 -73.727737 -5.000012 +v 124.378220 -106.809799 -5.000017 +v 124.378220 -106.809799 -5.000017 +v 67.559021 -73.727737 -5.000012 +v 64.278763 -76.604439 -5.000012 +v 64.278763 -76.604439 -5.000012 +v 60.876141 -79.335335 -5.000013 +v 124.378220 -106.809799 -5.000017 +v 60.876141 -79.335335 -5.000013 +v 57.357643 -81.915207 -5.000013 +v 124.378220 -106.809799 -5.000017 +v 124.378220 -106.809799 -5.000017 +v 57.357643 -81.915207 -5.000013 +v 53.729961 -84.339142 -5.000014 +v 53.729961 -84.339142 -5.000014 +v 50.000000 -86.602539 -5.000014 +v 124.378220 -106.809799 -5.000017 +v 50.000000 -86.602539 -5.000014 +v 46.174862 -88.701088 -5.000014 +v 124.378220 -106.809799 -5.000017 +v 124.378220 -106.809799 -5.000017 +v 46.174862 -88.701088 -5.000014 +v 42.261829 -90.630775 -5.000015 +v 42.261829 -90.630775 -5.000015 +v 38.268341 -92.387955 -5.000015 +v 124.378220 -106.809799 -5.000017 +v 38.268341 -92.387955 -5.000015 +v 34.202015 -93.969261 -5.000015 +v 124.378220 -106.809799 -5.000017 +v 34.202015 -93.969261 -5.000015 +v 30.070581 -95.371696 -5.000016 +v 124.378220 -106.809799 -5.000017 +v 30.070581 -95.371696 -5.000016 +v 25.881905 -96.592583 -5.000016 +v 124.378220 -106.809799 -5.000017 +v 124.378220 -106.809799 -5.000017 +v 25.881905 -96.592583 -5.000016 +v 21.643961 -97.629601 -5.000016 +v 21.643961 -97.629601 -5.000016 +v 17.364819 -98.480774 -5.000016 +v 124.378220 -106.809799 -5.000017 +v 17.364819 -98.480774 -5.000016 +v 13.052619 -99.144485 -5.000016 +v 124.378220 -106.809799 -5.000017 +v 124.378220 -106.809799 -5.000017 +v 13.052619 -99.144485 -5.000016 +v 8.715574 -99.619469 -5.000016 +v 8.715574 -99.619469 -5.000016 +v 4.361938 -99.904823 -5.000016 +v 124.378220 -106.809799 -5.000017 +v 4.361938 -99.904823 -5.000016 +v 0.000000 -100.000000 -5.000016 +v 124.378220 -106.809799 -5.000017 +v 124.378220 -106.809799 -5.000017 +v 0.000000 -100.000000 -5.000016 +v -124.378220 -106.809799 -5.000017 +v 124.378220 -106.809799 -5.000017 +v -124.378220 -106.809799 -5.000017 +v 124.378220 -106.809799 -15.000017 +v -124.378220 -106.809799 -5.000017 +v -124.378220 -106.809799 -15.000017 +v 124.378220 -106.809799 -15.000017 +v -124.378220 -106.809799 -15.000017 +v 154.689117 -54.309795 -15.000009 +v 124.378220 -106.809799 -15.000017 +v -125.873756 -106.777832 -5.000017 +v -124.378220 -106.809799 -15.000017 +v -124.378220 -106.809799 -5.000017 +v -124.378220 -106.809799 -5.000017 +v -73.727737 -67.559021 -5.000011 +v -125.873756 -106.777832 -5.000017 +v -73.727737 -67.559021 -5.000011 +v -76.604439 -64.278763 -5.000010 +v -125.873756 -106.777832 -5.000017 +v -76.604439 -64.278763 -5.000010 +v -127.366570 -106.681992 -5.000017 +v -125.873756 -106.777832 -5.000017 +v -127.366570 -106.681992 -5.000017 +v -125.873756 -106.777832 -15.000017 +v -125.873756 -106.777832 -5.000017 +v -127.366570 -106.681992 -15.000017 +v -125.873756 -106.777832 -15.000017 +v -127.366570 -106.681992 -5.000017 +v -128.853912 -106.522446 -5.000017 +v -127.366570 -106.681992 -15.000017 +v -127.366570 -106.681992 -5.000017 +v -128.853912 -106.522446 -15.000017 +v -127.366570 -106.681992 -15.000017 +v -128.853912 -106.522446 -5.000017 +v -130.333099 -106.299500 -5.000017 +v -128.853912 -106.522446 -15.000017 +v -128.853912 -106.522446 -5.000017 +v -130.333099 -106.299500 -5.000017 +v -128.853912 -106.522446 -5.000017 +v -79.335335 -60.876141 -5.000010 +v -131.801392 -106.013550 -5.000017 +v -130.333099 -106.299500 -5.000017 +v -79.335335 -60.876141 -5.000010 +v -79.335335 -60.876141 -5.000010 +v -133.256134 -105.665115 -5.000017 +v -131.801392 -106.013550 -5.000017 +v -133.256134 -105.665115 -5.000017 +v -131.801392 -106.013550 -15.000017 +v -131.801392 -106.013550 -5.000017 +v -131.801392 -106.013550 -15.000017 +v -130.333099 -106.299500 -15.000017 +v -131.801392 -106.013550 -5.000017 +v 30.310890 161.119598 -14.999973 +v -130.333099 -106.299500 -15.000017 +v -131.801392 -106.013550 -15.000017 +v -131.801392 -106.013550 -15.000017 +v -133.256134 -105.665115 -15.000017 +v 30.310890 161.119598 -14.999973 +v -133.256134 -105.665115 -15.000017 +v -134.694656 -105.254852 -15.000017 +v 30.310890 161.119598 -14.999973 +v 30.310890 161.119598 -14.999973 +v -134.694656 -105.254852 -15.000017 +v -136.114334 -104.783485 -15.000017 +v 30.310890 161.119598 -14.999973 +v -136.114334 -104.783485 -15.000017 +v -137.512558 -104.251884 -15.000017 +v -137.512558 -104.251884 -15.000017 +v -138.886810 -103.661034 -15.000017 +v 30.310890 161.119598 -14.999973 +v -138.886810 -103.661034 -15.000017 +v -140.234558 -103.011986 -15.000017 +v 30.310890 161.119598 -14.999973 +v 30.310890 161.119598 -14.999973 +v -140.234558 -103.011986 -15.000017 +v -141.553345 -102.305954 -15.000016 +v -141.553345 -102.305954 -15.000016 +v -142.840744 -101.544220 -15.000016 +v 30.310890 161.119598 -14.999973 +v -142.840744 -101.544220 -15.000016 +v -144.094421 -100.728157 -15.000016 +v 30.310890 161.119598 -14.999973 +v 30.310890 161.119598 -14.999973 +v -144.094421 -100.728157 -15.000016 +v -145.312088 -99.859276 -15.000016 +v -145.312088 -99.859276 -15.000016 +v -146.491516 -98.939156 -15.000016 +v 30.310890 161.119598 -14.999973 +v -146.491516 -98.939156 -15.000016 +v -147.630554 -97.969490 -15.000016 +v 30.310890 161.119598 -14.999973 +v 30.310890 161.119598 -14.999973 +v -147.630554 -97.969490 -15.000016 +v -148.727097 -96.952026 -15.000016 +v -148.727097 -96.952026 -15.000016 +v -149.779205 -95.888641 -15.000015 +v 30.310890 161.119598 -14.999973 +v -149.779205 -95.888641 -15.000015 +v -150.784882 -94.781273 -15.000015 +v 30.310890 161.119598 -14.999973 +v 30.310890 161.119598 -14.999973 +v -150.784882 -94.781273 -15.000015 +v -151.742325 -93.631943 -15.000015 +v 30.310890 161.119598 -14.999973 +v -151.742325 -93.631943 -15.000015 +v -152.649796 -92.442749 -15.000015 +v -153.505615 -91.215874 -15.000015 +v 30.310890 161.119598 -14.999973 +v -152.649796 -92.442749 -15.000015 +v -153.505615 -91.215874 -15.000015 +v -152.649796 -92.442749 -15.000015 +v -153.505615 -91.215874 -5.000015 +v -154.308212 -89.953545 -5.000015 +v -153.505615 -91.215874 -15.000015 +v -153.505615 -91.215874 -5.000015 +v -154.308212 -89.953545 -5.000015 +v -153.505615 -91.215874 -5.000015 +v -86.602539 -50.000000 -5.000008 +v -86.602539 -50.000000 -5.000008 +v -155.056168 -88.658066 -5.000014 +v -154.308212 -89.953545 -5.000015 +v -155.056168 -88.658066 -5.000014 +v -154.308212 -89.953545 -15.000014 +v -154.308212 -89.953545 -5.000015 +v -155.056168 -88.658066 -15.000014 +v -154.308212 -89.953545 -15.000014 +v -155.056168 -88.658066 -5.000014 +v -155.748062 -87.331818 -5.000014 +v -155.056168 -88.658066 -15.000014 +v -155.056168 -88.658066 -5.000014 +v -155.748062 -87.331818 -15.000014 +v -155.056168 -88.658066 -15.000014 +v -155.748062 -87.331818 -5.000014 +v -156.382660 -85.977219 -5.000014 +v -155.748062 -87.331818 -15.000014 +v -155.748062 -87.331818 -5.000014 +v -156.382660 -85.977219 -5.000014 +v -155.748062 -87.331818 -5.000014 +v -86.602539 -50.000000 -5.000008 +v -156.958801 -84.596741 -5.000014 +v -156.382660 -85.977219 -5.000014 +v -86.602539 -50.000000 -5.000008 +v -86.602539 -50.000000 -5.000008 +v -157.475433 -83.192902 -5.000013 +v -156.958801 -84.596741 -5.000014 +v -157.475433 -83.192902 -5.000013 +v -156.958801 -84.596741 -15.000013 +v -156.958801 -84.596741 -5.000014 +v -156.958801 -84.596741 -15.000013 +v -156.382660 -85.977219 -15.000014 +v -156.958801 -84.596741 -5.000014 +v -156.382660 -85.977219 -15.000014 +v -156.958801 -84.596741 -15.000013 +v -157.711121 -61.136578 -15.000010 +v -157.711121 -61.136578 -15.000010 +v -155.748062 -87.331818 -15.000014 +v -156.382660 -85.977219 -15.000014 +v -156.958801 -84.596741 -15.000013 +v -157.475433 -83.192902 -15.000013 +v -157.711121 -61.136578 -15.000010 +v -157.711121 -61.136578 -15.000010 +v -157.475433 -83.192902 -15.000013 +v -158.136734 -62.570637 -15.000010 +v -157.711121 -61.136578 -15.000010 +v -158.136734 -62.570637 -15.000010 +v -157.711121 -61.136581 -5.000010 +v -157.224609 -59.722023 -5.000010 +v -157.711121 -61.136578 -15.000010 +v -157.711121 -61.136581 -5.000010 +v -157.224609 -59.722023 -5.000010 +v -157.711121 -61.136581 -5.000010 +v -92.387955 -38.268341 -5.000006 +v -92.387955 -38.268341 -5.000006 +v -156.678116 -58.329544 -5.000010 +v -157.224609 -59.722023 -5.000010 +v -156.678116 -58.329544 -5.000010 +v -157.224609 -59.722019 -15.000010 +v -157.224609 -59.722023 -5.000010 +v -156.678116 -58.329540 -15.000010 +v -157.224609 -59.722019 -15.000010 +v -156.678116 -58.329544 -5.000010 +v -156.072601 -56.961693 -5.000009 +v -156.678116 -58.329540 -15.000010 +v -156.678116 -58.329544 -5.000010 +v -156.072601 -56.961689 -15.000010 +v -156.678116 -58.329540 -15.000010 +v -156.072601 -56.961693 -5.000009 +v -155.409195 -55.620960 -5.000009 +v -156.072601 -56.961689 -15.000010 +v -156.072601 -56.961693 -5.000009 +v -155.409195 -55.620960 -5.000009 +v -156.072601 -56.961693 -5.000009 +v -93.969261 -34.202015 -5.000006 +v -154.689117 -54.309799 -5.000009 +v -155.409195 -55.620960 -5.000009 +v -93.969261 -34.202015 -5.000006 +v -93.969261 -34.202015 -5.000006 +v -95.371696 -30.070581 -5.000005 +v -154.689117 -54.309799 -5.000009 +v -95.371696 -30.070581 -5.000005 +v -96.592583 -25.881905 -5.000004 +v -154.689117 -54.309799 -5.000009 +v -96.592583 -25.881905 -5.000004 +v -97.629601 -21.643961 -5.000003 +v -154.689117 -54.309799 -5.000009 +v -154.689117 -54.309799 -5.000009 +v -97.629601 -21.643961 -5.000003 +v -98.480774 -17.364819 -5.000003 +v -98.480774 -17.364819 -5.000003 +v -99.144485 -13.052618 -5.000002 +v -154.689117 -54.309799 -5.000009 +v -99.144485 -13.052618 -5.000002 +v -99.619469 -8.715573 -5.000001 +v -154.689117 -54.309799 -5.000009 +v -154.689117 -54.309799 -5.000009 +v -99.619469 -8.715573 -5.000001 +v -99.904823 -4.361937 -5.000000 +v -154.689117 -54.309799 -5.000009 +v -99.904823 -4.361937 -5.000000 +v -100.000000 0.000001 -5.000000 +v -99.904823 4.361939 -5.000000 +v -154.689117 -54.309799 -5.000009 +v -100.000000 0.000001 -5.000000 +v -100.000000 0.000001 -5.000000 +v -99.904823 4.361938 0.000001 +v -99.904823 4.361939 -5.000000 +v -99.904823 4.361939 -5.000000 +v -99.619469 8.715575 -4.999999 +v -154.689117 -54.309799 -5.000009 +v -99.619469 8.715575 -4.999999 +v -99.144485 13.052620 -4.999998 +v -154.689117 -54.309799 -5.000009 +v -154.689117 -54.309799 -5.000009 +v -99.144485 13.052620 -4.999998 +v -98.480774 17.364819 -4.999997 +v -98.480774 17.364819 -4.999997 +v -97.629601 21.643961 -4.999997 +v -154.689117 -54.309799 -5.000009 +v -97.629601 21.643961 -4.999997 +v -96.592583 25.881905 -4.999996 +v -154.689117 -54.309799 -5.000009 +v -154.689117 -54.309799 -5.000009 +v -96.592583 25.881905 -4.999996 +v -95.371696 30.070581 -4.999995 +v -95.371696 30.070581 -4.999995 +v -93.969261 34.202015 -4.999994 +v -154.689117 -54.309799 -5.000009 +v -93.969261 34.202015 -4.999994 +v -92.387955 38.268341 -4.999994 +v -154.689117 -54.309799 -5.000009 +v -154.689117 -54.309799 -5.000009 +v -92.387955 38.268341 -4.999994 +v -90.630775 42.261829 -4.999993 +v -90.630775 42.261829 -4.999993 +v -88.701088 46.174862 -4.999992 +v -154.689117 -54.309799 -5.000009 +v -88.701088 46.174862 -4.999992 +v -86.602539 50.000000 -4.999992 +v -154.689117 -54.309799 -5.000009 +v -154.689117 -54.309799 -5.000009 +v -86.602539 50.000000 -4.999992 +v -30.310890 161.119598 -4.999974 +v -154.689117 -54.309799 -5.000009 +v -30.310890 161.119598 -4.999974 +v -154.689117 -54.309795 -15.000009 +v -154.689117 -54.309799 -5.000009 +v -154.689117 -54.309795 -15.000009 +v -155.409195 -55.620956 -15.000010 +v -155.409195 -55.620956 -15.000010 +v -154.689117 -54.309795 -15.000009 +v -153.505615 -91.215874 -15.000015 +v -156.072601 -56.961689 -15.000010 +v -155.409195 -55.620956 -15.000010 +v -153.505615 -91.215874 -15.000015 +v -30.310890 161.119598 -4.999974 +v -30.310890 161.119598 -14.999973 +v -154.689117 -54.309795 -15.000009 +v -154.689117 -54.309795 -15.000009 +v -30.310890 161.119598 -14.999973 +v 30.310890 161.119598 -14.999973 +v -29.535435 162.398788 -4.999974 +v -30.310890 161.119598 -14.999973 +v -30.310890 161.119598 -4.999974 +v -30.310890 161.119598 -4.999974 +v -21.643961 97.629601 -4.999984 +v -29.535435 162.398788 -4.999974 +v -21.643961 97.629601 -4.999984 +v -17.364819 98.480774 -4.999984 +v -29.535435 162.398788 -4.999974 +v -17.364819 98.480774 -4.999984 +v -28.706030 163.643692 -4.999973 +v -29.535435 162.398788 -4.999974 +v -28.706030 163.643692 -4.999973 +v -29.535435 162.398788 -14.999973 +v -29.535435 162.398788 -4.999974 +v -28.706030 163.643692 -14.999973 +v -29.535435 162.398788 -14.999973 +v -28.706030 163.643692 -4.999973 +v -27.824188 164.851990 -4.999973 +v -28.706030 163.643692 -14.999973 +v -28.706030 163.643692 -4.999973 +v -27.824188 164.851990 -14.999973 +v -28.706030 163.643692 -14.999973 +v -27.824188 164.851990 -4.999973 +v -26.891518 166.021530 -4.999973 +v -27.824188 164.851990 -14.999973 +v -27.824188 164.851990 -4.999973 +v -26.891518 166.021530 -4.999973 +v -27.824188 164.851990 -4.999973 +v -13.052619 99.144485 -4.999984 +v -25.909729 167.150131 -4.999973 +v -26.891518 166.021530 -4.999973 +v -13.052619 99.144485 -4.999984 +v -25.909729 167.150131 -4.999973 +v -13.052619 99.144485 -4.999984 +v -24.880611 168.235748 -4.999973 +v -24.880611 168.235748 -4.999973 +v -25.909729 167.150131 -14.999972 +v -25.909729 167.150131 -4.999973 +v -25.909729 167.150131 -14.999972 +v -26.891518 166.021530 -14.999973 +v -25.909729 167.150131 -4.999973 +v -26.891518 166.021530 -14.999973 +v -25.909729 167.150131 -14.999972 +v 13.824625 175.773605 -14.999971 +v -27.824188 164.851990 -14.999973 +v -26.891518 166.021530 -14.999973 +v 13.824625 175.773605 -14.999971 +v 13.824625 175.773605 -14.999971 +v -25.909729 167.150131 -14.999972 +v -24.880611 168.235748 -14.999972 +v -24.880611 168.235748 -14.999972 +v -23.806047 169.276413 -14.999972 +v 13.824625 175.773605 -14.999971 +v -23.806047 169.276413 -14.999972 +v -22.687994 170.270203 -14.999972 +v 13.824625 175.773605 -14.999971 +v -22.687994 170.270203 -14.999972 +v -21.528500 171.215332 -14.999972 +v 13.824625 175.773605 -14.999971 +v 13.824625 175.773605 -14.999971 +v -21.528500 171.215332 -14.999972 +v -20.329678 172.110016 -14.999972 +v -20.329678 172.110016 -14.999972 +v -19.093721 172.952682 -14.999971 +v 13.824625 175.773605 -14.999971 +v -19.093721 172.952682 -14.999971 +v -17.822887 173.741760 -14.999971 +v 13.824625 175.773605 -14.999971 +v -17.822887 173.741760 -14.999971 +v -16.519497 174.475815 -14.999971 +v 13.824625 175.773605 -14.999971 +v 13.824625 175.773605 -14.999971 +v -16.519497 174.475815 -14.999971 +v -15.185931 175.153503 -14.999971 +v -15.185931 175.153503 -14.999971 +v -13.824625 175.773605 -14.999971 +v 13.824625 175.773605 -14.999971 +v -13.824625 175.773605 -14.999971 +v -12.438066 176.334961 -14.999971 +v 13.824625 175.773605 -14.999971 +v -12.438066 176.334961 -14.999971 +v -11.028788 176.836548 -14.999971 +v 13.824625 175.773605 -14.999971 +v 13.824625 175.773605 -14.999971 +v -11.028788 176.836548 -14.999971 +v 12.438066 176.334961 -14.999971 +v 13.824625 175.773605 -14.999971 +v 12.438066 176.334961 -14.999971 +v 13.824625 175.773605 -4.999971 +v 15.185931 175.153503 -4.999971 +v 13.824625 175.773605 -14.999971 +v 13.824625 175.773605 -4.999971 +v 15.185931 175.153503 -4.999971 +v 13.824625 175.773605 -4.999971 +v 4.361938 99.904823 -4.999984 +v 8.715574 99.619469 -4.999984 +v 15.185931 175.153503 -4.999971 +v 4.361938 99.904823 -4.999984 +v 4.361938 99.904823 -4.999984 +v 8.715574 99.619469 0.000016 +v 8.715574 99.619469 -4.999984 +v 8.715574 99.619469 -4.999984 +v 16.519497 174.475815 -4.999971 +v 15.185931 175.153503 -4.999971 +v 16.519497 174.475815 -4.999971 +v 15.185931 175.153503 -14.999971 +v 15.185931 175.153503 -4.999971 +v 16.519497 174.475815 -14.999971 +v 15.185931 175.153503 -14.999971 +v 16.519497 174.475815 -4.999971 +v 17.822887 173.741760 -4.999972 +v 16.519497 174.475815 -14.999971 +v 16.519497 174.475815 -4.999971 +v 17.822887 173.741760 -14.999971 +v 16.519497 174.475815 -14.999971 +v 17.822887 173.741760 -4.999972 +v 19.093721 172.952682 -4.999972 +v 17.822887 173.741760 -14.999971 +v 17.822887 173.741760 -4.999972 +v 19.093721 172.952682 -4.999972 +v 17.822887 173.741760 -4.999972 +v 8.715574 99.619469 -4.999984 +v 20.329678 172.110016 -4.999972 +v 19.093721 172.952682 -4.999972 +v 8.715574 99.619469 -4.999984 +v 8.715574 99.619469 -4.999984 +v 21.528500 171.215332 -4.999972 +v 20.329678 172.110016 -4.999972 +v 21.528500 171.215332 -4.999972 +v 20.329678 172.110016 -14.999972 +v 20.329678 172.110016 -4.999972 +v 20.329678 172.110016 -14.999972 +v 19.093721 172.952682 -14.999971 +v 20.329678 172.110016 -4.999972 +v 19.093721 172.952682 -14.999971 +v 20.329678 172.110016 -14.999972 +v -30.310890 161.119598 -14.999973 +v 17.822887 173.741760 -14.999971 +v 19.093721 172.952682 -14.999971 +v -30.310890 161.119598 -14.999973 +v -30.310890 161.119598 -14.999973 +v 20.329678 172.110016 -14.999972 +v 21.528500 171.215332 -14.999972 +v 21.528500 171.215332 -14.999972 +v 22.687994 170.270203 -14.999972 +v -30.310890 161.119598 -14.999973 +v 22.687994 170.270203 -14.999972 +v 23.806047 169.276413 -14.999972 +v -30.310890 161.119598 -14.999973 +v -30.310890 161.119598 -14.999973 +v 23.806047 169.276413 -14.999972 +v 24.880611 168.235748 -14.999972 +v 24.880611 168.235748 -14.999972 +v 25.909729 167.150131 -14.999972 +v -30.310890 161.119598 -14.999973 +v 25.909729 167.150131 -14.999972 +v 26.891518 166.021530 -14.999973 +v -30.310890 161.119598 -14.999973 +v -30.310890 161.119598 -14.999973 +v 26.891518 166.021530 -14.999973 +v 27.824188 164.851990 -14.999973 +v 27.824188 164.851990 -14.999973 +v 28.706030 163.643692 -14.999973 +v -30.310890 161.119598 -14.999973 +v -30.310890 161.119598 -14.999973 +v 28.706030 163.643692 -14.999973 +v 29.535435 162.398788 -14.999973 +v 28.706030 163.643692 -14.999973 +v 27.824188 164.851990 -14.999973 +v 28.706030 163.643692 -4.999973 +v 29.535435 162.398788 -4.999974 +v 28.706030 163.643692 -14.999973 +v 28.706030 163.643692 -4.999973 +v 28.706030 163.643692 -4.999973 +v 27.824188 164.851990 -14.999973 +v 27.824188 164.851990 -4.999973 +v 28.706030 163.643692 -4.999973 +v 27.824188 164.851990 -4.999973 +v 13.052619 99.144485 -4.999984 +v 17.364819 98.480774 -4.999984 +v 28.706030 163.643692 -4.999973 +v 13.052619 99.144485 -4.999984 +v 13.052619 99.144485 -4.999984 +v 17.364819 98.480774 0.000016 +v 17.364819 98.480774 -4.999984 +v 13.052619 99.144485 -4.999984 +v 27.824188 164.851990 -4.999973 +v 26.891518 166.021530 -4.999973 +v 26.891518 166.021530 -4.999973 +v 25.909729 167.150131 -4.999973 +v 13.052619 99.144485 -4.999984 +v 25.909729 167.150131 -4.999973 +v 24.880611 168.235748 -4.999973 +v 13.052619 99.144485 -4.999984 +v 13.052619 99.144485 -4.999984 +v 24.880611 168.235748 -4.999973 +v 23.806047 169.276413 -4.999972 +v 23.806047 169.276413 -4.999972 +v 22.687994 170.270203 -4.999972 +v 13.052619 99.144485 -4.999984 +v 13.052619 99.144485 -4.999984 +v 22.687994 170.270203 -4.999972 +v 8.715574 99.619469 -4.999984 +v 8.715574 99.619469 -4.999984 +v 13.052619 99.144485 0.000016 +v 13.052619 99.144485 -4.999984 +v 23.806047 169.276413 -4.999972 +v 22.687994 170.270203 -14.999972 +v 22.687994 170.270203 -4.999972 +v 24.880611 168.235748 -4.999973 +v 23.806047 169.276413 -14.999972 +v 23.806047 169.276413 -4.999972 +v 25.909729 167.150131 -4.999973 +v 24.880611 168.235748 -14.999972 +v 24.880611 168.235748 -4.999973 +v 26.891518 166.021530 -4.999973 +v 25.909729 167.150131 -14.999972 +v 25.909729 167.150131 -4.999973 +v 27.824188 164.851990 -4.999973 +v 26.891518 166.021530 -14.999973 +v 26.891518 166.021530 -4.999973 +v 27.824188 164.851990 -14.999973 +v 26.891518 166.021530 -14.999973 +v 27.824188 164.851990 -4.999973 +v 26.891518 166.021530 -14.999973 +v 25.909729 167.150131 -14.999972 +v 26.891518 166.021530 -4.999973 +v 25.909729 167.150131 -14.999972 +v 24.880611 168.235748 -14.999972 +v 25.909729 167.150131 -4.999973 +v 24.880611 168.235748 -14.999972 +v 23.806047 169.276413 -14.999972 +v 24.880611 168.235748 -4.999973 +v 23.806047 169.276413 -14.999972 +v 22.687994 170.270203 -14.999972 +v 23.806047 169.276413 -4.999972 +v 22.687994 170.270203 -14.999972 +v 21.528500 171.215332 -14.999972 +v 22.687994 170.270203 -4.999972 +v 22.687994 170.270203 -4.999972 +v 21.528500 171.215332 -14.999972 +v 21.528500 171.215332 -4.999972 +v 21.528500 171.215332 -14.999972 +v 20.329678 172.110016 -14.999972 +v 21.528500 171.215332 -4.999972 +v 22.687994 170.270203 -4.999972 +v 21.528500 171.215332 -4.999972 +v 8.715574 99.619469 -4.999984 +v 20.329678 172.110016 -4.999972 +v 19.093721 172.952682 -14.999971 +v 19.093721 172.952682 -4.999972 +v 19.093721 172.952682 -14.999971 +v 17.822887 173.741760 -14.999971 +v 19.093721 172.952682 -4.999972 +v -30.310890 161.119598 -14.999973 +v 16.519497 174.475815 -14.999971 +v 17.822887 173.741760 -14.999971 +v 15.185931 175.153503 -14.999971 +v 16.519497 174.475815 -14.999971 +v -30.310890 161.119598 -14.999973 +v 13.824625 175.773605 -14.999971 +v 15.185931 175.153503 -14.999971 +v -30.310890 161.119598 -14.999973 +v -30.310890 161.119598 -14.999973 +v -29.535435 162.398788 -14.999973 +v 13.824625 175.773605 -14.999971 +v 17.822887 173.741760 -4.999972 +v 16.519497 174.475815 -4.999971 +v 8.715574 99.619469 -4.999984 +v 13.824625 175.773605 -4.999971 +v 12.438066 176.334961 -4.999971 +v 4.361938 99.904823 -4.999984 +v 12.438066 176.334961 -4.999971 +v 11.028788 176.836548 -4.999971 +v 4.361938 99.904823 -4.999984 +v 4.361938 99.904823 -4.999984 +v 11.028788 176.836548 -4.999971 +v 9.599362 177.277481 -4.999971 +v 9.599362 177.277481 -4.999971 +v 8.152403 177.656906 -4.999971 +v 4.361938 99.904823 -4.999984 +v 8.152403 177.656906 -4.999971 +v 6.690552 177.974167 -4.999971 +v 4.361938 99.904823 -4.999984 +v 4.361938 99.904823 -4.999984 +v 6.690552 177.974167 -4.999971 +v 0.000000 100.000000 -4.999984 +v 0.000000 100.000000 -4.999984 +v 4.361938 99.904823 0.000016 +v 4.361938 99.904823 -4.999984 +v 6.690552 177.974167 -4.999971 +v 5.216479 178.228683 -4.999971 +v 0.000000 100.000000 -4.999984 +v 0.000000 100.000000 -4.999984 +v 5.216479 178.228683 -4.999971 +v 3.732878 178.419968 -4.999971 +v 3.732878 178.419968 -4.999971 +v 2.242458 178.547699 -4.999971 +v 0.000000 100.000000 -4.999984 +v 2.242458 178.547699 -4.999971 +v 0.747941 178.611603 -4.999971 +v 0.000000 100.000000 -4.999984 +v 0.000000 100.000000 -4.999984 +v 0.747941 178.611603 -4.999971 +v -0.747941 178.611603 -4.999971 +v -0.747941 178.611603 -4.999971 +v -2.242458 178.547699 -4.999971 +v 0.000000 100.000000 -4.999984 +v -2.242458 178.547699 -4.999971 +v -3.732878 178.419968 -4.999971 +v 0.000000 100.000000 -4.999984 +v 0.000000 100.000000 -4.999984 +v -3.732878 178.419968 -4.999971 +v -5.216479 178.228683 -4.999971 +v -6.690552 177.974167 -4.999971 +v 0.000000 100.000000 -4.999984 +v -5.216479 178.228683 -4.999971 +v -5.216479 178.228683 -4.999971 +v -6.690552 177.974167 -14.999971 +v -6.690552 177.974167 -4.999971 +v -6.690552 177.974167 -14.999971 +v -8.152403 177.656906 -14.999971 +v -6.690552 177.974167 -4.999971 +v -6.690552 177.974167 -4.999971 +v -8.152403 177.656906 -14.999971 +v -8.152403 177.656906 -4.999971 +v -8.152403 177.656906 -4.999971 +v -4.361938 99.904823 -4.999984 +v -6.690552 177.974167 -4.999971 +v -4.361938 99.904823 -4.999984 +v -8.152403 177.656906 -4.999971 +v -9.599362 177.277481 -4.999971 +v -11.028788 176.836548 -4.999971 +v -4.361938 99.904823 -4.999984 +v -9.599362 177.277481 -4.999971 +v -9.599362 177.277481 -4.999971 +v -11.028788 176.836548 -14.999971 +v -11.028788 176.836548 -4.999971 +v -9.599362 177.277481 -14.999971 +v -11.028788 176.836548 -14.999971 +v -9.599362 177.277481 -4.999971 +v -11.028788 176.836548 -14.999971 +v -9.599362 177.277481 -14.999971 +v 5.216479 178.228683 -14.999971 +v 5.216479 178.228683 -14.999971 +v 6.690552 177.974167 -14.999971 +v -11.028788 176.836548 -14.999971 +v 6.690552 177.974167 -14.999971 +v 8.152403 177.656906 -14.999971 +v -11.028788 176.836548 -14.999971 +v -11.028788 176.836548 -14.999971 +v 8.152403 177.656906 -14.999971 +v 9.599362 177.277481 -14.999971 +v -11.028788 176.836548 -14.999971 +v 9.599362 177.277481 -14.999971 +v 11.028788 176.836548 -14.999971 +v 11.028788 176.836548 -14.999971 +v 9.599362 177.277481 -14.999971 +v 11.028788 176.836548 -4.999971 +v 9.599362 177.277481 -14.999971 +v 8.152403 177.656906 -14.999971 +v 9.599362 177.277481 -4.999971 +v 8.152403 177.656906 -14.999971 +v 6.690552 177.974167 -14.999971 +v 8.152403 177.656906 -4.999971 +v 6.690552 177.974167 -14.999971 +v 5.216479 178.228683 -14.999971 +v 6.690552 177.974167 -4.999971 +v -9.599362 177.277481 -14.999971 +v -8.152403 177.656906 -14.999971 +v 5.216479 178.228683 -14.999971 +v 5.216479 178.228683 -14.999971 +v -8.152403 177.656906 -14.999971 +v 3.732878 178.419968 -14.999971 +v 5.216479 178.228683 -14.999971 +v 3.732878 178.419968 -14.999971 +v 5.216479 178.228683 -4.999971 +v -8.152403 177.656906 -14.999971 +v 2.242458 178.547699 -14.999970 +v 3.732878 178.419968 -14.999971 +v 3.732878 178.419968 -14.999971 +v 2.242458 178.547699 -14.999970 +v 3.732878 178.419968 -4.999971 +v -8.152403 177.656906 -14.999971 +v 0.747941 178.611603 -14.999970 +v 2.242458 178.547699 -14.999970 +v 2.242458 178.547699 -14.999970 +v 0.747941 178.611603 -14.999970 +v 2.242458 178.547699 -4.999971 +v -0.747941 178.611603 -14.999970 +v 0.747941 178.611603 -14.999970 +v -8.152403 177.656906 -14.999971 +v 0.747941 178.611603 -14.999970 +v -0.747941 178.611603 -14.999970 +v 0.747941 178.611603 -4.999971 +v -4.361938 99.904823 -4.999984 +v -11.028788 176.836548 -4.999971 +v -12.438066 176.334961 -4.999971 +v -13.824625 175.773605 -4.999971 +v -4.361938 99.904823 -4.999984 +v -12.438066 176.334961 -4.999971 +v -12.438066 176.334961 -4.999971 +v -13.824625 175.773605 -14.999971 +v -13.824625 175.773605 -4.999971 +v -8.715574 99.619469 -4.999984 +v -4.361938 99.904823 -4.999984 +v -13.824625 175.773605 -4.999971 +v -15.185931 175.153503 -4.999971 +v -8.715574 99.619469 -4.999984 +v -13.824625 175.773605 -4.999971 +v -13.824625 175.773605 -4.999971 +v -15.185931 175.153503 -14.999971 +v -15.185931 175.153503 -4.999971 +v -15.185931 175.153503 -4.999971 +v -16.519497 174.475815 -4.999971 +v -8.715574 99.619469 -4.999984 +v -16.519497 174.475815 -4.999971 +v -17.822887 173.741760 -4.999972 +v -8.715574 99.619469 -4.999984 +v -8.715574 99.619469 -4.999984 +v -17.822887 173.741760 -4.999972 +v -19.093721 172.952682 -4.999972 +v -19.093721 172.952682 -4.999972 +v -20.329678 172.110016 -4.999972 +v -8.715574 99.619469 -4.999984 +v -20.329678 172.110016 -4.999972 +v -21.528500 171.215332 -4.999972 +v -8.715574 99.619469 -4.999984 +v -8.715574 99.619469 -4.999984 +v -21.528500 171.215332 -4.999972 +v -13.052619 99.144485 -4.999984 +v -13.052619 99.144485 -4.999984 +v -8.715574 99.619469 0.000016 +v -8.715574 99.619469 -4.999984 +v -21.528500 171.215332 -4.999972 +v -22.687994 170.270203 -4.999972 +v -13.052619 99.144485 -4.999984 +v -13.052619 99.144485 -4.999984 +v -22.687994 170.270203 -4.999972 +v -23.806047 169.276413 -4.999972 +v -22.687994 170.270203 -4.999972 +v -23.806047 169.276413 -14.999972 +v -23.806047 169.276413 -4.999972 +v -21.528500 171.215332 -4.999972 +v -22.687994 170.270203 -14.999972 +v -22.687994 170.270203 -4.999972 +v -20.329678 172.110016 -4.999972 +v -21.528500 171.215332 -14.999972 +v -21.528500 171.215332 -4.999972 +v -19.093721 172.952682 -4.999972 +v -20.329678 172.110016 -14.999972 +v -20.329678 172.110016 -4.999972 +v -17.822887 173.741760 -4.999972 +v -19.093721 172.952682 -14.999971 +v -19.093721 172.952682 -4.999972 +v -16.519497 174.475815 -4.999971 +v -17.822887 173.741760 -14.999971 +v -17.822887 173.741760 -4.999972 +v -15.185931 175.153503 -4.999971 +v -16.519497 174.475815 -14.999971 +v -16.519497 174.475815 -4.999971 +v -8.715574 99.619469 -4.999984 +v -4.361938 99.904823 0.000016 +v -4.361938 99.904823 -4.999984 +v -11.028788 176.836548 -4.999971 +v -12.438066 176.334961 -14.999971 +v -12.438066 176.334961 -4.999971 +v -8.152403 177.656906 -4.999971 +v -9.599362 177.277481 -14.999971 +v -9.599362 177.277481 -4.999971 +v -8.152403 177.656906 -14.999971 +v -9.599362 177.277481 -14.999971 +v -8.152403 177.656906 -4.999971 +v -6.690552 177.974167 -14.999971 +v -0.747941 178.611603 -14.999970 +v -8.152403 177.656906 -14.999971 +v -6.690552 177.974167 -14.999971 +v -5.216479 178.228683 -14.999971 +v -0.747941 178.611603 -14.999970 +v -5.216479 178.228683 -14.999971 +v -3.732878 178.419968 -14.999971 +v -0.747941 178.611603 -14.999970 +v -0.747941 178.611603 -14.999970 +v -3.732878 178.419968 -14.999971 +v -2.242458 178.547699 -14.999970 +v -0.747941 178.611603 -14.999970 +v -2.242458 178.547699 -14.999970 +v -0.747941 178.611603 -4.999971 +v -2.242458 178.547699 -14.999970 +v -3.732878 178.419968 -14.999971 +v -2.242458 178.547699 -4.999971 +v -3.732878 178.419968 -14.999971 +v -5.216479 178.228683 -14.999971 +v -3.732878 178.419968 -4.999971 +v -5.216479 178.228683 -14.999971 +v -6.690552 177.974167 -14.999971 +v -5.216479 178.228683 -4.999971 +v -4.361938 99.904823 -4.999984 +v 0.000000 100.000000 -4.999984 +v -6.690552 177.974167 -4.999971 +v -4.361938 99.904823 -4.999984 +v 0.000000 100.000000 0.000016 +v 0.000000 100.000000 -4.999984 +v -3.732878 178.419968 -4.999971 +v -5.216479 178.228683 -14.999971 +v -5.216479 178.228683 -4.999971 +v -2.242458 178.547699 -4.999971 +v -3.732878 178.419968 -14.999971 +v -3.732878 178.419968 -4.999971 +v -0.747941 178.611603 -4.999971 +v -2.242458 178.547699 -14.999970 +v -2.242458 178.547699 -4.999971 +v 0.747941 178.611603 -4.999971 +v -0.747941 178.611603 -14.999970 +v -0.747941 178.611603 -4.999971 +v 2.242458 178.547699 -4.999971 +v 0.747941 178.611603 -14.999970 +v 0.747941 178.611603 -4.999971 +v 3.732878 178.419968 -4.999971 +v 2.242458 178.547699 -14.999970 +v 2.242458 178.547699 -4.999971 +v 5.216479 178.228683 -4.999971 +v 3.732878 178.419968 -14.999971 +v 3.732878 178.419968 -4.999971 +v 6.690552 177.974167 -4.999971 +v 5.216479 178.228683 -14.999971 +v 5.216479 178.228683 -4.999971 +v 8.152403 177.656906 -4.999971 +v 6.690552 177.974167 -14.999971 +v 6.690552 177.974167 -4.999971 +v 9.599362 177.277481 -4.999971 +v 8.152403 177.656906 -14.999971 +v 8.152403 177.656906 -4.999971 +v 11.028788 176.836548 -4.999971 +v 9.599362 177.277481 -14.999971 +v 9.599362 177.277481 -4.999971 +v 12.438066 176.334961 -4.999971 +v 11.028788 176.836548 -14.999971 +v 11.028788 176.836548 -4.999971 +v 12.438066 176.334961 -14.999971 +v 11.028788 176.836548 -14.999971 +v 12.438066 176.334961 -4.999971 +v 15.185931 175.153503 -14.999971 +v 13.824625 175.773605 -14.999971 +v 15.185931 175.153503 -4.999971 +v 13.824625 175.773605 -4.999971 +v 12.438066 176.334961 -14.999971 +v 12.438066 176.334961 -4.999971 +v -11.028788 176.836548 -14.999971 +v 11.028788 176.836548 -14.999971 +v 12.438066 176.334961 -14.999971 +v -11.028788 176.836548 -14.999971 +v -12.438066 176.334961 -14.999971 +v -11.028788 176.836548 -4.999971 +v -12.438066 176.334961 -14.999971 +v -13.824625 175.773605 -14.999971 +v -12.438066 176.334961 -4.999971 +v -13.824625 175.773605 -14.999971 +v -15.185931 175.153503 -14.999971 +v -13.824625 175.773605 -4.999971 +v -15.185931 175.153503 -14.999971 +v -16.519497 174.475815 -14.999971 +v -15.185931 175.153503 -4.999971 +v -16.519497 174.475815 -14.999971 +v -17.822887 173.741760 -14.999971 +v -16.519497 174.475815 -4.999971 +v -17.822887 173.741760 -14.999971 +v -19.093721 172.952682 -14.999971 +v -17.822887 173.741760 -4.999972 +v -19.093721 172.952682 -14.999971 +v -20.329678 172.110016 -14.999972 +v -19.093721 172.952682 -4.999972 +v -20.329678 172.110016 -14.999972 +v -21.528500 171.215332 -14.999972 +v -20.329678 172.110016 -4.999972 +v -21.528500 171.215332 -14.999972 +v -22.687994 170.270203 -14.999972 +v -21.528500 171.215332 -4.999972 +v -22.687994 170.270203 -14.999972 +v -23.806047 169.276413 -14.999972 +v -22.687994 170.270203 -4.999972 +v -23.806047 169.276413 -14.999972 +v -24.880611 168.235748 -14.999972 +v -23.806047 169.276413 -4.999972 +v -23.806047 169.276413 -4.999972 +v -24.880611 168.235748 -14.999972 +v -24.880611 168.235748 -4.999973 +v -24.880611 168.235748 -14.999972 +v -25.909729 167.150131 -14.999972 +v -24.880611 168.235748 -4.999973 +v -13.052619 99.144485 -4.999984 +v -23.806047 169.276413 -4.999972 +v -24.880611 168.235748 -4.999973 +v -25.909729 167.150131 -4.999973 +v -26.891518 166.021530 -14.999973 +v -26.891518 166.021530 -4.999973 +v -13.052619 99.144485 -4.999984 +v -27.824188 164.851990 -4.999973 +v -17.364819 98.480774 -4.999984 +v -17.364819 98.480774 -4.999984 +v -13.052619 99.144485 0.000016 +v -13.052619 99.144485 -4.999984 +v -26.891518 166.021530 -14.999973 +v -27.824188 164.851990 -14.999973 +v -26.891518 166.021530 -4.999973 +v 13.824625 175.773605 -14.999971 +v -28.706030 163.643692 -14.999973 +v -27.824188 164.851990 -14.999973 +v -29.535435 162.398788 -14.999973 +v -28.706030 163.643692 -14.999973 +v 13.824625 175.773605 -14.999971 +v -27.824188 164.851990 -4.999973 +v -28.706030 163.643692 -4.999973 +v -17.364819 98.480774 -4.999984 +v -21.643961 97.629601 -4.999984 +v -17.364819 98.480774 0.000016 +v -17.364819 98.480774 -4.999984 +v -25.881905 96.592583 -4.999984 +v -21.643961 97.629601 -4.999984 +v -30.310890 161.119598 -4.999974 +v -30.070581 95.371696 -4.999984 +v -25.881905 96.592583 -4.999984 +v -30.310890 161.119598 -4.999974 +v -30.310890 161.119598 -4.999974 +v -34.202015 93.969261 -4.999985 +v -30.070581 95.371696 -4.999984 +v -34.202015 93.969261 -4.999985 +v -30.070581 95.371696 0.000016 +v -30.070581 95.371696 -4.999984 +v -38.268341 92.387955 -4.999985 +v -34.202015 93.969261 -4.999985 +v -30.310890 161.119598 -4.999974 +v -42.261829 90.630775 -4.999985 +v -38.268341 92.387955 -4.999985 +v -30.310890 161.119598 -4.999974 +v -30.310890 161.119598 -4.999974 +v -46.174862 88.701088 -4.999986 +v -42.261829 90.630775 -4.999985 +v -46.174862 88.701088 -4.999986 +v -42.261829 90.630775 0.000015 +v -42.261829 90.630775 -4.999985 +v -50.000000 86.602539 -4.999986 +v -46.174862 88.701088 -4.999986 +v -30.310890 161.119598 -4.999974 +v -53.729961 84.339142 -4.999986 +v -50.000000 86.602539 -4.999986 +v -30.310890 161.119598 -4.999974 +v -30.310890 161.119598 -4.999974 +v -57.357643 81.915207 -4.999987 +v -53.729961 84.339142 -4.999986 +v -57.357643 81.915207 -4.999987 +v -53.729961 84.339142 0.000014 +v -53.729961 84.339142 -4.999986 +v -60.876141 79.335335 -4.999987 +v -57.357643 81.915207 -4.999987 +v -30.310890 161.119598 -4.999974 +v -64.278763 76.604439 -4.999988 +v -60.876141 79.335335 -4.999987 +v -30.310890 161.119598 -4.999974 +v -30.310890 161.119598 -4.999974 +v -67.559021 73.727737 -4.999988 +v -64.278763 76.604439 -4.999988 +v -67.559021 73.727737 -4.999988 +v -64.278763 76.604439 0.000012 +v -64.278763 76.604439 -4.999988 +v -70.710678 70.710678 -4.999989 +v -67.559021 73.727737 -4.999988 +v -30.310890 161.119598 -4.999974 +v -73.727737 67.559021 -4.999989 +v -70.710678 70.710678 -4.999989 +v -30.310890 161.119598 -4.999974 +v -30.310890 161.119598 -4.999974 +v -76.604439 64.278763 -4.999990 +v -73.727737 67.559021 -4.999989 +v -76.604439 64.278763 -4.999990 +v -73.727737 67.559021 0.000011 +v -73.727737 67.559021 -4.999989 +v -79.335335 60.876141 -4.999990 +v -76.604439 64.278763 -4.999990 +v -30.310890 161.119598 -4.999974 +v -81.915207 57.357643 -4.999990 +v -79.335335 60.876141 -4.999990 +v -30.310890 161.119598 -4.999974 +v -30.310890 161.119598 -4.999974 +v -84.339142 53.729961 -4.999991 +v -81.915207 57.357643 -4.999990 +v -84.339142 53.729961 -4.999991 +v -81.915207 57.357643 0.000009 +v -81.915207 57.357643 -4.999990 +v -81.915207 57.357643 -4.999990 +v -79.335335 60.876141 0.000010 +v -79.335335 60.876141 -4.999990 +v -79.335335 60.876141 -4.999990 +v -76.604439 64.278763 0.000010 +v -76.604439 64.278763 -4.999990 +v -73.727737 67.559021 -4.999989 +v -70.710678 70.710678 0.000012 +v -70.710678 70.710678 -4.999989 +v -70.710678 70.710678 -4.999989 +v -67.559021 73.727737 0.000012 +v -67.559021 73.727737 -4.999988 +v -64.278763 76.604439 -4.999988 +v -60.876141 79.335335 0.000013 +v -60.876141 79.335335 -4.999987 +v -60.876141 79.335335 -4.999987 +v -57.357643 81.915207 0.000013 +v -57.357643 81.915207 -4.999987 +v -53.729961 84.339142 -4.999986 +v -50.000000 86.602539 0.000014 +v -50.000000 86.602539 -4.999986 +v -50.000000 86.602539 -4.999986 +v -46.174862 88.701088 0.000014 +v -46.174862 88.701088 -4.999986 +v -42.261829 90.630775 -4.999985 +v -38.268341 92.387955 0.000015 +v -38.268341 92.387955 -4.999985 +v -38.268341 92.387955 -4.999985 +v -34.202015 93.969261 0.000015 +v -34.202015 93.969261 -4.999985 +v -30.070581 95.371696 -4.999984 +v -25.881905 96.592583 0.000016 +v -25.881905 96.592583 -4.999984 +v -25.881905 96.592583 -4.999984 +v -21.643961 97.629601 0.000016 +v -21.643961 97.629601 -4.999984 +v -29.535435 162.398788 -14.999973 +v -30.310890 161.119598 -14.999973 +v -29.535435 162.398788 -4.999974 +v -86.602539 50.000000 -4.999992 +v -84.339142 53.729961 -4.999991 +v -30.310890 161.119598 -4.999974 +v -86.602539 50.000000 -4.999992 +v -84.339142 53.729961 0.000009 +v -84.339142 53.729961 -4.999991 +v -88.701088 46.174862 -4.999992 +v -86.602539 50.000000 0.000008 +v -86.602539 50.000000 -4.999992 +v -90.630775 42.261829 -4.999993 +v -88.701088 46.174862 0.000008 +v -88.701088 46.174862 -4.999992 +v -92.387955 38.268341 -4.999994 +v -90.630775 42.261829 0.000007 +v -90.630775 42.261829 -4.999993 +v -93.969261 34.202015 -4.999994 +v -92.387955 38.268341 0.000006 +v -92.387955 38.268341 -4.999994 +v -95.371696 30.070581 -4.999995 +v -93.969261 34.202015 0.000006 +v -93.969261 34.202015 -4.999994 +v -96.592583 25.881905 -4.999996 +v -95.371696 30.070581 0.000005 +v -95.371696 30.070581 -4.999995 +v -97.629601 21.643961 -4.999997 +v -96.592583 25.881905 0.000004 +v -96.592583 25.881905 -4.999996 +v -98.480774 17.364819 -4.999997 +v -97.629601 21.643961 0.000004 +v -97.629601 21.643961 -4.999997 +v -99.144485 13.052620 -4.999998 +v -98.480774 17.364819 0.000003 +v -98.480774 17.364819 -4.999997 +v -99.619469 8.715575 -4.999999 +v -99.144485 13.052619 0.000002 +v -99.144485 13.052620 -4.999998 +v -99.904823 4.361939 -5.000000 +v -99.619469 8.715574 0.000001 +v -99.619469 8.715575 -4.999999 +v -99.904823 -4.361937 -5.000000 +v -100.000000 0.000000 0.000000 +v -100.000000 0.000001 -5.000000 +v -99.619469 -8.715573 -5.000001 +v -99.904823 -4.361938 -0.000001 +v -99.904823 -4.361937 -5.000000 +v -99.144485 -13.052618 -5.000002 +v -99.619469 -8.715574 -0.000001 +v -99.619469 -8.715573 -5.000001 +v -98.480774 -17.364819 -5.000003 +v -99.144485 -13.052619 -0.000002 +v -99.144485 -13.052618 -5.000002 +v -97.629601 -21.643961 -5.000003 +v -98.480774 -17.364819 -0.000003 +v -98.480774 -17.364819 -5.000003 +v -96.592583 -25.881905 -5.000004 +v -97.629601 -21.643961 -0.000004 +v -97.629601 -21.643961 -5.000003 +v -95.371696 -30.070581 -5.000005 +v -96.592583 -25.881905 -0.000004 +v -96.592583 -25.881905 -5.000004 +v -93.969261 -34.202015 -5.000006 +v -95.371696 -30.070581 -0.000005 +v -95.371696 -30.070581 -5.000005 +v -154.689117 -54.309799 -5.000009 +v -155.409195 -55.620956 -15.000010 +v -155.409195 -55.620960 -5.000009 +v -93.969261 -34.202015 -5.000006 +v -156.072601 -56.961693 -5.000009 +v -92.387955 -38.268341 -5.000006 +v -92.387955 -38.268341 -5.000006 +v -93.969261 -34.202015 -0.000006 +v -93.969261 -34.202015 -5.000006 +v -155.409195 -55.620956 -15.000010 +v -156.072601 -56.961689 -15.000010 +v -155.409195 -55.620960 -5.000009 +v -153.505615 -91.215874 -15.000015 +v -156.678116 -58.329540 -15.000010 +v -156.072601 -56.961689 -15.000010 +v -157.224609 -59.722019 -15.000010 +v -156.678116 -58.329540 -15.000010 +v -153.505615 -91.215874 -15.000015 +v -157.711121 -61.136578 -15.000010 +v -157.224609 -59.722019 -15.000010 +v -153.505615 -91.215874 -15.000015 +v -157.711121 -61.136578 -15.000010 +v -153.505615 -91.215874 -15.000015 +v -154.308212 -89.953545 -15.000014 +v -156.072601 -56.961693 -5.000009 +v -156.678116 -58.329544 -5.000010 +v -92.387955 -38.268341 -5.000006 +v -157.711121 -61.136581 -5.000010 +v -158.136734 -62.570641 -5.000010 +v -92.387955 -38.268341 -5.000006 +v -158.136734 -62.570641 -5.000010 +v -158.500702 -64.021568 -5.000010 +v -92.387955 -38.268341 -5.000006 +v -158.500702 -64.021568 -5.000010 +v -158.802322 -65.486725 -5.000010 +v -92.387955 -38.268341 -5.000006 +v -92.387955 -38.268341 -5.000006 +v -158.802322 -65.486725 -5.000010 +v -90.630775 -42.261829 -5.000007 +v -90.630775 -42.261829 -5.000007 +v -92.387955 -38.268341 -0.000006 +v -92.387955 -38.268341 -5.000006 +v -158.802322 -65.486725 -5.000010 +v -159.041061 -66.963432 -5.000011 +v -90.630775 -42.261829 -5.000007 +v -90.630775 -42.261829 -5.000007 +v -159.041061 -66.963432 -5.000011 +v -159.216492 -68.448990 -5.000011 +v -159.216492 -68.448990 -5.000011 +v -159.328278 -69.940697 -5.000011 +v -90.630775 -42.261829 -5.000007 +v -159.328278 -69.940697 -5.000011 +v -159.376221 -71.435806 -5.000011 +v -90.630775 -42.261829 -5.000007 +v -90.630775 -42.261829 -5.000007 +v -159.376221 -71.435806 -5.000011 +v -159.360245 -72.931602 -5.000012 +v -159.360245 -72.931602 -5.000012 +v -159.280365 -74.425354 -5.000012 +v -90.630775 -42.261829 -5.000007 +v -159.280365 -74.425354 -5.000012 +v -159.136719 -75.914322 -5.000012 +v -90.630775 -42.261829 -5.000007 +v -90.630775 -42.261829 -5.000007 +v -159.136719 -75.914322 -5.000012 +v -88.701088 -46.174862 -5.000008 +v -88.701088 -46.174862 -5.000008 +v -90.630775 -42.261829 -0.000007 +v -90.630775 -42.261829 -5.000007 +v -159.136719 -75.914322 -5.000012 +v -158.929581 -77.395798 -5.000012 +v -88.701088 -46.174862 -5.000008 +v -88.701088 -46.174862 -5.000008 +v -158.929581 -77.395798 -5.000012 +v -158.659332 -78.867065 -5.000013 +v -158.659332 -78.867065 -5.000013 +v -158.326477 -80.325439 -5.000013 +v -88.701088 -46.174862 -5.000008 +v -158.326477 -80.325439 -5.000013 +v -157.931595 -81.768265 -5.000013 +v -88.701088 -46.174862 -5.000008 +v -88.701088 -46.174862 -5.000008 +v -157.931595 -81.768265 -5.000013 +v -86.602539 -50.000000 -5.000008 +v -86.602539 -50.000000 -5.000008 +v -88.701088 -46.174862 -0.000008 +v -88.701088 -46.174862 -5.000008 +v -158.326477 -80.325439 -5.000013 +v -157.931595 -81.768265 -15.000013 +v -157.931595 -81.768265 -5.000013 +v -157.931595 -81.768265 -15.000013 +v -157.475433 -83.192902 -15.000013 +v -157.931595 -81.768265 -5.000013 +v -157.931595 -81.768265 -5.000013 +v -157.475433 -83.192902 -15.000013 +v -157.475433 -83.192902 -5.000013 +v -157.931595 -81.768265 -15.000013 +v -158.929581 -77.395798 -15.000012 +v -157.475433 -83.192902 -15.000013 +v -158.929581 -77.395798 -15.000012 +v -159.136719 -75.914322 -15.000012 +v -157.475433 -83.192902 -15.000013 +v -157.475433 -83.192902 -15.000013 +v -159.136719 -75.914322 -15.000012 +v -159.280365 -74.425354 -15.000012 +v -159.360245 -72.931602 -15.000011 +v -157.475433 -83.192902 -15.000013 +v -159.280365 -74.425354 -15.000012 +v -159.360245 -72.931602 -15.000011 +v -159.280365 -74.425354 -15.000012 +v -159.360245 -72.931602 -5.000012 +v -159.360245 -72.931602 -15.000011 +v -159.376221 -71.435806 -15.000011 +v -157.475433 -83.192902 -15.000013 +v -159.376221 -71.435806 -15.000011 +v -159.328278 -69.940697 -15.000011 +v -157.475433 -83.192902 -15.000013 +v -159.328278 -69.940697 -15.000011 +v -159.216492 -68.448990 -15.000011 +v -157.475433 -83.192902 -15.000013 +v -157.475433 -83.192902 -15.000013 +v -159.216492 -68.448990 -15.000011 +v -159.041061 -66.963432 -15.000010 +v -159.041061 -66.963432 -15.000010 +v -158.802322 -65.486725 -15.000010 +v -157.475433 -83.192902 -15.000013 +v -158.802322 -65.486725 -15.000010 +v -158.500702 -64.021568 -15.000010 +v -157.475433 -83.192902 -15.000013 +v -158.500702 -64.021568 -15.000010 +v -158.802322 -65.486725 -15.000010 +v -158.500702 -64.021568 -5.000010 +v -158.802322 -65.486725 -15.000010 +v -159.041061 -66.963432 -15.000010 +v -158.802322 -65.486725 -5.000010 +v -159.041061 -66.963432 -15.000010 +v -159.216492 -68.448990 -15.000011 +v -159.041061 -66.963432 -5.000011 +v -159.216492 -68.448990 -15.000011 +v -159.328278 -69.940697 -15.000011 +v -159.216492 -68.448990 -5.000011 +v -159.328278 -69.940697 -15.000011 +v -159.376221 -71.435806 -15.000011 +v -159.328278 -69.940697 -5.000011 +v -159.376221 -71.435806 -15.000011 +v -159.360245 -72.931602 -15.000011 +v -159.376221 -71.435806 -5.000011 +v -159.280365 -74.425354 -15.000012 +v -159.136719 -75.914322 -15.000012 +v -159.280365 -74.425354 -5.000012 +v -159.136719 -75.914322 -15.000012 +v -158.929581 -77.395798 -15.000012 +v -159.136719 -75.914322 -5.000012 +v -158.659332 -78.867065 -15.000012 +v -158.929581 -77.395798 -15.000012 +v -157.931595 -81.768265 -15.000013 +v -158.326477 -80.325439 -15.000013 +v -158.659332 -78.867065 -15.000012 +v -157.931595 -81.768265 -15.000013 +v -158.659332 -78.867065 -15.000012 +v -158.326477 -80.325439 -15.000013 +v -158.659332 -78.867065 -5.000013 +v -158.929581 -77.395798 -15.000012 +v -158.659332 -78.867065 -15.000012 +v -158.929581 -77.395798 -5.000012 +v -158.326477 -80.325439 -15.000013 +v -157.931595 -81.768265 -15.000013 +v -158.326477 -80.325439 -5.000013 +v -158.659332 -78.867065 -5.000013 +v -158.326477 -80.325439 -15.000013 +v -158.326477 -80.325439 -5.000013 +v -158.929581 -77.395798 -5.000012 +v -158.659332 -78.867065 -15.000012 +v -158.659332 -78.867065 -5.000013 +v -159.136719 -75.914322 -5.000012 +v -158.929581 -77.395798 -15.000012 +v -158.929581 -77.395798 -5.000012 +v -159.280365 -74.425354 -5.000012 +v -159.136719 -75.914322 -15.000012 +v -159.136719 -75.914322 -5.000012 +v -159.360245 -72.931602 -5.000012 +v -159.280365 -74.425354 -15.000012 +v -159.280365 -74.425354 -5.000012 +v -159.376221 -71.435806 -5.000011 +v -159.360245 -72.931602 -15.000011 +v -159.360245 -72.931602 -5.000012 +v -159.328278 -69.940697 -5.000011 +v -159.376221 -71.435806 -15.000011 +v -159.376221 -71.435806 -5.000011 +v -159.216492 -68.448990 -5.000011 +v -159.328278 -69.940697 -15.000011 +v -159.328278 -69.940697 -5.000011 +v -159.041061 -66.963432 -5.000011 +v -159.216492 -68.448990 -15.000011 +v -159.216492 -68.448990 -5.000011 +v -158.802322 -65.486725 -5.000010 +v -159.041061 -66.963432 -15.000010 +v -159.041061 -66.963432 -5.000011 +v -158.500702 -64.021568 -5.000010 +v -158.802322 -65.486725 -15.000010 +v -158.802322 -65.486725 -5.000010 +v -158.136734 -62.570641 -5.000010 +v -158.500702 -64.021568 -15.000010 +v -158.500702 -64.021568 -5.000010 +v -158.136734 -62.570637 -15.000010 +v -158.500702 -64.021568 -15.000010 +v -158.136734 -62.570641 -5.000010 +v -157.224609 -59.722019 -15.000010 +v -157.711121 -61.136578 -15.000010 +v -157.224609 -59.722023 -5.000010 +v -157.711121 -61.136581 -5.000010 +v -158.136734 -62.570637 -15.000010 +v -158.136734 -62.570641 -5.000010 +v -157.475433 -83.192902 -15.000013 +v -158.500702 -64.021568 -15.000010 +v -158.136734 -62.570637 -15.000010 +v -157.475433 -83.192902 -15.000013 +v -156.958801 -84.596741 -15.000013 +v -157.475433 -83.192902 -5.000013 +v -157.931595 -81.768265 -5.000013 +v -157.475433 -83.192902 -5.000013 +v -86.602539 -50.000000 -5.000008 +v -156.958801 -84.596741 -5.000014 +v -156.382660 -85.977219 -15.000014 +v -156.382660 -85.977219 -5.000014 +v -156.382660 -85.977219 -15.000014 +v -155.748062 -87.331818 -15.000014 +v -156.382660 -85.977219 -5.000014 +v -155.056168 -88.658066 -15.000014 +v -155.748062 -87.331818 -15.000014 +v -157.711121 -61.136578 -15.000010 +v -154.308212 -89.953545 -15.000014 +v -155.056168 -88.658066 -15.000014 +v -157.711121 -61.136578 -15.000010 +v -155.748062 -87.331818 -5.000014 +v -155.056168 -88.658066 -5.000014 +v -86.602539 -50.000000 -5.000008 +v -153.505615 -91.215874 -5.000015 +v -152.649796 -92.442749 -5.000015 +v -86.602539 -50.000000 -5.000008 +v -152.649796 -92.442749 -5.000015 +v -151.742325 -93.631943 -5.000015 +v -86.602539 -50.000000 -5.000008 +v -151.742325 -93.631943 -5.000015 +v -150.784882 -94.781273 -5.000015 +v -86.602539 -50.000000 -5.000008 +v -86.602539 -50.000000 -5.000008 +v -150.784882 -94.781273 -5.000015 +v -84.339142 -53.729961 -5.000009 +v -84.339142 -53.729961 -5.000009 +v -86.602539 -50.000000 -0.000008 +v -86.602539 -50.000000 -5.000008 +v -150.784882 -94.781273 -5.000015 +v -149.779205 -95.888641 -5.000016 +v -84.339142 -53.729961 -5.000009 +v -84.339142 -53.729961 -5.000009 +v -149.779205 -95.888641 -5.000016 +v -148.727097 -96.952026 -5.000016 +v -148.727097 -96.952026 -5.000016 +v -147.630554 -97.969490 -5.000016 +v -84.339142 -53.729961 -5.000009 +v -84.339142 -53.729961 -5.000009 +v -147.630554 -97.969490 -5.000016 +v -146.491516 -98.939156 -5.000016 +v -145.312088 -99.859276 -5.000016 +v -84.339142 -53.729961 -5.000009 +v -146.491516 -98.939156 -5.000016 +v -146.491516 -98.939156 -5.000016 +v -145.312088 -99.859276 -15.000016 +v -145.312088 -99.859276 -5.000016 +v -81.915207 -57.357643 -5.000010 +v -84.339142 -53.729961 -5.000009 +v -145.312088 -99.859276 -5.000016 +v -144.094421 -100.728157 -5.000016 +v -81.915207 -57.357643 -5.000010 +v -145.312088 -99.859276 -5.000016 +v -145.312088 -99.859276 -5.000016 +v -144.094421 -100.728157 -15.000016 +v -144.094421 -100.728157 -5.000016 +v -144.094421 -100.728157 -5.000016 +v -142.840744 -101.544220 -5.000017 +v -81.915207 -57.357643 -5.000010 +v -142.840744 -101.544220 -5.000017 +v -141.553345 -102.305954 -5.000017 +v -81.915207 -57.357643 -5.000010 +v -81.915207 -57.357643 -5.000010 +v -141.553345 -102.305954 -5.000017 +v -140.234558 -103.011986 -5.000017 +v -81.915207 -57.357643 -5.000010 +v -140.234558 -103.011986 -5.000017 +v -138.886810 -103.661034 -5.000017 +v -137.512558 -104.251884 -5.000017 +v -81.915207 -57.357643 -5.000010 +v -138.886810 -103.661034 -5.000017 +v -138.886810 -103.661034 -5.000017 +v -137.512558 -104.251884 -15.000017 +v -137.512558 -104.251884 -5.000017 +v -79.335335 -60.876141 -5.000010 +v -81.915207 -57.357643 -5.000010 +v -137.512558 -104.251884 -5.000017 +v -136.114334 -104.783485 -5.000017 +v -79.335335 -60.876141 -5.000010 +v -137.512558 -104.251884 -5.000017 +v -137.512558 -104.251884 -5.000017 +v -136.114334 -104.783485 -15.000017 +v -136.114334 -104.783485 -5.000017 +v -136.114334 -104.783485 -5.000017 +v -134.694656 -105.254852 -5.000017 +v -79.335335 -60.876141 -5.000010 +v -136.114334 -104.783485 -5.000017 +v -134.694656 -105.254852 -15.000017 +v -134.694656 -105.254852 -5.000017 +v -79.335335 -60.876141 -5.000010 +v -81.915207 -57.357643 -0.000009 +v -81.915207 -57.357643 -5.000010 +v -140.234558 -103.011986 -5.000017 +v -138.886810 -103.661034 -15.000017 +v -138.886810 -103.661034 -5.000017 +v -141.553345 -102.305954 -5.000017 +v -140.234558 -103.011986 -15.000017 +v -140.234558 -103.011986 -5.000017 +v -142.840744 -101.544220 -5.000017 +v -141.553345 -102.305954 -15.000016 +v -141.553345 -102.305954 -5.000017 +v -144.094421 -100.728157 -5.000016 +v -142.840744 -101.544220 -15.000016 +v -142.840744 -101.544220 -5.000017 +v -81.915207 -57.357643 -5.000010 +v -84.339142 -53.729961 -0.000009 +v -84.339142 -53.729961 -5.000009 +v -147.630554 -97.969490 -5.000016 +v -146.491516 -98.939156 -15.000016 +v -146.491516 -98.939156 -5.000016 +v -148.727097 -96.952026 -5.000016 +v -147.630554 -97.969490 -15.000016 +v -147.630554 -97.969490 -5.000016 +v -149.779205 -95.888641 -5.000016 +v -148.727097 -96.952026 -15.000016 +v -148.727097 -96.952026 -5.000016 +v -150.784882 -94.781273 -5.000015 +v -149.779205 -95.888641 -15.000015 +v -149.779205 -95.888641 -5.000016 +v -151.742325 -93.631943 -5.000015 +v -150.784882 -94.781273 -15.000015 +v -150.784882 -94.781273 -5.000015 +v -152.649796 -92.442749 -5.000015 +v -151.742325 -93.631943 -15.000015 +v -151.742325 -93.631943 -5.000015 +v -154.308212 -89.953545 -15.000014 +v -153.505615 -91.215874 -15.000015 +v -154.308212 -89.953545 -5.000015 +v -153.505615 -91.215874 -5.000015 +v -152.649796 -92.442749 -15.000015 +v -152.649796 -92.442749 -5.000015 +v -153.505615 -91.215874 -15.000015 +v -154.689117 -54.309795 -15.000009 +v 30.310890 161.119598 -14.999973 +v -152.649796 -92.442749 -15.000015 +v -151.742325 -93.631943 -15.000015 +v -152.649796 -92.442749 -5.000015 +v -151.742325 -93.631943 -15.000015 +v -150.784882 -94.781273 -15.000015 +v -151.742325 -93.631943 -5.000015 +v -150.784882 -94.781273 -15.000015 +v -149.779205 -95.888641 -15.000015 +v -150.784882 -94.781273 -5.000015 +v -149.779205 -95.888641 -15.000015 +v -148.727097 -96.952026 -15.000016 +v -149.779205 -95.888641 -5.000016 +v -148.727097 -96.952026 -15.000016 +v -147.630554 -97.969490 -15.000016 +v -148.727097 -96.952026 -5.000016 +v -147.630554 -97.969490 -15.000016 +v -146.491516 -98.939156 -15.000016 +v -147.630554 -97.969490 -5.000016 +v -146.491516 -98.939156 -15.000016 +v -145.312088 -99.859276 -15.000016 +v -146.491516 -98.939156 -5.000016 +v -145.312088 -99.859276 -15.000016 +v -144.094421 -100.728157 -15.000016 +v -145.312088 -99.859276 -5.000016 +v -144.094421 -100.728157 -15.000016 +v -142.840744 -101.544220 -15.000016 +v -144.094421 -100.728157 -5.000016 +v -142.840744 -101.544220 -15.000016 +v -141.553345 -102.305954 -15.000016 +v -142.840744 -101.544220 -5.000017 +v -141.553345 -102.305954 -15.000016 +v -140.234558 -103.011986 -15.000017 +v -141.553345 -102.305954 -5.000017 +v -140.234558 -103.011986 -15.000017 +v -138.886810 -103.661034 -15.000017 +v -140.234558 -103.011986 -5.000017 +v -138.886810 -103.661034 -15.000017 +v -137.512558 -104.251884 -15.000017 +v -138.886810 -103.661034 -5.000017 +v -137.512558 -104.251884 -15.000017 +v -136.114334 -104.783485 -15.000017 +v -137.512558 -104.251884 -5.000017 +v -136.114334 -104.783485 -15.000017 +v -134.694656 -105.254852 -15.000017 +v -136.114334 -104.783485 -5.000017 +v -134.694656 -105.254852 -15.000017 +v -133.256134 -105.665115 -15.000017 +v -134.694656 -105.254852 -5.000017 +v -134.694656 -105.254852 -5.000017 +v -133.256134 -105.665115 -15.000017 +v -133.256134 -105.665115 -5.000017 +v -128.853912 -106.522446 -15.000017 +v -130.333099 -106.299500 -15.000017 +v 30.310890 161.119598 -14.999973 +v -133.256134 -105.665115 -15.000017 +v -131.801392 -106.013550 -15.000017 +v -133.256134 -105.665115 -5.000017 +v -134.694656 -105.254852 -5.000017 +v -133.256134 -105.665115 -5.000017 +v -79.335335 -60.876141 -5.000010 +v -131.801392 -106.013550 -5.000017 +v -130.333099 -106.299500 -15.000017 +v -130.333099 -106.299500 -5.000017 +v -79.335335 -60.876141 -5.000010 +v -128.853912 -106.522446 -5.000017 +v -76.604439 -64.278763 -5.000010 +v -76.604439 -64.278763 -5.000010 +v -79.335335 -60.876141 -0.000010 +v -79.335335 -60.876141 -5.000010 +v -130.333099 -106.299500 -15.000017 +v -128.853912 -106.522446 -15.000017 +v -130.333099 -106.299500 -5.000017 +v -127.366570 -106.681992 -15.000017 +v -128.853912 -106.522446 -15.000017 +v 30.310890 161.119598 -14.999973 +v -125.873756 -106.777832 -15.000017 +v -127.366570 -106.681992 -15.000017 +v 30.310890 161.119598 -14.999973 +v -125.873756 -106.777832 -15.000017 +v 30.310890 161.119598 -14.999973 +v -124.378220 -106.809799 -15.000017 +v -128.853912 -106.522446 -5.000017 +v -127.366570 -106.681992 -5.000017 +v -76.604439 -64.278763 -5.000010 +v -73.727737 -67.559021 -5.000011 +v -76.604439 -64.278763 -0.000010 +v -76.604439 -64.278763 -5.000010 +v -70.710678 -70.710678 -5.000011 +v -73.727737 -67.559021 -5.000011 +v -124.378220 -106.809799 -5.000017 +v -67.559021 -73.727737 -5.000012 +v -70.710678 -70.710678 -5.000011 +v -124.378220 -106.809799 -5.000017 +v -124.378220 -106.809799 -5.000017 +v -64.278763 -76.604439 -5.000012 +v -67.559021 -73.727737 -5.000012 +v -64.278763 -76.604439 -5.000012 +v -67.559021 -73.727737 -0.000012 +v -67.559021 -73.727737 -5.000012 +v -60.876141 -79.335335 -5.000013 +v -64.278763 -76.604439 -5.000012 +v -124.378220 -106.809799 -5.000017 +v -57.357643 -81.915207 -5.000013 +v -60.876141 -79.335335 -5.000013 +v -124.378220 -106.809799 -5.000017 +v -124.378220 -106.809799 -5.000017 +v -53.729961 -84.339142 -5.000014 +v -57.357643 -81.915207 -5.000013 +v -53.729961 -84.339142 -5.000014 +v -57.357643 -81.915207 -0.000013 +v -57.357643 -81.915207 -5.000013 +v -50.000000 -86.602539 -5.000014 +v -53.729961 -84.339142 -5.000014 +v -124.378220 -106.809799 -5.000017 +v -46.174862 -88.701088 -5.000014 +v -50.000000 -86.602539 -5.000014 +v -124.378220 -106.809799 -5.000017 +v -124.378220 -106.809799 -5.000017 +v -42.261829 -90.630775 -5.000015 +v -46.174862 -88.701088 -5.000014 +v -42.261829 -90.630775 -5.000015 +v -46.174862 -88.701088 -0.000014 +v -46.174862 -88.701088 -5.000014 +v -38.268341 -92.387955 -5.000015 +v -42.261829 -90.630775 -5.000015 +v -124.378220 -106.809799 -5.000017 +v -34.202015 -93.969261 -5.000015 +v -38.268341 -92.387955 -5.000015 +v -124.378220 -106.809799 -5.000017 +v -124.378220 -106.809799 -5.000017 +v -30.070581 -95.371696 -5.000016 +v -34.202015 -93.969261 -5.000015 +v -30.070581 -95.371696 -5.000016 +v -34.202015 -93.969261 -0.000015 +v -34.202015 -93.969261 -5.000015 +v -25.881905 -96.592583 -5.000016 +v -30.070581 -95.371696 -5.000016 +v -124.378220 -106.809799 -5.000017 +v -21.643961 -97.629601 -5.000016 +v -25.881905 -96.592583 -5.000016 +v -124.378220 -106.809799 -5.000017 +v -124.378220 -106.809799 -5.000017 +v -17.364819 -98.480774 -5.000016 +v -21.643961 -97.629601 -5.000016 +v -17.364819 -98.480774 -5.000016 +v -21.643961 -97.629601 -0.000016 +v -21.643961 -97.629601 -5.000016 +v -13.052619 -99.144485 -5.000016 +v -17.364819 -98.480774 -5.000016 +v -124.378220 -106.809799 -5.000017 +v -8.715574 -99.619469 -5.000016 +v -13.052619 -99.144485 -5.000016 +v -124.378220 -106.809799 -5.000017 +v -124.378220 -106.809799 -5.000017 +v -4.361938 -99.904823 -5.000016 +v -8.715574 -99.619469 -5.000016 +v -4.361938 -99.904823 -5.000016 +v -8.715574 -99.619469 -0.000016 +v -8.715574 -99.619469 -5.000016 +v -8.715574 -99.619469 -5.000016 +v -13.052619 -99.144485 -0.000016 +v -13.052619 -99.144485 -5.000016 +v -13.052619 -99.144485 -5.000016 +v -17.364819 -98.480774 -0.000016 +v -17.364819 -98.480774 -5.000016 +v -21.643961 -97.629601 -5.000016 +v -25.881905 -96.592583 -0.000016 +v -25.881905 -96.592583 -5.000016 +v -25.881905 -96.592583 -5.000016 +v -30.070581 -95.371696 -0.000016 +v -30.070581 -95.371696 -5.000016 +v -34.202015 -93.969261 -5.000015 +v -38.268341 -92.387955 -0.000015 +v -38.268341 -92.387955 -5.000015 +v -38.268341 -92.387955 -5.000015 +v -42.261829 -90.630775 -0.000015 +v -42.261829 -90.630775 -5.000015 +v -46.174862 -88.701088 -5.000014 +v -50.000000 -86.602539 -0.000014 +v -50.000000 -86.602539 -5.000014 +v -50.000000 -86.602539 -5.000014 +v -53.729961 -84.339142 -0.000014 +v -53.729961 -84.339142 -5.000014 +v -57.357643 -81.915207 -5.000013 +v -60.876141 -79.335335 -0.000013 +v -60.876141 -79.335335 -5.000013 +v -60.876141 -79.335335 -5.000013 +v -64.278763 -76.604439 -0.000012 +v -64.278763 -76.604439 -5.000012 +v -67.559021 -73.727737 -5.000012 +v -70.710678 -70.710678 -0.000012 +v -70.710678 -70.710678 -5.000011 +v -70.710678 -70.710678 -5.000011 +v -73.727737 -67.559021 -0.000011 +v -73.727737 -67.559021 -5.000011 +v -125.873756 -106.777832 -15.000017 +v -124.378220 -106.809799 -15.000017 +v -125.873756 -106.777832 -5.000017 +v 0.000000 -100.000000 -5.000016 +v -4.361938 -99.904823 -5.000016 +v -124.378220 -106.809799 -5.000017 +v 0.000000 -100.000000 -5.000016 +v -4.361938 -99.904823 -0.000016 +v -4.361938 -99.904823 -5.000016 +v 4.361938 -99.904823 -5.000016 +v 0.000000 -100.000000 -0.000016 +v 0.000000 -100.000000 -5.000016 +v 8.715574 -99.619469 -5.000016 +v 4.361938 -99.904823 -0.000016 +v 4.361938 -99.904823 -5.000016 +v 13.052619 -99.144485 -5.000016 +v 8.715574 -99.619469 -0.000016 +v 8.715574 -99.619469 -5.000016 +v 17.364819 -98.480774 -5.000016 +v 13.052619 -99.144485 -0.000016 +v 13.052619 -99.144485 -5.000016 +v 21.643961 -97.629601 -5.000016 +v 17.364819 -98.480774 -0.000016 +v 17.364819 -98.480774 -5.000016 +v 25.881905 -96.592583 -5.000016 +v 21.643961 -97.629601 -0.000016 +v 21.643961 -97.629601 -5.000016 +v 30.070581 -95.371696 -5.000016 +v 25.881905 -96.592583 -0.000016 +v 25.881905 -96.592583 -5.000016 +v 34.202015 -93.969261 -5.000015 +v 30.070581 -95.371696 -0.000016 +v 30.070581 -95.371696 -5.000016 +v 38.268341 -92.387955 -5.000015 +v 34.202015 -93.969261 -0.000015 +v 34.202015 -93.969261 -5.000015 +v 42.261829 -90.630775 -5.000015 +v 38.268341 -92.387955 -0.000015 +v 38.268341 -92.387955 -5.000015 +v 46.174862 -88.701088 -5.000014 +v 42.261829 -90.630775 -0.000015 +v 42.261829 -90.630775 -5.000015 +v 50.000000 -86.602539 -5.000014 +v 46.174862 -88.701088 -0.000014 +v 46.174862 -88.701088 -5.000014 +v 53.729961 -84.339142 -5.000014 +v 50.000000 -86.602539 -0.000014 +v 50.000000 -86.602539 -5.000014 +v 57.357643 -81.915207 -5.000013 +v 53.729961 -84.339142 -0.000014 +v 53.729961 -84.339142 -5.000014 +v 60.876141 -79.335335 -5.000013 +v 57.357643 -81.915207 -0.000013 +v 57.357643 -81.915207 -5.000013 +v 64.278763 -76.604439 -5.000012 +v 60.876141 -79.335335 -0.000013 +v 60.876141 -79.335335 -5.000013 +v 67.559021 -73.727737 -5.000012 +v 64.278763 -76.604439 -0.000012 +v 64.278763 -76.604439 -5.000012 +v 70.710678 -70.710678 -5.000011 +v 67.559021 -73.727737 -0.000012 +v 67.559021 -73.727737 -5.000012 +v 73.727737 -67.559021 -5.000011 +v 70.710678 -70.710678 -0.000012 +v 70.710678 -70.710678 -5.000011 +v 76.604439 -64.278763 -5.000010 +v 73.727737 -67.559021 -0.000011 +v 73.727737 -67.559021 -5.000011 +v 125.904900 -106.776489 -5.000017 +v 127.428665 -106.676613 -5.000017 +v 76.604439 -64.278763 -5.000010 +v 76.604439 -64.278763 -5.000010 +v 127.428665 -106.676613 -5.000017 +v 79.335335 -60.876141 -5.000010 +v 79.335335 -60.876141 -5.000010 +v 76.604439 -64.278763 -0.000010 +v 76.604439 -64.278763 -5.000010 +v 127.428665 -106.676613 -5.000017 +v 128.946625 -106.510368 -5.000017 +v 79.335335 -60.876141 -5.000010 +v 79.335335 -60.876141 -5.000010 +v 128.946625 -106.510368 -5.000017 +v 130.455917 -106.278069 -5.000017 +v 130.455917 -106.278069 -5.000017 +v 131.953613 -105.980156 -5.000017 +v 79.335335 -60.876141 -5.000010 +v 131.953613 -105.980156 -5.000017 +v 133.436890 -105.617203 -5.000017 +v 79.335335 -60.876141 -5.000010 +v 79.335335 -60.876141 -5.000010 +v 133.436890 -105.617203 -5.000017 +v 134.902924 -105.189888 -5.000017 +v 136.348938 -104.699036 -5.000017 +v 79.335335 -60.876141 -5.000010 +v 134.902924 -105.189888 -5.000017 +v 134.902924 -105.189888 -5.000017 +v 136.348938 -104.699036 -15.000017 +v 136.348938 -104.699036 -5.000017 +v 136.348938 -104.699036 -15.000017 +v 137.772141 -104.145584 -15.000017 +v 136.348938 -104.699036 -5.000017 +v 136.348938 -104.699036 -5.000017 +v 137.772141 -104.145584 -15.000017 +v 137.772141 -104.145584 -5.000017 +v 137.772141 -104.145584 -5.000017 +v 81.915207 -57.357643 -5.000010 +v 136.348938 -104.699036 -5.000017 +v 137.772141 -104.145584 -5.000017 +v 139.169861 -103.530571 -5.000017 +v 81.915207 -57.357643 -5.000010 +v 139.169861 -103.530571 -5.000017 +v 140.539429 -102.855179 -5.000017 +v 81.915207 -57.357643 -5.000010 +v 81.915207 -57.357643 -5.000010 +v 140.539429 -102.855179 -5.000017 +v 141.878220 -102.120689 -5.000017 +v 141.878220 -102.120689 -5.000017 +v 143.183716 -101.328499 -5.000017 +v 81.915207 -57.357643 -5.000010 +v 143.183716 -101.328499 -5.000017 +v 144.453384 -100.480125 -5.000016 +v 81.915207 -57.357643 -5.000010 +v 81.915207 -57.357643 -5.000010 +v 144.453384 -100.480125 -5.000016 +v 145.684875 -99.577164 -5.000016 +v 84.339142 -53.729961 -5.000009 +v 81.915207 -57.357643 -5.000010 +v 145.684875 -99.577164 -5.000016 +v 146.875778 -98.621353 -5.000016 +v 84.339142 -53.729961 -5.000009 +v 145.684875 -99.577164 -5.000016 +v 145.684875 -99.577164 -5.000016 +v 146.875778 -98.621353 -15.000016 +v 146.875778 -98.621353 -5.000016 +v 146.875778 -98.621353 -15.000016 +v 148.023880 -97.614502 -15.000016 +v 146.875778 -98.621353 -5.000016 +v 146.875778 -98.621353 -5.000016 +v 148.023880 -97.614502 -15.000016 +v 148.023880 -97.614502 -5.000016 +v 148.023880 -97.614502 -15.000016 +v 149.126968 -96.558533 -15.000015 +v 148.023880 -97.614502 -5.000016 +v 148.023880 -97.614502 -5.000016 +v 149.126968 -96.558533 -15.000015 +v 149.126968 -96.558533 -5.000016 +v 148.023880 -97.614502 -5.000016 +v 149.126968 -96.558533 -5.000016 +v 84.339142 -53.729961 -5.000009 +v 84.339142 -53.729961 -5.000009 +v 149.126968 -96.558533 -5.000016 +v 150.182938 -95.455460 -5.000016 +v 84.339142 -53.729961 -5.000009 +v 150.182938 -95.455460 -5.000016 +v 151.189774 -94.307365 -5.000015 +v 84.339142 -53.729961 -5.000009 +v 151.189774 -94.307365 -5.000015 +v 86.602539 -50.000000 -5.000008 +v 86.602539 -50.000000 -5.000008 +v 84.339142 -53.729961 -0.000009 +v 84.339142 -53.729961 -5.000009 +v 151.189774 -94.307365 -5.000015 +v 152.145599 -93.116447 -5.000015 +v 86.602539 -50.000000 -5.000008 +v 86.602539 -50.000000 -5.000008 +v 152.145599 -93.116447 -5.000015 +v 153.048538 -91.884979 -5.000015 +v 153.048538 -91.884979 -5.000015 +v 153.896927 -90.615288 -5.000015 +v 86.602539 -50.000000 -5.000008 +v 153.896927 -90.615288 -5.000015 +v 154.689117 -89.309799 -5.000015 +v 86.602539 -50.000000 -5.000008 +v 154.689117 -89.309799 -5.000015 +v 155.423599 -87.971001 -5.000014 +v 86.602539 -50.000000 -5.000008 +v 86.602539 -50.000000 -5.000008 +v 155.423599 -87.971001 -5.000014 +v 156.098999 -86.601433 -5.000014 +v 156.098999 -86.601433 -5.000014 +v 156.714005 -85.203720 -5.000014 +v 86.602539 -50.000000 -5.000008 +v 156.714005 -85.203720 -5.000014 +v 157.267471 -83.780502 -5.000014 +v 86.602539 -50.000000 -5.000008 +v 86.602539 -50.000000 -5.000008 +v 157.267471 -83.780502 -5.000014 +v 88.701088 -46.174862 -5.000008 +v 88.701088 -46.174862 -5.000008 +v 86.602539 -50.000000 -0.000008 +v 86.602539 -50.000000 -5.000008 +v 157.267471 -83.780502 -5.000014 +v 157.758316 -82.334503 -5.000013 +v 88.701088 -46.174862 -5.000008 +v 88.701088 -46.174862 -5.000008 +v 157.758316 -82.334503 -5.000013 +v 158.185638 -80.868469 -5.000013 +v 88.701088 -46.174862 -5.000008 +v 158.185638 -80.868469 -5.000013 +v 158.548584 -79.385185 -5.000013 +v 88.701088 -46.174862 -5.000008 +v 158.548584 -79.385185 -5.000013 +v 158.846497 -77.887482 -5.000013 +v 159.078796 -76.378220 -5.000012 +v 88.701088 -46.174862 -5.000008 +v 158.846497 -77.887482 -5.000013 +v 158.846497 -77.887482 -5.000013 +v 159.078796 -76.378220 -15.000012 +v 159.078796 -76.378220 -5.000012 +v 90.630775 -42.261829 -5.000007 +v 88.701088 -46.174862 -5.000008 +v 159.078796 -76.378220 -5.000012 +v 159.245026 -74.860252 -5.000012 +v 90.630775 -42.261829 -5.000007 +v 159.078796 -76.378220 -5.000012 +v 159.078796 -76.378220 -5.000012 +v 159.245026 -74.860252 -15.000012 +v 159.245026 -74.860252 -5.000012 +v 159.245026 -74.860252 -5.000012 +v 159.344910 -73.336479 -5.000012 +v 90.630775 -42.261829 -5.000007 +v 159.344910 -73.336479 -5.000012 +v 159.378220 -71.809799 -5.000012 +v 90.630775 -42.261829 -5.000007 +v 90.630775 -42.261829 -5.000007 +v 159.378220 -71.809799 -5.000012 +v 159.344910 -70.283119 -5.000011 +v 90.630775 -42.261829 -5.000007 +v 159.344910 -70.283119 -5.000011 +v 159.245026 -68.759354 -5.000011 +v 159.078796 -67.241386 -5.000011 +v 90.630775 -42.261829 -5.000007 +v 159.245026 -68.759354 -5.000011 +v 159.245026 -68.759354 -5.000011 +v 159.078796 -67.241386 -15.000010 +v 159.078796 -67.241386 -5.000011 +v 92.387955 -38.268341 -5.000006 +v 90.630775 -42.261829 -5.000007 +v 159.078796 -67.241386 -5.000011 +v 158.846497 -65.732117 -5.000010 +v 92.387955 -38.268341 -5.000006 +v 159.078796 -67.241386 -5.000011 +v 159.078796 -67.241386 -5.000011 +v 158.846497 -65.732117 -15.000010 +v 158.846497 -65.732117 -5.000010 +v 158.846497 -65.732117 -5.000010 +v 158.548584 -64.234413 -5.000010 +v 92.387955 -38.268341 -5.000006 +v 158.548584 -64.234413 -5.000010 +v 158.185638 -62.751137 -5.000010 +v 92.387955 -38.268341 -5.000006 +v 92.387955 -38.268341 -5.000006 +v 158.185638 -62.751137 -5.000010 +v 157.758316 -61.285099 -5.000010 +v 157.758316 -61.285099 -5.000010 +v 157.267471 -59.839096 -5.000010 +v 92.387955 -38.268341 -5.000006 +v 157.758316 -61.285099 -5.000010 +v 157.267471 -59.839092 -15.000010 +v 157.267471 -59.839096 -5.000010 +v 158.185638 -62.751137 -5.000010 +v 157.758316 -61.285095 -15.000010 +v 157.758316 -61.285099 -5.000010 +v 158.548584 -64.234413 -5.000010 +v 158.185638 -62.751133 -15.000010 +v 158.185638 -62.751137 -5.000010 +v 158.846497 -65.732117 -5.000010 +v 158.548584 -64.234413 -15.000010 +v 158.548584 -64.234413 -5.000010 +v 92.387955 -38.268341 -5.000006 +v 90.630775 -42.261829 -0.000007 +v 90.630775 -42.261829 -5.000007 +v 159.344910 -70.283119 -5.000011 +v 159.245026 -68.759354 -15.000011 +v 159.245026 -68.759354 -5.000011 +v 159.378220 -71.809799 -5.000012 +v 159.344910 -70.283119 -15.000011 +v 159.344910 -70.283119 -5.000011 +v 159.344910 -73.336479 -5.000012 +v 159.378220 -71.809799 -15.000011 +v 159.378220 -71.809799 -5.000012 +v 159.245026 -74.860252 -5.000012 +v 159.344910 -73.336479 -15.000012 +v 159.344910 -73.336479 -5.000012 +v 90.630775 -42.261829 -5.000007 +v 88.701088 -46.174862 -0.000008 +v 88.701088 -46.174862 -5.000008 +v 158.548584 -79.385185 -5.000013 +v 158.846497 -77.887482 -15.000012 +v 158.846497 -77.887482 -5.000013 +v 158.548584 -79.385185 -15.000013 +v 158.846497 -77.887482 -15.000012 +v 158.548584 -79.385185 -5.000013 +v 158.548584 -79.385185 -15.000013 +v 146.875778 -98.621353 -15.000016 +v 158.846497 -77.887482 -15.000012 +v 146.875778 -98.621353 -15.000016 +v 145.684875 -99.577164 -15.000016 +v 158.846497 -77.887482 -15.000012 +v 158.846497 -77.887482 -15.000012 +v 145.684875 -99.577164 -15.000016 +v 144.453384 -100.480125 -15.000016 +v 144.453384 -100.480125 -15.000016 +v 143.183716 -101.328499 -15.000016 +v 158.846497 -77.887482 -15.000012 +v 143.183716 -101.328499 -15.000016 +v 141.878220 -102.120689 -15.000016 +v 158.846497 -77.887482 -15.000012 +v 158.846497 -77.887482 -15.000012 +v 141.878220 -102.120689 -15.000016 +v 140.539429 -102.855179 -15.000017 +v 140.539429 -102.855179 -15.000017 +v 139.169861 -103.530571 -15.000017 +v 158.846497 -77.887482 -15.000012 +v 139.169861 -103.530571 -15.000017 +v 137.772141 -104.145584 -15.000017 +v 158.846497 -77.887482 -15.000012 +v 139.169861 -103.530571 -15.000017 +v 140.539429 -102.855179 -15.000017 +v 139.169861 -103.530571 -5.000017 +v 140.539429 -102.855179 -15.000017 +v 141.878220 -102.120689 -15.000016 +v 140.539429 -102.855179 -5.000017 +v 141.878220 -102.120689 -15.000016 +v 143.183716 -101.328499 -15.000016 +v 141.878220 -102.120689 -5.000017 +v 143.183716 -101.328499 -15.000016 +v 144.453384 -100.480125 -15.000016 +v 143.183716 -101.328499 -5.000017 +v 144.453384 -100.480125 -15.000016 +v 145.684875 -99.577164 -15.000016 +v 144.453384 -100.480125 -5.000016 +v 158.548584 -79.385185 -15.000013 +v 158.185638 -80.868469 -15.000013 +v 146.875778 -98.621353 -15.000016 +v 158.185638 -80.868469 -15.000013 +v 157.758316 -82.334503 -15.000013 +v 146.875778 -98.621353 -15.000016 +v 157.758316 -82.334503 -15.000013 +v 157.267471 -83.780502 -15.000013 +v 146.875778 -98.621353 -15.000016 +v 157.267471 -83.780502 -15.000013 +v 156.714005 -85.203720 -15.000014 +v 146.875778 -98.621353 -15.000016 +v 146.875778 -98.621353 -15.000016 +v 156.714005 -85.203720 -15.000014 +v 156.098999 -86.601433 -15.000014 +v 156.098999 -86.601433 -15.000014 +v 155.423599 -87.971001 -15.000014 +v 146.875778 -98.621353 -15.000016 +v 155.423599 -87.971001 -15.000014 +v 154.689117 -89.309799 -15.000014 +v 146.875778 -98.621353 -15.000016 +v 146.875778 -98.621353 -15.000016 +v 154.689117 -89.309799 -15.000014 +v 153.896927 -90.615288 -15.000014 +v 153.896927 -90.615288 -15.000014 +v 153.048538 -91.884979 -15.000015 +v 146.875778 -98.621353 -15.000016 +v 153.048538 -91.884979 -15.000015 +v 152.145599 -93.116447 -15.000015 +v 146.875778 -98.621353 -15.000016 +v 146.875778 -98.621353 -15.000016 +v 152.145599 -93.116447 -15.000015 +v 151.189774 -94.307365 -15.000015 +v 151.189774 -94.307365 -15.000015 +v 150.182938 -95.455460 -15.000015 +v 146.875778 -98.621353 -15.000016 +v 150.182938 -95.455460 -15.000015 +v 149.126968 -96.558533 -15.000015 +v 146.875778 -98.621353 -15.000016 +v 150.182938 -95.455460 -15.000015 +v 151.189774 -94.307365 -15.000015 +v 150.182938 -95.455460 -5.000016 +v 151.189774 -94.307365 -15.000015 +v 152.145599 -93.116447 -15.000015 +v 151.189774 -94.307365 -5.000015 +v 152.145599 -93.116447 -15.000015 +v 153.048538 -91.884979 -15.000015 +v 152.145599 -93.116447 -5.000015 +v 153.048538 -91.884979 -15.000015 +v 153.896927 -90.615288 -15.000014 +v 153.048538 -91.884979 -5.000015 +v 153.896927 -90.615288 -15.000014 +v 154.689117 -89.309799 -15.000014 +v 153.896927 -90.615288 -5.000015 +v 154.689117 -89.309799 -15.000014 +v 155.423599 -87.971001 -15.000014 +v 154.689117 -89.309799 -5.000015 +v 155.423599 -87.971001 -15.000014 +v 156.098999 -86.601433 -15.000014 +v 155.423599 -87.971001 -5.000014 +v 156.098999 -86.601433 -15.000014 +v 156.714005 -85.203720 -15.000014 +v 156.098999 -86.601433 -5.000014 +v 156.714005 -85.203720 -15.000014 +v 157.267471 -83.780502 -15.000013 +v 156.714005 -85.203720 -5.000014 +v 157.267471 -83.780502 -15.000013 +v 157.758316 -82.334503 -15.000013 +v 157.267471 -83.780502 -5.000014 +v 157.758316 -82.334503 -15.000013 +v 158.185638 -80.868469 -15.000013 +v 157.758316 -82.334503 -5.000013 +v 158.185638 -80.868469 -15.000013 +v 158.548584 -79.385185 -15.000013 +v 158.185638 -80.868469 -5.000013 +v 158.185638 -80.868469 -5.000013 +v 158.548584 -79.385185 -15.000013 +v 158.548584 -79.385185 -5.000013 +v 157.758316 -82.334503 -5.000013 +v 158.185638 -80.868469 -15.000013 +v 158.185638 -80.868469 -5.000013 +v 157.267471 -83.780502 -5.000014 +v 157.758316 -82.334503 -15.000013 +v 157.758316 -82.334503 -5.000013 +v 156.714005 -85.203720 -5.000014 +v 157.267471 -83.780502 -15.000013 +v 157.267471 -83.780502 -5.000014 +v 156.098999 -86.601433 -5.000014 +v 156.714005 -85.203720 -15.000014 +v 156.714005 -85.203720 -5.000014 +v 155.423599 -87.971001 -5.000014 +v 156.098999 -86.601433 -15.000014 +v 156.098999 -86.601433 -5.000014 +v 154.689117 -89.309799 -5.000015 +v 155.423599 -87.971001 -15.000014 +v 155.423599 -87.971001 -5.000014 +v 153.896927 -90.615288 -5.000015 +v 154.689117 -89.309799 -15.000014 +v 154.689117 -89.309799 -5.000015 +v 153.048538 -91.884979 -5.000015 +v 153.896927 -90.615288 -15.000014 +v 153.896927 -90.615288 -5.000015 +v 152.145599 -93.116447 -5.000015 +v 153.048538 -91.884979 -15.000015 +v 153.048538 -91.884979 -5.000015 +v 151.189774 -94.307365 -5.000015 +v 152.145599 -93.116447 -15.000015 +v 152.145599 -93.116447 -5.000015 +v 150.182938 -95.455460 -5.000016 +v 151.189774 -94.307365 -15.000015 +v 151.189774 -94.307365 -5.000015 +v 149.126968 -96.558533 -5.000016 +v 150.182938 -95.455460 -15.000015 +v 150.182938 -95.455460 -5.000016 +v 149.126968 -96.558533 -15.000015 +v 150.182938 -95.455460 -15.000015 +v 149.126968 -96.558533 -5.000016 +v 146.875778 -98.621353 -15.000016 +v 149.126968 -96.558533 -15.000015 +v 148.023880 -97.614502 -15.000016 +v 145.684875 -99.577164 -15.000016 +v 146.875778 -98.621353 -15.000016 +v 145.684875 -99.577164 -5.000016 +v 146.875778 -98.621353 -5.000016 +v 148.023880 -97.614502 -5.000016 +v 84.339142 -53.729961 -5.000009 +v 84.339142 -53.729961 -5.000009 +v 81.915207 -57.357643 -0.000009 +v 81.915207 -57.357643 -5.000010 +v 144.453384 -100.480125 -5.000016 +v 145.684875 -99.577164 -15.000016 +v 145.684875 -99.577164 -5.000016 +v 143.183716 -101.328499 -5.000017 +v 144.453384 -100.480125 -15.000016 +v 144.453384 -100.480125 -5.000016 +v 141.878220 -102.120689 -5.000017 +v 143.183716 -101.328499 -15.000016 +v 143.183716 -101.328499 -5.000017 +v 140.539429 -102.855179 -5.000017 +v 141.878220 -102.120689 -15.000016 +v 141.878220 -102.120689 -5.000017 +v 139.169861 -103.530571 -5.000017 +v 140.539429 -102.855179 -15.000017 +v 140.539429 -102.855179 -5.000017 +v 137.772141 -104.145584 -5.000017 +v 139.169861 -103.530571 -15.000017 +v 139.169861 -103.530571 -5.000017 +v 137.772141 -104.145584 -15.000017 +v 139.169861 -103.530571 -15.000017 +v 137.772141 -104.145584 -5.000017 +v 158.846497 -77.887482 -15.000012 +v 137.772141 -104.145584 -15.000017 +v 136.348938 -104.699036 -15.000017 +v 136.348938 -104.699036 -15.000017 +v 134.902924 -105.189888 -15.000017 +v 158.846497 -77.887482 -15.000012 +v 134.902924 -105.189888 -15.000017 +v 133.436890 -105.617203 -15.000017 +v 158.846497 -77.887482 -15.000012 +v 158.846497 -77.887482 -15.000012 +v 133.436890 -105.617203 -15.000017 +v 131.953613 -105.980156 -15.000017 +v 131.953613 -105.980156 -15.000017 +v 130.455917 -106.278069 -15.000017 +v 158.846497 -77.887482 -15.000012 +v 130.455917 -106.278069 -15.000017 +v 128.946625 -106.510368 -15.000017 +v 158.846497 -77.887482 -15.000012 +v 128.946625 -106.510368 -15.000017 +v 130.455917 -106.278069 -15.000017 +v 128.946625 -106.510368 -5.000017 +v 130.455917 -106.278069 -15.000017 +v 131.953613 -105.980156 -15.000017 +v 130.455917 -106.278069 -5.000017 +v 131.953613 -105.980156 -15.000017 +v 133.436890 -105.617203 -15.000017 +v 131.953613 -105.980156 -5.000017 +v 133.436890 -105.617203 -15.000017 +v 134.902924 -105.189888 -15.000017 +v 133.436890 -105.617203 -5.000017 +v 134.902924 -105.189888 -15.000017 +v 136.348938 -104.699036 -15.000017 +v 134.902924 -105.189888 -5.000017 +v 81.915207 -57.357643 -5.000010 +v 79.335335 -60.876141 -5.000010 +v 136.348938 -104.699036 -5.000017 +v 81.915207 -57.357643 -5.000010 +v 79.335335 -60.876141 -0.000010 +v 79.335335 -60.876141 -5.000010 +v 133.436890 -105.617203 -5.000017 +v 134.902924 -105.189888 -15.000017 +v 134.902924 -105.189888 -5.000017 +v 131.953613 -105.980156 -5.000017 +v 133.436890 -105.617203 -15.000017 +v 133.436890 -105.617203 -5.000017 +v 130.455917 -106.278069 -5.000017 +v 131.953613 -105.980156 -15.000017 +v 131.953613 -105.980156 -5.000017 +v 128.946625 -106.510368 -5.000017 +v 130.455917 -106.278069 -15.000017 +v 130.455917 -106.278069 -5.000017 +v 127.428665 -106.676613 -5.000017 +v 128.946625 -106.510368 -15.000017 +v 128.946625 -106.510368 -5.000017 +v 127.428665 -106.676613 -15.000017 +v 128.946625 -106.510368 -15.000017 +v 127.428665 -106.676613 -5.000017 +v 125.904900 -106.776489 -5.000017 +v 127.428665 -106.676613 -15.000017 +v 127.428665 -106.676613 -5.000017 +v 158.846497 -77.887482 -15.000012 +v 128.946625 -106.510368 -15.000017 +v 127.428665 -106.676613 -15.000017 +v 124.378220 -106.809799 -5.000017 +v 124.378220 -106.809799 -15.000017 +v 125.904900 -106.776489 -15.000017 +v 158.846497 -77.887482 -15.000012 +v 159.078796 -76.378220 -15.000012 +v 158.846497 -77.887482 -5.000013 +v 159.078796 -76.378220 -15.000012 +v 159.245026 -74.860252 -15.000012 +v 159.078796 -76.378220 -5.000012 +v 159.245026 -74.860252 -15.000012 +v 159.344910 -73.336479 -15.000012 +v 159.245026 -74.860252 -5.000012 +v 159.344910 -73.336479 -15.000012 +v 159.378220 -71.809799 -15.000011 +v 159.344910 -73.336479 -5.000012 +v 159.378220 -71.809799 -15.000011 +v 159.344910 -70.283119 -15.000011 +v 159.378220 -71.809799 -5.000012 +v 159.344910 -70.283119 -15.000011 +v 159.245026 -68.759354 -15.000011 +v 159.344910 -70.283119 -5.000011 +v 159.245026 -68.759354 -15.000011 +v 159.078796 -67.241386 -15.000010 +v 159.245026 -68.759354 -5.000011 +v 159.078796 -67.241386 -15.000010 +v 158.846497 -65.732117 -15.000010 +v 159.078796 -67.241386 -5.000011 +v 158.846497 -65.732117 -15.000010 +v 158.548584 -64.234413 -15.000010 +v 158.846497 -65.732117 -5.000010 +v 158.548584 -64.234413 -15.000010 +v 158.185638 -62.751133 -15.000010 +v 158.548584 -64.234413 -5.000010 +v 158.185638 -62.751133 -15.000010 +v 157.758316 -61.285095 -15.000010 +v 158.185638 -62.751137 -5.000010 +v 157.758316 -61.285095 -15.000010 +v 157.267471 -59.839092 -15.000010 +v 157.758316 -61.285099 -5.000010 +v 157.267471 -59.839092 -15.000010 +v 156.714005 -58.415874 -15.000010 +v 157.267471 -59.839096 -5.000010 +v 157.267471 -59.839096 -5.000010 +v 156.714005 -58.415874 -15.000010 +v 156.714005 -58.415878 -5.000010 +v 156.714005 -58.415874 -15.000010 +v 156.098999 -57.018158 -15.000010 +v 156.714005 -58.415878 -5.000010 +v 154.689117 -54.309795 -15.000009 +v 155.423599 -55.648594 -15.000010 +v 124.378220 -106.809799 -15.000017 +v 156.714005 -58.415878 -5.000010 +v 156.098999 -57.018158 -15.000010 +v 156.098999 -57.018162 -5.000009 +v 157.267471 -59.839096 -5.000010 +v 156.714005 -58.415878 -5.000010 +v 92.387955 -38.268341 -5.000006 +v 92.387955 -38.268341 -0.000006 +v 90.630775 -42.261829 -0.000007 +v 92.387955 -38.268341 -5.000006 +v 90.630775 -42.261829 -0.000007 +v 88.701088 -46.174862 -0.000008 +v 90.630775 -42.261829 -5.000007 +v 88.701088 -46.174862 -0.000008 +v 86.602539 -50.000000 -0.000008 +v 88.701088 -46.174862 -5.000008 +v 86.602539 -50.000000 -0.000008 +v 84.339142 -53.729961 -0.000009 +v 86.602539 -50.000000 -5.000008 +v 84.339142 -53.729961 -0.000009 +v 81.915207 -57.357643 -0.000009 +v 84.339142 -53.729961 -5.000009 +v 81.915207 -57.357643 -0.000009 +v 79.335335 -60.876141 -0.000010 +v 81.915207 -57.357643 -5.000010 +v 79.335335 -60.876141 -0.000010 +v 76.604439 -64.278763 -0.000010 +v 79.335335 -60.876141 -5.000010 +v 76.604439 -64.278763 -0.000010 +v 73.727737 -67.559021 -0.000011 +v 76.604439 -64.278763 -5.000010 +v 73.727737 -67.559021 -0.000011 +v 70.710678 -70.710678 -0.000012 +v 73.727737 -67.559021 -5.000011 +v 70.710678 -70.710678 -0.000012 +v 67.559021 -73.727737 -0.000012 +v 70.710678 -70.710678 -5.000011 +v 67.559021 -73.727737 -0.000012 +v 64.278763 -76.604439 -0.000012 +v 67.559021 -73.727737 -5.000012 +v 64.278763 -76.604439 -0.000012 +v 60.876141 -79.335335 -0.000013 +v 64.278763 -76.604439 -5.000012 +v 60.876141 -79.335335 -0.000013 +v 57.357643 -81.915207 -0.000013 +v 60.876141 -79.335335 -5.000013 +v 57.357643 -81.915207 -0.000013 +v 53.729961 -84.339142 -0.000014 +v 57.357643 -81.915207 -5.000013 +v 53.729961 -84.339142 -0.000014 +v 50.000000 -86.602539 -0.000014 +v 53.729961 -84.339142 -5.000014 +v 50.000000 -86.602539 -0.000014 +v 46.174862 -88.701088 -0.000014 +v 50.000000 -86.602539 -5.000014 +v 46.174862 -88.701088 -0.000014 +v 42.261829 -90.630775 -0.000015 +v 46.174862 -88.701088 -5.000014 +v 42.261829 -90.630775 -0.000015 +v 38.268341 -92.387955 -0.000015 +v 42.261829 -90.630775 -5.000015 +v 38.268341 -92.387955 -0.000015 +v 34.202015 -93.969261 -0.000015 +v 38.268341 -92.387955 -5.000015 +v 34.202015 -93.969261 -0.000015 +v 30.070581 -95.371696 -0.000016 +v 34.202015 -93.969261 -5.000015 +v 30.070581 -95.371696 -0.000016 +v 25.881905 -96.592583 -0.000016 +v 30.070581 -95.371696 -5.000016 +v 25.881905 -96.592583 -0.000016 +v 21.643961 -97.629601 -0.000016 +v 25.881905 -96.592583 -5.000016 +v 21.643961 -97.629601 -0.000016 +v 17.364819 -98.480774 -0.000016 +v 21.643961 -97.629601 -5.000016 +v 17.364819 -98.480774 -0.000016 +v 13.052619 -99.144485 -0.000016 +v 17.364819 -98.480774 -5.000016 +v 13.052619 -99.144485 -0.000016 +v 8.715574 -99.619469 -0.000016 +v 13.052619 -99.144485 -5.000016 +v 8.715574 -99.619469 -0.000016 +v 4.361938 -99.904823 -0.000016 +v 8.715574 -99.619469 -5.000016 +v 4.361938 -99.904823 -0.000016 +v 0.000000 -100.000000 -0.000016 +v 4.361938 -99.904823 -5.000016 +v 0.000000 -100.000000 -0.000016 +v -4.361938 -99.904823 -0.000016 +v 0.000000 -100.000000 -5.000016 +v -4.361938 -99.904823 -0.000016 +v -8.715574 -99.619469 -0.000016 +v -4.361938 -99.904823 -5.000016 +v -8.715574 -99.619469 -0.000016 +v -13.052619 -99.144485 -0.000016 +v -8.715574 -99.619469 -5.000016 +v -13.052619 -99.144485 -0.000016 +v -17.364819 -98.480774 -0.000016 +v -13.052619 -99.144485 -5.000016 +v -17.364819 -98.480774 -0.000016 +v -21.643961 -97.629601 -0.000016 +v -17.364819 -98.480774 -5.000016 +v -21.643961 -97.629601 -0.000016 +v -25.881905 -96.592583 -0.000016 +v -21.643961 -97.629601 -5.000016 +v -25.881905 -96.592583 -0.000016 +v -30.070581 -95.371696 -0.000016 +v -25.881905 -96.592583 -5.000016 +v -30.070581 -95.371696 -0.000016 +v -34.202015 -93.969261 -0.000015 +v -30.070581 -95.371696 -5.000016 +v -34.202015 -93.969261 -0.000015 +v -38.268341 -92.387955 -0.000015 +v -34.202015 -93.969261 -5.000015 +v -38.268341 -92.387955 -0.000015 +v -42.261829 -90.630775 -0.000015 +v -38.268341 -92.387955 -5.000015 +v -42.261829 -90.630775 -0.000015 +v -46.174862 -88.701088 -0.000014 +v -42.261829 -90.630775 -5.000015 +v -46.174862 -88.701088 -0.000014 +v -50.000000 -86.602539 -0.000014 +v -46.174862 -88.701088 -5.000014 +v -50.000000 -86.602539 -0.000014 +v -53.729961 -84.339142 -0.000014 +v -50.000000 -86.602539 -5.000014 +v -53.729961 -84.339142 -0.000014 +v -57.357643 -81.915207 -0.000013 +v -53.729961 -84.339142 -5.000014 +v -57.357643 -81.915207 -0.000013 +v -60.876141 -79.335335 -0.000013 +v -57.357643 -81.915207 -5.000013 +v -60.876141 -79.335335 -0.000013 +v -64.278763 -76.604439 -0.000012 +v -60.876141 -79.335335 -5.000013 +v -64.278763 -76.604439 -0.000012 +v -67.559021 -73.727737 -0.000012 +v -64.278763 -76.604439 -5.000012 +v -67.559021 -73.727737 -0.000012 +v -70.710678 -70.710678 -0.000012 +v -67.559021 -73.727737 -5.000012 +v -70.710678 -70.710678 -0.000012 +v -73.727737 -67.559021 -0.000011 +v -70.710678 -70.710678 -5.000011 +v -73.727737 -67.559021 -0.000011 +v -76.604439 -64.278763 -0.000010 +v -73.727737 -67.559021 -5.000011 +v -76.604439 -64.278763 -0.000010 +v -79.335335 -60.876141 -0.000010 +v -76.604439 -64.278763 -5.000010 +v -79.335335 -60.876141 -0.000010 +v -81.915207 -57.357643 -0.000009 +v -79.335335 -60.876141 -5.000010 +v -81.915207 -57.357643 -0.000009 +v -84.339142 -53.729961 -0.000009 +v -81.915207 -57.357643 -5.000010 +v -84.339142 -53.729961 -0.000009 +v -86.602539 -50.000000 -0.000008 +v -84.339142 -53.729961 -5.000009 +v -86.602539 -50.000000 -0.000008 +v -88.701088 -46.174862 -0.000008 +v -86.602539 -50.000000 -5.000008 +v -88.701088 -46.174862 -0.000008 +v -90.630775 -42.261829 -0.000007 +v -88.701088 -46.174862 -5.000008 +v -90.630775 -42.261829 -0.000007 +v -92.387955 -38.268341 -0.000006 +v -90.630775 -42.261829 -5.000007 +v -92.387955 -38.268341 -0.000006 +v -93.969261 -34.202015 -0.000006 +v -92.387955 -38.268341 -5.000006 +v -93.969261 -34.202015 -0.000006 +v -95.371696 -30.070581 -0.000005 +v -93.969261 -34.202015 -5.000006 +v -95.371696 -30.070581 -0.000005 +v -96.592583 -25.881905 -0.000004 +v -95.371696 -30.070581 -5.000005 +v -96.592583 -25.881905 -0.000004 +v -97.629601 -21.643961 -0.000004 +v -96.592583 -25.881905 -5.000004 +v -97.629601 -21.643961 -0.000004 +v -98.480774 -17.364819 -0.000003 +v -97.629601 -21.643961 -5.000003 +v -98.480774 -17.364819 -0.000003 +v -99.144485 -13.052619 -0.000002 +v -98.480774 -17.364819 -5.000003 +v -99.144485 -13.052619 -0.000002 +v -99.619469 -8.715574 -0.000001 +v -99.144485 -13.052618 -5.000002 +v -99.619469 -8.715574 -0.000001 +v -99.904823 -4.361938 -0.000001 +v -99.619469 -8.715573 -5.000001 +v -99.904823 -4.361938 -0.000001 +v -100.000000 0.000000 0.000000 +v -99.904823 -4.361937 -5.000000 +v -100.000000 0.000000 0.000000 +v -99.904823 4.361938 0.000001 +v -100.000000 0.000001 -5.000000 +v -99.904823 4.361938 0.000001 +v -99.619469 8.715574 0.000001 +v -99.904823 4.361939 -5.000000 +v -99.619469 8.715574 0.000001 +v -99.144485 13.052619 0.000002 +v -99.619469 8.715575 -4.999999 +v -99.144485 13.052619 0.000002 +v -98.480774 17.364819 0.000003 +v -99.144485 13.052620 -4.999998 +v -98.480774 17.364819 0.000003 +v -97.629601 21.643961 0.000004 +v -98.480774 17.364819 -4.999997 +v -97.629601 21.643961 0.000004 +v -96.592583 25.881905 0.000004 +v -97.629601 21.643961 -4.999997 +v -96.592583 25.881905 0.000004 +v -95.371696 30.070581 0.000005 +v -96.592583 25.881905 -4.999996 +v -95.371696 30.070581 0.000005 +v -93.969261 34.202015 0.000006 +v -95.371696 30.070581 -4.999995 +v -93.969261 34.202015 0.000006 +v -92.387955 38.268341 0.000006 +v -93.969261 34.202015 -4.999994 +v -92.387955 38.268341 0.000006 +v -90.630775 42.261829 0.000007 +v -92.387955 38.268341 -4.999994 +v -90.630775 42.261829 0.000007 +v -88.701088 46.174862 0.000008 +v -90.630775 42.261829 -4.999993 +v -88.701088 46.174862 0.000008 +v -86.602539 50.000000 0.000008 +v -88.701088 46.174862 -4.999992 +v -86.602539 50.000000 0.000008 +v -84.339142 53.729961 0.000009 +v -86.602539 50.000000 -4.999992 +v -84.339142 53.729961 0.000009 +v -81.915207 57.357643 0.000009 +v -84.339142 53.729961 -4.999991 +v -81.915207 57.357643 0.000009 +v -79.335335 60.876141 0.000010 +v -81.915207 57.357643 -4.999990 +v -79.335335 60.876141 0.000010 +v -76.604439 64.278763 0.000010 +v -79.335335 60.876141 -4.999990 +v -76.604439 64.278763 0.000010 +v -73.727737 67.559021 0.000011 +v -76.604439 64.278763 -4.999990 +v -73.727737 67.559021 0.000011 +v -70.710678 70.710678 0.000012 +v -73.727737 67.559021 -4.999989 +v -70.710678 70.710678 0.000012 +v -67.559021 73.727737 0.000012 +v -70.710678 70.710678 -4.999989 +v -67.559021 73.727737 0.000012 +v -64.278763 76.604439 0.000012 +v -67.559021 73.727737 -4.999988 +v -64.278763 76.604439 0.000012 +v -60.876141 79.335335 0.000013 +v -64.278763 76.604439 -4.999988 +v -60.876141 79.335335 0.000013 +v -57.357643 81.915207 0.000013 +v -60.876141 79.335335 -4.999987 +v -57.357643 81.915207 0.000013 +v -53.729961 84.339142 0.000014 +v -57.357643 81.915207 -4.999987 +v -53.729961 84.339142 0.000014 +v -50.000000 86.602539 0.000014 +v -53.729961 84.339142 -4.999986 +v -50.000000 86.602539 0.000014 +v -46.174862 88.701088 0.000014 +v -50.000000 86.602539 -4.999986 +v -46.174862 88.701088 0.000014 +v -42.261829 90.630775 0.000015 +v -46.174862 88.701088 -4.999986 +v -42.261829 90.630775 0.000015 +v -38.268341 92.387955 0.000015 +v -42.261829 90.630775 -4.999985 +v -38.268341 92.387955 0.000015 +v -34.202015 93.969261 0.000015 +v -38.268341 92.387955 -4.999985 +v -34.202015 93.969261 0.000015 +v -30.070581 95.371696 0.000016 +v -34.202015 93.969261 -4.999985 +v -30.070581 95.371696 0.000016 +v -25.881905 96.592583 0.000016 +v -30.070581 95.371696 -4.999984 +v -25.881905 96.592583 0.000016 +v -21.643961 97.629601 0.000016 +v -25.881905 96.592583 -4.999984 +v -21.643961 97.629601 0.000016 +v -17.364819 98.480774 0.000016 +v -21.643961 97.629601 -4.999984 +v -17.364819 98.480774 0.000016 +v -13.052619 99.144485 0.000016 +v -17.364819 98.480774 -4.999984 +v -13.052619 99.144485 0.000016 +v -8.715574 99.619469 0.000016 +v -13.052619 99.144485 -4.999984 +v -8.715574 99.619469 0.000016 +v -4.361938 99.904823 0.000016 +v -8.715574 99.619469 -4.999984 +v -4.361938 99.904823 0.000016 +v 0.000000 100.000000 0.000016 +v -4.361938 99.904823 -4.999984 +v 0.000000 100.000000 0.000016 +v 4.361938 99.904823 0.000016 +v 0.000000 100.000000 -4.999984 +v 4.361938 99.904823 0.000016 +v 8.715574 99.619469 0.000016 +v 4.361938 99.904823 -4.999984 +v 8.715574 99.619469 0.000016 +v 13.052619 99.144485 0.000016 +v 8.715574 99.619469 -4.999984 +v 13.052619 99.144485 0.000016 +v 17.364819 98.480774 0.000016 +v 13.052619 99.144485 -4.999984 +v 17.364819 98.480774 0.000016 +v 21.643961 97.629601 0.000016 +v 17.364819 98.480774 -4.999984 +v 21.643961 97.629601 0.000016 +v 25.881905 96.592583 0.000016 +v 21.643961 97.629601 -4.999984 +v 25.881905 96.592583 0.000016 +v 30.070581 95.371696 0.000016 +v 25.881905 96.592583 -4.999984 +v 30.070581 95.371696 0.000016 +v 34.202015 93.969261 0.000015 +v 30.070581 95.371696 -4.999984 +v 34.202015 93.969261 0.000015 +v 38.268341 92.387955 0.000015 +v 34.202015 93.969261 -4.999985 +v 38.268341 92.387955 0.000015 +v 42.261829 90.630775 0.000015 +v 38.268341 92.387955 -4.999985 +v 42.261829 90.630775 0.000015 +v 46.174862 88.701088 0.000014 +v 42.261829 90.630775 -4.999985 +v 46.174862 88.701088 0.000014 +v 50.000000 86.602539 0.000014 +v 46.174862 88.701088 -4.999986 +v 50.000000 86.602539 0.000014 +v 53.729961 84.339142 0.000014 +v 50.000000 86.602539 -4.999986 +v 53.729961 84.339142 0.000014 +v 57.357643 81.915207 0.000013 +v 53.729961 84.339142 -4.999986 +v 57.357643 81.915207 0.000013 +v 60.876141 79.335335 0.000013 +v 57.357643 81.915207 -4.999987 +v 60.876141 79.335335 0.000013 +v 64.278763 76.604439 0.000012 +v 60.876141 79.335335 -4.999987 +v 64.278763 76.604439 0.000012 +v 67.559021 73.727737 0.000012 +v 64.278763 76.604439 -4.999988 +v 67.559021 73.727737 0.000012 +v 70.710678 70.710678 0.000012 +v 67.559021 73.727737 -4.999988 +v 70.710678 70.710678 0.000012 +v 73.727737 67.559021 0.000011 +v 70.710678 70.710678 -4.999989 +v 73.727737 67.559021 0.000011 +v 76.604439 64.278763 0.000010 +v 73.727737 67.559021 -4.999989 +v 76.604439 64.278763 0.000010 +v 79.335335 60.876141 0.000010 +v 76.604439 64.278763 -4.999990 +v 79.335335 60.876141 0.000010 +v 81.915207 57.357643 0.000009 +v 79.335335 60.876141 -4.999990 +v 81.915207 57.357643 0.000009 +v 84.339142 53.729961 0.000009 +v 81.915207 57.357643 -4.999990 +v 84.339142 53.729961 0.000009 +v 86.602539 50.000000 0.000008 +v 84.339142 53.729961 -4.999991 +v 81.915207 57.357643 -4.999990 +v 84.339142 53.729961 0.000009 +v 84.339142 53.729961 -4.999991 +v 79.335335 60.876141 -4.999990 +v 81.915207 57.357643 0.000009 +v 81.915207 57.357643 -4.999990 +v 76.604439 64.278763 -4.999990 +v 79.335335 60.876141 0.000010 +v 79.335335 60.876141 -4.999990 +v 73.727737 67.559021 -4.999989 +v 76.604439 64.278763 0.000010 +v 76.604439 64.278763 -4.999990 +v 70.710678 70.710678 -4.999989 +v 73.727737 67.559021 0.000011 +v 73.727737 67.559021 -4.999989 +v 67.559021 73.727737 -4.999988 +v 70.710678 70.710678 0.000012 +v 70.710678 70.710678 -4.999989 +v 64.278763 76.604439 -4.999988 +v 67.559021 73.727737 0.000012 +v 67.559021 73.727737 -4.999988 +v 60.876141 79.335335 -4.999987 +v 64.278763 76.604439 0.000012 +v 64.278763 76.604439 -4.999988 +v 57.357643 81.915207 -4.999987 +v 60.876141 79.335335 0.000013 +v 60.876141 79.335335 -4.999987 +v 53.729961 84.339142 -4.999986 +v 57.357643 81.915207 0.000013 +v 57.357643 81.915207 -4.999987 +v 50.000000 86.602539 -4.999986 +v 53.729961 84.339142 0.000014 +v 53.729961 84.339142 -4.999986 +v 46.174862 88.701088 -4.999986 +v 50.000000 86.602539 0.000014 +v 50.000000 86.602539 -4.999986 +v 42.261829 90.630775 -4.999985 +v 46.174862 88.701088 0.000014 +v 46.174862 88.701088 -4.999986 +v 38.268341 92.387955 -4.999985 +v 42.261829 90.630775 0.000015 +v 42.261829 90.630775 -4.999985 +v 34.202015 93.969261 -4.999985 +v 38.268341 92.387955 0.000015 +v 38.268341 92.387955 -4.999985 +v 30.070581 95.371696 -4.999984 +v 34.202015 93.969261 0.000015 +v 34.202015 93.969261 -4.999985 +v 25.881905 96.592583 -4.999984 +v 30.070581 95.371696 0.000016 +v 30.070581 95.371696 -4.999984 +v 21.643961 97.629601 -4.999984 +v 25.881905 96.592583 0.000016 +v 25.881905 96.592583 -4.999984 +v 17.364819 98.480774 -4.999984 +v 21.643961 97.629601 0.000016 +v 21.643961 97.629601 -4.999984 +v 29.535435 162.398788 -4.999974 +v 28.706030 163.643692 -4.999973 +v 17.364819 98.480774 -4.999984 +v 29.535435 162.398788 -14.999973 +v 28.706030 163.643692 -14.999973 +v 29.535435 162.398788 -4.999974 +v 30.310890 161.119598 -14.999973 +v -30.310890 161.119598 -14.999973 +v 29.535435 162.398788 -14.999973 +v 30.310890 161.119598 -4.999974 +v 86.602539 50.000000 -4.999992 +v 154.689117 -54.309799 -5.000009 +v 30.310890 161.119598 -14.999973 +v 154.689117 -54.309795 -15.000009 +v -124.378220 -106.809799 -15.000017 +v 155.423599 -55.648594 -15.000010 +v 154.689117 -54.309795 -15.000009 +v 155.423599 -55.648598 -5.000009 +v 95.371696 -30.070581 -5.000005 +v 93.969261 -34.202015 -5.000006 +v 155.423599 -55.648598 -5.000009 +v 96.592583 -25.881905 -5.000004 +v 95.371696 -30.070581 -0.000005 +v 95.371696 -30.070581 -5.000005 +v 97.629601 -21.643961 -5.000003 +v 96.592583 -25.881905 -0.000004 +v 96.592583 -25.881905 -5.000004 +v 98.480774 -17.364819 -5.000003 +v 97.629601 -21.643961 -0.000004 +v 97.629601 -21.643961 -5.000003 +v 99.144485 -13.052618 -5.000002 +v 98.480774 -17.364819 -0.000003 +v 98.480774 -17.364819 -5.000003 +v 99.144485 -13.052619 -0.000002 +v 98.480774 -17.364819 -0.000003 +v 99.144485 -13.052618 -5.000002 +v 100.000000 0.000001 -5.000000 +v 99.904823 -4.361937 -5.000000 +v 154.689117 -54.309799 -5.000009 +v 99.619469 -8.715573 -5.000001 +v 99.144485 -13.052619 -0.000002 +v 99.144485 -13.052618 -5.000002 +v 98.480774 -17.364819 -0.000003 +v 99.144485 -13.052619 -0.000002 +v 0.000000 0.000000 0.000000 +v 99.904823 -4.361938 -0.000001 +v 100.000000 0.000000 0.000000 +v 0.000000 0.000000 0.000000 +v 99.904823 -4.361938 -0.000001 +v 99.619469 -8.715574 -0.000001 +v 99.904823 -4.361937 -5.000000 +vt 0.998097 0.456422 +vt 0.999524 0.478190 +vt 0.500000 0.500000 +vt 0.500000 0.500000 +vt 0.995722 0.434737 +vt 0.998097 0.456422 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.500000 0.500000 +vt 1.000000 0.500000 +vt 0.999524 0.521810 +vt 0.999524 0.521810 +vt 0.998097 0.543578 +vt 0.500000 0.500000 +vt 0.998097 0.543578 +vt 0.995722 0.565263 +vt 0.500000 0.500000 +vt 0.500000 0.500000 +vt 0.995722 0.565263 +vt 0.992404 0.586824 +vt 0.992404 0.586824 +vt 0.988148 0.608220 +vt 0.500000 0.500000 +vt 0.988148 0.608220 +vt 0.982963 0.629410 +vt 0.500000 0.500000 +vt 0.500000 0.500000 +vt 0.982963 0.629410 +vt 0.976858 0.650353 +vt 0.976858 0.650353 +vt 0.969846 0.671010 +vt 0.500000 0.500000 +vt 0.969846 0.671010 +vt 0.961940 0.691342 +vt 0.500000 0.500000 +vt 0.500000 0.500000 +vt 0.961940 0.691342 +vt 0.953154 0.711309 +vt 0.953154 0.711309 +vt 0.943505 0.730874 +vt 0.500000 0.500000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.943505 0.730874 +vt 0.933013 0.750000 +vt 0.500000 0.500000 +vt 0.500000 0.500000 +vt 0.933013 0.750000 +vt 0.921696 0.768650 +vt 0.921696 0.768650 +vt 0.909576 0.786788 +vt 0.500000 0.500000 +vt 0.909576 0.786788 +vt 0.896677 0.804381 +vt 0.500000 0.500000 +vt 0.500000 0.500000 +vt 0.896677 0.804381 +vt 0.883022 0.821394 +vt 0.883022 0.821394 +vt 0.868639 0.837795 +vt 0.500000 0.500000 +vt 0.868639 0.837795 +vt 0.853553 0.853553 +vt 0.500000 0.500000 +vt 0.500000 0.500000 +vt 0.853553 0.853553 +vt 0.837795 0.868639 +vt 0.837795 0.868639 +vt 0.821394 0.883022 +vt 0.500000 0.500000 +vt 0.821394 0.883022 +vt 0.804381 0.896677 +vt 0.500000 0.500000 +vt 0.500000 0.500000 +vt 0.804381 0.896677 +vt 0.786788 0.909576 +vt 0.786788 0.909576 +vt 0.768650 0.921696 +vt 0.500000 0.500000 +vt 0.768650 0.921696 +vt 0.750000 0.933013 +vt 0.500000 0.500000 +vt 0.500000 0.500000 +vt 0.750000 0.933013 +vt 0.730874 0.943505 +vt 0.730874 0.943505 +vt 0.711309 0.953154 +vt 0.500000 0.500000 +vt 0.711309 0.953154 +vt 0.691342 0.961940 +vt 0.500000 0.500000 +vt 0.500000 0.500000 +vt 0.691342 0.961940 +vt 0.671010 0.969846 +vt 0.671010 0.969846 +vt 0.650353 0.976858 +vt 0.500000 0.500000 +vt 0.650353 0.976858 +vt 0.629410 0.982963 +vt 0.500000 0.500000 +vt 0.500000 0.500000 +vt 0.629410 0.982963 +vt 0.608220 0.988148 +vt 0.608220 0.988148 +vt 0.586824 0.992404 +vt 0.500000 0.500000 +vt 0.586824 0.992404 +vt 0.565263 0.995722 +vt 0.500000 0.500000 +vt 0.500000 0.500000 +vt 0.565263 0.995722 +vt 0.543578 0.998097 +vt 0.543578 0.998097 +vt 0.521810 0.999524 +vt 0.500000 0.500000 +vt 0.521810 0.999524 +vt 0.500000 1.000000 +vt 0.500000 0.500000 +vt 0.500000 0.500000 +vt 0.500000 1.000000 +vt 0.478190 0.999524 +vt 0.478190 0.999524 +vt 0.456422 0.998097 +vt 0.500000 0.500000 +vt 0.456422 0.998097 +vt 0.434737 0.995722 +vt 0.500000 0.500000 +vt 0.500000 0.500000 +vt 0.434737 0.995722 +vt 0.413176 0.992404 +vt 0.413176 0.992404 +vt 0.391780 0.988148 +vt 0.500000 0.500000 +vt 0.391780 0.988148 +vt 0.370590 0.982963 +vt 0.500000 0.500000 +vt 0.500000 0.500000 +vt 0.370590 0.982963 +vt 0.349647 0.976858 +vt 0.349647 0.976858 +vt 0.328990 0.969846 +vt 0.500000 0.500000 +vt 0.328990 0.969846 +vt 0.308658 0.961940 +vt 0.500000 0.500000 +vt 0.500000 0.500000 +vt 0.308658 0.961940 +vt 0.288691 0.953154 +vt 0.288691 0.953154 +vt 0.269126 0.943505 +vt 0.500000 0.500000 +vt 0.269126 0.943505 +vt 0.250000 0.933013 +vt 0.500000 0.500000 +vt 0.500000 0.500000 +vt 0.250000 0.933013 +vt 0.231350 0.921696 +vt 0.231350 0.921696 +vt 0.213212 0.909576 +vt 0.500000 0.500000 +vt 0.213212 0.909576 +vt 0.195619 0.896677 +vt 0.500000 0.500000 +vt 0.500000 0.500000 +vt 0.195619 0.896677 +vt 0.178606 0.883022 +vt 0.178606 0.883022 +vt 0.162205 0.868639 +vt 0.500000 0.500000 +vt 0.162205 0.868639 +vt 0.146447 0.853553 +vt 0.500000 0.500000 +vt 0.500000 0.500000 +vt 0.146447 0.853553 +vt 0.131361 0.837795 +vt 0.131361 0.837795 +vt 0.116978 0.821394 +vt 0.500000 0.500000 +vt 0.116978 0.821394 +vt 0.103323 0.804381 +vt 0.500000 0.500000 +vt 0.500000 0.500000 +vt 0.103323 0.804381 +vt 0.090424 0.786788 +vt 0.090424 0.786788 +vt 0.078304 0.768650 +vt 0.500000 0.500000 +vt 0.078304 0.768650 +vt 0.066987 0.750000 +vt 0.500000 0.500000 +vt 0.500000 0.500000 +vt 0.066987 0.750000 +vt 0.056495 0.730874 +vt 0.056495 0.730874 +vt 0.046846 0.711309 +vt 0.500000 0.500000 +vt 0.046846 0.711309 +vt 0.038060 0.691342 +vt 0.500000 0.500000 +vt 0.500000 0.500000 +vt 0.038060 0.691342 +vt 0.030154 0.671010 +vt 0.030154 0.671010 +vt 0.023142 0.650353 +vt 0.500000 0.500000 +vt 0.023142 0.650353 +vt 0.017037 0.629410 +vt 0.500000 0.500000 +vt 0.500000 0.500000 +vt 0.017037 0.629410 +vt 0.011852 0.608220 +vt 0.011852 0.608220 +vt 0.007596 0.586824 +vt 0.500000 0.500000 +vt 0.007596 0.586824 +vt 0.004278 0.565263 +vt 0.500000 0.500000 +vt 0.500000 0.500000 +vt 0.004278 0.565263 +vt 0.001903 0.543578 +vt 0.001903 0.543578 +vt 0.000476 0.521810 +vt 0.500000 0.500000 +vt 0.000476 0.521810 +vt 0.000000 0.500000 +vt 0.500000 0.500000 +vt 0.500000 0.500000 +vt 0.000000 0.500000 +vt 0.000476 0.478190 +vt 0.000476 0.478190 +vt 0.001903 0.456422 +vt 0.500000 0.500000 +vt 0.001903 0.456422 +vt 0.004278 0.434737 +vt 0.500000 0.500000 +vt 0.500000 0.500000 +vt 0.004278 0.434737 +vt 0.007596 0.413176 +vt 0.007596 0.413176 +vt 0.011852 0.391780 +vt 0.500000 0.500000 +vt 0.011852 0.391780 +vt 0.017037 0.370590 +vt 0.500000 0.500000 +vt 0.500000 0.500000 +vt 0.017037 0.370590 +vt 0.023142 0.349647 +vt 0.023142 0.349647 +vt 0.030154 0.328990 +vt 0.500000 0.500000 +vt 0.030154 0.328990 +vt 0.038060 0.308658 +vt 0.500000 0.500000 +vt 0.500000 0.500000 +vt 0.038060 0.308658 +vt 0.046846 0.288691 +vt 0.046846 0.288691 +vt 0.056495 0.269126 +vt 0.500000 0.500000 +vt 0.056495 0.269126 +vt 0.066987 0.250000 +vt 0.500000 0.500000 +vt 0.500000 0.500000 +vt 0.066987 0.250000 +vt 0.078304 0.231350 +vt 0.078304 0.231350 +vt 0.090424 0.213212 +vt 0.500000 0.500000 +vt 0.090424 0.213212 +vt 0.103323 0.195619 +vt 0.500000 0.500000 +vt 0.500000 0.500000 +vt 0.103323 0.195619 +vt 0.116978 0.178606 +vt 0.116978 0.178606 +vt 0.131361 0.162205 +vt 0.500000 0.500000 +vt 0.131361 0.162205 +vt 0.146447 0.146447 +vt 0.500000 0.500000 +vt 0.500000 0.500000 +vt 0.146447 0.146447 +vt 0.162205 0.131361 +vt 0.162205 0.131361 +vt 0.178606 0.116978 +vt 0.500000 0.500000 +vt 0.178606 0.116978 +vt 0.195619 0.103323 +vt 0.500000 0.500000 +vt 0.500000 0.500000 +vt 0.195619 0.103323 +vt 0.213212 0.090424 +vt 0.213212 0.090424 +vt 0.231350 0.078304 +vt 0.500000 0.500000 +vt 0.231350 0.078304 +vt 0.250000 0.066987 +vt 0.500000 0.500000 +vt 0.500000 0.500000 +vt 0.250000 0.066987 +vt 0.269126 0.056495 +vt 0.269126 0.056495 +vt 0.288691 0.046846 +vt 0.500000 0.500000 +vt 0.288691 0.046846 +vt 0.308658 0.038060 +vt 0.500000 0.500000 +vt 0.500000 0.500000 +vt 0.308658 0.038060 +vt 0.328990 0.030154 +vt 0.328990 0.030154 +vt 0.349647 0.023142 +vt 0.500000 0.500000 +vt 0.349647 0.023142 +vt 0.370590 0.017037 +vt 0.500000 0.500000 +vt 0.500000 0.500000 +vt 0.370590 0.017037 +vt 0.391780 0.011852 +vt 0.391780 0.011852 +vt 0.413176 0.007596 +vt 0.500000 0.500000 +vt 0.413176 0.007596 +vt 0.434737 0.004278 +vt 0.500000 0.500000 +vt 0.500000 0.500000 +vt 0.434737 0.004278 +vt 0.456422 0.001903 +vt 0.456422 0.001903 +vt 0.478190 0.000476 +vt 0.500000 0.500000 +vt 0.478190 0.000476 +vt 0.500000 0.000000 +vt 0.500000 0.500000 +vt 0.500000 0.500000 +vt 0.500000 0.000000 +vt 0.521810 0.000476 +vt 0.521810 0.000476 +vt 0.543578 0.001903 +vt 0.500000 0.500000 +vt 0.543578 0.001903 +vt 0.565263 0.004278 +vt 0.500000 0.500000 +vt 0.500000 0.500000 +vt 0.565263 0.004278 +vt 0.586824 0.007596 +vt 0.586824 0.007596 +vt 0.608220 0.011852 +vt 0.500000 0.500000 +vt 0.608220 0.011852 +vt 0.629410 0.017037 +vt 0.500000 0.500000 +vt 0.500000 0.500000 +vt 0.629410 0.017037 +vt 0.650353 0.023142 +vt 0.650353 0.023142 +vt 0.671010 0.030154 +vt 0.500000 0.500000 +vt 0.671010 0.030154 +vt 0.691342 0.038060 +vt 0.500000 0.500000 +vt 0.500000 0.500000 +vt 0.691342 0.038060 +vt 0.711309 0.046846 +vt 0.711309 0.046846 +vt 0.730874 0.056495 +vt 0.500000 0.500000 +vt 0.730874 0.056495 +vt 0.750000 0.066987 +vt 0.500000 0.500000 +vt 0.500000 0.500000 +vt 0.750000 0.066987 +vt 0.768650 0.078304 +vt 0.768650 0.078304 +vt 0.786788 0.090424 +vt 0.500000 0.500000 +vt 0.786788 0.090424 +vt 0.804381 0.103323 +vt 0.500000 0.500000 +vt 0.500000 0.500000 +vt 0.804381 0.103323 +vt 0.821394 0.116978 +vt 0.821394 0.116978 +vt 0.837795 0.131361 +vt 0.500000 0.500000 +vt 0.837795 0.131361 +vt 0.853553 0.146447 +vt 0.500000 0.500000 +vt 0.500000 0.500000 +vt 0.853553 0.146447 +vt 0.868639 0.162205 +vt 0.868639 0.162205 +vt 0.883022 0.178606 +vt 0.500000 0.500000 +vt 0.883022 0.178606 +vt 0.896677 0.195619 +vt 0.500000 0.500000 +vt 0.500000 0.500000 +vt 0.896677 0.195619 +vt 0.909576 0.213212 +vt 0.909576 0.213212 +vt 0.921696 0.231350 +vt 0.500000 0.500000 +vt 0.921696 0.231350 +vt 0.933013 0.250000 +vt 0.500000 0.500000 +vt 0.500000 0.500000 +vt 0.933013 0.250000 +vt 0.943505 0.269126 +vt 0.943505 0.269126 +vt 0.953154 0.288691 +vt 0.500000 0.500000 +vt 0.953154 0.288691 +vt 0.961940 0.308658 +vt 0.500000 0.500000 +vt 0.500000 0.500000 +vt 0.961940 0.308658 +vt 0.969846 0.328990 +vt 0.969846 0.328990 +vt 0.976858 0.349647 +vt 0.500000 0.500000 +vt 0.976858 0.349647 +vt 0.982963 0.370590 +vt 0.500000 0.500000 +vt 0.500000 0.500000 +vt 0.982963 0.370590 +vt 0.988148 0.391780 +vt 0.988148 0.391780 +vt 0.992404 0.413176 +vt 0.500000 0.500000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.992404 0.413176 +vt 0.995722 0.434737 +vt 0.500000 0.500000 +vt 0.999524 0.478190 +vt 1.000000 0.500000 +vt 0.500000 0.500000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vn 0.0000 -0.0000 1.0000 +vn 0.9941 -0.1089 0.0000 +vn 0.9979 -0.0654 0.0000 +vn 0.8767 0.4810 0.0000 +vn 0.8660 0.5000 0.0000 +vn 0.8551 0.5184 0.0000 +vn 0.8549 0.5188 0.0000 +vn 0.9998 0.0218 0.0000 +vn 0.9998 -0.0218 -0.0000 +vn 0.9153 0.4028 0.0000 +vn 0.9320 0.3624 0.0000 +vn 0.9469 0.3214 0.0000 +vn 0.9600 0.2798 0.0000 +vn 0.9713 0.2377 0.0000 +vn 0.9808 0.1951 0.0000 +vn 0.9884 0.1521 0.0000 +vn 0.9941 0.1089 0.0000 +vn 0.9979 0.0654 0.0000 +vn 0.9153 0.4027 0.0000 +vn 0.8969 0.4423 0.0000 +vn 0.9808 -0.1951 0.0000 +vn 0.9713 -0.2377 0.0000 +vn 0.9600 -0.2798 0.0000 +vn 0.9469 -0.3214 0.0000 +vn 0.9320 -0.3624 0.0000 +vn -0.0000 0.0000 -1.0000 +vn 0.0654 -0.9979 0.0000 +vn 0.0218 -0.9998 0.0000 +vn 0.0000 -1.0000 0.0000 +vn -0.0214 -0.9998 0.0000 +vn -0.0641 -0.9979 0.0000 +vn -0.1067 -0.9943 0.0000 +vn -0.1490 -0.9888 0.0000 +vn -0.2329 -0.9725 0.0000 +vn -0.1912 -0.9816 0.0000 +vn -0.8202 -0.5721 0.0000 +vn -0.8439 -0.5365 0.0000 +vn -0.8660 -0.5000 0.0000 +vn -0.8866 -0.4625 0.0000 +vn -0.9056 -0.4242 0.0000 +vn -0.9385 -0.3454 0.0000 +vn -0.9228 -0.3852 0.0000 +vn -0.9587 0.2845 0.0000 +vn -0.9456 0.3252 0.0000 +vn -0.9309 0.3653 0.0000 +vn -0.9144 0.4048 0.0000 +vn -0.8963 0.4435 0.0000 +vn -0.9998 0.0218 0.0000 +vn -0.8660 0.5000 0.0000 +vn -0.8765 0.4814 0.0000 +vn -0.8551 0.5184 0.0000 +vn -0.8322 0.5545 0.0000 +vn -0.8078 0.5895 0.0000 +vn -0.7818 0.6235 0.0000 +vn -0.7257 0.6880 0.0000 +vn -0.7545 0.6563 0.0000 +vn 0.3753 0.9269 0.0000 +vn 0.4145 0.9100 0.0000 +vn 0.0654 0.9979 0.0000 +vn 0.4530 0.8915 0.0000 +vn 0.4907 0.8713 0.0000 +vn 0.5275 0.8496 0.0000 +vn 0.5981 0.8014 0.0000 +vn 0.5633 0.8262 0.0000 +vn 0.8078 0.5895 0.0000 +vn 0.8322 0.5545 0.0000 +vn 0.1521 0.9884 0.0000 +vn 0.1089 0.9941 0.0000 +vn 0.6644 0.7474 0.0000 +vn 0.6957 0.7183 0.0000 +vn 0.7257 0.6880 0.0000 +vn 0.7545 0.6563 0.0000 +vn 0.7818 0.6235 0.0000 +vn 0.6318 0.7751 0.0000 +vn 0.0218 0.9998 0.0000 +vn -0.1701 0.9854 0.0000 +vn -0.2121 0.9773 0.0000 +vn -0.2948 0.9556 0.0000 +vn 0.2948 0.9556 0.0000 +vn 0.2536 0.9673 0.0000 +vn 0.2121 0.9773 0.0000 +vn 0.1701 0.9854 0.0000 +vn 0.1279 0.9918 0.0000 +vn 0.0854 0.9963 0.0000 +vn 0.0427 0.9991 0.0000 +vn 0.0000 1.0000 0.0000 +vn -0.3753 0.9269 0.0000 +vn -0.4145 0.9100 0.0000 +vn -0.1089 0.9941 0.0000 +vn -0.6644 0.7474 0.0000 +vn -0.6318 0.7751 0.0000 +vn -0.5981 0.8014 0.0000 +vn -0.5633 0.8262 0.0000 +vn -0.5275 0.8496 0.0000 +vn -0.4907 0.8713 0.0000 +vn -0.4530 0.8915 0.0000 +vn -0.0654 0.9979 0.0000 +vn -0.3353 0.9421 0.0000 +vn -0.2536 0.9673 0.0000 +vn -0.0427 0.9991 0.0000 +vn -0.0854 0.9963 0.0000 +vn -0.1279 0.9918 0.0000 +vn -0.0218 0.9998 0.0000 +vn 0.3353 0.9421 0.0000 +vn -0.6957 0.7183 0.0000 +vn -0.1521 0.9884 0.0000 +vn -0.1951 0.9808 0.0000 +vn -0.3214 0.9469 0.0000 +vn -0.4423 0.8969 0.0000 +vn -0.5556 0.8315 0.0000 +vn -0.6593 0.7518 0.0000 +vn -0.7518 0.6593 0.0000 +vn -0.8315 0.5556 0.0000 +vn -0.8064 0.5913 0.0000 +vn -0.7799 0.6259 0.0000 +vn -0.7224 0.6915 0.0000 +vn -0.6915 0.7224 0.0000 +vn -0.6259 0.7799 0.0000 +vn -0.5913 0.8064 0.0000 +vn -0.5188 0.8549 0.0000 +vn -0.4810 0.8767 0.0000 +vn -0.4027 0.9153 0.0000 +vn -0.3624 0.9320 0.0000 +vn -0.2798 0.9600 0.0000 +vn -0.2377 0.9713 0.0000 +vn -0.8549 0.5188 0.0000 +vn -0.8767 0.4810 0.0000 +vn -0.8969 0.4423 0.0000 +vn -0.9153 0.4027 0.0000 +vn -0.9320 0.3624 0.0000 +vn -0.9469 0.3214 0.0000 +vn -0.9600 0.2798 0.0000 +vn -0.9713 0.2377 0.0000 +vn -0.9808 0.1951 0.0000 +vn -0.9884 0.1521 0.0000 +vn -0.9941 0.1089 0.0000 +vn -0.9979 0.0654 0.0000 +vn -0.9998 -0.0218 -0.0000 +vn -0.9979 -0.0654 0.0000 +vn -0.9941 -0.1089 0.0000 +vn -0.9884 -0.1521 -0.0000 +vn -0.9808 -0.1951 0.0000 +vn -0.9713 -0.2377 0.0000 +vn -0.9600 -0.2798 0.0000 +vn -0.9469 -0.3214 0.0000 +vn -0.9320 -0.3624 0.0000 +vn -0.9153 -0.4027 0.0000 +vn -0.8969 -0.4423 0.0000 +vn -0.8767 -0.4810 0.0000 +vn -0.9645 -0.2640 0.0000 +vn -0.9524 -0.3049 0.0000 +vn -0.9986 -0.0534 0.0000 +vn -0.9795 0.2016 0.0000 +vn -0.9872 0.1596 0.0000 +vn -0.9931 0.1173 0.0000 +vn -0.9972 0.0747 0.0000 +vn -0.9995 0.0321 0.0000 +vn -0.9999 -0.0107 0.0000 +vn -0.9954 -0.0960 0.0000 +vn -0.9904 -0.1385 0.0000 +vn -0.9749 -0.2225 0.0000 +vn -0.9835 -0.1807 0.0000 +vn -0.9699 0.2433 0.0000 +vn -0.9229 -0.3851 0.0000 +vn -0.8549 -0.5188 0.0000 +vn -0.6151 -0.7884 0.0000 +vn -0.5809 -0.8140 0.0000 +vn -0.3950 -0.9187 0.0000 +vn -0.3554 -0.9347 0.0000 +vn -0.3151 -0.9491 0.0000 +vn -0.8064 -0.5913 0.0000 +vn -0.4339 -0.9010 0.0000 +vn -0.4720 -0.8816 0.0000 +vn -0.5092 -0.8606 0.0000 +vn -0.5455 -0.8381 0.0000 +vn -0.8315 -0.5556 0.0000 +vn -0.6482 -0.7614 0.0000 +vn -0.6802 -0.7330 0.0000 +vn -0.7109 -0.7033 0.0000 +vn -0.7403 -0.6723 0.0000 +vn -0.7683 -0.6401 0.0000 +vn -0.7950 -0.6066 0.0000 +vn -0.7683 -0.6400 0.0000 +vn -0.6151 -0.7885 0.0000 +vn -0.5808 -0.8140 0.0000 +vn -0.2743 -0.9617 0.0000 +vn -0.7799 -0.6259 0.0000 +vn -0.7518 -0.6593 0.0000 +vn -0.6593 -0.7518 0.0000 +vn -0.5556 -0.8315 0.0000 +vn -0.4423 -0.8969 0.0000 +vn -0.3214 -0.9469 0.0000 +vn -0.1951 -0.9808 0.0000 +vn -0.0654 -0.9979 0.0000 +vn -0.1089 -0.9941 0.0000 +vn -0.1521 -0.9884 0.0000 +vn -0.2377 -0.9713 0.0000 +vn -0.2798 -0.9600 0.0000 +vn -0.3624 -0.9320 0.0000 +vn -0.4027 -0.9153 0.0000 +vn -0.4810 -0.8767 0.0000 +vn -0.5188 -0.8549 0.0000 +vn -0.5913 -0.8064 0.0000 +vn -0.6259 -0.7799 0.0000 +vn -0.6915 -0.7224 0.0000 +vn -0.7224 -0.6915 0.0000 +vn -0.0218 -0.9998 0.0000 +vn 0.1089 -0.9941 0.0000 +vn 0.1521 -0.9884 0.0000 +vn 0.1951 -0.9808 0.0000 +vn 0.2377 -0.9713 0.0000 +vn 0.2798 -0.9600 0.0000 +vn 0.3214 -0.9469 0.0000 +vn 0.3624 -0.9320 0.0000 +vn 0.4027 -0.9153 0.0000 +vn 0.4423 -0.8969 0.0000 +vn 0.4810 -0.8767 0.0000 +vn 0.5188 -0.8549 0.0000 +vn 0.5556 -0.8315 0.0000 +vn 0.5913 -0.8064 0.0000 +vn 0.6259 -0.7799 0.0000 +vn 0.6593 -0.7518 0.0000 +vn 0.6915 -0.7224 0.0000 +vn 0.7224 -0.6915 0.0000 +vn 0.7518 -0.6593 0.0000 +vn 0.7799 -0.6259 0.0000 +vn 0.6594 -0.7518 0.0000 +vn 0.8549 -0.5188 0.0000 +vn 0.8767 -0.4810 0.0000 +vn 0.9884 -0.1521 0.0000 +vn 0.9941 -0.1088 0.0000 +vn 0.9153 -0.4027 0.0000 +vn 0.8969 -0.4423 0.0000 +vn 0.8065 -0.5913 0.0000 +vn 0.8315 -0.5556 0.0000 +vn 0.9320 -0.3625 0.0000 +vn 0.7519 -0.6593 0.0000 +vn 0.5913 -0.8065 0.0000 +vn 0.4028 -0.9153 0.0000 +vn 0.8064 -0.5913 0.0000 +vn 0.9941 0.1088 0.0000 +vn 0.9601 0.2798 0.0000 +vn -0.9601 -0.2798 0.0000 +vn 0.1951 0.9808 0.0000 +vn 0.2377 0.9713 0.0000 +vn 0.2798 0.9600 0.0000 +vn 0.3214 0.9469 0.0000 +vn 0.3624 0.9320 0.0000 +vn 0.4027 0.9153 0.0000 +vn 0.4423 0.8969 0.0000 +vn 0.4810 0.8767 0.0000 +vn 0.5188 0.8549 0.0000 +vn 0.5556 0.8315 0.0000 +vn 0.5913 0.8064 0.0000 +vn 0.6259 0.7799 0.0000 +vn 0.6593 0.7518 0.0000 +vn 0.6915 0.7224 0.0000 +vn 0.7224 0.6915 0.0000 +vn 0.7518 0.6593 0.0000 +vn 0.7799 0.6259 0.0000 +vn 0.8064 0.5913 0.0000 +vn 0.8315 0.5556 0.0000 +vn 0.9601 -0.2798 0.0000 +usemtl Default_OBJ +s off +f 1/1/1 2/2/1 3/3/1 +f 4/4/1 5/5/1 6/6/1 +f 7/7/2 8/8/2 9/9/2 +f 10/10/3 11/11/3 12/12/3 +f 13/13/1 14/14/1 15/15/1 +f 16/16/1 17/17/1 18/18/1 +f 19/19/1 20/20/1 21/21/1 +f 22/22/1 23/23/1 24/24/1 +f 25/25/1 26/26/1 27/27/1 +f 28/28/1 29/29/1 30/30/1 +f 31/31/1 32/32/1 33/33/1 +f 34/34/4 35/35/4 36/36/4 +f 37/37/5 38/38/5 39/39/5 +f 40/40/5 41/41/5 42/42/5 +f 43/43/6 44/44/6 45/45/6 +f 46/46/6 47/47/6 48/48/6 +f 49/49/1 50/50/1 51/51/1 +f 52/52/1 53/53/1 54/54/1 +f 55/55/1 56/56/1 57/57/1 +f 58/58/1 59/59/1 60/60/1 +f 61/61/1 62/62/1 63/63/1 +f 64/64/1 65/65/1 66/66/1 +f 67/67/1 68/68/1 69/69/1 +f 70/70/1 71/71/1 72/72/1 +f 73/73/1 74/74/1 75/75/1 +f 76/76/1 77/77/1 78/78/1 +f 79/79/1 80/80/1 81/81/1 +f 82/82/1 83/83/1 84/84/1 +f 85/85/1 86/86/1 87/87/1 +f 88/88/1 89/89/1 90/90/1 +f 91/91/1 92/92/1 93/93/1 +f 94/94/1 95/95/1 96/96/1 +f 97/97/1 98/98/1 99/99/1 +f 100/100/1 101/101/1 102/102/1 +f 103/103/1 104/104/1 105/105/1 +f 106/106/1 107/107/1 108/108/1 +f 109/109/1 110/110/1 111/111/1 +f 112/112/7 113/113/7 114/114/7 +f 115/115/4 116/116/4 117/117/4 +f 118/118/4 119/119/4 120/120/4 +f 121/121/1 122/122/1 123/123/1 +f 124/124/1 125/125/1 126/126/1 +f 127/127/1 128/128/1 129/129/1 +f 130/130/1 131/131/1 132/132/1 +f 133/133/1 134/134/1 135/135/1 +f 136/136/1 137/137/1 138/138/1 +f 139/139/1 140/140/1 141/141/1 +f 142/142/1 143/143/1 144/144/1 +f 145/145/1 146/146/1 147/147/1 +f 148/148/1 149/149/1 150/150/1 +f 151/151/1 152/152/1 153/153/1 +f 154/154/1 155/155/1 156/156/1 +f 157/157/8 158/158/8 159/159/8 +f 160/160/9 161/161/9 162/162/9 +f 163/163/9 164/164/9 165/165/9 +f 166/166/8 167/167/8 168/168/8 +f 169/169/1 170/170/1 171/171/1 +f 172/172/1 173/173/1 174/174/1 +f 175/175/1 176/176/1 177/177/1 +f 178/178/1 179/179/1 180/180/1 +f 181/181/1 182/182/1 183/183/1 +f 184/184/1 185/185/1 186/186/1 +f 187/187/1 188/188/1 189/189/1 +f 190/190/1 191/191/1 192/192/1 +f 193/193/1 194/194/1 195/195/1 +f 196/196/1 197/197/1 198/198/1 +f 199/199/1 200/200/1 201/201/1 +f 202/202/10 203/203/10 204/204/10 +f 205/205/11 206/206/11 207/207/11 +f 208/208/12 209/209/12 210/210/12 +f 211/211/13 212/212/13 213/213/13 +f 214/214/14 215/215/14 216/216/14 +f 217/217/15 218/218/15 219/219/15 +f 220/220/16 221/221/16 222/222/16 +f 223/223/17 224/224/17 225/225/17 +f 226/226/18 227/227/18 228/228/18 +f 229/229/18 230/230/18 231/231/18 +f 232/232/17 233/233/17 234/234/17 +f 235/235/16 236/236/16 237/237/16 +f 238/238/15 239/239/15 240/240/15 +f 241/241/14 242/242/14 243/243/14 +f 244/244/13 245/245/13 246/246/13 +f 247/247/12 248/248/12 249/249/12 +f 250/250/11 251/251/11 252/252/11 +f 253/253/19 254/254/19 255/255/19 +f 256/256/20 257/257/20 258/258/20 +f 259/259/20 260/260/20 261/261/20 +f 262/262/1 263/263/1 264/264/1 +f 265/265/1 266/266/1 267/267/1 +f 268/268/1 269/269/1 270/270/1 +f 271/271/1 272/272/1 273/273/1 +f 274/274/1 275/275/1 276/276/1 +f 277/277/1 278/278/1 279/279/1 +f 280/280/1 281/281/1 282/282/1 +f 283/283/1 284/284/1 285/285/1 +f 286/286/1 287/287/1 288/288/1 +f 289/289/1 290/290/1 291/291/1 +f 292/292/1 293/293/1 294/294/1 +f 295/295/1 296/296/1 297/297/1 +f 298/298/1 299/299/1 300/300/1 +f 301/301/1 302/302/1 303/303/1 +f 304/304/1 305/305/1 306/306/1 +f 307/307/1 308/308/1 309/309/1 +f 310/310/1 311/311/1 312/312/1 +f 313/313/1 314/314/1 315/315/1 +f 316/316/1 317/317/1 318/318/1 +f 319/319/1 320/320/1 321/321/1 +f 322/322/1 323/323/1 324/324/1 +f 325/325/1 326/326/1 327/327/1 +f 328/328/1 329/329/1 330/330/1 +f 331/331/1 332/332/1 333/333/1 +f 334/334/1 335/335/1 336/336/1 +f 337/337/1 338/338/1 339/339/1 +f 340/340/1 341/341/1 342/342/1 +f 343/343/1 344/344/1 345/345/1 +f 346/346/1 347/347/1 348/348/1 +f 349/349/1 350/350/1 351/351/1 +f 352/352/1 353/353/1 354/354/1 +f 355/355/1 356/356/1 357/357/1 +f 358/358/1 359/359/1 360/360/1 +f 361/361/1 362/362/1 363/363/1 +f 364/364/1 365/365/1 366/366/1 +f 367/367/1 368/368/1 369/369/1 +f 370/370/1 371/371/1 372/372/1 +f 373/373/1 374/374/1 375/375/1 +f 376/376/1 377/377/1 378/378/1 +f 379/379/1 380/380/1 381/381/1 +f 382/382/1 383/383/1 384/384/1 +f 385/385/1 386/386/1 387/387/1 +f 388/388/1 389/389/1 390/390/1 +f 391/391/1 392/392/1 393/393/1 +f 394/394/1 395/395/1 396/396/1 +f 397/397/1 398/398/1 399/399/1 +f 400/400/1 401/401/1 402/402/1 +f 403/403/1 404/404/1 405/405/1 +f 406/406/1 407/407/1 408/408/1 +f 409/409/1 410/410/1 411/411/1 +f 412/412/1 413/413/1 414/414/1 +f 415/415/1 416/416/1 417/417/1 +f 418/418/1 419/419/1 420/420/1 +f 421/421/1 422/422/1 423/423/1 +f 424/424/1 425/425/1 426/426/1 +f 427/427/1 428/428/1 429/429/1 +f 430/430/1 431/431/1 432/432/1 +f 433/433/1 434/434/1 435/435/1 +f 436/436/1 437/437/1 438/438/1 +f 439/439/1 440/440/1 441/441/1 +f 442/442/1 443/443/1 444/444/1 +f 445/445/1 446/446/1 447/447/1 +f 448/448/1 449/449/1 450/450/1 +f 451/451/1 452/452/1 453/453/1 +f 454/454/1 455/455/1 456/456/1 +f 457/457/1 458/458/1 459/459/1 +f 460/460/1 461/461/1 462/462/1 +f 463/463/1 464/464/1 465/465/1 +f 466/466/1 467/467/1 468/468/1 +f 469/469/1 470/470/1 471/471/1 +f 472/472/1 473/473/1 474/474/1 +f 475/475/1 476/476/1 477/477/1 +f 478/478/1 479/479/1 480/480/1 +f 481/481/1 482/482/1 483/483/1 +f 484/484/1 485/485/1 486/486/1 +f 487/487/1 488/488/1 489/489/1 +f 490/490/1 491/491/1 492/492/1 +f 493/493/1 494/494/1 495/495/1 +f 496/496/1 497/497/1 498/498/1 +f 499/499/1 500/500/1 501/501/1 +f 502/502/1 503/503/1 504/504/1 +f 505/505/1 506/506/1 507/507/1 +f 508/508/1 509/509/1 510/510/1 +f 511/511/1 512/512/1 513/513/1 +f 514/514/1 515/515/1 516/516/1 +f 517/517/1 518/518/1 519/519/1 +f 520/520/1 521/521/1 522/522/1 +f 523/523/1 524/524/1 525/525/1 +f 526/526/1 527/527/1 528/528/1 +f 529/529/1 530/530/1 531/531/1 +f 532/532/1 533/533/1 534/534/1 +f 535/535/1 536/536/1 537/537/1 +f 538/538/1 539/539/1 540/540/1 +f 541/541/1 542/542/1 543/543/1 +f 544/544/1 545/545/1 546/546/1 +f 547/547/1 548/548/1 549/549/1 +f 550/550/1 551/551/1 552/552/1 +f 553/553/1 554/554/1 555/555/1 +f 556/556/1 557/557/1 558/558/1 +f 559/559/1 560/560/1 561/561/1 +f 562/562/1 563/563/1 564/564/1 +f 565/565/1 566/566/1 567/567/1 +f 568/568/1 569/569/1 570/570/1 +f 571/571/1 572/572/1 573/573/1 +f 574/574/1 575/575/1 576/576/1 +f 577/577/1 578/578/1 579/579/1 +f 580/580/1 581/581/1 582/582/1 +f 583/583/1 584/584/1 585/585/1 +f 586/586/1 587/587/1 588/588/1 +f 589/589/1 590/590/1 591/591/1 +f 592/592/1 593/593/1 594/594/1 +f 595/595/1 596/596/1 597/597/1 +f 598/598/1 599/599/1 600/600/1 +f 601/601/1 602/602/1 603/603/1 +f 604/604/1 605/605/1 606/606/1 +f 607/607/1 608/608/1 609/609/1 +f 610/610/1 611/611/1 612/612/1 +f 613/613/1 614/614/1 615/615/1 +f 616/616/1 617/617/1 618/618/1 +f 619/619/1 620/620/1 621/621/1 +f 622/622/1 623/623/1 624/624/1 +f 625/625/1 626/626/1 627/627/1 +f 628/628/1 629/629/1 630/630/1 +f 631/631/1 632/632/1 633/633/1 +f 634/634/1 635/635/1 636/636/1 +f 637/637/1 638/638/1 639/639/1 +f 640/640/1 641/641/1 642/642/1 +f 643/643/1 644/644/1 645/645/1 +f 646/646/1 647/647/1 648/648/1 +f 649/649/21 650/650/21 651/651/21 +f 652/652/22 653/653/22 654/654/22 +f 655/655/23 656/656/23 657/657/23 +f 658/658/24 659/659/24 660/660/24 +f 661/661/24 662/662/24 663/663/24 +f 664/664/25 665/665/25 666/666/25 +f 667/667/25 668/668/25 669/669/25 +f 670/670/1 671/671/1 672/672/1 +f 673/673/1 674/674/1 675/675/1 +f 676/676/1 677/677/1 678/678/1 +f 679/679/20 680/680/20 681/681/20 +f 682/682/20 683/683/20 684/684/20 +f 685/685/26 686/686/26 687/687/26 +f 688/688/26 689/689/26 690/690/26 +f 691/691/26 692/692/26 693/693/26 +f 694/694/26 695/695/26 696/696/26 +f 697/697/26 698/698/26 699/699/26 +f 700/700/26 701/701/26 702/702/26 +f 703/703/26 704/704/26 705/705/26 +f 706/706/26 707/707/26 708/708/26 +f 709/709/26 710/710/26 711/711/26 +f 712/712/26 713/713/26 714/714/26 +f 715/715/26 716/716/26 717/717/26 +f 718/718/26 719/719/26 720/720/26 +f 721/721/26 722/722/26 723/723/26 +f 724/724/26 725/725/26 726/726/26 +f 727/727/26 728/728/26 729/729/26 +f 730/730/26 731/731/26 732/732/26 +f 733/733/26 734/734/26 735/735/26 +f 736/736/27 737/737/27 738/738/27 +f 739/739/28 740/740/28 741/741/28 +f 742/742/1 743/743/1 744/744/1 +f 745/745/1 746/746/1 747/747/1 +f 748/748/1 749/749/1 750/750/1 +f 751/751/1 752/752/1 753/753/1 +f 754/754/1 755/755/1 756/756/1 +f 757/757/1 758/758/1 759/759/1 +f 760/760/1 761/761/1 762/762/1 +f 763/763/1 764/764/1 765/765/1 +f 766/766/1 767/767/1 768/768/1 +f 769/769/1 770/770/1 771/771/1 +f 772/772/1 773/773/1 774/774/1 +f 775/775/1 776/776/1 777/777/1 +f 778/778/1 779/779/1 780/780/1 +f 781/781/1 782/782/1 783/783/1 +f 784/784/1 785/785/1 786/786/1 +f 787/787/1 788/788/1 789/789/1 +f 790/790/1 791/791/1 792/792/1 +f 793/793/1 794/794/1 795/795/1 +f 796/796/1 797/797/1 798/798/1 +f 799/799/1 800/800/1 801/801/1 +f 802/802/1 803/803/1 804/804/1 +f 805/805/1 806/806/1 807/807/1 +f 808/808/29 809/809/29 810/810/29 +f 811/811/29 812/812/29 813/813/29 +f 814/814/26 815/815/26 816/816/26 +f 817/817/30 818/818/30 819/819/30 +f 820/820/1 821/821/1 822/822/1 +f 823/823/1 824/824/1 825/825/1 +f 826/826/1 827/827/1 828/828/1 +f 829/829/31 830/830/31 831/831/31 +f 832/832/31 833/833/31 834/834/31 +f 835/835/32 836/836/32 837/837/32 +f 838/838/32 839/839/32 840/840/32 +f 841/841/33 842/842/33 843/843/33 +f 844/844/1 845/845/1 846/846/1 +f 847/847/1 848/848/1 849/849/1 +f 850/850/1 851/851/1 852/852/1 +f 853/853/34 854/854/34 855/855/34 +f 856/856/35 857/857/35 858/858/35 +f 859/859/26 860/860/26 861/861/26 +f 862/862/26 863/863/26 864/864/26 +f 865/865/26 866/866/26 867/867/26 +f 868/868/26 869/869/26 870/870/26 +f 871/871/26 872/872/26 873/873/26 +f 874/874/26 875/875/26 876/876/26 +f 877/877/26 878/878/26 879/879/26 +f 880/880/26 881/881/26 882/882/26 +f 883/883/26 884/884/26 885/885/26 +f 886/886/26 887/887/26 888/888/26 +f 889/889/26 890/890/26 891/891/26 +f 892/892/26 893/893/26 894/894/26 +f 895/895/26 896/896/26 897/897/26 +f 898/898/26 899/899/26 900/900/26 +f 901/901/26 902/902/26 903/903/26 +f 904/904/26 905/905/26 906/906/26 +f 907/907/26 908/908/26 909/909/26 +f 910/910/26 911/911/26 912/912/26 +f 913/913/26 914/914/26 915/915/26 +f 916/916/36 917/917/36 918/918/36 +f 919/919/37 920/920/37 921/921/37 +f 922/922/1 923/923/1 924/924/1 +f 925/925/1 926/926/1 927/927/1 +f 928/928/38 929/929/38 930/930/38 +f 931/931/38 932/932/38 933/933/38 +f 934/934/39 935/935/39 936/936/39 +f 937/937/39 938/938/39 939/939/39 +f 940/940/40 941/941/40 942/942/40 +f 943/943/1 944/944/1 945/945/1 +f 946/946/1 947/947/1 948/948/1 +f 949/949/1 950/950/1 951/951/1 +f 952/952/41 953/953/41 954/954/41 +f 955/955/42 956/956/42 957/957/42 +f 958/958/26 959/959/26 960/960/26 +f 961/961/26 962/962/26 963/963/26 +f 964/964/26 965/965/26 966/966/26 +f 967/967/26 968/968/26 969/969/26 +f 970/970/43 971/971/43 972/972/43 +f 973/973/44 974/974/44 975/975/44 +f 976/976/1 977/977/1 978/978/1 +f 979/979/1 980/980/1 981/981/1 +f 982/982/45 983/983/45 984/984/45 +f 985/985/45 986/986/45 987/987/45 +f 988/988/46 989/989/46 990/990/46 +f 991/991/46 992/992/46 993/993/46 +f 994/994/47 995/995/47 996/996/47 +f 997/997/1 998/998/1 999/999/1 +f 1000/1000/1 1001/1001/1 1002/1002/1 +f 1003/1003/1 1004/1004/1 1005/1005/1 +f 1006/1006/1 1007/1007/1 1008/1008/1 +f 1009/1009/1 1010/1010/1 1011/1011/1 +f 1012/1012/1 1013/1013/1 1014/1014/1 +f 1015/1015/1 1016/1016/1 1017/1017/1 +f 1018/1018/1 1019/1019/1 1020/1020/1 +f 1021/1021/1 1022/1022/1 1023/1023/1 +f 1024/1024/1 1025/1025/1 1026/1026/1 +f 1027/1027/1 1028/1028/1 1029/1029/1 +f 1030/1030/48 1031/1031/48 1032/1032/48 +f 1033/1033/1 1034/1034/1 1035/1035/1 +f 1036/1036/1 1037/1037/1 1038/1038/1 +f 1039/1039/1 1040/1040/1 1041/1041/1 +f 1042/1042/1 1043/1043/1 1044/1044/1 +f 1045/1045/1 1046/1046/1 1047/1047/1 +f 1048/1048/1 1049/1049/1 1050/1050/1 +f 1051/1051/1 1052/1052/1 1053/1053/1 +f 1054/1054/1 1055/1055/1 1056/1056/1 +f 1057/1057/1 1058/1058/1 1059/1059/1 +f 1060/1060/1 1061/1061/1 1062/1062/1 +f 1063/1063/1 1064/1064/1 1065/1065/1 +f 1066/1066/1 1067/1067/1 1068/1068/1 +f 1069/1069/49 1070/1070/49 1071/1071/49 +f 1072/1072/50 1073/1073/50 1074/1074/50 +f 1075/1075/26 1076/1076/26 1077/1077/26 +f 1078/1078/26 1079/1079/26 1080/1080/26 +f 1081/1081/49 1082/1082/49 1083/1083/49 +f 1084/1084/26 1085/1085/26 1086/1086/26 +f 1087/1087/51 1088/1088/51 1089/1089/51 +f 1090/1090/1 1091/1091/1 1092/1092/1 +f 1093/1093/1 1094/1094/1 1095/1095/1 +f 1096/1096/1 1097/1097/1 1098/1098/1 +f 1099/1099/52 1100/1100/52 1101/1101/52 +f 1102/1102/52 1103/1103/52 1104/1104/52 +f 1105/1105/53 1106/1106/53 1107/1107/53 +f 1108/1108/53 1109/1109/53 1110/1110/53 +f 1111/1111/54 1112/1112/54 1113/1113/54 +f 1114/1114/1 1115/1115/1 1116/1116/1 +f 1117/1117/1 1118/1118/1 1119/1119/1 +f 1120/1120/1 1121/1121/1 1122/1122/1 +f 1123/1123/55 1124/1124/55 1125/1125/55 +f 1126/1126/56 1127/1127/56 1128/1128/56 +f 1129/1129/26 1130/1130/26 1131/1131/26 +f 1132/1132/26 1133/1133/26 1134/1134/26 +f 1135/1135/26 1136/1136/26 1137/1137/26 +f 1138/1138/26 1139/1139/26 1140/1140/26 +f 1141/1141/26 1142/1142/26 1143/1143/26 +f 1144/1144/26 1145/1145/26 1146/1146/26 +f 1147/1147/26 1148/1148/26 1149/1149/26 +f 1150/1150/26 1151/1151/26 1152/1152/26 +f 1153/1153/26 1154/1154/26 1155/1155/26 +f 1156/1156/26 1157/1157/26 1158/1158/26 +f 1159/1159/26 1160/1160/26 1161/1161/26 +f 1162/1162/26 1163/1163/26 1164/1164/26 +f 1165/1165/26 1166/1166/26 1167/1167/26 +f 1168/1168/26 1169/1169/26 1170/1170/26 +f 1171/1171/26 1172/1172/26 1173/1173/26 +f 1174/1174/57 1175/1175/57 1176/1176/57 +f 1177/1177/58 1178/1178/58 1179/1179/58 +f 1180/1180/1 1181/1181/1 1182/1182/1 +f 1183/1183/1 1184/1184/1 1185/1185/1 +f 1186/1186/59 1187/1187/59 1188/1188/59 +f 1189/1189/1 1190/1190/1 1191/1191/1 +f 1192/1192/60 1193/1193/60 1194/1194/60 +f 1195/1195/60 1196/1196/60 1197/1197/60 +f 1198/1198/61 1199/1199/61 1200/1200/61 +f 1201/1201/61 1202/1202/61 1203/1203/61 +f 1204/1204/62 1205/1205/62 1206/1206/62 +f 1207/1207/1 1208/1208/1 1209/1209/1 +f 1210/1210/1 1211/1211/1 1212/1212/1 +f 1213/1213/1 1214/1214/1 1215/1215/1 +f 1216/1216/63 1217/1217/63 1218/1218/63 +f 1219/1219/64 1220/1220/64 1221/1221/64 +f 1222/1222/26 1223/1223/26 1224/1224/26 +f 1225/1225/26 1226/1226/26 1227/1227/26 +f 1228/1228/26 1229/1229/26 1230/1230/26 +f 1231/1231/26 1232/1232/26 1233/1233/26 +f 1234/1234/26 1235/1235/26 1236/1236/26 +f 1237/1237/26 1238/1238/26 1239/1239/26 +f 1240/1240/26 1241/1241/26 1242/1242/26 +f 1243/1243/26 1244/1244/26 1245/1245/26 +f 1246/1246/26 1247/1247/26 1248/1248/26 +f 1249/1249/26 1250/1250/26 1251/1251/26 +f 1252/1252/26 1253/1253/26 1254/1254/26 +f 1255/1255/65 1256/1256/65 1257/1257/65 +f 1258/1258/66 1259/1259/66 1260/1260/66 +f 1261/1261/65 1262/1262/65 1263/1263/65 +f 1264/1264/1 1265/1265/1 1266/1266/1 +f 1267/1267/1 1268/1268/1 1269/1269/1 +f 1270/1270/67 1271/1271/67 1272/1272/67 +f 1273/1273/1 1274/1274/1 1275/1275/1 +f 1276/1276/1 1277/1277/1 1278/1278/1 +f 1279/1279/1 1280/1280/1 1281/1281/1 +f 1282/1282/1 1283/1283/1 1284/1284/1 +f 1285/1285/1 1286/1286/1 1287/1287/1 +f 1288/1288/1 1289/1289/1 1290/1290/1 +f 1291/1291/68 1292/1292/68 1293/1293/68 +f 1294/1294/69 1295/1295/69 1296/1296/69 +f 1297/1297/70 1298/1298/70 1299/1299/70 +f 1300/1300/71 1301/1301/71 1302/1302/71 +f 1303/1303/72 1304/1304/72 1305/1305/72 +f 1306/1306/73 1307/1307/73 1308/1308/73 +f 1309/1309/73 1310/1310/73 1311/1311/73 +f 1312/1312/72 1313/1313/72 1314/1314/72 +f 1315/1315/71 1316/1316/71 1317/1317/71 +f 1318/1318/70 1319/1319/70 1320/1320/70 +f 1321/1321/69 1322/1322/69 1323/1323/69 +f 1324/1324/74 1325/1325/74 1326/1326/74 +f 1327/1327/74 1328/1328/74 1329/1329/74 +f 1330/1330/63 1331/1331/63 1332/1332/63 +f 1333/1333/1 1334/1334/1 1335/1335/1 +f 1336/1336/64 1337/1337/64 1338/1338/64 +f 1339/1339/62 1340/1340/62 1341/1341/62 +f 1342/1342/26 1343/1343/26 1344/1344/26 +f 1345/1345/26 1346/1346/26 1347/1347/26 +f 1348/1348/26 1349/1349/26 1350/1350/26 +f 1351/1351/26 1352/1352/26 1353/1353/26 +f 1354/1354/1 1355/1355/1 1356/1356/1 +f 1357/1357/1 1358/1358/1 1359/1359/1 +f 1360/1360/1 1361/1361/1 1362/1362/1 +f 1363/1363/1 1364/1364/1 1365/1365/1 +f 1366/1366/1 1367/1367/1 1368/1368/1 +f 1369/1369/1 1370/1370/1 1371/1371/1 +f 1372/1372/1 1373/1373/1 1374/1374/1 +f 1375/1375/75 1376/1376/75 1377/1377/75 +f 1378/1378/1 1379/1379/1 1380/1380/1 +f 1381/1381/1 1382/1382/1 1383/1383/1 +f 1384/1384/1 1385/1385/1 1386/1386/1 +f 1387/1387/1 1388/1388/1 1389/1389/1 +f 1390/1390/1 1391/1391/1 1392/1392/1 +f 1393/1393/1 1394/1394/1 1395/1395/1 +f 1396/1396/1 1397/1397/1 1398/1398/1 +f 1399/1399/1 1400/1400/1 1401/1401/1 +f 1402/1402/1 1403/1403/1 1404/1404/1 +f 1405/1405/76 1406/1406/76 1407/1407/76 +f 1408/1408/77 1409/1409/77 1410/1410/77 +f 1411/1411/77 1412/1412/77 1413/1413/77 +f 1414/1414/1 1415/1415/1 1416/1416/1 +f 1417/1417/1 1418/1418/1 1419/1419/1 +f 1420/1420/1 1421/1421/1 1422/1422/1 +f 1423/1423/78 1424/1424/78 1425/1425/78 +f 1426/1426/78 1427/1427/78 1428/1428/78 +f 1429/1429/26 1430/1430/26 1431/1431/26 +f 1432/1432/26 1433/1433/26 1434/1434/26 +f 1435/1435/26 1436/1436/26 1437/1437/26 +f 1438/1438/26 1439/1439/26 1440/1440/26 +f 1441/1441/26 1442/1442/26 1443/1443/26 +f 1444/1444/79 1445/1445/79 1446/1446/79 +f 1447/1447/80 1448/1448/80 1449/1449/80 +f 1450/1450/81 1451/1451/81 1452/1452/81 +f 1453/1453/82 1454/1454/82 1455/1455/82 +f 1456/1456/26 1457/1457/26 1458/1458/26 +f 1459/1459/26 1460/1460/26 1461/1461/26 +f 1462/1462/83 1463/1463/83 1464/1464/83 +f 1465/1465/26 1466/1466/26 1467/1467/26 +f 1468/1468/84 1469/1469/84 1470/1470/84 +f 1471/1471/26 1472/1472/26 1473/1473/26 +f 1474/1474/85 1475/1475/85 1476/1476/85 +f 1477/1477/26 1478/1478/26 1479/1479/26 +f 1480/1480/86 1481/1481/86 1482/1482/86 +f 1483/1483/1 1484/1484/1 1485/1485/1 +f 1486/1486/1 1487/1487/1 1488/1488/1 +f 1489/1489/87 1490/1490/87 1491/1491/87 +f 1492/1492/1 1493/1493/1 1494/1494/1 +f 1495/1495/1 1496/1496/1 1497/1497/1 +f 1498/1498/88 1499/1499/88 1500/1500/88 +f 1501/1501/1 1502/1502/1 1503/1503/1 +f 1504/1504/1 1505/1505/1 1506/1506/1 +f 1507/1507/1 1508/1508/1 1509/1509/1 +f 1510/1510/1 1511/1511/1 1512/1512/1 +f 1513/1513/1 1514/1514/1 1515/1515/1 +f 1516/1516/1 1517/1517/1 1518/1518/1 +f 1519/1519/89 1520/1520/89 1521/1521/89 +f 1522/1522/1 1523/1523/1 1524/1524/1 +f 1525/1525/1 1526/1526/1 1527/1527/1 +f 1528/1528/90 1529/1529/90 1530/1530/90 +f 1531/1531/91 1532/1532/91 1533/1533/91 +f 1534/1534/92 1535/1535/92 1536/1536/92 +f 1537/1537/93 1538/1538/93 1539/1539/93 +f 1540/1540/94 1541/1541/94 1542/1542/94 +f 1543/1543/95 1544/1544/95 1545/1545/95 +f 1546/1546/96 1547/1547/96 1548/1548/96 +f 1549/1549/97 1550/1550/97 1551/1551/97 +f 1552/1552/98 1553/1553/98 1554/1554/98 +f 1555/1555/99 1556/1556/99 1557/1557/99 +f 1558/1558/99 1559/1559/99 1560/1560/99 +f 1561/1561/26 1562/1562/26 1563/1563/26 +f 1564/1564/26 1565/1565/26 1566/1566/26 +f 1567/1567/26 1568/1568/26 1569/1569/26 +f 1570/1570/26 1571/1571/26 1572/1572/26 +f 1573/1573/100 1574/1574/100 1575/1575/100 +f 1576/1576/101 1577/1577/101 1578/1578/101 +f 1579/1579/102 1580/1580/102 1581/1581/102 +f 1582/1582/76 1583/1583/76 1584/1584/76 +f 1585/1585/1 1586/1586/1 1587/1587/1 +f 1588/1588/103 1589/1589/103 1590/1590/103 +f 1591/1591/102 1592/1592/102 1593/1593/102 +f 1594/1594/101 1595/1595/101 1596/1596/101 +f 1597/1597/100 1598/1598/100 1599/1599/100 +f 1600/1600/86 1601/1601/86 1602/1602/86 +f 1603/1603/85 1604/1604/85 1605/1605/85 +f 1606/1606/84 1607/1607/84 1608/1608/84 +f 1609/1609/83 1610/1610/83 1611/1611/83 +f 1612/1612/82 1613/1613/82 1614/1614/82 +f 1615/1615/81 1616/1616/81 1617/1617/81 +f 1618/1618/80 1619/1619/80 1620/1620/80 +f 1621/1621/79 1622/1622/79 1623/1623/79 +f 1624/1624/104 1625/1625/104 1626/1626/104 +f 1627/1627/104 1628/1628/104 1629/1629/104 +f 1630/1630/58 1631/1631/58 1632/1632/58 +f 1633/1633/57 1634/1634/57 1635/1635/57 +f 1636/1636/26 1637/1637/26 1638/1638/26 +f 1639/1639/98 1640/1640/98 1641/1641/98 +f 1642/1642/87 1643/1643/87 1644/1644/87 +f 1645/1645/88 1646/1646/88 1647/1647/88 +f 1648/1648/96 1649/1649/96 1650/1650/96 +f 1651/1651/95 1652/1652/95 1653/1653/95 +f 1654/1654/94 1655/1655/94 1656/1656/94 +f 1657/1657/93 1658/1658/93 1659/1659/93 +f 1660/1660/92 1661/1661/92 1662/1662/92 +f 1663/1663/91 1664/1664/91 1665/1665/91 +f 1666/1666/90 1667/1667/90 1668/1668/90 +f 1669/1669/105 1670/1670/105 1671/1671/105 +f 1672/1672/105 1673/1673/105 1674/1674/105 +f 1675/1675/55 1676/1676/55 1677/1677/55 +f 1678/1678/1 1679/1679/1 1680/1680/1 +f 1681/1681/56 1682/1682/56 1683/1683/56 +f 1684/1684/1 1685/1685/1 1686/1686/1 +f 1687/1687/106 1688/1688/106 1689/1689/106 +f 1690/1690/54 1691/1691/54 1692/1692/54 +f 1693/1693/26 1694/1694/26 1695/1695/26 +f 1696/1696/26 1697/1697/26 1698/1698/26 +f 1699/1699/1 1700/1700/1 1701/1701/1 +f 1702/1702/107 1703/1703/107 1704/1704/107 +f 1705/1705/1 1706/1706/1 1707/1707/1 +f 1708/1708/1 1709/1709/1 1710/1710/1 +f 1711/1711/1 1712/1712/1 1713/1713/1 +f 1714/1714/108 1715/1715/108 1716/1716/108 +f 1717/1717/1 1718/1718/1 1719/1719/1 +f 1720/1720/1 1721/1721/1 1722/1722/1 +f 1723/1723/1 1724/1724/1 1725/1725/1 +f 1726/1726/109 1727/1727/109 1728/1728/109 +f 1729/1729/1 1730/1730/1 1731/1731/1 +f 1732/1732/1 1733/1733/1 1734/1734/1 +f 1735/1735/1 1736/1736/1 1737/1737/1 +f 1738/1738/110 1739/1739/110 1740/1740/110 +f 1741/1741/1 1742/1742/1 1743/1743/1 +f 1744/1744/1 1745/1745/1 1746/1746/1 +f 1747/1747/1 1748/1748/1 1749/1749/1 +f 1750/1750/111 1751/1751/111 1752/1752/111 +f 1753/1753/1 1754/1754/1 1755/1755/1 +f 1756/1756/1 1757/1757/1 1758/1758/1 +f 1759/1759/1 1760/1760/1 1761/1761/1 +f 1762/1762/112 1763/1763/112 1764/1764/112 +f 1765/1765/1 1766/1766/1 1767/1767/1 +f 1768/1768/1 1769/1769/1 1770/1770/1 +f 1771/1771/1 1772/1772/1 1773/1773/1 +f 1774/1774/113 1775/1775/113 1776/1776/113 +f 1777/1777/114 1778/1778/114 1779/1779/114 +f 1780/1780/115 1781/1781/115 1782/1782/115 +f 1783/1783/116 1784/1784/116 1785/1785/116 +f 1786/1786/117 1787/1787/117 1788/1788/117 +f 1789/1789/118 1790/1790/118 1791/1791/118 +f 1792/1792/119 1793/1793/119 1794/1794/119 +f 1795/1795/120 1796/1796/120 1797/1797/120 +f 1798/1798/121 1799/1799/121 1800/1800/121 +f 1801/1801/122 1802/1802/122 1803/1803/122 +f 1804/1804/123 1805/1805/123 1806/1806/123 +f 1807/1807/124 1808/1808/124 1809/1809/124 +f 1810/1810/125 1811/1811/125 1812/1812/125 +f 1813/1813/51 1814/1814/51 1815/1815/51 +f 1816/1816/1 1817/1817/1 1818/1818/1 +f 1819/1819/126 1820/1820/126 1821/1821/126 +f 1822/1822/127 1823/1823/127 1824/1824/127 +f 1825/1825/128 1826/1826/128 1827/1827/128 +f 1828/1828/129 1829/1829/129 1830/1830/129 +f 1831/1831/130 1832/1832/130 1833/1833/130 +f 1834/1834/131 1835/1835/131 1836/1836/131 +f 1837/1837/132 1838/1838/132 1839/1839/132 +f 1840/1840/133 1841/1841/133 1842/1842/133 +f 1843/1843/134 1844/1844/134 1845/1845/134 +f 1846/1846/135 1847/1847/135 1848/1848/135 +f 1849/1849/136 1850/1850/136 1851/1851/136 +f 1852/1852/137 1853/1853/137 1854/1854/137 +f 1855/1855/138 1856/1856/138 1857/1857/138 +f 1858/1858/139 1859/1859/139 1860/1860/139 +f 1861/1861/140 1862/1862/140 1863/1863/140 +f 1864/1864/141 1865/1865/141 1866/1866/141 +f 1867/1867/142 1868/1868/142 1869/1869/142 +f 1870/1870/143 1871/1871/143 1872/1872/143 +f 1873/1873/144 1874/1874/144 1875/1875/144 +f 1876/1876/145 1877/1877/145 1878/1878/145 +f 1879/1879/50 1880/1880/50 1881/1881/50 +f 1882/1882/1 1883/1883/1 1884/1884/1 +f 1885/1885/146 1886/1886/146 1887/1887/146 +f 1888/1888/47 1889/1889/47 1890/1890/47 +f 1891/1891/26 1892/1892/26 1893/1893/26 +f 1894/1894/26 1895/1895/26 1896/1896/26 +f 1897/1897/26 1898/1898/26 1899/1899/26 +f 1900/1900/26 1901/1901/26 1902/1902/26 +f 1903/1903/1 1904/1904/1 1905/1905/1 +f 1906/1906/1 1907/1907/1 1908/1908/1 +f 1909/1909/1 1910/1910/1 1911/1911/1 +f 1912/1912/1 1913/1913/1 1914/1914/1 +f 1915/1915/1 1916/1916/1 1917/1917/1 +f 1918/1918/147 1919/1919/147 1920/1920/147 +f 1921/1921/1 1922/1922/1 1923/1923/1 +f 1924/1924/1 1925/1925/1 1926/1926/1 +f 1927/1927/1 1928/1928/1 1929/1929/1 +f 1930/1930/1 1931/1931/1 1932/1932/1 +f 1933/1933/1 1934/1934/1 1935/1935/1 +f 1936/1936/1 1937/1937/1 1938/1938/1 +f 1939/1939/1 1940/1940/1 1941/1941/1 +f 1942/1942/1 1943/1943/1 1944/1944/1 +f 1945/1945/148 1946/1946/148 1947/1947/148 +f 1948/1948/1 1949/1949/1 1950/1950/1 +f 1951/1951/1 1952/1952/1 1953/1953/1 +f 1954/1954/1 1955/1955/1 1956/1956/1 +f 1957/1957/1 1958/1958/1 1959/1959/1 +f 1960/1960/1 1961/1961/1 1962/1962/1 +f 1963/1963/149 1964/1964/149 1965/1965/149 +f 1966/1966/150 1967/1967/150 1968/1968/150 +f 1969/1969/151 1970/1970/151 1971/1971/151 +f 1972/1972/151 1973/1973/151 1974/1974/151 +f 1975/1975/26 1976/1976/26 1977/1977/26 +f 1978/1978/26 1979/1979/26 1980/1980/26 +f 1981/1981/26 1982/1982/26 1983/1983/26 +f 1984/1984/26 1985/1985/26 1986/1986/26 +f 1987/1987/152 1988/1988/152 1989/1989/152 +f 1990/1990/26 1991/1991/26 1992/1992/26 +f 1993/1993/26 1994/1994/26 1995/1995/26 +f 1996/1996/26 1997/1997/26 1998/1998/26 +f 1999/1999/26 2000/2000/26 2001/2001/26 +f 2002/2002/26 2003/2003/26 2004/2004/26 +f 2005/2005/26 2006/2006/26 2007/2007/26 +f 2008/2008/153 2009/2009/153 2010/2010/153 +f 2011/2011/154 2012/2012/154 2013/2013/154 +f 2014/2014/155 2015/2015/155 2016/2016/155 +f 2017/2017/156 2018/2018/156 2019/2019/156 +f 2020/2020/157 2021/2021/157 2022/2022/157 +f 2023/2023/158 2024/2024/158 2025/2025/158 +f 2026/2026/159 2027/2027/159 2028/2028/159 +f 2029/2029/160 2030/2030/160 2031/2031/160 +f 2032/2032/26 2033/2033/26 2034/2034/26 +f 2035/2035/26 2036/2036/26 2037/2037/26 +f 2038/2038/161 2039/2039/161 2040/2040/161 +f 2041/2041/162 2042/2042/162 2043/2043/162 +f 2044/2044/150 2045/2045/150 2046/2046/150 +f 2047/2047/161 2048/2048/161 2049/2049/161 +f 2050/2050/162 2051/2051/162 2052/2052/162 +f 2053/2053/160 2054/2054/160 2055/2055/160 +f 2056/2056/159 2057/2057/159 2058/2058/159 +f 2059/2059/152 2060/2060/152 2061/2061/152 +f 2062/2062/158 2063/2063/158 2064/2064/158 +f 2065/2065/157 2066/2066/157 2067/2067/157 +f 2068/2068/156 2069/2069/156 2070/2070/156 +f 2071/2071/155 2072/2072/155 2073/2073/155 +f 2074/2074/154 2075/2075/154 2076/2076/154 +f 2077/2077/153 2078/2078/153 2079/2079/153 +f 2080/2080/163 2081/2081/163 2082/2082/163 +f 2083/2083/163 2084/2084/163 2085/2085/163 +f 2086/2086/44 2087/2087/44 2088/2088/44 +f 2089/2089/43 2090/2090/43 2091/2091/43 +f 2092/2092/26 2093/2093/26 2094/2094/26 +f 2095/2095/41 2096/2096/41 2097/2097/41 +f 2098/2098/1 2099/2099/1 2100/2100/1 +f 2101/2101/164 2102/2102/164 2103/2103/164 +f 2104/2104/40 2105/2105/40 2106/2106/40 +f 2107/2107/26 2108/2108/26 2109/2109/26 +f 2110/2110/26 2111/2111/26 2112/2112/26 +f 2113/2113/1 2114/2114/1 2115/2115/1 +f 2116/2116/1 2117/2117/1 2118/2118/1 +f 2119/2119/1 2120/2120/1 2121/2121/1 +f 2122/2122/1 2123/2123/1 2124/2124/1 +f 2125/2125/1 2126/2126/1 2127/2127/1 +f 2128/2128/165 2129/2129/165 2130/2130/165 +f 2131/2131/1 2132/2132/1 2133/2133/1 +f 2134/2134/1 2135/2135/1 2136/2136/1 +f 2137/2137/1 2138/2138/1 2139/2139/1 +f 2140/2140/1 2141/2141/1 2142/2142/1 +f 2143/2143/1 2144/2144/1 2145/2145/1 +f 2146/2146/166 2147/2147/166 2148/2148/166 +f 2149/2149/1 2150/2150/1 2151/2151/1 +f 2152/2152/1 2153/2153/1 2154/2154/1 +f 2155/2155/167 2156/2156/167 2157/2157/167 +f 2158/2158/1 2159/2159/1 2160/2160/1 +f 2161/2161/1 2162/2162/1 2163/2163/1 +f 2164/2164/1 2165/2165/1 2166/2166/1 +f 2167/2167/1 2168/2168/1 2169/2169/1 +f 2170/2170/1 2171/2171/1 2172/2172/1 +f 2173/2173/168 2174/2174/168 2175/2175/168 +f 2176/2176/1 2177/2177/1 2178/2178/1 +f 2179/2179/1 2180/2180/1 2181/2181/1 +f 2182/2182/169 2183/2183/169 2184/2184/169 +f 2185/2185/1 2186/2186/1 2187/2187/1 +f 2188/2188/170 2189/2189/170 2190/2190/170 +f 2191/2191/171 2192/2192/171 2193/2193/171 +f 2194/2194/172 2195/2195/172 2196/2196/172 +f 2197/2197/173 2198/2198/173 2199/2199/173 +f 2200/2200/174 2201/2201/174 2202/2202/174 +f 2203/2203/175 2204/2204/175 2205/2205/175 +f 2206/2206/176 2207/2207/176 2208/2208/176 +f 2209/2209/177 2210/2210/177 2211/2211/177 +f 2212/2212/178 2213/2213/178 2214/2214/178 +f 2215/2215/179 2216/2216/179 2217/2217/179 +f 2218/2218/180 2219/2219/180 2220/2220/180 +f 2221/2221/181 2222/2222/181 2223/2223/181 +f 2224/2224/182 2225/2225/182 2226/2226/182 +f 2227/2227/37 2228/2228/37 2229/2229/37 +f 2230/2230/36 2231/2231/36 2232/2232/36 +f 2233/2233/26 2234/2234/26 2235/2235/26 +f 2236/2236/182 2237/2237/182 2238/2238/182 +f 2239/2239/183 2240/2240/183 2241/2241/183 +f 2242/2242/180 2243/2243/180 2244/2244/180 +f 2245/2245/179 2246/2246/179 2247/2247/179 +f 2248/2248/178 2249/2249/178 2250/2250/178 +f 2251/2251/177 2252/2252/177 2253/2253/177 +f 2254/2254/184 2255/2255/184 2256/2256/184 +f 2257/2257/185 2258/2258/185 2259/2259/185 +f 2260/2260/175 2261/2261/175 2262/2262/175 +f 2263/2263/174 2264/2264/174 2265/2265/174 +f 2266/2266/173 2267/2267/173 2268/2268/173 +f 2269/2269/172 2270/2270/172 2271/2271/172 +f 2272/2272/168 2273/2273/168 2274/2274/168 +f 2275/2275/169 2276/2276/169 2277/2277/169 +f 2278/2278/170 2279/2279/170 2280/2280/170 +f 2281/2281/186 2282/2282/186 2283/2283/186 +f 2284/2284/186 2285/2285/186 2286/2286/186 +f 2287/2287/26 2288/2288/26 2289/2289/26 +f 2290/2290/34 2291/2291/34 2292/2292/34 +f 2293/2293/1 2294/2294/1 2295/2295/1 +f 2296/2296/35 2297/2297/35 2298/2298/35 +f 2299/2299/1 2300/2300/1 2301/2301/1 +f 2302/2302/187 2303/2303/187 2304/2304/187 +f 2305/2305/33 2306/2306/33 2307/2307/33 +f 2308/2308/26 2309/2309/26 2310/2310/26 +f 2311/2311/26 2312/2312/26 2313/2313/26 +f 2314/2314/26 2315/2315/26 2316/2316/26 +f 2317/2317/1 2318/2318/1 2319/2319/1 +f 2320/2320/188 2321/2321/188 2322/2322/188 +f 2323/2323/1 2324/2324/1 2325/2325/1 +f 2326/2326/1 2327/2327/1 2328/2328/1 +f 2329/2329/1 2330/2330/1 2331/2331/1 +f 2332/2332/189 2333/2333/189 2334/2334/189 +f 2335/2335/1 2336/2336/1 2337/2337/1 +f 2338/2338/1 2339/2339/1 2340/2340/1 +f 2341/2341/1 2342/2342/1 2343/2343/1 +f 2344/2344/190 2345/2345/190 2346/2346/190 +f 2347/2347/1 2348/2348/1 2349/2349/1 +f 2350/2350/1 2351/2351/1 2352/2352/1 +f 2353/2353/1 2354/2354/1 2355/2355/1 +f 2356/2356/191 2357/2357/191 2358/2358/191 +f 2359/2359/1 2360/2360/1 2361/2361/1 +f 2362/2362/1 2363/2363/1 2364/2364/1 +f 2365/2365/1 2366/2366/1 2367/2367/1 +f 2368/2368/192 2369/2369/192 2370/2370/192 +f 2371/2371/1 2372/2372/1 2373/2373/1 +f 2374/2374/1 2375/2375/1 2376/2376/1 +f 2377/2377/1 2378/2378/1 2379/2379/1 +f 2380/2380/193 2381/2381/193 2382/2382/193 +f 2383/2383/1 2384/2384/1 2385/2385/1 +f 2386/2386/1 2387/2387/1 2388/2388/1 +f 2389/2389/1 2390/2390/1 2391/2391/1 +f 2392/2392/194 2393/2393/194 2394/2394/194 +f 2395/2395/195 2396/2396/195 2397/2397/195 +f 2398/2398/196 2399/2399/196 2400/2400/196 +f 2401/2401/197 2402/2402/197 2403/2403/197 +f 2404/2404/198 2405/2405/198 2406/2406/198 +f 2407/2407/199 2408/2408/199 2409/2409/199 +f 2410/2410/200 2411/2411/200 2412/2412/200 +f 2413/2413/201 2414/2414/201 2415/2415/201 +f 2416/2416/202 2417/2417/202 2418/2418/202 +f 2419/2419/203 2420/2420/203 2421/2421/203 +f 2422/2422/204 2423/2423/204 2424/2424/204 +f 2425/2425/205 2426/2426/205 2427/2427/205 +f 2428/2428/206 2429/2429/206 2430/2430/206 +f 2431/2431/30 2432/2432/30 2433/2433/30 +f 2434/2434/1 2435/2435/1 2436/2436/1 +f 2437/2437/207 2438/2438/207 2439/2439/207 +f 2440/2440/28 2441/2441/28 2442/2442/28 +f 2443/2443/27 2444/2444/27 2445/2445/27 +f 2446/2446/208 2447/2447/208 2448/2448/208 +f 2449/2449/209 2450/2450/209 2451/2451/209 +f 2452/2452/210 2453/2453/210 2454/2454/210 +f 2455/2455/211 2456/2456/211 2457/2457/211 +f 2458/2458/212 2459/2459/212 2460/2460/212 +f 2461/2461/213 2462/2462/213 2463/2463/213 +f 2464/2464/214 2465/2465/214 2466/2466/214 +f 2467/2467/215 2468/2468/215 2469/2469/215 +f 2470/2470/216 2471/2471/216 2472/2472/216 +f 2473/2473/217 2474/2474/217 2475/2475/217 +f 2476/2476/218 2477/2477/218 2478/2478/218 +f 2479/2479/219 2480/2480/219 2481/2481/219 +f 2482/2482/220 2483/2483/220 2484/2484/220 +f 2485/2485/221 2486/2486/221 2487/2487/221 +f 2488/2488/222 2489/2489/222 2490/2490/222 +f 2491/2491/223 2492/2492/223 2493/2493/223 +f 2494/2494/224 2495/2495/224 2496/2496/224 +f 2497/2497/225 2498/2498/225 2499/2499/225 +f 2500/2500/1 2501/2501/1 2502/2502/1 +f 2503/2503/1 2504/2504/1 2505/2505/1 +f 2506/2506/226 2507/2507/226 2508/2508/226 +f 2509/2509/1 2510/2510/1 2511/2511/1 +f 2512/2512/1 2513/2513/1 2514/2514/1 +f 2515/2515/1 2516/2516/1 2517/2517/1 +f 2518/2518/1 2519/2519/1 2520/2520/1 +f 2521/2521/1 2522/2522/1 2523/2523/1 +f 2524/2524/1 2525/2525/1 2526/2526/1 +f 2527/2527/213 2528/2528/213 2529/2529/213 +f 2530/2530/214 2531/2531/214 2532/2532/214 +f 2533/2533/214 2534/2534/214 2535/2535/214 +f 2536/2536/1 2537/2537/1 2538/2538/1 +f 2539/2539/1 2540/2540/1 2541/2541/1 +f 2542/2542/1 2543/2543/1 2544/2544/1 +f 2545/2545/1 2546/2546/1 2547/2547/1 +f 2548/2548/1 2549/2549/1 2550/2550/1 +f 2551/2551/1 2552/2552/1 2553/2553/1 +f 2554/2554/1 2555/2555/1 2556/2556/1 +f 2557/2557/1 2558/2558/1 2559/2559/1 +f 2560/2560/1 2561/2561/1 2562/2562/1 +f 2563/2563/221 2564/2564/221 2565/2565/221 +f 2566/2566/222 2567/2567/222 2568/2568/222 +f 2569/2569/227 2570/2570/227 2571/2571/227 +f 2572/2572/223 2573/2573/223 2574/2574/223 +f 2575/2575/223 2576/2576/223 2577/2577/223 +f 2578/2578/1 2579/2579/1 2580/2580/1 +f 2581/2581/1 2582/2582/1 2583/2583/1 +f 2584/2584/1 2585/2585/1 2586/2586/1 +f 2587/2587/1 2588/2588/1 2589/2589/1 +f 2590/2590/228 2591/2591/228 2592/2592/228 +f 2593/2593/1 2594/2594/1 2595/2595/1 +f 2596/2596/1 2597/2597/1 2598/2598/1 +f 2599/2599/1 2600/2600/1 2601/2601/1 +f 2602/2602/1 2603/2603/1 2604/2604/1 +f 2605/2605/1 2606/2606/1 2607/2607/1 +f 2608/2608/1 2609/2609/1 2610/2610/1 +f 2611/2611/1 2612/2612/1 2613/2613/1 +f 2614/2614/1 2615/2615/1 2616/2616/1 +f 2617/2617/1 2618/2618/1 2619/2619/1 +f 2620/2620/229 2621/2621/229 2622/2622/229 +f 2623/2623/1 2624/2624/1 2625/2625/1 +f 2626/2626/1 2627/2627/1 2628/2628/1 +f 2629/2629/1 2630/2630/1 2631/2631/1 +f 2632/2632/1 2633/2633/1 2634/2634/1 +f 2635/2635/1 2636/2636/1 2637/2637/1 +f 2638/2638/230 2639/2639/230 2640/2640/230 +f 2641/2641/1 2642/2642/1 2643/2643/1 +f 2644/2644/1 2645/2645/1 2646/2646/1 +f 2647/2647/231 2648/2648/231 2649/2649/231 +f 2650/2650/1 2651/2651/1 2652/2652/1 +f 2653/2653/1 2654/2654/1 2655/2655/1 +f 2656/2656/1 2657/2657/1 2658/2658/1 +f 2659/2659/1 2660/2660/1 2661/2661/1 +f 2662/2662/1 2663/2663/1 2664/2664/1 +f 2665/2665/17 2666/2666/17 2667/2667/17 +f 2668/2668/1 2669/2669/1 2670/2670/1 +f 2671/2671/1 2672/2672/1 2673/2673/1 +f 2674/2674/16 2675/2675/16 2676/2676/16 +f 2677/2677/1 2678/2678/1 2679/2679/1 +f 2680/2680/1 2681/2681/1 2682/2682/1 +f 2683/2683/1 2684/2684/1 2685/2685/1 +f 2686/2686/1 2687/2687/1 2688/2688/1 +f 2689/2689/12 2690/2690/12 2691/2691/12 +f 2692/2692/13 2693/2693/13 2694/2694/13 +f 2695/2695/14 2696/2696/14 2697/2697/14 +f 2698/2698/15 2699/2699/15 2700/2700/15 +f 2701/2701/232 2702/2702/232 2703/2703/232 +f 2704/2704/18 2705/2705/18 2706/2706/18 +f 2707/2707/8 2708/2708/8 2709/2709/8 +f 2710/2710/9 2711/2711/9 2712/2712/9 +f 2713/2713/3 2714/2714/3 2715/2715/3 +f 2716/2716/233 2717/2717/233 2718/2718/233 +f 2719/2719/21 2720/2720/21 2721/2721/21 +f 2722/2722/21 2723/2723/21 2724/2724/21 +f 2725/2725/26 2726/2726/26 2727/2727/26 +f 2728/2728/26 2729/2729/26 2730/2730/26 +f 2731/2731/26 2732/2732/26 2733/2733/26 +f 2734/2734/26 2735/2735/26 2736/2736/26 +f 2737/2737/26 2738/2738/26 2739/2739/26 +f 2740/2740/26 2741/2741/26 2742/2742/26 +f 2743/2743/26 2744/2744/26 2745/2745/26 +f 2746/2746/26 2747/2747/26 2748/2748/26 +f 2749/2749/216 2750/2750/216 2751/2751/216 +f 2752/2752/217 2753/2753/217 2754/2754/217 +f 2755/2755/218 2756/2756/218 2757/2757/218 +f 2758/2758/219 2759/2759/219 2760/2760/219 +f 2761/2761/220 2762/2762/220 2763/2763/220 +f 2764/2764/26 2765/2765/26 2766/2766/26 +f 2767/2767/26 2768/2768/26 2769/2769/26 +f 2770/2770/26 2771/2771/26 2772/2772/26 +f 2773/2773/26 2774/2774/26 2775/2775/26 +f 2776/2776/26 2777/2777/26 2778/2778/26 +f 2779/2779/26 2780/2780/26 2781/2781/26 +f 2782/2782/26 2783/2783/26 2784/2784/26 +f 2785/2785/26 2786/2786/26 2787/2787/26 +f 2788/2788/26 2789/2789/26 2790/2790/26 +f 2791/2791/26 2792/2792/26 2793/2793/26 +f 2794/2794/26 2795/2795/26 2796/2796/26 +f 2797/2797/26 2798/2798/26 2799/2799/26 +f 2800/2800/26 2801/2801/26 2802/2802/26 +f 2803/2803/225 2804/2804/225 2805/2805/225 +f 2806/2806/226 2807/2807/226 2808/2808/226 +f 2809/2809/234 2810/2810/234 2811/2811/234 +f 2812/2812/235 2813/2813/235 2814/2814/235 +f 2815/2815/228 2816/2816/228 2817/2817/228 +f 2818/2818/229 2819/2819/229 2820/2820/229 +f 2821/2821/233 2822/2822/233 2823/2823/233 +f 2824/2824/232 2825/2825/232 2826/2826/232 +f 2827/2827/236 2828/2828/236 2829/2829/236 +f 2830/2830/24 2831/2831/24 2832/2832/24 +f 2833/2833/23 2834/2834/23 2835/2835/23 +f 2836/2836/22 2837/2837/22 2838/2838/22 +f 2839/2839/22 2840/2840/22 2841/2841/22 +f 2842/2842/23 2843/2843/23 2844/2844/23 +f 2845/2845/24 2846/2846/24 2847/2847/24 +f 2848/2848/25 2849/2849/25 2850/2850/25 +f 2851/2851/232 2852/2852/232 2853/2853/232 +f 2854/2854/233 2855/2855/233 2856/2856/233 +f 2857/2857/229 2858/2858/229 2859/2859/229 +f 2860/2860/228 2861/2861/228 2862/2862/228 +f 2863/2863/235 2864/2864/235 2865/2865/235 +f 2866/2866/234 2867/2867/234 2868/2868/234 +f 2869/2869/226 2870/2870/226 2871/2871/226 +f 2872/2872/237 2873/2873/237 2874/2874/237 +f 2875/2875/224 2876/2876/224 2877/2877/224 +f 2878/2878/224 2879/2879/224 2880/2880/224 +f 2881/2881/26 2882/2882/26 2883/2883/26 +f 2884/2884/221 2885/2885/221 2886/2886/221 +f 2887/2887/1 2888/2888/1 2889/2889/1 +f 2890/2890/235 2891/2891/235 2892/2892/235 +f 2893/2893/238 2894/2894/238 2895/2895/238 +f 2896/2896/219 2897/2897/219 2898/2898/219 +f 2899/2899/218 2900/2900/218 2901/2901/218 +f 2902/2902/217 2903/2903/217 2904/2904/217 +f 2905/2905/216 2906/2906/216 2907/2907/216 +f 2908/2908/239 2909/2909/239 2910/2910/239 +f 2911/2911/215 2912/2912/215 2913/2913/215 +f 2914/2914/26 2915/2915/26 2916/2916/26 +f 2917/2917/26 2918/2918/26 2919/2919/26 +f 2920/2920/26 2921/2921/26 2922/2922/26 +f 2923/2923/26 2924/2924/26 2925/2925/26 +f 2926/2926/26 2927/2927/26 2928/2928/26 +f 2929/2929/26 2930/2930/26 2931/2931/26 +f 2932/2932/209 2933/2933/209 2934/2934/209 +f 2935/2935/210 2936/2936/210 2937/2937/210 +f 2938/2938/211 2939/2939/211 2940/2940/211 +f 2941/2941/212 2942/2942/212 2943/2943/212 +f 2944/2944/213 2945/2945/213 2946/2946/213 +f 2947/2947/1 2948/2948/1 2949/2949/1 +f 2950/2950/240 2951/2951/240 2952/2952/240 +f 2953/2953/212 2954/2954/212 2955/2955/212 +f 2956/2956/211 2957/2957/211 2958/2958/211 +f 2959/2959/210 2960/2960/210 2961/2961/210 +f 2962/2962/209 2963/2963/209 2964/2964/209 +f 2965/2965/208 2966/2966/208 2967/2967/208 +f 2968/2968/208 2969/2969/208 2970/2970/208 +f 2971/2971/27 2972/2972/27 2973/2973/27 +f 2974/2974/26 2975/2975/26 2976/2976/26 +f 2977/2977/28 2978/2978/28 2979/2979/28 +f 2980/2980/230 2981/2981/230 2982/2982/230 +f 2983/2983/2 2984/2984/2 2985/2985/2 +f 2986/2986/3 2987/2987/3 2988/2988/3 +f 2989/2989/9 2990/2990/9 2991/2991/9 +f 2992/2992/8 2993/2993/8 2994/2994/8 +f 2995/2995/18 2996/2996/18 2997/2997/18 +f 2998/2998/241 2999/2999/241 3000/3000/241 +f 3001/3001/16 3002/3002/16 3003/3003/16 +f 3004/3004/15 3005/3005/15 3006/3006/15 +f 3007/3007/14 3008/3008/14 3009/3009/14 +f 3010/3010/242 3011/3011/242 3012/3012/242 +f 3013/3013/12 3014/3014/12 3015/3015/12 +f 3016/3016/11 3017/3017/11 3018/3018/11 +f 3019/3019/11 3020/3020/11 3021/3021/11 +f 3022/3022/19 3023/3023/19 3024/3024/19 +f 3025/3025/26 3026/3026/26 3027/3027/26 +f 3028/3028/19 3029/3029/19 3030/3030/19 +f 3031/3031/1 3032/3032/1 3033/3033/1 +f 3034/3034/232 3035/3035/232 3036/3036/232 +f 3037/3037/233 3038/3038/233 3039/3039/233 +f 3040/3040/229 3041/3041/229 3042/3042/229 +f 3043/3043/228 3044/3044/228 3045/3045/228 +f 3046/3046/235 3047/3047/235 3048/3048/235 +f 3049/3049/240 3050/3050/240 3051/3051/240 +f 3052/3052/226 3053/3053/226 3054/3054/226 +f 3055/3055/225 3056/3056/225 3057/3057/225 +f 3058/3058/224 3059/3059/224 3060/3060/224 +f 3061/3061/223 3062/3062/223 3063/3063/223 +f 3064/3064/222 3065/3065/222 3066/3066/222 +f 3067/3067/221 3068/3068/221 3069/3069/221 +f 3070/3070/220 3071/3071/220 3072/3072/220 +f 3073/3073/219 3074/3074/219 3075/3075/219 +f 3076/3076/218 3077/3077/218 3078/3078/218 +f 3079/3079/217 3080/3080/217 3081/3081/217 +f 3082/3082/216 3083/3083/216 3084/3084/216 +f 3085/3085/215 3086/3086/215 3087/3087/215 +f 3088/3088/214 3089/3089/214 3090/3090/214 +f 3091/3091/213 3092/3092/213 3093/3093/213 +f 3094/3094/212 3095/3095/212 3096/3096/212 +f 3097/3097/211 3098/3098/211 3099/3099/211 +f 3100/3100/210 3101/3101/210 3102/3102/210 +f 3103/3103/209 3104/3104/209 3105/3105/209 +f 3106/3106/208 3107/3107/208 3108/3108/208 +f 3109/3109/27 3110/3110/27 3111/3111/27 +f 3112/3112/28 3113/3113/28 3114/3114/28 +f 3115/3115/207 3116/3116/207 3117/3117/207 +f 3118/3118/194 3119/3119/194 3120/3120/194 +f 3121/3121/195 3122/3122/195 3123/3123/195 +f 3124/3124/196 3125/3125/196 3126/3126/196 +f 3127/3127/193 3128/3128/193 3129/3129/193 +f 3130/3130/197 3131/3131/197 3132/3132/197 +f 3133/3133/198 3134/3134/198 3135/3135/198 +f 3136/3136/192 3137/3137/192 3138/3138/192 +f 3139/3139/199 3140/3140/199 3141/3141/199 +f 3142/3142/200 3143/3143/200 3144/3144/200 +f 3145/3145/191 3146/3146/191 3147/3147/191 +f 3148/3148/201 3149/3149/201 3150/3150/201 +f 3151/3151/202 3152/3152/202 3153/3153/202 +f 3154/3154/190 3155/3155/190 3156/3156/190 +f 3157/3157/203 3158/3158/203 3159/3159/203 +f 3160/3160/204 3161/3161/204 3162/3162/204 +f 3163/3163/189 3164/3164/189 3165/3165/189 +f 3166/3166/205 3167/3167/205 3168/3168/205 +f 3169/3169/206 3170/3170/206 3171/3171/206 +f 3172/3172/188 3173/3173/188 3174/3174/188 +f 3175/3175/187 3176/3176/187 3177/3177/187 +f 3178/3178/171 3179/3179/171 3180/3180/171 +f 3181/3181/176 3182/3182/176 3183/3183/176 +f 3184/3184/165 3185/3185/165 3186/3186/165 +f 3187/3187/149 3188/3188/149 3189/3189/149 +f 3190/3190/148 3191/3191/148 3192/3192/148 +f 3193/3193/147 3194/3194/147 3195/3195/147 +f 3196/3196/146 3197/3197/146 3198/3198/146 +f 3199/3199/145 3200/3200/145 3201/3201/145 +f 3202/3202/243 3203/3203/243 3204/3204/243 +f 3205/3205/143 3206/3206/143 3207/3207/143 +f 3208/3208/142 3209/3209/142 3210/3210/142 +f 3211/3211/141 3212/3212/141 3213/3213/141 +f 3214/3214/140 3215/3215/140 3216/3216/140 +f 3217/3217/139 3218/3218/139 3219/3219/139 +f 3220/3220/138 3221/3221/138 3222/3222/138 +f 3223/3223/48 3224/3224/48 3225/3225/48 +f 3226/3226/137 3227/3227/137 3228/3228/137 +f 3229/3229/136 3230/3230/136 3231/3231/136 +f 3232/3232/135 3233/3233/135 3234/3234/135 +f 3235/3235/134 3236/3236/134 3237/3237/134 +f 3238/3238/133 3239/3239/133 3240/3240/133 +f 3241/3241/132 3242/3242/132 3243/3243/132 +f 3244/3244/131 3245/3245/131 3246/3246/131 +f 3247/3247/130 3248/3248/130 3249/3249/130 +f 3250/3250/129 3251/3251/129 3252/3252/129 +f 3253/3253/128 3254/3254/128 3255/3255/128 +f 3256/3256/127 3257/3257/127 3258/3258/127 +f 3259/3259/126 3260/3260/126 3261/3261/126 +f 3262/3262/113 3263/3263/113 3264/3264/113 +f 3265/3265/114 3266/3266/114 3267/3267/114 +f 3268/3268/115 3269/3269/115 3270/3270/115 +f 3271/3271/112 3272/3272/112 3273/3273/112 +f 3274/3274/116 3275/3275/116 3276/3276/116 +f 3277/3277/117 3278/3278/117 3279/3279/117 +f 3280/3280/111 3281/3281/111 3282/3282/111 +f 3283/3283/118 3284/3284/118 3285/3285/118 +f 3286/3286/119 3287/3287/119 3288/3288/119 +f 3289/3289/110 3290/3290/110 3291/3291/110 +f 3292/3292/120 3293/3293/120 3294/3294/120 +f 3295/3295/121 3296/3296/121 3297/3297/121 +f 3298/3298/109 3299/3299/109 3300/3300/109 +f 3301/3301/122 3302/3302/122 3303/3303/122 +f 3304/3304/123 3305/3305/123 3306/3306/123 +f 3307/3307/108 3308/3308/108 3309/3309/108 +f 3310/3310/124 3311/3311/124 3312/3312/124 +f 3313/3313/125 3314/3314/125 3315/3315/125 +f 3316/3316/107 3317/3317/107 3318/3318/107 +f 3319/3319/106 3320/3320/106 3321/3321/106 +f 3322/3322/89 3323/3323/89 3324/3324/89 +f 3325/3325/97 3326/3326/97 3327/3327/97 +f 3328/3328/103 3329/3329/103 3330/3330/103 +f 3331/3331/75 3332/3332/75 3333/3333/75 +f 3334/3334/59 3335/3335/59 3336/3336/59 +f 3337/3337/68 3338/3338/68 3339/3339/68 +f 3340/3340/67 3341/3341/67 3342/3342/67 +f 3343/3343/244 3344/3344/244 3345/3345/244 +f 3346/3346/245 3347/3347/245 3348/3348/245 +f 3349/3349/246 3350/3350/246 3351/3351/246 +f 3352/3352/247 3353/3353/247 3354/3354/247 +f 3355/3355/248 3356/3356/248 3357/3357/248 +f 3358/3358/249 3359/3359/249 3360/3360/249 +f 3361/3361/250 3362/3362/250 3363/3363/250 +f 3364/3364/251 3365/3365/251 3366/3366/251 +f 3367/3367/252 3368/3368/252 3369/3369/252 +f 3370/3370/253 3371/3371/253 3372/3372/253 +f 3373/3373/254 3374/3374/254 3375/3375/254 +f 3376/3376/255 3377/3377/255 3378/3378/255 +f 3379/3379/256 3380/3380/256 3381/3381/256 +f 3382/3382/257 3383/3383/257 3384/3384/257 +f 3385/3385/258 3386/3386/258 3387/3387/258 +f 3388/3388/259 3389/3389/259 3390/3390/259 +f 3391/3391/260 3392/3392/260 3393/3393/260 +f 3394/3394/261 3395/3395/261 3396/3396/261 +f 3397/3397/262 3398/3398/262 3399/3399/262 +f 3400/3400/7 3401/3401/7 3402/3402/7 +f 3403/3403/262 3404/3404/262 3405/3405/262 +f 3406/3406/261 3407/3407/261 3408/3408/261 +f 3409/3409/260 3410/3410/260 3411/3411/260 +f 3412/3412/259 3413/3413/259 3414/3414/259 +f 3415/3415/258 3416/3416/258 3417/3417/258 +f 3418/3418/257 3419/3419/257 3420/3420/257 +f 3421/3421/256 3422/3422/256 3423/3423/256 +f 3424/3424/255 3425/3425/255 3426/3426/255 +f 3427/3427/254 3428/3428/254 3429/3429/254 +f 3430/3430/253 3431/3431/253 3432/3432/253 +f 3433/3433/252 3434/3434/252 3435/3435/252 +f 3436/3436/251 3437/3437/251 3438/3438/251 +f 3439/3439/250 3440/3440/250 3441/3441/250 +f 3442/3442/249 3443/3443/249 3444/3444/249 +f 3445/3445/248 3446/3446/248 3447/3447/248 +f 3448/3448/247 3449/3449/247 3450/3450/247 +f 3451/3451/246 3452/3452/246 3453/3453/246 +f 3454/3454/245 3455/3455/245 3456/3456/245 +f 3457/3457/244 3458/3458/244 3459/3459/244 +f 3460/3460/1 3461/3461/1 3462/3462/1 +f 3463/3463/66 3464/3464/66 3465/3465/66 +f 3466/3466/26 3467/3467/26 3468/3468/26 +f 3469/3469/1 3470/3470/1 3471/3471/1 +f 3472/3472/26 3473/3473/26 3474/3474/26 +f 3475/3475/4 3476/3476/4 3477/3477/4 +f 3478/3478/1 3479/3479/1 3480/3480/1 +f 3481/3481/263 3482/3482/263 3483/3483/263 +f 3484/3484/22 3485/3485/22 3486/3486/22 +f 3487/3487/21 3488/3488/21 3489/3489/21 +f 3490/3490/230 3491/3491/230 3492/3492/230 +f 3493/3493/230 3494/3494/230 3495/3495/230 +f 3496/3496/1 3497/3497/1 3498/3498/1 +f 3499/3499/2 3500/3500/2 3501/3501/2 +f 3502/3502/1 3503/3503/1 3504/3504/1 +f 3505/3505/1 3506/3506/1 3507/3507/1 +f 3508/3508/3 3509/3509/3 3510/3510/3 diff --git a/resources/qml/Actions.qml b/resources/qml/Actions.qml index 1be715164c..7acf39ecb2 100644 --- a/resources/qml/Actions.qml +++ b/resources/qml/Actions.qml @@ -35,8 +35,11 @@ Item property alias mergeObjects: mergeObjectsAction //property alias unMergeObjects: unMergeObjectsAction - property alias multiplyObject: multiplyObjectAction + property alias printObjectBeforePrevious: printObjectBeforePreviousAction + property alias printObjectAfterNext: printObjectAfterNextAction + property alias multiplyObject: multiplyObjectAction + property alias dropAll: dropAllAction property alias selectAll: selectAllAction property alias deleteAll: deleteAllAction property alias reloadAll: reloadAllAction @@ -405,6 +408,26 @@ Item onTriggered: CuraApplication.ungroupSelected() } + Action + { + id: printObjectBeforePreviousAction + text: catalog.i18nc("@action:inmenu menubar:edit","Print Before") + " " + PrintOrderManager.previousNodeName + enabled: PrintOrderManager.shouldEnablePrintBeforeAction + icon.name: "print-before" + shortcut: "PgUp" + onTriggered: PrintOrderManager.swapSelectedAndPreviousNodes() + } + + Action + { + id: printObjectAfterNextAction + text: catalog.i18nc("@action:inmenu menubar:edit","Print After") + " " + PrintOrderManager.nextNodeName + enabled: PrintOrderManager.shouldEnablePrintAfterAction + icon.name: "print-after" + shortcut: "PgDown" + onTriggered: PrintOrderManager.swapSelectedAndNextNodes() + } + Action { id: mergeObjectsAction @@ -467,6 +490,14 @@ Item shortcut: "Shift+Ctrl+R" } + Action + { + id: dropAllAction + text: catalog.i18nc("@action:inmenu menubar:edit","Drop All Models to buildplate") + shortcut: "Ctrl+B" + onTriggered: CuraApplication.setWorkplaceDropToBuildplate() + } + Action { id: resetAllTranslationAction diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index 4983363946..776417e15d 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -701,24 +701,33 @@ UM.MainWindow if (hasProjectFile) { - var projectFile = projectFileUrlList[0]; - - // check preference - var choice = UM.Preferences.getValue("cura/choice_on_open_project"); - if (choice == "open_as_project") + var projectFile = projectFileUrlList[0] + var is_ucp = CuraApplication.isProjectUcp(projectFile); + if (is_ucp) { - openFilesIncludingProjectsDialog.loadProjectFile(projectFile); + askOpenAsProjectOrUcpOrImportModelsDialog.fileUrl = projectFile; + askOpenAsProjectOrUcpOrImportModelsDialog.addToRecent = true; + askOpenAsProjectOrUcpOrImportModelsDialog.show(); } - else if (choice == "open_as_model") + else { - openFilesIncludingProjectsDialog.loadModelFiles([projectFile].slice()); - } - else // always ask - { - // ask whether to open as project or as models - askOpenAsProjectOrModelsDialog.fileUrl = projectFile; - askOpenAsProjectOrModelsDialog.addToRecent = true; - askOpenAsProjectOrModelsDialog.show(); + // check preference + var choice = UM.Preferences.getValue("cura/choice_on_open_project"); + if (choice == "open_as_project") + { + openFilesIncludingProjectsDialog.loadProjectFile(projectFile); + } + else if (choice == "open_as_model") + { + openFilesIncludingProjectsDialog.loadModelFiles([projectFile].slice()); + } + else // always ask + { + // ask whether to open as project or as models + askOpenAsProjectOrModelsDialog.fileUrl = projectFile; + askOpenAsProjectOrModelsDialog.addToRecent = true; + askOpenAsProjectOrModelsDialog.show(); + } } } else @@ -769,14 +778,30 @@ UM.MainWindow id: askOpenAsProjectOrModelsDialog } + AskOpenAsProjectOrUcpOrImportModel + { + id: askOpenAsProjectOrUcpOrImportModelsDialog + } + Connections { target: CuraApplication function onOpenProjectFile(project_file, add_to_recent_files) { - askOpenAsProjectOrModelsDialog.fileUrl = project_file; - askOpenAsProjectOrModelsDialog.addToRecent = add_to_recent_files; - askOpenAsProjectOrModelsDialog.show(); + var is_ucp = CuraApplication.isProjectUcp(project_file); + if (is_ucp) + { + + askOpenAsProjectOrUcpOrImportModelsDialog.fileUrl = project_file; + askOpenAsProjectOrUcpOrImportModelsDialog.addToRecent = add_to_recent_files; + askOpenAsProjectOrUcpOrImportModelsDialog.show(); + } + else + { + askOpenAsProjectOrModelsDialog.fileUrl = project_file; + askOpenAsProjectOrModelsDialog.addToRecent = add_to_recent_files; + askOpenAsProjectOrModelsDialog.show(); + } } } diff --git a/resources/qml/Dialogs/AskOpenAsProjectOrUcpOrImportModel.qml b/resources/qml/Dialogs/AskOpenAsProjectOrUcpOrImportModel.qml new file mode 100644 index 0000000000..a68c48b4a6 --- /dev/null +++ b/resources/qml/Dialogs/AskOpenAsProjectOrUcpOrImportModel.qml @@ -0,0 +1,91 @@ +// Copyright (c) 2022 Ultimaker B.V. +// Cura is released under the terms of the LGPLv3 or higher. + +import QtQuick 2.2 +import QtQuick.Controls 2.1 +import QtQuick.Layouts 1.1 + +import UM 1.5 as UM +import Cura 1.0 as Cura + + +UM.Dialog +{ + // This dialog asks the user whether he/she wants to open a project file as a project or import models. + id: base + + title: catalog.i18nc("@title:window", "Open Universal Cura Project (UCP) file") + width: UM.Theme.getSize("small_popup_dialog").width + height: UM.Theme.getSize("small_popup_dialog").height + backgroundColor: UM.Theme.getColor("main_background") + + maximumHeight: height + maximumWidth: width + minimumHeight: maximumHeight + minimumWidth: maximumWidth + + modality: Qt.WindowModal + + property var fileUrl + property var addToRecent: true //Whether to add this file to the recent files list after reading it. + + + // load the project file as separated models + function loadModelFiles() { + CuraApplication.readLocalFile(base.fileUrl, "open_as_model", base.addToRecent) + + base.hide() + } + + // load the project file as Universal cura project + function loadUcpFiles() { + CuraApplication.readLocalUcpFile(base.fileUrl, base.addToRecent) + + base.hide() + } + + // override UM.Dialog accept + function accept () { + + // when hitting 'enter', we always open as project unless open_as_model was explicitly stored as preference + if (openAsPreference == "open_as_model") { + loadModelFiles() + } else{ + loadUcpFiles() + } + } + + Column + { + anchors.fill: parent + spacing: UM.Theme.getSize("default_margin").height + + UM.Label + { + id: questionText + width: parent.width + text: catalog.i18nc("@text:window", "This is a Cura Universal project file. Would you like to open it as a Cura project or Cura Universal Project or import the models from it?") + wrapMode: Text.WordWrap + } + } + + onAccepted: loadUcpFile() + onRejected: loadModelFiles() + + buttonSpacing: UM.Theme.getSize("thin_margin").width + + rightButtons: + [ + Cura.PrimaryButton + { + text: catalog.i18nc("@action:button", "Open as UCP") + iconSource: UM.Theme.getIcon("CuraShareIcon") + onClicked: loadUcpFiles() + }, + Cura.SecondaryButton + { + text: catalog.i18nc("@action:button", "Import models") + onClicked: loadModelFiles() + } + ] +} diff --git a/resources/qml/Dialogs/WorkspaceSummaryDialog.qml b/resources/qml/Dialogs/WorkspaceSummaryDialog.qml index a174959807..1eca2f395c 100644 --- a/resources/qml/Dialogs/WorkspaceSummaryDialog.qml +++ b/resources/qml/Dialogs/WorkspaceSummaryDialog.qml @@ -25,7 +25,7 @@ UM.Dialog function storeDontShowAgain() { UM.Preferences.setValue("cura/dialog_on_project_save", !dontShowAgainCheckbox.checked) - UM.Preferences.setValue("asked_dialog_on_project_save", true) + UM.Preferences.setValue("cura/asked_dialog_on_project_save", true) } onClosing: storeDontShowAgain() diff --git a/resources/qml/ExtruderIcon.qml b/resources/qml/ExtruderIcon.qml index 3231d924ee..bd15df7848 100644 --- a/resources/qml/ExtruderIcon.qml +++ b/resources/qml/ExtruderIcon.qml @@ -15,6 +15,7 @@ Item property int iconSize: UM.Theme.getSize("extruder_icon").width property string iconVariant: "medium" property alias font: extruderNumberText.font + property alias text: extruderNumberText.text implicitWidth: iconSize implicitHeight: iconSize diff --git a/resources/qml/Menus/ContextMenu.qml b/resources/qml/Menus/ContextMenu.qml index 2de2795a74..1ab0a1332e 100644 --- a/resources/qml/Menus/ContextMenu.qml +++ b/resources/qml/Menus/ContextMenu.qml @@ -71,6 +71,7 @@ Cura.Menu Cura.MenuItem { action: Cura.Actions.reloadAll } Cura.MenuItem { action: Cura.Actions.resetAllTranslation } Cura.MenuItem { action: Cura.Actions.resetAll } + Cura.MenuItem { action: Cura.Actions.dropAll } // Group actions Cura.MenuSeparator {} @@ -78,6 +79,19 @@ Cura.Menu Cura.MenuItem { action: Cura.Actions.mergeObjects } Cura.MenuItem { action: Cura.Actions.unGroupObjects } + // Edit print sequence actions + Cura.MenuSeparator { visible: PrintOrderManager.shouldShowEditPrintOrderActions } + Cura.MenuItem + { + action: Cura.Actions.printObjectBeforePrevious + visible: PrintOrderManager.shouldShowEditPrintOrderActions + } + Cura.MenuItem + { + action: Cura.Actions.printObjectAfterNext + visible: PrintOrderManager.shouldShowEditPrintOrderActions + } + Connections { target: UM.Controller diff --git a/resources/qml/Menus/EditMenu.qml b/resources/qml/Menus/EditMenu.qml index 522c6b27d1..fdab70360e 100644 --- a/resources/qml/Menus/EditMenu.qml +++ b/resources/qml/Menus/EditMenu.qml @@ -21,8 +21,22 @@ Cura.Menu Cura.MenuItem { action: Cura.Actions.deleteAll } Cura.MenuItem { action: Cura.Actions.resetAllTranslation } Cura.MenuItem { action: Cura.Actions.resetAll } + Cura.MenuItem { action: Cura.Actions.dropAll } Cura.MenuSeparator { } Cura.MenuItem { action: Cura.Actions.groupObjects } Cura.MenuItem { action: Cura.Actions.mergeObjects } Cura.MenuItem { action: Cura.Actions.unGroupObjects } + + // Edit print sequence actions + Cura.MenuSeparator { visible: PrintOrderManager.shouldShowEditPrintOrderActions } + Cura.MenuItem + { + action: Cura.Actions.printObjectBeforePrevious + visible: PrintOrderManager.shouldShowEditPrintOrderActions + } + Cura.MenuItem + { + action: Cura.Actions.printObjectAfterNext + visible: PrintOrderManager.shouldShowEditPrintOrderActions + } } \ No newline at end of file diff --git a/resources/qml/Menus/FileMenu.qml b/resources/qml/Menus/FileMenu.qml index 0884053ef3..67edcc5962 100644 --- a/resources/qml/Menus/FileMenu.qml +++ b/resources/qml/Menus/FileMenu.qml @@ -47,8 +47,12 @@ Cura.Menu enabled: UM.WorkspaceFileHandler.enabled && saveProjectMenu.model.count == 1 onTriggered: { - var args = { "filter_by_machine": false, "file_type": "workspace", "preferred_mimetypes": "application/vnd.ms-package.3dmanufacturing-3dmodel+xml" }; - if(UM.Preferences.getValue("cura/dialog_on_project_save")) + const args = { + "filter_by_machine": false, + "file_type": "workspace", + "preferred_mimetypes": "application/vnd.ms-package.3dmanufacturing-3dmodel+xml", + }; + if (UM.Preferences.getValue("cura/dialog_on_project_save")) { saveWorkspaceDialog.args = args saveWorkspaceDialog.open() @@ -70,6 +74,14 @@ Cura.Menu enabled: UM.WorkspaceFileHandler.enabled } + Cura.MenuItem + { + id: saveUCPMenu + text: catalog.i18nc("@title:menu menubar:file", "&Save Universal Cura Project...") + enabled: UM.WorkspaceFileHandler.enabled && CuraApplication.getPackageManager().allEnabledPackages.includes("3MFWriter") + onTriggered: CuraApplication.exportUcp() + } + Cura.MenuSeparator { } Cura.MenuItem @@ -78,8 +90,11 @@ Cura.Menu text: catalog.i18nc("@title:menu menubar:file", "&Export...") onTriggered: { - var localDeviceId = "local_file" - UM.OutputDeviceManager.requestWriteToDevice(localDeviceId, PrintInformation.jobName, { "filter_by_machine": false, "preferred_mimetypes": "application/vnd.ms-package.3dmanufacturing-3dmodel+xml"}) + const args = { + "filter_by_machine": false, + "preferred_mimetypes": "application/vnd.ms-package.3dmanufacturing-3dmodel+xml", + }; + UM.OutputDeviceManager.requestWriteToDevice("local_file", PrintInformation.jobName, args); } } @@ -89,7 +104,13 @@ Cura.Menu text: catalog.i18nc("@action:inmenu menubar:file", "Export Selection...") enabled: UM.Selection.hasSelection icon.name: "document-save-as" - onTriggered: UM.OutputDeviceManager.requestWriteSelectionToDevice("local_file", PrintInformation.jobName, { "filter_by_machine": false, "preferred_mimetypes": "application/vnd.ms-package.3dmanufacturing-3dmodel+xml"}) + onTriggered: { + const args = { + "filter_by_machine": false, + "preferred_mimetypes": "application/vnd.ms-package.3dmanufacturing-3dmodel+xml", + }; + UM.OutputDeviceManager.requestWriteSelectionToDevice("local_file", PrintInformation.jobName, args); + } } Cura.MenuSeparator { } diff --git a/resources/qml/Preferences/GeneralPage.qml b/resources/qml/Preferences/GeneralPage.qml index 8871944523..b753d0e48a 100644 --- a/resources/qml/Preferences/GeneralPage.qml +++ b/resources/qml/Preferences/GeneralPage.qml @@ -101,6 +101,7 @@ UM.PreferencesPage centerOnSelectCheckbox.checked = boolCheck(UM.Preferences.getValue("view/center_on_select")) UM.Preferences.resetPreference("view/invert_zoom"); invertZoomCheckbox.checked = boolCheck(UM.Preferences.getValue("view/invert_zoom")) + UM.Preferences.resetPreference("view/navigation_style"); UM.Preferences.resetPreference("view/zoom_to_mouse"); zoomToMouseCheckbox.checked = boolCheck(UM.Preferences.getValue("view/zoom_to_mouse")) //UM.Preferences.resetPreference("view/top_layer_count"); @@ -509,11 +510,13 @@ UM.PreferencesPage id: dropDownCheckbox text: catalog.i18nc("@option:check", "Automatically drop models to the build plate") checked: boolCheck(UM.Preferences.getValue("physics/automatic_drop_down")) - onCheckedChanged: UM.Preferences.setValue("physics/automatic_drop_down", checked) + onCheckedChanged: + { + UM.Preferences.setValue("physics/automatic_drop_down", checked) + } } } - UM.TooltipArea { width: childrenRect.width; @@ -611,6 +614,55 @@ UM.PreferencesPage } } + UM.TooltipArea + { + width: childrenRect.width + height: childrenRect.height + text: catalog.i18nc("@info:tooltip", "What type of camera navigation should be used?") + Column + { + spacing: UM.Theme.getSize("narrow_margin").height + + UM.Label + { + text: catalog.i18nc("@window:text", "Camera navigation:") + } + ListModel + { + id: navigationStylesList + Component.onCompleted: + { + append({ text: catalog.i18n("Cura"), code: "cura" }) + append({ text: catalog.i18n("FreeCAD trackpad"), code: "freecad_trackpad" }) + } + } + + Cura.ComboBox + { + id: cameraNavigationComboBox + + model: navigationStylesList + textRole: "text" + width: UM.Theme.getSize("combobox").width + height: UM.Theme.getSize("combobox").height + + currentIndex: + { + var code = UM.Preferences.getValue("view/navigation_style"); + for(var i = 0; i < comboBoxList.count; ++i) + { + if(model.get(i).code == code) + { + return i + } + } + return 0 + } + onActivated: UM.Preferences.setValue("view/navigation_style", model.get(index).code) + } + } + } + Item { //: Spacer @@ -627,6 +679,8 @@ UM.PreferencesPage UM.TooltipArea { width: childrenRect.width + // Mac only allows applications to run as a single instance, so providing the option for this os doesn't make much sense + visible: Qt.platform.os !== "osx" height: childrenRect.height text: catalog.i18nc("@info:tooltip","Should opening files from the desktop or external applications open in the same instance of Cura?") diff --git a/resources/qml/Preferences/MachinesPage.qml b/resources/qml/Preferences/MachinesPage.qml index 971de03696..1e287e74a0 100644 --- a/resources/qml/Preferences/MachinesPage.qml +++ b/resources/qml/Preferences/MachinesPage.qml @@ -12,7 +12,6 @@ import Cura 1.0 as Cura UM.ManagementPage { id: base - property var machineActionManager: CuraApplication.getMachineActionManagerQml() Item { enabled: false; UM.I18nCatalog { id: catalog; name: "cura"} } title: catalog.i18nc("@title:tab", "Printers") @@ -63,7 +62,7 @@ UM.ManagementPage Repeater { id: machineActionRepeater - model: base.currentItem ? machineActionManager.getSupportedActions(Cura.MachineManager.getDefinitionByMachineId(base.currentItem.id)) : null + model: base.currentItem ? CuraApplication.getSupportedActionMachineList(base.currentItem.id) : null Item { diff --git a/resources/qml/PrintMonitor.qml b/resources/qml/PrintMonitor.qml index adb004298d..027586c381 100644 --- a/resources/qml/PrintMonitor.qml +++ b/resources/qml/PrintMonitor.qml @@ -132,8 +132,6 @@ ScrollView key: "material_bed_temperature" watchedProperties: ["value", "minimum_value", "maximum_value", "resolve"] storeIndex: 0 - - property var resolve: Cura.MachineManager.activeStack != Cura.MachineManager.activeMachine ? properties.resolve : "None" } UM.SettingPropertyProvider diff --git a/resources/qml/PrinterOutput/ExtruderBox.qml b/resources/qml/PrinterOutput/ExtruderBox.qml index e567d5d4cb..46deec29ef 100644 --- a/resources/qml/PrinterOutput/ExtruderBox.qml +++ b/resources/qml/PrinterOutput/ExtruderBox.qml @@ -25,8 +25,6 @@ Item key: "material_print_temperature" watchedProperties: ["value", "minimum_value", "maximum_value", "resolve"] storeIndex: 0 - - property var resolve: Cura.MachineManager.activeStack != Cura.MachineManager.activeMachine ? properties.resolve : "None" } Rectangle diff --git a/resources/qml/PrinterOutput/HeatedBedBox.qml b/resources/qml/PrinterOutput/HeatedBedBox.qml index 172606c56d..5323072567 100644 --- a/resources/qml/PrinterOutput/HeatedBedBox.qml +++ b/resources/qml/PrinterOutput/HeatedBedBox.qml @@ -199,17 +199,7 @@ Item { return ""; } - if ((bedTemperature.resolve != "None" && bedTemperature.resolve) && (bedTemperature.stackLevels[0] != 0) && (bedTemperature.stackLevels[0] != 1)) - { - // We have a resolve function. Indicates that the setting is not settable per extruder and that - // we have to choose between the resolved value (default) and the global value - // (if user has explicitly set this). - return bedTemperature.resolve; - } - else - { - return bedTemperature.properties.value; - } + return bedTemperature.properties.value; } } } diff --git a/resources/qml/Toolbar.qml b/resources/qml/Toolbar.qml index 1af4e958f4..81f6c5d682 100644 --- a/resources/qml/Toolbar.qml +++ b/resources/qml/Toolbar.qml @@ -222,7 +222,7 @@ Item UM.Label { id: toolHint - text: UM.Controller.properties.getValue("ToolHint") != undefined ? UM.ActiveTool.properties.getValue("ToolHint") : "" + text: UM.Controller.properties.getValue("ToolHint") != undefined ? UM.Controller.properties.getValue("ToolHint") : "" color: UM.Theme.getColor("tooltip_text") anchors.horizontalCenter: parent.horizontalCenter } diff --git a/resources/quality/dagoma/dagoma_sigma_pro_brass_0.4_pla_h0.1.inst.cfg b/resources/quality/dagoma/dagoma_sigma_pro_brass_0.4_pla_h0.1.inst.cfg new file mode 100644 index 0000000000..9f24b9ff18 --- /dev/null +++ b/resources/quality/dagoma/dagoma_sigma_pro_brass_0.4_pla_h0.1.inst.cfg @@ -0,0 +1,74 @@ +[general] +definition = dagoma_sigma_pro +name = Fine +version = 4 + +[metadata] +material = generic_pla +quality_type = h0.1 +setting_version = 22 +type = quality +variant = Brass 0.4mm +weight = 1 + +[values] +adhesion_type = brim +bridge_settings_enabled = True +brim_width = 2 +coasting_enable = True +coasting_volume = 0.06 +cool_fan_full_layer = 5 +cool_min_layer_time = 7 +cool_min_temperature = 195 +infill_material_flow = 105 +infill_sparse_density = 15 +material_final_print_temperature = 196 +material_flow_layer_0 = 100 +material_initial_print_temperature = 196 +material_print_temperature = 196 +material_print_temperature_layer_0 = 196 +material_standby_temperature = 195 +ooze_shield_enabled = False +prime_tower_brim_enable = True +prime_tower_enable = True +prime_tower_min_volume = 44 +prime_tower_size = 25 +prime_tower_wipe_enabled = False +retraction_amount = 3.0 +retraction_combing = infill +retraction_hop = 0.4 +retraction_hop_after_extruder_switch_height = 0 +retraction_hop_enabled = True +retraction_prime_speed = 45 +retraction_retract_speed = 60 +retraction_speed = 80 +smooth_spiralized_contours = False +speed_infill = 80 +speed_layer_0 = 22 +speed_prime_tower = 70 +speed_print = 35 +speed_slowdown_layers = 3 +speed_topbottom = 35 +speed_travel = 180 +speed_travel_layer_0 = 70 +speed_wall_0 = 25 +speed_wall_x = 35.0 +speed_z_hop = 120 +support_enable = False +support_structure = tree +support_tree_angle = 55 +support_tree_top_rate = =30 if support_roof_enable else 10 +switch_extruder_extra_prime_amount = 0 +switch_extruder_prime_speed = 20 +switch_extruder_retraction_amount = 80 +switch_extruder_retraction_speed = =switch_extruder_retraction_speeds +switch_extruder_retraction_speeds = 80 +travel_avoid_distance = 2.0 +travel_avoid_other_parts = False +travel_avoid_supports = True +wall_0_material_flow = =wall_material_flow +wall_0_material_flow_layer_0 = 85 +wall_thickness = 0.8 +wall_transition_length = 0.4 +wall_x_material_flow_layer_0 = 90 + diff --git a/resources/quality/dagoma/dagoma_sigma_pro_brass_0.4_pla_h0.2.inst.cfg b/resources/quality/dagoma/dagoma_sigma_pro_brass_0.4_pla_h0.2.inst.cfg new file mode 100644 index 0000000000..8792a7527a --- /dev/null +++ b/resources/quality/dagoma/dagoma_sigma_pro_brass_0.4_pla_h0.2.inst.cfg @@ -0,0 +1,74 @@ +[general] +definition = dagoma_sigma_pro +name = Normal +version = 4 + +[metadata] +material = generic_pla +quality_type = h0.2 +setting_version = 22 +type = quality +variant = Brass 0.4mm +weight = 1 + +[values] +adhesion_type = brim +bridge_settings_enabled = True +brim_width = 2 +coasting_enable = True +coasting_volume = 0.06 +cool_fan_full_layer = 5 +cool_min_layer_time = 7 +cool_min_temperature = 195 +infill_material_flow = 105 +infill_sparse_density = 15 +material_final_print_temperature = 200 +material_flow_layer_0 = 100 +material_initial_print_temperature = 200 +material_print_temperature = 200 +material_print_temperature_layer_0 = 200 +material_standby_temperature = 195 +ooze_shield_enabled = False +prime_tower_brim_enable = True +prime_tower_enable = True +prime_tower_min_volume = 44 +prime_tower_size = 25 +prime_tower_wipe_enabled = False +retraction_amount = 3.0 +retraction_combing = infill +retraction_hop = 0.4 +retraction_hop_after_extruder_switch_height = 0 +retraction_hop_enabled = True +retraction_prime_speed = 45 +retraction_retract_speed = 60 +retraction_speed = 80 +smooth_spiralized_contours = False +speed_infill = 80 +speed_layer_0 = 22 +speed_prime_tower = 70 +speed_print = 35 +speed_slowdown_layers = 3 +speed_topbottom = 35 +speed_travel = 180 +speed_travel_layer_0 = 70 +speed_wall_0 = 25 +speed_wall_x = 35.0 +speed_z_hop = 120 +support_enable = False +support_structure = tree +support_tree_angle = 55 +support_tree_top_rate = =30 if support_roof_enable else 10 +switch_extruder_extra_prime_amount = 0 +switch_extruder_prime_speed = 20 +switch_extruder_retraction_amount = 80 +switch_extruder_retraction_speed = =switch_extruder_retraction_speeds +switch_extruder_retraction_speeds = 80 +travel_avoid_distance = 2.0 +travel_avoid_other_parts = False +travel_avoid_supports = True +wall_0_material_flow = =wall_material_flow +wall_0_material_flow_layer_0 = 85 +wall_thickness = 1.2 +wall_transition_length = 0.4 +wall_x_material_flow_layer_0 = 90 + diff --git a/resources/quality/dagoma/dagoma_sigma_pro_brass_0.4_pla_h0.3.inst.cfg b/resources/quality/dagoma/dagoma_sigma_pro_brass_0.4_pla_h0.3.inst.cfg new file mode 100644 index 0000000000..c38b789f6b --- /dev/null +++ b/resources/quality/dagoma/dagoma_sigma_pro_brass_0.4_pla_h0.3.inst.cfg @@ -0,0 +1,15 @@ +[general] +definition = dagoma_sigma_pro +name = Draft +version = 4 + +[metadata] +material = generic_pla +quality_type = h0.3 +setting_version = 22 +type = quality +variant = Brass 0.4mm +weight = 1 + +[values] + diff --git a/resources/quality/dagoma/dagoma_sigma_pro_brass_0.8_pla_h0.2.inst.cfg b/resources/quality/dagoma/dagoma_sigma_pro_brass_0.8_pla_h0.2.inst.cfg new file mode 100644 index 0000000000..035ab244cc --- /dev/null +++ b/resources/quality/dagoma/dagoma_sigma_pro_brass_0.8_pla_h0.2.inst.cfg @@ -0,0 +1,15 @@ +[general] +definition = dagoma_sigma_pro +name = Normal +version = 4 + +[metadata] +material = generic_pla +quality_type = h0.2 +setting_version = 22 +type = quality +variant = Brass 0.8mm +weight = 1 + +[values] + diff --git a/resources/quality/dagoma/dagoma_sigma_pro_brass_0.8_pla_h0.4.inst.cfg b/resources/quality/dagoma/dagoma_sigma_pro_brass_0.8_pla_h0.4.inst.cfg new file mode 100644 index 0000000000..193c64708b --- /dev/null +++ b/resources/quality/dagoma/dagoma_sigma_pro_brass_0.8_pla_h0.4.inst.cfg @@ -0,0 +1,15 @@ +[general] +definition = dagoma_sigma_pro +name = Fast +version = 4 + +[metadata] +material = generic_pla +quality_type = h0.4 +setting_version = 22 +type = quality +variant = Brass 0.8mm +weight = 1 + +[values] + diff --git a/resources/quality/dagoma/dagoma_sigma_pro_brass_0.8_pla_h0.6.inst.cfg b/resources/quality/dagoma/dagoma_sigma_pro_brass_0.8_pla_h0.6.inst.cfg new file mode 100644 index 0000000000..e961f9c59e --- /dev/null +++ b/resources/quality/dagoma/dagoma_sigma_pro_brass_0.8_pla_h0.6.inst.cfg @@ -0,0 +1,15 @@ +[general] +definition = dagoma_sigma_pro +name = Very Fast +version = 4 + +[metadata] +material = generic_pla +quality_type = h0.6 +setting_version = 22 +type = quality +variant = Brass 0.8mm +weight = 1 + +[values] + diff --git a/resources/quality/dagoma/dagoma_sigma_pro_dual_brass_0.4_pla_h0.1.inst.cfg b/resources/quality/dagoma/dagoma_sigma_pro_dual_brass_0.4_pla_h0.1.inst.cfg new file mode 100644 index 0000000000..eb38d71eec --- /dev/null +++ b/resources/quality/dagoma/dagoma_sigma_pro_dual_brass_0.4_pla_h0.1.inst.cfg @@ -0,0 +1,75 @@ +[general] +definition = dagoma_sigma_pro_dual +name = Fine +version = 4 + +[metadata] +material = generic_pla +quality_type = h0.1 +setting_version = 22 +type = quality +variant = Brass 0.4mm +weight = 1 + +[values] +adhesion_type = brim +bridge_settings_enabled = True +brim_width = 2 +coasting_enable = True +coasting_volume = 0.1 +cool_fan_full_layer = 5 +cool_min_layer_time = 7 +cool_min_temperature = 195 +infill_material_flow = 105 +infill_sparse_density = 15 +material_final_print_temperature = 196 +material_flow_layer_0 = 100 +material_initial_print_temperature = 196 +material_print_temperature = 196 +material_print_temperature_layer_0 = 196 +material_standby_temperature = 196 +ooze_shield_enabled = False +prime_tower_brim_enable = True +prime_tower_enable = True +prime_tower_min_volume = 24 +prime_tower_size = 25 +prime_tower_wipe_enabled = True +retraction_amount = 10 +retraction_combing = infill +retraction_extrusion_window = 10.0 +retraction_hop = 0.4 +retraction_hop_after_extruder_switch_height = 0 +retraction_hop_enabled = True +retraction_prime_speed = 60 +retraction_retract_speed = 90 +retraction_speed = 80 +smooth_spiralized_contours = False +speed_infill = 80 +speed_layer_0 = 22 +speed_prime_tower = 70 +speed_print = 35 +speed_slowdown_layers = 3 +speed_topbottom = 35 +speed_travel = 180 +speed_travel_layer_0 = 70 +speed_wall_0 = 25 +speed_wall_x = 35.0 +speed_z_hop = 120 +support_enable = False +support_structure = tree +support_tree_angle = 55 +support_tree_top_rate = =30 if support_roof_enable else 10 +switch_extruder_extra_prime_amount = 0 +switch_extruder_prime_speed = 20 +switch_extruder_retraction_amount = 0 +switch_extruder_retraction_speed = =switch_extruder_retraction_speeds +switch_extruder_retraction_speeds = 75 +travel_avoid_distance = 2.0 +travel_avoid_other_parts = False +travel_avoid_supports = True +wall_0_material_flow = =wall_material_flow +wall_0_material_flow_layer_0 = 85 +wall_thickness = 1.2 +wall_transition_length = 0.4 +wall_x_material_flow_layer_0 = 90 + diff --git a/resources/quality/dagoma/dagoma_sigma_pro_dual_brass_0.4_pla_h0.2.inst.cfg b/resources/quality/dagoma/dagoma_sigma_pro_dual_brass_0.4_pla_h0.2.inst.cfg new file mode 100644 index 0000000000..33a8956b39 --- /dev/null +++ b/resources/quality/dagoma/dagoma_sigma_pro_dual_brass_0.4_pla_h0.2.inst.cfg @@ -0,0 +1,75 @@ +[general] +definition = dagoma_sigma_pro_dual +name = Normal +version = 4 + +[metadata] +material = generic_pla +quality_type = h0.2 +setting_version = 22 +type = quality +variant = Brass 0.4mm +weight = 1 + +[values] +adhesion_type = brim +bridge_settings_enabled = True +brim_width = 2 +coasting_enable = True +coasting_volume = 0.1 +cool_fan_full_layer = 5 +cool_min_layer_time = 7 +cool_min_temperature = 195 +infill_material_flow = 105 +infill_sparse_density = 15 +material_final_print_temperature = 200 +material_flow_layer_0 = 100 +material_initial_print_temperature = 200 +material_print_temperature = 200 +material_print_temperature_layer_0 = =material_print_temperature +material_standby_temperature = 200 +ooze_shield_enabled = False +prime_tower_brim_enable = True +prime_tower_enable = True +prime_tower_min_volume = 44 +prime_tower_size = 25 +prime_tower_wipe_enabled = True +retraction_amount = 10 +retraction_combing = infill +retraction_extrusion_window = 10.0 +retraction_hop = 0.4 +retraction_hop_after_extruder_switch_height = 0 +retraction_hop_enabled = True +retraction_prime_speed = 60 +retraction_retract_speed = 90 +retraction_speed = 80 +smooth_spiralized_contours = False +speed_infill = 80 +speed_layer_0 = 22 +speed_prime_tower = 70 +speed_print = 35 +speed_slowdown_layers = 3 +speed_topbottom = 35 +speed_travel = 180 +speed_travel_layer_0 = 70 +speed_wall_0 = 25 +speed_wall_x = 35.0 +speed_z_hop = 120 +support_enable = False +support_structure = tree +support_tree_angle = 55 +support_tree_top_rate = =30 if support_roof_enable else 10 +switch_extruder_extra_prime_amount = 0 +switch_extruder_prime_speed = 20 +switch_extruder_retraction_amount = 0 +switch_extruder_retraction_speed = =switch_extruder_retraction_speeds +switch_extruder_retraction_speeds = 75 +travel_avoid_distance = 2.0 +travel_avoid_other_parts = False +travel_avoid_supports = True +wall_0_material_flow = =wall_material_flow +wall_0_material_flow_layer_0 = 85 +wall_thickness = 1.2 +wall_transition_length = 0.4 +wall_x_material_flow_layer_0 = 90 + diff --git a/resources/quality/dagoma/dagoma_sigma_pro_dual_brass_0.4_pla_h0.3.inst.cfg b/resources/quality/dagoma/dagoma_sigma_pro_dual_brass_0.4_pla_h0.3.inst.cfg new file mode 100644 index 0000000000..540dc947b2 --- /dev/null +++ b/resources/quality/dagoma/dagoma_sigma_pro_dual_brass_0.4_pla_h0.3.inst.cfg @@ -0,0 +1,15 @@ +[general] +definition = dagoma_sigma_pro_dual +name = Draft +version = 4 + +[metadata] +material = generic_pla +quality_type = h0.3 +setting_version = 22 +type = quality +variant = Brass 0.4mm +weight = 1 + +[values] + diff --git a/resources/quality/dagoma/dagoma_sigma_pro_dual_brass_0.8_pla_h0.2.inst.cfg b/resources/quality/dagoma/dagoma_sigma_pro_dual_brass_0.8_pla_h0.2.inst.cfg new file mode 100644 index 0000000000..bd6d2b4176 --- /dev/null +++ b/resources/quality/dagoma/dagoma_sigma_pro_dual_brass_0.8_pla_h0.2.inst.cfg @@ -0,0 +1,15 @@ +[general] +definition = dagoma_sigma_pro_dual +name = Normal +version = 4 + +[metadata] +material = generic_pla +quality_type = h0.2 +setting_version = 22 +type = quality +variant = Brass 0.8mm +weight = 1 + +[values] + diff --git a/resources/quality/dagoma/dagoma_sigma_pro_dual_brass_0.8_pla_h0.4.inst.cfg b/resources/quality/dagoma/dagoma_sigma_pro_dual_brass_0.8_pla_h0.4.inst.cfg new file mode 100644 index 0000000000..2da4d4af4f --- /dev/null +++ b/resources/quality/dagoma/dagoma_sigma_pro_dual_brass_0.8_pla_h0.4.inst.cfg @@ -0,0 +1,15 @@ +[general] +definition = dagoma_sigma_pro_dual +name = Fast +version = 4 + +[metadata] +material = generic_pla +quality_type = h0.4 +setting_version = 22 +type = quality +variant = Brass 0.8mm +weight = 1 + +[values] + diff --git a/resources/quality/dagoma/dagoma_sigma_pro_dual_brass_0.8_pla_h0.6.inst.cfg b/resources/quality/dagoma/dagoma_sigma_pro_dual_brass_0.8_pla_h0.6.inst.cfg new file mode 100644 index 0000000000..82ae79a60d --- /dev/null +++ b/resources/quality/dagoma/dagoma_sigma_pro_dual_brass_0.8_pla_h0.6.inst.cfg @@ -0,0 +1,15 @@ +[general] +definition = dagoma_sigma_pro_dual +name = Very Fast +version = 4 + +[metadata] +material = generic_pla +quality_type = h0.6 +setting_version = 22 +type = quality +variant = Brass 0.8mm +weight = 1 + +[values] + diff --git a/resources/quality/dagoma/dagoma_sigma_pro_dual_global_h0.1.inst.cfg b/resources/quality/dagoma/dagoma_sigma_pro_dual_global_h0.1.inst.cfg new file mode 100644 index 0000000000..62b8f6da3e --- /dev/null +++ b/resources/quality/dagoma/dagoma_sigma_pro_dual_global_h0.1.inst.cfg @@ -0,0 +1,16 @@ +[general] +definition = dagoma_sigma_pro_dual +name = Fine +version = 4 + +[metadata] +global_quality = True +material = generic_pla +quality_type = h0.1 +setting_version = 22 +type = quality +weight = 1 + +[values] +layer_height = 0.1 + diff --git a/resources/quality/dagoma/dagoma_sigma_pro_dual_global_h0.2.inst.cfg b/resources/quality/dagoma/dagoma_sigma_pro_dual_global_h0.2.inst.cfg new file mode 100644 index 0000000000..e6467c116b --- /dev/null +++ b/resources/quality/dagoma/dagoma_sigma_pro_dual_global_h0.2.inst.cfg @@ -0,0 +1,16 @@ +[general] +definition = dagoma_sigma_pro_dual +name = Normal +version = 4 + +[metadata] +global_quality = True +material = generic_pla +quality_type = h0.2 +setting_version = 22 +type = quality +weight = 1 + +[values] +layer_height = 0.2 + diff --git a/resources/quality/dagoma/dagoma_sigma_pro_dual_global_h0.3.inst.cfg b/resources/quality/dagoma/dagoma_sigma_pro_dual_global_h0.3.inst.cfg new file mode 100644 index 0000000000..3f2f23cc15 --- /dev/null +++ b/resources/quality/dagoma/dagoma_sigma_pro_dual_global_h0.3.inst.cfg @@ -0,0 +1,16 @@ +[general] +definition = dagoma_sigma_pro_dual +name = Draft +version = 4 + +[metadata] +global_quality = True +material = generic_pla +quality_type = h0.3 +setting_version = 22 +type = quality +weight = 1 + +[values] +layer_height = 0.3 + diff --git a/resources/quality/dagoma/dagoma_sigma_pro_dual_global_h0.4.inst.cfg b/resources/quality/dagoma/dagoma_sigma_pro_dual_global_h0.4.inst.cfg new file mode 100644 index 0000000000..9fbedce8b4 --- /dev/null +++ b/resources/quality/dagoma/dagoma_sigma_pro_dual_global_h0.4.inst.cfg @@ -0,0 +1,16 @@ +[general] +definition = dagoma_sigma_pro_dual +name = Fast +version = 4 + +[metadata] +global_quality = True +material = generic_pla +quality_type = h0.4 +setting_version = 22 +type = quality +weight = 1 + +[values] +layer_height = 0.4 + diff --git a/resources/quality/dagoma/dagoma_sigma_pro_dual_global_h0.6.inst.cfg b/resources/quality/dagoma/dagoma_sigma_pro_dual_global_h0.6.inst.cfg new file mode 100644 index 0000000000..45f5d6f59b --- /dev/null +++ b/resources/quality/dagoma/dagoma_sigma_pro_dual_global_h0.6.inst.cfg @@ -0,0 +1,16 @@ +[general] +definition = dagoma_sigma_pro_dual +name = Very Fast +version = 4 + +[metadata] +global_quality = True +material = generic_pla +quality_type = h0.6 +setting_version = 22 +type = quality +weight = 1 + +[values] +layer_height = 0.6 + diff --git a/resources/quality/dagoma/dagoma_sigma_pro_dual_steel_0.4_pla_h0.1.inst.cfg b/resources/quality/dagoma/dagoma_sigma_pro_dual_steel_0.4_pla_h0.1.inst.cfg new file mode 100644 index 0000000000..26368409b2 --- /dev/null +++ b/resources/quality/dagoma/dagoma_sigma_pro_dual_steel_0.4_pla_h0.1.inst.cfg @@ -0,0 +1,15 @@ +[general] +definition = dagoma_sigma_pro_dual +name = Fine +version = 4 + +[metadata] +material = generic_pla +quality_type = h0.1 +setting_version = 22 +type = quality +variant = Steel 0.4mm +weight = 1 + +[values] + diff --git a/resources/quality/dagoma/dagoma_sigma_pro_dual_steel_0.4_pla_h0.2.inst.cfg b/resources/quality/dagoma/dagoma_sigma_pro_dual_steel_0.4_pla_h0.2.inst.cfg new file mode 100644 index 0000000000..9d860526ac --- /dev/null +++ b/resources/quality/dagoma/dagoma_sigma_pro_dual_steel_0.4_pla_h0.2.inst.cfg @@ -0,0 +1,15 @@ +[general] +definition = dagoma_sigma_pro_dual +name = Normal +version = 4 + +[metadata] +material = generic_pla +quality_type = h0.2 +setting_version = 22 +type = quality +variant = Steel 0.4mm +weight = 1 + +[values] + diff --git a/resources/quality/dagoma/dagoma_sigma_pro_dual_steel_0.4_pla_h0.3.inst.cfg b/resources/quality/dagoma/dagoma_sigma_pro_dual_steel_0.4_pla_h0.3.inst.cfg new file mode 100644 index 0000000000..e9cbd8f8c0 --- /dev/null +++ b/resources/quality/dagoma/dagoma_sigma_pro_dual_steel_0.4_pla_h0.3.inst.cfg @@ -0,0 +1,15 @@ +[general] +definition = dagoma_sigma_pro_dual +name = Draft +version = 4 + +[metadata] +material = generic_pla +quality_type = h0.3 +setting_version = 22 +type = quality +variant = Steel 0.4mm +weight = 1 + +[values] + diff --git a/resources/quality/dagoma/dagoma_sigma_pro_dual_steel_0.8_pla_h0.2.inst.cfg b/resources/quality/dagoma/dagoma_sigma_pro_dual_steel_0.8_pla_h0.2.inst.cfg new file mode 100644 index 0000000000..f0d1931321 --- /dev/null +++ b/resources/quality/dagoma/dagoma_sigma_pro_dual_steel_0.8_pla_h0.2.inst.cfg @@ -0,0 +1,15 @@ +[general] +definition = dagoma_sigma_pro_dual +name = Normal +version = 4 + +[metadata] +material = generic_pla +quality_type = h0.2 +setting_version = 22 +type = quality +variant = Steel 0.8mm +weight = 1 + +[values] + diff --git a/resources/quality/dagoma/dagoma_sigma_pro_dual_steel_0.8_pla_h0.4.inst.cfg b/resources/quality/dagoma/dagoma_sigma_pro_dual_steel_0.8_pla_h0.4.inst.cfg new file mode 100644 index 0000000000..d7430e5953 --- /dev/null +++ b/resources/quality/dagoma/dagoma_sigma_pro_dual_steel_0.8_pla_h0.4.inst.cfg @@ -0,0 +1,15 @@ +[general] +definition = dagoma_sigma_pro_dual +name = Fast +version = 4 + +[metadata] +material = generic_pla +quality_type = h0.4 +setting_version = 22 +type = quality +variant = Steel 0.8mm +weight = 1 + +[values] + diff --git a/resources/quality/dagoma/dagoma_sigma_pro_dual_steel_0.8_pla_h0.6.inst.cfg b/resources/quality/dagoma/dagoma_sigma_pro_dual_steel_0.8_pla_h0.6.inst.cfg new file mode 100644 index 0000000000..a431051e77 --- /dev/null +++ b/resources/quality/dagoma/dagoma_sigma_pro_dual_steel_0.8_pla_h0.6.inst.cfg @@ -0,0 +1,15 @@ +[general] +definition = dagoma_sigma_pro_dual +name = Very Fast +version = 4 + +[metadata] +material = generic_pla +quality_type = h0.6 +setting_version = 22 +type = quality +variant = Steel 0.8mm +weight = 1 + +[values] + diff --git a/resources/quality/dagoma/dagoma_sigma_pro_global_h0.1.inst.cfg b/resources/quality/dagoma/dagoma_sigma_pro_global_h0.1.inst.cfg new file mode 100644 index 0000000000..ddcdb5a4e4 --- /dev/null +++ b/resources/quality/dagoma/dagoma_sigma_pro_global_h0.1.inst.cfg @@ -0,0 +1,16 @@ +[general] +definition = dagoma_sigma_pro +name = Fine +version = 4 + +[metadata] +global_quality = True +material = generic_pla +quality_type = h0.1 +setting_version = 22 +type = quality +weight = 1 + +[values] +layer_height = 0.1 + diff --git a/resources/quality/dagoma/dagoma_sigma_pro_global_h0.2.inst.cfg b/resources/quality/dagoma/dagoma_sigma_pro_global_h0.2.inst.cfg new file mode 100644 index 0000000000..b5a534784d --- /dev/null +++ b/resources/quality/dagoma/dagoma_sigma_pro_global_h0.2.inst.cfg @@ -0,0 +1,16 @@ +[general] +definition = dagoma_sigma_pro +name = Normal +version = 4 + +[metadata] +global_quality = True +material = generic_pla +quality_type = h0.2 +setting_version = 22 +type = quality +weight = 1 + +[values] +layer_height = 0.2 + diff --git a/resources/quality/dagoma/dagoma_sigma_pro_global_h0.3.inst.cfg b/resources/quality/dagoma/dagoma_sigma_pro_global_h0.3.inst.cfg new file mode 100644 index 0000000000..a648eee325 --- /dev/null +++ b/resources/quality/dagoma/dagoma_sigma_pro_global_h0.3.inst.cfg @@ -0,0 +1,16 @@ +[general] +definition = dagoma_sigma_pro +name = Draft +version = 4 + +[metadata] +global_quality = True +material = generic_pla +quality_type = h0.3 +setting_version = 22 +type = quality +weight = 1 + +[values] +layer_height = 0.3 + diff --git a/resources/quality/dagoma/dagoma_sigma_pro_global_h0.4.inst.cfg b/resources/quality/dagoma/dagoma_sigma_pro_global_h0.4.inst.cfg new file mode 100644 index 0000000000..b173c5e6f2 --- /dev/null +++ b/resources/quality/dagoma/dagoma_sigma_pro_global_h0.4.inst.cfg @@ -0,0 +1,16 @@ +[general] +definition = dagoma_sigma_pro +name = Fast +version = 4 + +[metadata] +global_quality = True +material = generic_pla +quality_type = h0.4 +setting_version = 22 +type = quality +weight = 1 + +[values] +layer_height = 0.4 + diff --git a/resources/quality/dagoma/dagoma_sigma_pro_global_h0.6.inst.cfg b/resources/quality/dagoma/dagoma_sigma_pro_global_h0.6.inst.cfg new file mode 100644 index 0000000000..70c094d2e3 --- /dev/null +++ b/resources/quality/dagoma/dagoma_sigma_pro_global_h0.6.inst.cfg @@ -0,0 +1,16 @@ +[general] +definition = dagoma_sigma_pro +name = Very Fast +version = 4 + +[metadata] +global_quality = True +material = generic_pla +quality_type = h0.6 +setting_version = 22 +type = quality +weight = 1 + +[values] +layer_height = 0.6 + diff --git a/resources/quality/dagoma/dagoma_sigma_pro_steel_0.4_pla_h0.1.inst.cfg b/resources/quality/dagoma/dagoma_sigma_pro_steel_0.4_pla_h0.1.inst.cfg new file mode 100644 index 0000000000..d7009cd72f --- /dev/null +++ b/resources/quality/dagoma/dagoma_sigma_pro_steel_0.4_pla_h0.1.inst.cfg @@ -0,0 +1,15 @@ +[general] +definition = dagoma_sigma_pro +name = Fine +version = 4 + +[metadata] +material = generic_pla +quality_type = h0.1 +setting_version = 22 +type = quality +variant = Steel 0.4mm +weight = 1 + +[values] + diff --git a/resources/quality/dagoma/dagoma_sigma_pro_steel_0.4_pla_h0.2.inst.cfg b/resources/quality/dagoma/dagoma_sigma_pro_steel_0.4_pla_h0.2.inst.cfg new file mode 100644 index 0000000000..bc1c894bcc --- /dev/null +++ b/resources/quality/dagoma/dagoma_sigma_pro_steel_0.4_pla_h0.2.inst.cfg @@ -0,0 +1,15 @@ +[general] +definition = dagoma_sigma_pro +name = Normal +version = 4 + +[metadata] +material = generic_pla +quality_type = h0.2 +setting_version = 22 +type = quality +variant = Steel 0.4mm +weight = 1 + +[values] + diff --git a/resources/quality/dagoma/dagoma_sigma_pro_steel_0.4_pla_h0.3.inst.cfg b/resources/quality/dagoma/dagoma_sigma_pro_steel_0.4_pla_h0.3.inst.cfg new file mode 100644 index 0000000000..380e162e1c --- /dev/null +++ b/resources/quality/dagoma/dagoma_sigma_pro_steel_0.4_pla_h0.3.inst.cfg @@ -0,0 +1,15 @@ +[general] +definition = dagoma_sigma_pro +name = Draft +version = 4 + +[metadata] +material = generic_pla +quality_type = h0.3 +setting_version = 22 +type = quality +variant = Steel 0.4mm +weight = 1 + +[values] + diff --git a/resources/quality/dagoma/dagoma_sigma_pro_steel_0.8_pla_h0.2.inst.cfg b/resources/quality/dagoma/dagoma_sigma_pro_steel_0.8_pla_h0.2.inst.cfg new file mode 100644 index 0000000000..3baede1020 --- /dev/null +++ b/resources/quality/dagoma/dagoma_sigma_pro_steel_0.8_pla_h0.2.inst.cfg @@ -0,0 +1,15 @@ +[general] +definition = dagoma_sigma_pro +name = Normal +version = 4 + +[metadata] +material = generic_pla +quality_type = h0.2 +setting_version = 22 +type = quality +variant = Steel 0.8mm +weight = 1 + +[values] + diff --git a/resources/quality/dagoma/dagoma_sigma_pro_steel_0.8_pla_h0.4.inst.cfg b/resources/quality/dagoma/dagoma_sigma_pro_steel_0.8_pla_h0.4.inst.cfg new file mode 100644 index 0000000000..df97ec19f5 --- /dev/null +++ b/resources/quality/dagoma/dagoma_sigma_pro_steel_0.8_pla_h0.4.inst.cfg @@ -0,0 +1,15 @@ +[general] +definition = dagoma_sigma_pro +name = Fast +version = 4 + +[metadata] +material = generic_pla +quality_type = h0.4 +setting_version = 22 +type = quality +variant = Steel 0.8mm +weight = 1 + +[values] + diff --git a/resources/quality/dagoma/dagoma_sigma_pro_steel_0.8_pla_h0.6.inst.cfg b/resources/quality/dagoma/dagoma_sigma_pro_steel_0.8_pla_h0.6.inst.cfg new file mode 100644 index 0000000000..6423773478 --- /dev/null +++ b/resources/quality/dagoma/dagoma_sigma_pro_steel_0.8_pla_h0.6.inst.cfg @@ -0,0 +1,15 @@ +[general] +definition = dagoma_sigma_pro +name = Very Fast +version = 4 + +[metadata] +material = generic_pla +quality_type = h0.6 +setting_version = 22 +type = quality +variant = Steel 0.8mm +weight = 1 + +[values] + diff --git a/resources/quality/ultimaker_methodx/um_methodx_1c_um-asa-175_0.2mm.inst.cfg b/resources/quality/ultimaker_methodx/um_methodx_1c_um-asa-175_0.2mm.inst.cfg new file mode 100644 index 0000000000..f0e0a4fded --- /dev/null +++ b/resources/quality/ultimaker_methodx/um_methodx_1c_um-asa-175_0.2mm.inst.cfg @@ -0,0 +1,50 @@ +[general] +definition = ultimaker_methodx +name = Fast - Experimental +version = 4 + +[metadata] +is_experimental = True +material = ultimaker_asa_175 +quality_type = draft +setting_version = 22 +type = quality +variant = 1C +weight = -2 + +[values] +cool_fan_enabled = False +material_print_temperature_layer_0 = =default_material_print_temperature+5 +raft_airgap = 0.3 +raft_base_speed = 10 +retract_at_layer_change = True +retraction_amount = 0.5 +retraction_min_travel = 3.2 +roofing_material_flow = 98.0 +small_skin_width = 3.6 +speed_prime_tower = 30.0 +speed_print = 120.0 +speed_roofing = 55 +speed_topbottom = 55 +speed_travel = 250.0 +speed_wall_0 = 45 +speed_wall_x = 65 +support_angle = 50 +support_bottom_density = 24 +support_bottom_enable = False +support_bottom_line_width = 0.6 +support_bottom_stair_step_height = 0 +support_fan_enable = False +support_infill_rate = 12.0 +support_interface_enable = True +support_interface_pattern = lines +support_line_width = 0.3 +support_pattern = lines +support_roof_density = 97 +support_roof_height = 1.015 +support_roof_line_width = 0.25 +support_use_towers = False +support_xy_distance = 0.2 +support_xy_distance_overhang = 0.15 +support_z_distance = 0.25 + diff --git a/resources/quality/ultimaker_methodx/um_methodx_1c_um-nylon12-cf-175_0.2mm.inst.cfg b/resources/quality/ultimaker_methodx/um_methodx_1c_um-nylon12-cf-175_0.2mm.inst.cfg new file mode 100644 index 0000000000..32d64ed5b1 --- /dev/null +++ b/resources/quality/ultimaker_methodx/um_methodx_1c_um-nylon12-cf-175_0.2mm.inst.cfg @@ -0,0 +1,53 @@ +[general] +definition = ultimaker_methodx +name = Fast - Experimental +version = 4 + +[metadata] +is_experimental = True +material = ultimaker_nylon12-cf_175 +quality_type = draft +setting_version = 22 +type = quality +variant = 1C +weight = -2 + +[values] +cool_fan_enabled = False +material_final_print_temperature = =default_material_print_temperature-5 +material_initial_print_temperature = =default_material_print_temperature-5 +raft_airgap = 0.3 +raft_base_line_spacing = 3 +raft_base_line_width = 1.2 +raft_base_speed = 10 +retract_at_layer_change = True +retraction_amount = 0.5 +retraction_min_travel = 3.2 +roofing_material_flow = 100 +small_skin_width = 3.6 +speed_prime_tower = 30.0 +speed_print = 120.0 +speed_roofing = 55 +speed_topbottom = 55 +speed_travel = 250.0 +speed_wall_0 = 45 +speed_wall_x = 65 +support_angle = 50 +support_bottom_density = 24 +support_bottom_enable = False +support_bottom_line_width = 0.6 +support_bottom_stair_step_height = 0 +support_fan_enable = False +support_infill_rate = 12.0 +support_interface_enable = True +support_interface_pattern = lines +support_line_width = 0.3 +support_pattern = lines +support_roof_density = 97 +support_roof_height = 1.015 +support_roof_line_width = 0.25 +support_use_towers = False +support_xy_distance = 0.2 +support_xy_distance_overhang = 0.15 +support_z_distance = 0.25 + diff --git a/resources/quality/ultimaker_methodx/um_methodx_1xa_um-asa-175_0.2mm.inst.cfg b/resources/quality/ultimaker_methodx/um_methodx_1xa_um-asa-175_0.2mm.inst.cfg new file mode 100644 index 0000000000..e032e3a3b8 --- /dev/null +++ b/resources/quality/ultimaker_methodx/um_methodx_1xa_um-asa-175_0.2mm.inst.cfg @@ -0,0 +1,50 @@ +[general] +definition = ultimaker_methodx +name = Fast - Experimental +version = 4 + +[metadata] +is_experimental = True +material = ultimaker_asa_175 +quality_type = draft +setting_version = 22 +type = quality +variant = 1XA +weight = -2 + +[values] +cool_fan_enabled = False +material_print_temperature_layer_0 = =default_material_print_temperature+5 +raft_airgap = 0.3 +raft_base_speed = 10 +retract_at_layer_change = True +retraction_amount = 0.5 +retraction_min_travel = 3.2 +roofing_material_flow = 98.0 +small_skin_width = 3.6 +speed_prime_tower = 30.0 +speed_print = 120.0 +speed_roofing = 55 +speed_topbottom = 55 +speed_travel = 250.0 +speed_wall_0 = 45 +speed_wall_x = 65 +support_angle = 50 +support_bottom_density = 24 +support_bottom_enable = False +support_bottom_line_width = 0.6 +support_bottom_stair_step_height = 0 +support_fan_enable = False +support_infill_rate = 12.0 +support_interface_enable = True +support_interface_pattern = lines +support_line_width = 0.3 +support_pattern = lines +support_roof_density = 97 +support_roof_height = 1.015 +support_roof_line_width = 0.25 +support_use_towers = False +support_xy_distance = 0.2 +support_xy_distance_overhang = 0.15 +support_z_distance = 0.25 + diff --git a/resources/quality/ultimaker_methodx/um_methodx_2xa_um-sr30-175_0.2mm.inst.cfg b/resources/quality/ultimaker_methodx/um_methodx_2xa_um-sr30-175_0.2mm.inst.cfg new file mode 100644 index 0000000000..5ebc2b4560 --- /dev/null +++ b/resources/quality/ultimaker_methodx/um_methodx_2xa_um-sr30-175_0.2mm.inst.cfg @@ -0,0 +1,41 @@ +[general] +definition = ultimaker_methodx +name = Fast - Experimental +version = 4 + +[metadata] +is_experimental = True +material = ultimaker_sr30_175 +quality_type = draft +setting_version = 22 +type = quality +variant = 2XA +weight = -2 + +[values] +brim_replaces_support = False +cool_fan_enabled = False +cool_min_temperature = =material_print_temperature +raft_airgap = 0.0 +raft_interface_line_width = 0.7 +raft_interface_speed = 70 +raft_surface_speed = 90 +retract_at_layer_change = True +retraction_amount = 0.5 +speed_prime_tower = 25.0 +speed_print = 50 +speed_roofing = 50 +speed_support = 50 +speed_support_bottom = 30 +speed_support_interface = 80 +speed_topbottom = 50 +speed_wall_0 = 50 +speed_wall_x = 50 +support_bottom_wall_count = 5 +support_fan_enable = False +support_infill_sparse_thickness = =min(layer_height * 2, machine_nozzle_size * 3 / 4) if layer_height <= 0.15 / 0.4 * machine_nozzle_size else layer_height +support_interface_enable = True +support_wall_count = 1 +support_xy_distance = 0.2 +support_z_distance = 0 + diff --git a/resources/quality/ultimaker_methodx/um_methodx_labs_um-asa-175_0.2mm.inst.cfg b/resources/quality/ultimaker_methodx/um_methodx_labs_um-asa-175_0.2mm.inst.cfg new file mode 100644 index 0000000000..3c9f4500fc --- /dev/null +++ b/resources/quality/ultimaker_methodx/um_methodx_labs_um-asa-175_0.2mm.inst.cfg @@ -0,0 +1,50 @@ +[general] +definition = ultimaker_methodx +name = Fast - Experimental +version = 4 + +[metadata] +is_experimental = True +material = ultimaker_asa_175 +quality_type = draft +setting_version = 22 +type = quality +variant = LABS +weight = -2 + +[values] +cool_fan_enabled = False +material_print_temperature_layer_0 = =default_material_print_temperature+5 +raft_airgap = 0.3 +raft_base_speed = 10 +retract_at_layer_change = True +retraction_amount = 0.5 +retraction_min_travel = 3.2 +roofing_material_flow = 98.0 +small_skin_width = 3.6 +speed_prime_tower = 30.0 +speed_print = 120.0 +speed_roofing = 55 +speed_topbottom = 55 +speed_travel = 250.0 +speed_wall_0 = 45 +speed_wall_x = 65 +support_angle = 50 +support_bottom_density = 24 +support_bottom_enable = False +support_bottom_line_width = 0.6 +support_bottom_stair_step_height = 0 +support_fan_enable = False +support_infill_rate = 12.0 +support_interface_enable = True +support_interface_pattern = lines +support_line_width = 0.3 +support_pattern = lines +support_roof_density = 97 +support_roof_height = 1.015 +support_roof_line_width = 0.25 +support_use_towers = False +support_xy_distance = 0.2 +support_xy_distance_overhang = 0.15 +support_z_distance = 0.25 + diff --git a/resources/quality/ultimaker_methodx/um_methodx_labs_um-nylon12-cf-175_0.2mm.inst.cfg b/resources/quality/ultimaker_methodx/um_methodx_labs_um-nylon12-cf-175_0.2mm.inst.cfg new file mode 100644 index 0000000000..7bb14d9107 --- /dev/null +++ b/resources/quality/ultimaker_methodx/um_methodx_labs_um-nylon12-cf-175_0.2mm.inst.cfg @@ -0,0 +1,53 @@ +[general] +definition = ultimaker_methodx +name = Fast - Experimental +version = 4 + +[metadata] +is_experimental = True +material = ultimaker_nylon12-cf_175 +quality_type = draft +setting_version = 22 +type = quality +variant = LABS +weight = -2 + +[values] +cool_fan_enabled = False +material_final_print_temperature = =default_material_print_temperature-5 +material_initial_print_temperature = =default_material_print_temperature-5 +raft_airgap = 0.3 +raft_base_line_spacing = 3 +raft_base_line_width = 1.2 +raft_base_speed = 10 +retract_at_layer_change = True +retraction_amount = 0.5 +retraction_min_travel = 3.2 +roofing_material_flow = 100 +small_skin_width = 3.6 +speed_prime_tower = 30.0 +speed_print = 120.0 +speed_roofing = 55 +speed_topbottom = 55 +speed_travel = 250.0 +speed_wall_0 = 45 +speed_wall_x = 65 +support_angle = 50 +support_bottom_density = 24 +support_bottom_enable = False +support_bottom_line_width = 0.6 +support_bottom_stair_step_height = 0 +support_fan_enable = False +support_infill_rate = 12.0 +support_interface_enable = True +support_interface_pattern = lines +support_line_width = 0.3 +support_pattern = lines +support_roof_density = 97 +support_roof_height = 1.015 +support_roof_line_width = 0.25 +support_use_towers = False +support_xy_distance = 0.2 +support_xy_distance_overhang = 0.15 +support_z_distance = 0.25 + diff --git a/resources/quality/ultimaker_methodxl/um_methodxl_1c_um-absr-175_0.2mm.inst.cfg b/resources/quality/ultimaker_methodxl/um_methodxl_1c_um-absr-175_0.2mm.inst.cfg index 7b5daf0d20..2688d88ad3 100644 --- a/resources/quality/ultimaker_methodxl/um_methodxl_1c_um-absr-175_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_methodxl/um_methodxl_1c_um-absr-175_0.2mm.inst.cfg @@ -12,9 +12,7 @@ variant = 1C weight = -2 [values] -build_volume_temperature = 85 cool_fan_enabled = False -default_material_bed_temperature = 95 raft_airgap = 0.3 speed_prime_tower = 30.0 speed_print = 120.0 diff --git a/resources/quality/ultimaker_methodxl/um_methodxl_1c_um-asa-175_0.2mm.inst.cfg b/resources/quality/ultimaker_methodxl/um_methodxl_1c_um-asa-175_0.2mm.inst.cfg new file mode 100644 index 0000000000..5aaee1f2c6 --- /dev/null +++ b/resources/quality/ultimaker_methodxl/um_methodxl_1c_um-asa-175_0.2mm.inst.cfg @@ -0,0 +1,51 @@ +[general] +definition = ultimaker_methodxl +name = Fast - Experimental +version = 4 + +[metadata] +is_experimental = True +material = ultimaker_asa_175 +quality_type = draft +setting_version = 22 +type = quality +variant = 1C +weight = -2 + +[values] +cool_fan_enabled = False +material_print_temperature_layer_0 = =default_material_print_temperature+5 +raft_airgap = 0.3 +raft_base_speed = 10 +retract_at_layer_change = True +retraction_amount = 0.5 +retraction_min_travel = 3.2 +roofing_material_flow = 98.0 +small_skin_width = 3.6 +speed_prime_tower = 30.0 +speed_print = 120.0 +speed_roofing = 55 +speed_topbottom = 55 +speed_travel = 500 +speed_travel_layer_0 = 250 +speed_wall_0 = 45 +speed_wall_x = 65 +support_angle = 50 +support_bottom_density = 24 +support_bottom_enable = False +support_bottom_line_width = 0.6 +support_bottom_stair_step_height = 0 +support_fan_enable = False +support_infill_rate = 12.0 +support_interface_enable = True +support_interface_pattern = lines +support_line_width = 0.3 +support_pattern = lines +support_roof_density = 97 +support_roof_height = 1.015 +support_roof_line_width = 0.25 +support_use_towers = False +support_xy_distance = 0.2 +support_xy_distance_overhang = 0.15 +support_z_distance = 0.25 + diff --git a/resources/quality/ultimaker_methodxl/um_methodxl_1c_um-nylon12-cf-175_0.2mm.inst.cfg b/resources/quality/ultimaker_methodxl/um_methodxl_1c_um-nylon12-cf-175_0.2mm.inst.cfg new file mode 100644 index 0000000000..575189deae --- /dev/null +++ b/resources/quality/ultimaker_methodxl/um_methodxl_1c_um-nylon12-cf-175_0.2mm.inst.cfg @@ -0,0 +1,53 @@ +[general] +definition = ultimaker_methodxl +name = Fast - Experimental +version = 4 + +[metadata] +is_experimental = True +material = ultimaker_nylon12-cf_175 +quality_type = draft +setting_version = 22 +type = quality +variant = 1C +weight = -2 + +[values] +cool_fan_enabled = False +material_final_print_temperature = =default_material_print_temperature-5 +material_initial_print_temperature = =default_material_print_temperature-5 +raft_airgap = 0.3 +raft_base_line_spacing = 3 +raft_base_line_width = 1.2 +raft_base_speed = 10 +retract_at_layer_change = True +retraction_amount = 0.5 +retraction_min_travel = 3.2 +roofing_material_flow = 100 +small_skin_width = 3.6 +speed_prime_tower = 30.0 +speed_print = 120.0 +speed_roofing = 55 +speed_topbottom = 55 +speed_travel = 250.0 +speed_wall_0 = 45 +speed_wall_x = 65 +support_angle = 50 +support_bottom_density = 24 +support_bottom_enable = False +support_bottom_line_width = 0.6 +support_bottom_stair_step_height = 0 +support_fan_enable = False +support_infill_rate = 12.0 +support_interface_enable = True +support_interface_pattern = lines +support_line_width = 0.3 +support_pattern = lines +support_roof_density = 97 +support_roof_height = 1.015 +support_roof_line_width = 0.25 +support_use_towers = False +support_xy_distance = 0.2 +support_xy_distance_overhang = 0.15 +support_z_distance = 0.25 + diff --git a/resources/quality/ultimaker_methodxl/um_methodxl_1xa_um-absr-175_0.2mm.inst.cfg b/resources/quality/ultimaker_methodxl/um_methodxl_1xa_um-absr-175_0.2mm.inst.cfg index 7445bd2d42..fd224e8798 100644 --- a/resources/quality/ultimaker_methodxl/um_methodxl_1xa_um-absr-175_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_methodxl/um_methodxl_1xa_um-absr-175_0.2mm.inst.cfg @@ -12,9 +12,7 @@ variant = 1XA weight = -2 [values] -build_volume_temperature = 85 cool_fan_enabled = False -default_material_bed_temperature = 95 raft_airgap = 0.3 speed_prime_tower = 30.0 speed_print = 120.0 diff --git a/resources/quality/ultimaker_methodxl/um_methodxl_1xa_um-asa-175_0.2mm.inst.cfg b/resources/quality/ultimaker_methodxl/um_methodxl_1xa_um-asa-175_0.2mm.inst.cfg new file mode 100644 index 0000000000..504ab8c10b --- /dev/null +++ b/resources/quality/ultimaker_methodxl/um_methodxl_1xa_um-asa-175_0.2mm.inst.cfg @@ -0,0 +1,51 @@ +[general] +definition = ultimaker_methodxl +name = Fast - Experimental +version = 4 + +[metadata] +is_experimental = True +material = ultimaker_asa_175 +quality_type = draft +setting_version = 22 +type = quality +variant = 1XA +weight = -2 + +[values] +cool_fan_enabled = False +material_print_temperature_layer_0 = =default_material_print_temperature+5 +raft_airgap = 0.3 +raft_base_speed = 10 +retract_at_layer_change = True +retraction_amount = 0.5 +retraction_min_travel = 3.2 +roofing_material_flow = 98.0 +small_skin_width = 3.6 +speed_prime_tower = 30.0 +speed_print = 120.0 +speed_roofing = 55 +speed_topbottom = 55 +speed_travel = 500 +speed_travel_layer_0 = 250 +speed_wall_0 = 45 +speed_wall_x = 65 +support_angle = 50 +support_bottom_density = 24 +support_bottom_enable = False +support_bottom_line_width = 0.6 +support_bottom_stair_step_height = 0 +support_fan_enable = False +support_infill_rate = 12.0 +support_interface_enable = True +support_interface_pattern = lines +support_line_width = 0.3 +support_pattern = lines +support_roof_density = 97 +support_roof_height = 1.015 +support_roof_line_width = 0.25 +support_use_towers = False +support_xy_distance = 0.2 +support_xy_distance_overhang = 0.15 +support_z_distance = 0.25 + diff --git a/resources/quality/ultimaker_methodxl/um_methodxl_2xa_um-sr30-175_0.2mm.inst.cfg b/resources/quality/ultimaker_methodxl/um_methodxl_2xa_um-sr30-175_0.2mm.inst.cfg new file mode 100644 index 0000000000..ebc6ecfe98 --- /dev/null +++ b/resources/quality/ultimaker_methodxl/um_methodxl_2xa_um-sr30-175_0.2mm.inst.cfg @@ -0,0 +1,41 @@ +[general] +definition = ultimaker_methodxl +name = Fast - Experimental +version = 4 + +[metadata] +is_experimental = True +material = ultimaker_sr30_175 +quality_type = draft +setting_version = 22 +type = quality +variant = 2XA +weight = -2 + +[values] +brim_replaces_support = False +cool_fan_enabled = False +cool_min_temperature = =material_print_temperature +raft_airgap = 0.0 +raft_interface_line_width = 0.7 +raft_interface_speed = 70 +raft_surface_speed = 90 +retract_at_layer_change = True +retraction_amount = 0.5 +speed_prime_tower = 25.0 +speed_print = 50 +speed_roofing = 50 +speed_support = 50 +speed_support_bottom = 30 +speed_support_interface = 80 +speed_topbottom = 50 +speed_wall_0 = 50 +speed_wall_x = 50 +support_bottom_wall_count = 5 +support_fan_enable = False +support_infill_sparse_thickness = =min(layer_height * 2, machine_nozzle_size * 3 / 4) if layer_height <= 0.15 / 0.4 * machine_nozzle_size else layer_height +support_interface_enable = True +support_wall_count = 1 +support_xy_distance = 0.2 +support_z_distance = 0 + diff --git a/resources/quality/ultimaker_methodxl/um_methodxl_labs_um-absr-175_0.2mm.inst.cfg b/resources/quality/ultimaker_methodxl/um_methodxl_labs_um-absr-175_0.2mm.inst.cfg index 2114be0ff4..4af8230b24 100644 --- a/resources/quality/ultimaker_methodxl/um_methodxl_labs_um-absr-175_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_methodxl/um_methodxl_labs_um-absr-175_0.2mm.inst.cfg @@ -12,9 +12,7 @@ variant = LABS weight = -2 [values] -build_volume_temperature = 85 cool_fan_enabled = False -default_material_bed_temperature = 95 raft_airgap = 0.3 speed_prime_tower = 30.0 speed_print = 120.0 diff --git a/resources/quality/ultimaker_methodxl/um_methodxl_labs_um-asa-175_0.2mm.inst.cfg b/resources/quality/ultimaker_methodxl/um_methodxl_labs_um-asa-175_0.2mm.inst.cfg new file mode 100644 index 0000000000..14c15fd3c5 --- /dev/null +++ b/resources/quality/ultimaker_methodxl/um_methodxl_labs_um-asa-175_0.2mm.inst.cfg @@ -0,0 +1,51 @@ +[general] +definition = ultimaker_methodxl +name = Fast - Experimental +version = 4 + +[metadata] +is_experimental = True +material = ultimaker_asa_175 +quality_type = draft +setting_version = 22 +type = quality +variant = LABS +weight = -2 + +[values] +cool_fan_enabled = False +material_print_temperature_layer_0 = =default_material_print_temperature+5 +raft_airgap = 0.3 +raft_base_speed = 10 +retract_at_layer_change = True +retraction_amount = 0.5 +retraction_min_travel = 3.2 +roofing_material_flow = 98.0 +small_skin_width = 3.6 +speed_prime_tower = 30.0 +speed_print = 120.0 +speed_roofing = 55 +speed_topbottom = 55 +speed_travel = 500 +speed_travel_layer_0 = 250 +speed_wall_0 = 45 +speed_wall_x = 65 +support_angle = 50 +support_bottom_density = 24 +support_bottom_enable = False +support_bottom_line_width = 0.6 +support_bottom_stair_step_height = 0 +support_fan_enable = False +support_infill_rate = 12.0 +support_interface_enable = True +support_interface_pattern = lines +support_line_width = 0.3 +support_pattern = lines +support_roof_density = 97 +support_roof_height = 1.015 +support_roof_line_width = 0.25 +support_use_towers = False +support_xy_distance = 0.2 +support_xy_distance_overhang = 0.15 +support_z_distance = 0.25 + diff --git a/resources/quality/ultimaker_methodxl/um_methodxl_labs_um-nylon12-cf-175_0.2mm.inst.cfg b/resources/quality/ultimaker_methodxl/um_methodxl_labs_um-nylon12-cf-175_0.2mm.inst.cfg new file mode 100644 index 0000000000..110fa5e4b5 --- /dev/null +++ b/resources/quality/ultimaker_methodxl/um_methodxl_labs_um-nylon12-cf-175_0.2mm.inst.cfg @@ -0,0 +1,53 @@ +[general] +definition = ultimaker_methodxl +name = Fast - Experimental +version = 4 + +[metadata] +is_experimental = True +material = ultimaker_nylon12-cf_175 +quality_type = draft +setting_version = 22 +type = quality +variant = LABS +weight = -2 + +[values] +cool_fan_enabled = False +material_final_print_temperature = =default_material_print_temperature-5 +material_initial_print_temperature = =default_material_print_temperature-5 +raft_airgap = 0.3 +raft_base_line_spacing = 3 +raft_base_line_width = 1.2 +raft_base_speed = 10 +retract_at_layer_change = True +retraction_amount = 0.5 +retraction_min_travel = 3.2 +roofing_material_flow = 100 +small_skin_width = 3.6 +speed_prime_tower = 30.0 +speed_print = 120.0 +speed_roofing = 55 +speed_topbottom = 55 +speed_travel = 250.0 +speed_wall_0 = 45 +speed_wall_x = 65 +support_angle = 50 +support_bottom_density = 24 +support_bottom_enable = False +support_bottom_line_width = 0.6 +support_bottom_stair_step_height = 0 +support_fan_enable = False +support_infill_rate = 12.0 +support_interface_enable = True +support_interface_pattern = lines +support_line_width = 0.3 +support_pattern = lines +support_roof_density = 97 +support_roof_height = 1.015 +support_roof_line_width = 0.25 +support_use_towers = False +support_xy_distance = 0.2 +support_xy_distance_overhang = 0.15 +support_z_distance = 0.25 + diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.25_nylon_0.1mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.25_nylon_0.1mm.inst.cfg index c6d99b63b5..e0d3aa4d50 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.25_nylon_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.25_nylon_0.1mm.inst.cfg @@ -17,7 +17,6 @@ machine_nozzle_heat_up_speed = 1.4 material_print_temperature = =default_material_print_temperature - 20 ooze_shield_angle = 40 raft_airgap = 0.4 -retraction_min_travel = 5 speed_print = 70 speed_topbottom = =math.ceil(speed_print * 30 / 70) speed_wall = =math.ceil(speed_print * 30 / 70) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.25_pc_0.1mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.25_pc_0.1mm.inst.cfg index ec86494397..369cbcd563 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.25_pc_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.25_pc_0.1mm.inst.cfg @@ -25,7 +25,6 @@ prime_tower_wipe_enabled = True raft_airgap = 0.25 retraction_hop = 2 retraction_hop_only_when_collides = True -retraction_min_travel = 0.8 speed_print = 50 speed_topbottom = =math.ceil(speed_print * 25 / 50) speed_wall = =math.ceil(speed_print * 40 / 50) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.25_pp_0.1mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.25_pp_0.1mm.inst.cfg index 77082932a5..6485844da8 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.25_pp_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.25_pp_0.1mm.inst.cfg @@ -28,7 +28,6 @@ retraction_count_max = 15 retraction_extra_prime_amount = 0.2 retraction_hop = 2 retraction_hop_only_when_collides = True -retraction_min_travel = 0.8 retraction_prime_speed = 15 speed_print = 25 speed_wall = =math.ceil(speed_print * 25 / 25) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.25_um-abs_0.1mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.25_um-abs_0.1mm.inst.cfg index 8557b08b1b..f989bcc3f6 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.25_um-abs_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.25_um-abs_0.1mm.inst.cfg @@ -65,7 +65,7 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = =math.ceil(0.3/layer_height)*layer_height +support_z_distance = 0.3 top_bottom_thickness = =max(1.2 , layer_height * 6) wall_0_wipe_dist = 0.8 z_seam_relative = True diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.25_um-petg_0.1mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.25_um-petg_0.1mm.inst.cfg index 1aa26ebcfc..e3965d9c5c 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.25_um-petg_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.25_um-petg_0.1mm.inst.cfg @@ -63,7 +63,7 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = =math.ceil(0.3/layer_height)*layer_height +support_z_distance = 0.3 top_bottom_thickness = =max(1.2 , layer_height * 6) wall_0_wipe_dist = 0.8 z_seam_relative = True diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.25_um-pla_0.1mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.25_um-pla_0.1mm.inst.cfg index 3343f7627a..9589f2f915 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.25_um-pla_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.25_um-pla_0.1mm.inst.cfg @@ -64,7 +64,7 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = =math.ceil(0.3/layer_height)*layer_height +support_z_distance = 0.3 top_bottom_thickness = =max(1 , layer_height * 5) wall_0_wipe_dist = 0.8 z_seam_relative = True diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.25_um-tough-pla_0.1mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.25_um-tough-pla_0.1mm.inst.cfg index d0d532f410..b8aec4972f 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.25_um-tough-pla_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.25_um-tough-pla_0.1mm.inst.cfg @@ -64,7 +64,7 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = =math.ceil(0.3/layer_height)*layer_height +support_z_distance = 0.3 top_bottom_thickness = =max(1 , layer_height * 5) wall_0_wipe_dist = 0.8 z_seam_relative = True diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_pc_0.06mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_pc_0.06mm.inst.cfg index f46f816cfb..c9eebee8a0 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_pc_0.06mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_pc_0.06mm.inst.cfg @@ -26,7 +26,6 @@ prime_tower_wipe_enabled = True raft_airgap = 0.25 retraction_hop = 2 retraction_hop_only_when_collides = True -retraction_min_travel = 0.8 speed_print = 50 speed_topbottom = =math.ceil(speed_print * 25 / 50) speed_wall = =math.ceil(speed_print * 40 / 50) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_pc_0.15mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_pc_0.15mm.inst.cfg index 2c23449373..bcd04f4b24 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_pc_0.15mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_pc_0.15mm.inst.cfg @@ -25,7 +25,6 @@ prime_tower_wipe_enabled = True raft_airgap = 0.25 retraction_hop = 2 retraction_hop_only_when_collides = True -retraction_min_travel = 0.8 speed_print = 50 speed_topbottom = =math.ceil(speed_print * 25 / 50) speed_wall = =math.ceil(speed_print * 40 / 50) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_pc_0.1mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_pc_0.1mm.inst.cfg index e0899c8dc2..278e502231 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_pc_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_pc_0.1mm.inst.cfg @@ -26,7 +26,6 @@ prime_tower_wipe_enabled = True raft_airgap = 0.25 retraction_hop = 2 retraction_hop_only_when_collides = True -retraction_min_travel = 0.8 speed_print = 50 speed_topbottom = =math.ceil(speed_print * 25 / 50) speed_wall = =math.ceil(speed_print * 40 / 50) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_pc_0.2mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_pc_0.2mm.inst.cfg index 329bd095d5..1baf43933c 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_pc_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_pc_0.2mm.inst.cfg @@ -25,7 +25,6 @@ prime_tower_wipe_enabled = True raft_airgap = 0.25 retraction_hop = 2 retraction_hop_only_when_collides = True -retraction_min_travel = 0.8 speed_print = 50 speed_topbottom = =math.ceil(speed_print * 25 / 50) speed_wall = =math.ceil(speed_print * 40 / 50) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_pp_0.15mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_pp_0.15mm.inst.cfg index eee8fc31b6..3b106196f2 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_pp_0.15mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_pp_0.15mm.inst.cfg @@ -28,7 +28,6 @@ retraction_count_max = 15 retraction_extra_prime_amount = 0.8 retraction_hop = 2 retraction_hop_only_when_collides = True -retraction_min_travel = 0.8 speed_print = 25 speed_topbottom = =math.ceil(speed_print * 25 / 25) speed_wall = =math.ceil(speed_print * 25 / 25) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_pp_0.1mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_pp_0.1mm.inst.cfg index fa87825718..455338a901 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_pp_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_pp_0.1mm.inst.cfg @@ -29,7 +29,6 @@ retraction_count_max = 15 retraction_extra_prime_amount = 0.8 retraction_hop = 2 retraction_hop_only_when_collides = True -retraction_min_travel = 0.8 speed_print = 25 speed_topbottom = =math.ceil(speed_print * 25 / 25) speed_wall = =math.ceil(speed_print * 25 / 25) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_pp_0.2mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_pp_0.2mm.inst.cfg index 6c90ec685f..b1f5e1f19a 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_pp_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_pp_0.2mm.inst.cfg @@ -29,7 +29,6 @@ retraction_count_max = 15 retraction_extra_prime_amount = 0.8 retraction_hop = 2 retraction_hop_only_when_collides = True -retraction_min_travel = 0.8 speed_print = 25 speed_topbottom = =math.ceil(speed_print * 25 / 25) speed_wall = =math.ceil(speed_print * 25 / 25) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_tpu_0.15mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_tpu_0.15mm.inst.cfg index 15018203e9..008a119dd2 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_tpu_0.15mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_tpu_0.15mm.inst.cfg @@ -12,6 +12,11 @@ variant = AA 0.4 weight = -1 [values] +bridge_skin_material_flow = 200 +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_material_flow = =bridge_skin_material_flow +bridge_wall_speed = 10 brim_width = 8.75 gradual_infill_step_height = =5 * layer_height infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'cross_3d' @@ -28,7 +33,6 @@ prime_tower_wipe_enabled = True retraction_count_max = 15 retraction_extra_prime_amount = 0.8 retraction_hop_only_when_collides = True -retraction_min_travel = =line_width * 2 skin_line_width = =round(line_width / 0.8, 2) speed_print = 25 speed_topbottom = =math.ceil(speed_print * 0.8) @@ -42,7 +46,7 @@ support_z_distance = =math.ceil(0.3/layer_height)*layer_height switch_extruder_prime_speed = 15 switch_extruder_retraction_amount = 20 switch_extruder_retraction_speeds = 35 -top_bottom_thickness = 0.7 +top_bottom_thickness = =layer_height * 6 travel_avoid_distance = 1.5 wall_0_inset = 0 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_tpu_0.1mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_tpu_0.1mm.inst.cfg index 1b9912c1d6..2b585a73ba 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_tpu_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_tpu_0.1mm.inst.cfg @@ -12,6 +12,11 @@ variant = AA 0.4 weight = 0 [values] +bridge_skin_material_flow = 200 +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_material_flow = =bridge_skin_material_flow +bridge_wall_speed = 10 brim_width = 8.75 gradual_infill_step_height = =5 * layer_height infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'cross_3d' @@ -29,7 +34,6 @@ prime_tower_wipe_enabled = True retraction_count_max = 15 retraction_extra_prime_amount = 0.8 retraction_hop_only_when_collides = True -retraction_min_travel = =line_width * 2 skin_line_width = =round(line_width / 0.8, 2) speed_print = 25 speed_topbottom = =math.ceil(speed_print * 0.8) @@ -43,7 +47,7 @@ support_z_distance = =math.ceil(0.3/layer_height)*layer_height switch_extruder_prime_speed = 15 switch_extruder_retraction_amount = 20 switch_extruder_retraction_speeds = 35 -top_bottom_thickness = 0.7 +top_bottom_thickness = =layer_height * 6 travel_avoid_distance = 1.5 wall_0_inset = 0 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_tpu_0.2mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_tpu_0.2mm.inst.cfg index 971cee7b3a..1932cf7213 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_tpu_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_tpu_0.2mm.inst.cfg @@ -12,6 +12,11 @@ variant = AA 0.4 weight = -2 [values] +bridge_skin_material_flow = 200 +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_material_flow = =bridge_skin_material_flow +bridge_wall_speed = 10 brim_width = 8.75 gradual_infill_step_height = =5 * layer_height infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'cross_3d' @@ -28,7 +33,6 @@ prime_tower_wipe_enabled = True retraction_count_max = 15 retraction_extra_prime_amount = 0.8 retraction_hop_only_when_collides = True -retraction_min_travel = =line_width * 2 skin_line_width = =round(line_width / 0.8, 2) speed_print = 25 speed_topbottom = =math.ceil(speed_print * 0.8) @@ -42,7 +46,7 @@ support_z_distance = =math.ceil(0.3/layer_height)*layer_height switch_extruder_prime_speed = 15 switch_extruder_retraction_amount = 20 switch_extruder_retraction_speeds = 35 -top_bottom_thickness = 0.7 +top_bottom_thickness = =layer_height * 6 travel_avoid_distance = 1.5 wall_0_inset = 0 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.06mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.06mm.inst.cfg index 85dc32801e..de5e0faf2e 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.06mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.06mm.inst.cfg @@ -65,7 +65,7 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = =math.ceil(0.3/layer_height)*layer_height +support_z_distance = 0.3 top_bottom_thickness = =max(1.2 , layer_height * 6) wall_0_wipe_dist = 0.8 z_seam_relative = True diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.15mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.15mm.inst.cfg index ee0525c13e..c39c6d42c8 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.15mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.15mm.inst.cfg @@ -66,7 +66,7 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = =math.ceil(0.3/layer_height)*layer_height +support_z_distance = 0.3 top_bottom_thickness = =max(1.2 , layer_height * 6) wall_0_wipe_dist = 0.8 z_seam_relative = True diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.1mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.1mm.inst.cfg index ca1d9d7afc..08bb2befdf 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.1mm.inst.cfg @@ -65,7 +65,7 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = =math.ceil(0.3/layer_height)*layer_height +support_z_distance = 0.3 top_bottom_thickness = =max(1.2 , layer_height * 6) wall_0_wipe_dist = 0.8 z_seam_relative = True diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.2mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.2mm.inst.cfg index 57413c4b30..89b8386d2f 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.2mm.inst.cfg @@ -28,6 +28,7 @@ bridge_skin_speed = =bridge_wall_speed bridge_sparse_infill_max_density = 50 bridge_wall_speed = 30 cool_min_layer_time = 4 +infill_material_flow = =1.05 * material_flow infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' infill_sparse_density = 15 jerk_infill = =jerk_print @@ -49,6 +50,7 @@ raft_airgap = 0.15 retraction_amount = 6.5 retraction_prime_speed = 15 retraction_speed = 45 +skin_material_flow = =material_flow small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print @@ -67,9 +69,11 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = =math.ceil(0.3/layer_height)*layer_height +support_z_distance = 0.3 top_bottom_thickness = =max(1.2 , layer_height * 6) wall_0_wipe_dist = 0.8 +wall_x_material_flow = =1.05 * wall_material_flow +wall_x_material_flow_roofing = =wall_material_flow z_seam_relative = True z_seam_type = back zig_zaggify_infill = True diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.3mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.3mm.inst.cfg index 0052ce90cd..cc0da1a253 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.3mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.3mm.inst.cfg @@ -67,7 +67,7 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = =math.ceil(0.3/layer_height)*layer_height +support_z_distance = 0.4 top_bottom_thickness = =max(1.2 , layer_height * 6) wall_0_wipe_dist = 0.8 wall_line_width_0 = =line_width * (1 + magic_spiralize * 0.25) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.06mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.06mm.inst.cfg index 0e9ceaf9e3..7eb5de8b64 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.06mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.06mm.inst.cfg @@ -64,7 +64,7 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = =math.ceil(0.3/layer_height)*layer_height +support_z_distance = 0.3 top_bottom_thickness = =max(1.2 , layer_height * 6) wall_0_wipe_dist = 0.8 z_seam_relative = True diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.15mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.15mm.inst.cfg index 8732c3ad63..d4431382dd 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.15mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.15mm.inst.cfg @@ -65,7 +65,7 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = =math.ceil(0.3/layer_height)*layer_height +support_z_distance = 0.3 top_bottom_thickness = =max(1.2 , layer_height * 6) wall_0_wipe_dist = 0.8 z_seam_relative = True diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.1mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.1mm.inst.cfg index 6f8db11141..bb7de56356 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.1mm.inst.cfg @@ -64,7 +64,7 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = =math.ceil(0.3/layer_height)*layer_height +support_z_distance = 0.3 top_bottom_thickness = =max(1.2 , layer_height * 6) wall_0_wipe_dist = 0.8 z_seam_relative = True diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.2mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.2mm.inst.cfg index e7e50350c0..c304f13e34 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.2mm.inst.cfg @@ -28,6 +28,7 @@ bridge_skin_speed = =bridge_wall_speed bridge_sparse_infill_max_density = 50 bridge_wall_speed = 30 cool_min_layer_time = 4 +infill_material_flow = =1.1 * material_flow infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' infill_sparse_density = 15 jerk_infill = =jerk_print @@ -48,6 +49,7 @@ prime_tower_enable = False retraction_amount = 8 retraction_prime_speed = 15 retraction_speed = 45 +skin_material_flow = =1.05 * material_flow small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print @@ -66,9 +68,11 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = =math.ceil(0.3/layer_height)*layer_height +support_z_distance = 0.3 top_bottom_thickness = =max(1.2 , layer_height * 6) wall_0_wipe_dist = 0.8 +wall_x_material_flow = =1.1 * wall_material_flow +wall_x_material_flow_roofing = =wall_material_flow z_seam_relative = True z_seam_type = back zig_zaggify_infill = True diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.3mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.3mm.inst.cfg index 5ecaa739db..854b868259 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.3mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.3mm.inst.cfg @@ -66,7 +66,7 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = =math.ceil(0.3/layer_height)*layer_height +support_z_distance = 0.4 top_bottom_thickness = =max(1.2 , layer_height * 6) wall_0_wipe_dist = 0.8 wall_line_width_0 = =line_width * (1 + magic_spiralize * 0.25) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.06mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.06mm.inst.cfg index 25887f19d7..9678ba9523 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.06mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.06mm.inst.cfg @@ -65,7 +65,7 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = =math.ceil(0.3/layer_height)*layer_height +support_z_distance = 0.3 top_bottom_thickness = =max(1 , layer_height * 5) wall_0_wipe_dist = 0.8 z_seam_relative = True diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.15mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.15mm.inst.cfg index 136a3bed42..c53596bc9f 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.15mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.15mm.inst.cfg @@ -66,7 +66,7 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = =math.ceil(0.3/layer_height)*layer_height +support_z_distance = 0.3 top_bottom_thickness = =max(1 , layer_height * 5) wall_0_wipe_dist = 0.8 z_seam_relative = True diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.1mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.1mm.inst.cfg index e8820673ea..58a8a1ebb0 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.1mm.inst.cfg @@ -65,7 +65,7 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = =math.ceil(0.3/layer_height)*layer_height +support_z_distance = 0.3 top_bottom_thickness = =max(1 , layer_height * 5) wall_0_wipe_dist = 0.8 z_seam_relative = True diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.2mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.2mm.inst.cfg index dcbb580edb..2870c09199 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.2mm.inst.cfg @@ -28,6 +28,7 @@ bridge_skin_speed = =bridge_wall_speed bridge_sparse_infill_max_density = 50 bridge_wall_speed = 30 cool_min_layer_time = 6 +infill_material_flow = =1.1 * material_flow infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' infill_sparse_density = 15 jerk_infill = =jerk_print @@ -49,6 +50,7 @@ raft_airgap = 0.25 retraction_amount = 6.5 retraction_prime_speed = =retraction_speed retraction_speed = 45 +skin_material_flow = =1.05 * material_flow small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print @@ -67,9 +69,11 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = =math.ceil(0.3/layer_height)*layer_height +support_z_distance = 0.3 top_bottom_thickness = =max(1 , layer_height * 5) wall_0_wipe_dist = 0.8 +wall_x_material_flow = =1.1 * wall_material_flow +wall_x_material_flow_roofing = =wall_material_flow z_seam_relative = True z_seam_type = back zig_zaggify_infill = True diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.3mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.3mm.inst.cfg index fc2a185be4..6f450463b9 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.3mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.3mm.inst.cfg @@ -67,7 +67,7 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = =math.ceil(0.3/layer_height)*layer_height +support_z_distance = 0.3 top_bottom_thickness = =max(1 , layer_height * 5) wall_0_wipe_dist = 0.8 wall_line_width_0 = =line_width * (1 + magic_spiralize * 0.25) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.06mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.06mm.inst.cfg index 73f25eae0f..e193aa51c3 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.06mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.06mm.inst.cfg @@ -65,7 +65,7 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = =math.ceil(0.3/layer_height)*layer_height +support_z_distance = 0.3 top_bottom_thickness = =max(1 , layer_height * 5) wall_0_wipe_dist = 0.8 z_seam_relative = True diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.15mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.15mm.inst.cfg index 2aa24f805d..622f2030e4 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.15mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.15mm.inst.cfg @@ -66,7 +66,7 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = =math.ceil(0.3/layer_height)*layer_height +support_z_distance = 0.35 top_bottom_thickness = =max(1 , layer_height * 5) wall_0_wipe_dist = 0.8 z_seam_relative = True diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.1mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.1mm.inst.cfg index e51d440c31..09f02aa375 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.1mm.inst.cfg @@ -65,7 +65,7 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = =math.ceil(0.3/layer_height)*layer_height +support_z_distance = 0.3 top_bottom_thickness = =max(1 , layer_height * 5) wall_0_wipe_dist = 0.8 z_seam_relative = True diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.2mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.2mm.inst.cfg index 151af3ed50..3b82ebfac7 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.2mm.inst.cfg @@ -28,6 +28,7 @@ bridge_skin_speed = =bridge_wall_speed bridge_sparse_infill_max_density = 50 bridge_wall_speed = 30 cool_min_layer_time = 6 +infill_material_flow = =1.1 * material_flow infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' infill_sparse_density = 15 jerk_infill = =jerk_print @@ -48,6 +49,7 @@ raft_airgap = 0.25 retraction_amount = 6.5 retraction_prime_speed = =retraction_speed retraction_speed = 45 +skin_material_flow = =1.05 * material_flow small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print @@ -66,9 +68,11 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = =math.ceil(0.3/layer_height)*layer_height +support_z_distance = 0.35 top_bottom_thickness = =max(1 , layer_height * 5) wall_0_wipe_dist = 0.8 +wall_x_material_flow = =1.1 * wall_material_flow +wall_x_material_flow_roofing = =wall_material_flow z_seam_relative = True z_seam_type = back zig_zaggify_infill = True diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.3mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.3mm.inst.cfg index 56c097d890..2fd9e5ef2c 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.3mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.3mm.inst.cfg @@ -67,7 +67,7 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = =math.ceil(0.3/layer_height)*layer_height +support_z_distance = 0.4 top_bottom_thickness = =max(1 , layer_height * 5) wall_0_wipe_dist = 0.8 wall_line_width_0 = =line_width * (1 + magic_spiralize * 0.25) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_pp_0.2mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_pp_0.2mm.inst.cfg index 163f32a36d..7619fcf43d 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.8_pp_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_pp_0.2mm.inst.cfg @@ -24,7 +24,6 @@ prime_tower_min_volume = 10 retraction_count_max = 15 retraction_extra_prime_amount = 0.5 retraction_hop = 0.5 -retraction_min_travel = 1.5 retraction_prime_speed = 15 speed_wall_x = =math.ceil(speed_wall * 30 / 30) switch_extruder_prime_speed = 15 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_pp_0.3mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_pp_0.3mm.inst.cfg index 3f75c3366e..b157ed198c 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.8_pp_0.3mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_pp_0.3mm.inst.cfg @@ -24,7 +24,6 @@ prime_tower_min_volume = 15 retraction_count_max = 15 retraction_extra_prime_amount = 0.5 retraction_hop = 0.5 -retraction_min_travel = 1.5 retraction_prime_speed = 15 speed_wall_x = =math.ceil(speed_wall * 30 / 30) switch_extruder_prime_speed = 15 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_pp_0.4mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_pp_0.4mm.inst.cfg index b2c5dab3c4..550a26c7f8 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.8_pp_0.4mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_pp_0.4mm.inst.cfg @@ -24,7 +24,6 @@ prime_tower_min_volume = 20 retraction_count_max = 15 retraction_extra_prime_amount = 0.5 retraction_hop = 0.5 -retraction_min_travel = 1.5 retraction_prime_speed = 15 speed_infill = =math.ceil(speed_wall * 30 / 30) speed_wall_x = =math.ceil(speed_wall * 30 / 30) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_tpu_0.2mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_tpu_0.2mm.inst.cfg index 75949f45aa..c2e0ba68af 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.8_tpu_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_tpu_0.2mm.inst.cfg @@ -12,6 +12,11 @@ variant = AA 0.8 weight = -2 [values] +bridge_skin_material_flow = 200 +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_material_flow = =bridge_skin_material_flow +bridge_wall_speed = 10 brim_width = 8.75 infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'cross_3d' machine_nozzle_cool_down_speed = 0.5 @@ -27,7 +32,6 @@ retraction_count_max = 15 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 speed_print = 30 speed_topbottom = =math.ceil(speed_print * 25 / 30) @@ -37,7 +41,7 @@ support_angle = 50 switch_extruder_prime_speed = 15 switch_extruder_retraction_amount = 20 switch_extruder_retraction_speeds = 45 -top_bottom_thickness = 1.2 +top_bottom_thickness = =layer_height * 6 top_skin_expand_distance = =line_width * 2 travel_avoid_distance = 1.5 wall_0_wipe_dist = =line_width * 2 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_tpu_0.3mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_tpu_0.3mm.inst.cfg index 034bda5d09..156d645694 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.8_tpu_0.3mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_tpu_0.3mm.inst.cfg @@ -12,6 +12,11 @@ variant = AA 0.8 weight = -3 [values] +bridge_skin_material_flow = 200 +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_material_flow = =bridge_skin_material_flow +bridge_wall_speed = 10 brim_width = 8.75 infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'cross_3d' infill_sparse_density = 15 @@ -28,7 +33,6 @@ retraction_count_max = 15 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 speed_print = 30 speed_topbottom = =math.ceil(speed_print * 23 / 30) @@ -38,7 +42,7 @@ support_angle = 50 switch_extruder_prime_speed = 15 switch_extruder_retraction_amount = 20 switch_extruder_retraction_speeds = 45 -top_bottom_thickness = 1.2 +top_bottom_thickness = =layer_height * 6 top_skin_expand_distance = =line_width * 2 travel_avoid_distance = 1.5 wall_0_wipe_dist = =line_width * 2 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_tpu_0.4mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_tpu_0.4mm.inst.cfg index e7189d5467..0f1e8357b3 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.8_tpu_0.4mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_tpu_0.4mm.inst.cfg @@ -12,6 +12,11 @@ variant = AA 0.8 weight = -4 [values] +bridge_skin_material_flow = 200 +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_material_flow = =bridge_skin_material_flow +bridge_wall_speed = 10 brim_width = 8.75 infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'cross_3d' infill_sparse_density = 15 @@ -27,7 +32,6 @@ retraction_count_max = 15 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 speed_infill = =speed_print speed_print = 30 @@ -38,7 +42,7 @@ support_angle = 50 switch_extruder_prime_speed = 15 switch_extruder_retraction_amount = 20 switch_extruder_retraction_speeds = 45 -top_bottom_thickness = 1.2 +top_bottom_thickness = =layer_height * 6 top_skin_expand_distance = =line_width * 2 travel_avoid_distance = 1.5 wall_0_wipe_dist = =line_width * 2 diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.25_nylon_0.1mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.25_nylon_0.1mm.inst.cfg index 38267fcf24..ea86a9a9a6 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.25_nylon_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.25_nylon_0.1mm.inst.cfg @@ -17,7 +17,6 @@ machine_nozzle_heat_up_speed = 1.4 material_print_temperature = =default_material_print_temperature - 20 ooze_shield_angle = 40 raft_airgap = 0.4 -retraction_min_travel = 5 speed_print = 70 speed_topbottom = =math.ceil(speed_print * 30 / 70) speed_wall = =math.ceil(speed_print * 30 / 70) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.25_pc_0.1mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.25_pc_0.1mm.inst.cfg index 5779142162..eef6e66a5e 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.25_pc_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.25_pc_0.1mm.inst.cfg @@ -25,7 +25,6 @@ prime_tower_wipe_enabled = True raft_airgap = 0.25 retraction_hop = 2 retraction_hop_only_when_collides = True -retraction_min_travel = 0.8 speed_print = 50 speed_topbottom = =math.ceil(speed_print * 25 / 50) speed_wall = =math.ceil(speed_print * 40 / 50) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.25_pp_0.1mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.25_pp_0.1mm.inst.cfg index 64b1be79aa..56689c4bfa 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.25_pp_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.25_pp_0.1mm.inst.cfg @@ -28,7 +28,6 @@ retraction_count_max = 15 retraction_extra_prime_amount = 0.2 retraction_hop = 2 retraction_hop_only_when_collides = True -retraction_min_travel = 0.8 retraction_prime_speed = 15 speed_print = 25 speed_wall = =math.ceil(speed_print * 25 / 25) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.25_um-abs_0.1mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.25_um-abs_0.1mm.inst.cfg index d725b5aa15..29057ff13b 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.25_um-abs_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.25_um-abs_0.1mm.inst.cfg @@ -65,7 +65,7 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = =math.ceil(0.3/layer_height)*layer_height +support_z_distance = 0.3 top_bottom_thickness = =max(1.2 , layer_height * 6) wall_0_wipe_dist = 0.8 z_seam_relative = True diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.25_um-petg_0.1mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.25_um-petg_0.1mm.inst.cfg index 82e07b6fdf..a2233703d4 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.25_um-petg_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.25_um-petg_0.1mm.inst.cfg @@ -63,7 +63,7 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = =math.ceil(0.3/layer_height)*layer_height +support_z_distance = 0.3 top_bottom_thickness = =max(1.2 , layer_height * 6) wall_0_wipe_dist = 0.8 z_seam_relative = True diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.25_um-pla_0.1mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.25_um-pla_0.1mm.inst.cfg index 789d186f77..44f6670085 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.25_um-pla_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.25_um-pla_0.1mm.inst.cfg @@ -64,7 +64,7 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = =math.ceil(0.3/layer_height)*layer_height +support_z_distance = 0.3 top_bottom_thickness = =max(1 , layer_height * 5) wall_0_wipe_dist = 0.8 z_seam_relative = True diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.25_um-tough-pla_0.1mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.25_um-tough-pla_0.1mm.inst.cfg index 307869d494..997f823e51 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.25_um-tough-pla_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.25_um-tough-pla_0.1mm.inst.cfg @@ -64,7 +64,7 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = =math.ceil(0.3/layer_height)*layer_height +support_z_distance = 0.3 top_bottom_thickness = =max(1 , layer_height * 5) wall_0_wipe_dist = 0.8 z_seam_relative = True diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_pc_0.06mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_pc_0.06mm.inst.cfg index 0b471a8c75..c58107dcf9 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_pc_0.06mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_pc_0.06mm.inst.cfg @@ -26,7 +26,6 @@ prime_tower_wipe_enabled = True raft_airgap = 0.25 retraction_hop = 2 retraction_hop_only_when_collides = True -retraction_min_travel = 0.8 speed_print = 50 speed_topbottom = =math.ceil(speed_print * 25 / 50) speed_wall = =math.ceil(speed_print * 40 / 50) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_pc_0.15mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_pc_0.15mm.inst.cfg index 6c9710e436..b210b894e5 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_pc_0.15mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_pc_0.15mm.inst.cfg @@ -25,7 +25,6 @@ prime_tower_wipe_enabled = True raft_airgap = 0.25 retraction_hop = 2 retraction_hop_only_when_collides = True -retraction_min_travel = 0.8 speed_print = 50 speed_topbottom = =math.ceil(speed_print * 25 / 50) speed_wall = =math.ceil(speed_print * 40 / 50) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_pc_0.1mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_pc_0.1mm.inst.cfg index 945b77e699..aa17d35a97 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_pc_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_pc_0.1mm.inst.cfg @@ -26,7 +26,6 @@ prime_tower_wipe_enabled = True raft_airgap = 0.25 retraction_hop = 2 retraction_hop_only_when_collides = True -retraction_min_travel = 0.8 speed_print = 50 speed_topbottom = =math.ceil(speed_print * 25 / 50) speed_wall = =math.ceil(speed_print * 40 / 50) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_pc_0.2mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_pc_0.2mm.inst.cfg index b523e3c646..616443b129 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_pc_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_pc_0.2mm.inst.cfg @@ -25,7 +25,6 @@ prime_tower_wipe_enabled = True raft_airgap = 0.25 retraction_hop = 2 retraction_hop_only_when_collides = True -retraction_min_travel = 0.8 speed_print = 50 speed_topbottom = =math.ceil(speed_print * 25 / 50) speed_wall = =math.ceil(speed_print * 40 / 50) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_pp_0.15mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_pp_0.15mm.inst.cfg index 85e892628d..8eb0d257d6 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_pp_0.15mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_pp_0.15mm.inst.cfg @@ -28,7 +28,6 @@ retraction_count_max = 15 retraction_extra_prime_amount = 0.8 retraction_hop = 2 retraction_hop_only_when_collides = True -retraction_min_travel = 0.8 speed_print = 25 speed_topbottom = =math.ceil(speed_print * 25 / 25) speed_wall = =math.ceil(speed_print * 25 / 25) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_pp_0.1mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_pp_0.1mm.inst.cfg index 531f946ba8..bd4dd317bb 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_pp_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_pp_0.1mm.inst.cfg @@ -29,7 +29,6 @@ retraction_count_max = 15 retraction_extra_prime_amount = 0.8 retraction_hop = 2 retraction_hop_only_when_collides = True -retraction_min_travel = 0.8 speed_print = 25 speed_topbottom = =math.ceil(speed_print * 25 / 25) speed_wall = =math.ceil(speed_print * 25 / 25) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_pp_0.2mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_pp_0.2mm.inst.cfg index a7f63a76b1..1e5ea9efb6 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_pp_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_pp_0.2mm.inst.cfg @@ -29,7 +29,6 @@ retraction_count_max = 15 retraction_extra_prime_amount = 0.8 retraction_hop = 2 retraction_hop_only_when_collides = True -retraction_min_travel = 0.8 speed_print = 25 speed_topbottom = =math.ceil(speed_print * 25 / 25) speed_wall = =math.ceil(speed_print * 25 / 25) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_tpu_0.15mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_tpu_0.15mm.inst.cfg index 0b69ae0c43..d718e44a02 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_tpu_0.15mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_tpu_0.15mm.inst.cfg @@ -12,6 +12,11 @@ variant = AA 0.4 weight = -1 [values] +bridge_skin_material_flow = 200 +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_material_flow = =bridge_skin_material_flow +bridge_wall_speed = 10 brim_width = 8.75 gradual_infill_step_height = =5 * layer_height infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'cross_3d' @@ -28,7 +33,6 @@ prime_tower_wipe_enabled = True retraction_count_max = 15 retraction_extra_prime_amount = 0.8 retraction_hop_only_when_collides = True -retraction_min_travel = =line_width * 2 skin_line_width = =round(line_width / 0.8, 2) speed_print = 25 speed_topbottom = =math.ceil(speed_print * 0.8) @@ -42,7 +46,7 @@ support_z_distance = =math.ceil(0.3/layer_height)*layer_height switch_extruder_prime_speed = 15 switch_extruder_retraction_amount = 20 switch_extruder_retraction_speeds = 35 -top_bottom_thickness = 0.7 +top_bottom_thickness = =layer_height * 6 travel_avoid_distance = 1.5 wall_0_inset = 0 diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_tpu_0.1mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_tpu_0.1mm.inst.cfg index 29aa42a436..55a724e260 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_tpu_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_tpu_0.1mm.inst.cfg @@ -12,6 +12,11 @@ variant = AA 0.4 weight = 0 [values] +bridge_skin_material_flow = 200 +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_material_flow = =bridge_skin_material_flow +bridge_wall_speed = 10 brim_width = 8.75 gradual_infill_step_height = =5 * layer_height infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'cross_3d' @@ -29,7 +34,6 @@ prime_tower_wipe_enabled = True retraction_count_max = 15 retraction_extra_prime_amount = 0.8 retraction_hop_only_when_collides = True -retraction_min_travel = =line_width * 2 skin_line_width = =round(line_width / 0.8, 2) speed_print = 25 speed_topbottom = =math.ceil(speed_print * 0.8) @@ -43,7 +47,7 @@ support_z_distance = =math.ceil(0.3/layer_height)*layer_height switch_extruder_prime_speed = 15 switch_extruder_retraction_amount = 20 switch_extruder_retraction_speeds = 35 -top_bottom_thickness = 0.7 +top_bottom_thickness = =layer_height * 6 travel_avoid_distance = 1.5 wall_0_inset = 0 diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_tpu_0.2mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_tpu_0.2mm.inst.cfg index 48e6ffb81b..591e8e91bd 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_tpu_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_tpu_0.2mm.inst.cfg @@ -12,6 +12,11 @@ variant = AA 0.4 weight = -2 [values] +bridge_skin_material_flow = 200 +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_material_flow = =bridge_skin_material_flow +bridge_wall_speed = 10 brim_width = 8.75 gradual_infill_step_height = =5 * layer_height infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'cross_3d' @@ -28,7 +33,6 @@ prime_tower_wipe_enabled = True retraction_count_max = 15 retraction_extra_prime_amount = 0.8 retraction_hop_only_when_collides = True -retraction_min_travel = =line_width * 2 skin_line_width = =round(line_width / 0.8, 2) speed_print = 25 speed_topbottom = =math.ceil(speed_print * 0.8) @@ -42,7 +46,7 @@ support_z_distance = =math.ceil(0.3/layer_height)*layer_height switch_extruder_prime_speed = 15 switch_extruder_retraction_amount = 20 switch_extruder_retraction_speeds = 35 -top_bottom_thickness = 0.7 +top_bottom_thickness = =layer_height * 6 travel_avoid_distance = 1.5 wall_0_inset = 0 diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.06mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.06mm.inst.cfg index fbe230fb2e..c0b4799ca9 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.06mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.06mm.inst.cfg @@ -65,7 +65,7 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = =math.ceil(0.3/layer_height)*layer_height +support_z_distance = 0.3 top_bottom_thickness = =max(1.2 , layer_height * 6) wall_0_wipe_dist = 0.8 z_seam_relative = True diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.15mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.15mm.inst.cfg index 9c7ceca13b..d430f867d8 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.15mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.15mm.inst.cfg @@ -66,7 +66,7 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = =math.ceil(0.3/layer_height)*layer_height +support_z_distance = 0.3 top_bottom_thickness = =max(1.2 , layer_height * 6) wall_0_wipe_dist = 0.8 z_seam_relative = True diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.1mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.1mm.inst.cfg index 8ef78a6fb5..b2c25e26c7 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.1mm.inst.cfg @@ -65,7 +65,7 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = =math.ceil(0.3/layer_height)*layer_height +support_z_distance = 0.3 top_bottom_thickness = =max(1.2 , layer_height * 6) wall_0_wipe_dist = 0.8 z_seam_relative = True diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.2mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.2mm.inst.cfg index f430e6bc16..15b87d8229 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.2mm.inst.cfg @@ -28,6 +28,7 @@ bridge_skin_speed = =bridge_wall_speed bridge_sparse_infill_max_density = 50 bridge_wall_speed = 30 cool_min_layer_time = 4 +infill_material_flow = =1.05 * material_flow infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' infill_sparse_density = 15 jerk_infill = =jerk_print @@ -49,6 +50,7 @@ raft_airgap = 0.15 retraction_amount = 6.5 retraction_prime_speed = 15 retraction_speed = 45 +skin_material_flow = =material_flow small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print @@ -67,9 +69,11 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = =math.ceil(0.3/layer_height)*layer_height +support_z_distance = 0.3 top_bottom_thickness = =max(1.2 , layer_height * 6) wall_0_wipe_dist = 0.8 +wall_x_material_flow = =1.05 * wall_material_flow +wall_x_material_flow_roofing = =wall_material_flow z_seam_relative = True z_seam_type = back zig_zaggify_infill = True diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.3mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.3mm.inst.cfg index 98ca8927b6..9a10024813 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.3mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.3mm.inst.cfg @@ -67,7 +67,7 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = =math.ceil(0.3/layer_height)*layer_height +support_z_distance = 0.4 top_bottom_thickness = =max(1.2 , layer_height * 6) wall_0_wipe_dist = 0.8 wall_line_width_0 = =line_width * (1 + magic_spiralize * 0.25) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.06mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.06mm.inst.cfg index aea8906877..ef58c14663 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.06mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.06mm.inst.cfg @@ -64,7 +64,7 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = =math.ceil(0.3/layer_height)*layer_height +support_z_distance = 0.3 top_bottom_thickness = =max(1.2 , layer_height * 6) wall_0_wipe_dist = 0.8 z_seam_relative = True diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.15mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.15mm.inst.cfg index 201c663d5c..5d14f014b9 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.15mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.15mm.inst.cfg @@ -65,7 +65,7 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = =math.ceil(0.3/layer_height)*layer_height +support_z_distance = 0.3 top_bottom_thickness = =max(1.2 , layer_height * 6) wall_0_wipe_dist = 0.8 z_seam_relative = True diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.1mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.1mm.inst.cfg index a9d239bf3a..d23a7b8cea 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.1mm.inst.cfg @@ -64,7 +64,7 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = =math.ceil(0.3/layer_height)*layer_height +support_z_distance = 0.3 top_bottom_thickness = =max(1.2 , layer_height * 6) wall_0_wipe_dist = 0.8 z_seam_relative = True diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.2mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.2mm.inst.cfg index 55696eccb4..4e1b0f535f 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.2mm.inst.cfg @@ -28,6 +28,7 @@ bridge_skin_speed = =bridge_wall_speed bridge_sparse_infill_max_density = 50 bridge_wall_speed = 30 cool_min_layer_time = 4 +infill_material_flow = =1.1 * material_flow infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' infill_sparse_density = 15 jerk_infill = =jerk_print @@ -48,6 +49,7 @@ prime_tower_enable = False retraction_amount = 8 retraction_prime_speed = 15 retraction_speed = 45 +skin_material_flow = =1.05 * material_flow small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print @@ -66,9 +68,11 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = =math.ceil(0.3/layer_height)*layer_height +support_z_distance = 0.3 top_bottom_thickness = =max(1.2 , layer_height * 6) wall_0_wipe_dist = 0.8 +wall_x_material_flow = =1.1 * wall_material_flow +wall_x_material_flow_roofing = =wall_material_flow z_seam_relative = True z_seam_type = back zig_zaggify_infill = True diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.3mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.3mm.inst.cfg index fe3eeb67ad..ab66eed0ab 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.3mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.3mm.inst.cfg @@ -66,7 +66,7 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = =math.ceil(0.3/layer_height)*layer_height +support_z_distance = 0.4 top_bottom_thickness = =max(1.2 , layer_height * 6) wall_0_wipe_dist = 0.8 wall_line_width_0 = =line_width * (1 + magic_spiralize * 0.25) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.06mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.06mm.inst.cfg index a9043c7372..2b192e8c1c 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.06mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.06mm.inst.cfg @@ -65,7 +65,7 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = =math.ceil(0.3/layer_height)*layer_height +support_z_distance = 0.3 top_bottom_thickness = =max(1 , layer_height * 5) wall_0_wipe_dist = 0.8 z_seam_relative = True diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.15mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.15mm.inst.cfg index 713f94219f..11301a2990 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.15mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.15mm.inst.cfg @@ -66,7 +66,7 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = =math.ceil(0.3/layer_height)*layer_height +support_z_distance = 0.3 top_bottom_thickness = =max(1 , layer_height * 5) wall_0_wipe_dist = 0.8 z_seam_relative = True diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.1mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.1mm.inst.cfg index 4e451d4165..1d07e0f63c 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.1mm.inst.cfg @@ -65,7 +65,7 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = =math.ceil(0.3/layer_height)*layer_height +support_z_distance = 0.3 top_bottom_thickness = =max(1 , layer_height * 5) wall_0_wipe_dist = 0.8 z_seam_relative = True diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.2mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.2mm.inst.cfg index 02d22b06b8..28cf131812 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.2mm.inst.cfg @@ -28,6 +28,7 @@ bridge_skin_speed = =bridge_wall_speed bridge_sparse_infill_max_density = 50 bridge_wall_speed = 30 cool_min_layer_time = 6 +infill_material_flow = =1.1 * material_flow infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' infill_sparse_density = 15 jerk_infill = =jerk_print @@ -49,6 +50,7 @@ raft_airgap = 0.25 retraction_amount = 6.5 retraction_prime_speed = =retraction_speed retraction_speed = 45 +skin_material_flow = =1.05 * material_flow small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print @@ -67,9 +69,11 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = =math.ceil(0.3/layer_height)*layer_height +support_z_distance = 0.3 top_bottom_thickness = =max(1 , layer_height * 5) wall_0_wipe_dist = 0.8 +wall_x_material_flow = =1.1 * wall_material_flow +wall_x_material_flow_roofing = =wall_material_flow z_seam_relative = True z_seam_type = back zig_zaggify_infill = True diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.3mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.3mm.inst.cfg index b0d5d41d0f..a01b433eb2 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.3mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.3mm.inst.cfg @@ -67,7 +67,7 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = =math.ceil(0.3/layer_height)*layer_height +support_z_distance = 0.3 top_bottom_thickness = =max(1 , layer_height * 5) wall_0_wipe_dist = 0.8 wall_line_width_0 = =line_width * (1 + magic_spiralize * 0.25) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.06mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.06mm.inst.cfg index 641c1279e4..f368ac13d8 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.06mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.06mm.inst.cfg @@ -65,7 +65,7 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = =math.ceil(0.3/layer_height)*layer_height +support_z_distance = 0.3 top_bottom_thickness = =max(1 , layer_height * 5) wall_0_wipe_dist = 0.8 z_seam_relative = True diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.15mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.15mm.inst.cfg index 55e724da9d..b699ebc9f3 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.15mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.15mm.inst.cfg @@ -66,7 +66,7 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = =math.ceil(0.3/layer_height)*layer_height +support_z_distance = 0.35 top_bottom_thickness = =max(1 , layer_height * 5) wall_0_wipe_dist = 0.8 z_seam_relative = True diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.1mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.1mm.inst.cfg index 35e8c0903c..d0ee391c65 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.1mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.1mm.inst.cfg @@ -65,7 +65,7 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = =math.ceil(0.3/layer_height)*layer_height +support_z_distance = 0.3 top_bottom_thickness = =max(1 , layer_height * 5) wall_0_wipe_dist = 0.8 z_seam_relative = True diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.2mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.2mm.inst.cfg index ee0ee279e6..9869a18bb3 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.2mm.inst.cfg @@ -28,6 +28,7 @@ bridge_skin_speed = =bridge_wall_speed bridge_sparse_infill_max_density = 50 bridge_wall_speed = 30 cool_min_layer_time = 6 +infill_material_flow = =1.1 * material_flow infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' infill_sparse_density = 15 jerk_infill = =jerk_print @@ -48,6 +49,7 @@ raft_airgap = 0.25 retraction_amount = 6.5 retraction_prime_speed = =retraction_speed retraction_speed = 45 +skin_material_flow = =1.05 * material_flow small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print @@ -66,9 +68,11 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = =math.ceil(0.3/layer_height)*layer_height +support_z_distance = 0.35 top_bottom_thickness = =max(1 , layer_height * 5) wall_0_wipe_dist = 0.8 +wall_x_material_flow = =1.1 * wall_material_flow +wall_x_material_flow_roofing = =wall_material_flow z_seam_relative = True z_seam_type = back zig_zaggify_infill = True diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.3mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.3mm.inst.cfg index 875bd5a669..fc8507c42b 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.3mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.3mm.inst.cfg @@ -67,7 +67,7 @@ support_bottom_distance = =support_z_distance support_interface_enable = True support_structure = tree support_top_distance = =support_z_distance -support_z_distance = =math.ceil(0.3/layer_height)*layer_height +support_z_distance = 0.4 top_bottom_thickness = =max(1 , layer_height * 5) wall_0_wipe_dist = 0.8 wall_line_width_0 = =line_width * (1 + magic_spiralize * 0.25) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.8_pp_0.2mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.8_pp_0.2mm.inst.cfg index 149104700e..c338c4b7ff 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.8_pp_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.8_pp_0.2mm.inst.cfg @@ -24,7 +24,6 @@ prime_tower_min_volume = 10 retraction_count_max = 15 retraction_extra_prime_amount = 0.5 retraction_hop = 0.5 -retraction_min_travel = 1.5 retraction_prime_speed = 15 speed_wall_x = =math.ceil(speed_wall * 30 / 30) switch_extruder_prime_speed = 15 diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.8_pp_0.3mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.8_pp_0.3mm.inst.cfg index 670ec78d51..62d9eb235d 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.8_pp_0.3mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.8_pp_0.3mm.inst.cfg @@ -24,7 +24,6 @@ prime_tower_min_volume = 15 retraction_count_max = 15 retraction_extra_prime_amount = 0.5 retraction_hop = 0.5 -retraction_min_travel = 1.5 retraction_prime_speed = 15 speed_wall_x = =math.ceil(speed_wall * 30 / 30) switch_extruder_prime_speed = 15 diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.8_pp_0.4mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.8_pp_0.4mm.inst.cfg index c9b5c26d64..b2792b6fee 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.8_pp_0.4mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.8_pp_0.4mm.inst.cfg @@ -24,7 +24,6 @@ prime_tower_min_volume = 20 retraction_count_max = 15 retraction_extra_prime_amount = 0.5 retraction_hop = 0.5 -retraction_min_travel = 1.5 retraction_prime_speed = 15 speed_infill = =math.ceil(speed_wall * 30 / 30) speed_wall_x = =math.ceil(speed_wall * 30 / 30) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.8_tpu_0.2mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.8_tpu_0.2mm.inst.cfg index 43436cd4c7..941bfb3736 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.8_tpu_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.8_tpu_0.2mm.inst.cfg @@ -12,6 +12,11 @@ variant = AA 0.8 weight = -2 [values] +bridge_skin_material_flow = 200 +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_material_flow = =bridge_skin_material_flow +bridge_wall_speed = 10 brim_width = 8.75 infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'cross_3d' machine_nozzle_cool_down_speed = 0.5 @@ -27,7 +32,6 @@ retraction_count_max = 15 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 speed_print = 30 speed_topbottom = =math.ceil(speed_print * 25 / 30) @@ -37,7 +41,7 @@ support_angle = 50 switch_extruder_prime_speed = 15 switch_extruder_retraction_amount = 20 switch_extruder_retraction_speeds = 45 -top_bottom_thickness = 1.2 +top_bottom_thickness = =layer_height * 6 top_skin_expand_distance = =line_width * 2 travel_avoid_distance = 1.5 wall_0_wipe_dist = =line_width * 2 diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.8_tpu_0.3mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.8_tpu_0.3mm.inst.cfg index 58b524dd2a..11db9e5a62 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.8_tpu_0.3mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.8_tpu_0.3mm.inst.cfg @@ -12,6 +12,11 @@ variant = AA 0.8 weight = -3 [values] +bridge_skin_material_flow = 200 +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_material_flow = =bridge_skin_material_flow +bridge_wall_speed = 10 brim_width = 8.75 infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'cross_3d' infill_sparse_density = 15 @@ -28,7 +33,6 @@ retraction_count_max = 15 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 speed_print = 30 speed_topbottom = =math.ceil(speed_print * 23 / 30) @@ -38,7 +42,7 @@ support_angle = 50 switch_extruder_prime_speed = 15 switch_extruder_retraction_amount = 20 switch_extruder_retraction_speeds = 45 -top_bottom_thickness = 1.2 +top_bottom_thickness = =layer_height * 6 top_skin_expand_distance = =line_width * 2 travel_avoid_distance = 1.5 wall_0_wipe_dist = =line_width * 2 diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.8_tpu_0.4mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.8_tpu_0.4mm.inst.cfg index d17ec5486a..ac2049daae 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.8_tpu_0.4mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.8_tpu_0.4mm.inst.cfg @@ -12,6 +12,11 @@ variant = AA 0.8 weight = -4 [values] +bridge_skin_material_flow = 200 +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_material_flow = =bridge_skin_material_flow +bridge_wall_speed = 10 brim_width = 8.75 infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'cross_3d' infill_sparse_density = 15 @@ -27,7 +32,6 @@ retraction_count_max = 15 retraction_extra_prime_amount = 0.5 retraction_hop = 1.5 retraction_hop_only_when_collides = False -retraction_min_travel = =line_width * 2 speed_infill = =speed_print speed_print = 30 speed_topbottom = =math.ceil(speed_print * 20 / 30) @@ -37,7 +41,7 @@ support_angle = 50 switch_extruder_prime_speed = 15 switch_extruder_retraction_amount = 20 switch_extruder_retraction_speeds = 45 -top_bottom_thickness = 1.2 +top_bottom_thickness = =layer_height * 6 top_skin_expand_distance = =line_width * 2 travel_avoid_distance = 1.5 wall_0_wipe_dist = =line_width * 2 diff --git a/resources/setting_visibility/advanced.cfg b/resources/setting_visibility/advanced.cfg index c3451d2c98..55a36075be 100644 --- a/resources/setting_visibility/advanced.cfg +++ b/resources/setting_visibility/advanced.cfg @@ -128,6 +128,7 @@ brim_outside_only [dual] prime_tower_enable +prime_tower_mode prime_tower_position_x prime_tower_position_y prime_tower_brim_enable @@ -136,6 +137,7 @@ prime_tower_brim_enable [blackmagic] print_sequence +user_defined_print_order_enabled magic_mesh_surface_mode magic_spiralize smooth_spiralized_contours diff --git a/resources/setting_visibility/expert.cfg b/resources/setting_visibility/expert.cfg index 52c08f70ba..130b2580a4 100644 --- a/resources/setting_visibility/expert.cfg +++ b/resources/setting_visibility/expert.cfg @@ -357,6 +357,7 @@ raft_is_shrink_plate [dual] prime_tower_enable +prime_tower_mode prime_tower_size prime_tower_min_volume prime_tower_position_x @@ -367,6 +368,7 @@ prime_tower_base_size prime_tower_base_height prime_tower_base_curve_magnitude prime_tower_raft_base_line_spacing +prime_tower_max_bridging_distance ooze_shield_enabled ooze_shield_angle ooze_shield_dist @@ -391,6 +393,7 @@ meshfix_fluid_motion_angle [blackmagic] print_sequence +user_defined_print_order_enabled infill_mesh infill_mesh_order cutting_mesh diff --git a/resources/themes/cura-light/icons/default/CuraShareIcon.svg b/resources/themes/cura-light/icons/default/CuraShareIcon.svg new file mode 100644 index 0000000000..fb9a6b922c --- /dev/null +++ b/resources/themes/cura-light/icons/default/CuraShareIcon.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/variants/creality/creality_ender3v2neo_0.2.inst.cfg b/resources/variants/creality/creality_ender3v2neo_0.2.inst.cfg new file mode 100644 index 0000000000..bed0bbe51f --- /dev/null +++ b/resources/variants/creality/creality_ender3v2neo_0.2.inst.cfg @@ -0,0 +1,13 @@ +[general] +definition = creality_ender3v2neo +name = 0.2mm Nozzle +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 22 +type = variant + +[values] +machine_nozzle_size = 0.2 + diff --git a/resources/variants/creality/creality_ender3v2neo_0.3.inst.cfg b/resources/variants/creality/creality_ender3v2neo_0.3.inst.cfg new file mode 100644 index 0000000000..fba4336839 --- /dev/null +++ b/resources/variants/creality/creality_ender3v2neo_0.3.inst.cfg @@ -0,0 +1,13 @@ +[general] +definition = creality_ender3v2neo +name = 0.3mm Nozzle +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 22 +type = variant + +[values] +machine_nozzle_size = 0.3 + diff --git a/resources/variants/creality/creality_ender3v2neo_0.4.inst.cfg b/resources/variants/creality/creality_ender3v2neo_0.4.inst.cfg new file mode 100644 index 0000000000..80a2f5cb71 --- /dev/null +++ b/resources/variants/creality/creality_ender3v2neo_0.4.inst.cfg @@ -0,0 +1,13 @@ +[general] +definition = creality_ender3v2neo +name = 0.4mm Nozzle +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 22 +type = variant + +[values] +machine_nozzle_size = 0.4 + diff --git a/resources/variants/creality/creality_ender3v2neo_0.5.inst.cfg b/resources/variants/creality/creality_ender3v2neo_0.5.inst.cfg new file mode 100644 index 0000000000..d6071382f8 --- /dev/null +++ b/resources/variants/creality/creality_ender3v2neo_0.5.inst.cfg @@ -0,0 +1,13 @@ +[general] +definition = creality_ender3v2neo +name = 0.5mm Nozzle +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 22 +type = variant + +[values] +machine_nozzle_size = 0.5 + diff --git a/resources/variants/creality/creality_ender3v2neo_0.6.inst.cfg b/resources/variants/creality/creality_ender3v2neo_0.6.inst.cfg new file mode 100644 index 0000000000..4abca4f34e --- /dev/null +++ b/resources/variants/creality/creality_ender3v2neo_0.6.inst.cfg @@ -0,0 +1,13 @@ +[general] +definition = creality_ender3v2neo +name = 0.6mm Nozzle +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 22 +type = variant + +[values] +machine_nozzle_size = 0.6 + diff --git a/resources/variants/creality/creality_ender3v2neo_0.8.inst.cfg b/resources/variants/creality/creality_ender3v2neo_0.8.inst.cfg new file mode 100644 index 0000000000..d5ef899ed6 --- /dev/null +++ b/resources/variants/creality/creality_ender3v2neo_0.8.inst.cfg @@ -0,0 +1,13 @@ +[general] +definition = creality_ender3v2neo +name = 0.8mm Nozzle +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 22 +type = variant + +[values] +machine_nozzle_size = 0.8 + diff --git a/resources/variants/creality/creality_ender3v2neo_1.0.inst.cfg b/resources/variants/creality/creality_ender3v2neo_1.0.inst.cfg new file mode 100644 index 0000000000..8dee589cd1 --- /dev/null +++ b/resources/variants/creality/creality_ender3v2neo_1.0.inst.cfg @@ -0,0 +1,13 @@ +[general] +definition = creality_ender3v2neo +name = 1.0mm Nozzle +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 22 +type = variant + +[values] +machine_nozzle_size = 1.0 + diff --git a/resources/variants/dagoma/dagoma_sigma_pro_brass_0.4.inst.cfg b/resources/variants/dagoma/dagoma_sigma_pro_brass_0.4.inst.cfg new file mode 100644 index 0000000000..0e090023fa --- /dev/null +++ b/resources/variants/dagoma/dagoma_sigma_pro_brass_0.4.inst.cfg @@ -0,0 +1,14 @@ +[general] +definition = dagoma_sigma_pro +name = Brass 0.4mm +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 22 +type = variant + +[values] +machine_nozzle_id = Brass 0.4mm +machine_nozzle_size = 0.4 + diff --git a/resources/variants/dagoma/dagoma_sigma_pro_brass_0.8.inst.cfg b/resources/variants/dagoma/dagoma_sigma_pro_brass_0.8.inst.cfg new file mode 100644 index 0000000000..bc9a8e9ea5 --- /dev/null +++ b/resources/variants/dagoma/dagoma_sigma_pro_brass_0.8.inst.cfg @@ -0,0 +1,14 @@ +[general] +definition = dagoma_sigma_pro +name = Brass 0.8mm +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 22 +type = variant + +[values] +machine_nozzle_id = Brass 0.8mm +machine_nozzle_size = 0.8 + diff --git a/resources/variants/dagoma/dagoma_sigma_pro_dual_brass_0.4.inst.cfg b/resources/variants/dagoma/dagoma_sigma_pro_dual_brass_0.4.inst.cfg new file mode 100644 index 0000000000..0ea1a14227 --- /dev/null +++ b/resources/variants/dagoma/dagoma_sigma_pro_dual_brass_0.4.inst.cfg @@ -0,0 +1,14 @@ +[general] +definition = dagoma_sigma_pro_dual +name = Brass 0.4mm +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 22 +type = variant + +[values] +machine_nozzle_id = Brass 0.4mm +machine_nozzle_size = 0.4 + diff --git a/resources/variants/dagoma/dagoma_sigma_pro_dual_brass_0.8.inst.cfg b/resources/variants/dagoma/dagoma_sigma_pro_dual_brass_0.8.inst.cfg new file mode 100644 index 0000000000..96f9d485dc --- /dev/null +++ b/resources/variants/dagoma/dagoma_sigma_pro_dual_brass_0.8.inst.cfg @@ -0,0 +1,14 @@ +[general] +definition = dagoma_sigma_pro_dual +name = Brass 0.8mm +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 22 +type = variant + +[values] +machine_nozzle_id = Brass 0.8mm +machine_nozzle_size = 0.8 + diff --git a/resources/variants/dagoma/dagoma_sigma_pro_dual_steel_0.4.inst.cfg b/resources/variants/dagoma/dagoma_sigma_pro_dual_steel_0.4.inst.cfg new file mode 100644 index 0000000000..1e1664a0ac --- /dev/null +++ b/resources/variants/dagoma/dagoma_sigma_pro_dual_steel_0.4.inst.cfg @@ -0,0 +1,14 @@ +[general] +definition = dagoma_sigma_pro_dual +name = Steel 0.4mm +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 22 +type = variant + +[values] +machine_nozzle_id = Steel 0.4mm +machine_nozzle_size = 0.4 + diff --git a/resources/variants/dagoma/dagoma_sigma_pro_dual_steel_0.8.inst.cfg b/resources/variants/dagoma/dagoma_sigma_pro_dual_steel_0.8.inst.cfg new file mode 100644 index 0000000000..b2dd1421d7 --- /dev/null +++ b/resources/variants/dagoma/dagoma_sigma_pro_dual_steel_0.8.inst.cfg @@ -0,0 +1,14 @@ +[general] +definition = dagoma_sigma_pro_dual +name = Steel 0.8mm +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 22 +type = variant + +[values] +machine_nozzle_id = Steel 0.8mm +machine_nozzle_size = 0.8 + diff --git a/resources/variants/dagoma/dagoma_sigma_pro_steel_0.4.inst.cfg b/resources/variants/dagoma/dagoma_sigma_pro_steel_0.4.inst.cfg new file mode 100644 index 0000000000..d85b89aaa3 --- /dev/null +++ b/resources/variants/dagoma/dagoma_sigma_pro_steel_0.4.inst.cfg @@ -0,0 +1,14 @@ +[general] +definition = dagoma_sigma_pro +name = Steel 0.4mm +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 22 +type = variant + +[values] +machine_nozzle_id = Steel 0.4mm +machine_nozzle_size = 0.4 + diff --git a/resources/variants/dagoma/dagoma_sigma_pro_steel_0.8.inst.cfg b/resources/variants/dagoma/dagoma_sigma_pro_steel_0.8.inst.cfg new file mode 100644 index 0000000000..d36c2e344d --- /dev/null +++ b/resources/variants/dagoma/dagoma_sigma_pro_steel_0.8.inst.cfg @@ -0,0 +1,14 @@ +[general] +definition = dagoma_sigma_pro +name = Steel 0.8mm +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 22 +type = variant + +[values] +machine_nozzle_id = Steel 0.8mm +machine_nozzle_size = 0.8 + diff --git a/resources/variants/ultimaker_s3_aa0.25.inst.cfg b/resources/variants/ultimaker_s3_aa0.25.inst.cfg index 1f3baa432f..97b303035c 100644 --- a/resources/variants/ultimaker_s3_aa0.25.inst.cfg +++ b/resources/variants/ultimaker_s3_aa0.25.inst.cfg @@ -16,7 +16,6 @@ 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 -retraction_min_travel = 0.7 retraction_prime_speed = =retraction_speed speed_print = 55 speed_topbottom = 20 diff --git a/resources/variants/ultimaker_s3_aa0.8.inst.cfg b/resources/variants/ultimaker_s3_aa0.8.inst.cfg index c30365897b..e7d3487503 100644 --- a/resources/variants/ultimaker_s3_aa0.8.inst.cfg +++ b/resources/variants/ultimaker_s3_aa0.8.inst.cfg @@ -29,7 +29,6 @@ raft_surface_layers = 1 retraction_amount = 6.5 retraction_hop = 2 retraction_hop_only_when_collides = True -retraction_min_travel = =line_width * 2 retraction_speed = 25 speed_print = 35 speed_topbottom = =math.ceil(speed_print * 25 / 35) diff --git a/resources/variants/ultimaker_s3_aa04.inst.cfg b/resources/variants/ultimaker_s3_aa04.inst.cfg index b3f76758f4..76992b5805 100644 --- a/resources/variants/ultimaker_s3_aa04.inst.cfg +++ b/resources/variants/ultimaker_s3_aa04.inst.cfg @@ -14,7 +14,6 @@ machine_nozzle_cool_down_speed = 0.9 machine_nozzle_id = AA 0.4 machine_nozzle_tip_outer_diameter = 1.0 retraction_amount = 6.5 -retraction_min_travel = =line_width * 2 speed_print = 70 speed_topbottom = =math.ceil(speed_print * 30 / 70) speed_wall = =math.ceil(speed_print * 30 / 70) diff --git a/resources/variants/ultimaker_s3_bb0.8.inst.cfg b/resources/variants/ultimaker_s3_bb0.8.inst.cfg index 34e1b6d308..d0f78ac3bd 100644 --- a/resources/variants/ultimaker_s3_bb0.8.inst.cfg +++ b/resources/variants/ultimaker_s3_bb0.8.inst.cfg @@ -30,7 +30,6 @@ prime_tower_wipe_enabled = True raft_surface_layers = 1 retraction_hop = 2 retraction_hop_only_when_collides = True -retraction_min_travel = =line_width * 3 speed_prime_tower = =math.ceil(speed_print * 7 / 35) speed_print = 35 speed_support = =math.ceil(speed_print * 25 / 35) diff --git a/resources/variants/ultimaker_s3_bb04.inst.cfg b/resources/variants/ultimaker_s3_bb04.inst.cfg index e50241aa3a..4e232cbb5e 100644 --- a/resources/variants/ultimaker_s3_bb04.inst.cfg +++ b/resources/variants/ultimaker_s3_bb04.inst.cfg @@ -16,7 +16,6 @@ acceleration_support_interface = =math.ceil(acceleration_support * 1500 / 2000) machine_nozzle_heat_up_speed = 1.5 machine_nozzle_id = BB 0.4 machine_nozzle_tip_outer_diameter = 1.0 -retraction_min_travel = =3 * line_width 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) diff --git a/resources/variants/ultimaker_s3_cc04.inst.cfg b/resources/variants/ultimaker_s3_cc04.inst.cfg index 19192bfba6..38f04547aa 100644 --- a/resources/variants/ultimaker_s3_cc04.inst.cfg +++ b/resources/variants/ultimaker_s3_cc04.inst.cfg @@ -13,7 +13,6 @@ brim_width = 7 machine_nozzle_cool_down_speed = 0.9 machine_nozzle_id = CC 0.4 machine_nozzle_size = 0.4 -retraction_min_travel = =line_width * 2 retraction_prime_speed = =retraction_speed speed_infill = =speed_print speed_print = 45 diff --git a/resources/variants/ultimaker_s3_cc06.inst.cfg b/resources/variants/ultimaker_s3_cc06.inst.cfg index 925a9f68d6..e42817e8f8 100644 --- a/resources/variants/ultimaker_s3_cc06.inst.cfg +++ b/resources/variants/ultimaker_s3_cc06.inst.cfg @@ -13,7 +13,6 @@ brim_width = 7 machine_nozzle_cool_down_speed = 0.9 machine_nozzle_id = CC 0.6 machine_nozzle_size = 0.6 -retraction_min_travel = =line_width * 2 retraction_prime_speed = =retraction_speed speed_infill = =speed_print speed_print = 45 diff --git a/resources/variants/ultimaker_s5_aa0.25.inst.cfg b/resources/variants/ultimaker_s5_aa0.25.inst.cfg index 519b21c920..08ed6132f5 100644 --- a/resources/variants/ultimaker_s5_aa0.25.inst.cfg +++ b/resources/variants/ultimaker_s5_aa0.25.inst.cfg @@ -16,7 +16,6 @@ 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 -retraction_min_travel = 0.7 retraction_prime_speed = =retraction_speed speed_print = 55 speed_topbottom = 20 diff --git a/resources/variants/ultimaker_s5_aa0.8.inst.cfg b/resources/variants/ultimaker_s5_aa0.8.inst.cfg index b482c418f0..04a3a97d11 100644 --- a/resources/variants/ultimaker_s5_aa0.8.inst.cfg +++ b/resources/variants/ultimaker_s5_aa0.8.inst.cfg @@ -29,7 +29,6 @@ raft_surface_layers = 1 retraction_amount = 6.5 retraction_hop = 2 retraction_hop_only_when_collides = True -retraction_min_travel = =line_width * 2 retraction_speed = 25 speed_print = 35 speed_topbottom = =math.ceil(speed_print * 25 / 35) diff --git a/resources/variants/ultimaker_s5_aa04.inst.cfg b/resources/variants/ultimaker_s5_aa04.inst.cfg index 09f528162d..fd4f1ff778 100644 --- a/resources/variants/ultimaker_s5_aa04.inst.cfg +++ b/resources/variants/ultimaker_s5_aa04.inst.cfg @@ -14,7 +14,6 @@ machine_nozzle_cool_down_speed = 0.9 machine_nozzle_id = AA 0.4 machine_nozzle_tip_outer_diameter = 1.0 retraction_amount = 6.5 -retraction_min_travel = =line_width * 2 speed_print = 70 speed_topbottom = =math.ceil(speed_print * 30 / 70) speed_wall = =math.ceil(speed_print * 30 / 70) diff --git a/resources/variants/ultimaker_s5_bb0.8.inst.cfg b/resources/variants/ultimaker_s5_bb0.8.inst.cfg index 660a6b10f4..07b556d206 100644 --- a/resources/variants/ultimaker_s5_bb0.8.inst.cfg +++ b/resources/variants/ultimaker_s5_bb0.8.inst.cfg @@ -30,7 +30,6 @@ prime_tower_wipe_enabled = True raft_surface_layers = 1 retraction_hop = 2 retraction_hop_only_when_collides = True -retraction_min_travel = =line_width * 3 speed_prime_tower = =math.ceil(speed_print * 7 / 35) speed_print = 35 speed_support = =math.ceil(speed_print * 25 / 35) diff --git a/resources/variants/ultimaker_s5_bb04.inst.cfg b/resources/variants/ultimaker_s5_bb04.inst.cfg index 2058185bb8..7959fc75c2 100644 --- a/resources/variants/ultimaker_s5_bb04.inst.cfg +++ b/resources/variants/ultimaker_s5_bb04.inst.cfg @@ -16,7 +16,6 @@ acceleration_support_interface = =math.ceil(acceleration_support * 1500 / 2000) machine_nozzle_heat_up_speed = 1.5 machine_nozzle_id = BB 0.4 machine_nozzle_tip_outer_diameter = 1.0 -retraction_min_travel = =3 * line_width 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) diff --git a/resources/variants/ultimaker_s5_cc04.inst.cfg b/resources/variants/ultimaker_s5_cc04.inst.cfg index ef64dc0ae4..5510d0126f 100644 --- a/resources/variants/ultimaker_s5_cc04.inst.cfg +++ b/resources/variants/ultimaker_s5_cc04.inst.cfg @@ -13,7 +13,6 @@ brim_width = 7 machine_nozzle_cool_down_speed = 0.9 machine_nozzle_id = CC 0.4 machine_nozzle_size = 0.4 -retraction_min_travel = =line_width * 2 retraction_prime_speed = =retraction_speed speed_infill = =speed_print speed_print = 45 diff --git a/resources/variants/ultimaker_s5_cc06.inst.cfg b/resources/variants/ultimaker_s5_cc06.inst.cfg index ba33bab17b..a49c790e4f 100644 --- a/resources/variants/ultimaker_s5_cc06.inst.cfg +++ b/resources/variants/ultimaker_s5_cc06.inst.cfg @@ -13,7 +13,6 @@ brim_width = 7 machine_nozzle_cool_down_speed = 0.9 machine_nozzle_id = CC 0.6 machine_nozzle_size = 0.6 -retraction_min_travel = =line_width * 2 retraction_prime_speed = =retraction_speed speed_infill = =speed_print speed_print = 45 diff --git a/resources/variants/ultimaker_s7_aa0.25.inst.cfg b/resources/variants/ultimaker_s7_aa0.25.inst.cfg index 1495af6c48..fc1bdcfef2 100644 --- a/resources/variants/ultimaker_s7_aa0.25.inst.cfg +++ b/resources/variants/ultimaker_s7_aa0.25.inst.cfg @@ -16,7 +16,6 @@ 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 -retraction_min_travel = 0.7 retraction_prime_speed = =retraction_speed speed_print = 55 speed_topbottom = 20 diff --git a/resources/variants/ultimaker_s7_aa0.8.inst.cfg b/resources/variants/ultimaker_s7_aa0.8.inst.cfg index a5b6a66516..b3253f7d25 100644 --- a/resources/variants/ultimaker_s7_aa0.8.inst.cfg +++ b/resources/variants/ultimaker_s7_aa0.8.inst.cfg @@ -29,7 +29,6 @@ raft_surface_layers = 1 retraction_amount = 6.5 retraction_hop = 2 retraction_hop_only_when_collides = True -retraction_min_travel = =line_width * 2 retraction_speed = 25 speed_print = 35 speed_topbottom = =math.ceil(speed_print * 25 / 35) diff --git a/resources/variants/ultimaker_s7_aa04.inst.cfg b/resources/variants/ultimaker_s7_aa04.inst.cfg index a9079c975e..6aee6597e0 100644 --- a/resources/variants/ultimaker_s7_aa04.inst.cfg +++ b/resources/variants/ultimaker_s7_aa04.inst.cfg @@ -14,7 +14,6 @@ machine_nozzle_cool_down_speed = 0.9 machine_nozzle_id = AA 0.4 machine_nozzle_tip_outer_diameter = 1.0 retraction_amount = 6.5 -retraction_min_travel = =line_width * 2 speed_print = 70 speed_topbottom = =math.ceil(speed_print * 30 / 70) speed_wall = =math.ceil(speed_print * 30 / 70) diff --git a/resources/variants/ultimaker_s7_bb0.8.inst.cfg b/resources/variants/ultimaker_s7_bb0.8.inst.cfg index 6823fe18a4..010d5c7cf1 100644 --- a/resources/variants/ultimaker_s7_bb0.8.inst.cfg +++ b/resources/variants/ultimaker_s7_bb0.8.inst.cfg @@ -31,7 +31,6 @@ raft_surface_layers = 1 retraction_amount = 4.5 retraction_hop = 2 retraction_hop_only_when_collides = True -retraction_min_travel = =line_width * 3 speed_prime_tower = =math.ceil(speed_print * 7 / 35) speed_print = 35 speed_support = =math.ceil(speed_print * 25 / 35) diff --git a/resources/variants/ultimaker_s7_bb04.inst.cfg b/resources/variants/ultimaker_s7_bb04.inst.cfg index bead299de3..1ec0dfab98 100644 --- a/resources/variants/ultimaker_s7_bb04.inst.cfg +++ b/resources/variants/ultimaker_s7_bb04.inst.cfg @@ -17,7 +17,6 @@ machine_nozzle_heat_up_speed = 1.5 machine_nozzle_id = BB 0.4 machine_nozzle_tip_outer_diameter = 1.0 retraction_amount = 4.5 -retraction_min_travel = =3 * line_width 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) diff --git a/resources/variants/ultimaker_s7_cc04.inst.cfg b/resources/variants/ultimaker_s7_cc04.inst.cfg index d46d387330..6949c5be74 100644 --- a/resources/variants/ultimaker_s7_cc04.inst.cfg +++ b/resources/variants/ultimaker_s7_cc04.inst.cfg @@ -13,7 +13,6 @@ brim_width = 7 machine_nozzle_cool_down_speed = 0.9 machine_nozzle_id = CC 0.4 machine_nozzle_size = 0.4 -retraction_min_travel = =line_width * 2 retraction_prime_speed = =retraction_speed speed_infill = =speed_print speed_print = 45 diff --git a/resources/variants/ultimaker_s7_cc06.inst.cfg b/resources/variants/ultimaker_s7_cc06.inst.cfg index d0c0d3670f..576701fc2b 100644 --- a/resources/variants/ultimaker_s7_cc06.inst.cfg +++ b/resources/variants/ultimaker_s7_cc06.inst.cfg @@ -13,7 +13,6 @@ brim_width = 7 machine_nozzle_cool_down_speed = 0.9 machine_nozzle_id = CC 0.6 machine_nozzle_size = 0.6 -retraction_min_travel = =line_width * 2 retraction_prime_speed = =retraction_speed speed_infill = =speed_print speed_print = 45 diff --git a/tests/TestHitChecker.py b/tests/TestHitChecker.py new file mode 100644 index 0000000000..59ee1d8162 --- /dev/null +++ b/tests/TestHitChecker.py @@ -0,0 +1,141 @@ +from unittest.mock import patch + +from cura.HitChecker import HitChecker +from cura.OneAtATimeIterator import OneAtATimeIterator +from cura.Scene.CuraSceneNode import CuraSceneNode + + +def test_anyTwoNodesBlockEachOther_True(): + node1 = CuraSceneNode(no_setting_override=True) + node2 = CuraSceneNode(no_setting_override=True) + # node1 and node2 block each other + hit_map = { + node1: {node1: 0, node2: 1}, + node2: {node1: 1, node2: 0} + } + + with patch.object(HitChecker, "_buildHitMap", return_value=hit_map): + hit_checker = HitChecker([node1, node2]) + assert hit_checker.anyTwoNodesBlockEachOther([node1, node2]) + assert hit_checker.anyTwoNodesBlockEachOther([node2, node1]) + + +def test_anyTwoNodesBlockEachOther_False(): + node1 = CuraSceneNode(no_setting_override=True) + node2 = CuraSceneNode(no_setting_override=True) + # node1 blocks node2, but node2 doesn't block node1 + hit_map = { + node1: {node1: 0, node2: 1}, + node2: {node1: 0, node2: 0} + } + + with patch.object(HitChecker, "_buildHitMap", return_value=hit_map): + hit_checker = HitChecker([node1, node2]) + assert not hit_checker.anyTwoNodesBlockEachOther([node1, node2]) + assert not hit_checker.anyTwoNodesBlockEachOther([node2, node1]) + + +def test_canPrintBefore(): + node1 = CuraSceneNode(no_setting_override=True) + node2 = CuraSceneNode(no_setting_override=True) + node3 = CuraSceneNode(no_setting_override=True) + # nodes can be printed only in order node1 -> node2 -> node3 + hit_map = { + node1: {node1: 0, node2: 0, node3: 0}, + node2: {node1: 1, node2: 0, node3: 0}, + node3: {node1: 1, node2: 1, node3: 0}, + } + + with patch.object(HitChecker, "_buildHitMap", return_value=hit_map): + hit_checker = HitChecker([node1, node2, node3]) + + assert hit_checker.canPrintBefore(node1, [node2]) + assert hit_checker.canPrintBefore(node1, [node3]) + assert hit_checker.canPrintBefore(node1, [node2, node3]) + assert hit_checker.canPrintBefore(node1, [node3, node2]) + + assert hit_checker.canPrintBefore(node2, [node3]) + assert not hit_checker.canPrintBefore(node2, [node1]) + assert not hit_checker.canPrintBefore(node2, [node1, node3]) + assert not hit_checker.canPrintBefore(node2, [node3, node1]) + + assert not hit_checker.canPrintBefore(node3, [node1]) + assert not hit_checker.canPrintBefore(node3, [node2]) + assert not hit_checker.canPrintBefore(node3, [node1, node2]) + assert not hit_checker.canPrintBefore(node3, [node2, node1]) + + +def test_canPrintAfter(): + node1 = CuraSceneNode(no_setting_override=True) + node2 = CuraSceneNode(no_setting_override=True) + node3 = CuraSceneNode(no_setting_override=True) + + # nodes can be printed only in order node1 -> node2 -> node3 + hit_map = { + node1: {node1: 0, node2: 0, node3: 0}, + node2: {node1: 1, node2: 0, node3: 0}, + node3: {node1: 1, node2: 1, node3: 0}, + } + + with patch.object(HitChecker, "_buildHitMap", return_value=hit_map): + hit_checker = HitChecker([node1, node2, node3]) + + assert not hit_checker.canPrintAfter(node1, [node2]) + assert not hit_checker.canPrintAfter(node1, [node3]) + assert not hit_checker.canPrintAfter(node1, [node2, node3]) + assert not hit_checker.canPrintAfter(node1, [node3, node2]) + + assert hit_checker.canPrintAfter(node2, [node1]) + assert not hit_checker.canPrintAfter(node2, [node3]) + assert not hit_checker.canPrintAfter(node2, [node1, node3]) + assert not hit_checker.canPrintAfter(node2, [node3, node1]) + + assert hit_checker.canPrintAfter(node3, [node1]) + assert hit_checker.canPrintAfter(node3, [node2]) + assert hit_checker.canPrintAfter(node3, [node1, node2]) + assert hit_checker.canPrintAfter(node3, [node2, node1]) + + +def test_calculateScore(): + node1 = CuraSceneNode(no_setting_override=True) + node2 = CuraSceneNode(no_setting_override=True) + node3 = CuraSceneNode(no_setting_override=True) + + hit_map = { + node1: {node1: 0, node2: 0, node3: 0}, # sum is 0 + node2: {node1: 1, node2: 0, node3: 0}, # sum is 1 + node3: {node1: 1, node2: 1, node3: 0}, # sum is 2 + } + + with patch.object(HitChecker, "_buildHitMap", return_value=hit_map): + hit_checker = HitChecker([node1, node2, node3]) + + # score is a diff between sums + assert hit_checker.calculateScore(node1, node2) == -1 + assert hit_checker.calculateScore(node2, node1) == 1 + assert hit_checker.calculateScore(node1, node3) == -2 + assert hit_checker.calculateScore(node3, node1) == 2 + assert hit_checker.calculateScore(node2, node3) == -1 + assert hit_checker.calculateScore(node3, node2) == 1 + + +def test_canPrintNodesInProvidedOrder(): + node1 = CuraSceneNode(no_setting_override=True) + node2 = CuraSceneNode(no_setting_override=True) + node3 = CuraSceneNode(no_setting_override=True) + + # nodes can be printed only in order node1 -> node2 -> node3 + hit_map = { + node1: {node1: 0, node2: 0, node3: 0}, # 0 + node2: {node1: 1, node2: 0, node3: 0}, # 1 + node3: {node1: 1, node2: 1, node3: 0}, # 2 + } + + with patch.object(HitChecker, "_buildHitMap", return_value=hit_map): + hit_checker = HitChecker([node1, node2, node3]) + assert hit_checker.canPrintNodesInProvidedOrder([node1, node2, node3]) + assert not hit_checker.canPrintNodesInProvidedOrder([node1, node3, node2]) + assert not hit_checker.canPrintNodesInProvidedOrder([node2, node1, node3]) + assert not hit_checker.canPrintNodesInProvidedOrder([node2, node3, node1]) + assert not hit_checker.canPrintNodesInProvidedOrder([node3, node1, node2]) + assert not hit_checker.canPrintNodesInProvidedOrder([node3, node2, node1]) \ No newline at end of file diff --git a/tests/TestOAuth2.py b/tests/TestOAuth2.py index 09fa555af4..41edaebbf7 100644 --- a/tests/TestOAuth2.py +++ b/tests/TestOAuth2.py @@ -97,7 +97,7 @@ def test__parseJWTNoRefreshToken(): mock_reply = Mock() # The user profile that the service should respond with. mock_reply.error = Mock(return_value = QNetworkReply.NetworkError.NoError) http_mock = Mock() - http_mock.get = lambda url, headers_dict, callback, error_callback: callback(mock_reply) + http_mock.get = lambda url, headers_dict, callback, error_callback, timeout: callback(mock_reply) http_mock.readJSON = Mock(return_value = {"data": {"user_id": "id_ego_or_superego", "username": "Ghostkeeper"}}) with patch("UM.TaskManagement.HttpRequestManager.HttpRequestManager.getInstance", MagicMock(return_value = http_mock)): @@ -119,8 +119,8 @@ def test__parseJWTFailOnRefresh(): mock_reply = Mock() # The response that the request should give, containing an error about it failing to authenticate. mock_reply.error = Mock(return_value = QNetworkReply.NetworkError.AuthenticationRequiredError) # The reply is 403: Authentication required, meaning the server responded with a "Can't do that, Dave". http_mock = Mock() - http_mock.get = lambda url, headers_dict, callback, error_callback: callback(mock_reply) - http_mock.post = lambda url, data, headers_dict, callback, error_callback: callback(mock_reply) + http_mock.get = lambda url, headers_dict, callback, error_callback, timeout: callback(mock_reply) + http_mock.post = lambda url, data, headers_dict, callback, error_callback, urgent, timeout: callback(mock_reply) with patch("UM.TaskManagement.HttpRequestManager.HttpRequestManager.readJSON", Mock(return_value = {"error_description": "Mock a failed request!"})): with patch("UM.TaskManagement.HttpRequestManager.HttpRequestManager.getInstance", MagicMock(return_value = http_mock)): @@ -142,7 +142,7 @@ def test__parseJWTSucceedOnRefresh(): mock_reply_failure = Mock() mock_reply_failure.error = Mock(return_value = QNetworkReply.NetworkError.AuthenticationRequiredError) http_mock = Mock() - def mock_get(url, headers_dict, callback, error_callback): + def mock_get(url, headers_dict, callback, error_callback, timeout): if(headers_dict == {"Authorization": "Bearer beep"}): callback(mock_reply_success) else: @@ -181,8 +181,8 @@ def test_refreshAccessTokenFailed(): mock_reply = Mock() # The response that the request should give, containing an error about it failing to authenticate. mock_reply.error = Mock(return_value = QNetworkReply.NetworkError.AuthenticationRequiredError) # The reply is 403: Authentication required, meaning the server responded with a "Can't do that, Dave". http_mock = Mock() - http_mock.get = lambda url, headers_dict, callback, error_callback: callback(mock_reply) - http_mock.post = lambda url, data, headers_dict, callback, error_callback: callback(mock_reply) + http_mock.get = lambda url, headers_dict, callback, error_callback, timeout: callback(mock_reply) + http_mock.post = lambda url, data, headers_dict, callback, error_callback, urgent, timeout: callback(mock_reply) with patch("UM.TaskManagement.HttpRequestManager.HttpRequestManager.readJSON", Mock(return_value = {"error_description": "Mock a failed request!"})): with patch("UM.TaskManagement.HttpRequestManager.HttpRequestManager.getInstance", MagicMock(return_value = http_mock)): @@ -263,7 +263,7 @@ def test_loginAndLogout() -> None: mock_reply = Mock() # The user profile that the service should respond with. mock_reply.error = Mock(return_value = QNetworkReply.NetworkError.NoError) http_mock = Mock() - http_mock.get = lambda url, headers_dict, callback, error_callback: callback(mock_reply) + http_mock.get = lambda url, headers_dict, callback, error_callback, timeout: callback(mock_reply) http_mock.readJSON = Mock(return_value = {"data": {"user_id": "di_resu", "username": "Emanresu"}}) # Let the service think there was a successful response diff --git a/tests/TestPrintOrderManager.py b/tests/TestPrintOrderManager.py new file mode 100644 index 0000000000..8b2c0475b2 --- /dev/null +++ b/tests/TestPrintOrderManager.py @@ -0,0 +1,175 @@ +from unittest.mock import patch, MagicMock + +from cura.PrintOrderManager import PrintOrderManager +from cura.Scene.CuraSceneNode import CuraSceneNode + + +def test_getNodeName(): + node1 = CuraSceneNode(name="cat", no_setting_override=True) + node2 = CuraSceneNode(name="dog", no_setting_override=True) + assert PrintOrderManager._getNodeName(node1) == "cat" + assert PrintOrderManager._getNodeName(node2) == "dog" + assert PrintOrderManager._getNodeName(None) == "" + + +def test_getNodeName_truncatesLongName(): + node = CuraSceneNode(name="some_name_longer_than_30_characters", no_setting_override=True) + assert PrintOrderManager._getNodeName(node) == "some_name_longer_than_30_chara" + assert PrintOrderManager._getNodeName(node, max_length=10) == "some_name_" + + +def test_getSingleSelectedNode(): + node1 = CuraSceneNode(no_setting_override=True) + with patch("UM.Scene.Selection.Selection.getAllSelectedObjects", MagicMock(return_value=[node1])): + with patch("UM.Scene.Selection.Selection.getSelectedObject", MagicMock(return_value=node1)): + assert PrintOrderManager._getSingleSelectedNode() == node1 + + +def test_getSingleSelectedNode_returnsNoneIfNothingSelected(): + with patch("UM.Scene.Selection.Selection.getAllSelectedObjects", MagicMock(return_value=[])): + assert PrintOrderManager._getSingleSelectedNode() is None + + +def test_getSingleSelectedNode_returnsNoneIfMultipleObjectsSelected(): + node1 = CuraSceneNode(no_setting_override=True) + node2 = CuraSceneNode(no_setting_override=True) + with patch("UM.Scene.Selection.Selection.getAllSelectedObjects", MagicMock(return_value=[node1, node2])): + assert PrintOrderManager._getSingleSelectedNode() is None + + +def test_neighborNodeNamesCorrect_WhenSomeNodeSelected(): + node1 = CuraSceneNode(no_setting_override=True, name="node1") + node2 = CuraSceneNode(no_setting_override=True, name="node2") + node3 = CuraSceneNode(no_setting_override=True, name="node3") + node1.printOrder = 1 + node2.printOrder = 2 + node3.printOrder = 3 + with patch.object(PrintOrderManager, "_configureEvents", return_value=None): + with patch.object(PrintOrderManager, "_getSingleSelectedNode", return_value=node1): + print_order_manager = PrintOrderManager(get_nodes=lambda: [node1, node2, node3]) + + assert print_order_manager.previousNodeName == "" + assert print_order_manager.nextNodeName == "node2" + assert not print_order_manager.shouldEnablePrintBeforeAction + assert print_order_manager.shouldEnablePrintAfterAction + + print_order_manager.swapSelectedAndNextNodes() # swaps node1 with node2, result: [node2, node1, node3] + assert print_order_manager.previousNodeName == "node2" + assert print_order_manager.nextNodeName == "node3" + assert print_order_manager.shouldEnablePrintBeforeAction + assert print_order_manager.shouldEnablePrintAfterAction + + print_order_manager.swapSelectedAndNextNodes() # swaps node1 with node3, result: [node2, node3, node1] + assert print_order_manager.previousNodeName == "node3" + assert print_order_manager.nextNodeName == "" + assert print_order_manager.shouldEnablePrintBeforeAction + assert not print_order_manager.shouldEnablePrintAfterAction + + print_order_manager.swapSelectedAndPreviousNodes() # swaps node1 with node3, result: [node2, node1, node3] + assert print_order_manager.previousNodeName == "node2" + assert print_order_manager.nextNodeName == "node3" + assert print_order_manager.shouldEnablePrintBeforeAction + assert print_order_manager.shouldEnablePrintAfterAction + + print_order_manager.swapSelectedAndPreviousNodes() # swaps node1 with node2, result: [node1, node2, node3] + assert print_order_manager.previousNodeName == "" + assert print_order_manager.nextNodeName == "node2" + assert not print_order_manager.shouldEnablePrintBeforeAction + assert print_order_manager.shouldEnablePrintAfterAction + + +def test_neighborNodeNamesEmpty_WhenNothingSelected(): + node1 = CuraSceneNode(no_setting_override=True, name="node1") + node2 = CuraSceneNode(no_setting_override=True, name="node2") + node3 = CuraSceneNode(no_setting_override=True, name="node3") + node1.printOrder = 1 + node2.printOrder = 2 + node3.printOrder = 3 + with patch.object(PrintOrderManager, "_configureEvents", return_value=None): + with patch.object(PrintOrderManager, "_getSingleSelectedNode", return_value=None): + print_order_manager = PrintOrderManager(get_nodes=lambda: [node1, node2, node3]) + assert print_order_manager.previousNodeName == "" + assert print_order_manager.nextNodeName == "" + assert not print_order_manager.shouldEnablePrintBeforeAction + assert not print_order_manager.shouldEnablePrintAfterAction + + +def test_initializePrintOrders(): + node1 = CuraSceneNode(no_setting_override=True) + node2 = CuraSceneNode(no_setting_override=True) + + # assume print orders are 0 + assert node1.printOrder == 0 + assert node2.printOrder == 0 + + PrintOrderManager.initializePrintOrders([node1, node2]) + + # assert print orders initialized + assert node1.printOrder == 1 + assert node2.printOrder == 2 + + node3 = CuraSceneNode(no_setting_override=True) + node4 = CuraSceneNode(no_setting_override=True) + # assume print orders are 0 + assert node3.printOrder == 0 + assert node4.printOrder == 0 + + PrintOrderManager.initializePrintOrders([node2, node1, node3, node4]) + + # assert print orders not changed for node1 and node2 and initialized for node3 and node4 + assert node1.printOrder == 1 + assert node2.printOrder == 2 + assert node3.printOrder == 3 + assert node4.printOrder == 4 + + +def test_updatePrintOrdersAfterGroupOperation(): + node1 = CuraSceneNode(no_setting_override=True) + node2 = CuraSceneNode(no_setting_override=True) + node3 = CuraSceneNode(no_setting_override=True) + node4 = CuraSceneNode(no_setting_override=True) + node5 = CuraSceneNode(no_setting_override=True) + node1.printOrder = 1 + node2.printOrder = 2 + node3.printOrder = 3 + node4.printOrder = 4 + node5.printOrder = 5 + + all_nodes = [node1, node2, node3, node4, node5] + grouped_nodes = [node2, node4] + group_node = CuraSceneNode(no_setting_override=True) + + PrintOrderManager.updatePrintOrdersAfterGroupOperation(all_nodes, group_node, grouped_nodes) + + assert node1.printOrder == 1 + assert group_node.printOrder == 2 + assert node3.printOrder == 3 + assert node5.printOrder == 4 + + +def test_updatePrintOrdersAfterUngroupOperation(): + node1 = CuraSceneNode(no_setting_override=True) + node2 = CuraSceneNode(no_setting_override=True) + node3 = CuraSceneNode(no_setting_override=True) + node1.printOrder = 1 + node2.printOrder = 2 + node3.printOrder = 3 + + all_nodes = [node1, node2, node3] + node4 = CuraSceneNode(no_setting_override=True) + node5 = CuraSceneNode(no_setting_override=True) + + group_node = node2 + ungrouped_nodes = [node4, node5] + PrintOrderManager.updatePrintOrdersAfterUngroupOperation(all_nodes, group_node, ungrouped_nodes) + + assert node1.printOrder == 1 + assert node4.printOrder == 2 + assert node5.printOrder == 3 + assert node3.printOrder == 4 + + assert node1 in all_nodes + assert node2 not in all_nodes + assert node3 in all_nodes + assert node4 in all_nodes + assert node5 in all_nodes