diff --git a/.gitignore b/.gitignore index 72ba4bf565..dc951a52b7 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,7 @@ docs/html *.log resources/i18n/en resources/i18n/x-test +resources/firmware # Editors and IDEs. *kdev* @@ -15,3 +16,11 @@ resources/i18n/x-test *~ *.qm .idea + +# Eclipse+PyDev +.project +.pydevproject +.settings + +# Debian packaging +debian* diff --git a/CMakeLists.txt b/CMakeLists.txt index dc9f37c76e..98dca222b4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,6 +7,7 @@ include(GNUInstallDirs) set(URANIUM_SCRIPTS_DIR "${CMAKE_SOURCE_DIR}/../uranium/scripts" CACHE DIRECTORY "The location of the scripts directory of the Uranium repository") set(CURA_VERSION "master" CACHE STRING "Version name of Cura") +set(CURA_BUILDTYPE "" CACHE STRING "Build type of Cura, eg. 'PPA'") configure_file(cura/CuraVersion.py.in CuraVersion.py @ONLY) # Macro needed to list all sub-directory of a directory. diff --git a/README.md b/README.md index e6425ec8e9..b56a5ea345 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,10 @@ Use [this](https://github.com/Ultimaker/Uranium/wiki/Bug-Reporting-Template) tem For crashes and similar issues, please attach the following information: * (On Windows) The log as produced by dxdiag (start -> run -> dxdiag -> save output) -* The Cura GUI log file, located at (Windows) $User/AppData/Local/cura/cura.log, (OSX) $User/.cura/cura.log, (Ubuntu) $USER/.local/share/cura +* The Cura GUI log file, located at + * $User/AppData/Local/cura/cura.log (Windows) + * $User/Library/Application Support/cura (OSX) + * $USER/.local/share/cura (Ubuntu/Linux) * The Cura Engine log, using Help -> Show Engine Log Dependencies diff --git a/cura/BuildVolume.py b/cura/BuildVolume.py index 71db735f0a..efc306c32d 100644 --- a/cura/BuildVolume.py +++ b/cura/BuildVolume.py @@ -38,13 +38,9 @@ class BuildVolume(SceneNode): self.setCalculateBoundingBox(False) self._volume_aabb = None - self._active_profile = None - self._active_instance = None - Application.getInstance().getMachineManager().activeMachineInstanceChanged.connect(self._onActiveInstanceChanged) - self._onActiveInstanceChanged() - - Application.getInstance().getMachineManager().activeProfileChanged.connect(self._onActiveProfileChanged) - self._onActiveProfileChanged() + self._active_container_stack = None + Application.getInstance().globalContainerStackChanged.connect(self._onGlobalContainerStackChanged) + self._onGlobalContainerStackChanged() def setWidth(self, width): if width: self._width = width @@ -77,7 +73,7 @@ class BuildVolume(SceneNode): ## Recalculates the build volume & disallowed areas. def rebuild(self): - if self._width == 0 or self._height == 0 or self._depth == 0: + if not self._width or not self._height or not self._depth: return min_w = -self._width / 2 @@ -149,9 +145,9 @@ class BuildVolume(SceneNode): skirt_size = 0.0 - profile = Application.getInstance().getMachineManager().getWorkingProfile() - if profile: - skirt_size = self._getSkirtSize(profile) + container_stack = Application.getInstance().getGlobalContainerStack() + if container_stack: + skirt_size = self._getSkirtSize(container_stack) # As this works better for UM machines, we only add the disallowed_area_size for the z direction. # This is probably wrong in all other cases. TODO! @@ -166,52 +162,48 @@ class BuildVolume(SceneNode): def getBoundingBox(self): return self._volume_aabb - def _onActiveInstanceChanged(self): - self._active_instance = Application.getInstance().getMachineManager().getActiveMachineInstance() + def _onGlobalContainerStackChanged(self): + if self._active_container_stack: + self._active_container_stack.propertyChanged.disconnect(self._onSettingPropertyChanged) - if self._active_instance: - self._width = self._active_instance.getMachineSettingValue("machine_width") - if Application.getInstance().getMachineManager().getWorkingProfile().getSettingValue("print_sequence") == "one_at_a_time": - self._height = Application.getInstance().getMachineManager().getWorkingProfile().getSettingValue("gantry_height") + self._active_container_stack = Application.getInstance().getGlobalContainerStack() + + if self._active_container_stack: + self._active_container_stack.propertyChanged.connect(self._onSettingPropertyChanged) + + self._width = self._active_container_stack.getProperty("machine_width", "value") + if self._active_container_stack.getProperty("print_sequence", "value") == "one_at_a_time": + self._height = self._active_container_stack.getProperty("gantry_height", "value") else: - self._height = self._active_instance.getMachineSettingValue("machine_height") - self._depth = self._active_instance.getMachineSettingValue("machine_depth") + self._height = self._active_container_stack.getProperty("machine_height", "value") + self._depth = self._active_container_stack.getProperty("machine_depth", "value") self._updateDisallowedAreas() self.rebuild() - def _onActiveProfileChanged(self): - if self._active_profile: - self._active_profile.settingValueChanged.disconnect(self._onSettingValueChanged) + def _onSettingPropertyChanged(self, setting_key, property_name): + if property_name != "value": + return - self._active_profile = Application.getInstance().getMachineManager().getWorkingProfile() - if self._active_profile: - self._active_profile.settingValueChanged.connect(self._onSettingValueChanged) - self._updateDisallowedAreas() - self.rebuild() - - def _onSettingValueChanged(self, setting_key): if setting_key == "print_sequence": - if Application.getInstance().getMachineManager().getWorkingProfile().getSettingValue("print_sequence") == "one_at_a_time": - self._height = Application.getInstance().getMachineManager().getWorkingProfile().getSettingValue("gantry_height") + if Application.getInstance().getGlobalContainerStack().getProperty("print_sequence", "value") == "one_at_a_time": + self._height = self._active_container_stack.getProperty("gantry_height", "value") else: - self._height = self._active_instance.getMachineSettingValue("machine_depth") + self._height = self._active_container_stack.getProperty("machine_height", "value") self.rebuild() if setting_key in self._skirt_settings: self._updateDisallowedAreas() self.rebuild() def _updateDisallowedAreas(self): - if not self._active_instance or not self._active_profile: + if not self._active_container_stack: return - disallowed_areas = self._active_instance.getMachineSettingValue("machine_disallowed_areas") + disallowed_areas = self._active_container_stack.getProperty("machine_disallowed_areas", "value") areas = [] - skirt_size = 0.0 - if self._active_profile: - skirt_size = self._getSkirtSize(self._active_profile) + skirt_size = self._getSkirtSize(self._active_container_stack) if disallowed_areas: # Extend every area already in the disallowed_areas with the skirt size. @@ -232,8 +224,8 @@ class BuildVolume(SceneNode): # Add the skirt areas around the borders of the build plate. if skirt_size > 0: - half_machine_width = self._active_instance.getMachineSettingValue("machine_width") / 2 - half_machine_depth = self._active_instance.getMachineSettingValue("machine_depth") / 2 + half_machine_width = self._active_container_stack.getProperty("machine_width", "value") / 2 + half_machine_depth = self._active_container_stack.getProperty("machine_depth", "value") / 2 areas.append(Polygon(numpy.array([ [-half_machine_width, -half_machine_depth], @@ -266,24 +258,24 @@ class BuildVolume(SceneNode): self._disallowed_areas = areas ## Convenience function to calculate the size of the bed adhesion. - def _getSkirtSize(self, profile): + def _getSkirtSize(self, container_stack): skirt_size = 0.0 - adhesion_type = profile.getSettingValue("adhesion_type") + adhesion_type = container_stack.getProperty("adhesion_type", "value") if adhesion_type == "skirt": - skirt_distance = profile.getSettingValue("skirt_gap") - skirt_line_count = profile.getSettingValue("skirt_line_count") - skirt_size = skirt_distance + (skirt_line_count * profile.getSettingValue("skirt_line_width")) + skirt_distance = container_stack.getProperty("skirt_gap", "value") + skirt_line_count = container_stack.getProperty("skirt_line_count", "value") + skirt_size = skirt_distance + (skirt_line_count * container_stack.getProperty("skirt_line_width", "value")) elif adhesion_type == "brim": - skirt_size = profile.getSettingValue("brim_line_count") * profile.getSettingValue("skirt_line_width") + skirt_size = container_stack.getProperty("brim_line_count", "value") * container_stack.getProperty("skirt_line_width", "value") elif adhesion_type == "raft": - skirt_size = profile.getSettingValue("raft_margin") + skirt_size = container_stack.getProperty("raft_margin", "value") - if profile.getSettingValue("draft_shield_enabled"): - skirt_size += profile.getSettingValue("draft_shield_dist") + if container_stack.getProperty("draft_shield_enabled", "value"): + skirt_size += container_stack.getProperty("draft_shield_dist", "value") - if profile.getSettingValue("xy_offset"): - skirt_size += profile.getSettingValue("xy_offset") + if container_stack.getProperty("xy_offset", "value"): + skirt_size += container_stack.getProperty("xy_offset", "value") return skirt_size diff --git a/cura/ContainerSettingsModel.py b/cura/ContainerSettingsModel.py new file mode 100644 index 0000000000..2ff1a5f401 --- /dev/null +++ b/cura/ContainerSettingsModel.py @@ -0,0 +1,93 @@ +from UM.Application import Application +from UM.Qt.ListModel import ListModel + +from PyQt5.QtCore import pyqtProperty, Qt, pyqtSignal, pyqtSlot, QUrl + +from UM.Settings.ContainerRegistry import ContainerRegistry +from UM.Settings.InstanceContainer import InstanceContainer +from UM.Settings.SettingFunction import SettingFunction + +class ContainerSettingsModel(ListModel): + LabelRole = Qt.UserRole + 1 + CategoryRole = Qt.UserRole + 2 + UnitRole = Qt.UserRole + 3 + ValuesRole = Qt.UserRole + 4 + + def __init__(self, parent = None): + super().__init__(parent) + self.addRoleName(self.LabelRole, "label") + self.addRoleName(self.CategoryRole, "category") + self.addRoleName(self.UnitRole, "unit") + self.addRoleName(self.ValuesRole, "values") + + self._container_ids = [] + self._containers = [] + + def _onPropertyChanged(self, key, property_name): + if property_name == "value": + self._update() + + def _update(self): + self.clear() + + if len(self._container_ids) == 0: + return + + keys = [] + for container in self._containers: + keys = keys + list(container.getAllKeys()) + + keys = list(set(keys)) # remove duplicate keys + keys.sort() + + for key in keys: + definition = None + category = None + values = [] + for container in self._containers: + instance = container.getInstance(key) + if instance: + definition = instance.definition + + # Traverse up to find the category + category = definition + while category.type != "category": + category = category.parent + + value = container.getProperty(key, "value") + if type(value) == SettingFunction: + values.append("=\u0192") + else: + values.append(container.getProperty(key, "value")) + else: + values.append("") + + self.appendItem({ + "key": key, + "values": values, + "label": definition.label, + "unit": definition.unit, + "category": category.label + }) + + ## Set the ids of the containers which have the settings this model should list. + # Also makes sure the model updates when the containers have property changes + def setContainers(self, container_ids): + for container in self._containers: + container.propertyChanged.disconnect(self._onPropertyChanged) + + self._container_ids = container_ids + self._containers = [] + + for container_id in self._container_ids: + containers = ContainerRegistry.getInstance().findContainers(id = container_id) + if containers: + containers[0].propertyChanged.connect(self._onPropertyChanged) + self._containers.append(containers[0]) + + self._update() + + containersChanged = pyqtSignal() + @pyqtProperty("QVariantList", fset = setContainers, notify = containersChanged) + def containers(self): + return self.container_ids \ No newline at end of file diff --git a/cura/ConvexHullDecorator.py b/cura/ConvexHullDecorator.py index 7efc8c7ffb..fab22f898e 100644 --- a/cura/ConvexHullDecorator.py +++ b/cura/ConvexHullDecorator.py @@ -15,10 +15,9 @@ class ConvexHullDecorator(SceneNodeDecorator): self._convex_hull_node = None self._init2DConvexHullCache() - self._profile = None - Application.getInstance().getMachineManager().activeProfileChanged.connect(self._onActiveProfileChanged) - Application.getInstance().getMachineManager().activeMachineInstanceChanged.connect(self._onActiveMachineInstanceChanged) - self._onActiveProfileChanged() + self._global_stack = None + Application.getInstance().globalContainerStackChanged.connect(self._onGlobalStackChanged) + self._onGlobalStackChanged() ## Force that a new (empty) object is created upon copy. def __deepcopy__(self, memo): @@ -26,25 +25,31 @@ class ConvexHullDecorator(SceneNodeDecorator): ## Get the unmodified 2D projected convex hull of the node def getConvexHull(self): + if self._node is None: + return None + hull = self._compute2DConvexHull() - profile = Application.getInstance().getMachineManager().getWorkingProfile() - if profile: - if profile.getSettingValue("print_sequence") == "one_at_a_time" and not self._node.getParent().callDecoration("isGroup"): - hull = hull.getMinkowskiHull(Polygon(numpy.array(profile.getSettingValue("machine_head_polygon"), numpy.float32))) + if self._global_stack and self._node: + if self._global_stack.getProperty("print_sequence", "value") == "one_at_a_time" and not self._node.getParent().callDecoration("isGroup"): + hull = hull.getMinkowskiHull(Polygon(numpy.array(self._global_stack.getProperty("machine_head_polygon"), numpy.float32))) return hull ## Get the convex hull of the node with the full head size def getConvexHullHeadFull(self): + if self._node is None: + return None + return self._compute2DConvexHeadFull() ## Get convex hull of the object + head size # In case of printing all at once this is the same as the convex hull. # For one at the time this is area with intersection of mirrored head def getConvexHullHead(self): - profile = Application.getInstance().getMachineManager().getWorkingProfile() - if profile: - if profile.getSettingValue("print_sequence") == "one_at_a_time" and not self._node.getParent().callDecoration( - "isGroup"): + if self._node is None: + return None + + if self._global_stack: + if self._global_stack.getProperty("print_sequence", "value") == "one_at_a_time" and not self._node.getParent().callDecoration("isGroup"): return self._compute2DConvexHeadMin() return None @@ -52,15 +57,19 @@ class ConvexHullDecorator(SceneNodeDecorator): # In case of printing all at once this is the same as the convex hull. # For one at the time this is the area without the head. def getConvexHullBoundary(self): - profile = Application.getInstance().getMachineManager().getWorkingProfile() - if profile: - if profile.getSettingValue("print_sequence") == "one_at_a_time" and not self._node.getParent().callDecoration( - "isGroup"): + if self._node is None: + return None + + if self._global_stack: + if self._global_stack("print_sequence") == "one_at_a_time" and not self._node.getParent().callDecoration("isGroup"): # Printing one at a time and it's not an object in a group return self._compute2DConvexHull() return None def recomputeConvexHull(self): + if self._node is None: + return None + convex_hull = self.getConvexHull() if self._convex_hull_node: if self._convex_hull_node.getHull() == convex_hull: @@ -70,23 +79,9 @@ class ConvexHullDecorator(SceneNodeDecorator): Application.getInstance().getController().getScene().getRoot()) self._convex_hull_node = hull_node - def _onActiveProfileChanged(self): - if self._profile: - self._profile.settingValueChanged.disconnect(self._onSettingValueChanged) - - self._profile = Application.getInstance().getMachineManager().getWorkingProfile() - - if self._profile: - self._profile.settingValueChanged.connect(self._onSettingValueChanged) - - def _onActiveMachineInstanceChanged(self): - if self._convex_hull_node: - self._convex_hull_node.setParent(None) - self._convex_hull_node = None - - def _onSettingValueChanged(self, setting): - if setting == "print_sequence": - self.recomputeConvexHull() + def _onSettingValueChanged(self, key, property_name): + if key == "print_sequence" and property_name == "value": + self._onChanged() def _init2DConvexHullCache(self): # Cache for the group code path in _compute2DConvexHull() @@ -178,8 +173,7 @@ class ConvexHullDecorator(SceneNodeDecorator): return rounded_hull def _getHeadAndFans(self): - profile = Application.getInstance().getMachineManager().getWorkingProfile() - return Polygon(numpy.array(profile.getSettingValue("machine_head_with_fans_polygon"), numpy.float32)) + return Polygon(numpy.array(self._global_stack.getProperty("machine_head_with_fans_polygon"), numpy.float32)) def _compute2DConvexHeadFull(self): return self._compute2DConvexHull().getMinkowskiHull(self._getHeadAndFans()) @@ -195,3 +189,19 @@ class ConvexHullDecorator(SceneNodeDecorator): def _roundHull(self, convex_hull): return convex_hull.getMinkowskiHull(Polygon(numpy.array([[-0.5, -0.5], [-0.5, 0.5], [0.5, 0.5], [0.5, -0.5]], numpy.float32))) + + def _onChanged(self, *args): + self.recomputeConvexHull() + + def _onGlobalStackChanged(self): + if self._global_stack: + self._global_stack.propertyChanged.disconnect(self._onSettingValueChanged) + self._global_stack.containersChanged.disconnect(self._onChanged) + + self._global_stack = Application.getInstance().getGlobalContainerStack() + + if self._global_stack: + self._global_stack.propertyChanged.connect(self._onSettingValueChanged) + self._global_stack.containersChanged.connect(self._onChanged) + + self._onChanged() diff --git a/cura/CrashHandler.py b/cura/CrashHandler.py index 57de2959eb..e86e407902 100644 --- a/cura/CrashHandler.py +++ b/cura/CrashHandler.py @@ -5,17 +5,33 @@ import webbrowser from PyQt5.QtCore import QT_VERSION_STR, PYQT_VERSION_STR, QCoreApplication from PyQt5.QtWidgets import QDialog, QDialogButtonBox, QVBoxLayout, QLabel, QTextEdit + +from UM.Logger import Logger from UM.i18n import i18nCatalog catalog = i18nCatalog("cura") +# List of exceptions that should be considered "fatal" and abort the program. +# These are primarily some exception types that we simply cannot really recover from +# (MemoryError and SystemError) and exceptions that indicate grave errors in the +# code that cause the Python interpreter to fail (SyntaxError, ImportError). +fatal_exception_types = [ + MemoryError, + SyntaxError, + ImportError, + SystemError, +] + def show(exception_type, value, tb): debug_mode = False if QCoreApplication.instance(): debug_mode = QCoreApplication.instance().getCommandLineOption("debug-mode", False) - traceback.print_exception(exception_type, value, tb) + Logger.log("c", "An uncaught exception has occurred!") + for line in traceback.format_exception(exception_type, value, tb): + for part in line.rstrip("\n").split("\n"): + Logger.log("c", part) - if not debug_mode: + if not debug_mode and exception_type not in fatal_exception_types: return application = QCoreApplication.instance() @@ -29,7 +45,7 @@ def show(exception_type, value, tb): label = QLabel(dialog) layout.addWidget(label) - label.setText(catalog.i18nc("@label", "

An uncaught exception has occurred!

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

")) + label.setText(catalog.i18nc("@label", "

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

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

")) textarea = QTextEdit(dialog) layout.addWidget(textarea) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 4977cc799b..c9e7e701c4 100644 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -4,7 +4,7 @@ from UM.Qt.QtApplication import QtApplication from UM.Scene.SceneNode import SceneNode from UM.Scene.Camera import Camera -from UM.Scene.Platform import Platform +from UM.Scene.Platform import Platform as Scene_Platform from UM.Math.Vector import Vector from UM.Math.Quaternion import Quaternion from UM.Math.AxisAlignedBox import AxisAlignedBox @@ -14,18 +14,26 @@ from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator from UM.Mesh.ReadMeshJob import ReadMeshJob from UM.Logger import Logger from UM.Preferences import Preferences +from UM.Platform import Platform from UM.JobQueue import JobQueue - +from UM.SaveFile import SaveFile from UM.Scene.Selection import Selection from UM.Scene.GroupDecorator import GroupDecorator +import UM.Settings.Validator from UM.Operations.AddSceneNodeOperation import AddSceneNodeOperation from UM.Operations.RemoveSceneNodeOperation import RemoveSceneNodeOperation from UM.Operations.GroupedOperation import GroupedOperation from UM.Operations.SetTransformOperation import SetTransformOperation +from cura.SetParentOperation import SetParentOperation + +from UM.Settings.SettingDefinition import SettingDefinition, DefinitionPropertyType +from UM.Settings.ContainerRegistry import ContainerRegistry from UM.i18n import i18nCatalog +from . import ExtruderManager +from . import ExtrudersModel from . import PlatformPhysics from . import BuildVolume from . import CameraAnimation @@ -34,20 +42,23 @@ from . import CuraActions from . import MultiMaterialDecorator from . import ZOffsetDecorator from . import CuraSplashScreen +from . import MachineManagerModel +from . import ContainerSettingsModel from PyQt5.QtCore import pyqtSlot, QUrl, pyqtSignal, pyqtProperty, QEvent, Q_ENUMS from PyQt5.QtGui import QColor, QIcon -from PyQt5.QtQml import qmlRegisterUncreatableType +from PyQt5.QtQml import qmlRegisterUncreatableType, qmlRegisterSingletonType, qmlRegisterType import platform import sys import os.path import numpy import copy +import urllib numpy.seterr(all="ignore") #WORKAROUND: GITHUB-88 GITHUB-385 GITHUB-612 -if platform.system() == "Linux": # Needed for platform.linux_distribution, which is not available on Windows and OSX +if Platform.isLinux(): # Needed for platform.linux_distribution, which is not available on Windows and OSX # For Ubuntu: https://bugs.launchpad.net/ubuntu/+source/python-qt4/+bug/941826 if platform.linux_distribution()[0] in ("Ubuntu", ): # TODO: Needs a "if X11_GFX == 'nvidia'" here. The workaround is only needed on Ubuntu+NVidia drivers. Other drivers are not affected, but fine with this fix. import ctypes @@ -55,15 +66,23 @@ if platform.system() == "Linux": # Needed for platform.linux_distribution, which ctypes.CDLL(find_library('GL'), ctypes.RTLD_GLOBAL) try: - from cura.CuraVersion import CuraVersion + from cura.CuraVersion import CuraVersion, CuraBuildType except ImportError: CuraVersion = "master" # [CodeStyle: Reflecting imported value] + CuraBuildType = "" class CuraApplication(QtApplication): class ResourceTypes: QmlFiles = Resources.UserType + 1 Firmware = Resources.UserType + 2 + QualityInstanceContainer = Resources.UserType + 3 + MaterialInstanceContainer = Resources.UserType + 4 + VariantInstanceContainer = Resources.UserType + 5 + UserInstanceContainer = Resources.UserType + 6 + MachineStack = Resources.UserType + 7 + ExtruderStack = Resources.UserType + 8 + Q_ENUMS(ResourceTypes) def __init__(self): @@ -73,7 +92,14 @@ class CuraApplication(QtApplication): self._open_file_queue = [] # Files to open when plug-ins are loaded. - super().__init__(name = "cura", version = CuraVersion) + # Need to do this before ContainerRegistry tries to load the machines + SettingDefinition.addSupportedProperty("settable_per_mesh", DefinitionPropertyType.Any, default = True) + SettingDefinition.addSupportedProperty("settable_per_extruder", DefinitionPropertyType.Any, default = True) + SettingDefinition.addSupportedProperty("settable_per_meshgroup", DefinitionPropertyType.Any, default = True) + SettingDefinition.addSupportedProperty("settable_globally", DefinitionPropertyType.Any, default = True) + SettingDefinition.addSettingType("extruder", int, str, UM.Settings.Validator) + + super().__init__(name = "cura", version = CuraVersion, buildtype = CuraBuildType) self.setWindowIcon(QIcon(Resources.getPath(Resources.Images, "cura-icon.png"))) @@ -95,31 +121,109 @@ class CuraApplication(QtApplication): self._i18n_catalog = None self._previous_active_tool = None self._platform_activity = False - self._scene_boundingbox = AxisAlignedBox.Null + self._scene_bounding_box = AxisAlignedBox.Null + self._job_name = None self._center_after_select = False self._camera_animation = None self._cura_actions = None + self._started = False - self.getMachineManager().activeMachineInstanceChanged.connect(self._onActiveMachineChanged) - self.getMachineManager().addMachineRequested.connect(self._onAddMachineRequested) self.getController().getScene().sceneChanged.connect(self.updatePlatformActivity) self.getController().toolOperationStopped.connect(self._onToolOperationStopped) Resources.addType(self.ResourceTypes.QmlFiles, "qml") Resources.addType(self.ResourceTypes.Firmware, "firmware") - Preferences.getInstance().addPreference("cura/active_machine", "") + ## Add the 4 types of profiles to storage. + Resources.addStorageType(self.ResourceTypes.QualityInstanceContainer, "quality") + Resources.addStorageType(self.ResourceTypes.VariantInstanceContainer, "variants") + Resources.addStorageType(self.ResourceTypes.MaterialInstanceContainer, "materials") + Resources.addStorageType(self.ResourceTypes.UserInstanceContainer, "user") + Resources.addStorageType(self.ResourceTypes.ExtruderStack, "extruders") + Resources.addStorageType(self.ResourceTypes.MachineStack, "machine_instances") + + ContainerRegistry.getInstance().addResourceType(self.ResourceTypes.QualityInstanceContainer) + ContainerRegistry.getInstance().addResourceType(self.ResourceTypes.VariantInstanceContainer) + ContainerRegistry.getInstance().addResourceType(self.ResourceTypes.MaterialInstanceContainer) + ContainerRegistry.getInstance().addResourceType(self.ResourceTypes.UserInstanceContainer) + ContainerRegistry.getInstance().addResourceType(self.ResourceTypes.ExtruderStack) + ContainerRegistry.getInstance().addResourceType(self.ResourceTypes.MachineStack) + + # Add empty variant, material and quality containers. + # Since they are empty, they should never be serialized and instead just programmatically created. + # We need them to simplify the switching between materials. + empty_container = ContainerRegistry.getInstance().getEmptyInstanceContainer() + empty_variant_container = copy.deepcopy(empty_container) + empty_variant_container._id = "empty_variant" + empty_variant_container.addMetaDataEntry("type", "variant") + ContainerRegistry.getInstance().addContainer(empty_variant_container) + empty_material_container = copy.deepcopy(empty_container) + empty_material_container._id = "empty_material" + empty_material_container.addMetaDataEntry("type", "material") + ContainerRegistry.getInstance().addContainer(empty_material_container) + empty_quality_container = copy.deepcopy(empty_container) + empty_quality_container._id = "empty_quality" + empty_quality_container.addMetaDataEntry("type", "quality") + ContainerRegistry.getInstance().addContainer(empty_quality_container) + + ContainerRegistry.getInstance().load() + Preferences.getInstance().addPreference("cura/active_mode", "simple") Preferences.getInstance().addPreference("cura/recent_files", "") Preferences.getInstance().addPreference("cura/categories_expanded", "") + Preferences.getInstance().addPreference("cura/jobname_prefix", True) Preferences.getInstance().addPreference("view/center_on_select", True) Preferences.getInstance().addPreference("mesh/scale_to_fit", True) Preferences.getInstance().addPreference("mesh/scale_tiny_meshes", True) Preferences.getInstance().setDefault("local_file/last_used_type", "text/x-gcode") + Preferences.getInstance().setDefault("general/visible_settings", """ + machine_settings + resolution + layer_height + shell + wall_thickness + top_bottom_thickness + infill + infill_sparse_density + material + material_print_temperature + material_bed_temperature + material_diameter + material_flow + retraction_enable + speed + speed_print + speed_travel + acceleration_print + acceleration_travel + jerk_print + jerk_travel + travel + cooling + cool_fan_enabled + support + support_enable + support_type + support_roof_density + platform_adhesion + adhesion_type + brim_width + raft_airgap + layer_0_z_overlap + raft_surface_layers + meshfix + blackmagic + print_sequence + dual + experimental + """.replace("\n", ";").replace(" ", "")) + JobQueue.getInstance().jobFinished.connect(self._onJobFinished) + self.applicationShuttingDown.connect(self.saveSettings) + self._recent_files = [] files = Preferences.getInstance().getValue("cura/recent_files").split(";") for f in files: @@ -128,6 +232,65 @@ class CuraApplication(QtApplication): self._recent_files.append(QUrl.fromLocalFile(f)) + ## Cura has multiple locations where instance containers need to be saved, so we need to handle this differently. + # + # Note that the AutoSave plugin also calls this method. + def saveSettings(self): + if not self._started: # Do not do saving during application start + return + + for instance in ContainerRegistry.getInstance().findInstanceContainers(): + if not instance.isDirty(): + continue + + try: + data = instance.serialize() + except NotImplementedError: + continue + except Exception: + Logger.logException("e", "An exception occurred when serializing container %s", instance.getId()) + continue + + file_name = urllib.parse.quote_plus(instance.getId()) + ".inst.cfg" + instance_type = instance.getMetaDataEntry("type") + path = None + if instance_type == "material": + path = Resources.getStoragePath(self.ResourceTypes.MaterialInstanceContainer, file_name) + elif instance_type == "quality": + path = Resources.getStoragePath(self.ResourceTypes.QualityInstanceContainer, file_name) + elif instance_type == "user": + path = Resources.getStoragePath(self.ResourceTypes.UserInstanceContainer, file_name) + elif instance_type == "variant": + path = Resources.getStoragePath(self.ResourceTypes.VariantInstanceContainer, file_name) + + if path: + with SaveFile(path, "wt", -1, "utf-8") as f: + f.write(data) + + for stack in ContainerRegistry.getInstance().findContainerStacks(): + if not stack.isDirty(): + continue + + try: + data = stack.serialize() + except NotImplementedError: + continue + except Exception: + Logger.logException("e", "An exception occurred when serializing container %s", instance.getId()) + continue + + file_name = urllib.parse.quote_plus(stack.getId()) + ".stack.cfg" + stack_type = stack.getMetaDataEntry("type", None) + path = None + if not stack_type or stack_type == "machine": + path = Resources.getStoragePath(self.ResourceTypes.MachineStack, file_name) + elif stack_type == "extruder_train": + path = Resources.getStoragePath(self.ResourceTypes.ExtruderStack, file_name) + if path: + with SaveFile(path, "wt", -1, "utf-8") as f: + f.write(data) + + @pyqtSlot(result = QUrl) def getDefaultPath(self): return QUrl.fromLocalFile(os.path.expanduser("~/")) @@ -135,6 +298,8 @@ class CuraApplication(QtApplication): ## Handle loading of all plugin types (and the backend explicitly) # \sa PluginRegistery def _loadPlugins(self): + self._plugin_registry.addType("profile_reader", self._addProfileReader) + self._plugin_registry.addType("profile_writer", self._addProfileWriter) self._plugin_registry.addPluginLocation(os.path.join(QtApplication.getInstallPrefix(), "lib", "cura")) if not hasattr(sys, "frozen"): self._plugin_registry.addPluginLocation(os.path.join(os.path.abspath(os.path.dirname(__file__)), "..", "plugins")) @@ -176,7 +341,7 @@ class CuraApplication(QtApplication): Selection.selectionChanged.connect(self.onSelectionChanged) root = controller.getScene().getRoot() - self._platform = Platform(root) + self._platform = Scene_Platform(root) self._volume = BuildVolume.BuildVolume(root) @@ -197,7 +362,13 @@ class CuraApplication(QtApplication): self.showSplashMessage(self._i18n_catalog.i18nc("@info:progress", "Loading interface...")) + # Initialise extruder so as to listen to global container stack changes before the first global container stack is set. + ExtruderManager.ExtruderManager.getInstance() + qmlRegisterSingletonType(MachineManagerModel.MachineManagerModel, "Cura", 1, 0, "MachineManager", + MachineManagerModel.createMachineManagerModel) + self.setMainQml(Resources.getPath(self.ResourceTypes.QmlFiles, "Cura.qml")) + self._qml_import_paths.append(Resources.getPath(self.ResourceTypes.QmlFiles)) self.initializeEngine() if self._engine.rootObjects: @@ -208,6 +379,8 @@ class CuraApplication(QtApplication): for file_name in self._open_file_queue: #Open all the files that were queued up while plug-ins were loading. self._openFile(file_name) + self._started = True + self.exec_() ## Handle Qt events @@ -224,6 +397,9 @@ class CuraApplication(QtApplication): def getPrintInformation(self): return self._print_information + ## Registers objects for the QML engine to use. + # + # \param engine The QML engine. def registerObjects(self, engine): engine.rootContext().setContextProperty("Printer", self) self._print_information = PrintInformation.PrintInformation() @@ -233,6 +409,21 @@ class CuraApplication(QtApplication): qmlRegisterUncreatableType(CuraApplication, "Cura", 1, 0, "ResourceTypes", "Just an Enum type") + qmlRegisterType(ExtrudersModel.ExtrudersModel, "Cura", 1, 0, "ExtrudersModel") + + qmlRegisterType(ContainerSettingsModel.ContainerSettingsModel, "Cura", 1, 0, "ContainerSettingsModel") + + qmlRegisterSingletonType(QUrl.fromLocalFile(Resources.getPath(CuraApplication.ResourceTypes.QmlFiles, "Actions.qml")), "Cura", 1, 0, "Actions") + + engine.rootContext().setContextProperty("ExtruderManager", ExtruderManager.ExtruderManager.getInstance()) + + for path in Resources.getAllResourcesOfType(CuraApplication.ResourceTypes.QmlFiles): + type_name = os.path.splitext(os.path.basename(path))[0] + if type_name in ("Cura", "Actions"): + continue + + qmlRegisterType(QUrl.fromLocalFile(path), "Cura", 1, 0, type_name) + def onSelectionChanged(self): if Selection.hasSelection(): if not self.getController().getActiveTool(): @@ -267,46 +458,33 @@ class CuraApplication(QtApplication): @pyqtProperty(str, notify = sceneBoundingBoxChanged) def getSceneBoundingBoxString(self): - return self._i18n_catalog.i18nc("@info", "%(width).1f x %(depth).1f x %(height).1f mm") % {'width' : self._scene_boundingbox.width.item(), 'depth': self._scene_boundingbox.depth.item(), 'height' : self._scene_boundingbox.height.item()} + return self._i18n_catalog.i18nc("@info", "%(width).1f x %(depth).1f x %(height).1f mm") % {'width' : self._scene_bounding_box.width.item(), 'depth': self._scene_bounding_box.depth.item(), 'height' : self._scene_bounding_box.height.item()} def updatePlatformActivity(self, node = None): count = 0 - scene_boundingbox = None + scene_bounding_box = None for node in DepthFirstIterator(self.getController().getScene().getRoot()): if type(node) is not SceneNode or not node.getMeshData(): continue count += 1 - if not scene_boundingbox: - scene_boundingbox = node.getBoundingBox() + if not scene_bounding_box: + scene_bounding_box = node.getBoundingBox() else: other_bb = node.getBoundingBox() if other_bb is not None: - scene_boundingbox = scene_boundingbox + node.getBoundingBox() + scene_bounding_box = scene_bounding_box + node.getBoundingBox() - if not scene_boundingbox: - scene_boundingbox = AxisAlignedBox.Null + if not scene_bounding_box: + scene_bounding_box = AxisAlignedBox.Null - if repr(self._scene_boundingbox) != repr(scene_boundingbox): - self._scene_boundingbox = scene_boundingbox + if repr(self._scene_bounding_box) != repr(scene_bounding_box): + self._scene_bounding_box = scene_bounding_box self.sceneBoundingBoxChanged.emit() self._platform_activity = True if count > 0 else False self.activityChanged.emit() - @pyqtSlot(str) - def setJobName(self, name): - name = os.path.splitext(name)[0] #when a file is opened using the terminal; the filename comes from _onFileLoaded and still contains its extension. This cuts the extension off if nescessary. - if self._job_name != name: - self._job_name = name - self.jobNameChanged.emit() - - jobNameChanged = pyqtSignal() - - @pyqtProperty(str, notify = jobNameChanged) - def jobName(self): - return self._job_name - # Remove all selected objects from the scene. @pyqtSlot() def deleteSelection(self): @@ -331,7 +509,7 @@ class CuraApplication(QtApplication): node = self.getController().getScene().findObject(object_id) - if not node and object_id != 0: #Workaround for tool handles overlapping the selected object + if not node and object_id != 0: # Workaround for tool handles overlapping the selected object node = Selection.getSelectedObject(0) if node: @@ -350,7 +528,7 @@ class CuraApplication(QtApplication): def multiplyObject(self, object_id, count): node = self.getController().getScene().findObject(object_id) - if not node and object_id != 0: #Workaround for tool handles overlapping the selected object + if not node and object_id != 0: # Workaround for tool handles overlapping the selected object node = Selection.getSelectedObject(0) if node: @@ -372,7 +550,7 @@ class CuraApplication(QtApplication): @pyqtSlot("quint64") def centerObject(self, object_id): node = self.getController().getScene().findObject(object_id) - if not node and object_id != 0: #Workaround for tool handles overlapping the selected object + if not node and object_id != 0: # Workaround for tool handles overlapping the selected object node = Selection.getSelectedObject(0) if not node: @@ -385,7 +563,7 @@ class CuraApplication(QtApplication): op = SetTransformOperation(node, Vector()) op.push() - ## Delete all mesh data on the scene. + ## Delete all nodes containing mesh data in the scene. @pyqtSlot() def deleteAll(self): if not self.getController().getToolsEnabled(): @@ -396,9 +574,9 @@ class CuraApplication(QtApplication): if type(node) is not SceneNode: continue if not node.getMeshData() and not node.callDecoration("isGroup"): - continue #Node that doesnt have a mesh and is not a group. + continue # Node that doesnt have a mesh and is not a group. if node.getParent() and node.getParent().callDecoration("isGroup"): - continue #Grouped nodes don't need resetting as their parent (the group) is resetted) + continue # Grouped nodes don't need resetting as their parent (the group) is resetted) nodes.append(node) if nodes: op = GroupedOperation() @@ -416,9 +594,9 @@ class CuraApplication(QtApplication): if type(node) is not SceneNode: continue if not node.getMeshData() and not node.callDecoration("isGroup"): - continue #Node that doesnt have a mesh and is not a group. + continue # Node that doesnt have a mesh and is not a group. if node.getParent() and node.getParent().callDecoration("isGroup"): - continue #Grouped nodes don't need resetting as their parent (the group) is resetted) + continue # Grouped nodes don't need resetting as their parent (the group) is resetted) nodes.append(node) @@ -438,9 +616,9 @@ class CuraApplication(QtApplication): if type(node) is not SceneNode: continue if not node.getMeshData() and not node.callDecoration("isGroup"): - continue #Node that doesnt have a mesh and is not a group. + continue # Node that doesnt have a mesh and is not a group. if node.getParent() and node.getParent().callDecoration("isGroup"): - continue #Grouped nodes don't need resetting as their parent (the group) is resetted) + continue # Grouped nodes don't need resetting as their parent (the group) is resetted) nodes.append(node) if nodes: @@ -479,7 +657,7 @@ class CuraApplication(QtApplication): ## Get logging data of the backend engine # \returns \type{string} Logging data - @pyqtSlot(result=str) + @pyqtSlot(result = str) def getEngineLog(self): log = "" @@ -509,21 +687,6 @@ class CuraApplication(QtApplication): def expandedCategories(self): return Preferences.getInstance().getValue("cura/categories_expanded").split(";") - @pyqtSlot(str, result = "QVariant") - def getSettingValue(self, key): - if not self.getMachineManager().getWorkingProfile(): - return None - return self.getMachineManager().getWorkingProfile().getSettingValue(key) - #return self.getActiveMachine().getSettingValueByKey(key) - - ## Change setting by key value pair - @pyqtSlot(str, "QVariant") - def setSettingValue(self, key, value): - if not self.getMachineManager().getWorkingProfile(): - return - - self.getMachineManager().getWorkingProfile().setSettingValue(key, value) - @pyqtSlot() def mergeSelected(self): self.groupSelected() @@ -542,9 +705,10 @@ class CuraApplication(QtApplication): # Use the previously found center of the group bounding box as the new location of the group group_node.setPosition(group_node.getBoundingBox().center) - + @pyqtSlot() def groupSelected(self): + # Create a group-node group_node = SceneNode() group_decorator = GroupDecorator() group_node.addDecorator(group_decorator) @@ -554,40 +718,34 @@ class CuraApplication(QtApplication): group_node.setPosition(center) group_node.setCenterPosition(center) - for node in Selection.getAllSelectedObjects(): - world = node.getWorldPosition() - node.setParent(group_node) - node.setPosition(world - center) + # Move selected nodes into the group-node + Selection.applyOperation(SetParentOperation, group_node) + # Deselect individual nodes and select the group-node instead for node in group_node.getChildren(): Selection.remove(node) - Selection.add(group_node) @pyqtSlot() def ungroupSelected(self): - ungrouped_nodes = [] - selected_objects = Selection.getAllSelectedObjects()[:] #clone the list + selected_objects = Selection.getAllSelectedObjects().copy() for node in selected_objects: - if node.callDecoration("isGroup" ): - children_to_move = [] - for child in node.getChildren(): - if type(child) is SceneNode: - children_to_move.append(child) + if node.callDecoration("isGroup"): + op = GroupedOperation() - for child in children_to_move: - position = child.getWorldPosition() - child.setParent(node.getParent()) - child.setPosition(position - node.getParent().getWorldPosition()) - child.scale(node.getScale()) - child.rotate(node.getOrientation()) + group_parent = node.getParent() + children = node.getChildren().copy() + for child in children: + # 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) - child.callDecoration("setConvexHull",None) - node.setParent(None) - ungrouped_nodes.append(node) - for node in ungrouped_nodes: - Selection.remove(node) + child.callDecoration("setConvexHull", None) + + op.push() + # Note: The group removes itself from the scene once all its children have left it, + # see GroupDecorator._onChildrenChanged def _createSplashScreen(self): return CuraSplashScreen.CuraSplashScreen() @@ -595,10 +753,12 @@ class CuraApplication(QtApplication): def _onActiveMachineChanged(self): pass + fileLoaded = pyqtSignal(str) + def _onFileLoaded(self, job): node = job.getResult() if node != None: - self.setJobName(os.path.basename(job.getFileName())) + self.fileLoaded.emit(job.getFileName()) node.setSelectable(True) node.setName(os.path.basename(job.getFileName())) op = AddSceneNodeOperation(node, self.getController().getScene().getRoot()) @@ -628,14 +788,15 @@ class CuraApplication(QtApplication): def _reloadMeshFinished(self, job): # TODO; This needs to be fixed properly. We now make the assumption that we only load a single mesh! job._node.setMeshData(job.getResult().getMeshData()) - #job.getResult().setParent(self.getController().getScene().getRoot()) - #job._node.setParent(self.getController().getScene().getRoot()) - #job._node.meshDataChanged.emit(job._node) def _openFile(self, file): job = ReadMeshJob(os.path.abspath(file)) job.finished.connect(self._onFileLoaded) job.start() - def _onAddMachineRequested(self): - self.requestAddPrinter.emit() + def _addProfileReader(self, profile_reader): + # TODO: Add the profile reader to the list of plug-ins that can be used when importing profiles. + pass + + def _addProfileWriter(self, profile_writer): + pass diff --git a/cura/CuraContainerRegistry.py b/cura/CuraContainerRegistry.py new file mode 100644 index 0000000000..2ecb22d670 --- /dev/null +++ b/cura/CuraContainerRegistry.py @@ -0,0 +1,209 @@ +# Copyright (c) 2016 Ultimaker B.V. +# Cura is released under the terms of the AGPLv3 or higher. + +import os +import os.path +import re +from PyQt5.QtWidgets import QMessageBox + +from UM.Settings.ContainerRegistry import ContainerRegistry +from UM.Settings.ContainerStack import ContainerStack +from UM.Settings.InstanceContainer import InstanceContainer +from UM.Application import Application +from UM.Logger import Logger +from UM.Message import Message +from UM.Platform import Platform +from UM.PluginRegistry import PluginRegistry #For getting the possible profile writers to write with. +from UM.Util import parseBool + +from UM.i18n import i18nCatalog +catalog = i18nCatalog("cura") + +class CuraContainerRegistry(ContainerRegistry): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + ## Create a name that is not empty and unique + # \param container_type \type{string} Type of the container (machine, quality, ...) + # \param current_name \type{} Current name of the container, which may be an acceptable option + # \param new_name \type{string} Base name, which may not be unique + # \param fallback_name \type{string} Name to use when (stripped) new_name is empty + # \return \type{string} Name that is unique for the specified type and name/id + def createUniqueName(self, container_type, current_name, new_name, fallback_name): + new_name = new_name.strip() + num_check = re.compile("(.*?)\s*#\d+$").match(new_name) + if num_check: + new_name = num_check.group(1) + if new_name == "": + new_name = fallback_name + + unique_name = new_name + i = 1 + # In case we are renaming, the current name of the container is also a valid end-result + while self._containerExists(container_type, unique_name) and unique_name != current_name: + i += 1 + unique_name = "%s #%d" % (new_name, i) + + return unique_name + + ## Check if a container with of a certain type and a certain name or id exists + # Both the id and the name are checked, because they may not be the same and it is better if they are both unique + # \param container_type \type{string} Type of the container (machine, quality, ...) + # \param container_name \type{string} Name to check + def _containerExists(self, container_type, container_name): + container_class = ContainerStack if container_type == "machine" else InstanceContainer + + return self.findContainers(container_class, id = container_name, type = container_type) or \ + self.findContainers(container_class, name = container_name, type = container_type) + + ## Exports an profile to a file + # + # \param instance_id \type{str} the ID of the profile to export. + # \param file_name \type{str} the full path and filename to export to. + # \param file_type \type{str} the file type with the format " (*.)" + def exportProfile(self, instance_id, file_name, file_type): + Logger.log('d', 'exportProfile instance_id: '+str(instance_id)) + + # Parse the fileType to deduce what plugin can save the file format. + # fileType has the format " (*.)" + split = file_type.rfind(" (*.") # Find where the description ends and the extension starts. + if split < 0: # Not found. Invalid format. + Logger.log("e", "Invalid file format identifier %s", file_type) + return + description = file_type[:split] + extension = file_type[split + 4:-1] # Leave out the " (*." and ")". + if not file_name.endswith("." + extension): # Auto-fill the extension if the user did not provide any. + file_name += "." + extension + + # On Windows, QML FileDialog properly asks for overwrite confirm, but not on other platforms, so handle those ourself. + if not Platform.isWindows(): + if os.path.exists(file_name): + result = QMessageBox.question(None, catalog.i18nc("@title:window", "File Already Exists"), + catalog.i18nc("@label", "The file {0} already exists. Are you sure you want to overwrite it?").format(file_name)) + if result == QMessageBox.No: + return + + containers = ContainerRegistry.getInstance().findInstanceContainers(id=instance_id) + if not containers: + return + container = containers[0] + + profile_writer = self._findProfileWriter(extension, description) + + try: + success = profile_writer.write(file_name, container) + except Exception as e: + Logger.log("e", "Failed to export profile to %s: %s", file_name, str(e)) + m = Message(catalog.i18nc("@info:status", "Failed to export profile to {0}: {1}", file_name, str(e)), lifetime = 0) + m.show() + return + if not success: + Logger.log("w", "Failed to export profile to %s: Writer plugin reported failure.", file_name) + m = Message(catalog.i18nc("@info:status", "Failed to export profile to {0}: Writer plugin reported failure.", file_name), lifetime = 0) + m.show() + return + m = Message(catalog.i18nc("@info:status", "Exported profile to {0}", file_name)) + m.show() + + ## Gets the plugin object matching the criteria + # \param extension + # \param description + # \return The plugin object matching the given extension and description. + def _findProfileWriter(self, extension, description): + plugin_registry = PluginRegistry.getInstance() + for plugin_id, meta_data in self._getIOPlugins("profile_writer"): + for supported_type in meta_data["profile_writer"]: # All file types this plugin can supposedly write. + supported_extension = supported_type.get("extension", None) + if supported_extension == extension: # This plugin supports a file type with the same extension. + supported_description = supported_type.get("description", None) + if supported_description == description: # The description is also identical. Assume it's the same file type. + return plugin_registry.getPluginObject(plugin_id) + return None + + ## Imports a profile from a file + # + # \param file_name \type{str} the full path and filename of the profile to import + # \return \type{Dict} dict with a 'status' key containing the string 'ok' or 'error', and a 'message' key + # containing a message for the user + def importProfile(self, file_name): + if not file_name: + return { "status": "error", "message": catalog.i18nc("@info:status", "Failed to import profile from {0}: {1}", file_name, "Invalid path")} + + plugin_registry = PluginRegistry.getInstance() + for plugin_id, meta_data in self._getIOPlugins("profile_reader"): + profile_reader = plugin_registry.getPluginObject(plugin_id) + try: + profile = profile_reader.read(file_name) #Try to open the file with the profile reader. + except Exception as e: + #Note that this will fail quickly. That is, if any profile reader throws an exception, it will stop reading. It will only continue reading if the reader returned None. + Logger.log("e", "Failed to import profile from %s: %s", file_name, str(e)) + return { "status": "error", "message": catalog.i18nc("@info:status", "Failed to import profile from {0}: {1}", file_name, str(e))} + if profile: #Success! + profile.setReadOnly(False) + + new_name = self.createUniqueName("quality", "", os.path.splitext(os.path.basename(file_name))[0], + catalog.i18nc("@label", "Custom profile")) + profile.setName(new_name) + profile._id = new_name + + if self._machineHasOwnQualities(): + profile.setDefinition(self._activeDefinition()) + if self._machineHasOwnMaterials(): + profile.addMetaDataEntry("material", self._activeMaterialId()) + else: + profile.setDefinition(ContainerRegistry.getInstance().findDefinitionContainers(id="fdmprinter")[0]) + ContainerRegistry.getInstance().addContainer(profile) + + return { "status": "ok", "message": catalog.i18nc("@info:status", "Successfully imported profile {0}", profile.getName()) } + + #If it hasn't returned by now, none of the plugins loaded the profile successfully. + return { "status": "error", "message": catalog.i18nc("@info:status", "Profile {0} has an unknown file type.", file_name)} + + ## Gets a list of profile writer plugins + # \return List of tuples of (plugin_id, meta_data). + def _getIOPlugins(self, io_type): + plugin_registry = PluginRegistry.getInstance() + active_plugin_ids = plugin_registry.getActivePlugins() + + result = [] + for plugin_id in active_plugin_ids: + meta_data = plugin_registry.getMetaData(plugin_id) + if io_type in meta_data: + result.append( (plugin_id, meta_data) ) + return result + + ## Gets the active definition + # \return the active definition object or None if there is no definition + def _activeDefinition(self): + global_container_stack = Application.getInstance().getGlobalContainerStack() + if global_container_stack: + definition = global_container_stack.getBottom() + if definition: + return definition + return None + + ## Returns true if the current machine requires its own materials + # \return True if the current machine requires its own materials + def _machineHasOwnMaterials(self): + global_container_stack = Application.getInstance().getGlobalContainerStack() + if global_container_stack: + return global_container_stack.getMetaDataEntry("has_materials", False) + return False + + ## Gets the ID of the active material + # \return the ID of the active material or the empty string + def _activeMaterialId(self): + global_container_stack = Application.getInstance().getGlobalContainerStack() + if global_container_stack: + material = global_container_stack.findContainer({"type": "material"}) + if material: + return material.getId() + return "" + + ## Returns true if the current machien requires its own quality profiles + # \return true if the current machien requires its own quality profiles + def _machineHasOwnQualities(self): + global_container_stack = Application.getInstance().getGlobalContainerStack() + if global_container_stack: + return parseBool(global_container_stack.getMetaDataEntry("has_machine_quality", False)) + return False diff --git a/cura/CuraSplashScreen.py b/cura/CuraSplashScreen.py index d27c9c0240..f2810d359b 100644 --- a/cura/CuraSplashScreen.py +++ b/cura/CuraSplashScreen.py @@ -21,6 +21,9 @@ class CuraSplashScreen(QSplashScreen): painter.setPen(QColor(0, 0, 0, 255)) version = Application.getInstance().getVersion().split("-") + buildtype = Application.getInstance().getBuildType() + if buildtype: + version[0] += " (%s)" %(buildtype) painter.setFont(QFont("Proxima Nova Rg", 20 )) painter.drawText(0, 0, 330 * self._scale, 230 * self._scale, Qt.AlignHCenter | Qt.AlignBottom, version[0]) diff --git a/cura/CuraVersion.py.in b/cura/CuraVersion.py.in index bb69319ee6..5ad819b1fc 100644 --- a/cura/CuraVersion.py.in +++ b/cura/CuraVersion.py.in @@ -2,3 +2,4 @@ # Cura is released under the terms of the AGPLv3 or higher. CuraVersion = "@CURA_VERSION@" +CuraBuildType = "@CURA_BUILDTYPE@" \ No newline at end of file diff --git a/cura/ExtruderManager.py b/cura/ExtruderManager.py new file mode 100644 index 0000000000..b6739740f5 --- /dev/null +++ b/cura/ExtruderManager.py @@ -0,0 +1,221 @@ +# Copyright (c) 2016 Ultimaker B.V. +# Cura is released under the terms of the AGPLv3 or higher. + +from PyQt5.QtCore import pyqtSignal, pyqtProperty, pyqtSlot, QObject, QVariant #For communicating data and events to Qt. + +import UM.Application #To get the global container stack to find the current machine. +import UM.Logger +import UM.Settings.ContainerRegistry #Finding containers by ID. + + +## Manages all existing extruder stacks. +# +# This keeps a list of extruder stacks for each machine. +class ExtruderManager(QObject): + ## Signal to notify other components when the list of extruders changes. + extrudersChanged = pyqtSignal(QVariant) + + ## Notify when the user switches the currently active extruder. + activeExtruderChanged = pyqtSignal() + + ## Registers listeners and such to listen to changes to the extruders. + def __init__(self, parent = None): + super().__init__(parent) + self._extruder_trains = { } #Per machine, a dictionary of extruder container stack IDs. + self._active_extruder_index = 0 + UM.Application.getInstance().globalContainerStackChanged.connect(self._addCurrentMachineExtruders) + + ## Gets the unique identifier of the currently active extruder stack. + # + # The currently active extruder stack is the stack that is currently being + # edited. + # + # \return The unique ID of the currently active extruder stack. + @pyqtProperty(str, notify = activeExtruderChanged) + def activeExtruderStackId(self): + if not UM.Application.getInstance().getGlobalContainerStack(): + return None #No active machine, so no active extruder. + try: + return self._extruder_trains[UM.Application.getInstance().getGlobalContainerStack().getBottom().getId()][str(self._active_extruder_index)].getId() + except KeyError: #Extruder index could be -1 if the global tab is selected, or the entry doesn't exist if the machine definition is wrong. + return None + + ## The instance of the singleton pattern. + # + # It's None if the extruder manager hasn't been created yet. + __instance = None + + ## Gets an instance of the extruder manager, or creates one if no instance + # exists yet. + # + # This is an implementation of singleton. If an extruder manager already + # exists, it is re-used. + # + # \return The extruder manager. + @classmethod + def getInstance(cls): + if not cls.__instance: + cls.__instance = ExtruderManager() + return cls.__instance + + ## Changes the active extruder by index. + # + # \param index The index of the new active extruder. + @pyqtSlot(int) + def setActiveExtruderIndex(self, index): + self._active_extruder_index = index + self.activeExtruderChanged.emit() + + def getActiveExtruderStack(self): + global_container_stack = UM.Application.getInstance().getGlobalContainerStack() + if global_container_stack: + global_definition_container = UM.Application.getInstance().getGlobalContainerStack().getBottom() + if global_definition_container: + if global_definition_container.getId() in self._extruder_trains: + if str(self._active_extruder_index) in self._extruder_trains[global_definition_container.getId()]: + return self._extruder_trains[global_definition_container.getId()][str(self._active_extruder_index)] + + + ## Adds all extruders of a specific machine definition to the extruder + # manager. + # + # \param machine_definition The machine to add the extruders for. + def addMachineExtruders(self, machine_definition): + machine_id = machine_definition.getId() + if machine_id not in self._extruder_trains: + self._extruder_trains[machine_id] = { } + + container_registry = UM.Settings.ContainerRegistry.getInstance() + if not container_registry: #Then we shouldn't have any machine definition either. In any case, there are no extruder trains then so bye bye. + return + + #Add the extruder trains that don't exist yet. + for extruder_definition in container_registry.findDefinitionContainers(machine = machine_definition.getId()): + position = extruder_definition.getMetaDataEntry("position", None) + if not position: + UM.Logger.log("w", "Extruder definition %s specifies no position metadata entry.", extruder_definition.getId()) + if not container_registry.findContainerStacks(machine = machine_id, position = position): #Doesn't exist yet. + self.createExtruderTrain(extruder_definition, machine_definition, position) + + #Gets the extruder trains that we just created as well as any that still existed. + extruder_trains = container_registry.findContainerStacks(type = "extruder_train", machine = machine_definition.getId()) + for extruder_train in extruder_trains: + self._extruder_trains[machine_id][extruder_train.getMetaDataEntry("position")] = extruder_train + + #Ensure that the extruder train stacks are linked to global stack. + extruder_train.setNextStack(UM.Application.getInstance().getGlobalContainerStack()) + + if extruder_trains: + self.extrudersChanged.emit(machine_definition) + + ## Creates a container stack for an extruder train. + # + # The container stack has an extruder definition at the bottom, which is + # linked to a machine definition. Then it has a nozzle profile, a material + # profile, a quality profile and a user profile, in that order. + # + # The resulting container stack is added to the registry. + # + # \param extruder_definition The extruder to create the extruder train + # for. + # \param machine_definition The machine that the extruder train belongs + # to. + # \param position The position of this extruder train in the extruder + # slots of the machine. + def createExtruderTrain(self, extruder_definition, machine_definition, position): + #Cache some things. + container_registry = UM.Settings.ContainerRegistry.getInstance() + machine_id = machine_definition.getId() + + #Create a container stack for this extruder. + extruder_stack_id = container_registry.uniqueName(extruder_definition.getId()) + container_stack = UM.Settings.ContainerStack(extruder_stack_id) + container_stack.setName(extruder_definition.getName()) #Take over the display name to display the stack with. + container_stack.addMetaDataEntry("type", "extruder_train") + container_stack.addMetaDataEntry("machine", machine_definition.getId()) + container_stack.addMetaDataEntry("position", position) + container_stack.addContainer(extruder_definition) + + #Find the nozzle to use for this extruder. + nozzle = container_registry.getEmptyInstanceContainer() + if machine_definition.getMetaDataEntry("has_nozzles", default = "False") == "True": + #First add any nozzle. Later, overwrite with preference if the preference is valid. + nozzles = container_registry.findInstanceContainers(machine = machine_id, type = "nozzle") + if len(nozzles) >= 1: + nozzle = nozzles[0] + preferred_nozzle_id = machine_definition.getMetaDataEntry("preferred_nozzle") + if preferred_nozzle_id: + preferred_nozzles = container_registry.findInstanceContainers(id = preferred_nozzle_id, type = "nozzle") + if len(preferred_nozzles) >= 1: + nozzle = preferred_nozzles[0] + else: + UM.Logger.log("w", "The preferred nozzle \"%s\" of machine %s doesn't exist or is not a nozzle profile.", preferred_nozzle_id, machine_id) + #And leave it at the default nozzle. + container_stack.addContainer(nozzle) + + #Find a material to use for this nozzle. + material = container_registry.getEmptyInstanceContainer() + if machine_definition.getMetaDataEntry("has_materials", default = "False") == "True": + #First add any material. Later, overwrite with preference if the preference is valid. + if machine_definition.getMetaDataEntry("has_nozzle_materials", default = "False") == "True": + materials = container_registry.findInstanceContainers(type = "material", machine = machine_id, nozzle = nozzle.getId()) + else: + materials = container_registry.findInstanceContainers(type = "material", machine = machine_id) + if len(materials) >= 1: + material = materials[0] + preferred_material_id = machine_definition.getMetaDataEntry("preferred_material") + if preferred_material_id: + preferred_materials = container_registry.findInstanceContainers(id = preferred_material_id, type = "material") + if len(preferred_materials) >= 1: + material = preferred_materials[0] + else: + UM.Logger.log("w", "The preferred material \"%s\" of machine %s doesn't exist or is not a material profile.", preferred_material_id, machine_id) + #And leave it at the default material. + container_stack.addContainer(material) + + #Find a quality to use for this extruder. + quality = container_registry.getEmptyInstanceContainer() + + #First add any quality. Later, overwrite with preference if the preference is valid. + qualities = container_registry.findInstanceContainers(type = "quality") + if len(qualities) >= 1: + quality = qualities[0] + preferred_quality_id = machine_definition.getMetaDataEntry("preferred_quality") + if preferred_quality_id: + preferred_quality = container_registry.findInstanceContainers(id = preferred_quality_id, type = "quality") + if len(preferred_quality) >= 1: + quality = preferred_quality[0] + else: + UM.Logger.log("w", "The preferred quality \"%s\" of machine %s doesn't exist or is not a quality profile.", preferred_quality_id, machine_id) + #And leave it at the default quality. + container_stack.addContainer(quality) + + user_profile = container_registry.findInstanceContainers(id = extruder_stack_id + "_current_settings") + if user_profile: #There was already a user profile, loaded from settings. + user_profile = user_profile[0] + else: + user_profile = UM.Settings.InstanceContainer(extruder_stack_id + "_current_settings") #Add an empty user profile. + user_profile.addMetaDataEntry("type", "user") + user_profile.setDefinition(machine_definition) + container_registry.addContainer(user_profile) + container_stack.addContainer(user_profile) + + container_stack.setNextStack(UM.Application.getInstance().getGlobalContainerStack()) + + container_registry.addContainer(container_stack) + + ## Generates extruders for a specific machine. + # + # \param machine_id The machine to get the extruders of. + def getMachineExtruders(self, machine_id): + if machine_id not in self._extruder_trains: + UM.Logger.log("w", "Tried to get the extruder trains for machine %s, which doesn't exist.", machine_id) + return + for name in self._extruder_trains[machine_id]: + yield self._extruder_trains[machine_id][name] + + ## Adds the extruders of the currently active machine. + def _addCurrentMachineExtruders(self): + global_stack = UM.Application.getInstance().getGlobalContainerStack() + if global_stack and global_stack.getBottom(): + self.addMachineExtruders(global_stack.getBottom()) diff --git a/cura/ExtrudersModel.py b/cura/ExtrudersModel.py new file mode 100644 index 0000000000..3ba6c5a99a --- /dev/null +++ b/cura/ExtrudersModel.py @@ -0,0 +1,104 @@ +# Copyright (c) 2016 Ultimaker B.V. +# Cura is released under the terms of the AGPLv3 or higher. + +from PyQt5.QtCore import Qt, pyqtSignal, pyqtProperty + +import cura.ExtruderManager +import UM.Qt.ListModel + +## Model that holds extruders. +# +# This model is designed for use by any list of extruders, but specifically +# intended for drop-down lists of the current machine's extruders in place of +# settings. +class ExtrudersModel(UM.Qt.ListModel.ListModel): + # The ID of the container stack for the extruder. + IdRole = Qt.UserRole + 1 + + ## Human-readable name of the extruder. + NameRole = Qt.UserRole + 2 + + ## Colour of the material loaded in the extruder. + ColourRole = Qt.UserRole + 3 + + ## Index of the extruder, which is also the value of the setting itself. + # + # An index of 0 indicates the first extruder, an index of 1 the second + # one, and so on. This is the value that will be saved in instance + # containers. + IndexRole = Qt.UserRole + 4 + + ## List of colours to display if there is no material or the material has no known + # colour. + defaultColours = ["#ffc924", "#86ec21", "#22eeee", "#245bff", "#9124ff", "#ff24c8"] + + ## Initialises the extruders model, defining the roles and listening for + # changes in the data. + # + # \param parent Parent QtObject of this list. + def __init__(self, parent = None): + super().__init__(parent) + + self.addRoleName(self.IdRole, "id") + self.addRoleName(self.NameRole, "name") + self.addRoleName(self.ColourRole, "colour") + self.addRoleName(self.IndexRole, "index") + + self._add_global = False + + #Listen to changes. + manager = cura.ExtruderManager.ExtruderManager.getInstance() + manager.extrudersChanged.connect(self._updateExtruders) #When the list of extruders changes in general. + UM.Application.globalContainerStackChanged.connect(self._updateExtruders) #When the current machine changes. + self._updateExtruders() + + def setAddGlobal(self, add): + if add != self._add_global: + self._add_global = add + self._updateExtruders() + self.addGlobalChanged.emit() + + addGlobalChanged = pyqtSignal() + @pyqtProperty(bool, fset = setAddGlobal, notify = addGlobalChanged) + def addGlobal(self): + return self._add_global + + ## Update the list of extruders. + # + # This should be called whenever the list of extruders changes. + def _updateExtruders(self): + self.clear() + manager = cura.ExtruderManager.ExtruderManager.getInstance() + global_container_stack = UM.Application.getInstance().getGlobalContainerStack() + if not global_container_stack: + return #There is no machine to get the extruders of. + + if self._add_global: + material = global_container_stack.findContainer({ "type": "material" }) + colour = material.getMetaDataEntry("color_code", default = self.defaultColours[0]) if material else self.defaultColours[0] + item = { + "id": global_container_stack.getId(), + "name": "Global", + "colour": colour, + "index": -1 + } + self.appendItem(item) + + for extruder in manager.getMachineExtruders(global_container_stack.getBottom().getId()): + material = extruder.findContainer({ "type": "material" }) + position = extruder.getBottom().getMetaDataEntry("position", default = "0") #Position in the definition. + try: + position = int(position) + except ValueError: #Not a proper int. + position = -1 + default_colour = self.defaultColours[position] if position >= 0 and position < len(self.defaultColours) else defaultColours[0] + colour = material.getMetaDataEntry("color_code", default = default_colour) if material else default_colour + item = { #Construct an item with only the relevant information. + "id": extruder.getId(), + "name": extruder.getName(), + "colour": colour, + "index": position + } + self.appendItem(item) + + self.sort(lambda item: item["index"]) diff --git a/cura/MachineManagerModel.py b/cura/MachineManagerModel.py new file mode 100644 index 0000000000..2960d48ed1 --- /dev/null +++ b/cura/MachineManagerModel.py @@ -0,0 +1,552 @@ +# Copyright (c) 2016 Ultimaker B.V. +# Cura is released under the terms of the AGPLv3 or higher. + +from PyQt5.QtCore import QObject, pyqtSlot, pyqtProperty, pyqtSignal +from UM.Application import Application +from UM.Preferences import Preferences + +import UM.Settings +from UM.Settings.Validator import ValidatorState +from UM.Settings.InstanceContainer import InstanceContainer + +from cura.PrinterOutputDevice import PrinterOutputDevice +from UM.Settings.ContainerStack import ContainerStack +from . import ExtruderManager +from UM.i18n import i18nCatalog +catalog = i18nCatalog("cura") + + +class MachineManagerModel(QObject): + def __init__(self, parent = None): + super().__init__(parent) + + self._active_container_stack = None + self._global_container_stack = None + + Application.getInstance().globalContainerStackChanged.connect(self._onGlobalContainerChanged) + self._global_stack_valid = None + self._onGlobalContainerChanged() + + ExtruderManager.ExtruderManager.getInstance().activeExtruderChanged.connect(self._onActiveExtruderStackChanged) + self.globalContainerChanged.connect(self._onActiveExtruderStackChanged) + self._onActiveExtruderStackChanged() + + ## When the global container is changed, active material probably needs to be updated. + self.globalContainerChanged.connect(self.activeMaterialChanged) + self.globalContainerChanged.connect(self.activeVariantChanged) + self.globalContainerChanged.connect(self.activeQualityChanged) + ExtruderManager.ExtruderManager.getInstance().activeExtruderChanged.connect(self.activeMaterialChanged) + ExtruderManager.ExtruderManager.getInstance().activeExtruderChanged.connect(self.activeVariantChanged) + ExtruderManager.ExtruderManager.getInstance().activeExtruderChanged.connect(self.activeQualityChanged) + + self.globalContainerChanged.connect(self.activeStackChanged) + self.globalValueChanged.connect(self.activeStackChanged) + ExtruderManager.ExtruderManager.getInstance().activeExtruderChanged.connect(self.activeStackChanged) + + self._empty_variant_container = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(id = "empty_variant")[0] + self._empty_material_container = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(id = "empty_material")[0] + self._empty_quality_container = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(id = "empty_quality")[0] + + Preferences.getInstance().addPreference("cura/active_machine", "") + + active_machine_id = Preferences.getInstance().getValue("cura/active_machine") + + Application.getInstance().getOutputDeviceManager().outputDevicesChanged.connect(self._onOutputDevicesChanged) + + if active_machine_id != "": + # An active machine was saved, so restore it. + self.setActiveMachine(active_machine_id) + pass + + globalContainerChanged = pyqtSignal() + activeMaterialChanged = pyqtSignal() + activeVariantChanged = pyqtSignal() + activeQualityChanged = pyqtSignal() + activeStackChanged = pyqtSignal() + + globalValueChanged = pyqtSignal() # Emitted whenever a value inside global container is changed. + globalValidationChanged = pyqtSignal() # Emitted whenever a validation inside global container is changed + + blurSettings = pyqtSignal() # Emitted to force fields in the advanced sidebar to un-focus, so they update properly + + outputDevicesChanged = pyqtSignal() + + def _onOutputDevicesChanged(self): + self.outputDevicesChanged.emit() + + def _onGlobalPropertyChanged(self, key, property_name): + if property_name == "value": + self.globalValueChanged.emit() + if property_name == "validationState": + if self._global_stack_valid: + changed_validation_state = self._active_container_stack.getProperty(key, property_name) + if changed_validation_state in (ValidatorState.Exception, ValidatorState.MaximumError, ValidatorState.MinimumError): + self._global_stack_valid = False + self.globalValidationChanged.emit() + else: + new_validation_state = self._checkStackForErrors(self._active_container_stack) + if new_validation_state: + self._global_stack_valid = True + self.globalValidationChanged.emit() + + def _onGlobalContainerChanged(self): + if self._global_container_stack: + self._global_container_stack.containersChanged.disconnect(self._onInstanceContainersChanged) + self._global_container_stack.propertyChanged.disconnect(self._onGlobalPropertyChanged) + + self._global_container_stack = Application.getInstance().getGlobalContainerStack() + self.globalContainerChanged.emit() + + if self._global_container_stack: + Preferences.getInstance().setValue("cura/active_machine", self._global_container_stack.getId()) + self._global_container_stack.containersChanged.connect(self._onInstanceContainersChanged) + self._global_container_stack.propertyChanged.connect(self._onGlobalPropertyChanged) + self._global_stack_valid = not self._checkStackForErrors(self._global_container_stack) + + def _onActiveExtruderStackChanged(self): + if self._active_container_stack and self._active_container_stack != self._global_container_stack: + self._active_container_stack.containersChanged.disconnect(self._onInstanceContainersChanged) + self._active_container_stack.propertyChanged.disconnect(self._onGlobalPropertyChanged) + + self._active_container_stack = ExtruderManager.ExtruderManager.getInstance().getActiveExtruderStack() + if self._active_container_stack: + self._active_container_stack.containersChanged.connect(self._onInstanceContainersChanged) + self._active_container_stack.propertyChanged.connect(self._onGlobalPropertyChanged) + else: + self._active_container_stack = self._global_container_stack + + def _onInstanceContainersChanged(self, container): + container_type = container.getMetaDataEntry("type") + if container_type == "material": + self.activeMaterialChanged.emit() + elif container_type == "variant": + self.activeVariantChanged.emit() + elif container_type == "quality": + self.activeQualityChanged.emit() + + @pyqtSlot(str) + def setActiveMachine(self, stack_id): + containers = UM.Settings.ContainerRegistry.getInstance().findContainerStacks(id = stack_id) + if containers: + Application.getInstance().setGlobalContainerStack(containers[0]) + + @pyqtSlot(str, str) + def addMachine(self, name, definition_id): + definitions = UM.Settings.ContainerRegistry.getInstance().findDefinitionContainers(id = definition_id) + if definitions: + definition = definitions[0] + name = self._createUniqueName("machine", "", name, definition.getName()) + new_global_stack = UM.Settings.ContainerStack(name) + new_global_stack.addMetaDataEntry("type", "machine") + UM.Settings.ContainerRegistry.getInstance().addContainer(new_global_stack) + + variant_instance_container = self._updateVariantContainer(definition) + material_instance_container = self._updateMaterialContainer(definition, variant_instance_container) + quality_instance_container = self._updateQualityContainer(definition, material_instance_container) + + current_settings_instance_container = UM.Settings.InstanceContainer(name + "_current_settings") + current_settings_instance_container.addMetaDataEntry("machine", name) + current_settings_instance_container.addMetaDataEntry("type", "user") + current_settings_instance_container.setDefinition(definitions[0]) + UM.Settings.ContainerRegistry.getInstance().addContainer(current_settings_instance_container) + + # If a definition is found, its a list. Should only have one item. + new_global_stack.addContainer(definition) + if variant_instance_container: + new_global_stack.addContainer(variant_instance_container) + if material_instance_container: + new_global_stack.addContainer(material_instance_container) + if quality_instance_container: + new_global_stack.addContainer(quality_instance_container) + new_global_stack.addContainer(current_settings_instance_container) + + ExtruderManager.ExtruderManager.getInstance().addMachineExtruders(definition) + + Application.getInstance().setGlobalContainerStack(new_global_stack) + + @pyqtProperty("QVariantList", notify = outputDevicesChanged) + def printerOutputDevices(self): + return [printer_output_device for printer_output_device in Application.getInstance().getOutputDeviceManager().getOutputDevices() if isinstance(printer_output_device, PrinterOutputDevice)] + + ## Create a name that is not empty and unique + # \param container_type \type{string} Type of the container (machine, quality, ...) + # \param current_name \type{} Current name of the container, which may be an acceptable option + # \param new_name \type{string} Base name, which may not be unique + # \param fallback_name \type{string} Name to use when (stripped) new_name is empty + # \return \type{string} Name that is unique for the specified type and name/id + def _createUniqueName(self, container_type, current_name, new_name, fallback_name): + return UM.Settings.ContainerRegistry.getInstance().createUniqueName(container_type, current_name, new_name, fallback_name) + + ## Convenience function to check if a stack has errors. + def _checkStackForErrors(self, stack): + if stack is None: + return False + + for key in stack.getAllKeys(): + validation_state = stack.getProperty(key, "validationState") + if validation_state in (ValidatorState.Exception, ValidatorState.MaximumError, ValidatorState.MinimumError): + return True + return False + + ## Remove all instances from the top instanceContainer (effectively removing all user-changed settings) + @pyqtSlot() + def clearUserSettings(self): + if not self._active_container_stack: + return + + self.blurSettings.emit() + user_settings = self._active_container_stack.getTop() + user_settings.clear() + + ## Check if the global_container has instances in the user container + @pyqtProperty(bool, notify = activeStackChanged) + def hasUserSettings(self): + if not self._active_container_stack: + return + + user_settings = self._active_container_stack.getTop().findInstances(**{}) + return len(user_settings) != 0 + + ## Check if the global profile does not contain error states + # Note that the _global_stack_valid is cached due to performance issues + # Calling _checkStackForErrors on every change is simply too expensive + @pyqtProperty(bool, notify = globalValidationChanged) + def isGlobalStackValid(self): + return self._global_stack_valid + + @pyqtProperty(str, notify = activeStackChanged) + def activeUserProfileId(self): + if self._active_container_stack: + return self._active_container_stack.getTop().getId() + + return "" + + @pyqtProperty(str, notify = globalContainerChanged) + def activeMachineName(self): + if self._global_container_stack: + return self._global_container_stack.getName() + + return "" + + @pyqtProperty(str, notify = globalContainerChanged) + def activeMachineId(self): + if self._global_container_stack: + return self._global_container_stack.getId() + + return "" + + @pyqtProperty(str, notify = activeMaterialChanged) + def activeMaterialName(self): + if self._active_container_stack: + material = self._active_container_stack.findContainer({"type":"material"}) + if material: + return material.getName() + + return "" + + @pyqtProperty(str, notify=activeMaterialChanged) + def activeMaterialId(self): + if self._active_container_stack: + material = self._active_container_stack.findContainer({"type": "material"}) + if material: + return material.getId() + + return "" + + @pyqtProperty(str, notify=activeQualityChanged) + def activeQualityName(self): + if self._active_container_stack: + quality = self._active_container_stack.findContainer({"type": "quality"}) + if quality: + return quality.getName() + return "" + + @pyqtProperty(str, notify=activeQualityChanged) + def activeQualityId(self): + if self._active_container_stack: + quality = self._active_container_stack.findContainer({"type": "quality"}) + if quality: + return quality.getId() + return "" + + ## Check if a container is read_only + @pyqtSlot(str, result = bool) + def isReadOnly(self, container_id): + containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(id = container_id) + if not containers or not self._active_container_stack: + return True + return containers[0].isReadOnly() + + @pyqtSlot(result = str) + def newQualityContainerFromQualityAndUser(self): + new_container_id = self.duplicateContainer(self.activeQualityId) + if new_container_id == "": + return + self.blurSettings.emit() + self.setActiveQuality(new_container_id) + self.updateQualityContainerFromUserContainer() + + + @pyqtSlot(str, result=str) + def duplicateContainer(self, container_id): + if not self._active_container_stack: + return "" + containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(id = container_id) + if containers: + new_name = self._createUniqueName("quality", "", containers[0].getName(), catalog.i18nc("@label", "Custom profile")) + + new_container = InstanceContainer("") + + ## Copy all values + new_container.deserialize(containers[0].serialize()) + + new_container.setReadOnly(False) + new_container.setName(new_name) + new_container._id = new_name + UM.Settings.ContainerRegistry.getInstance().addContainer(new_container) + return new_name + + return "" + + @pyqtSlot(str, str) + def renameQualityContainer(self, container_id, new_name): + containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(id = container_id, type = "quality") + if containers: + new_name = self._createUniqueName("quality", containers[0].getName(), new_name, + catalog.i18nc("@label", "Custom profile")) + + if containers[0].getName() == new_name: + # Nothing to do. + return + + # As we also want the id of the container to be changed (so that profile name is the name of the file + # on disk. We need to create a new instance and remove it (so the old file of the container is removed) + # If we don't do that, we might get duplicates & other weird issues. + new_container = InstanceContainer("") + new_container.deserialize(containers[0].serialize()) + + # Actually set the name + new_container.setName(new_name) + new_container._id = new_name # Todo: Fix proper id change function for this. + + # Add the "new" container. + UM.Settings.ContainerRegistry.getInstance().addContainer(new_container) + + # Ensure that the renamed profile is saved -before- we remove the old profile. + Application.getInstance().saveSettings() + + # Actually set & remove new / old quality. + self.setActiveQuality(new_name) + self.removeQualityContainer(containers[0].getId()) + + @pyqtSlot(str) + def removeQualityContainer(self, container_id): + containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(id = container_id) + if not containers or not self._active_container_stack: + return + + # If the container that is being removed is the currently active container, set another machine as the active container + activate_new_container = container_id == self.activeQualityId + + UM.Settings.ContainerRegistry.getInstance().removeContainer(container_id) + + if activate_new_container: + definition_id = "fdmprinter" if not self.filterQualityByMachine else self.activeDefinitionId + containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(type = "quality", definition = definition_id) + if containers: + self.setActiveQuality(containers[0].getId()) + self.activeQualityChanged.emit() + + + @pyqtSlot() + def updateQualityContainerFromUserContainer(self): + if not self._active_container_stack: + return + user_settings = self._active_container_stack.getTop() + quality = self._active_container_stack.findContainer({"type": "quality"}) + for key in user_settings.getAllKeys(): + quality.setProperty(key, "value", user_settings.getProperty(key, "value")) + self.clearUserSettings() # As all users settings are noq a quality, remove them. + + + @pyqtSlot(str) + def setActiveMaterial(self, material_id): + containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(id = material_id) + if not containers or not self._active_container_stack: + return + + old_material = self._active_container_stack.findContainer({"type":"material"}) + if old_material: + material_index = self._active_container_stack.getContainerIndex(old_material) + self._active_container_stack.replaceContainer(material_index, containers[0]) + + self.setActiveQuality(self._updateQualityContainer(self._active_container_stack.getBottom(), containers[0]).id) + + @pyqtSlot(str) + def setActiveVariant(self, variant_id): + containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(id = variant_id) + if not containers or not self._active_container_stack: + return + + old_variant = self._active_container_stack.findContainer({"type": "variant"}) + if old_variant: + variant_index = self._active_container_stack.getContainerIndex(old_variant) + self._active_container_stack.replaceContainer(variant_index, containers[0]) + + self.setActiveMaterial(self._updateMaterialContainer(self._active_container_stack.getBottom(), containers[0]).id) + + @pyqtSlot(str) + def setActiveQuality(self, quality_id): + containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(id = quality_id) + if not containers or not self._active_container_stack: + return + + old_quality = self._active_container_stack.findContainer({"type": "quality"}) + if old_quality: + quality_index = self._active_container_stack.getContainerIndex(old_quality) + self._active_container_stack.replaceContainer(quality_index, containers[0]) + + @pyqtProperty(str, notify = activeVariantChanged) + def activeVariantName(self): + if self._active_container_stack: + variant = self._active_container_stack.findContainer({"type": "variant"}) + if variant: + return variant.getName() + + return "" + + @pyqtProperty(str, notify = activeVariantChanged) + def activeVariantId(self): + if self._active_container_stack: + variant = self._active_container_stack.findContainer({"type": "variant"}) + if variant: + return variant.getId() + + return "" + + @pyqtProperty(str, notify = globalContainerChanged) + def activeDefinitionId(self): + if self._global_container_stack: + definition = self._global_container_stack.getBottom() + if definition: + return definition.id + + return "" + + @pyqtSlot(str, str) + def renameMachine(self, machine_id, new_name): + containers = UM.Settings.ContainerRegistry.getInstance().findContainerStacks(id = machine_id) + if containers: + new_name = self._createUniqueName("machine", containers[0].getName(), new_name, containers[0].getBottom().getName()) + containers[0].setName(new_name) + self.globalContainerChanged.emit() + + @pyqtSlot(str) + def removeMachine(self, machine_id): + # If the machine that is being removed is the currently active machine, set another machine as the active machine + activate_new_machine = (self._global_container_stack and self._global_container_stack.getId() == machine_id) + + current_settings_id = machine_id + "_current_settings" + containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(id = current_settings_id) + for container in containers: + UM.Settings.ContainerRegistry.getInstance().removeContainer(container.getId()) + UM.Settings.ContainerRegistry.getInstance().removeContainer(machine_id) + + if activate_new_machine: + stacks = UM.Settings.ContainerRegistry.getInstance().findContainerStacks(type = "machine") + if stacks: + Application.getInstance().setGlobalContainerStack(stacks[0]) + + + @pyqtProperty(bool, notify = globalContainerChanged) + def hasMaterials(self): + if self._global_container_stack: + return bool(self._global_container_stack.getMetaDataEntry("has_materials", False)) + + return False + + @pyqtProperty(bool, notify = globalContainerChanged) + def hasVariants(self): + if self._global_container_stack: + return bool(self._global_container_stack.getMetaDataEntry("has_variants", False)) + + return False + + @pyqtProperty(bool, notify = globalContainerChanged) + def filterMaterialsByMachine(self): + if self._global_container_stack: + return bool(self._global_container_stack.getMetaDataEntry("has_machine_materials", False)) + + return False + + @pyqtProperty(bool, notify = globalContainerChanged) + def filterQualityByMachine(self): + if self._global_container_stack: + return bool(self._global_container_stack.getMetaDataEntry("has_machine_quality", False)) + + return False + + def _updateVariantContainer(self, definition): + if not definition.getMetaDataEntry("has_variants"): + return self._empty_variant_container + + containers = [] + preferred_variant = definition.getMetaDataEntry("preferred_variant") + if preferred_variant: + containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(type = "variant", definition = definition.id, id = preferred_variant) + + if not containers: + containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(type = "variant", definition = definition.id) + + if containers: + return containers[0] + + return self._empty_variant_container + + def _updateMaterialContainer(self, definition, variant_container = None): + if not definition.getMetaDataEntry("has_materials"): + return self._empty_material_container + + search_criteria = { "type": "material" } + + if definition.getMetaDataEntry("has_machine_materials"): + search_criteria["definition"] = definition.id + + if definition.getMetaDataEntry("has_variants") and variant_container: + search_criteria["variant"] = variant_container.id + else: + search_criteria["definition"] = "fdmprinter" + + preferred_material = definition.getMetaDataEntry("preferred_material") + if preferred_material: + search_criteria["id"] = preferred_material + + containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(**search_criteria) + if containers: + return containers[0] + + return self._empty_material_container + + def _updateQualityContainer(self, definition, material_container = None): + search_criteria = { "type": "quality" } + + if definition.getMetaDataEntry("has_machine_quality"): + search_criteria["definition"] = definition.id + + if definition.getMetaDataEntry("has_materials") and material_container: + search_criteria["material"] = material_container.id + else: + search_criteria["definition"] = "fdmprinter" + + preferred_quality = definition.getMetaDataEntry("preferred_quality") + if preferred_quality: + search_criteria["id"] = preferred_quality + + containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(**search_criteria) + if containers: + return containers[0] + + return self._empty_quality_container + +def createMachineManagerModel(engine, script_engine): + return MachineManagerModel() diff --git a/cura/PrintInformation.py b/cura/PrintInformation.py index d3eaab662c..f1eb93de0e 100644 --- a/cura/PrintInformation.py +++ b/cura/PrintInformation.py @@ -1,14 +1,17 @@ # Copyright (c) 2015 Ultimaker B.V. # Cura is released under the terms of the AGPLv3 or higher. -from PyQt5.QtCore import QObject, pyqtSignal, pyqtProperty +from PyQt5.QtCore import QObject, pyqtSignal, pyqtProperty, pyqtSlot from UM.Application import Application from UM.Qt.Duration import Duration +from UM.Preferences import Preferences import math +import os.path +import unicodedata -## A class for processing and calculating minimum, current and maximum print time. +## A class for processing and calculating minimum, current and maximum print time as well as managing the job name # # This class contains all the logic relating to calculation and slicing for the # time/quality slider concept. It is a rather tricky combination of event handling @@ -22,6 +25,8 @@ import math # - When that is done, we update the minimum print time and start the final slice pass, the "high quality settings pass". # - When the high quality pass is done, we update the maximum print time. # +# This class also mangles the current machine name and the filename of the first loaded mesh into a job name. +# This job name is requested by the JobSpecs qml file. class PrintInformation(QObject): class SlicePass: CurrentSettings = 1 @@ -45,14 +50,20 @@ class PrintInformation(QObject): if self._backend: self._backend.printDurationMessage.connect(self._onPrintDurationMessage) + self._job_name = "" + self._abbr_machine = "" + + Application.getInstance().globalContainerStackChanged.connect(self._setAbbreviatedMachineName) + Application.getInstance().fileLoaded.connect(self.setJobName) + currentPrintTimeChanged = pyqtSignal() - + @pyqtProperty(Duration, notify = currentPrintTimeChanged) def currentPrintTime(self): return self._current_print_time materialAmountChanged = pyqtSignal() - + @pyqtProperty(float, notify = materialAmountChanged) def materialAmount(self): return self._material_amount @@ -63,6 +74,49 @@ class PrintInformation(QObject): self.currentPrintTimeChanged.emit() # Material amount is sent as an amount of mm^3, so calculate length from that - r = Application.getInstance().getMachineManager().getWorkingProfile().getSettingValue("material_diameter") / 2 + r = Application.getInstance().getGlobalContainerStack().getProperty("material_diameter", "value") / 2 self._material_amount = round((amount / (math.pi * r ** 2)) / 1000, 2) self.materialAmountChanged.emit() + + @pyqtSlot(str) + def setJobName(self, name): + # when a file is opened using the terminal; the filename comes from _onFileLoaded and still contains its + # extension. This cuts the extension off if necessary. + name = os.path.splitext(name)[0] + if self._job_name != name: + self._job_name = name + self.jobNameChanged.emit() + + jobNameChanged = pyqtSignal() + + @pyqtProperty(str, notify = jobNameChanged) + def jobName(self): + return self._job_name + + @pyqtSlot(str, result = str) + def createJobName(self, base_name): + base_name = self._stripAccents(base_name) + if Preferences.getInstance().getValue("cura/jobname_prefix"): + return self._abbr_machine + "_" + base_name + else: + return base_name + + ## Created an acronymn-like abbreviated machine name from the currently active machine name + # Called each time the global stack is switched + def _setAbbreviatedMachineName(self): + global_stack_name = Application.getInstance().getGlobalContainerStack().getName() + split_name = global_stack_name.split(" ") + abbr_machine = "" + for word in split_name: + if word.lower() == "ultimaker": + abbr_machine += "UM" + elif word.isdigit(): + abbr_machine += word + else: + abbr_machine += self._stripAccents(word.strip("()[]{}#").upper())[0] + + self._abbr_machine = abbr_machine + + ## Utility method that strips accents from characters (eg: â -> a) + def _stripAccents(self, str): + return ''.join(char for char in unicodedata.normalize('NFD', str) if unicodedata.category(char) != 'Mn') \ No newline at end of file diff --git a/cura/PrinterOutputDevice.py b/cura/PrinterOutputDevice.py index 7025646294..7649106523 100644 --- a/cura/PrinterOutputDevice.py +++ b/cura/PrinterOutputDevice.py @@ -3,6 +3,7 @@ from PyQt5.QtCore import pyqtProperty, pyqtSignal, pyqtSlot, QObject from enum import IntEnum # For the connection state tracking. from UM.Logger import Logger +from UM.Signal import signalemitter ## Printer output device adds extra interface options on top of output device. # @@ -13,7 +14,8 @@ from UM.Logger import Logger # functions to actually have the implementation. # # For all other uses it should be used in the same way as a "regular" OutputDevice. -class PrinterOutputDevice(OutputDevice, QObject): +@signalemitter +class PrinterOutputDevice(QObject, OutputDevice): def __init__(self, device_id, parent = None): super().__init__(device_id = device_id, parent = parent) diff --git a/cura/ProfileReader.py b/cura/ProfileReader.py new file mode 100644 index 0000000000..36bb2c7177 --- /dev/null +++ b/cura/ProfileReader.py @@ -0,0 +1,17 @@ +# Copyright (c) 2016 Ultimaker B.V. +# Cura is released under the terms of the AGPLv3 or higher. + +from UM.PluginObject import PluginObject + +## A type of plug-ins that reads profiles from a file. +# +# The profile is then stored as instance container of the type user profile. +class ProfileReader(PluginObject): + def __init__(self): + super().__init__() + + ## Read profile data from a file and return a filled profile. + # + # \return \type{Profile} The profile that was obtained from the file. + def read(self, file_name): + raise NotImplementedError("Profile reader plug-in was not correctly implemented. The read function was not implemented.") \ No newline at end of file diff --git a/cura/ProfileWriter.py b/cura/ProfileWriter.py new file mode 100644 index 0000000000..6c719205ec --- /dev/null +++ b/cura/ProfileWriter.py @@ -0,0 +1,25 @@ +# Copyright (c) 2015 Ultimaker B.V. +# Uranium is released under the terms of the AGPLv3 or higher. + +from UM.PluginObject import PluginObject + +## Base class for profile writer plugins. +# +# This class defines a write() function to write profiles to files with. +class ProfileWriter(PluginObject): + ## Initialises the profile writer. + # + # This currently doesn't do anything since the writer is basically static. + def __init__(self): + super().__init__() + + ## Writes a profile to the specified file path. + # + # The profile writer may write its own file format to the specified file. + # + # \param path \type{string} The file to output to. + # \param profile \type{Profile} The profile to write to the file. + # \return \code True \endcode if the writing was successful, or \code + # False \endcode if it wasn't. + def write(self, path, node): + raise NotImplementedError("Profile writer plugin was not correctly implemented. No write was specified.") diff --git a/cura/SetParentOperation.py b/cura/SetParentOperation.py new file mode 100644 index 0000000000..c40ce54909 --- /dev/null +++ b/cura/SetParentOperation.py @@ -0,0 +1,50 @@ +# Copyright (c) 2016 Ultimaker B.V. +# Uranium is released under the terms of the AGPLv3 or higher. + +from UM.Scene.SceneNode import SceneNode +from UM.Operations import Operation + +from UM.Math.Vector import Vector + +## An operation that parents a scene node to another scene node. + +class SetParentOperation(Operation.Operation): + ## Initialises this SetParentOperation. + # + # \param node The node which will be reparented. + # \param parent_node The node which will be the parent. + def __init__(self, node, parent_node): + super().__init__() + self._node = node + self._parent = parent_node + self._old_parent = node.getParent() # To restore the previous parent in case of an undo. + + ## Undoes the set-parent operation, restoring the old parent. + def undo(self): + self._set_parent(self._old_parent) + + ## Re-applies the set-parent operation. + def redo(self): + self._set_parent(self._parent) + + ## Sets the parent of the node while applying transformations to the world-transform of the node stays the same. + # + # \param new_parent The new parent. Note: this argument can be None, which would hide the node from the scene. + def _set_parent(self, new_parent): + if new_parent: + self._node.setPosition(self._node.getWorldPosition() - new_parent.getWorldPosition()) + current_parent = self._node.getParent() + if current_parent: + self._node.scale(current_parent.getScale() / new_parent.getScale()) + self._node.rotate(current_parent.getOrientation()) + else: + self._node.scale(Vector(1, 1, 1) / new_parent.getScale()) + self._node.rotate(new_parent.getOrientation().getInverse()) + + self._node.setParent(new_parent) + + ## Returns a programmer-readable representation of this operation. + # + # \return A programmer-readable representation of this operation. + def __repr__(self): + return "SetParentOperation(node = {0}, parent_node={1})".format(self._node, self._parent) diff --git a/cura/SettingOverrideDecorator.py b/cura/SettingOverrideDecorator.py new file mode 100644 index 0000000000..24360ed992 --- /dev/null +++ b/cura/SettingOverrideDecorator.py @@ -0,0 +1,81 @@ +# Copyright (c) 2016 Ultimaker B.V. +# Cura is released under the terms of the AGPLv3 or higher. + +import copy + +from UM.Scene.SceneNodeDecorator import SceneNodeDecorator +from UM.Signal import Signal, signalemitter +from UM.Settings.ContainerStack import ContainerStack +from UM.Settings.InstanceContainer import InstanceContainer +from UM.Settings.ContainerRegistry import ContainerRegistry +import UM.Logger + +from UM.Application import Application + +## A decorator that adds a container stack to a Node. This stack should be queried for all settings regarding +# the linked node. The Stack in question will refer to the global stack (so that settings that are not defined by +# this stack still resolve. +@signalemitter +class SettingOverrideDecorator(SceneNodeDecorator): + ## Event indicating that the user selected a different extruder. + activeExtruderChanged = Signal() + + def __init__(self): + super().__init__() + self._stack = ContainerStack(stack_id = id(self)) + self._stack.setDirty(False) # This stack does not need to be saved. + self._instance = InstanceContainer(container_id = "SettingOverrideInstanceContainer") + self._stack.addContainer(self._instance) + self._extruder_stack = None #Stack upon which our stack is based. + + self._stack.propertyChanged.connect(self._onSettingChanged) + + ContainerRegistry.getInstance().addContainer(self._stack) + + Application.getInstance().globalContainerStackChanged.connect(self._updateNextStack) + self.activeExtruderChanged.connect(self._updateNextStack) + self._updateNextStack() + + def __deepcopy__(self, memo): + ## Create a fresh decorator object + deep_copy = SettingOverrideDecorator() + ## Copy the instance + deep_copy._instance = copy.deepcopy(self._instance, memo) + ## Set the copied instance as the first (and only) instance container of the stack. + deep_copy._stack.replaceContainer(0, deep_copy._instance) + return deep_copy + + ## Gets the currently active extruder to print this object with. + # + # \return An extruder's container stack. + def getActiveExtruder(self): + return self._extruder_stack + + def _onSettingChanged(self, instance, property_name): # Reminder: 'property' is a built-in function + if property_name == "value": # Only reslice if the value has changed. + Application.getInstance().getBackend().forceSlice() + + ## Makes sure that the stack upon which the container stack is placed is + # kept up to date. + def _updateNextStack(self): + if self._extruder_stack: + extruder_stack = ContainerRegistry.getInstance().findContainerStacks(id = self._extruder_stack) + if extruder_stack: + old_extruder_stack_id = self._stack.getNextStack().getId() + self._stack.setNextStack(extruder_stack[0]) + if self._stack.getNextStack().getId() != old_extruder_stack_id: #Only reslice if the extruder changed. + Application.getInstance().getBackend().forceSlice() + else: + UM.Logger.log("e", "Extruder stack %s below per-object settings does not exist.", self._extruder_stack) + else: + self._stack.setNextStack(Application.getInstance().getGlobalContainerStack()) + + ## Changes the extruder with which to print this node. + # + # \param extruder_stack_id The new extruder stack to print with. + def setActiveExtruder(self, extruder_stack_id): + self._extruder_stack = extruder_stack_id + self.activeExtruderChanged.emit() + + def getStack(self): + return self._stack diff --git a/cura_app.py b/cura_app.py index dc748435f9..3548acedb6 100755 --- a/cura_app.py +++ b/cura_app.py @@ -33,14 +33,18 @@ sys.excepthook = exceptHook # first seems to prevent Sip from going into a state where it # tries to create PyQt objects on a non-main thread. import Arcus #@UnusedImport +from UM.Platform import Platform import cura.CuraApplication +import cura.CuraContainerRegistry -if sys.platform == "win32" and hasattr(sys, "frozen"): - import os +if Platform.isWindows() and hasattr(sys, "frozen"): dirpath = os.path.expanduser("~/AppData/Local/cura/") os.makedirs(dirpath, exist_ok = True) sys.stdout = open(os.path.join(dirpath, "stdout.log"), "w") sys.stderr = open(os.path.join(dirpath, "stderr.log"), "w") +# Force an instance of CuraContainerRegistry to be created and reused later. +cura.CuraContainerRegistry.CuraContainerRegistry.getInstance() + app = cura.CuraApplication.CuraApplication.getInstance() app.run() diff --git a/plugins/3MFReader/__init__.py b/plugins/3MFReader/__init__.py index 610165f7a0..42b1794160 100644 --- a/plugins/3MFReader/__init__.py +++ b/plugins/3MFReader/__init__.py @@ -13,7 +13,7 @@ def getMetaData(): "author": "Ultimaker", "version": "1.0", "description": catalog.i18nc("@info:whatsthis", "Provides support for reading 3MF files."), - "api": 2 + "api": 3 }, "mesh_reader": [ { diff --git a/plugins/AutoSave/AutoSave.py b/plugins/AutoSave/AutoSave.py index e621ccdc4b..2aa49e3da1 100644 --- a/plugins/AutoSave/AutoSave.py +++ b/plugins/AutoSave/AutoSave.py @@ -15,15 +15,9 @@ class AutoSave(Extension): Preferences.getInstance().preferenceChanged.connect(self._triggerTimer) - machine_manager = Application.getInstance().getMachineManager() - - self._profile = None - machine_manager.activeProfileChanged.connect(self._onActiveProfileChanged) - machine_manager.profileNameChanged.connect(self._triggerTimer) - machine_manager.profilesChanged.connect(self._triggerTimer) - machine_manager.machineInstanceNameChanged.connect(self._triggerTimer) - machine_manager.machineInstancesChanged.connect(self._triggerTimer) - self._onActiveProfileChanged() + self._global_stack = None + Application.getInstance().globalContainerStackChanged.connect(self._onGlobalStackChanged) + self._onGlobalStackChanged() Preferences.getInstance().addPreference("cura/autosave_delay", 1000 * 10) @@ -38,24 +32,23 @@ class AutoSave(Extension): if not self._saving: self._change_timer.start() - def _onActiveProfileChanged(self): - if self._profile: - self._profile.settingValueChanged.disconnect(self._triggerTimer) + def _onGlobalStackChanged(self): + if self._global_stack: + self._global_stack.propertyChanged.disconnect(self._triggerTimer) + self._global_stack.containersChanged.disconnect(self._triggerTimer) - self._profile = Application.getInstance().getMachineManager().getWorkingProfile() + self._global_stack = Application.getInstance().getGlobalContainerStack() - if self._profile: - self._profile.settingValueChanged.connect(self._triggerTimer) + if self._global_stack: + self._global_stack.propertyChanged.connect(self._triggerTimer) + self._global_stack.containersChanged.connect(self._triggerTimer) def _onTimeout(self): self._saving = True # To prevent the save process from triggering another autosave. Logger.log("d", "Autosaving preferences, instances and profiles") - machine_manager = Application.getInstance().getMachineManager() + Application.getInstance().saveSettings() - machine_manager.saveVisibility() - machine_manager.saveMachineInstances() - machine_manager.saveProfiles() Preferences.getInstance().writeToFile(Resources.getStoragePath(Resources.Preferences, Application.getInstance().getApplicationName() + ".cfg")) self._saving = False diff --git a/plugins/AutoSave/__init__.py b/plugins/AutoSave/__init__.py index 0caa02a748..7e70ebe0a2 100644 --- a/plugins/AutoSave/__init__.py +++ b/plugins/AutoSave/__init__.py @@ -13,7 +13,7 @@ def getMetaData(): "author": "Ultimaker", "version": "1.0", "description": catalog.i18nc("@info:whatsthis", "Automatically saves Preferences, Machines and Profiles after changes."), - "api": 2 + "api": 3 }, } diff --git a/plugins/ChangeLogPlugin/ChangeLog.py b/plugins/ChangeLogPlugin/ChangeLog.py index 7c8c81f2c6..d004104f91 100644 --- a/plugins/ChangeLogPlugin/ChangeLog.py +++ b/plugins/ChangeLogPlugin/ChangeLog.py @@ -48,7 +48,8 @@ class ChangeLog(Extension, QObject,): result += "

" + str(version) + "


" result += "" for change in logs[version]: - result += "" + str(change) + "
" + if str(change) != "": + result += "" + str(change) + "
" for line in logs[version][change]: result += str(line) + "
" result += "
" @@ -60,20 +61,21 @@ class ChangeLog(Extension, QObject,): self._change_logs = collections.OrderedDict() with open(os.path.join(PluginRegistry.getInstance().getPluginPath(self.getPluginId()), "ChangeLog.txt"), "r",-1, "utf-8") as f: open_version = None - open_header = None + open_header = "" # Initialise to an empty header in case there is no "*" in the first line of the changelog for line in f: line = line.replace("\n","") if "[" in line and "]" in line: line = line.replace("[","") line = line.replace("]","") open_version = Version(line) - self._change_logs[Version(line)] = collections.OrderedDict() + self._change_logs[open_version] = collections.OrderedDict() elif line.startswith("*"): open_header = line.replace("*","") self._change_logs[open_version][open_header] = [] - else: - if line != "": - self._change_logs[open_version][open_header].append(line) + elif line != "": + if open_header not in self._change_logs[open_version]: + self._change_logs[open_version][open_header] = [] + self._change_logs[open_version][open_header].append(line) def _onEngineCreated(self): if not self._version: @@ -105,4 +107,3 @@ class ChangeLog(Extension, QObject,): self._changelog_context = QQmlContext(Application.getInstance()._engine.rootContext()) self._changelog_context.setContextProperty("manager", self) self._changelog_window = component.create(self._changelog_context) - #print(self._changelog_window) diff --git a/plugins/ChangeLogPlugin/ChangeLog.txt b/plugins/ChangeLogPlugin/ChangeLog.txt index 8dc6a61dd8..48e96ce4b6 100644 --- a/plugins/ChangeLogPlugin/ChangeLog.txt +++ b/plugins/ChangeLogPlugin/ChangeLog.txt @@ -1,6 +1,5 @@ -[2.1.0] +[2.1.2] -*2.1 Beta release Cura has been completely reengineered from the ground up for an even more seamless integration between hardware, software and materials. Together with its intuitive new user interface, it’s now also ready for any future developments. For the beginner Cura makes 3D printing incredibly easy, and for more advanced users, there are over 140 new customisable settings. *Select Multiple Objects diff --git a/plugins/ChangeLogPlugin/__init__.py b/plugins/ChangeLogPlugin/__init__.py index 88ac4e08a6..8466bfaa1b 100644 --- a/plugins/ChangeLogPlugin/__init__.py +++ b/plugins/ChangeLogPlugin/__init__.py @@ -13,9 +13,9 @@ def getMetaData(): "author": "Ultimaker", "version": "1.0", "description": catalog.i18nc("@info:whatsthis", "Shows changes since latest checked version."), - "api": 2 + "api": 3 } } def register(app): - return {"extension": ChangeLog.ChangeLog()} \ No newline at end of file + return {"extension": ChangeLog.ChangeLog()} diff --git a/plugins/CuraEngineBackend/Cura.proto b/plugins/CuraEngineBackend/Cura.proto index 0d4975aca4..38753fd804 100644 --- a/plugins/CuraEngineBackend/Cura.proto +++ b/plugins/CuraEngineBackend/Cura.proto @@ -5,12 +5,20 @@ package cura.proto; message ObjectList { repeated Object objects = 1; - repeated Setting settings = 2; + repeated Setting settings = 2; // meshgroup settings (for one-at-a-time printing) } message Slice { - repeated ObjectList object_lists = 1; + repeated ObjectList object_lists = 1; // The meshgroups to be printed one after another + SettingList global_settings = 2; // The global settings used for the whole print job + repeated Extruder extruders = 3; // The settings sent to each extruder object +} + +message Extruder +{ + int32 id = 1; + SettingList settings = 2; } message Object @@ -29,10 +37,10 @@ message Progress message Layer { int32 id = 1; - float height = 2; - float thickness = 3; + float height = 2; // Z position + float thickness = 3; // height of a single layer - repeated Polygon polygons = 4; + repeated Polygon polygons = 4; // layer data } message Polygon { @@ -48,19 +56,19 @@ message Polygon { MoveCombingType = 8; MoveRetractionType = 9; } - Type type = 1; - bytes points = 2; - float line_width = 3; + Type type = 1; // Type of move + bytes points = 2; // The points of the polygon, or two points if only a line segment (Currently only line segments are used) + float line_width = 3; // The width of the line being laid down } message GCodeLayer { bytes data = 2; } -message ObjectPrintTime { +message ObjectPrintTime { // The print time for the whole print and material estimates for the first extruder int64 id = 1; - float time = 2; - float material_amount = 3; + float time = 2; // Total time estimate + float material_amount = 3; // material used in the first extruder } message SettingList { @@ -68,13 +76,13 @@ message SettingList { } message Setting { - string name = 1; + string name = 1; // Internal key to signify a setting - bytes value = 2; + bytes value = 2; // The value of the setting } message GCodePrefix { - bytes data = 2; + bytes data = 2; // Header string to be prenpended before the rest of the gcode sent from the engine } message SlicingFinished { diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index c5b38034b5..c91e414a13 100644 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -1,16 +1,19 @@ # Copyright (c) 2015 Ultimaker B.V. # Cura is released under the terms of the AGPLv3 or higher. -from UM.Backend.Backend import Backend +from UM.Backend.Backend import Backend, BackendState from UM.Application import Application from UM.Scene.SceneNode import SceneNode from UM.Preferences import Preferences from UM.Signal import Signal from UM.Logger import Logger -from UM.Qt.Bindings.BackendProxy import BackendState #To determine the state of the slicing job. from UM.Message import Message from UM.PluginRegistry import PluginRegistry from UM.Resources import Resources +from UM.Settings.Validator import ValidatorState #To find if a setting is in an error state. We can't slice then. +from UM.Platform import Platform + +from cura.ExtruderManager import ExtruderManager from cura.OneAtATimeIterator import OneAtATimeIterator from . import ProcessSlicedLayersJob @@ -29,6 +32,10 @@ catalog = i18nCatalog("cura") class CuraEngineBackend(Backend): + ## Starts the back-end plug-in. + # + # This registers all the signal listeners and prepares for communication + # with the back-end in general. def __init__(self): super().__init__() @@ -36,7 +43,7 @@ class CuraEngineBackend(Backend): default_engine_location = os.path.join(Application.getInstallPrefix(), "bin", "CuraEngine") if hasattr(sys, "frozen"): default_engine_location = os.path.join(os.path.dirname(os.path.abspath(sys.executable)), "CuraEngine") - if sys.platform == "win32": + if Platform.isWindows(): default_engine_location += ".exe" default_engine_location = os.path.abspath(default_engine_location) Preferences.getInstance().addPreference("backend/location", default_engine_location) @@ -50,19 +57,24 @@ class CuraEngineBackend(Backend): self._onActiveViewChanged() self._stored_layer_data = [] - # When there are current settings and machine instance is changed, there is no profile changed event. We should - # pretend there is though. - Application.getInstance().getMachineManager().activeMachineInstanceChanged.connect(self._onActiveProfileChanged) + #Triggers for when to (re)start slicing: + self._global_container_stack = None + Application.getInstance().globalContainerStackChanged.connect(self._onGlobalStackChanged) + self._onGlobalStackChanged() - self._profile = None - Application.getInstance().getMachineManager().activeProfileChanged.connect(self._onActiveProfileChanged) - self._onActiveProfileChanged() + self._active_extruder_stack = None + ExtruderManager.getInstance().activeExtruderChanged.connect(self._onActiveExtruderChanged) + self._onActiveExtruderChanged() + #When you update a setting and other settings get changed through inheritance, many propertyChanged signals are fired. + #This timer will group them up, and only slice for the last setting changed signal. + #TODO: Properly group propertyChanged signals by whether they are triggered by the same user interaction. self._change_timer = QTimer() self._change_timer.setInterval(500) self._change_timer.setSingleShot(True) self._change_timer.timeout.connect(self.slice) + #Listeners for receiving messages from the back-end. self._message_handlers["cura.proto.Layer"] = self._onLayerMessage self._message_handlers["cura.proto.Progress"] = self._onProgressMessage self._message_handlers["cura.proto.GCodeLayer"] = self._onGCodeLayerMessage @@ -70,39 +82,35 @@ class CuraEngineBackend(Backend): self._message_handlers["cura.proto.ObjectPrintTime"] = self._onObjectPrintTimeMessage self._message_handlers["cura.proto.SlicingFinished"] = self._onSlicingFinishedMessage - self._slicing = False self._start_slice_job = None - self._restart = False - self._enabled = True - self._always_restart = True + self._slicing = False #Are we currently slicing? + self._restart = False #Back-end is currently restarting? + self._enabled = True #Should we be slicing? Slicing might be paused when, for instance, the user is dragging the mesh around. + self._always_restart = True #Always restart the engine when starting a new slice. Don't keep the process running. TODO: Fix engine statelessness. self._process_layers_job = None #The currently active job to process layers, or None if it is not processing layers. - self._message = None + self._error_message = None #Pop-up message that shows errors. self.backendQuit.connect(self._onBackendQuit) - self.backendConnected.connect(self._onBackendConnected) + + #When a tool operation is in progress, don't slice. So we need to listen for tool operations. Application.getInstance().getController().toolOperationStarted.connect(self._onToolOperationStarted) Application.getInstance().getController().toolOperationStopped.connect(self._onToolOperationStopped) - Application.getInstance().getMachineManager().activeMachineInstanceChanged.connect(self._onInstanceChanged) - + ## Called when closing the application. + # + # This function should terminate the engine process. def close(self): # Terminate CuraEngine if it is still running at this point self._terminate() super().close() ## Get the command that is used to call the engine. - # This is usefull for debugging and used to actually start the engine + # This is useful for debugging and used to actually start the engine. # \return list of commands and args / parameters. def getEngineCommand(self): - active_machine = Application.getInstance().getMachineManager().getActiveMachineInstance() - json_path = "" - if not active_machine: - json_path = Resources.getPath(Resources.MachineDefinitions, "fdmprinter.json") - else: - json_path = active_machine.getMachineDefinition().getPath() - + json_path = Resources.getPath(Resources.DefinitionContainers, "fdmprinter.def.json") return [Preferences.getInstance().getValue("backend/location"), "connect", "127.0.0.1:{0}".format(self._port), "-j", json_path, "-vv"] ## Emitted when we get a message containing print duration and material amount. This also implies the slicing has finished. @@ -113,55 +121,39 @@ class CuraEngineBackend(Backend): ## Emitted when the slicing process starts. slicingStarted = Signal() - ## Emitted whne the slicing process is aborted forcefully. + ## Emitted when the slicing process is aborted forcefully. slicingCancelled = Signal() ## Perform a slice of the scene. def slice(self): + self._stored_layer_data = [] - if not self._enabled: + if not self._enabled or not self._global_container_stack: #We shouldn't be slicing. return - if self._slicing: + if self._slicing: #We were already slicing. Stop the old job. self._terminate() - if self._message: - self._message.hide() - self._message = None - - return - - if self._process_layers_job: + if self._process_layers_job: #We were processing layers. Stop that, the layers are going to change soon. self._process_layers_job.abort() self._process_layers_job = None - if self._profile.hasErrorValue(): - Logger.log("w", "Profile has error values. Aborting slicing") - if self._message: - self._message.hide() - self._message = None - self._message = Message(catalog.i18nc("@info:status", "Unable to slice. Please check your setting values for errors.")) - self._message.show() - return #No slicing if we have error values since those are by definition illegal values. + if self._error_message: + self._error_message.hide() self.processingProgress.emit(0.0) - self.backendStateChange.emit(BackendState.NOT_STARTED) - if self._message: - self._message.setProgress(-1) - #else: - # self._message = Message(catalog.i18nc("@info:status", "Slicing..."), 0, False, -1) - # self._message.show() + self.backendStateChange.emit(BackendState.NotStarted) self._scene.gcode_list = [] self._slicing = True self.slicingStarted.emit() slice_message = self._socket.createMessage("cura.proto.Slice") - settings_message = self._socket.createMessage("cura.proto.SettingList"); - self._start_slice_job = StartSliceJob.StartSliceJob(self._profile, slice_message, settings_message) + self._start_slice_job = StartSliceJob.StartSliceJob(slice_message) self._start_slice_job.start() self._start_slice_job.finished.connect(self._onStartSliceCompleted) + ## Terminate the engine process. def _terminate(self): self._slicing = False self._restart = True @@ -178,24 +170,51 @@ class CuraEngineBackend(Backend): self._process.terminate() Logger.log("d", "Engine process is killed. Received return code %s", self._process.wait()) self._process = None - #self._createSocket() # Re create the socket except Exception as e: # terminating a process that is already terminating causes an exception, silently ignore this. - Logger.log("d", "Exception occured while trying to kill the engine %s", str(e)) + Logger.log("d", "Exception occurred while trying to kill the engine %s", str(e)) + ## Event handler to call when the job to initiate the slicing process is + # completed. + # + # When the start slice job is successfully completed, it will be happily + # slicing. This function handles any errors that may occur during the + # bootstrapping of a slice job. + # + # \param job The start slice job that was just finished. def _onStartSliceCompleted(self, job): # Note that cancelled slice jobs can still call this method. if self._start_slice_job is job: self._start_slice_job = None - if job.isCancelled() or job.getError() or job.getResult() != True: - if self._message: - self._message.hide() - self._message = None - return - else: - # Preparation completed, send it to the backend. - self._socket.sendMessage(job.getSettingsMessage()) - self._socket.sendMessage(job.getSliceMessage()) + if job.isCancelled() or job.getError() or job.getResult() == StartSliceJob.StartJobResult.Error: + return + + if job.getResult() == StartSliceJob.StartJobResult.SettingError: + if Application.getInstance().getPlatformActivity: + self._error_message = Message(catalog.i18nc("@info:status", "Unable to slice. Please check your setting values for errors."), lifetime = 10) + self._error_message.show() + self.backendStateChange.emit(BackendState.Error) + else: + self.backendStateChange.emit(BackendState.NotStarted) + return + + if job.getResult() == StartSliceJob.StartJobResult.NothingToSlice: + if Application.getInstance().getPlatformActivity: + self._error_message = Message(catalog.i18nc("@info:status", "Unable to slice. No suitable objects found."), lifetime = 10) + self._error_message.show() + self.backendStateChange.emit(BackendState.Error) + else: + self.backendStateChange.emit(BackendState.NotStarted) + return + + # Preparation completed, send it to the backend. + self._socket.sendMessage(job.getSliceMessage()) + + ## Listener for when the scene has changed. + # + # This should start a slice if the scene is now ready to slice. + # + # \param source The scene node that was changed. def _onSceneChanged(self, source): if type(source) is not SceneNode: return @@ -211,6 +230,9 @@ class CuraEngineBackend(Backend): self._onChanged() + ## Called when an error occurs in the socket connection towards the engine. + # + # \param error The exception that occurred. def _onSocketError(self, error): if Application.getInstance().isShuttingDown(): return @@ -221,54 +243,62 @@ class CuraEngineBackend(Backend): if error.getErrorCode() not in [Arcus.ErrorCode.BindFailedError, Arcus.ErrorCode.ConnectionResetError, Arcus.ErrorCode.Debug]: Logger.log("e", "A socket error caused the connection to be reset") - def _onActiveProfileChanged(self): - if self._profile: - self._profile.settingValueChanged.disconnect(self._onSettingChanged) - - self._profile = Application.getInstance().getMachineManager().getWorkingProfile() - if self._profile: - self._profile.settingValueChanged.connect(self._onSettingChanged) + ## A setting has changed, so check if we must reslice. + # + # \param instance The setting instance that has changed. + # \param property The property of the setting instance that has changed. + def _onSettingChanged(self, instance, property): + if property == "value": #Only reslice if the value has changed. self._onChanged() - def _onSettingChanged(self, setting): - self._onChanged() - + ## Called when a sliced layer data message is received from the engine. + # + # \param message The protobuf message containing sliced layer data. def _onLayerMessage(self, message): self._stored_layer_data.append(message) - + ## Called when a progress message is received from the engine. + # + # \param message The protobuf message containing the slicing progress. def _onProgressMessage(self, message): - if self._message: - self._message.setProgress(round(message.amount * 100)) - self.processingProgress.emit(message.amount) - self.backendStateChange.emit(BackendState.PROCESSING) + self.backendStateChange.emit(BackendState.Processing) + ## Called when the engine sends a message that slicing is finished. + # + # \param message The protobuf message signalling that slicing is finished. def _onSlicingFinishedMessage(self, message): - self.backendStateChange.emit(BackendState.DONE) + self.backendStateChange.emit(BackendState.Done) self.processingProgress.emit(1.0) self._slicing = False - if self._message: - self._message.setProgress(100) - self._message.hide() - self._message = None - if self._layer_view_active and (self._process_layers_job is None or not self._process_layers_job.isRunning()): self._process_layers_job = ProcessSlicedLayersJob.ProcessSlicedLayersJob(self._stored_layer_data) self._process_layers_job.start() self._stored_layer_data = [] + ## Called when a g-code message is received from the engine. + # + # \param message The protobuf message containing g-code, encoded as UTF-8. def _onGCodeLayerMessage(self, message): self._scene.gcode_list.append(message.data.decode("utf-8", "replace")) + ## Called when a g-code prefix message is received from the engine. + # + # \param message The protobuf message containing the g-code prefix, + # encoded as UTF-8. def _onGCodePrefixMessage(self, message): self._scene.gcode_list.insert(0, message.data.decode("utf-8", "replace")) + ## Called when a print time message is received from the engine. + # + # \param message The protobuf message containing the print time and + # material amount. def _onObjectPrintTimeMessage(self, message): self.printDurationMessage.emit(message.time, message.material_amount) + ## Creates a new socket connection. def _createSocket(self): super()._createSocket(os.path.abspath(os.path.join(PluginRegistry.getInstance().getPluginPath(self.getPluginId()), "Cura.proto"))) @@ -276,28 +306,41 @@ class CuraEngineBackend(Backend): def forceSlice(self): self._change_timer.start() - def _onChanged(self): - if not self._profile: - return - + ## Called when anything has changed to the stuff that needs to be sliced. + # + # This indicates that we should probably re-slice soon. + def _onChanged(self, *args, **kwargs): self._change_timer.start() + ## Called when the back-end connects to the front-end. def _onBackendConnected(self): if self._restart: self._onChanged() self._restart = False + ## Called when the user starts using some tool. + # + # When the user starts using a tool, we should pause slicing to prevent + # continuously slicing while the user is dragging some tool handle. + # + # \param tool The tool that the user is using. def _onToolOperationStarted(self, tool): self._terminate() # Do not continue slicing once a tool has started self._enabled = False # Do not reslice when a tool is doing it's 'thing' + ## Called when the user stops using some tool. + # + # This indicates that we can safely start slicing again. + # + # \param tool The tool that the user was using. def _onToolOperationStopped(self, tool): self._enabled = True # Tool stop, start listening for changes again. + ## Called when the user changes the active view mode. def _onActiveViewChanged(self): if Application.getInstance().getController().getActiveView(): view = Application.getInstance().getController().getActiveView() - if view.getPluginId() == "LayerView": + if view.getPluginId() == "LayerView": #If switching to layer view, we should process the layers if that hasn't been done yet. self._layer_view_active = True # There is data and we're not slicing at the moment # if we are slicing, there is no need to re-calculate the data as it will be invalid in a moment. @@ -308,11 +351,36 @@ class CuraEngineBackend(Backend): else: self._layer_view_active = False - def _onInstanceChanged(self): - self._terminate() - + ## Called when the back-end self-terminates. + # + # We should reset our state and start listening for new connections. def _onBackendQuit(self): if not self._restart and self._process: Logger.log("d", "Backend quit with return code %s. Resetting process and socket.", self._process.wait()) self._process = None self._createSocket() + + ## Called when the global container stack changes + def _onGlobalStackChanged(self): + if self._global_container_stack: + self._global_container_stack.propertyChanged.disconnect(self._onSettingChanged) + self._global_container_stack.containersChanged.disconnect(self._onChanged) + + self._global_container_stack = Application.getInstance().getGlobalContainerStack() + + if self._global_container_stack: + self._global_container_stack.propertyChanged.connect(self._onSettingChanged) #Note: Only starts slicing when the value changed. + self._global_container_stack.containersChanged.connect(self._onChanged) + self._onActiveExtruderChanged() + self._onChanged() + + def _onActiveExtruderChanged(self): + if self._active_extruder_stack: + self._active_extruder_stack.propertyChanged.disconnect(self._onSettingChanged) + self._active_extruder_stack.containersChanged.disconnect(self._onChanged) + + self._active_extruder_stack = ExtruderManager.getInstance().getActiveExtruderStack() + if self._active_extruder_stack: + self._active_extruder_stack.propertyChanged.connect(self._onSettingChanged) # Note: Only starts slicing when the value changed. + self._active_extruder_stack.containersChanged.connect(self._onChanged) + self._onChanged() \ No newline at end of file diff --git a/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py b/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py index cea4dedc9f..d23f71e874 100644 --- a/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py +++ b/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py @@ -62,8 +62,6 @@ class ProcessSlicedLayersJob(Job): self._progress.hide() return - settings = Application.getInstance().getMachineManager().getWorkingProfile() - mesh = MeshData() layer_data = LayerDataBuilder.LayerDataBuilder() layer_count = len(self._layers) @@ -105,7 +103,7 @@ class ProcessSlicedLayersJob(Job): Job.yieldThread() Job.yieldThread() current_layer += 1 - progress = (current_layer / layer_count) * 100 + progress = (current_layer / layer_count) * 99 # TODO: Rebuild the layer data mesh once the layer has been processed. # This needs some work in LayerData so we can add the new layers instead of recreating the entire mesh. @@ -132,8 +130,9 @@ class ProcessSlicedLayersJob(Job): new_node.setMeshData(mesh) new_node.setParent(self._scene.getRoot()) # Note: After this we can no longer abort! - if not settings.getSettingValue("machine_center_is_zero"): - new_node.setPosition(Vector(-settings.getSettingValue("machine_width") / 2, 0.0, settings.getSettingValue("machine_depth") / 2)) + settings = Application.getInstance().getGlobalContainerStack() + if not settings.getProperty("machine_center_is_zero", "value"): + new_node.setPosition(Vector(-settings.getProperty("machine_width", "value") / 2, 0.0, settings.getProperty("machine_depth", "value") / 2)) if self._progress: self._progress.setProgress(100) diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index 174f453bf8..3d2eb0ed4a 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -3,7 +3,7 @@ import numpy from string import Formatter -import traceback +from enum import IntEnum from UM.Job import Job from UM.Application import Application @@ -12,8 +12,16 @@ from UM.Logger import Logger from UM.Scene.SceneNode import SceneNode from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator -from cura.OneAtATimeIterator import OneAtATimeIterator +from UM.Settings.Validator import ValidatorState +from cura.OneAtATimeIterator import OneAtATimeIterator +from cura.ExtruderManager import ExtruderManager + +class StartJobResult(IntEnum): + Finished = 1 + Error = 2 + SettingError = 3 + NothingToSlice = 4 ## Formatter class that handles token expansion in start/end gcod class GcodeStartEndFormatter(Formatter): @@ -30,33 +38,65 @@ class GcodeStartEndFormatter(Formatter): ## Job class that builds up the message of scene data to send to CuraEngine. class StartSliceJob(Job): - def __init__(self, profile, slice_message, settings_message): + def __init__(self, slice_message): super().__init__() self._scene = Application.getInstance().getController().getScene() - self._profile = profile self._slice_message = slice_message - self._settings_message = settings_message self._is_cancelled = False - def getSettingsMessage(self): - return self._settings_message - def getSliceMessage(self): return self._slice_message + ## Check if a stack has any errors. + ## returns true if it has errors, false otherwise. + def _checkStackForErrors(self, stack): + if stack is None: + return False + + for key in stack.getAllKeys(): + validation_state = stack.getProperty(key, "validationState") + if validation_state in (ValidatorState.Exception, ValidatorState.MaximumError, ValidatorState.MinimumError): + Logger.log("w", "Setting %s is not valid, but %s. Aborting slicing.", key, validation_state) + return True + Job.yieldThread() + return False + + ## Runs the job that initiates the slicing. def run(self): + stack = Application.getInstance().getGlobalContainerStack() + if not stack: + self.setResult(StartJobResult.Error) + return + + # Don't slice if there is a setting with an error value. + if self._checkStackForErrors(stack): + self.setResult(StartJobResult.SettingError) + return + + # Don't slice if there is a per object setting with an error value. + for node in DepthFirstIterator(self._scene.getRoot()): + if type(node) is not SceneNode or not node.isSelectable(): + continue + + if self._checkStackForErrors(node.callDecoration("getStack")): + self.setResult(StartJobResult.SettingError) + return + with self._scene.getSceneLock(): + # Remove old layer data. for node in DepthFirstIterator(self._scene.getRoot()): if node.callDecoration("getLayerData"): node.getParent().removeChild(node) break + # Get the objects in their groups to print. object_groups = [] - if self._profile.getSettingValue("print_sequence") == "one_at_a_time": + if stack.getProperty("print_sequence", "value") == "one_at_a_time": for node in OneAtATimeIterator(self._scene.getRoot()): temp_list = [] + # Node can't be printed, so don't bother sending it. if getattr(node, "_outside_buildarea", False): continue @@ -83,9 +123,13 @@ class StartSliceJob(Job): object_groups.append(temp_list) if not object_groups: + self.setResult(StartJobResult.NothingToSlice) return - self._buildSettingsMessage(self._profile) + self._buildGlobalSettingsMessage(stack) + + for extruder_stack in ExtruderManager.getInstance().getMachineExtruders(stack.getBottom().getId()): + self._buildExtruderMessage(extruder_stack) for group in object_groups: group_message = self._slice_message.addRepeatedMessage("object_lists") @@ -97,8 +141,10 @@ class StartSliceJob(Job): obj = group_message.addRepeatedMessage("objects") obj.id = id(object) verts = numpy.array(mesh_data.getVertices()) - verts[:,[1,2]] = verts[:,[2,1]] - verts[:,1] *= -1 + + # Convert from Y up axes to Z up axes. Equals a 90 degree rotation. + verts[:, [1, 2]] = verts[:, [2, 1]] + verts[:, 1] *= -1 obj.vertices = verts @@ -106,7 +152,7 @@ class StartSliceJob(Job): Job.yieldThread() - self.setResult(True) + self.setResult(StartJobResult.Finished) def cancel(self): super().cancel() @@ -121,38 +167,45 @@ class StartSliceJob(Job): fmt = GcodeStartEndFormatter() return str(fmt.format(value, **settings)).encode("utf-8") except: - Logger.log("w", "Unabled to do token replacement on start/end gcode %s", traceback.format_exc()) + Logger.logException("w", "Unable to do token replacement on start/end gcode") return str(value).encode("utf-8") - def _buildSettingsMessage(self, profile): - settings = profile.getAllSettingValues(include_machine = True) + def _buildExtruderMessage(self, stack): + message = self._slice_message.addRepeatedMessage("extruders") + message.id = int(stack.getMetaDataEntry("position")) + for key in stack.getAllKeys(): + setting = message.getMessage("settings").addRepeatedMessage("settings") + setting.name = key + setting.value = str(stack.getProperty(key, "value")).encode("utf-8") + Job.yieldThread() + + ## Sends all global settings to the engine. + # + # The settings are taken from the global stack. This does not include any + # per-extruder settings or per-object settings. + def _buildGlobalSettingsMessage(self, stack): + keys = stack.getAllKeys() + settings = {} + for key in keys: + settings[key] = stack.getProperty(key, "value") + start_gcode = settings["machine_start_gcode"] - settings["material_bed_temp_prepend"] = "{material_bed_temperature}" not in start_gcode + settings["material_bed_temp_prepend"] = "{material_bed_temperature}" not in start_gcode #Pre-compute material material_bed_temp_prepend and material_print_temp_prepend settings["material_print_temp_prepend"] = "{material_print_temperature}" not in start_gcode - for key, value in settings.items(): - s = self._settings_message.addRepeatedMessage("settings") - s.name = key - if key == "machine_start_gcode" or key == "machine_end_gcode": - s.value = self._expandGcodeTokens(key, value, settings) + + for key, value in settings.items(): #Add all submessages for each individual setting. + setting_message = self._slice_message.getMessage("global_settings").addRepeatedMessage("settings") + setting_message.name = key + if key == "machine_start_gcode" or key == "machine_end_gcode": #If it's a g-code message, use special formatting. + setting_message.value = self._expandGcodeTokens(key, value, settings) else: - s.value = str(value).encode("utf-8") + setting_message.value = str(value).encode("utf-8") def _handlePerObjectSettings(self, node, message): - profile = node.callDecoration("getProfile") - if profile: - for key, value in profile.getAllSettingValues().items(): + stack = node.callDecoration("getStack") + if stack: + for key in stack.getAllKeys(): setting = message.addRepeatedMessage("settings") setting.name = key - setting.value = str(value).encode() - - Job.yieldThread() - - object_settings = node.callDecoration("getAllSettingValues") - if not object_settings: - return - for key, value in object_settings.items(): - setting = message.addRepeatedMessage("settings") - setting.name = key - setting.value = str(value).encode() - - Job.yieldThread() + setting.value = str(stack.getProperty(key, "value")).encode("utf-8") + Job.yieldThread() \ No newline at end of file diff --git a/plugins/CuraEngineBackend/__init__.py b/plugins/CuraEngineBackend/__init__.py index 86a53d3ada..2e652ae845 100644 --- a/plugins/CuraEngineBackend/__init__.py +++ b/plugins/CuraEngineBackend/__init__.py @@ -13,7 +13,7 @@ def getMetaData(): "name": catalog.i18nc("@label", "CuraEngine Backend"), "author": "Ultimaker", "description": catalog.i18nc("@info:whatsthis", "Provides the link to the CuraEngine slicing backend."), - "api": 2 + "api": 3 } } diff --git a/plugins/CuraProfileReader/CuraProfileReader.py b/plugins/CuraProfileReader/CuraProfileReader.py index 1d27649498..b9c1f208ea 100644 --- a/plugins/CuraProfileReader/CuraProfileReader.py +++ b/plugins/CuraProfileReader/CuraProfileReader.py @@ -1,11 +1,12 @@ # Copyright (c) 2015 Ultimaker B.V. # Cura is released under the terms of the AGPLv3 or higher. +import os.path + from UM.Application import Application #To get the machine manager to create the new profile in. from UM.Logger import Logger -from UM.Settings.Profile import Profile -from UM.Settings.ProfileReader import ProfileReader - +from UM.Settings.InstanceContainer import InstanceContainer #The new profile to make. +from cura.ProfileReader import ProfileReader ## A plugin that reads profile data from Cura profile files. # @@ -25,17 +26,17 @@ class CuraProfileReader(ProfileReader): # returned. def read(self, file_name): # Create an empty profile. - profile = Profile(machine_manager = Application.getInstance().getMachineManager(), read_only = False) - serialised = "" + profile = InstanceContainer(os.path.basename(os.path.splitext(file_name)[0])) + profile.addMetaDataEntry("type", "quality") try: with open(file_name) as f: # Open file for reading. - serialised = f.read() + serialized = f.read() except IOError as e: Logger.log("e", "Unable to open file %s for reading: %s", file_name, str(e)) return None try: - profile.unserialise(serialised) + profile.deserialize(serialized) except Exception as e: # Parsing error. This is not a (valid) Cura profile then. Logger.log("e", "Error while trying to parse profile: %s", str(e)) return None diff --git a/plugins/CuraProfileReader/__init__.py b/plugins/CuraProfileReader/__init__.py index bfaa16ed5e..c4206ab763 100644 --- a/plugins/CuraProfileReader/__init__.py +++ b/plugins/CuraProfileReader/__init__.py @@ -13,7 +13,7 @@ def getMetaData(): "author": "Ultimaker", "version": "1.0", "description": catalog.i18nc("@info:whatsthis", "Provides support for importing Cura profiles."), - "api": 2 + "api": 3 }, "profile_reader": [ { diff --git a/plugins/CuraProfileWriter/CuraProfileWriter.py b/plugins/CuraProfileWriter/CuraProfileWriter.py index 82df446b8a..86b4f7dc89 100644 --- a/plugins/CuraProfileWriter/CuraProfileWriter.py +++ b/plugins/CuraProfileWriter/CuraProfileWriter.py @@ -4,7 +4,7 @@ from UM.Logger import Logger from UM.SaveFile import SaveFile -from UM.Settings.ProfileWriter import ProfileWriter +from cura.ProfileWriter import ProfileWriter ## Writes profiles to Cura's own profile format with config files. @@ -16,10 +16,10 @@ class CuraProfileWriter(ProfileWriter): # \return \code True \endcode if the writing was successful, or \code # False \endcode if it wasn't. def write(self, path, profile): - serialised = profile.serialise() + serialized = profile.serialize() try: with SaveFile(path, "wt", -1, "utf-8") as f: # Open the specified file. - f.write(serialised) + f.write(serialized) except Exception as e: Logger.log("e", "Failed to write profile to %s: %s", path, str(e)) return False diff --git a/plugins/CuraProfileWriter/__init__.py b/plugins/CuraProfileWriter/__init__.py index 43890de469..30528b8167 100644 --- a/plugins/CuraProfileWriter/__init__.py +++ b/plugins/CuraProfileWriter/__init__.py @@ -13,7 +13,7 @@ def getMetaData(): "author": "Ultimaker", "version": "1.0", "description": catalog.i18nc("@info:whatsthis", "Provides support for exporting Cura profiles."), - "api": 2 + "api": 3 }, "profile_writer": [ { diff --git a/plugins/GCodeWriter/GCodeWriter.py b/plugins/GCodeWriter/GCodeWriter.py index ee766ef221..d304f0d046 100644 --- a/plugins/GCodeWriter/GCodeWriter.py +++ b/plugins/GCodeWriter/GCodeWriter.py @@ -1,13 +1,22 @@ -# Copyright (c) 2015 Ultimaker B.V. +# Copyright (c) 2016 Ultimaker B.V. # Cura is released under the terms of the AGPLv3 or higher. from UM.Mesh.MeshWriter import MeshWriter from UM.Logger import Logger from UM.Application import Application +from UM.Settings.InstanceContainer import InstanceContainer #To create a complete setting profile to store in the g-code. import re #For escaping characters in the settings. -import copy - +## Writes g-code to a file. +# +# While this poses as a mesh writer, what this really does is take the g-code +# in the entire scene and write it to an output device. Since the g-code of a +# single mesh isn't separable from the rest what with rafts and travel moves +# and all, it doesn't make sense to write just a single mesh. +# +# So this plug-in takes the g-code that is stored in the root of the scene +# node tree, adds a bit of extra information about the profiles and writes +# that to the output device. class GCodeWriter(MeshWriter): ## The file format version of the serialised g-code. # @@ -32,7 +41,7 @@ class GCodeWriter(MeshWriter): def write(self, stream, node, mode = MeshWriter.OutputMode.TextMode): if mode != MeshWriter.OutputMode.TextMode: - Logger.log("e", "GCode Writer does not support non-text mode") + Logger.log("e", "GCode Writer does not support non-text mode.") return False scene = Application.getInstance().getController().getScene() @@ -40,26 +49,30 @@ class GCodeWriter(MeshWriter): if gcode_list: for gcode in gcode_list: stream.write(gcode) - # Serialise the profile and put them at the end of the file. - profile = self._serialiseProfile(Application.getInstance().getMachineManager().getWorkingProfile()) - stream.write(profile) + # Serialise the current container stack and put it at the end of the file. + settings = self._serialiseSettings(Application.getInstance().getGlobalContainerStack()) + stream.write(settings) return True return False - ## Serialises the profile to prepare it for saving in the g-code. + ## Serialises a container stack to prepare it for writing at the end of the + # g-code. # - # The profile are serialised, and special characters (including newline) + # The settings are serialised, and special characters (including newline) # are escaped. # - # \param profile The profile to serialise. - # \return A serialised string of the profile. - def _serialiseProfile(self, profile): + # \param settings A container stack to serialise. + # \return A serialised string of the settings. + def _serialiseSettings(self, settings): prefix = ";SETTING_" + str(GCodeWriter.version) + " " # The prefix to put before each line. prefix_length = len(prefix) - # Serialise a deepcopy to remove the defaults from the profile - serialised = copy.deepcopy(profile).serialise() + all_settings = InstanceContainer("G-code-imported-profile") #Create a new 'profile' with ALL settings so that the slice can be precisely reproduced. + all_settings.setDefinition(settings.getBottom()) + for key in settings.getAllKeys(): + all_settings.setProperty(key, "value", settings.getProperty(key, "value")) #Just copy everything over to the setting instance. + serialised = all_settings.serialize() # Escape characters that have a special meaning in g-code comments. pattern = re.compile("|".join(GCodeWriter.escape_characters.keys())) diff --git a/plugins/GCodeWriter/__init__.py b/plugins/GCodeWriter/__init__.py index cd8a5d3418..efe3368c61 100644 --- a/plugins/GCodeWriter/__init__.py +++ b/plugins/GCodeWriter/__init__.py @@ -13,7 +13,7 @@ def getMetaData(): "author": "Ultimaker", "version": "1.0", "description": catalog.i18nc("@info:whatsthis", "Writes GCode to a file."), - "api": 2 + "api": 3 }, "mesh_writer": { diff --git a/plugins/ImageReader/__init__.py b/plugins/ImageReader/__init__.py index 69fc1ddcc3..7ebdc31e57 100644 --- a/plugins/ImageReader/__init__.py +++ b/plugins/ImageReader/__init__.py @@ -13,7 +13,7 @@ def getMetaData(): "author": "Ultimaker", "version": "1.0", "description": i18n_catalog.i18nc("@info:whatsthis", "Enables ability to generate printable geometry from 2D image files."), - "api": 2 + "api": 3 }, "mesh_reader": [ { diff --git a/plugins/LayerView/LayerView.py b/plugins/LayerView/LayerView.py index e024512579..cd7a17a357 100644 --- a/plugins/LayerView/LayerView.py +++ b/plugins/LayerView/LayerView.py @@ -10,6 +10,7 @@ from UM.Scene.Selection import Selection from UM.Math.Color import Color from UM.Mesh.MeshBuilder import MeshBuilder from UM.Job import Job +from UM.Preferences import Preferences from UM.View.RenderBatch import RenderBatch from UM.View.GL.OpenGL import OpenGL @@ -41,7 +42,10 @@ class LayerView(View): self._top_layers_job = None self._activity = False - self._solid_layers = 5 + Preferences.getInstance().addPreference("view/top_layer_count", 1) + Preferences.getInstance().preferenceChanged.connect(self._onPreferencesChanged) + + self._solid_layers = int(Preferences.getInstance().getValue("view/top_layer_count")) self._top_layer_timer = QTimer() self._top_layer_timer.setInterval(50) @@ -125,8 +129,7 @@ class LayerView(View): if self._current_layer_num > self._max_layers: self._current_layer_num = self._max_layers - self._current_layer_mesh = None - self._current_layer_jumps = None + self.resetLayerData() self._top_layer_timer.start() @@ -209,6 +212,15 @@ class LayerView(View): self._top_layers_job = None + def _onPreferencesChanged(self, preference): + if preference != "view/top_layer_count": + return + + self._solid_layers = int(Preferences.getInstance().getValue("view/top_layer_count")) + + self.resetLayerData() + self._top_layer_timer.start() + class _CreateTopLayersJob(Job): def __init__(self, scene, layer_number, solid_layers): super().__init__() diff --git a/plugins/LayerView/__init__.py b/plugins/LayerView/__init__.py index 3d43532126..67750fb562 100644 --- a/plugins/LayerView/__init__.py +++ b/plugins/LayerView/__init__.py @@ -14,7 +14,7 @@ def getMetaData(): "author": "Ultimaker", "version": "1.0", "description": catalog.i18nc("@info:whatsthis", "Provides the Layer view."), - "api": 2 + "api": 3 }, "view": { "name": catalog.i18nc("@item:inlistbox", "Layers"), diff --git a/plugins/LegacyProfileReader/DictionaryOfDoom.json b/plugins/LegacyProfileReader/DictionaryOfDoom.json index e30460f103..9dd0c04a05 100644 --- a/plugins/LegacyProfileReader/DictionaryOfDoom.json +++ b/plugins/LegacyProfileReader/DictionaryOfDoom.json @@ -50,7 +50,8 @@ "skirt_minimal_length": "skirt_minimal_length", "brim_line_count": "brim_line_count", "raft_margin": "raft_margin", - "raft_airgap": "raft_airgap_all", + "raft_airgap": "float(raft_airgap_all) + float(raft_airgap)", + "layer_0_z_overlap": "raft_airgap", "raft_surface_layers": "raft_surface_layers", "raft_surface_thickness": "raft_surface_thickness", "raft_surface_line_width": "raft_surface_linewidth", diff --git a/plugins/LegacyProfileReader/LegacyProfileReader.py b/plugins/LegacyProfileReader/LegacyProfileReader.py index 3daf360ee6..19154c9c5a 100644 --- a/plugins/LegacyProfileReader/LegacyProfileReader.py +++ b/plugins/LegacyProfileReader/LegacyProfileReader.py @@ -9,8 +9,9 @@ import os.path #For concatenating the path to the plugin and the relative path t from UM.Application import Application #To get the machine manager to create the new profile in. from UM.Logger import Logger #Logging errors. from UM.PluginRegistry import PluginRegistry #For getting the path to this plugin's directory. -from UM.Settings.Profile import Profile -from UM.Settings.ProfileReader import ProfileReader +from UM.Settings.DefinitionContainer import DefinitionContainer #For getting the current machine's defaults. +from UM.Settings.InstanceContainer import InstanceContainer #The new profile to make. +from cura.ProfileReader import ProfileReader #The plug-in type to implement. ## A plugin that reads profile data from legacy Cura versions. # @@ -66,7 +67,7 @@ class LegacyProfileReader(ProfileReader): if file_name.split(".")[-1] != "ini": return None Logger.log("i", "Importing legacy profile from file " + file_name + ".") - profile = Profile(machine_manager = Application.getInstance().getMachineManager(), read_only = False) #Create an empty profile. + profile = InstanceContainer("Imported Legacy Profile") #Create an empty profile. parser = configparser.ConfigParser(interpolation = None) try: @@ -103,23 +104,24 @@ class LegacyProfileReader(ProfileReader): if "target_version" not in dict_of_doom: Logger.log("e", "Dictionary of Doom has no target version. Is it the correct JSON file?") return None - if Profile.ProfileVersion != dict_of_doom["target_version"]: - Logger.log("e", "Dictionary of Doom of legacy profile reader (version %s) is not in sync with the profile version (version %s)!", dict_of_doom["target_version"], str(Profile.ProfileVersion)) + if InstanceContainer.Version != dict_of_doom["target_version"]: + Logger.log("e", "Dictionary of Doom of legacy profile reader (version %s) is not in sync with the current instance container version (version %s)!", dict_of_doom["target_version"], str(InstanceContainer.Version)) return None if "translation" not in dict_of_doom: Logger.log("e", "Dictionary of Doom has no translation. Is it the correct JSON file?") return None + current_printer = Application.getInstance().getGlobalContainerStack().findContainer({ }, DefinitionContainer) for new_setting in dict_of_doom["translation"]: #Evaluate all new settings that would get a value from the translations. old_setting_expression = dict_of_doom["translation"][new_setting] compiled = compile(old_setting_expression, new_setting, "eval") try: new_value = eval(compiled, {"math": math}, legacy_settings) #Pass the legacy settings as local variables to allow access to in the evaluation. value_using_defaults = eval(compiled, {"math": math}, defaults) #Evaluate again using only the default values to try to see if they are default. - except Exception as e: #Probably some setting name that was missing or something else that went wrong in the ini file. + except Exception: #Probably some setting name that was missing or something else that went wrong in the ini file. Logger.log("w", "Setting " + new_setting + " could not be set because the evaluation failed. Something is probably missing from the imported legacy profile.") continue - if new_value != value_using_defaults and profile.getSettingValue(new_setting) != new_value: #Not equal to the default in the new Cura OR the default in the legacy Cura. + if new_value != value_using_defaults and current_printer.findDefinitions(key = new_setting).default_value != new_value: #Not equal to the default in the new Cura OR the default in the legacy Cura. profile.setSettingValue(new_setting, new_value) #Store the setting in the profile! if len(profile.getChangedSettings()) == 0: diff --git a/plugins/LegacyProfileReader/__init__.py b/plugins/LegacyProfileReader/__init__.py index e671f02571..f8b1f5c156 100644 --- a/plugins/LegacyProfileReader/__init__.py +++ b/plugins/LegacyProfileReader/__init__.py @@ -13,7 +13,7 @@ def getMetaData(): "author": "Ultimaker", "version": "1.0", "description": catalog.i18nc("@info:whatsthis", "Provides support for importing profiles from legacy Cura versions."), - "api": 2 + "api": 3 }, "profile_reader": [ { diff --git a/plugins/PerObjectSettingsTool/PerObjectCategory.qml b/plugins/PerObjectSettingsTool/PerObjectCategory.qml new file mode 100644 index 0000000000..2113a623a0 --- /dev/null +++ b/plugins/PerObjectSettingsTool/PerObjectCategory.qml @@ -0,0 +1,29 @@ +// Copyright (c) 2015 Ultimaker B.V. +// Uranium is released under the terms of the AGPLv3 or higher. + +import QtQuick 2.2 +import QtQuick.Controls 1.1 +import QtQuick.Controls.Styles 1.1 +import QtQuick.Layouts 1.1 + +import UM 1.1 as UM + +import ".." + +Button { + id: base; + + style: UM.Theme.styles.sidebar_category; + + signal showTooltip(string text); + signal hideTooltip(); + signal contextMenuRequested() + + text: definition.label + iconSource: UM.Theme.getIcon(definition.icon) + + checkable: true + checked: definition.expanded + + onClicked: definition.expanded ? settingDefinitionsModel.collapse(definition.key) : settingDefinitionsModel.expandAll(definition.key) +} diff --git a/plugins/PerObjectSettingsTool/PerObjectItem.qml b/plugins/PerObjectSettingsTool/PerObjectItem.qml new file mode 100644 index 0000000000..2dddf0b444 --- /dev/null +++ b/plugins/PerObjectSettingsTool/PerObjectItem.qml @@ -0,0 +1,34 @@ +// Copyright (c) 2015 Ultimaker B.V. +// Uranium is released under the terms of the AGPLv3 or higher. + +import QtQuick 2.1 +import QtQuick.Layouts 1.1 +import QtQuick.Controls 1.1 +import QtQuick.Controls.Styles 1.1 + +import UM 1.2 as UM + +UM.TooltipArea +{ + x: model.depth * UM.Theme.getSize("default_margin").width; + text: model.description; + + width: childrenRect.width; + height: childrenRect.height; + + Button + { + id: check + + text: definition.label + + onClicked: + { + addedSettingsModel.setVisible(model.key, true); + settingPickDialog.visible = false + UM.ActiveTool.forceUpdate() + } + } +} + + diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py b/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py new file mode 100644 index 0000000000..381d45b1c2 --- /dev/null +++ b/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py @@ -0,0 +1,76 @@ +from PyQt5.QtCore import QObject, pyqtProperty, pyqtSignal +from UM.Application import Application +from UM.Settings.SettingInstance import SettingInstance +from UM.Logger import Logger + +from cura.SettingOverrideDecorator import SettingOverrideDecorator + +## The per object setting visibility handler ensures that only setting defintions that have a matching instance Container +# are returned as visible. +class PerObjectSettingVisibilityHandler(QObject): + def __init__(self, parent = None, *args, **kwargs): + super().__init__(parent = parent, *args, **kwargs) + self._selected_object_id = None + + visibilityChanged = pyqtSignal() + + def setSelectedObjectId(self, id): + self._selected_object_id = id + self.visibilityChanged.emit() + + @pyqtProperty("quint64", fset = setSelectedObjectId) + def selectedObjectId(self): + pass + + def setVisible(self, visible): + node = Application.getInstance().getController().getScene().findObject(self._selected_object_id) + if not node: + return + stack = node.callDecoration("getStack") + if not stack: + node.addDecorator(SettingOverrideDecorator()) + stack = node.callDecoration("getStack") + + settings = stack.getTop() + all_instances = settings.findInstances(**{}) + visibility_changed = False # Flag to check if at the end the signal needs to be emitted + + # Remove all instances that are not in visibility list + for instance in all_instances: + if instance.definition.key not in visible: + settings.removeInstance(instance.definition.key) + visibility_changed = True + + # Add all instances that are not added, but are in visiblity list + for item in visible: + if not settings.getInstance(item): + definition_container = Application.getInstance().getGlobalContainerStack().getBottom() + definitions = definition_container.findDefinitions(key = item) + if definitions: + settings.addInstance(SettingInstance(definitions[0], settings)) + visibility_changed = True + else: + Logger.log("w", "Unable to add instance (%s) to perobject visibility because we couldn't find the matching definition", item) + + if visibility_changed: + self.visibilityChanged.emit() + + def getVisible(self): + visible_settings = set() + node = Application.getInstance().getController().getScene().findObject(self._selected_object_id) + if not node: + return visible_settings + + stack = node.callDecoration("getStack") + if not stack: + return visible_settings + + settings = stack.getTop() + if not settings: + return visible_settings + + all_instances = settings.findInstances(**{}) + for instance in all_instances: + visible_settings.add(instance.definition.key) + return visible_settings + diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingsModel.py b/plugins/PerObjectSettingsTool/PerObjectSettingsModel.py deleted file mode 100644 index 7f7cef049b..0000000000 --- a/plugins/PerObjectSettingsTool/PerObjectSettingsModel.py +++ /dev/null @@ -1,86 +0,0 @@ -# Copyright (c) 2015 Ultimaker B.V. -# Uranium is released under the terms of the AGPLv3 or higher. - -from PyQt5.QtCore import Qt, pyqtSlot, QUrl - -from UM.Application import Application -from UM.Qt.ListModel import ListModel -from UM.Scene.Iterator.BreadthFirstIterator import BreadthFirstIterator -from UM.Scene.SceneNode import SceneNode -from UM.Settings.SettingOverrideDecorator import SettingOverrideDecorator -from UM.Settings.ProfileOverrideDecorator import ProfileOverrideDecorator - -from . import SettingOverrideModel - -class PerObjectSettingsModel(ListModel): - IdRole = Qt.UserRole + 1 - XRole = Qt.UserRole + 2 - YRole = Qt.UserRole + 3 - MaterialRole = Qt.UserRole + 4 - ProfileRole = Qt.UserRole + 5 - SettingsRole = Qt.UserRole + 6 - - def __init__(self, parent = None): - super().__init__(parent) - self._scene = Application.getInstance().getController().getScene() - self._root = self._scene.getRoot() - self.addRoleName(self.IdRole,"id") - self.addRoleName(self.MaterialRole, "material") - self.addRoleName(self.ProfileRole, "profile") - self.addRoleName(self.SettingsRole, "settings") - self._updateModel() - - @pyqtSlot("quint64", str) - def setObjectProfile(self, object_id, profile_name): - self.setProperty(self.find("id", object_id), "profile", profile_name) - - profile = None - if profile_name != "global": - profile = Application.getInstance().getMachineManager().findProfile(profile_name) - - node = self._scene.findObject(object_id) - if profile: - if not node.getDecorator(ProfileOverrideDecorator): - node.addDecorator(ProfileOverrideDecorator()) - node.callDecoration("setProfile", profile) - else: - if node.getDecorator(ProfileOverrideDecorator): - node.removeDecorator(ProfileOverrideDecorator) - - @pyqtSlot("quint64", str) - def addSettingOverride(self, object_id, key): - machine = Application.getInstance().getMachineManager().getActiveMachineInstance() - if not machine: - return - - node = self._scene.findObject(object_id) - if not node.getDecorator(SettingOverrideDecorator): - node.addDecorator(SettingOverrideDecorator()) - - node.callDecoration("addSetting", key) - - @pyqtSlot("quint64", str) - def removeSettingOverride(self, object_id, key): - node = self._scene.findObject(object_id) - node.callDecoration("removeSetting", key) - - if len(node.callDecoration("getAllSettings")) == 0: - node.removeDecorator(SettingOverrideDecorator) - - def _updateModel(self): - self.clear() - for node in BreadthFirstIterator(self._root): - if type(node) is not SceneNode or not node.isSelectable(): - continue - node_profile = node.callDecoration("getProfile") - if not node_profile: - node_profile = "global" - else: - node_profile = node_profile.getName() - - self.appendItem({ - "id": id(node), - "material": "", - "profile": node_profile, - "settings": SettingOverrideModel.SettingOverrideModel(node) - }) diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml index c664aeaeef..aa4a749e92 100644 --- a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml +++ b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Ultimaker B.V. +// Copyright (c) 2016 Ultimaker B.V. // Uranium is released under the terms of the AGPLv3 or higher. import QtQuick 2.2 @@ -6,83 +6,231 @@ import QtQuick.Controls 1.2 import QtQuick.Controls.Styles 1.2 import QtQuick.Window 2.2 -import UM 1.1 as UM +import UM 1.2 as UM +import Cura 1.0 as Cura +import ".." Item { id: base; - property int currentIndex: UM.ActiveTool.properties.getValue("SelectedIndex") UM.I18nCatalog { id: catalog; name: "cura"; } width: childrenRect.width; height: childrenRect.height; - Column { + Column + { id: items anchors.top: parent.top; anchors.left: parent.left; spacing: UM.Theme.getSize("default_margin").height; - Column { - id: customisedSettings - spacing: UM.Theme.getSize("default_lining").height; - width: UM.Theme.getSize("setting").width + UM.Theme.getSize("setting").height/2; + Row + { + ComboBox + { + id: extruderSelector - Repeater { - id: settings; + model: Cura.ExtrudersModel + { + id: extruders_model + onRowsInserted: extruderSelector.visible = extruders_model.rowCount() > 1 + onModelReset: extruderSelector.visible = extruders_model.rowCount() > 1 + } + visible: extruders_model.rowCount() > 1 + textRole: "name" + width: items.width + height: UM.Theme.getSize("section").height + MouseArea + { + anchors.fill: parent + acceptedButtons: Qt.NoButton + onWheel: wheel.accepted = true; + } - model: UM.ActiveTool.properties.getValue("Model").getItem(base.currentIndex).settings + style: ComboBoxStyle + { + background: Rectangle + { + color: + { + if(extruderSelector.hovered || base.activeFocus) + { + return UM.Theme.getColor("setting_control_highlight"); + } + else + { + return UM.Theme.getColor("setting_control"); + } + } + border.width: UM.Theme.getSize("default_lining").width + border.color: UM.Theme.getColor("setting_control_border") + } + label: Item + { + Rectangle + { + id: swatch + height: UM.Theme.getSize("setting_control").height / 2 + width: height + anchors.left: parent.left + anchors.leftMargin: UM.Theme.getSize("default_lining").width + anchors.verticalCenter: parent.verticalCenter - UM.SettingItem { + color: extruders_model.getItem(extruderSelector.currentIndex).colour + border.width: UM.Theme.getSize("default_lining").width + border.color: !enabled ? UM.Theme.getColor("setting_control_disabled_border") : UM.Theme.getColor("setting_control_border") + } + Label + { + anchors.left: swatch.right + anchors.leftMargin: UM.Theme.getSize("default_lining").width + anchors.right: downArrow.left + anchors.rightMargin: UM.Theme.getSize("default_lining").width + anchors.verticalCenter: parent.verticalCenter + + text: extruderSelector.currentText + font: UM.Theme.getFont("default") + color: !enabled ? UM.Theme.getColor("setting_control_disabled_text") : UM.Theme.getColor("setting_control_text") + + elide: Text.ElideRight + verticalAlignment: Text.AlignVCenter + } + + UM.RecolorImage + { + id: downArrow + anchors.right: parent.right + anchors.rightMargin: UM.Theme.getSize("default_lining").width * 2 + anchors.verticalCenter: parent.verticalCenter + + source: UM.Theme.getIcon("arrow_bottom") + width: UM.Theme.getSize("standard_arrow").width + height: UM.Theme.getSize("standard_arrow").height + sourceSize.width: width + 5 + sourceSize.height: width + 5 + + color: UM.Theme.getColor("setting_control_text") + } + } + } + + onActivated: UM.ActiveTool.setProperty("SelectedActiveExtruder", extruders_model.getItem(index).id); + onModelChanged: updateCurrentIndex(); + + function updateCurrentIndex() + { + for(var i = 0; i < extruders_model.rowCount(); ++i) + { + if(extruders_model.getItem(i).id == UM.ActiveTool.properties.getValue("SelectedActiveExtruder")) + { + extruderSelector.currentIndex = i; + return; + } + } + extruderSelector.currentIndex = -1; + } + } + } + + Repeater + { + id: contents + height: childrenRect.height; + + model: UM.SettingDefinitionsModel + { + id: addedSettingsModel; + containerId: Cura.MachineManager.activeDefinitionId + visibilityHandler: Cura.PerObjectSettingVisibilityHandler + { + selectedObjectId: UM.ActiveTool.properties.getValue("SelectedObjectId") + } + } + + delegate: Row + { + Loader + { + id: settingLoader width: UM.Theme.getSize("setting").width; - height: UM.Theme.getSize("setting").height; + height: UM.Theme.getSize("section").height; - name: model.label; - type: model.type; - value: model.value; - description: model.description; - unit: model.unit; - valid: model.valid; - visible: !model.global_only - options: model.options - indent: false + property var definition: model + property var settingDefinitionsModel: addedSettingsModel + property var propertyProvider: provider - style: UM.Theme.styles.setting_item; + //Qt5.4.2 and earlier has a bug where this causes a crash: https://bugreports.qt.io/browse/QTBUG-35989 + //In addition, while it works for 5.5 and higher, the ordering of the actual combo box drop down changes, + //causing nasty issues when selecting different options. So disable asynchronous loading of enum type completely. + asynchronous: model.type != "enum" && model.type != "extruder" - onItemValueChanged: { - settings.model.setSettingValue(model.key, value) + onLoaded: { + settingLoader.item.showRevertButton = false + settingLoader.item.showInheritButton = false + settingLoader.item.doDepthIndentation = false } - Button + sourceComponent: { - anchors.left: parent.right; - - width: UM.Theme.getSize("setting").height; - height: UM.Theme.getSize("setting").height; - - onClicked: UM.ActiveTool.properties.getValue("Model").removeSettingOverride(UM.ActiveTool.properties.getValue("Model").getItem(base.currentIndex).id, model.key) - - style: ButtonStyle + switch(model.type) { - background: Rectangle + case "int": + return settingTextField + case "float": + return settingTextField + case "enum": + return settingComboBox + case "extruder": + return settingExtruder + case "bool": + return settingCheckBox + case "str": + return settingTextField + case "category": + return settingCategory + default: + return settingUnknown + } + } + } + + Button + { + width: UM.Theme.getSize("setting").height; + height: UM.Theme.getSize("setting").height; + + onClicked: addedSettingsModel.setVisible(model.key, false); + + style: ButtonStyle + { + background: Rectangle + { + color: control.hovered ? control.parent.style.controlHighlightColor : control.parent.style.controlColor; + UM.RecolorImage { - color: control.hovered ? control.parent.style.controlHighlightColor : control.parent.style.controlColor; - UM.RecolorImage - { - anchors.verticalCenter: parent.verticalCenter - anchors.horizontalCenter: parent.horizontalCenter - width: parent.width/2 - height: parent.height/2 - sourceSize.width: width - sourceSize.height: width - color: control.hovered ? UM.Theme.getColor("setting_control_button_hover") : UM.Theme.getColor("setting_control_button") - source: UM.Theme.getIcon("cross1") - } + anchors.verticalCenter: parent.verticalCenter + anchors.horizontalCenter: parent.horizontalCenter + width: parent.width/2 + height: parent.height/2 + sourceSize.width: width + sourceSize.height: width + color: control.hovered ? UM.Theme.getColor("setting_control_button_hover") : UM.Theme.getColor("setting_control_button") + source: UM.Theme.getIcon("cross1") } } } } + UM.SettingPropertyProvider + { + id: provider + + containerStackId: UM.ActiveTool.properties.getValue("ContainerID") + key: model.key + watchedProperties: [ "value", "enabled", "validationState" ] + storeIndex: 0 + } } } @@ -133,6 +281,7 @@ Item { id: settingPickDialog title: catalog.i18nc("@title:window", "Pick a Setting to Customize") + property string labelFilter: "" TextField { id: filter; @@ -145,123 +294,62 @@ Item { placeholderText: catalog.i18nc("@label:textbox", "Filter..."); - onTextChanged: settingCategoriesModel.filter(text); + onTextChanged: + { + if(text != "") + { + listview.model.filter = {"settable_per_mesh": true, "label": "*" + text} + } + else + { + listview.model.filter = {"settable_per_mesh": true} + } + } } - ScrollView { - id: view; - anchors { + ScrollView + { + id: scrollView + + anchors + { top: filter.bottom; left: parent.left; right: parent.right; bottom: parent.bottom; } + ListView + { + id:listview + model: UM.SettingDefinitionsModel + { + id: definitionsModel; + containerId: Cura.MachineManager.activeDefinitionId + filter: + { + "settable_per_mesh": true + } + visibilityHandler: UM.SettingPreferenceVisibilityHandler {} + } + delegate:Loader + { + id: loader - Column { - width: view.width - UM.Theme.getSize("default_margin").width * 2; - height: childrenRect.height; + width: parent.width + height: model.type != undefined ? UM.Theme.getSize("section").height : 0; - Repeater { - id: settingList; + property var definition: model + property var settingDefinitionsModel: definitionsModel - model: UM.SettingCategoriesModel { id: settingCategoriesModel; } - - delegate: Item { - id: delegateItem; - - width: parent.width; - height: childrenRect.height; - visible: model.visible && settingsColumn.childrenHeight != 0 //If all children are hidden, the height is 0, and then the category header must also be hidden. - - ToolButton { - id: categoryHeader; - text: model.name; - checkable: true; - width: parent.width; - onCheckedChanged: settingsColumn.state != "" ? settingsColumn.state = "" : settingsColumn.state = "collapsed"; - - style: ButtonStyle { - background: Rectangle - { - width: control.width; - height: control.height; - color: control.hovered ? palette.highlight : "transparent"; - } - label: Row - { - spacing: UM.Theme.getSize("default_margin").width; - Image - { - anchors.verticalCenter: parent.verticalCenter; - source: control.checked ? UM.Theme.getIcon("arrow_right") : UM.Theme.getIcon("arrow_bottom"); - } - Label - { - text: control.text; - font.bold: true; - color: control.hovered ? palette.highlightedText : palette.text; - } - } - } - } - - property variant settingsModel: model.settings; - - Column { - id: settingsColumn; - - anchors.top: categoryHeader.bottom; - - property real childrenHeight: - { - var h = 0.0; - for(var i in children) - { - var item = children[i]; - h += children[i].height; - if(item.settingVisible) - { - if(i > 0) - { - h += spacing; - } - } - } - return h; - } - - width: childrenRect.width; - height: childrenHeight; - Repeater { - model: delegateItem.settingsModel; - - delegate: ToolButton { - id: button; - x: model.visible_depth * UM.Theme.getSize("default_margin").width; - text: model.name; - tooltip: model.description; - visible: !model.global_only - height: model.global_only ? 0 : undefined - - onClicked: { - var object_id = UM.ActiveTool.properties.getValue("Model").getItem(base.currentIndex).id; - UM.ActiveTool.properties.getValue("Model").addSettingOverride(object_id, model.key); - settingPickDialog.visible = false; - } - - states: State { - name: "filtered" - when: model.filtered || !model.visible || !model.enabled - PropertyChanges { target: button; height: 0; opacity: 0; } - } - } - } - - states: State { - name: "collapsed"; - - PropertyChanges { target: settingsColumn; opacity: 0; height: 0; } - } + asynchronous: true + source: + { + switch(model.type) + { + case "category": + return "PerObjectCategory.qml" + default: + return "PerObjectItem.qml" } } } @@ -279,4 +367,46 @@ Item { } SystemPalette { id: palette; } + + Component + { + id: settingTextField; + + Cura.SettingTextField { } + } + + Component + { + id: settingComboBox; + + Cura.SettingComboBox { } + } + + Component + { + id: settingExtruder; + + Cura.SettingExtruder { } + } + + Component + { + id: settingCheckBox; + + Cura.SettingCheckBox { } + } + + Component + { + id: settingCategory; + + Cura.SettingCategory { } + } + + Component + { + id: settingUnknown; + + Cura.SettingUnknown { } + } } diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingsTool.py b/plugins/PerObjectSettingsTool/PerObjectSettingsTool.py index dc65725839..416d8cce6a 100644 --- a/plugins/PerObjectSettingsTool/PerObjectSettingsTool.py +++ b/plugins/PerObjectSettingsTool/PerObjectSettingsTool.py @@ -1,44 +1,57 @@ -# Copyright (c) 2015 Ultimaker B.V. +# Copyright (c) 2016 Ultimaker B.V. # Uranium is released under the terms of the AGPLv3 or higher. from UM.Tool import Tool from UM.Scene.Selection import Selection from UM.Application import Application from UM.Preferences import Preferences +from cura.SettingOverrideDecorator import SettingOverrideDecorator -from . import PerObjectSettingsModel - +## This tool allows the user to add & change settings per node in the scene. +# The settings per object are kept in a ContainerStack, which is linked to a node by decorator. class PerObjectSettingsTool(Tool): def __init__(self): super().__init__() self._model = None - self.setExposedProperties("Model", "SelectedIndex") + self.setExposedProperties("SelectedObjectId", "ContainerID", "SelectedActiveExtruder") Preferences.getInstance().preferenceChanged.connect(self._onPreferenceChanged) + Selection.selectionChanged.connect(self.propertyChanged) self._onPreferenceChanged("cura/active_mode") def event(self, event): return False - def getModel(self): - if not self._model: - self._model = PerObjectSettingsModel.PerObjectSettingsModel() - - #For some reason, casting this model to itself causes the model to properly be cast to a QVariant, even though it ultimately inherits from QVariant. - #Yeah, we have no idea either... - return PerObjectSettingsModel.PerObjectSettingsModel(self._model) - - def getSelectedIndex(self): - try: - selected_object = Selection.getSelectedObject(0) - if selected_object.getParent().callDecoration("isGroup"): - selected_object = selected_object.getParent() - except: - selected_object = None + def getSelectedObjectId(self): + selected_object = Selection.getSelectedObject(0) selected_object_id = id(selected_object) - index = self.getModel().find("id", selected_object_id) - return index + return selected_object_id + + def getContainerID(self): + selected_object = Selection.getSelectedObject(0) + try: + return selected_object.callDecoration("getStack").getId() + except AttributeError: + return "" + + ## Gets the active extruder of the currently selected object. + # + # \return The active extruder of the currently selected object. + def getSelectedActiveExtruder(self): + selected_object = Selection.getSelectedObject(0) + return selected_object.callDecoration("getActiveExtruder") + + ## Changes the active extruder of the currently selected object. + # + # \param extruder_stack_id The ID of the extruder to print the currently + # selected object with. + def setSelectedActiveExtruder(self, extruder_stack_id): + selected_object = Selection.getSelectedObject(0) + stack = selected_object.callDecoration("getStack") #Don't try to get the active extruder since it may be None anyway. + if not stack: + selected_object.addDecorator(SettingOverrideDecorator()) + selected_object.callDecoration("setActiveExtruder", extruder_stack_id) def _onPreferenceChanged(self, preference): if preference == "cura/active_mode": diff --git a/plugins/PerObjectSettingsTool/SettingOverrideModel.py b/plugins/PerObjectSettingsTool/SettingOverrideModel.py deleted file mode 100644 index 860650015c..0000000000 --- a/plugins/PerObjectSettingsTool/SettingOverrideModel.py +++ /dev/null @@ -1,137 +0,0 @@ -# Copyright (c) 2015 Ultimaker B.V. -# Uranium is released under the terms of the AGPLv3 or higher. - -from PyQt5.QtCore import Qt, pyqtSlot, QUrl - -from UM.Application import Application -from UM.Qt.ListModel import ListModel -from UM.Settings.SettingOverrideDecorator import SettingOverrideDecorator - -class SettingOverrideModel(ListModel): - KeyRole = Qt.UserRole + 1 - LabelRole = Qt.UserRole + 2 - DescriptionRole = Qt.UserRole + 3 - ValueRole = Qt.UserRole + 4 - TypeRole = Qt.UserRole + 5 - UnitRole = Qt.UserRole + 6 - ValidRole = Qt.UserRole + 7 - OptionsRole = Qt.UserRole + 8 - WarningDescriptionRole = Qt.UserRole + 9 - ErrorDescriptionRole = Qt.UserRole + 10 - GlobalOnlyRole = Qt.UserRole + 11 - - def __init__(self, node, parent = None): - super().__init__(parent) - - self._ignore_setting_change = None - - self._node = node - self._node.decoratorsChanged.connect(self._onDecoratorsChanged) - self._onDecoratorsChanged(None) - - self._activeProfile = Application.getInstance().getMachineManager().getWorkingProfile() #To be able to get notified when a setting changes. - self._activeProfile.settingValueChanged.connect(self._onProfileSettingValueChanged) - Application.getInstance().getMachineManager().activeProfileChanged.connect(self._onProfileChanged) - - self.addRoleName(self.KeyRole, "key") - self.addRoleName(self.LabelRole, "label") - self.addRoleName(self.DescriptionRole, "description") - self.addRoleName(self.ValueRole,"value") - self.addRoleName(self.TypeRole, "type") - self.addRoleName(self.UnitRole, "unit") - self.addRoleName(self.ValidRole, "valid") - self.addRoleName(self.OptionsRole, "options") - self.addRoleName(self.WarningDescriptionRole, "warning_description") - self.addRoleName(self.ErrorDescriptionRole, "error_description") - self.addRoleName(self.GlobalOnlyRole, "global_only") - - @pyqtSlot(str, "QVariant") - def setSettingValue(self, key, value): - if not self._decorator: - return - - self._decorator.setSettingValue(key, value) - - def _onDecoratorsChanged(self, node): - if not self._node.getDecorator(SettingOverrideDecorator): - self.clear() - return - - self._decorator = self._node.getDecorator(SettingOverrideDecorator) - self._decorator.settingAdded.connect(self._onSettingsChanged) - self._decorator.settingRemoved.connect(self._onSettingsChanged) - self._decorator.settingValueChanged.connect(self._onSettingValueChanged) - self._onSettingsChanged() - - def _createOptionsModel(self, options): - if not options: - return None - - model = ListModel() - model.addRoleName(Qt.UserRole + 1, "value") - model.addRoleName(Qt.UserRole + 2, "name") - for value, name in options.items(): - model.appendItem({"value": str(value), "name": str(name)}) - return model - - ## Updates the active profile in this model if the active profile is - # changed. - # - # This links the settingValueChanged of the new profile to this model's - # _onSettingValueChanged function, so that it properly listens to those - # events again. - def _onProfileChanged(self): - if self._activeProfile: #Unlink from the old profile. - self._activeProfile.settingValueChanged.disconnect(self._onProfileSettingValueChanged) - old_profile = self._activeProfile - self._activeProfile = Application.getInstance().getMachineManager().getWorkingProfile() - self._activeProfile.settingValueChanged.connect(self._onProfileSettingValueChanged) #Re-link to the new profile. - for setting_name in old_profile.getChangedSettings().keys(): #Update all changed settings in the old and new profiles. - self._onProfileSettingValueChanged(setting_name) - for setting_name in self._activeProfile.getChangedSettings().keys(): - self._onProfileSettingValueChanged(setting_name) - - ## Updates the global_only property of a setting once a setting value - # changes. - # - # This method should only get called on settings that are dependent on the - # changed setting. - # - # \param setting_name The setting that needs to be updated. - def _onProfileSettingValueChanged(self, setting_name): - index = self.find("key", setting_name) - if index != -1: - self.setProperty(index, "global_only", Application.getInstance().getMachineManager().getActiveMachineInstance().getMachineDefinition().getSetting(setting_name).getGlobalOnly()) - - def _onSettingsChanged(self): - self.clear() - - items = [] - for key, setting in self._decorator.getAllSettings().items(): - value = self._decorator.getSettingValue(key) - items.append({ - "key": key, - "label": setting.getLabel(), - "description": setting.getDescription(), - "value": str(value), - "type": setting.getType(), - "unit": setting.getUnit(), - "valid": setting.validate(value), - "options": self._createOptionsModel(setting.getOptions()), - "warning_description": setting.getWarningDescription(), - "error_description": setting.getErrorDescription(), - "global_only": setting.getGlobalOnly() - }) - - items.sort(key = lambda i: i["key"]) - - for item in items: - self.appendItem(item) - - def _onSettingValueChanged(self, setting): - index = self.find("key", setting.getKey()) - value = self._decorator.getSettingValue(setting.getKey()) - if index != -1: - self.setProperty(index, "value", str(value)) - self.setProperty(index, "valid", setting.validate(value)) - self.setProperty(index, "global_only", setting.getGlobalOnly()) \ No newline at end of file diff --git a/plugins/PerObjectSettingsTool/__init__.py b/plugins/PerObjectSettingsTool/__init__.py index 0d49b2c892..1779556ade 100644 --- a/plugins/PerObjectSettingsTool/__init__.py +++ b/plugins/PerObjectSettingsTool/__init__.py @@ -2,6 +2,8 @@ # Uranium is released under the terms of the AGPLv3 or higher. from . import PerObjectSettingsTool +from . import PerObjectSettingVisibilityHandler +from PyQt5.QtQml import qmlRegisterType from UM.i18n import i18nCatalog i18n_catalog = i18nCatalog("cura") @@ -13,7 +15,7 @@ def getMetaData(): "author": "Ultimaker", "version": "1.0", "description": i18n_catalog.i18nc("@info:whatsthis", "Provides the Per Object Settings."), - "api": 2 + "api": 3 }, "tool": { "name": i18n_catalog.i18nc("@label", "Per Object Settings"), @@ -25,4 +27,6 @@ def getMetaData(): } def register(app): + qmlRegisterType(PerObjectSettingVisibilityHandler.PerObjectSettingVisibilityHandler, "Cura", 1, 0, + "PerObjectSettingVisibilityHandler") return { "tool": PerObjectSettingsTool.PerObjectSettingsTool() } diff --git a/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py b/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py index 27859bd145..c6fc277234 100644 --- a/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py +++ b/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py @@ -29,17 +29,26 @@ class RemovableDriveOutputDevice(OutputDevice): if self._writing: raise OutputDeviceError.DeviceBusyError() - file_formats = Application.getInstance().getMeshFileHandler().getSupportedFileTypesWrite() #Formats supported by this application. + # Formats supported by this application (File types that we can actually write) + file_formats = Application.getInstance().getMeshFileHandler().getSupportedFileTypesWrite() if filter_by_machine: - machine_file_formats = Application.getInstance().getMachineManager().getActiveMachineInstance().getMachineDefinition().getFileFormats() - file_formats = list(filter(lambda file_format: file_format["mime_type"] in machine_file_formats, file_formats)) #Take the intersection between file_formats and machine_file_formats. + container = Application.getInstance().getGlobalContainerStack().findContainer({"file_formats": "*"}) + + # Create a list from supported file formats string + machine_file_formats = [file_type.strip() for file_type in container.getMetaDataEntry("file_formats").split(";")] + + # Take the intersection between file_formats and machine_file_formats. + file_formats = list(filter(lambda file_format: file_format["mime_type"] in machine_file_formats, file_formats)) + if len(file_formats) == 0: Logger.log("e", "There are no file formats available to write with!") raise OutputDeviceError.WriteRequestFailedError() - writer = Application.getInstance().getMeshFileHandler().getWriterByMimeType(file_formats[0]["mime_type"]) #Just take the first file format available. + + # Just take the first file format available. + writer = Application.getInstance().getMeshFileHandler().getWriterByMimeType(file_formats[0]["mime_type"]) extension = file_formats[0]["extension"] - if file_name == None: + if file_name is None: for n in BreadthFirstIterator(node): if n.getMeshData(): file_name = n.getName() @@ -50,7 +59,7 @@ class RemovableDriveOutputDevice(OutputDevice): Logger.log("e", "Could not determine a proper file name when trying to write to %s, aborting", self.getName()) raise OutputDeviceError.WriteRequestFailedError() - if extension: #Not empty string. + if extension: # Not empty string. extension = "." + extension file_name = os.path.join(self.getId(), os.path.splitext(file_name)[0] + extension) diff --git a/plugins/RemovableDriveOutputDevice/__init__.py b/plugins/RemovableDriveOutputDevice/__init__.py index 635bdde008..16adcbfd7c 100644 --- a/plugins/RemovableDriveOutputDevice/__init__.py +++ b/plugins/RemovableDriveOutputDevice/__init__.py @@ -13,7 +13,7 @@ def getMetaData(): "author": "Ultimaker B.V.", "description": catalog.i18nc("@info:whatsthis", "Provides removable drive hotplugging and writing support."), "version": "1.0", - "api": 2 + "api": 3 } } diff --git a/plugins/SolidView/SolidView.py b/plugins/SolidView/SolidView.py index 8719e9c6e4..71b29c8186 100644 --- a/plugins/SolidView/SolidView.py +++ b/plugins/SolidView/SolidView.py @@ -34,12 +34,10 @@ class SolidView(View): self._disabled_shader.setUniformValue("u_diffuseColor", [0.68, 0.68, 0.68, 1.0]) self._disabled_shader.setUniformValue("u_overhangAngle", math.cos(math.radians(0))) - if Application.getInstance().getMachineManager().getWorkingProfile(): - profile = Application.getInstance().getMachineManager().getWorkingProfile() - + if Application.getInstance().getGlobalContainerStack(): if Preferences.getInstance().getValue("view/show_overhang"): - angle = profile.getSettingValue("support_angle") - if angle != None: + angle = Application.getInstance().getGlobalContainerStack().getProperty("support_angle", "value") + if angle is not None: self._enabled_shader.setUniformValue("u_overhangAngle", math.cos(math.radians(90 - angle))) else: self._enabled_shader.setUniformValue("u_overhangAngle", math.cos(math.radians(0))) #Overhang angle of 0 causes no area at all to be marked as overhang. diff --git a/plugins/SolidView/__init__.py b/plugins/SolidView/__init__.py index 0317648e6e..945ccba8f6 100644 --- a/plugins/SolidView/__init__.py +++ b/plugins/SolidView/__init__.py @@ -13,7 +13,7 @@ def getMetaData(): "author": "Ultimaker", "version": "1.0", "description": i18n_catalog.i18nc("@info:whatsthis", "Provides a normal solid mesh view."), - "api": 2 + "api": 3 }, "view": { "name": i18n_catalog.i18nc("@item:inmenu", "Solid"), diff --git a/plugins/USBPrinting/USBPrinterOutputDevice.py b/plugins/USBPrinting/USBPrinterOutputDevice.py index 68c4567450..58b75c2987 100644 --- a/plugins/USBPrinting/USBPrinterOutputDevice.py +++ b/plugins/USBPrinting/USBPrinterOutputDevice.py @@ -256,7 +256,7 @@ class USBPrinterOutputDevice(PrinterOutputDevice): if not self.setBaudRate(baud_rate): continue # Could not set the baud rate, go to the next - time.sleep(1.5) # Ensure that we are not talking to the bootloader. 1.5 sec seems to be the magic number + time.sleep(1.5) # Ensure that we are not talking to the bootloader. 1.5 seconds seems to be the magic number sucesfull_responses = 0 timeout_time = time.time() + 5 self._serial.write(b"\n") diff --git a/plugins/USBPrinting/USBPrinterOutputDeviceManager.py b/plugins/USBPrinting/USBPrinterOutputDeviceManager.py index 24e2148375..5009ba69bb 100644 --- a/plugins/USBPrinting/USBPrinterOutputDeviceManager.py +++ b/plugins/USBPrinting/USBPrinterOutputDeviceManager.py @@ -128,8 +128,18 @@ class USBPrinterOutputDeviceManager(QObject, SignalEmitter, OutputDevicePlugin, return USBPrinterOutputDeviceManager._instance def _getDefaultFirmwareName(self): - machine_instance = Application.getInstance().getMachineManager().getActiveMachineInstance() - machine_type = machine_instance.getMachineDefinition().getId() + # Check if there is a valid global container stack + global_container_stack = Application.getInstance().getGlobalContainerStack() + if not global_container_stack: + Logger.log("e", "There is no global container stack. Can not update firmware.") + self._firmware_view.close() + return "" + + # The bottom of the containerstack is the machine definition + machine_id = global_container_stack.getBottom().id + + machine_has_heated_bed = global_container_stack.getProperty("machine_heated_bed", "value") + if platform.system() == "Linux": baudrate = 115200 else: @@ -151,23 +161,22 @@ class USBPrinterOutputDeviceManager(QObject, SignalEmitter, OutputDevicePlugin, } machine_with_heated_bed = {"ultimaker_original" : "MarlinUltimaker-HBK-{baudrate}.hex", } - ##TODO: Add check for multiple extruders hex_file = None - if machine_type in machine_without_extras.keys(): # The machine needs to be defined here! - if machine_type in machine_with_heated_bed.keys() and machine_instance.getMachineSettingValue("machine_heated_bed"): - Logger.log("d", "Choosing firmware with heated bed enabled for machine %s.", machine_type) - hex_file = machine_with_heated_bed[machine_type] # Return firmware with heated bed enabled + if machine_id in machine_without_extras.keys(): # The machine needs to be defined here! + if machine_id in machine_with_heated_bed.keys() and machine_has_heated_bed: + Logger.log("d", "Choosing firmware with heated bed enabled for machine %s.", machine_id) + hex_file = machine_with_heated_bed[machine_id] # Return firmware with heated bed enabled else: - Logger.log("d", "Choosing basic firmware for machine %s.", machine_type) - hex_file = machine_without_extras[machine_type] # Return "basic" firmware + Logger.log("d", "Choosing basic firmware for machine %s.", machine_id) + hex_file = machine_without_extras[machine_id] # Return "basic" firmware else: - Logger.log("e", "There is no firmware for machine %s.", machine_type) + Logger.log("e", "There is no firmware for machine %s.", machine_id) if hex_file: return hex_file.format(baudrate=baudrate) else: - Logger.log("e", "Could not find any firmware for machine %s.", machine_type) + Logger.log("e", "Could not find any firmware for machine %s.", machine_id) raise FileNotFoundError() ## Helper to identify serial ports (and scan for them) @@ -223,7 +232,7 @@ class USBPrinterOutputDeviceManager(QObject, SignalEmitter, OutputDevicePlugin, def getSerialPortList(self, only_list_usb = False): base_list = [] if platform.system() == "Windows": - import winreg + import winreg #@UnresolvedImport try: key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE,"HARDWARE\\DEVICEMAP\\SERIALCOMM") i = 0 diff --git a/plugins/USBPrinting/__init__.py b/plugins/USBPrinting/__init__.py index 4fab439bad..b8581586d8 100644 --- a/plugins/USBPrinting/__init__.py +++ b/plugins/USBPrinting/__init__.py @@ -13,7 +13,7 @@ def getMetaData(): "name": i18n_catalog.i18nc("@label", "USB printing"), "author": "Ultimaker", "version": "1.0", - "api": 2, + "api": 3, "description": i18n_catalog.i18nc("@info:whatsthis","Accepts G-Code and sends them to a printer. Plugin can also update firmware.") } } diff --git a/plugins/XRayView/__init__.py b/plugins/XRayView/__init__.py index 277dc69b92..34e4761863 100644 --- a/plugins/XRayView/__init__.py +++ b/plugins/XRayView/__init__.py @@ -13,7 +13,7 @@ def getMetaData(): "author": "Ultimaker", "version": "1.0", "description": catalog.i18nc("@info:whatsthis", "Provides the X-Ray view."), - "api": 2 + "api": 3 }, "view": { "name": catalog.i18nc("@item:inlistbox", "X-Ray"), diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py new file mode 100644 index 0000000000..89c7d76e9f --- /dev/null +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -0,0 +1,189 @@ +# Copyright (c) 2016 Ultimaker B.V. +# Cura is released under the terms of the AGPLv3 or higher. + +import math +import copy +import xml.etree.ElementTree as ET + +from UM.Logger import Logger + +import UM.Settings + +# The namespace is prepended to the tag name but between {}. +# We are only interested in the actual tag name, so discard everything +# before the last } +def _tag_without_namespace(element): + return element.tag[element.tag.rfind("}") + 1:] + +class XmlMaterialProfile(UM.Settings.InstanceContainer): + def __init__(self, container_id, *args, **kwargs): + super().__init__(container_id, *args, **kwargs) + + def serialize(self): + raise NotImplementedError("Writing material profiles has not yet been implemented") + + def deserialize(self, serialized): + data = ET.fromstring(serialized) + + self.addMetaDataEntry("type", "material") + + # TODO: Add material verfication + self.addMetaDataEntry("status", "Unknown") + + metadata = data.iterfind("./um:metadata/*", self.__namespaces) + for entry in metadata: + tag_name = _tag_without_namespace(entry) + + if tag_name == "name": + brand = entry.find("./um:brand", self.__namespaces) + material = entry.find("./um:material", self.__namespaces) + color = entry.find("./um:color", self.__namespaces) + + self.setName("{0} {1} ({2})".format(brand.text, material.text, color.text)) + + self.addMetaDataEntry("brand", brand.text) + self.addMetaDataEntry("material", material.text) + self.addMetaDataEntry("color_name", color.text) + + continue + + self.addMetaDataEntry(tag_name, entry.text) + + property_values = {} + properties = data.iterfind("./um:properties/*", self.__namespaces) + for entry in properties: + tag_name = _tag_without_namespace(entry) + property_values[tag_name] = entry.text + + diameter = float(property_values.get("diameter", 2.85)) # In mm + density = float(property_values.get("density", 1.3)) # In g/cm3 + + weight_per_cm = (math.pi * (diameter / 20) ** 2 * 0.1) * density + + spool_weight = property_values.get("spool_weight") + spool_length = property_values.get("spool_length") + if spool_weight: + length = float(spool_weight) / weight_per_cm + property_values["spool_length"] = str(length / 100) + elif spool_length: + weight = (float(spool_length) * 100) * weight_per_cm + property_values["spool_weight"] = str(weight) + + self.addMetaDataEntry("properties", property_values) + + self.setDefinition(UM.Settings.ContainerRegistry.getInstance().findDefinitionContainers(id = "fdmprinter")[0]) + + global_setting_values = {} + settings = data.iterfind("./um:settings/um:setting", self.__namespaces) + for entry in settings: + key = entry.get("key") + if key in self.__material_property_setting_map: + self.setProperty(self.__material_property_setting_map[key], "value", entry.text, self._definition) + global_setting_values[self.__material_property_setting_map[key]] = entry.text + else: + Logger.log("d", "Unsupported material setting %s", key) + + machines = data.iterfind("./um:settings/um:machine", self.__namespaces) + for machine in machines: + machine_setting_values = {} + settings = machine.iterfind("./um:setting", self.__namespaces) + for entry in settings: + key = entry.get("key") + if key in self.__material_property_setting_map: + machine_setting_values[self.__material_property_setting_map[key]] = entry.text + else: + Logger.log("d", "Unsupported material setting %s", key) + + identifiers = machine.iterfind("./um:machine_identifier", self.__namespaces) + for identifier in identifiers: + machine_id = self.__product_id_map.get(identifier.get("product"), None) + if machine_id is None: + Logger.log("w", "Cannot create material for unknown machine %s", machine_id) + continue + + definitions = UM.Settings.ContainerRegistry.getInstance().findDefinitionContainers(id = machine_id) + if not definitions: + Logger.log("w", "No definition found for machine ID %s", machine_id) + continue + + definition = definitions[0] + + new_material = XmlMaterialProfile(self.id + "_" + machine_id) + new_material.setName(self.getName()) + new_material.setMetaData(copy.deepcopy(self.getMetaData())) + new_material.setDefinition(definition) + + for key, value in global_setting_values.items(): + new_material.setProperty(key, "value", value, definition) + + for key, value in machine_setting_values.items(): + new_material.setProperty(key, "value", value, definition) + + new_material._dirty = False + + UM.Settings.ContainerRegistry.getInstance().addContainer(new_material) + + hotends = machine.iterfind("./um:hotend", self.__namespaces) + for hotend in hotends: + hotend_id = hotend.get("id") + if hotend_id is None: + continue + + variant_containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(id = hotend_id) + if not variant_containers: + # It is not really properly defined what "ID" is so also search for variants by name. + variant_containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(definition = definition.id, name = hotend_id) + + if not variant_containers: + Logger.log("d", "No variants found with ID or name %s for machine %s", hotend_id, definition.id) + continue + + new_hotend_material = XmlMaterialProfile(self.id + "_" + machine_id + "_" + hotend_id.replace(" ", "_")) + new_hotend_material.setName(self.getName()) + new_hotend_material.setMetaData(copy.deepcopy(self.getMetaData())) + new_hotend_material.setDefinition(definition) + + new_hotend_material.addMetaDataEntry("variant", variant_containers[0].id) + + for key, value in global_setting_values.items(): + new_hotend_material.setProperty(key, "value", value, definition) + + for key, value in machine_setting_values.items(): + new_hotend_material.setProperty(key, "value", value, definition) + + settings = hotend.iterfind("./um:setting", self.__namespaces) + for entry in settings: + key = entry.get("key") + if key in self.__material_property_setting_map: + new_hotend_material.setProperty(self.__material_property_setting_map[key], "value", entry.text, definition) + else: + Logger.log("d", "Unsupported material setting %s", key) + + new_hotend_material._dirty = False + UM.Settings.ContainerRegistry.getInstance().addContainer(new_hotend_material) + + + # Map XML file setting names to internal names + __material_property_setting_map = { + "print temperature": "material_print_temperature", + "heated bed temperature": "material_bed_temperature", + "standby temperature": "material_standby_temperature", + "print cooling": "cool_fan_speed", + "retraction amount": "retraction_amount", + "retraction speed": "retraction_speed", + } + + # Map XML file product names to internal ids + __product_id_map = { + "Ultimaker2": "ultimaker2", + "Ultimaker2+": "ultimaker2_plus", + "Ultimaker2go": "ultimaker2_go", + "Ultimaker2extended": "ultimaker2_extended", + "Ultimaker2extended+": "ultimaker2_extended_plus", + "Ultimaker Original": "ultimaker_original", + "Ultimaker Original+": "ultimaker_original_plus" + } + + __namespaces = { + "um": "http://www.ultimaker.com/material" + } diff --git a/plugins/XmlMaterialProfile/__init__.py b/plugins/XmlMaterialProfile/__init__.py new file mode 100644 index 0000000000..041a3f6346 --- /dev/null +++ b/plugins/XmlMaterialProfile/__init__.py @@ -0,0 +1,32 @@ +# Copyright (c) 2016 Ultimaker B.V. +# Cura is released under the terms of the AGPLv3 or higher. + +from . import XmlMaterialProfile + +from UM.MimeTypeDatabase import MimeType, MimeTypeDatabase +from UM.i18n import i18nCatalog +catalog = i18nCatalog("cura") + +def getMetaData(): + return { + "plugin": { + "name": catalog.i18nc("@label", "Material Profiles"), + "author": "Ultimaker", + "version": "1.0", + "description": catalog.i18nc("@info:whatsthis", "Provides capabilities to read and write XML-based material profiles."), + "api": 3 + }, + "settings_container": { + "mimetype": "application/x-ultimaker-material-profile" + } + } + +def register(app): + mime_type = MimeType( + name = "application/x-ultimaker-material-profile", + comment = "Ultimaker Material Profile", + suffixes = [ "xml.fdm_material" ] + ) + MimeTypeDatabase.addMimeType(mime_type) + return { "settings_container": XmlMaterialProfile.XmlMaterialProfile("default_xml_material_profile") } + diff --git a/resources/definitions/bq_hephestos.def.json b/resources/definitions/bq_hephestos.def.json new file mode 100644 index 0000000000..4c90ae9ecd --- /dev/null +++ b/resources/definitions/bq_hephestos.def.json @@ -0,0 +1,87 @@ +{ + "id": "bq_hephestos", + "name": "BQ Prusa i3 Hephestos", + "version": 2, + "inherits": "fdmprinter", + "metadata": { + "visible": true, + "author": "BQ", + "manufacturer": "BQ", + "category": "Other", + "file_formats": "text/x-gcode", + "platform": "bq_hephestos_platform.stl", + "platform_offset": [ 0, -82, 0] + }, + + "overrides": { + "machine_start_gcode": { + "default_value": "; -- START GCODE --\nG21 ;set units to millimetres\nG90 ;set to absolute positioning\nM106 S0 ;set fan speed to zero (turned off)\nG28 X0 Y0 ;move to the X/Y origin (Home)\nG28 Z0 ;move to the Z origin (Home)\nG1 Z15.0 F1200 ;move Z to position 15.0 mm\nG92 E0 ;zero the extruded length\nG1 E20 F200 ;extrude 20mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F7200 ;set feedrate to 120 mm/s\n; -- end of START GCODE --" + }, + "machine_end_gcode": { + "default_value": "; -- END GCODE --\nM104 S0 ;set extruder temperature to zero (turned off)\nG91 ;set to relative positioning\nG1 E-20 F300 ;retract the filament a bit to release some of the pressure\nG1 Z10 ;move extruder up 10 mm\nG90 ;set to absolute positioning\nG1 X0 Y180 F1200 ;expose the platform\nM84 ;turn off steppers\n; -- end of END GCODE --" + }, + "machine_width": { + "default_value": 215 + }, + "machine_depth": { + "default_value": 210 + }, + "machine_height": { + "default_value": 180 + }, + "machine_heated_bed": { + "default_value": false + }, + "machine_center_is_zero": { + "default_value": false + }, + "machine_gcode_flavor": { + "default_value": "RepRap" + }, + "layer_height": { + "default_value": 0.2 + }, + "layer_height_0": { + "default_value": 0.2 + }, + "wall_thickness": { + "default_value": 1 + }, + "top_bottom_thickness": { + "default_value": 1 + }, + "bottom_thickness": { + "default_value": 1 + }, + "material_print_temperature": { + "default_value": 220 + }, + "material_bed_temperature": { + "default_value": 0 + }, + "material_diameter": { + "default_value": 1.75 + }, + "speed_print": { + "default_value": 40 + }, + "speed_infill": { + "default_value": 40 + }, + "speed_wall": { + "default_value": 35 + }, + "speed_topbottom": { + "default_value": 35 + }, + "speed_travel": { + "default_value": 120 + }, + "speed_layer_0": { + "default_value": 20 + }, + "support_enable": { + "default_value": true + } + } +} \ No newline at end of file diff --git a/resources/definitions/bq_hephestos_2.def.json b/resources/definitions/bq_hephestos_2.def.json new file mode 100644 index 0000000000..e4e58cb6c2 --- /dev/null +++ b/resources/definitions/bq_hephestos_2.def.json @@ -0,0 +1,47 @@ +{ + "id": "bq_hephestos_2", + "version": 2, + "name": "BQ Hephestos 2", + "inherits": "fdmprinter", + "metadata": { + "visible": true, + "author": "BQ", + "manufacturer": "BQ", + "category": "Other", + "platform": "bq_hephestos_2_platform.stl", + "platform_offset": [6, 1320, 0 ], + "file_formats": "text/x-gcode" + }, + + "overrides": { + "machine_start_gcode": { "default_value": "; -- START GCODE --\nM800 ; Custom GCODE to fire start print procedure\n; -- end of START GCODE --" }, + "machine_end_gcode": { "default_value": "; -- END GCODE --\nM801 ; Custom GCODE to fire end print procedure\n; -- end of END GCODE --" }, + "machine_width": { "default_value": 210 }, + "machine_depth": { "default_value": 297 }, + "machine_height": { "default_value": 220 }, + "machine_heated_bed": { "default_value": false }, + "machine_center_is_zero": { "default_value": false }, + "material_print_temperature": { "default_value": 210 }, + "material_bed_temperature": { "default_value": 0 }, + "material_diameter": { "default_value": 1.75 }, + "layer_height": { "default_value": 0.2 }, + "layer_height_0": { "default_value": 0.2 }, + "wall_line_count": { "default_value": 3 }, + "wall_thickness": { "default_value": 1.2 }, + "top_bottom_thickness": { "default_value": 1.2 }, + "infill_sparse_density": { "default_value": 20 }, + "infill_overlap": { "default_value": 15 }, + "speed_print": { "default_value": 60 }, + "speed_travel": { "default_value": 160 }, + "speed_layer_0": { "default_value": 30 }, + "speed_wall_x": { "default_value": 35 }, + "speed_wall_0": { "default_value": 30 }, + "speed_infill": { "default_value": 80 }, + "speed_topbottom": { "default_value": 35 }, + "skirt_speed": { "default_value": 35 }, + "skirt_line_count": { "default_value": 4 }, + "skirt_minimal_length": { "default_value": 30 }, + "skirt_gap": { "default_value": 6 }, + "cool_fan_full_at_height": { "default_value": 0.4 } + } +} diff --git a/resources/definitions/bq_hephestos_xl.def.json b/resources/definitions/bq_hephestos_xl.def.json new file mode 100644 index 0000000000..867f5f37aa --- /dev/null +++ b/resources/definitions/bq_hephestos_xl.def.json @@ -0,0 +1,87 @@ +{ + "id": "bq_hephestos_xl", + "version": 2, + "name": "BQ Prusa i3 Hephestos XL", + "inherits": "fdmprinter", + "metadata": { + "visible": true, + "manufacturer": "BQ", + "author": "BQ", + "category": "Other", + "file_formats": "text/x-code", + "platform": "bq_hephestos_platform.stl", + "platform_offset": [ 0, -82, 0] + }, + + "overrides": { + "machine_start_gcode": { + "default_value": "; -- START GCODE --\nG21 ;set units to millimetres\nG90 ;set to absolute positioning\nM106 S0 ;set fan speed to zero (turned off)\nG28 X0 Y0 ;move to the X/Y origin (Home)\nG28 Z0 ;move to the Z origin (Home)\nG1 Z15.0 F1200 ;move Z to position 15.0 mm\nG92 E0 ;zero the extruded length\nG1 E20 F200 ;extrude 20mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F7200 ;set feedrate to 120 mm/s\n; -- end of START GCODE --" + }, + "machine_end_gcode": { + "default_value": "; -- END GCODE --\nM104 S0 ;set extruder temperature to zero (turned off)\nG91 ;set to relative positioning\nG1 E-20 F300 ;retract the filament a bit to release some of the pressure\nG1 Z10 ;move extruder up 10 mm\nG90 ;set to absolute positioning\nG1 X0 Y180 F1200 ;expose the platform\nM84 ;turn off steppers\n; -- end of END GCODE --" + }, + "machine_width": { + "default_value": 200 + }, + "machine_depth": { + "default_value": 300 + }, + "machine_height": { + "default_value": 180 + }, + "machine_heated_bed": { + "default_value": false + }, + "machine_center_is_zero": { + "default_value": false + }, + "machine_gcode_flavor": { + "default_value": "RepRap" + }, + "layer_height": { + "default_value": 0.2 + }, + "layer_height_0": { + "default_value": 0.2 + }, + "wall_thickness": { + "default_value": 1 + }, + "top_bottom_thickness": { + "default_value": 1 + }, + "bottom_thickness": { + "default_value": 1 + }, + "material_print_temperature": { + "default_value": 220 + }, + "material_bed_temperature": { + "default_value": 0 + }, + "material_diameter": { + "default_value": 1.75 + }, + "speed_print": { + "default_value": 40 + }, + "speed_infill": { + "default_value": 40 + }, + "speed_wall": { + "default_value": 35 + }, + "speed_topbottom": { + "default_value": 35 + }, + "speed_travel": { + "default_value": 120 + }, + "speed_layer_0": { + "default_value": 20 + }, + "support_enable": { + "default_value": true + } + } +} \ No newline at end of file diff --git a/resources/definitions/bq_witbox.def.json b/resources/definitions/bq_witbox.def.json new file mode 100644 index 0000000000..b8d4cbf015 --- /dev/null +++ b/resources/definitions/bq_witbox.def.json @@ -0,0 +1,88 @@ +{ + "id": "bq_witbox", + "version": 2, + "name": "BQ Witbox", + "inherits": "fdmprinter", + "metadata": { + "visible": true, + "author": "BQ", + "manufacturer": "BQ", + "category": "Other", + "file_formats": "text/x-gcode", + "platform": "bq_witbox_platform.stl", + "platform_offset": [ 0, -145, -38] + }, + + "overrides": { + "machine_start_gcode": { + "default_value": "; -- START GCODE --\nG21 ;set units to millimetres\nG90 ;set to absolute positioning\nM106 S0 ;set fan speed to zero (turned off)\nG28 X0 Y0 ;move to the X/Y origin (Home)\nG28 Z0 ;move to the Z origin (Home)\nG1 Z15.0 F1200 ;move Z to position 15.0 mm\nG92 E0 ;zero the extruded length\nG1 E20 F200 ;extrude 20mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F7200 ;set feedrate to 120 mm/s\n; -- end of START GCODE --" + }, + "machine_end_gcode": { + "default_value": "; -- END GCODE --\nM104 S0 ;set extruder temperature to zero (turned off)\nG91 ;set to relative positioning\nG1 E-20 F300 ;retract the filament a bit to release some of the pressure\nG90 ;set to absolute positioning\nG1 Z200 ;move the platform to the bottom\nG28 X0 Y0 ;move to the X/Y origin (Home)\nM84 ;turn off steppers\n; -- end of END GCODE --" + }, + "machine_width": { + "default_value": 297 + }, + "machine_depth": { + "default_value": 210 + }, + "machine_height": { + "default_value": 200 + }, + "machine_heated_bed": { + "default_value": false + }, + "machine_center_is_zero": { + "default_value": false + }, + "machine_gcode_flavor": { + "default_value": "RepRap" + }, + "layer_height": { + "default_value": 0.2 + }, + "layer_height_0": { + "default_value": 0.2 + }, + "wall_thickness": { + "default_value": 1 + }, + "top_bottom_thickness": { + "default_value": 1 + }, + "bottom_thickness": { + "default_value": 1 + }, + "material_print_temperature": { + "default_value": 220 + }, + "material_bed_temperature": { + "default_value": 0 + }, + "material_diameter": { + "default_value": 1.75 + }, + "speed_print": { + "default_value": 40 + }, + "speed_infill": { + "default_value": 40 + }, + "speed_wall": { + "default_value": 35 + }, + "speed_topbottom": { + "default_value": 35 + }, + "speed_travel": { + "default_value": 120 + }, + "speed_layer_0": { + "default_value": 20 + }, + "support_enable": { + "default_value": true + } + + } +} \ No newline at end of file diff --git a/resources/definitions/bq_witbox_2.def.json b/resources/definitions/bq_witbox_2.def.json new file mode 100644 index 0000000000..b9d9b497cd --- /dev/null +++ b/resources/definitions/bq_witbox_2.def.json @@ -0,0 +1,111 @@ +{ + "id": "bq_witbox_2", + "version": 2, + "name": "BQ Witbox 2", + "inherits": "fdmprinter", + "metadata": { + "visible": true, + "author": "BQ", + "manufacturer": "BQ", + "category": "Other", + "file_formats": "text/x-gcode", + "platform": "bq_witbox_platform.stl", + "platform_offset": [0, -145, -38] + }, + + "overrides": { + "machine_start_gcode": { + "default_value": "; -- START GCODE --\nM800 ; Custom GCODE to fire start print procedure\n; -- end of START GCODE --" + }, + "machine_end_gcode": { + "default_value": "; -- END GCODE --\nM801 ; Custom GCODE to fire end print procedure\n; -- end of END GCODE --" + }, + "machine_width": { + "default_value": 297 + }, + "machine_depth": { + "default_value": 210 + }, + "machine_height": { + "default_value": 200 + }, + "machine_heated_bed": { + "default_value": false + }, + "machine_center_is_zero": { + "default_value": false + }, + "machine_gcode_flavor": { + "default_value": "RepRap" + }, + "material_print_temperature": { + "default_value": 210 + }, + "material_bed_temperature": { + "default_value": 0 + }, + "material_diameter": { + "default_value": 1.75 + }, + "layer_height": { + "default_value": 0.2 + }, + "layer_height_0": { + "default_value": 0.2 + }, + "wall_line_count": { + "default_value": 3 + }, + "wall_thickness": { + "default_value": 1.2 + }, + "top_bottom_thickness": { + "default_value": 1.2 + }, + "infill_sparse_density": { + "default_value": 20 + }, + "infill_overlap": { + "default_value": 15 + }, + "speed_print": { + "default_value": 60 + }, + "speed_travel": { + "default_value": 160 + }, + "speed_layer_0": { + "default_value": 30 + }, + "speed_wall_x": { + "default_value": 35 + }, + "speed_wall_0": { + "default_value": 30 + }, + "speed_infill": { + "default_value": 80 + }, + "speed_topbottom": { + "default_value": 35 + }, + "skirt_speed": { + "default_value": 35 + }, + "skirt_line_count": { + "default_value": 4 + }, + "skirt_minimal_length": { + "default_value": 30 + }, + "skirt_gap": { + "default_value": 6 + }, + "cool_fan_full_at_height": { + "default_value": 0.4 + }, + "support_enable": { + "default_value": false + } + } +} \ No newline at end of file diff --git a/resources/definitions/fdmextruder.def.json b/resources/definitions/fdmextruder.def.json new file mode 100644 index 0000000000..06a736330c --- /dev/null +++ b/resources/definitions/fdmextruder.def.json @@ -0,0 +1,151 @@ +{ + "id": "fdmextruder", + "name": "Extruder", + "version": 2, + "metadata": + { + "type": "extruder", + "author": "Ultimaker B.V.", + "manufacturer": "Ultimaker", + "visible": false + }, + "settings": + { + "machine_settings": + { + "label": "Machine", + "type": "category", + "description": "Machine specific settings", + "children": + { + "extruder_nr": + { + "label": "Extruder", + "description": "The extruder train used for printing. This is used in multi-extrusion.", + "type": "extruder", + "default_value": "0", + "settable_per_mesh": true, + "settable_per_extruder": false, + "settable_per_meshgroup": false, + "settable_globally": false + }, + "machine_nozzle_offset_x": + { + "label": "Nozzle X Offset", + "description": "The x-coordinate of the offset of the nozzle.", + "type": "float", + "unit": "mm", + "default_value": 0, + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": false, + "settable_globally": false + }, + "machine_nozzle_offset_y": + { + "label": "Nozzle Y Offset", + "description": "The y-coordinate of the offset of the nozzle.", + "type": "float", + "unit": "mm", + "default_value": 0, + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": false, + "settable_globally": false + }, + "machine_extruder_start_code": + { + "label": "Extruder Start G-Code", + "description": "Start g-code to execute whenever turning the extruder on.", + "type": "str", + "default_value": "", + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": false, + "settable_globally": false + }, + "machine_extruder_start_pos_abs": + { + "label": "Extruder Start Position Absolute", + "description": "Make the extruder starting position absolute rather than relative to the last-known location of the head.", + "type": "bool", + "default_value": false, + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": false, + "settable_globally": false + }, + "machine_extruder_start_pos_x": + { + "label": "Extruder Start Position X", + "description": "The x-coordinate of the starting position when turning the extruder on.", + "type": "float", + "unit": "mm", + "default_value": 0, + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": false, + "settable_globally": false + }, + "machine_extruder_start_pos_y": + { + "label": "Extruder Start Position Y", + "description": "The y-coordinate of the starting position when turning the extruder on.", + "type": "float", + "unit": "mm", + "default_value": 0, + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": false, + "settable_globally": false + }, + "machine_extruder_end_code": + { + "label": "Extruder End G-Code", + "description": "End g-code to execute whenever turning the extruder off.", + "type": "str", + "default_value": "", + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": false, + "settable_globally": false + }, + "machine_extruder_end_pos_abs": + { + "label": "Extruder End Position Absolute", + "description": "Make the extruder ending position absolute rather than relative to the last-known location of the head.", + "type": "bool", + "default_value": false, + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": false, + "settable_globally": false + }, + "machine_extruder_end_pos_x": + { + "label": "Extruder End Position X", + "description": "The x-coordinate of the ending position when turning the extruder off.", + "type": "float", + "unit": "mm", + "default_value": 0, + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": false, + "settable_globally": false + }, + "machine_extruder_end_pos_y": + { + "label": "Extruder End Position Y", + "description": "The y-coordinate of the ending position when turning the extruder off.", + "type": "float", + "unit": "mm", + "default_value": 0, + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": false, + "settable_globally": false + } + } + } + } +} diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json new file mode 100644 index 0000000000..ac40eed0ae --- /dev/null +++ b/resources/definitions/fdmprinter.def.json @@ -0,0 +1,3572 @@ +{ + "id": "fdmprinter", + "name": "FDM Printer Base Description", + "version": 2, + "metadata": + { + "type": "machine", + "author": "Ultimaker B.V.", + "category": "Ultimaker", + "manufacturer": "Ultimaker", + "file_formats": "text/x-gcode;application/x-stl-ascii;application/x-stl-binary;application/x-wavefront-obj;application/x3g", + "visible": false, + "preferred_material": "pla", + "preferred_quality": "normal", + "machine_extruder_trains": + { + "0": "fdmextruder" + } + }, + "settings": + { + "machine_settings": + { + "label": "Machine", + "type": "category", + "description": "Machine specific settings", + "icon": "category_machine", + "children": + { + "machine_show_variants": + { + "description": "Whether to show the different variants of this machine, which are described in separate json files.", + "default_value": false, + "type": "bool", + "label": "Show machine variants", + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false + }, + "machine_start_gcode": + { + "description": "Gcode commands to be executed at the very start - separated by \\n.", + "default_value": "G28 ;Home\nG1 Z15.0 F6000 ;Move the platform down 15mm\n;Prime the extruder\nG92 E0\nG1 F200 E3\nG92 E0", + "label": "Start GCode", + "type": "str", + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false + }, + "machine_end_gcode": + { + "description": "Gcode commands to be executed at the very end - separated by \\n.", + "default_value": "M104 S0\nM140 S0\n;Retract the filament\nG92 E1\nG1 E-1 F300\nG28 X0 Y0\nM84", + "label": "End GCode", + "type": "str", + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false + }, + "material_bed_temp_wait": + { + "description": "Whether to insert a command to wait until the bed temperature is reached at the start.", + "label": "Wait for bed heatup", + "default_value": true, + "type": "bool", + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false + }, + "material_print_temp_prepend": + { + "description": "Whether to include nozzle temperature commands at the start of the gcode. When the start_gcode already contains nozzle temperature commands Cura frontend will automatically disable this setting.", + "default_value": true, + "type": "bool", + "label": "Wait for material heatup", + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false + }, + "machine_width": + { + "description": "The width (X-direction) of the printable area.", + "default_value": 100, + "type": "float", + "label": "Machine width", + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false + }, + "machine_depth": + { + "description": "The depth (Y-direction) of the printable area.", + "default_value": 100, + "type": "float", + "label": "Machine depth", + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false + }, + "machine_height": + { + "description": "The height (Z-direction) of the printable area.", + "default_value": 100, + "type": "float", + "label": "Machine height", + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false + }, + "machine_heated_bed": + { + "description": "Whether the machine has a heated bed present.", + "default_value": false, + "label": "Has heated bed", + "type": "bool", + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false + }, + "machine_center_is_zero": + { + "description": "Whether the X/Y coordinates of the zero position of the printer is at the center of the printable area.", + "default_value": false, + "type": "bool", + "label": "Is center origin", + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false + }, + "machine_extruder_count": + { + "description": "Number of extruder trains. An extruder train is the combination of a feeder, bowden tube, and nozzle.", + "default_value": 1, + "type": "int", + "label": "Number extruders", + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false + }, + "machine_nozzle_tip_outer_diameter": + { + "description": "The outer diameter of the tip of the nozzle.", + "label": "Outer nozzle diameter", + "default_value": 1, + "type": "float", + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": false, + "settable_globally": false + }, + "machine_nozzle_head_distance": + { + "description": "The height difference between the tip of the nozzle and the lowest part of the print head.", + "default_value": 3, + "type": "float", + "label": "Nozzle length", + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false + }, + "machine_nozzle_expansion_angle": + { + "description": "The angle between the horizontal plane and the conical part right above the tip of the nozzle.", + "default_value": 45, + "type": "int", + "label": "Nozzle angle", + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false + }, + "machine_heat_zone_length": + { + "description": "The distance from the tip of the nozzle in which heat from the nozzle is transfered to the filament.", + "default_value": 16, + "type": "float", + "label": "Heat zone length", + "settable_per_mesh": false, + "settable_per_extruder": true, + "settable_per_meshgroup": false + }, + "machine_nozzle_heat_up_speed": + { + "description": "The speed (°C/s) by which the nozzle heats up averaged over the window of normal printing temperatures and the standby temperature.", + "default_value": 2.0, + "type": "float", + "label": "Heat up speed", + "settable_per_mesh": false, + "settable_per_extruder": true + }, + "machine_nozzle_cool_down_speed": + { + "description": "The speed (°C/s) by which the nozzle cools down averaged over the window of normal printing temperatures and the standby temperature.", + "default_value": 2.0, + "type": "float", + "label": "Cool down speed", + "settable_per_mesh": false, + "settable_per_extruder": true + }, + "machine_gcode_flavor": + { + "description": "The type of gcode to be generated.", + "default_value": "RepRap", + "type": "str", + "label": "Gcode flavour", + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false + }, + "machine_disallowed_areas": + { + "description": "A list of polygons with areas the print head is not allowed to enter.", + "type": "polygons", + "default_value": [], + "label": "Disallowed areas", + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false + }, + "machine_head_polygon": + { + "description": "A 2D silhouette of the print head (fan caps excluded).", + "type": "polygon", + "default_value": + [ + [ + -1, + 1 + ], + [ + -1, + -1 + ], + [ + 1, + -1 + ], + [ + 1, + 1 + ] + ], + "label": "Machine head polygon", + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false + }, + "machine_head_with_fans_polygon": + { + "description": "A 2D silhouette of the print head (fan caps included).", + "type": "polygon", + "default_value": + [ + [ + -20, + 10 + ], + [ + 10, + 10 + ], + [ + 10, + -10 + ], + [ + -20, + -10 + ] + ], + "label": "Machine head & Fan polygon", + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false + }, + "gantry_height": + { + "description": "The height difference between the tip of the nozzle and the gantry system (X and Y axes).", + "default_value": 99999999999, + "label": "Gantry height", + "type": "float", + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false + }, + "machine_nozzle_size": + { + "label": "Nozzle Diameter", + "description": "The inner diameter of the nozzle. Change this setting when using a non-standard nozzle size.", + "unit": "mm", + "type": "float", + "default_value": 0.4, + "minimum_value": "0.001", + "maximum_value_warning": "10", + "settable_per_mesh": false, + "settable_per_extruder": true + }, + "machine_use_extruder_offset_to_offset_coords": + { + "label": "Offset With Extruder", + "description": "Apply the extruder offset to the coordinate system.", + "type": "bool", + "default_value": true, + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false + } + } + }, + "resolution": + { + "label": "Quality", + "type": "category", + "icon": "category_layer_height", + "description": "All settings that influence the resolution of the print. These settings have a large impact on the quality (and print time)", + "children": + { + "layer_height": + { + "label": "Layer Height", + "description": "The height of each layer in mm. Higher values produce faster prints in lower resolution, lower values produce slower prints in higher resolution.", + "unit": "mm", + "type": "float", + "default_value": 0.1, + "minimum_value": "0.001", + "minimum_value_warning": "0.04", + "maximum_value_warning": "0.8 * machine_nozzle_size", + "settable_per_mesh": false, + "settable_per_extruder": false + }, + "layer_height_0": + { + "label": "Initial Layer Height", + "description": "The height of the initial layer in mm. A thicker initial layer makes adhesion to the build plate easier.", + "unit": "mm", + "type": "float", + "default_value": 0.3, + "minimum_value": "0.001", + "minimum_value_warning": "0.04", + "maximum_value_warning": "0.8 * machine_nozzle_size", + "settable_per_mesh": false, + "settable_per_extruder": false + }, + "line_width": + { + "label": "Line Width", + "description": "Width of a single line. Generally, the width of each line should correspond to the width of the nozzle. However, slightly reducing this value could produce better prints.", + "unit": "mm", + "minimum_value": "0.0001", + "minimum_value_warning": "0.2", + "maximum_value_warning": "2 * machine_nozzle_size", + "default_value": 0.4, + "type": "float", + "value": "machine_nozzle_size", + "settable_per_mesh": true, + "children": + { + "wall_line_width": + { + "label": "Wall Line Width", + "description": "Width of a single wall line.", + "unit": "mm", + "minimum_value": "0.0001", + "minimum_value_warning": "0.2", + "maximum_value_warning": "5", + "value":"line_width", + "default_value": 0.4, + "type": "float", + "settable_per_mesh": true, + "children": + { + "wall_line_width_0": + { + "label": "Outer Wall Line Width", + "description": "Width of the outermost wall line. By lowering this value, higher levels of detail can be printed.", + "unit": "mm", + "minimum_value": "0.0001", + "minimum_value_warning": "0.2", + "maximum_value_warning": "5", + "default_value": 0.4, + "value":"wall_line_width", + "type": "float", + "settable_per_mesh": true + }, + "wall_line_width_x": + { + "label": "Inner Wall(s) Line Width", + "description": "Width of a single wall line for all wall lines except the outermost one.", + "unit": "mm", + "minimum_value": "0.0001", + "minimum_value_warning": "0.2", + "maximum_value_warning": "5", + "default_value": 0.4, + "value":"wall_line_width", + "type": "float", + "settable_per_mesh": true + } + } + }, + "skin_line_width": + { + "label": "Top/bottom Line Width", + "description": "Width of a single top/bottom line.", + "unit": "mm", + "minimum_value": "0.0001", + "minimum_value_warning": "0.2", + "maximum_value_warning": "5", + "default_value": 0.4, + "type": "float", + "value": "line_width", + "settable_per_mesh": true + }, + "infill_line_width": + { + "label": "Infill Line Width", + "description": "Width of a single infill line.", + "unit": "mm", + "minimum_value": "0.0001", + "minimum_value_warning": "0.2", + "maximum_value_warning": "5", + "default_value": 0.4, + "type": "float", + "value": "line_width", + "settable_per_mesh": true + }, + "skirt_line_width": + { + "label": "Skirt Line Width", + "description": "Width of a single skirt line.", + "unit": "mm", + "minimum_value": "0.0001", + "minimum_value_warning": "0.2", + "maximum_value_warning": "5", + "default_value": 0.4, + "type": "float", + "value": "line_width", + "settable_per_mesh": false, + "settable_per_extruder": true + }, + "support_line_width": + { + "label": "Support Line Width", + "description": "Width of a single support structure line.", + "unit": "mm", + "minimum_value": "0.0001", + "minimum_value_warning": "0.2", + "maximum_value_warning": "5", + "default_value": 0.4, + "type": "float", + "enabled": "support_enable", + "value": "line_width", + "settable_per_mesh": false, + "settable_per_extruder": false + }, + "support_roof_line_width": + { + "label": "Support Roof Line Width", + "description": "Width of a single support roof line.", + "unit": "mm", + "default_value": 0.4, + "minimum_value": "0.0001", + "maximum_value_warning": "machine_nozzle_size * 2", + "type": "float", + "enabled": "support_roof_enable", + "value": "line_width", + "settable_per_mesh": false, + "settable_per_extruder": false + }, + "prime_tower_line_width": + { + "label": "Prime Tower Line Width", + "description": "Width of a single prime tower line.", + "type": "float", + "unit": "mm", + "enabled": "prime_tower_enable", + "default_value": 0.4, + "value": "line_width", + "minimum_value": "0.0001", + "minimum_value_warning": "0.2", + "maximum_value_warning": "5", + "settable_per_mesh": false, + "settable_per_extruder": true + } + } + } + } + }, + "shell": + { + "label": "Shell", + "icon": "category_shell", + "description": "Shell", + "type": "category", + "children": + { + "wall_thickness": + { + "label": "Wall Thickness", + "description": "The thickness of the outside walls in the horizontal direction. This value divided by the wall line width defines the number of walls.", + "unit": "mm", + "default_value": 0.8, + "minimum_value": "0", + "minimum_value_warning": "line_width", + "maximum_value_warning": "5 * line_width", + "type": "float", + "settable_per_mesh": true, + "children": + { + "wall_line_count": + { + "label": "Wall Line Count", + "description": "The number of walls. When calculated by the wall thickness, this value is rounded to a whole number.", + "default_value": 2, + "minimum_value": "0", + "type": "int", + "value": "1 if magic_spiralize else max(1, round((wall_thickness - wall_line_width_0) / wall_line_width_x) + 1)", + "settable_per_mesh": true + } + } + }, + "top_bottom_thickness": + { + "label": "Top/Bottom Thickness", + "description": "The thickness of the top/bottom layers in the print. This value divided by the layer height defines the number of top/bottom layers.", + "unit": "mm", + "default_value": 0.8, + "minimum_value": "0", + "minimum_value_warning": "0.6", + "type": "float", + "settable_per_mesh": true, + "children": + { + "top_thickness": + { + "label": "Top Thickness", + "description": "The thickness of the top layers in the print. This value divided by the layer height defines the number of top layers.", + "unit": "mm", + "default_value": 0.8, + "minimum_value": "0", + "maximum_value_warning": "100", + "type": "float", + "value": "top_bottom_thickness", + "settable_per_mesh": true, + "children": + { + "top_layers": + { + "label": "Top Layers", + "description": "The number of top layers. When calculated by the top thickness, this value is rounded to a whole number.", + "default_value": 8, + "minimum_value": "0", + "maximum_value_warning": "100", + "type": "int", + "value": "0 if infill_sparse_density == 100 else math.ceil(round(top_thickness / layer_height, 4))", + "settable_per_mesh": true + } + } + }, + "bottom_thickness": + { + "label": "Bottom Thickness", + "description": "The thickness of the bottom layers in the print. This value divided by the layer height defines the number of bottom layers.", + "unit": "mm", + "default_value": 0.6, + "minimum_value": "0", + "type": "float", + "value": "top_bottom_thickness", + "settable_per_mesh": true, + "children": + { + "bottom_layers": + { + "label": "Bottom Layers", + "description": "The number of bottom layers. When calculated by the bottom thickness, this value is rounded to a whole number.", + "minimum_value": "0", + "default_value": 6, + "type": "int", + "value": "999999 if infill_sparse_density == 100 else math.ceil(round(bottom_thickness / layer_height, 4))", + "settable_per_mesh": true + } + } + } + } + }, + "top_bottom_pattern": + { + "label": "Top/Bottom Pattern", + "description": "The pattern of the top/bottom layers.", + "type": "enum", + "options": + { + "lines": "Lines", + "concentric": "Concentric", + "zigzag": "Zig Zag" + }, + "default_value": "lines", + "settable_per_mesh": true + }, + "wall_0_inset": + { + "label": "Outer Wall Inset", + "description": "Inset applied to the path of the outer wall. If the outer wall is smaller than the nozzle, and printed after the inner walls, use this offset to get the hole in the nozzle to overlap with the inner walls instead of the outside of the object.", + "unit": "mm", + "type": "float", + "default_value": 0.0, + "value": "(machine_nozzle_size - wall_line_width_0) / 2 if wall_line_width_0 < machine_nozzle_size else 0", + "minimum_value_warning": "0", + "maximum_value_warning": "machine_nozzle_size", + "settable_per_mesh": true + }, + "alternate_extra_perimeter": + { + "label": "Alternate Extra Wall", + "description": "Prints an extra wall at every other layer. This way infill gets caught between these extra walls, resulting in stronger prints.", + "type": "bool", + "default_value": false, + "settable_per_mesh": true + }, + "travel_compensate_overlapping_walls_enabled": + { + "label": "Compensate Wall Overlaps", + "description": "Compensate the flow for parts of a wall being printed where there is already a wall in place.", + "type": "bool", + "default_value": true, + "settable_per_mesh": true, + "children": + { + "travel_compensate_overlapping_walls_0_enabled": { + "label": "Compensate Outer Wall Overlaps", + "description": "Compensate the flow for parts of an outer wall being printed where there is already a wall in place.", + "type": "bool", + "default_value": true, + "value": "travel_compensate_overlapping_walls_enabled", + "settable_per_mesh": true + }, + "travel_compensate_overlapping_walls_x_enabled": { + "label": "Compensate Inner Wall Overlaps", + "description": "Compensate the flow for parts of an inner wall being printed where there is already a wall in place.", + "type": "bool", + "default_value": true, + "value": "travel_compensate_overlapping_walls_enabled", + "settable_per_mesh": true + } + } + }, + "xy_offset": + { + "label": "Horizontal Expansion", + "description": "Amount of offset applied to all polygons in each layer. Positive values can compensate for too big holes; negative values can compensate for too small holes.", + "unit": "mm", + "type": "float", + "minimum_value_warning": "-10", + "maximum_value_warning": "10", + "default_value": 0, + "settable_per_mesh": true + }, + "z_seam_type": + { + "label": "Z Seam Alignment", + "description": "Starting point of each path in a layer. When paths in consecutive layers start at the same point a vertical seam may show on the print. When aligning these at the back, the seam is easiest to remove. When placed randomly the inaccuracies at the paths' start will be less noticeable. When taking the shortest path the print will be quicker.", + "type": "enum", + "options": + { + "back": "Back", + "shortest": "Shortest", + "random": "Random" + }, + "default_value": "shortest", + "settable_per_mesh": true + }, + "skin_no_small_gaps_heuristic": + { + "label": "Ignore Small Z Gaps", + "description": "When the model has small vertical gaps, about 5% extra computation time can be spent on generating top and bottom skin in these narrow spaces. In such case, disable the setting.", + "type": "bool", + "default_value": true, + "settable_per_mesh": true + } + } + }, + "infill": + { + "label": "Infill", + "icon": "category_infill", + "description": "Infill", + "type": "category", + "children": + { + "infill_sparse_density": + { + "label": "Infill Density", + "description": "Adjusts the density of infill of the print.", + "unit": "%", + "type": "float", + "default_value": 20, + "minimum_value": "0", + "maximum_value_warning": "100", + "settable_per_mesh": true, + "children": + { + "infill_line_distance": + { + "label": "Infill Line Distance", + "description": "Distance between the printed infill lines. This setting is calculated by the infill density and the infill line width.", + "unit": "mm", + "type": "float", + "default_value": 2, + "minimum_value": "0", + "value": "0 if infill_sparse_density == 0 else (infill_line_width * 100) / infill_sparse_density * (2 if infill_pattern == \"grid\" else (3 if infill_pattern == \"triangles\" else 1))", + "settable_per_mesh": true + } + } + }, + "infill_pattern": + { + "label": "Infill Pattern", + "description": "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle and concentric patterns are fully printed every layer.", + "type": "enum", + "options": + { + "grid": "Grid", + "lines": "Lines", + "triangles": "Triangles", + "concentric": "Concentric", + "zigzag": "Zig Zag" + }, + "default_value": "grid", + "value": "'lines' if infill_sparse_density > 25 else 'grid'", + "settable_per_mesh": true + }, + "infill_overlap": + { + "label": "Infill Overlap Percentage", + "description": "The amount of overlap between the infill and the walls. A slight overlap allows the walls to connect firmly to the infill.", + "unit": "%", + "type": "float", + "default_value": 10, + "value": "10 if infill_sparse_density < 95 and infill_pattern != 'concentric' else 0", + "minimum_value_warning": "-50", + "maximum_value_warning": "100", + "enabled": "infill_pattern != 'concentric'", + "settable_per_mesh": true, + "children": + { + "infill_overlap_mm": + { + "label": "Infill Overlap", + "description": "The amount of overlap between the infill and the walls. A slight overlap allows the walls to connect firmly to the infill.", + "unit": "mm", + "type": "float", + "default_value": 0.04, + "minimum_value_warning": "-0.5 * machine_nozzle_size", + "maximum_value_warning": "machine_nozzle_size", + "value": "infill_line_width * infill_overlap / 100 if infill_sparse_density < 95 and infill_pattern != 'concentric' else 0", + "enabled": "infill_pattern != 'concentric'", + "settable_per_mesh": true + } + } + }, + "skin_overlap": { + "label": "Skin Overlap Percentage", + "description": "The amount of overlap between the skin and the walls. A slight overlap allows the walls to connect firmly to the skin.", + "unit": "%", + "type": "float", + "default_value": 5, + "minimum_value_warning": "-50", + "maximum_value_warning": "100", + "value": "5 if top_bottom_pattern != 'concentric' else 0", + "enabled": "top_bottom_pattern != 'concentric'", + "settable_per_mesh": true, + "children": { + "skin_overlap_mm": { + "label": "Skin Overlap", + "description": "The amount of overlap between the skin and the walls. A slight overlap allows the walls to connect firmly to the skin.", + "unit": "mm", + "type": "float", + "default_value": 0.02, + "minimum_value_warning": "-0.5 * machine_nozzle_size", + "maximum_value_warning": "machine_nozzle_size", + "value": "skin_line_width * skin_overlap / 100 if top_bottom_pattern != 'concentric' else 0", + "enabled": "top_bottom_pattern != 'concentric'", + "settable_per_mesh": true + } + } + }, + "infill_wipe_dist": + { + "label": "Infill Wipe Distance", + "description": "Distance of a travel move inserted after every infill line, to make the infill stick to the walls better. This option is similar to infill overlap, but without extrusion and only on one end of the infill line.", + "unit": "mm", + "type": "float", + "default_value": 0.04, + "value": "wall_line_width_0 / 4 if wall_line_count == 1 else wall_line_width_x / 4", + "minimum_value_warning": "0", + "maximum_value_warning": "machine_nozzle_size", + "settable_per_mesh": true + }, + "infill_sparse_thickness": + { + "label": "Infill Layer Thickness", + "description": "The thickness per layer of infill material. This value should always be a multiple of the layer height and is otherwise rounded.", + "unit": "mm", + "type": "float", + "default_value": 0.1, + "minimum_value": "0.0001", + "maximum_value_warning": "0.32", + "maximum_value": "layer_height * 8", + "value": "layer_height", + "settable_per_mesh": true + }, + "infill_before_walls": + { + "label": "Infill Before Walls", + "description": "Print the infill before printing the walls. Printing the walls first may lead to more accurate walls, but overhangs print worse. Printing the infill first leads to sturdier walls, but the infill pattern might sometimes show through the surface.", + "type": "bool", + "default_value": true, + "settable_per_mesh": true + } + } + }, + "material": + { + "label": "Material", + "icon": "category_material", + "description": "Material", + "type": "category", + "children": + { + "material_flow_dependent_temperature": + { + "label": "Auto Temperature", + "description": "Change the temperature for each layer automatically with the average flow speed of that layer.", + "type": "bool", + "default_value": false, + "enabled": "False", + "settable_per_mesh": false, + "settable_per_extruder": true + }, + "material_print_temperature": + { + "label": "Printing Temperature", + "description": "The temperature used for printing. Set at 0 to pre-heat the printer manually.", + "unit": "°C", + "type": "float", + "default_value": 210, + "minimum_value": "0", + "maximum_value_warning": "260", + "enabled": "not (material_flow_dependent_temperature)", + "settable_per_mesh": false, + "settable_per_extruder": true + }, + "material_flow_temp_graph": + { + "label": "Flow Temperature Graph", + "description": "Data linking material flow (in mm3 per second) to temperature (degrees Celsius).", + "unit": "", + "type": "str", + "default_value": "[[3.5,200],[7.0,240]]", + "enabled": "False", + "comments": "old enabled function: material_flow_dependent_temperature", + "settable_per_mesh": false, + "settable_per_extruder": true + }, + "material_extrusion_cool_down_speed": { + "label": "Extrusion Cool Down Speed Modifier", + "description": "The extra speed by which the nozzle cools while extruding. The same value is used to signify the heat up speed lost when heating up while extruding.", + "unit": "°C/s", + "type": "float", + "default_value": 0.5, + "minimum_value": "0", + "maximum_value_warning": "10.0", + "enabled": "False", + "comments": "old enabled function: material_flow_dependent_temperature or machine_extruder_count > 1", + "settable_per_mesh": false, + "settable_per_extruder": true + }, + "material_bed_temperature": { + "label": "Bed Temperature", + "description": "The temperature used for the heated bed. Set at 0 to pre-heat the printer manually.", + "unit": "°C", + "type": "float", + "default_value": 60, + "minimum_value": "0", + "maximum_value_warning": "260", + "enabled": "machine_heated_bed", + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false + }, + "material_diameter": { + "label": "Diameter", + "description": "Adjusts the diameter of the filament used. Match this value with the diameter of the used filament.", + "unit": "mm", + "type": "float", + "default_value": 2.85, + "minimum_value": "0.0001", + "minimum_value_warning": "0.4", + "maximum_value_warning": "3.5", + "settable_per_mesh": false, + "settable_per_extruder": true + }, + "material_flow": { + "label": "Flow", + "description": "Flow compensation: the amount of material extruded is multiplied by this value.", + "unit": "%", + "default_value": 100, + "type": "float", + "minimum_value": "5", + "minimum_value_warning": "50", + "maximum_value_warning": "150", + "settable_per_mesh": true + }, + "retraction_enable": { + "label": "Enable Retraction", + "description": "Retract the filament when the nozzle is moving over a non-printed area. ", + "type": "bool", + "default_value": true, + "settable_per_mesh": true + }, + "retraction_amount": { + "label": "Retraction Distance", + "description": "The length of material retracted during a retraction move.", + "unit": "mm", + "type": "float", + "default_value": 6.5, + "minimum_value_warning": "-0.0001", + "maximum_value_warning": "10.0", + "enabled": "retraction_enable", + "settable_per_mesh": true + }, + "retraction_speed": { + "label": "Retraction Speed", + "description": "The speed at which the filament is retracted and primed during a retraction move.", + "unit": "mm/s", + "type": "float", + "default_value": 25, + "minimum_value": "0", + "maximum_value": "299792458000", + "maximum_value_warning": "100", + "enabled": "retraction_enable", + "settable_per_mesh": true, + "children": { + "retraction_retract_speed": { + "label": "Retraction Retract Speed", + "description": "The speed at which the filament is retracted during a retraction move.", + "unit": "mm/s", + "type": "float", + "default_value": 25, + "minimum_value": "0", + "maximum_value": "299792458000", + "maximum_value_warning": "100", + "enabled": "retraction_enable", + "value": "retraction_speed", + "settable_per_mesh": true + }, + "retraction_prime_speed": { + "label": "Retraction Prime Speed", + "description": "The speed at which the filament is primed during a retraction move.", + "unit": "mm/s", + "type": "float", + "default_value": 25, + "minimum_value": "0", + "maximum_value": "299792458000", + "maximum_value_warning": "100", + "enabled": "retraction_enable", + "value": "retraction_speed", + "settable_per_mesh": true + } + } + }, + "retraction_extra_prime_amount": { + "label": "Retraction Extra Prime Amount", + "description": "Some material can ooze away during a travel move, which can be compensated for here.", + "unit": "mm³", + "type": "float", + "default_value": 0, + "minimum_value_warning": "-0.0001", + "maximum_value_warning": "5.0", + "enabled": "retraction_enable", + "settable_per_mesh": true + }, + "retraction_min_travel": { + "label": "Retraction Minimum Travel", + "description": "The minimum distance of travel needed for a retraction to happen at all. This helps to get fewer retractions in a small area.", + "unit": "mm", + "type": "float", + "default_value": 1.5, + "value": "line_width * 2", + "minimum_value": "0", + "maximum_value_warning": "10", + "enabled": "retraction_enable", + "settable_per_mesh": true + }, + "retraction_count_max": { + "label": "Maximum Retraction Count", + "description": "This setting limits the number of retractions occurring within the minimum extrusion distance window. Further retractions within this window will be ignored. This avoids retracting repeatedly on the same piece of filament, as that can flatten the filament and cause grinding issues.", + "default_value": 90, + "minimum_value": "0", + "maximum_value_warning": "100", + "type": "int", + "enabled": "retraction_enable", + "settable_per_mesh": true + }, + "retraction_extrusion_window": { + "label": "Minimum Extrusion Distance Window", + "description": "The window in which the maximum retraction count is enforced. This value should be approximately the same as the retraction distance, so that effectively the number of times a retraction passes the same patch of material is limited.", + "unit": "mm", + "type": "float", + "default_value": 4.5, + "minimum_value": "0", + "maximum_value_warning": "retraction_amount * 2", + "value": "retraction_amount", + "enabled": "retraction_enable", + "settable_per_mesh": true + }, + "retraction_hop": { + "label": "Z Hop when Retracting", + "description": "Whenever a retraction is done, the build plate is lowered to create clearance between the nozzle and the print. It prevents the nozzle from hitting the print during travel moves, reducing the chance to knock the print from the build plate.", + "unit": "mm", + "type": "float", + "default_value": 0, + "minimum_value_warning": "-0.0001", + "maximum_value_warning": "10", + "enabled": "retraction_enable", + "settable_per_mesh": true + }, + "material_standby_temperature": + { + "label": "Standby Temperature", + "description": "The temperature of the nozzle when another nozzle is currently used for printing.", + "type": "float", + "unit": "°C", + "default_value": 150, + "minimum_value": "0", + "maximum_value_warning": "260", + "settable_per_mesh": false, + "settable_per_extruder": true + }, + "switch_extruder_retraction_amount": + { + "label": "Nozzle Switch Retraction Distance", + "description": "The amount of retraction: Set at 0 for no retraction at all. This should generally be the same as the length of the heat zone.", + "type": "float", + "unit": "mm", + "enabled": "retraction_enable", + "default_value": 20, + "value": "machine_heat_zone_length", + "minimum_value_warning": "0", + "maximum_value_warning": "100", + "settable_per_mesh": false, + "settable_per_extruder": true + }, + "switch_extruder_retraction_speeds": + { + "label": "Nozzle Switch Retraction Speed", + "description": "The speed at which the filament is retracted. A higher retraction speed works better, but a very high retraction speed can lead to filament grinding.", + "type": "float", + "unit": "mm/s", + "enabled": "retraction_enable", + "default_value": 20, + "minimum_value": "0.1", + "maximum_value_warning": "300", + "settable_per_mesh": false, + "settable_per_extruder": true, + "children": + { + "switch_extruder_retraction_speed": + { + "label": "Nozzle Switch Retract Speed", + "description": "The speed at which the filament is retracted during a nozzle switch retract.", + "type": "float", + "unit": "mm/s", + "enabled": "retraction_enable", + "default_value": 20, + "value": "switch_extruder_retraction_speeds", + "minimum_value": "0.1", + "maximum_value_warning": "300", + "settable_per_mesh": false, + "settable_per_extruder": true + }, + "switch_extruder_prime_speed": + { + "label": "Nozzle Switch Prime Speed", + "description": "The speed at which the filament is pushed back after a nozzle switch retraction.", + "type": "float", + "unit": "mm/s", + "enabled": "retraction_enable", + "default_value": 20, + "value": "switch_extruder_retraction_speeds", + "minimum_value": "0.1", + "maximum_value_warning": "300", + "settable_per_mesh": false, + "settable_per_extruder": true + } + } + }, + "switch_extruder_retraction_hop": + { + "label": "Nozzle Switch Z Hop", + "description": "Whenever the machine switches to another nozzle, the build plate is lowered to create clearance between the nozzle and the print. It prevents the nozzle which has been unused for a while from oozing material on the outside of the print.", + "type": "float", + "unit": "mm", + "default_value": 1, + "minimum_value_warning": "-0.0001", + "maximum_value_warning": "10", + "enabled": "retraction_enable", + "settable_per_mesh": false, + "settable_per_extruder": true + } + } + }, + "speed": + { + "label": "Speed", + "icon": "category_speed", + "description": "Speed", + "type": "category", + "children": + { + "speed_print": + { + "label": "Print Speed", + "description": "The speed at which printing happens.", + "unit": "mm/s", + "type": "float", + "minimum_value": "0.1", + "maximum_value_warning": "150", + "maximum_value": "299792458000", + "default_value": 60, + "settable_per_mesh": true, + "children": + { + "speed_infill": + { + "label": "Infill Speed", + "description": "The speed at which infill is printed.", + "unit": "mm/s", + "type": "float", + "minimum_value": "0.1", + "maximum_value": "299792458000", + "maximum_value_warning": "150", + "default_value": 60, + "value": "speed_print", + "settable_per_mesh": true + }, + "speed_wall": + { + "label": "Wall Speed", + "description": "The speed at which the walls are printed.", + "unit": "mm/s", + "type": "float", + "minimum_value": "0.1", + "maximum_value": "299792458000", + "maximum_value_warning": "150", + "default_value": 30, + "value": "speed_print / 2", + "settable_per_mesh": true, + "children": + { + "speed_wall_0": + { + "label": "Outer Wall Speed", + "description": "The speed at which the outermost walls are printed. Printing the outer wall at a lower speed improves the final skin quality. However, having a large difference between the inner wall speed and the outer wall speed will affect quality in a negative way.", + "unit": "mm/s", + "type": "float", + "minimum_value": "0.1", + "maximum_value": "299792458000", + "maximum_value_warning": "150", + "default_value": 30, + "value": "speed_wall", + "settable_per_mesh": true + }, + "speed_wall_x": + { + "label": "Inner Wall Speed", + "description": "The speed at which all inner walls are printed. Printing the inner wall faster than the outer wall will reduce printing time. It works well to set this in between the outer wall speed and the infill speed.", + "unit": "mm/s", + "type": "float", + "minimum_value": "0.1", + "maximum_value": "299792458000", + "maximum_value_warning": "150", + "default_value": 60, + "value": "speed_wall * 2", + "settable_per_mesh": true + } + } + }, + "speed_topbottom": + { + "label": "Top/Bottom Speed", + "description": "The speed at which top/bottom layers are printed.", + "unit": "mm/s", + "type": "float", + "minimum_value": "0.1", + "maximum_value": "299792458000", + "maximum_value_warning": "150", + "default_value": 30, + "value": "speed_print / 2", + "settable_per_mesh": true + }, + "speed_support": + { + "label": "Support Speed", + "description": "The speed at which the support structure is printed. Printing support at higher speeds can greatly reduce printing time. The surface quality of the support structure is not important since it is removed after printing.", + "unit": "mm/s", + "type": "float", + "minimum_value": "0.1", + "maximum_value": "299792458000", + "maximum_value_warning": "150", + "default_value": 60, + "value": "speed_print", + "enabled": "support_roof_enable", + "settable_per_mesh": false, + "settable_per_extruder": false, + "children": + { + "speed_support_infill": + { + "label": "Support Infill Speed", + "description": "The speed at which the infill of support is printed. Printing the infill at lower speeds improves stability.", + "unit": "mm/s", + "type": "float", + "default_value": 60, + "minimum_value": "0.1", + "maximum_value": "299792458000", + "maximum_value_warning": "150", + "value": "speed_support", + "enabled": "support_enable", + "settable_per_mesh": false, + "settable_per_extruder": false + }, + "speed_support_roof": + { + "label": "Support Roof Speed", + "description": "The speed at which the roofs of support are printed. Printing the support roof at lower speeds can improve overhang quality.", + "unit": "mm/s", + "type": "float", + "default_value": 40, + "minimum_value": "0.1", + "maximum_value": "299792458000", + "maximum_value_warning": "150", + "enabled": "support_roof_enable and support_enable", + "value": "speed_support / 1.5", + "settable_per_mesh": false, + "settable_per_extruder": false + } + } + }, + "speed_prime_tower": + { + "label": "Prime Tower Speed", + "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": "prime_tower_enable", + "default_value": 60, + "value": "speed_print", + "minimum_value": "0.1", + "maximum_value_warning": "150", + "settable_per_mesh": false, + "settable_per_extruder": true + } + } + }, + "speed_travel": + { + "label": "Travel Speed", + "description": "The speed at which travel moves are made.", + "unit": "mm/s", + "type": "float", + "default_value": 120, + "minimum_value": "0.1", + "maximum_value": "299792458000", + "maximum_value_warning": "300", + "value": "speed_print if magic_spiralize else 120", + "settable_per_mesh": false, + "settable_per_extruder": true + }, + "speed_layer_0": { + "label": "Initial Layer Speed", + "description": "The print speed for the initial layer. A lower value is advised to improve adhesion to the build plate.", + "unit": "mm/s", + "type": "float", + "default_value": 30, + "minimum_value": "0.1", + "maximum_value": "299792458000", + "maximum_value_warning": "300", + "settable_per_mesh": true + }, + "skirt_speed": { + "label": "Skirt Speed", + "description": "The speed at which the skirt and brim are printed. Normally this is done at the initial layer speed, but sometimes you might want to print the skirt at a different speed.", + "unit": "mm/s", + "type": "float", + "default_value": 30, + "minimum_value": "0.1", + "maximum_value": "299792458000", + "maximum_value_warning": "300", + "value": "speed_layer_0", + "settable_per_mesh": false, + "settable_per_extruder": true + }, + "speed_slowdown_layers": + { + "label": "Number of Slower Layers", + "description": "The first few layers are printed slower than the rest of the object, to get better adhesion to the build plate and improve the overall success rate of prints. The speed is gradually increased over these layers.", + "type": "int", + "default_value": 2, + "minimum_value": "0", + "maximum_value": "299792458000", + "maximum_value_warning": "300", + "settable_per_mesh": false, + "settable_per_extruder": false + }, + + + "acceleration_enabled": { + "label": "Enable Acceleration Control", + "description": "Enables adjusting the print head acceleration. Increasing the accelerations can reduce printing time at the cost of print quality.", + "type": "bool", + "default_value": false, + "settable_per_mesh": false, + "settable_per_extruder": false + }, + "acceleration_print": { + "label": "Print Acceleration", + "description": "The acceleration with which printing happens.", + "unit": "mm/s²", + "type": "float", + "minimum_value": "0.1", + "minimum_value_warning": "100", + "maximum_value_warning": "10000", + "default_value": 3000, + "enabled": "acceleration_enabled", + "settable_per_mesh": true, + "children": { + "acceleration_infill": { + "label": "Infill Acceleration", + "description": "The acceleration with which infill is printed.", + "unit": "mm/s²", + "type": "float", + "minimum_value": "0.1", + "minimum_value_warning": "100", + "maximum_value_warning": "10000", + "default_value": 3000, + "value": "acceleration_print", + "enabled": "acceleration_enabled", + "settable_per_mesh": true + }, + "acceleration_wall": { + "label": "Wall Acceleration", + "description": "The acceleration with which the walls are printed.", + "unit": "mm/s²", + "type": "float", + "minimum_value": "0.1", + "minimum_value_warning": "100", + "maximum_value_warning": "10000", + "default_value": 3000, + "value": "acceleration_print", + "enabled": "acceleration_enabled", + "settable_per_mesh": true, + "children": { + "acceleration_wall_0": { + "label": "Outer Wall Acceleration", + "description": "The acceleration with which the outermost walls are printed.", + "unit": "mm/s²", + "type": "float", + "minimum_value": "0.1", + "minimum_value_warning": "100", + "maximum_value_warning": "10000", + "default_value": 3000, + "value": "acceleration_wall", + "enabled": "acceleration_enabled", + "settable_per_mesh": true + }, + "acceleration_wall_x": { + "label": "Inner Wall Acceleration", + "description": "The acceleration with which all inner walls are printed.", + "unit": "mm/s²", + "type": "float", + "minimum_value": "0.1", + "minimum_value_warning": "100", + "maximum_value_warning": "10000", + "default_value": 3000, + "value": "acceleration_wall", + "enabled": "acceleration_enabled", + "settable_per_mesh": true + } + } + }, + "acceleration_topbottom": { + "label": "Top/Bottom Acceleration", + "description": "The acceleration with which top/bottom layers are printed.", + "unit": "mm/s²", + "type": "float", + "minimum_value": "0.1", + "minimum_value_warning": "100", + "maximum_value_warning": "10000", + "default_value": 3000, + "value": "acceleration_print", + "enabled": "acceleration_enabled", + "settable_per_mesh": true + }, + "acceleration_support": { + "label": "Support Acceleration", + "description": "The acceleration with which the support structure is printed.", + "unit": "mm/s²", + "type": "float", + "minimum_value": "0.1", + "minimum_value_warning": "100", + "maximum_value_warning": "10000", + "default_value": 3000, + "value": "acceleration_print", + "enabled": "acceleration_enabled and support_roof_enable", + "settable_per_mesh": false, + "settable_per_extruder": false, + "children": { + "acceleration_support_infill": { + "label": "Support Infill Acceleration", + "description": "The acceleration with which the infill of support is printed.", + "unit": "mm/s²", + "type": "float", + "default_value": 3000, + "value": "acceleration_support", + "minimum_value": "0.1", + "minimum_value_warning": "100", + "maximum_value_warning": "10000", + "enabled": "acceleration_enabled and support_enable", + "settable_per_mesh": false, + "settable_per_extruder": false + }, + "acceleration_support_roof": { + "label": "Support Roof Acceleration", + "description": "The acceleration with which the roofs of support are printed. Printing the support roof at lower accelerations can improve overhang quality.", + "unit": "mm/s²", + "type": "float", + "default_value": 3000, + "value": "acceleration_support", + "minimum_value": "0.1", + "minimum_value_warning": "100", + "maximum_value_warning": "10000", + "enabled": "acceleration_enabled and support_roof_enable", + "settable_per_mesh": false, + "settable_per_extruder": false + } + } + }, + "acceleration_prime_tower": { + "label": "Prime Tower Acceleration", + "description": "The acceleration with which the prime tower is printed.", + "unit": "mm/s²", + "type": "float", + "minimum_value": "0.1", + "minimum_value_warning": "100", + "maximum_value_warning": "10000", + "default_value": 3000, + "value": "acceleration_print", + "enabled": "prime_tower_enable and acceleration_enabled", + "settable_per_mesh": false + } + } + }, + "acceleration_travel": { + "label": "Travel Acceleration", + "description": "The acceleration with which travel moves are made.", + "unit": "mm/s²", + "type": "float", + "default_value": 5000, + "minimum_value": "0.1", + "minimum_value_warning": "100", + "maximum_value_warning": "10000", + "value": "acceleration_print if magic_spiralize else 5000", + "enabled": "acceleration_enabled", + "settable_per_mesh": false + }, + "acceleration_layer_0": { + "label": "Initial Layer Acceleration", + "description": "The acceleration for the initial layer.", + "unit": "mm/s²", + "type": "float", + "default_value": 3000, + "value": "acceleration_print", + "minimum_value": "0.1", + "minimum_value_warning": "100", + "maximum_value_warning": "10000", + "enabled": "acceleration_enabled", + "settable_per_mesh": true + }, + "acceleration_skirt": { + "label": "Skirt Acceleration", + "description": "The acceleration with which the skirt and brim are printed. Normally this is done with the initial layer acceleration, but sometimes you might want to print the skirt at a different acceleration.", + "unit": "mm/s²", + "type": "float", + "default_value": 3000, + "value": "acceleration_layer_0", + "minimum_value": "0.1", + "minimum_value_warning": "100", + "maximum_value_warning": "10000", + "enabled": "acceleration_enabled", + "settable_per_mesh": false + }, + + + + "jerk_enabled": { + "label": "Enable Jerk Control", + "description": "Enables adjusting the jerk of print head when the X or Y axis halts or starts to move. Increasing the jerk can reduce printing time at the cost of print quality.", + "type": "bool", + "default_value": false, + "settable_per_mesh": false, + "settable_per_extruder": false + }, + "jerk_print": { + "label": "Print Jerk", + "description": "The maximal allowed jerk of the print head when starting to move or when changing direction.", + "unit": "mm/s³", + "type": "float", + "minimum_value": "0.1", + "minimum_value_warning": "5", + "maximum_value_warning": "50", + "default_value": 20, + "enabled": "jerk_enabled", + "settable_per_mesh": true, + "children": { + "jerk_infill": { + "label": "Infill Jerk", + "description": "The jerk with which infill is printed.", + "unit": "mm/s³", + "type": "float", + "minimum_value": "0.1", + "minimum_value_warning": "5", + "maximum_value_warning": "50", + "default_value": 20, + "value": "jerk_print", + "enabled": "jerk_enabled", + "settable_per_mesh": true + }, + "jerk_wall": { + "label": "Wall Jerk", + "description": "The jerk with which the walls are printed.", + "unit": "mm/s³", + "type": "float", + "minimum_value": "0.1", + "minimum_value_warning": "5", + "maximum_value_warning": "50", + "default_value": 20, + "value": "jerk_print", + "enabled": "jerk_enabled", + "settable_per_mesh": true, + "children": { + "jerk_wall_0": { + "label": "Outer Wall Jerk", + "description": "The jerk with which the outermost walls are printed.", + "unit": "mm/s³", + "type": "float", + "minimum_value": "0.1", + "minimum_value_warning": "5", + "maximum_value_warning": "50", + "default_value": 20, + "value": "jerk_wall", + "enabled": "jerk_enabled", + "settable_per_mesh": true + }, + "jerk_wall_x": { + "label": "Inner Wall Jerk", + "description": "The jerk with which all inner walls are printed.", + "unit": "mm/s³", + "type": "float", + "minimum_value": "0.1", + "minimum_value_warning": "5", + "maximum_value_warning": "50", + "default_value": 20, + "value": "jerk_wall", + "enabled": "jerk_enabled", + "settable_per_mesh": true + } + } + }, + "jerk_topbottom": { + "label": "Top/Bottom Jerk", + "description": "The jerk with which top/bottom layers are printed.", + "unit": "mm/s³", + "type": "float", + "minimum_value": "0.1", + "minimum_value_warning": "5", + "maximum_value_warning": "50", + "default_value": 20, + "value": "jerk_print", + "enabled": "jerk_enabled", + "settable_per_mesh": true + }, + "jerk_support": { + "label": "Support Jerk", + "description": "The jerk with which the support structure is printed.", + "unit": "mm/s³", + "type": "float", + "minimum_value": "0.1", + "minimum_value_warning": "5", + "maximum_value_warning": "50", + "default_value": 20, + "value": "jerk_print", + "enabled": "jerk_enabled and support_roof_enable", + "settable_per_mesh": false, + "settable_per_extruder": false, + "children": { + "jerk_support_infill": { + "label": "Support Infill Jerk", + "description": "The jerk with which the infill of support is printed.", + "unit": "mm/s³", + "type": "float", + "default_value": 20, + "value": "jerk_support", + "minimum_value": "0.1", + "minimum_value_warning": "5", + "maximum_value_warning": "50", + "enabled": "jerk_enabled and support_enable", + "settable_per_mesh": false, + "settable_per_extruder": false + }, + "jerk_support_roof": { + "label": "Support Roof Jerk", + "description": "The jerk with which the roofs of support are printed.", + "unit": "mm/s³", + "type": "float", + "default_value": 20, + "value": "jerk_support", + "minimum_value": "0.1", + "minimum_value_warning": "5", + "maximum_value_warning": "50", + "enabled": "jerk_enabled and support_roof_enable", + "settable_per_mesh": false, + "settable_per_extruder": false + } + } + }, + "jerk_prime_tower": { + "label": "Prime Tower Jerk", + "description": "The jerk with which the prime tower is printed.", + "unit": "mm/s³", + "type": "float", + "minimum_value": "0.1", + "minimum_value_warning": "5", + "maximum_value_warning": "50", + "default_value": 20, + "value": "jerk_print", + "enabled": "prime_tower_enable and jerk_enabled", + "settable_per_mesh": false + } + } + }, + "jerk_travel": { + "label": "Travel Jerk", + "description": "The jerk with which travel moves are made.", + "unit": "mm/s³", + "type": "float", + "default_value": 30, + "minimum_value": "0.1", + "minimum_value_warning": "5", + "maximum_value_warning": "50", + "value": "jerk_print if magic_spiralize else 30", + "enabled": "jerk_enabled", + "settable_per_mesh": false + }, + "jerk_layer_0": { + "label": "Initial Layer Jerk", + "description": "The print jerk for the initial layer.", + "unit": "mm/s³", + "type": "float", + "default_value": 20, + "value": "jerk_print", + "minimum_value": "0.1", + "minimum_value_warning": "5", + "maximum_value_warning": "50", + "enabled": "jerk_enabled", + "settable_per_mesh": true + }, + "jerk_skirt": { + "label": "Skirt Jerk", + "description": "The jerk with which the skirt and brim are printed.", + "unit": "mm/s³", + "type": "float", + "default_value": 20, + "minimum_value": "0.1", + "minimum_value_warning": "5", + "maximum_value_warning": "50", + "value": "jerk_layer_0", + "enabled": "jerk_enabled", + "settable_per_mesh": false + } + } + }, + "travel": + { + "label": "Travel", + "icon": "category_travel", + "description": "travel", + "type": "category", + "children": + { + "retraction_combing": + { + "label": "Combing Mode", + "description": "Combing keeps the nozzle within already printed areas when traveling. This results in slightly longer travel moves but reduces the need for retractions. If combing is off, the material will retract and the nozzle moves in a straight line to the next point. It is also possible to avoid combing over top/bottom skin areas by combing within the infill only. It is also possible to avoid combing over top/bottom skin areas by combing within the infill only.", + "type": "enum", + "options": + { + "off": "Off", + "all": "All", + "noskin": "No Skin" + }, + "default_value": "all", + "settable_per_mesh": true + }, + "travel_avoid_other_parts": + { + "label": "Avoid Printed Parts when Traveling", + "description": "The nozzle avoids already printed parts when traveling. This option is only available when combing is enabled.", + "type": "bool", + "default_value": true, + "enabled": "retraction_combing != \"off\"", + "settable_per_mesh": false, + "settable_per_extruder": true + }, + "travel_avoid_distance": + { + "label": "Travel Avoid Distance", + "description": "The distance between the nozzle and already printed parts when avoiding during travel moves.", + "unit": "mm", + "type": "float", + "default_value": 0.625, + "value": "machine_nozzle_tip_outer_diameter / 2 * 1.25", + "minimum_value": "0", + "maximum_value_warning": "machine_nozzle_tip_outer_diameter * 5", + "enabled": "retraction_combing != \"off\" and travel_avoid_other_parts", + "settable_per_mesh": false, + "settable_per_extruder": true + } + } + }, + "cooling": + { + "label": "Cooling", + "icon": "category_cool", + "description": "Cooling", + "type": "category", + "children": + { + "cool_fan_enabled": + { + "label": "Enable Cooling Fans", + "description": "Enables the cooling fans while printing. The fans improve print quality on layers with short layer times and bridging / overhangs.", + "type": "bool", + "default_value": true, + "settable_per_mesh": false, + "settable_per_extruder": true + }, + "cool_fan_speed": + { + "label": "Fan Speed", + "description": "The speed at which the cooling fans spin.", + "unit": "%", + "type": "float", + "minimum_value": "0", + "maximum_value": "100", + "default_value": 100, + "value": "100.0 if cool_fan_enabled else 0.0", + "enabled": "cool_fan_enabled", + "settable_per_mesh": false, + "settable_per_extruder": true, + "children": + { + "cool_fan_speed_min": + { + "label": "Regular Fan Speed", + "description": "The speed at which the fans spin before hitting the threshold. When a layer prints faster than the threshold, the fan speed gradually inclines towards the maximum fan speed.", + "unit": "%", + "type": "float", + "minimum_value": "0", + "maximum_value": "100", + "value": "cool_fan_speed", + "default_value": 100, + "enabled": "cool_fan_enabled", + "settable_per_mesh": false, + "settable_per_extruder": true + }, + "cool_fan_speed_max": + { + "label": "Maximum Fan Speed", + "description": "The speed at which the fans spin on the minimum layer time. The fan speed gradually increases between the regular fan speed and maximum fan speed when the threshold is hit.", + "unit": "%", + "type": "float", + "minimum_value": "max(0, cool_fan_speed_min)", + "maximum_value": "100", + "default_value": 100, + "enabled": "cool_fan_enabled", + "value": "cool_fan_speed", + "settable_per_mesh": false, + "settable_per_extruder": true + } + } + }, + "cool_min_layer_time_fan_speed_max": + { + "label": "Regular/Maximum Fan Speed Threshold", + "description": "The layer time which sets the threshold between regular fan speed and maximum fan speed. Layers that print slower than this time use regular fan speed. For faster layers the fan speed gradually increases towards the maximum fan speed.", + "unit": "s", + "type": "float", + "default_value": 10, + "minimum_value": "cool_min_layer_time", + "maximum_value_warning": "600", + "settable_per_mesh": false, + "settable_per_extruder": true + }, + "cool_fan_full_at_height": + { + "label": "Regular Fan Speed at Height", + "description": "The height at which the fans spin on regular fan speed. At the layers below the fan speed gradually increases from zero to regular fan speed.", + "unit": "mm", + "type": "float", + "default_value": 0.5, + "value": "layer_height_0", + "minimum_value": "0", + "maximum_value_warning": "10.0", + "settable_per_mesh": false, + "settable_per_extruder": true, + "children": + { + "cool_fan_full_layer": + { + "label": "Regular Fan Speed at Layer", + "description": "The layer at which the fans spin on regular fan speed. If regular fan speed at height is set, this value is calculated and rounded to a whole number.", + "type": "int", + "default_value": 1, + "minimum_value": "0", + "maximum_value_warning": "100", + "value": "max(0, int(round((cool_fan_full_at_height - layer_height_0) / layer_height, 0)))", + "settable_per_mesh": false, + "settable_per_extruder": true + } + } + }, + "cool_min_layer_time": + { + "label": "Minimum Layer Time", + "description": "The minimum time spent in a layer. This forces the printer to slow down, to at least spend the time set here in one layer. This allows the printed material to cool down properly before printing the next layer.", + "unit": "s", + "type": "float", + "default_value": 5, + "minimum_value": "0", + "maximum_value_warning": "600", + "settable_per_mesh": false, + "settable_per_extruder": true + }, + "cool_min_speed": + { + "label": "Minimum Speed", + "description": "The minimum print speed, despite slowing down due to the minimum layer time. When the printer would slow down too much, the pressure in the nozzle would be too low and result in bad print quality.", + "unit": "mm/s", + "type": "float", + "default_value": 10, + "minimum_value": "0", + "maximum_value_warning": "100", + "settable_per_mesh": false, + "settable_per_extruder": true + }, + "cool_lift_head": + { + "label": "Lift Head", + "description": "When the minimum speed is hit because of minimum layer time, lift the head away from the print and wait the extra time until the minimum layer time is reached.", + "type": "bool", + "default_value": false, + "settable_per_mesh": false, + "settable_per_extruder": true + } + } + }, + "support": + { + "label": "Support", + "type": "category", + "icon": "category_support", + "description": "Support", + "children": + { + "support_enable": + { + "label": "Enable Support", + "description": "Enable support structures. These structures support parts of the model with severe overhangs.", + "type": "bool", + "default_value": false, + "settable_per_mesh": true + }, + "support_type": + { + "label": "Support Placement", + "description": "Adjusts the placement of the support structures. The placement can be set to touching build plate or everywhere. When set to everywhere the support structures will also be printed on the model.", + "type": "enum", + "options": + { + "buildplate": "Touching Buildplate", + "everywhere": "Everywhere" + }, + "default_value": "everywhere", + "enabled": "support_enable", + "settable_per_mesh": false, + "settable_per_extruder": false + }, + "support_angle": + { + "label": "Support Overhang Angle", + "description": "The minimum angle of overhangs for which support is added. At a value of 0° all overhangs are supported, 90° will not provide any support.", + "unit": "°", + "type": "float", + "minimum_value": "0", + "maximum_value": "90", + "default_value": 50, + "enabled": "support_enable", + "settable_per_mesh": true + }, + "support_pattern": + { + "label": "Support Pattern", + "description": "The pattern of the support structures of the print. The different options available result in sturdy or easy to remove support.", + "type": "enum", + "options": + { + "lines": "Lines", + "grid": "Grid", + "triangles": "Triangles", + "concentric": "Concentric", + "zigzag": "Zig Zag" + }, + "default_value": "zigzag", + "enabled": "support_enable", + "settable_per_mesh": false, + "settable_per_extruder": false + }, + "support_connect_zigzags": + { + "label": "Connect Support ZigZags", + "description": "Connect the ZigZags. This will increase the strength of the zig zag support structure.", + "type": "bool", + "default_value": true, + "enabled": "support_enable and (support_pattern == \"zigzag\")", + "settable_per_mesh": false, + "settable_per_extruder": false + }, + "support_infill_rate": + { + "label": "Support Density", + "description": "Adjusts the density of the support structure. A higher value results in better overhangs, but the supports are harder to remove.", + "unit": "%", + "type": "float", + "minimum_value": "0", + "maximum_value_warning": "100", + "default_value": 15, + "enabled": "support_enable", + "settable_per_mesh": false, + "settable_per_extruder": false, + "children": { + "support_line_distance": + { + "label": "Support Line Distance", + "description": "Distance between the printed support structure lines. This setting is calculated by the support density.", + "unit": "mm", + "type": "float", + "minimum_value": "0", + "default_value": 2.66, + "enabled": "support_enable", + "value": "(support_line_width * 100) / support_infill_rate * (2 if support_pattern == \"grid\" else (3 if support_pattern == \"triangles\" else 1))", + "settable_per_mesh": false, + "settable_per_extruder": false + } + } + }, + "support_z_distance": + { + "label": "Support Z Distance", + "description": "Distance from the top/bottom of the support structure to the print. This gap provides clearance to remove the supports after the model is printed. This value is rounded down to a multiple of the layer height.", + "unit": "mm", + "type": "float", + "minimum_value": "0", + "maximum_value_warning": "10", + "default_value": 0.15, + "enabled": "support_enable", + "settable_per_mesh": true, + "children": + { + "support_top_distance": + { + "label": "Support Top Distance", + "description": "Distance from the top of the support to the print.", + "unit": "mm", + "minimum_value": "0", + "maximum_value_warning": "10", + "default_value": 0.15, + "type": "float", + "enabled": "support_enable", + "value": "support_z_distance", + "settable_per_mesh": true + }, + "support_bottom_distance": + { + "label": "Support Bottom Distance", + "description": "Distance from the print to the bottom of the support.", + "unit": "mm", + "minimum_value": "0", + "maximum_value_warning": "10", + "default_value": 0.1, + "value": "0.1 if support_type == 'everywhere' else 0", + "type": "float", + "enabled": "support_enable and support_type == 'everywhere'", + "settable_per_mesh": true + } + } + }, + "support_xy_distance": + { + "label": "Support X/Y Distance", + "description": "Distance of the support structure from the print in the X/Y directions.", + "unit": "mm", + "type": "float", + "minimum_value": "0", + "maximum_value_warning": "10", + "default_value": 0.7, + "enabled": "support_enable", + "settable_per_mesh": true + }, + "support_xy_overrides_z": { + "label": "Support Distance Priority", + "description": "Whether the Support X/Y Distance overrides the Support Z Distance or vice versa. When X/Y overrides Z the X/Y distance can push away the support from the model, influencing the actual Z distance to the overhang. We can disable this by not applying the X/Y distance around overhangs.", + "type": "enum", + "options": { + "xy_overrides_z": "X/Y overrides Z", + "z_overrides_xy": "Z overrides X/Y" + }, + "default_value": "z_overrides_xy", + "enabled": "support_enable", + "settable_per_mesh": true + }, + "support_xy_distance_overhang": { + "label": "Minimum Support X/Y Distance", + "description": "Distance of the support structure from the overhang in the X/Y directions. ", + "unit": "mm", + "type": "float", + "minimum_value": "0", + "maximum_value_warning": "10", + "default_value": 0.2, + "value": "machine_nozzle_size / 2", + "enabled": "support_enable and support_xy_overrides_z=='z_overrides_xy'", + "settable_per_mesh": true + }, + "support_bottom_stair_step_height": + { + "label": "Support Stair Step Height", + "description": "The height of the steps of the stair-like bottom of support resting on the model. A low value makes the support harder to remove, but too high values can lead to unstable support structures.", + "unit": "mm", + "type": "float", + "default_value": 0.3, + "minimum_value": "0", + "maximum_value_warning": "1.0", + "enabled": "support_enable", + "settable_per_mesh": true + }, + "support_join_distance": + { + "label": "Support Join Distance", + "description": "The maximum distance between support structures in the X/Y directions. When seperate structures are closer together than this value, the structures merge into one.", + "unit": "mm", + "type": "float", + "default_value": 2.0, + "minimum_value_warning": "0", + "maximum_value_warning": "10", + "enabled": "support_enable", + "settable_per_mesh": true + }, + "support_offset": + { + "label": "Support Horizontal Expansion", + "description": "Amount of offset applied to all support polygons in each layer. Positive values can smooth out the support areas and result in more sturdy support.", + "unit": "mm", + "type": "float", + "default_value": 0.2, + "minimum_value_warning": "-0.5", + "maximum_value_warning": "5.0", + "enabled": "support_enable", + "settable_per_mesh": true + }, + "support_area_smoothing": + { + "label": "Support Area Smoothing", + "description": "Maximum distance in the X/Y directions of a line segment which is to be smoothed out. Ragged lines are introduced by the join distance and support bridge, which cause the machine to resonate. Smoothing the support areas won't cause them to break with the constraints, except it might change the overhang.", + "unit": "mm", + "type": "float", + "default_value": 0.6, + "minimum_value": "0", + "maximum_value_warning": "1.0", + "enabled": "support_enable", + "settable_per_mesh": true + }, + "support_roof_enable": + { + "label": "Enable Support Roof", + "description": "Generate a dense top skin at the top of the support on which the model is printed.", + "type": "bool", + "default_value": false, + "enabled": "support_enable", + "settable_per_mesh": true + }, + "support_roof_height": + { + "label": "Support Roof Thickness", + "description": "The thickness of the support roofs.", + "unit": "mm", + "type": "float", + "default_value": 1, + "minimum_value": "0", + "maximum_value_warning": "10", + "enabled": "support_roof_enable", + "settable_per_mesh": true + }, + "support_roof_density": + { + "label": "Support Roof Density", + "description": "Adjusts the density of the roof of the support structure. A higher value results in better overhangs, but the supports are harder to remove.", + "unit": "%", + "type": "float", + "default_value": 100, + "minimum_value": "0", + "maximum_value_warning": "100", + "enabled":"support_roof_enable", + "settable_per_mesh": false, + "settable_per_extruder": false, + "children": + { + "support_roof_line_distance": + { + "label": "Support Roof Line Distance", + "description": "Distance between the printed support roof lines. This setting is calculated by the support roof Density, but can be adjusted separately.", + "unit": "mm", + "type": "float", + "default_value": 0.4, + "minimum_value": "0", + "value": "0 if support_roof_density == 0 else (support_roof_line_width * 100) / support_roof_density * (2 if support_roof_pattern == \"grid\" else (3 if support_roof_pattern == \"triangles\" else 1))", + "enabled": "support_roof_enable", + "settable_per_mesh": false, + "settable_per_extruder": false + } + } + }, + "support_roof_pattern": + { + "label": "Support Roof Pattern", + "description": "The pattern with which the top of the support is printed.", + "type": "enum", + "options": + { + "lines": "Lines", + "grid": "Grid", + "triangles": "Triangles", + "concentric": "Concentric", + "zigzag": "Zig Zag" + }, + "default_value": "concentric", + "enabled": "support_roof_enable", + "settable_per_mesh": false, + "settable_per_extruder": false + }, + "support_use_towers": + { + "label": "Use Towers", + "description": "Use specialized towers to support tiny overhang areas. These towers have a larger diameter than the region they support. Near the overhang the towers' diameter decreases, forming a roof.", + "type": "bool", + "default_value": true, + "enabled": "support_enable", + "settable_per_mesh": true + }, + "support_tower_diameter": + { + "label": "Tower Diameter", + "description": "The diameter of a special tower.", + "unit": "mm", + "type": "float", + "default_value": 3.0, + "minimum_value": "0", + "maximum_value_warning": "10", + "enabled": "support_enable and support_use_towers", + "settable_per_mesh": true + }, + "support_minimal_diameter": + { + "label": "Minimum Diameter", + "description": "Minimum diameter in the X/Y directions of a small area which is to be supported by a specialized support tower.", + "unit": "mm", + "type": "float", + "default_value": 3.0, + "minimum_value": "0", + "maximum_value_warning": "10", + "maximum_value": "support_tower_diameter", + "enabled": "support_enable and support_use_towers", + "settable_per_mesh": true + }, + "support_tower_roof_angle": + { + "label": "Tower Roof Angle", + "description": "The angle of a rooftop of a tower. A higher value results in pointed tower roofs, a lower value results in flattened tower roofs.", + "unit": "°", + "type": "int", + "minimum_value": "0", + "maximum_value": "90", + "default_value": 65, + "enabled": "support_enable and support_use_towers", + "settable_per_mesh": true + } + } + }, + "platform_adhesion": + { + "label": "Platform Adhesion", + "type": "category", + "icon": "category_adhesion", + "description": "Adhesion", + "children": + { + "adhesion_type": + { + "label": "Platform Adhesion Type", + "description": "Different options that help to improve both priming your extrusion and adhesion to the build plate. Brim adds a single layer flat area around the base of your object to prevent warping. Raft adds a thick grid with a roof below the object. Skirt is a line printed around the object, but not connected to the model.", + "type": "enum", + "options": + { + "skirt": "Skirt", + "brim": "Brim", + "raft": "Raft" + }, + "default_value": "brim", + "settable_per_mesh": false, + "settable_per_extruder": false + }, + "skirt_line_count": + { + "label": "Skirt Line Count", + "description": "Multiple skirt lines help to prime your extrusion better for small objects. Setting this to 0 will disable the skirt.", + "type": "int", + "default_value": 1, + "minimum_value": "0", + "maximum_value_warning": "10", + "enabled": "adhesion_type == \"skirt\"", + "settable_per_mesh": false, + "settable_per_extruder": true + }, + "skirt_gap": + { + "label": "Skirt Distance", + "description": "The horizontal distance between the skirt and the first layer of the print.\nThis is the minimum distance, multiple skirt lines will extend outwards from this distance.", + "unit": "mm", + "type": "float", + "default_value": 3, + "minimum_value_warning": "0", + "maximum_value_warning": "100", + "enabled": "adhesion_type == \"skirt\"", + "settable_per_mesh": false, + "settable_per_extruder": true + }, + "skirt_minimal_length": + { + "label": "Skirt Minimum Length", + "description": "The minimum length of the skirt. If this length is not reached by the skirt line count, more skirt lines will be added until the minimum length is reached. Note: If the line count is set to 0 this is ignored.", + "unit": "mm", + "type": "float", + "default_value": 250, + "minimum_value": "0", + "minimum_value_warning": "25", + "maximum_value_warning": "2500", + "enabled": "adhesion_type == \"skirt\"", + "settable_per_mesh": false, + "settable_per_extruder": true + }, + "brim_width": + { + "label": "Brim Width", + "description": "The distance from the model to the outermost brim line. A larger brim enhances adhesion to the build plate, but also reduces the effective print area.", + "type": "float", + "unit": "mm", + "default_value": 8.0, + "minimum_value": "0.0", + "maximum_value_warning": "100.0", + "enabled": "adhesion_type == \"brim\"", + "settable_per_mesh": false, + "settable_per_extruder": true, + "children": + { + "brim_line_count": + { + "label": "Brim Line Count", + "description": "The number of lines used for a brim. More brim lines enhance adhesion to the build plate, but also reduces the effective print area.", + "type": "int", + "default_value": 20, + "minimum_value": "0", + "maximum_value_warning": "300", + "value": "math.ceil(brim_width / skirt_line_width)", + "enabled": "adhesion_type == \"brim\"", + "settable_per_mesh": false, + "settable_per_extruder": true + } + } + }, + "raft_margin": + { + "label": "Raft Extra Margin", + "description": "If the raft is enabled, this is the extra raft area around the object which is also given a raft. Increasing this margin will create a stronger raft while using more material and leaving less area for your print.", + "unit": "mm", + "type": "float", + "default_value": 5, + "minimum_value_warning": "0", + "maximum_value_warning": "10", + "enabled": "adhesion_type == \"raft\"" + }, + "raft_airgap": + { + "label": "Raft Air Gap", + "description": "The gap between the final raft layer and the first layer of the object. Only the first layer is raised by this amount to lower the bonding between the raft layer and the object. Makes it easier to peel off the raft.", + "unit": "mm", + "type": "float", + "default_value": 0.3, + "minimum_value": "0", + "maximum_value_warning": "1.0", + "enabled": "adhesion_type == \"raft\"", + "settable_per_mesh": false, + "settable_per_extruder": true + }, + "layer_0_z_overlap": { + "label": "Initial Layer Z Overlap", + "description": "Make the first and second layer of the object overlap in the Z direction to compensate for the filament lost in the airgap. All models above the first model layer will be shifted down by this amount.", + "unit": "mm", + "type": "float", + "default_value": 0.22, + "value": "raft_airgap / 2", + "minimum_value": "0", + "maximum_value_warning": "layer_height", + "enabled": "adhesion_type == 'raft'", + "settable_per_mesh": false, + "settable_per_extruder": true + }, + "raft_surface_layers": + { + "label": "Raft Top Layers", + "description": "The number of top layers on top of the 2nd raft layer. These are fully filled layers that the object sits on. 2 layers result in a smoother top surface than 1.", + "type": "int", + "default_value": 2, + "minimum_value": "0", + "maximum_value_warning": "20", + "enabled": "adhesion_type == \"raft\"", + "settable_per_mesh": false, + "settable_per_extruder": true + }, + "raft_surface_thickness": + { + "label": "Raft Top Layer Thickness", + "description": "Layer thickness of the top raft layers.", + "unit": "mm", + "type": "float", + "default_value": 0.1, + "minimum_value": "0", + "maximum_value_warning": "2.0", + "enabled": "adhesion_type == \"raft\"", + "settable_per_mesh": false, + "settable_per_extruder": true + }, + "raft_surface_line_width": + { + "label": "Raft Top Line Width", + "description": "Width of the lines in the top surface of the raft. These can be thin lines so that the top of the raft becomes smooth.", + "unit": "mm", + "type": "float", + "default_value": 0.3, + "minimum_value": "0.0001", + "maximum_value_warning": "machine_nozzle_size * 2", + "enabled": "adhesion_type == \"raft\"", + "settable_per_mesh": false, + "settable_per_extruder": true + }, + "raft_surface_line_spacing": + { + "label": "Raft Top Spacing", + "description": "The distance between the raft lines for the top raft layers. The spacing should be equal to the line width, so that the surface is solid.", + "unit": "mm", + "type": "float", + "default_value": 0.3, + "minimum_value": "0.0001", + "maximum_value_warning": "5.0", + "enabled": "adhesion_type == \"raft\"", + "value": "raft_surface_line_width", + "settable_per_mesh": false, + "settable_per_extruder": true + }, + "raft_interface_thickness": + { + "label": "Raft Middle Thickness", + "description": "Layer thickness of the middle raft layer.", + "unit": "mm", + "type": "float", + "default_value": 0.27, + "minimum_value": "0", + "maximum_value_warning": "5.0", + "enabled": "adhesion_type == \"raft\"", + "settable_per_mesh": false, + "settable_per_extruder": true + }, + "raft_interface_line_width": + { + "label": "Raft Middle Line Width", + "description": "Width of the lines in the middle raft layer. Making the second layer extrude more causes the lines to stick to the bed.", + "unit": "mm", + "type": "float", + "default_value": 1, + "value": "line_width * 2", + "minimum_value": "0.0001", + "maximum_value_warning": "machine_nozzle_size * 2", + "enabled": "adhesion_type == \"raft\"", + "settable_per_mesh": false, + "settable_per_extruder": true + }, + "raft_interface_line_spacing": + { + "label": "Raft Middle Spacing", + "description": "The distance between the raft lines for the middle raft layer. The spacing of the middle should be quite wide, while being dense enough to support the top raft layers.", + "unit": "mm", + "type": "float", + "default_value": 1.0, + "minimum_value": "0", + "maximum_value_warning": "15.0", + "enabled": "adhesion_type == \"raft\"", + "settable_per_mesh": false, + "settable_per_extruder": true + }, + "raft_base_thickness": + { + "label": "Raft Base Thickness", + "description": "Layer thickness of the base raft layer. This should be a thick layer which sticks firmly to the printer bed.", + "unit": "mm", + "type": "float", + "default_value": 0.3, + "minimum_value": "0", + "maximum_value_warning": "5.0", + "enabled": "adhesion_type == \"raft\"", + "settable_per_mesh": false, + "settable_per_extruder": true + }, + "raft_base_line_width": + { + "label": "Raft Base Line Width", + "description": "Width of the lines in the base raft layer. These should be thick lines to assist in bed adhesion.", + "unit": "mm", + "type": "float", + "default_value": 1, + "minimum_value": "0.0001", + "value": "line_width * 2", + "maximum_value_warning": "machine_nozzle_size * 2", + "enabled": "adhesion_type == \"raft\"", + "settable_per_mesh": false, + "settable_per_extruder": true + }, + "raft_base_line_spacing": + { + "label": "Raft Line Spacing", + "description": "The distance between the raft lines for the base raft layer. Wide spacing makes for easy removal of the raft from the build plate.", + "unit": "mm", + "type": "float", + "default_value": 3.0, + "minimum_value": "0.0001", + "maximum_value_warning": "100", + "enabled": "adhesion_type == \"raft\"", + "settable_per_mesh": false, + "settable_per_extruder": true + }, + "raft_speed": + { + "label": "Raft Print Speed", + "description": "The speed at which the raft is printed.", + "unit": "mm/s", + "type": "float", + "default_value": 30, + "minimum_value": "0.1", + "maximum_value": "299792458000", + "maximum_value_warning": "200", + "enabled": "adhesion_type == \"raft\"", + "value": "speed_print / 60 * 30", + "settable_per_mesh": false, + "settable_per_extruder": true, + "children": + { + "raft_surface_speed": + { + "label": "Raft Top Print Speed", + "description": "The speed at which the top raft layers are printed. These should be printed a bit slower, so that the nozzle can slowly smooth out adjacent surface lines.", + "unit": "mm/s", + "type": "float", + "default_value": 30, + "minimum_value": "0.1", + "maximum_value": "299792458000", + "maximum_value_warning": "100", + "enabled": "adhesion_type == \"raft\"", + "value": "raft_speed", + "settable_per_mesh": false, + "settable_per_extruder": true + }, + "raft_interface_speed": + { + "label": "Raft Middle Print Speed", + "description": "The speed at which the middle raft layer is printed. This should be printed quite slowly, as the volume of material coming out of the nozzle is quite high.", + "unit": "mm/s", + "type": "float", + "default_value": 15, + "minimum_value": "0.1", + "maximum_value": "299792458000", + "maximum_value_warning": "150", + "enabled": "adhesion_type == \"raft\"", + "value": "0.5 * raft_speed", + "settable_per_mesh": false, + "settable_per_extruder": true + }, + "raft_base_speed": + { + "label": "Raft Base Print Speed", + "description": "The speed at which the base raft layer is printed. This should be printed quite slowly, as the volume of material coming out of the nozzle is quite high.", + "unit": "mm/s", + "type": "float", + "default_value": 15, + "minimum_value": "0.1", + "maximum_value": "299792458000", + "maximum_value_warning": "200", + "enabled": "adhesion_type == \"raft\"", + "value": "0.5 * raft_speed", + "settable_per_mesh": false, + "settable_per_extruder": true + } + } + }, + + + + "raft_acceleration": { + "label": "Raft Print Acceleration", + "description": "The acceleration with which the raft is printed.", + "unit": "mm/s²", + "type": "float", + "default_value": 3000, + "minimum_value": "0.1", + "minimum_value_warning": "100", + "maximum_value_warning": "10000", + "value": "acceleration_print", + "enabled": "adhesion_type == \"raft\" and acceleration_enabled", + "settable_per_mesh": false, + "children": { + "raft_surface_acceleration": { + "label": "Raft Top Print Acceleration", + "description": "The acceleration with which the top raft layers are printed.", + "unit": "mm/s²", + "type": "float", + "default_value": 3000, + "value": "raft_acceleration", + "minimum_value": "0.1", + "minimum_value_warning": "100", + "maximum_value_warning": "10000", + "enabled": "adhesion_type == \"raft\" and acceleration_enabled", + "settable_per_mesh": false + }, + "raft_interface_acceleration": { + "label": "Raft Middle Print Acceleration", + "description": "The acceleration with which the middle raft layer is printed.", + "unit": "mm/s²", + "type": "float", + "default_value": 3000, + "value": "raft_acceleration", + "minimum_value": "0.1", + "minimum_value_warning": "100", + "maximum_value_warning": "10000", + "enabled": "adhesion_type == \"raft\" and acceleration_enabled", + "settable_per_mesh": false + }, + "raft_base_acceleration": { + "label": "Raft Base Print Acceleration", + "description": "The acceleration with which the base raft layer is printed.", + "unit": "mm/s²", + "type": "float", + "default_value": 3000, + "value": "raft_acceleration", + "minimum_value": "0.1", + "minimum_value_warning": "100", + "maximum_value_warning": "10000", + "enabled": "adhesion_type == \"raft\" and acceleration_enabled", + "settable_per_mesh": false + } + } + }, + + + + "raft_jerk": { + "label": "Raft Print Jerk", + "description": "The jerk with which the raft is printed.", + "unit": "mm/s³", + "type": "float", + "default_value": 20, + "minimum_value": "0.1", + "minimum_value_warning": "5", + "maximum_value_warning": "50", + "value": "jerk_print", + "enabled": "adhesion_type == \"raft\" and jerk_enabled", + "settable_per_mesh": false, + "children": { + "raft_surface_jerk": { + "label": "Raft Top Print Jerk", + "description": "The jerk with which the top raft layers are printed.", + "unit": "mm/s³", + "type": "float", + "default_value": 20, + "value": "raft_jerk", + "minimum_value": "0.1", + "minimum_value_warning": "5", + "maximum_value_warning": "100", + "enabled": "adhesion_type == \"raft\" and jerk_enabled", + "settable_per_mesh": false + }, + "raft_interface_jerk": { + "label": "Raft Middle Print Jerk", + "description": "The jerk with which the middle raft layer is printed.", + "unit": "mm/s³", + "type": "float", + "default_value": 20, + "value": "raft_jerk", + "minimum_value": "0.1", + "minimum_value_warning": "5", + "maximum_value_warning": "50", + "enabled": "adhesion_type == \"raft\" and jerk_enabled", + "settable_per_mesh": false + }, + "raft_base_jerk": { + "label": "Raft Base Print Jerk", + "description": "The jerk with which the base raft layer is printed.", + "unit": "mm/s³", + "type": "float", + "default_value": 20, + "value": "raft_jerk", + "minimum_value": "0.1", + "minimum_value_warning": "5", + "maximum_value_warning": "50", + "enabled": "adhesion_type == \"raft\" and jerk_enabled", + "settable_per_mesh": false + } + } + }, + + + "raft_fan_speed": { + "label": "Raft Fan Speed", + "description": "The fan speed for the raft.", + "unit": "%", + "type": "float", + "minimum_value": "0", + "maximum_value": "100", + "default_value": 0, + "settable_per_mesh": false, + "settable_per_extruder": true, + "enabled": "adhesion_type == \"raft\"", + "children": + { + "raft_surface_fan_speed": + { + "label": "Raft Top Fan Speed", + "description": "The fan speed for the top raft layers.", + "unit": "%", + "type": "float", + "minimum_value": "0", + "maximum_value": "100", + "default_value": 0, + "value": "raft_fan_speed", + "enabled": "adhesion_type == \"raft\"", + "settable_per_mesh": false, + "settable_per_extruder": true + }, + "raft_interface_fan_speed": + { + "label": "Raft Middle Fan Speed", + "description": "The fan speed for the middle raft layer.", + "unit": "%", + "type": "float", + "minimum_value": "0", + "maximum_value": "100", + "default_value": 0, + "value": "raft_fan_speed", + "enabled": "adhesion_type == \"raft\"", + "settable_per_mesh": false, + "settable_per_extruder": true + }, + "raft_base_fan_speed": + { + "label": "Raft Base Fan Speed", + "description": "The fan speed for the base raft layer.", + "unit": "%", + "type": "float", + "minimum_value": "0", + "maximum_value": "100", + "default_value": 0, + "value": "raft_fan_speed", + "enabled": "adhesion_type == \"raft\"", + "settable_per_mesh": false, + "settable_per_extruder": true + } + } + } + } + }, + "dual": + { + "label": "Dual Extrusion", + "type": "category", + "icon": "category_dual", + "description": "Settings used for printing with multiple extruders.", + "children": + { + "adhesion_extruder_nr": + { + "label": "Platform Adhesion Extruder", + "description": "The extruder train to use for printing the skirt/brim/raft. This is used in multi-extrusion.", + "type": "extruder", + "default_value": "0", + "settable_per_mesh": false, + "settable_per_extruder": false + }, + "support_extruder_nr": + { + "label": "Support Extruder", + "description": "The extruder train to use for printing the support. This is used in multi-extrusion.", + "type": "extruder", + "default_value": "0", + "enabled": "support_enable", + "settable_per_mesh": false, + "settable_per_extruder": false, + "children": { + "support_infill_extruder_nr": + { + "label": "Support Infill Extruder", + "description": "The extruder train to use for printing the infill of the support. This is used in multi-extrusion.", + "type": "extruder", + "default_value": "0", + "value": "support_extruder_nr", + "enabled": "support_enable", + "settable_per_mesh": false, + "settable_per_extruder": false + }, + "support_extruder_nr_layer_0": + { + "label": "First Layer Support Extruder", + "description": "The extruder train to use for printing the first layer of support infill. This is used in multi-extrusion.", + "type": "extruder", + "default_value": "0", + "value": "support_extruder_nr", + "enabled": "support_enable", + "settable_per_mesh": false, + "settable_per_extruder": false + }, + "support_roof_extruder_nr": + { + "label": "Support Roof Extruder", + "description": "The extruder train to use for printing the roof of the support. This is used in multi-extrusion.", + "type": "extruder", + "default_value": "0", + "value": "support_extruder_nr", + "enabled": "support_enable", + "settable_per_mesh": false, + "settable_per_extruder": false + } + } + }, + "prime_tower_enable": + { + "label": "Enable Prime Tower", + "description": "Print a tower next to the print which serves to prime the material after each nozzle switch.", + "type": "bool", + "default_value": false, + "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": "prime_tower_enable", + "default_value": 15, + "value": "15 if prime_tower_enable else 0", + "minimum_value": "0", + "maximum_value_warning": "20", + "settable_per_mesh": false, + "settable_per_extruder": false + }, + "prime_tower_position_x": + { + "label": "Prime Tower X Position", + "description": "The x coordinate of the position of the prime tower.", + "type": "float", + "unit": "mm", + "enabled": "prime_tower_enable", + "default_value": 200, + "minimum_value_warning": "-1000", + "maximum_value_warning": "1000", + "settable_per_mesh": false, + "settable_per_extruder": false + }, + "prime_tower_position_y": + { + "label": "Prime Tower Y Position", + "description": "The y coordinate of the position of the prime tower.", + "type": "float", + "unit": "mm", + "enabled": "prime_tower_enable", + "default_value": 200, + "minimum_value_warning": "-1000", + "maximum_value_warning": "1000", + "settable_per_mesh": false, + "settable_per_extruder": false + }, + "prime_tower_flow": + { + "label": "Prime Tower Flow", + "description": "Flow compensation: the amount of material extruded is multiplied by this value.", + "type": "float", + "unit": "%", + "enabled": "prime_tower_enable", + "default_value": 100, + "minimum_value": "0.0001", + "minimum_value_warning": "50", + "maximum_value_warning": "150", + "settable_per_mesh": false, + "settable_per_extruder": true + }, + "prime_tower_wipe_enabled": + { + "label": "Wipe 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": "prime_tower_enable", + "default_value": false, + "settable_per_mesh": false, + "settable_per_extruder": false + }, + "multiple_mesh_overlap": + { + "label": "Dual Extrusion Overlap", + "description": "Make the objects printed with different extruder trains overlap a bit. This makes the different materials bond together better.", + "type": "float", + "unit": "mm", + "default_value": 0.15, + "minimum_value": "0", + "maximum_value_warning": "1.0", + "settable_per_mesh": true + }, + "ooze_shield_enabled": + { + "label": "Enable Ooze Shield", + "description": "Enable exterior ooze shield. This will create a shell around the object which is likely to wipe a second nozzle if it's at the same height as the first nozzle.", + "type": "bool", + "default_value": false, + "settable_per_mesh": false, + "settable_per_extruder": false + }, + "ooze_shield_angle": + { + "label": "Ooze Shield Angle", + "description": "The maximum angle a part in the ooze shield will have. With 0 degrees being vertical, and 90 degrees being horizontal. A smaller angle leads to less failed ooze shields, but more material.", + "type": "float", + "unit": "°", + "enabled": "ooze_shield_enabled", + "default_value": 60, + "minimum_value": "0", + "maximum_value": "90", + "settable_per_mesh": false, + "settable_per_extruder": false + }, + "ooze_shield_dist": + { + "label": "Ooze Shield Distance", + "description": "Distance of the ooze shield from the print, in the X/Y directions.", + "type": "float", + "unit": "mm", + "enabled": "ooze_shield_enabled", + "default_value": 2, + "minimum_value": "0", + "maximum_value_warning": "30", + "settable_per_mesh": false, + "settable_per_extruder": false + } + } + }, + "meshfix": + { + "label": "Mesh Fixes", + "type": "category", + "icon": "category_fixes", + "description": "category_fixes", + "children": + { + "meshfix_union_all": + { + "label": "Union Overlapping Volumes", + "description": "Ignore the internal geometry arising from overlapping volumes and print the volumes as one. This may cause internal cavities to disappear.", + "type": "bool", + "default_value": true, + "settable_per_mesh": true + }, + "meshfix_union_all_remove_holes": + { + "label": "Remove All Holes", + "description": "Remove the holes in each layer and keep only the outside shape. This will ignore any invisible internal geometry. However, it also ignores layer holes which can be viewed from above or below.", + "type": "bool", + "default_value": false, + "settable_per_mesh": true + }, + "meshfix_extensive_stitching": + { + "label": "Extensive Stitching", + "description": "Extensive stitching tries to stitch up open holes in the mesh by closing the hole with touching polygons. This option can introduce a lot of processing time.", + "type": "bool", + "default_value": false, + "settable_per_mesh": true + }, + "meshfix_keep_open_polygons": + { + "label": "Keep Disconnected Faces", + "description": "Normally Cura tries to stitch up small holes in the mesh and remove parts of a layer with big holes. Enabling this option keeps those parts which cannot be stitched. This option should be used as a last resort option when everything else fails to produce proper GCode.", + "type": "bool", + "default_value": false, + "settable_per_mesh": true + } + } + }, + "blackmagic": + { + "label": "Special Modes", + "type": "category", + "icon": "category_blackmagic", + "description": "category_blackmagic", + "children": + { + "print_sequence": + { + "label": "Print Sequence", + "description": "Whether to print all objects one layer at a time or to wait for one object to finish, before moving on to the next. One at a time mode is only possible if all models are separated in such a way that the whole print head can move in between and all models are lower than the distance between the nozzle and the X/Y axes.", + "type": "enum", + "options": + { + "all_at_once": "All at Once", + "one_at_a_time": "One at a Time" + }, + "default_value": "all_at_once", + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false + }, + "magic_mesh_surface_mode": + { + "label": "Surface Mode", + "description": "Treat the model as a surface only, a volume, or volumes with loose surfaces. The normal print mode only prints enclosed volumes. \"Surface\" prints a single wall tracing the mesh surface with no infill and no top/bottom skin. \"Both\" prints enclosed volumes like normal and any remaining polygons as surfaces.", + "type": "enum", + "options": + { + "normal": "Normal", + "surface": "Surface", + "both": "Both" + }, + "default_value": "normal", + "settable_per_mesh": true + }, + "magic_spiralize": + { + "label": "Spiralize Outer Contour", + "description": "Spiralize smooths out the Z move of the outer edge. This will create a steady Z increase over the whole print. This feature turns a solid object into a single walled print with a solid bottom. This feature used to be called Joris in older versions.", + "type": "bool", + "default_value": false, + "settable_per_mesh": true + } + } + }, + "experimental": + { + "label": "Experimental Modes", + "type": "category", + "icon": "category_blackmagic", + "description": "experimental!", + "children": + { + "draft_shield_enabled": + { + "label": "Enable Draft Shield", + "description": "This will create a wall around the object, which traps (hot) air and shields against exterior airflow. Especially useful for materials which warp easily.", + "type": "bool", + "default_value": false, + "settable_per_mesh": false, + "settable_per_extruder": false + }, + "draft_shield_dist": + { + "label": "Draft Shield X/Y Distance", + "description": "Distance of the draft shield from the print, in the X/Y directions.", + "unit": "mm", + "type": "float", + "minimum_value": "0", + "maximum_value_warning": "100", + "default_value": 10, + "enabled": "draft_shield_enabled", + "settable_per_mesh": false, + "settable_per_extruder": false + }, + "draft_shield_height_limitation": + { + "label": "Draft Shield Limitation", + "description": "Set the height of the draft shield. Choose to print the draft shield at the full height of the object or at a limited height.", + "type": "enum", + "options": + { + "full": "Full", + "limited": "Limited" + }, + "default_value": "full", + "enabled": "draft_shield_enabled", + "settable_per_mesh": false, + "settable_per_extruder": false + }, + "draft_shield_height": + { + "label": "Draft Shield Height", + "description": "Height limitation of the draft shield. Above this height no draft shield will be printed.", + "unit": "mm", + "type": "float", + "minimum_value": "0", + "maximum_value_warning": "9999", + "default_value": 0, + "value": "9999 if draft_shield_height_limitation == 'full' and draft_shield_enabled else 0.0", + "enabled": "draft_shield_height_limitation == \"limited\"", + "settable_per_mesh": false, + "settable_per_extruder": false + }, + "conical_overhang_enabled": { + "label": "Make Overhang Printable", + "description": "Change the geometry of the printed model such that minimal support is required. Steep overhangs will become shallow overhangs. Overhanging areas will drop down to become more vertical.", + "type": "bool", + "default_value": false + }, + "conical_overhang_angle": { + "label": "Maximum Model Angle", + "description": "The maximum angle of overhangs after the they have been made printable. At a value of 0° all overhangs are replaced by a piece of model connected to the build plate, 90° will not change the model in any way.", + "unit": "°", + "type": "float", + "minimum_value": "0", + "maximum_value": "89", + "default_value": 50, + "enabled": "conical_overhang_enabled" + }, + "coasting_enable": + { + "label": "Enable Coasting", + "description": "Coasting replaces the last part of an extrusion path with a travel path. The oozed material is used to print the last piece of the extrusion path in order to reduce stringing.", + "type": "bool", + "default_value": false, + "settable_per_mesh": false, + "settable_per_extruder": true + }, + "coasting_volume": + { + "label": "Coasting Volume", + "description": "The volume otherwise oozed. This value should generally be close to the nozzle diameter cubed.", + "unit": "mm³", + "type": "float", + "default_value": 0.064, + "minimum_value": "0", + "maximum_value_warning": "2.0", + "enabled": "coasting_enable", + "settable_per_mesh": false, + "settable_per_extruder": true + }, + "coasting_min_volume": + { + "label": "Minimum Volume Before Coasting", + "description": "The smallest volume an extrusion path should have before allowing coasting. For smaller extrusion paths, less pressure has been built up in the bowden tube and so the coasted volume is scaled linearly. This value should always be larger than the Coasting Volume.", + "unit": "mm³", + "type": "float", + "default_value": 0.8, + "minimum_value": "0", + "maximum_value_warning": "10.0", + "enabled": "coasting_enable", + "settable_per_mesh": false, + "settable_per_extruder": true + }, + "coasting_speed": + { + "label": "Coasting Speed", + "description": "The speed by which to move during coasting, relative to the speed of the extrusion path. A value slightly under 100% is advised, since during the coasting move the pressure in the bowden tube drops.", + "unit": "%", + "type": "float", + "default_value": 90, + "minimum_value": "0.0001", + "maximum_value_warning": "100", + "enabled": "coasting_enable", + "settable_per_mesh": false, + "settable_per_extruder": true + }, + "skin_outline_count": + { + "label": "Extra Skin Wall Count", + "description": "Replaces the outermost part of the top/bottom pattern with a number of concentric lines. Using one or two lines improves roofs that start on infill material.", + "default_value": 0, + "minimum_value": "0", + "maximum_value_warning": "10", + "type": "int", + "settable_per_mesh": true + }, + "skin_alternate_rotation": + { + "label": "Alternate Skin Rotation", + "description": "Alternate the direction in which the top/bottom layers are printed. Normally they are printed diagonally only. This setting adds the X-only and Y-only directions.", + "type": "bool", + "default_value": false, + "enabled": "top_bottom_pattern != \"concentric\"", + "settable_per_mesh": true + }, + "support_conical_enabled": + { + "label": "Enable Conical Support", + "description": "Experimental feature: Make support areas smaller at the bottom than at the overhang.", + "type": "bool", + "default_value": false, + "enabled": "support_enable", + "settable_per_mesh": true + }, + "support_conical_angle": + { + "label": "Conical Support Angle", + "description": "The angle of the tilt of conical support. With 0 degrees being vertical, and 90 degrees being horizontal. Smaller angles cause the support to be more sturdy, but consist of more material. Negative angles cause the base of the support to be wider than the top.", + "unit": "°", + "type": "float", + "minimum_value": "-90", + "minimum_value_warning": "-45", + "maximum_value_warning": "45", + "maximum_value": "90", + "default_value": 30, + "enabled": "support_conical_enabled and support_enable", + "settable_per_mesh": true + }, + "support_conical_min_width": + { + "label": "Conical Support Minimum Width", + "description": "Minimum width to which the base of the conical support area is reduced. Small widths can lead to unstable support structures.", + "unit": "mm", + "default_value": 5.0, + "minimum_value": "0", + "minimum_value_warning": "machine_nozzle_size * 3", + "maximum_value_warning": "100.0", + "type": "float", + "enabled": "support_conical_enabled and support_enable", + "settable_per_mesh": true + }, + "magic_fuzzy_skin_enabled": + { + "label": "Fuzzy Skin", + "description": "Randomly jitter while printing the outer wall, so that the surface has a rough and fuzzy look.", + "type": "bool", + "default_value": false, + "settable_per_mesh": true + }, + "magic_fuzzy_skin_thickness": + { + "label": "Fuzzy Skin Thickness", + "description": "The width within which to jitter. It's advised to keep this below the outer wall width, since the inner walls are unaltered.", + "type": "float", + "unit": "mm", + "default_value": 0.3, + "minimum_value": "0.001", + "maximum_value_warning": "wall_line_width_0", + "enabled": "magic_fuzzy_skin_enabled", + "settable_per_mesh": true + }, + "magic_fuzzy_skin_point_density": + { + "label": "Fuzzy Skin Density", + "description": "The average density of points introduced on each polygon in a layer. Note that the original points of the polygon are discarded, so a low density results in a reduction of the resolution.", + "type": "float", + "unit": "1/mm", + "default_value": 1.25, + "minimum_value": "0.008", + "minimum_value_warning": "0.1", + "maximum_value_warning": "10", + "maximum_value": "2 / magic_fuzzy_skin_thickness", + "enabled": "magic_fuzzy_skin_enabled", + "settable_per_mesh": true, + "children": + { + "magic_fuzzy_skin_point_dist": + { + "label": "Fuzzy Skin Point Distance", + "description": "The average distance between the random points introduced on each line segment. Note that the original points of the polygon are discarded, so a high smoothness results in a reduction of the resolution. This value must be higher than half the Fuzzy Skin Thickness.", + "type": "float", + "unit": "mm", + "default_value": 0.8, + "minimum_value": "magic_fuzzy_skin_thickness / 2", + "minimum_value_warning": "0.1", + "maximum_value_warning": "10", + "value": "10000 if magic_fuzzy_skin_point_density == 0 else 1 / magic_fuzzy_skin_point_density", + "enabled": "magic_fuzzy_skin_enabled", + "settable_per_mesh": true + } + } + }, + "wireframe_enabled": + { + "label": "Wire Printing", + "description": "Print only the outside surface with a sparse webbed structure, printing 'in thin air'. This is realized by horizontally printing the contours of the model at given Z intervals which are connected via upward and diagonally downward lines.", + "type": "bool", + "default_value": false, + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false + }, + "wireframe_height": + { + "label": "WP Connection Height", + "description": "The height of the upward and diagonally downward lines between two horizontal parts. This determines the overall density of the net structure. Only applies to Wire Printing.", + "type": "float", + "unit": "mm", + "default_value": 3, + "minimum_value": "0.0001", + "maximum_value_warning": "20", + "enabled": "wireframe_enabled", + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false + }, + "wireframe_roof_inset": + { + "label": "WP Roof Inset Distance", + "description": "The distance covered when making a connection from a roof outline inward. Only applies to Wire Printing.", + "type": "float", + "unit": "mm", + "default_value": 3, + "minimum_value": "0", + "minimum_value_warning": "machine_nozzle_size", + "maximum_value_warning": "20", + "enabled": "wireframe_enabled", + "value": "wireframe_height", + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false + }, + "wireframe_printspeed": + { + "label": "WP Speed", + "description": "Speed at which the nozzle moves when extruding material. Only applies to Wire Printing.", + "unit": "mm/s", + "type": "float", + "default_value": 5, + "minimum_value": "0.1", + "maximum_value": "299792458000", + "maximum_value_warning": "50", + "enabled": "wireframe_enabled", + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false, + "children": + { + "wireframe_printspeed_bottom": + { + "label": "WP Bottom Printing Speed", + "description": "Speed of printing the first layer, which is the only layer touching the build platform. Only applies to Wire Printing.", + "unit": "mm/s", + "type": "float", + "default_value": 5, + "minimum_value": "0.1", + "maximum_value": "299792458000", + "maximum_value_warning": "50", + "enabled": "wireframe_enabled", + "value": "wireframe_printspeed", + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false + }, + "wireframe_printspeed_up": + { + "label": "WP Upward Printing Speed", + "description": "Speed of printing a line upward 'in thin air'. Only applies to Wire Printing.", + "unit": "mm/s", + "type": "float", + "default_value": 5, + "minimum_value": "0.1", + "maximum_value": "299792458000", + "maximum_value_warning": "50", + "enabled": "wireframe_enabled", + "value": "wireframe_printspeed", + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false + }, + "wireframe_printspeed_down": + { + "label": "WP Downward Printing Speed", + "description": "Speed of printing a line diagonally downward. Only applies to Wire Printing.", + "unit": "mm/s", + "type": "float", + "default_value": 5, + "minimum_value": "0.1", + "maximum_value": "299792458000", + "maximum_value_warning": "50", + "enabled": "wireframe_enabled", + "value": "wireframe_printspeed", + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false + }, + "wireframe_printspeed_flat": + { + "label": "WP Horizontal Printing Speed", + "description": "Speed of printing the horizontal contours of the object. Only applies to Wire Printing.", + "unit": "mm/s", + "type": "float", + "default_value": 5, + "minimum_value": "0.1", + "maximum_value": "299792458000", + "maximum_value_warning": "100", + "value": "wireframe_printspeed", + "enabled": "wireframe_enabled", + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false + } + } + }, + "wireframe_flow": + { + "label": "WP Flow", + "description": "Flow compensation: the amount of material extruded is multiplied by this value. Only applies to Wire Printing.", + "unit": "%", + "default_value": 100, + "minimum_value": "0", + "maximum_value_warning": "100", + "type": "float", + "enabled": "wireframe_enabled", + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false, + "children": + { + "wireframe_flow_connection": + { + "label": "WP Connection Flow", + "description": "Flow compensation when going up or down. Only applies to Wire Printing.", + "unit": "%", + "default_value": 100, + "minimum_value": "0", + "maximum_value_warning": "100", + "type": "float", + "enabled": "wireframe_enabled", + "value": "wireframe_flow", + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false + }, + "wireframe_flow_flat": + { + "label": "WP Flat Flow", + "description": "Flow compensation when printing flat lines. Only applies to Wire Printing.", + "unit": "%", + "default_value": 100, + "minimum_value": "0", + "maximum_value_warning": "100", + "type": "float", + "enabled": "wireframe_enabled", + "value": "wireframe_flow", + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false + } + } + }, + "wireframe_top_delay": + { + "label": "WP Top Delay", + "description": "Delay time after an upward move, so that the upward line can harden. Only applies to Wire Printing.", + "unit": "s", + "type": "float", + "default_value": 0, + "minimum_value": "0", + "maximum_value_warning": "1", + "enabled": "wireframe_enabled", + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false + }, + "wireframe_bottom_delay": + { + "label": "WP Bottom Delay", + "description": "Delay time after a downward move. Only applies to Wire Printing.", + "unit": "s", + "type": "float", + "default_value": 0, + "minimum_value": "0", + "maximum_value_warning": "1", + "enabled": "wireframe_enabled", + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false + }, + "wireframe_flat_delay": + { + "label": "WP Flat Delay", + "description": "Delay time between two horizontal segments. Introducing such a delay can cause better adhesion to previous layers at the connection points, while too long delays cause sagging. Only applies to Wire Printing.", + "unit": "s", + "type": "float", + "default_value": 0.1, + "minimum_value": "0", + "maximum_value_warning": "0.5", + "enabled": "wireframe_enabled", + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false + }, + "wireframe_up_half_speed": + { + "label": "WP Ease Upward", + "description": "Distance of an upward move which is extruded with half speed.\nThis can cause better adhesion to previous layers, while not heating the material in those layers too much. Only applies to Wire Printing.", + "type": "float", + "unit": "mm", + "default_value": 0.3, + "minimum_value": "0", + "maximum_value_warning": "5.0", + "enabled": "wireframe_enabled", + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false + }, + "wireframe_top_jump": + { + "label": "WP Knot Size", + "description": "Creates a small knot at the top of an upward line, so that the consecutive horizontal layer has a better chance to connect to it. Only applies to Wire Printing.", + "type": "float", + "unit": "mm", + "default_value": 0.6, + "minimum_value": "0", + "maximum_value_warning": "2.0", + "enabled": "wireframe_enabled", + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false + }, + "wireframe_fall_down": + { + "label": "WP Fall Down", + "description": "Distance with which the material falls down after an upward extrusion. This distance is compensated for. Only applies to Wire Printing.", + "type": "float", + "unit": "mm", + "default_value": 0.5, + "minimum_value": "0", + "maximum_value_warning": "wireframe_height", + "enabled": "wireframe_enabled", + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false + }, + "wireframe_drag_along": + { + "label": "WP Drag Along", + "description": "Distance with which the material of an upward extrusion is dragged along with the diagonally downward extrusion. This distance is compensated for. Only applies to Wire Printing.", + "type": "float", + "unit": "mm", + "default_value": 0.6, + "minimum_value": "0", + "maximum_value_warning": "wireframe_height", + "enabled": "wireframe_enabled", + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false + }, + "wireframe_strategy": + { + "label": "WP Strategy", + "description": "Strategy for making sure two consecutive layers connect at each connection point. Retraction lets the upward lines harden in the right position, but may cause filament grinding. A knot can be made at the end of an upward line to heighten the chance of connecting to it and to let the line cool; however, it may require slow printing speeds. Another strategy is to compensate for the sagging of the top of an upward line; however, the lines won't always fall down as predicted.", + "type": "enum", + "options": + { + "compensate": "Compensate", + "knot": "Knot", + "retract": "Retract" + }, + "default_value": "compensate", + "enabled": "wireframe_enabled", + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false + }, + "wireframe_straight_before_down": + { + "label": "WP Straighten Downward Lines", + "description": "Percentage of a diagonally downward line which is covered by a horizontal line piece. This can prevent sagging of the top most point of upward lines. Only applies to Wire Printing.", + "type": "float", + "unit": "%", + "default_value": 20, + "minimum_value": "0", + "maximum_value": "100", + "enabled": "wireframe_enabled", + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false + }, + "wireframe_roof_fall_down": + { + "label": "WP Roof Fall Down", + "description": "The distance which horizontal roof lines printed 'in thin air' fall down when being printed. This distance is compensated for. Only applies to Wire Printing.", + "type": "float", + "unit": "mm", + "default_value": 2, + "minimum_value_warning": "0", + "maximum_value_warning": "wireframe_roof_inset", + "enabled": "wireframe_enabled", + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false + }, + "wireframe_roof_drag_along": + { + "label": "WP Roof Drag Along", + "description": "The distance of the end piece of an inward line which gets dragged along when going back to the outer outline of the roof. This distance is compensated for. Only applies to Wire Printing.", + "type": "float", + "unit": "mm", + "default_value": 0.8, + "minimum_value": "0", + "maximum_value_warning": "10", + "enabled": "wireframe_enabled", + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false + }, + "wireframe_roof_outer_delay": + { + "label": "WP Roof Outer Delay", + "description": "Time spent at the outer perimeters of hole which is to become a roof. Longer times can ensure a better connection. Only applies to Wire Printing.", + "type": "float", + "unit": "s", + "default_value": 0.2, + "minimum_value": "0", + "maximum_value_warning": "2.0", + "enabled": "wireframe_enabled", + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false + }, + "wireframe_nozzle_clearance": + { + "label": "WP Nozzle Clearance", + "description": "Distance between the nozzle and horizontally downward lines. Larger clearance results in diagonally downward lines with a less steep angle, which in turn results in less upward connections with the next layer. Only applies to Wire Printing.", + "type": "float", + "unit": "mm", + "default_value": 1, + "minimum_value_warning": "0", + "maximum_value_warning": "10.0", + "enabled": "wireframe_enabled", + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false + } + } + } + } +} diff --git a/resources/definitions/grr_neo.def.json b/resources/definitions/grr_neo.def.json new file mode 100644 index 0000000000..563bdd1a67 --- /dev/null +++ b/resources/definitions/grr_neo.def.json @@ -0,0 +1,59 @@ +{ + "id": "grr_neo", + "version": 2, + "name": "German RepRap Neo", + "inherits": "fdmprinter", + "metadata": { + "visible": true, + "author": "Simon Cor", + "manufacturer": "German RepRap", + "category": "Other", + "file_formats": "text/x-gcode", + "icon": "icon_ultimaker.png", + "platform": "grr_neo_platform.stl" + }, + + "overrides": { + "machine_width": { + "default_value": 150 + }, + "machine_height": { + "default_value": 150 + }, + "machine_depth": { + "default_value": 150 + }, + "machine_center_is_zero": { + "default_value": false + }, + "machine_nozzle_size": { + "default_value": 0.5 + }, + "machine_nozzle_heat_up_speed": { + "default_value": 2 + }, + "machine_nozzle_cool_down_speed": { + "default_value": 2 + }, + "machine_head_polygon": { + "default_value": [ + [-75, -18], + [-75, 35], + [18, 35], + [18, -18] + ] + }, + "gantry_height": { + "default_value": 55 + }, + "machine_gcode_flavor": { + "default_value": "RepRap (Marlin/Sprinter)" + }, + "machine_start_gcode": { + "default_value": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG1 Z15.0 F9000 ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E3 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F9000\n;Put printing message on LCD screen\nM117 Printing..." + }, + "machine_end_gcode": { + "default_value": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning" + } + } +} \ No newline at end of file diff --git a/resources/definitions/innovo_inventor.def.json b/resources/definitions/innovo_inventor.def.json new file mode 100644 index 0000000000..9ba8d0d44b --- /dev/null +++ b/resources/definitions/innovo_inventor.def.json @@ -0,0 +1,99 @@ +{ + "id": "innovo-inventor", + "version": 2, + "name": "Innovo INVENTOR", + "inherits": "fdmprinter", + "metadata": { + "visible": true, + "author": "Adam Rumjahn", + "manufacturer": "Innovo", + "category": "Other", + "file_formats": "text/x-gcode", + "platform": "inventor_platform.stl", + "platform_offset": [-180, -0.25, 160] + }, + + "overrides": { + "machine_width": { + "default_value": 340 + }, + "machine_height": { + "default_value": 290 + }, + "machine_depth": { + "default_value": 300 + }, + "machine_heated_bed": { + "default_value": true + }, + "machine_center_is_zero": { + "default_value": false + }, + "machine_nozzle_size": { + "default_value": 0.4 + }, + "machine_head_polygon": { + "default_value": [ + [-43.7, -19.2], + [-43.7, 55], + [43.7, 55], + [43.7, -19.2] + ] + }, + "gantry_height": { + "default_value": 82.3 + }, + "machine_nozzle_offset_x": { + "default_value": 0 + }, + "machine_nozzle_offset_y": { + "default_value": 15 + }, + "machine_gcode_flavor": { + "default_value": "RepRap (Marlin/Sprinter)" + }, + "machine_start_gcode": { + "default_value": "G28 ; Home extruder\nM107 ; Turn off fan\nG90 ; Absolute positioning\nM82 ; Extruder in absolute mode\n{IF_BED}M190 S{BED}\n{IF_EXT0}M104 T0 S{TEMP0}\n{IF_EXT0}M109 T0 S{TEMP0}\n{IF_EXT1}M104 T1 S{TEMP1}\n{IF_EXT1}M109 T1 S{TEMP1}\nG32 S3 ; auto level\nG92 E0 ; Reset extruder position" + }, + "machine_end_gcode": { + "default_value": "M104 S0\nG91 ; relative positioning\nG1 E-2 F5000; retract 2mm\nG28 Z; move bed down\nG90 ; absolute positioning\nM84 ; disable motors" + }, + "layer_height": { + "default_value": 0.15 + }, + "wall_thickness": { + "default_value": 0.8 + }, + "top_bottom_thickness": { + "default_value": 0.3 + }, + "material_print_temperature": { + "default_value": 215 + }, + "material_bed_temperature": { + "default_value": 60 + }, + "material_diameter": { + "default_value": 1.75 + }, + "speed_print": { + "default_value": 60 + }, + "speed_infill": { + "default_value": 100 + }, + "speed_topbottom": { + "default_value": 30 + }, + "speed_travel": { + "default_value": 150 + }, + "speed_layer_0": { + "default_value": 30.0, + "minimum_value": 0.1 + }, + "infill_overlap": { + "default_value": 10.0 + } + } +} \ No newline at end of file diff --git a/resources/definitions/m180.def.json b/resources/definitions/m180.def.json new file mode 100644 index 0000000000..bb027d33bc --- /dev/null +++ b/resources/definitions/m180.def.json @@ -0,0 +1,57 @@ +{ + "id": "m180", + "version": 2, + "name": "Malyan M180", + "inherits": "fdmprinter", + "metadata": { + "visible": true, + "author": "Ruben Dulek", + "manufacturer": "Malyan", + "category": "Other", + "file_formats": "application/x3g" + }, + + "overrides": { + "machine_width": { + "default_value": 230 + }, + "machine_height": { + "default_value": 165 + }, + "machine_depth": { + "default_value": 145 + }, + "machine_center_is_zero": { + "default_value": true + }, + "machine_nozzle_size": { + "default_value": 0.4, + "minimum_value": "0.001" + }, + "machine_head_with_fans_polygon": { + "default_value": [ + [ -75, 35 ], + [ -75, -18 ], + [ 18, -18 ], + [ 18, 35 ] + ] + }, + "gantry_height": { + "default_value": 55 + }, + "machine_gcode_flavor": { + "default_value": "RepRap (Marlin/Sprinter)" + }, + "machine_start_gcode": { + "default_value": "M136\nM73 P0\nM103\nG21\nG90\nM320\n;(**** begin homing ****)\nG162 X Y F4000\nG161 Z F3500\nG92 Z-5\nG1 Z0.0\nG161 Z F100\nM132 X Y Z A B\n;(**** end homing ****)\nG92 X147 Y66 Z5\nG1 X105 Y-60 Z10 F4000.0\nG130 X127 Y127 A127 B127\nG0 X105 Y-60\nG1 Z0.3 F300\nG92 E0\nG1 X100 E10 F300\nG92 E0\nG1 Z0.0 F300\nM320" + }, + "machine_end_gcode": { + "default_value": "G92 Z0\nG1 Z10 F400\nM18\nM109 S0 T0\nM104 S0 T0\nM73 P100 (end build progress)\nG162 X Y F3000\nM18" + }, + "material_diameter": { + "default_value": 1.75, + "minimum_value_warning": "1.5", + "maximum_value_warning": "2.0" + } + } +} \ No newline at end of file diff --git a/resources/definitions/maker_starter.def.json b/resources/definitions/maker_starter.def.json new file mode 100644 index 0000000000..a26ca058f0 --- /dev/null +++ b/resources/definitions/maker_starter.def.json @@ -0,0 +1,176 @@ +{ + "id": "maker_starter", + "version": 2, + "name": "3DMaker Starter", + "inherits": "fdmprinter", + "metadata": { + "author": "tvlgiao", + "manufacturer": "3DMaker", + "category": "Other", + "file_formats": "text/x-gcode;application/x-stl-ascii;application/x-stl-binary;application/x-wavefront-obj", + "icon": "icon_ultimaker2.png", + "platform": "makerstarter_platform.stl" + }, + + "overrides": { + "machine_width": { + "default_value": 210 + }, + "machine_depth": { + "default_value": 185 + }, + "machine_height": { + "default_value": 200 + }, + "machine_heated_bed": { + "default_value": false + }, + "machine_center_is_zero": { + "default_value": false + }, + "machine_nozzle_size": { + "default_value": 0.4 + }, + "machine_nozzle_heat_up_speed": { + "default_value": 2 + }, + "machine_nozzle_cool_down_speed": { + "default_value": 2 + }, + "gantry_height": { + "default_value": 55 + }, + "machine_gcode_flavor": { + "default_value": "RepRap" + }, + "machine_disallowed_areas": { + "default_value": [] + }, + "machine_nozzle_tip_outer_diameter": { + "default_value": 1 + }, + "machine_nozzle_head_distance": { + "default_value": 3 + }, + "machine_nozzle_expansion_angle": { + "default_value": 45 + }, + "layer_height": { + "default_value": 0.2 + }, + "layer_height_0": { + "default_value": 0.2 + }, + "wall_line_count": { + "default_value": 2 + }, + "top_layers": { + "default_value": 4 + }, + "bottom_layers": { + "default_value": 4 + }, + "speed_print": { + "default_value": 50 + }, + "speed_wall": { + "default_value": 30 + }, + "speed_wall_0": { + "default_value": 30 + }, + "speed_wall_x": { + "default_value": 30 + }, + "speed_topbottom": { + "default_value": 50 + }, + "speed_support": { + "default_value": 50 + }, + "speed_travel": { + "default_value": 120 + }, + "speed_layer_0": { + "default_value": 20 + }, + "skirt_speed": { + "default_value": 15 + }, + "speed_slowdown_layers": { + "default_value": 4 + }, + "infill_sparse_density": { + "default_value": 20 + }, + "cool_fan_speed_min": { + "default_value": 50 + }, + "cool_fan_speed_max": { + "default_value": 100 + }, + "cool_fan_full_layer": { + "default_value": 4 + }, + "cool_min_layer_time": { + "default_value": 5 + }, + "cool_min_layer_time_fan_speed_max": { + "default_value": 10 + }, + "support_type": { + "default_value": "Everywhere" + }, + "support_angle": { + "default_value": 45 + }, + "support_xy_distance": { + "default_value": 1 + }, + "support_z_distance": { + "default_value": 0.2 + }, + "support_top_distance": { + "default_value": 0.2 + }, + "support_bottom_distance": { + "default_value": 0.24 + }, + "support_pattern": { + "default_value": "ZigZag" + }, + "support_infill_rate": { + "default_value": 15 + }, + "adhesion_type": { + "default_value": "Raft" + }, + "skirt_minimal_length": { + "default_value": 100 + }, + "raft_base_line_spacing": { + "default_value": 2 + }, + "raft_base_thickness": { + "default_value": 0.3 + }, + "raft_base_line_width": { + "default_value": 2 + }, + "raft_base_speed": { + "default_value": 15 + }, + "raft_interface_thickness": { + "default_value": 0.24 + }, + "raft_interface_line_width": { + "default_value": 0.6 + }, + "raft_airgap": { + "default_value": 0.2 + }, + "raft_surface_layers": { + "default_value": 2 + } + } +} \ No newline at end of file diff --git a/resources/definitions/mendel90.def.json b/resources/definitions/mendel90.def.json new file mode 100644 index 0000000000..8d9a6d99a1 --- /dev/null +++ b/resources/definitions/mendel90.def.json @@ -0,0 +1,94 @@ +{ + "id": "mendel90", + "name": "Mendel90", + "version": 2, + "inherits": "fdmprinter", + "metadata": + { + "visible": true, + "author": "Bo Herrmannsen", + "category": "Other", + "manufacturer": "Nophead", + "file_formats": "text/x-gcode", + "platform": "mendel90_platform.stl", + "platform_offset": [0, -23.6, 0] + }, + + "pages": [ + "BedLeveling" + ], + + "overrides": { + "machine_start_gcode": { + "default_value": "G21 ;metric values\nG90 ;absolute positioning\nG92 E0 ;zero the extruded length\nM107 ;start with the fan off\nG1 X90 Y200 F6000 ;go to the middle of the front\nG1 Z0.05 ;close to the bed\nG1 Z0.3 ;lift Z\n" + }, + "machine_end_gcode": { + "default_value": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nM107 ;carriage fan off\nG91 ;relative positioning\nG1 Z10 ;Move up Z 10mm\nG90 ;back to absolute mode\nG1 E-1 F1200 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG92 E0 ;zero the extruded length\nG1 Y200 F5000 ;Move Y to middle of bed cooling fan\nM42 P42 S255 ;Turn on Bed cooling fan on\nG4 S420 ;Wait 7 mins\nM42 P42 S0 ;Turn off bed cooling fan\nG1 Y10 F5000 ;Move Y to front\nM84 ;steppers off\n" + }, + "material_bed_temp_wait": { + "default_value": true + }, + "material_print_temp_prepend": { + "default_value": true + }, + "machine_width": { + "default_value": 200 + }, + "machine_height": { + "default_value": 200 + }, + "machine_depth": { + "default_value": 200 + }, + "machine_heated_bed": { + "default_value": true + }, + "machine_center_is_zero": { + "default_value": false + }, + "machine_extruder_count": { + "default_value": 1 + }, + "machine_nozzle_tip_outer_diameter": { + "default_value": 1 + }, + "machine_nozzle_head_distance": { + "default_value": 5 + }, + "machine_nozzle_expansion_angle": { + "default_value": 45 + }, + "machine_heat_zone_length": { + "default_value": 16 + }, + "machine_nozzle_heat_up_speed": { + "default_value": 2.0 + }, + "machine_nozzle_cool_down_speed": { + "default_value": 2.0 + }, + "machine_gcode_flavor": { + "default_value": "RepRap (Marlin/Sprinter)" + }, + "gantry_height": { + "default_value": 55 + }, + "machine_nozzle_size": { + "default_value": 0.4 + }, + "material_diameter": { + "default_value": 1.75 + }, + "machine_head_with_fans_polygon": + { + "default_value": [ + [ -12, 9 ], + [ -12, -9 ], + [ 14, 9 ], + [ 14, -9 ] + ] + } + } +} + + diff --git a/resources/definitions/printrbot_simple.def.json b/resources/definitions/printrbot_simple.def.json new file mode 100644 index 0000000000..0116ba6244 --- /dev/null +++ b/resources/definitions/printrbot_simple.def.json @@ -0,0 +1,41 @@ +{ + "id": "printrbot_simple", + "version": 2, + "name": "Printrbot Simple", + "inherits": "fdmprinter", + "metadata": { + "visible": true, + "author": "Calvindog717", + "manufacturer": "PrintrBot", + "file_formats": "text/x-gcode" + }, + + "overrides": { + "machine_heated_bed": { "default_value": false }, + "machine_width": { "default_value": 150 }, + "machine_height": { "default_value": 150 }, + "machine_depth": { "default_value": 140 }, + "machine_center_is_zero": { "default_value": false }, + "machine_nozzle_size": { "default_value": 0.3 }, + "material_diameter": { "default_value": 1.75 }, + "machine_nozzle_heat_up_speed": { "default_value": 2 }, + "machine_nozzle_cool_down_speed": { "default_value": 2 }, + "machine_head_with_fans_polygon": { + "default_value": [ + [ 55, -20 ], + [ 55, 99999 ], + [ -49, 99999 ], + [ -49, -20 ] + ] + }, + "gantry_height": { "default_value": 99999 }, + "machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" }, + + "machine_start_gcode": { + "default_value": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG29 ; auto bed-levelling\nG1 Z15.0 F9000 ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E3 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F9000\n;Put printing message on LCD screen\nM117 Printing..." + }, + "machine_end_gcode": { + "default_value": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning" + } + } +} diff --git a/resources/definitions/prusa_i3.def.json b/resources/definitions/prusa_i3.def.json new file mode 100644 index 0000000000..12e7054694 --- /dev/null +++ b/resources/definitions/prusa_i3.def.json @@ -0,0 +1,65 @@ +{ + "id": "prusa_i3", + "version": 2, + "name": "Prusa i3", + "inherits": "fdmprinter", + "metadata": { + "visible": true, + "author": "Quillford", + "manufacturer": "Prusajr", + "category": "Other", + "file_formats": "text/x-gcode", + "icon": "icon_ultimaker2", + "platform": "prusai3_platform.stl" + }, + + "overrides": { + "machine_heated_bed": { + "default_value": true + }, + "machine_width": { + "default_value": 200 + }, + "machine_height": { + "default_value": 200 + }, + "machine_depth": { + "default_value": 200 + }, + "machine_center_is_zero": { + "default_value": false + }, + "machine_nozzle_size": { + "default_value": 0.4 + }, + "material_diameter": { + "default_value": 1.75 + }, + "machine_nozzle_heat_up_speed": { + "default_value": 2 + }, + "machine_nozzle_cool_down_speed": { + "default_value": 2 + }, + "machine_head_polygon": { + "default_value": [ + [-75, -18], + [-75, 35], + [18, 35], + [18, -18] + ] + }, + "gantry_height": { + "default_value": 55 + }, + "machine_gcode_flavor": { + "default_value": "RepRap (Marlin/Sprinter)" + }, + "machine_start_gcode": { + "default_value": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG1 Z15.0 F9000 ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E3 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F9000\n;Put printing message on LCD screen\nM117 Printing..." + }, + "machine_end_gcode": { + "default_value": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning" + } + } +} \ No newline at end of file diff --git a/resources/definitions/prusa_i3_xl.def.json b/resources/definitions/prusa_i3_xl.def.json new file mode 100644 index 0000000000..819a93b860 --- /dev/null +++ b/resources/definitions/prusa_i3_xl.def.json @@ -0,0 +1,65 @@ +{ + "id": "prusa_i3_xl", + "version": 2, + "name": "Prusa i3 xl", + "inherits": "fdmprinter", + "metadata": { + "visible": true, + "author": "guigashm", + "manufacturer": "Prusajr", + "category": "Other", + "file_formats": "text/x-gcode", + "icon": "icon_ultimaker2.png", + "platform": "prusai3_xl_platform.stl" + }, + + "overrides": { + "machine_heated_bed": { + "default_value": true + }, + "machine_width": { + "default_value": 200 + }, + "machine_height": { + "default_value": 200 + }, + "machine_depth": { + "default_value": 270 + }, + "machine_center_is_zero": { + "default_value": false + }, + "machine_nozzle_size": { + "default_value": 0.4 + }, + "material_diameter": { + "default_value": 1.75 + }, + "machine_nozzle_heat_up_speed": { + "default_value": 2.0 + }, + "machine_nozzle_cool_down_speed": { + "default_value": 2.0 + }, + "machine_head_polygon": { + "default_value": [ + [-75, -18], + [-75, 35], + [18, 35], + [18, -18] + ] + }, + "gantry_height": { + "default_value": 55 + }, + "machine_gcode_flavor": { + "default_value": "RepRap (Marlin/Sprinter)" + }, + "machine_start_gcode": { + "default_value": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG1 Z15.0 F9000 ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E3 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F9000\n;Put printing message on LCD screen\nM117 Printing..." + }, + "machine_end_gcode": { + "default_value": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning" + } + } +} \ No newline at end of file diff --git a/resources/definitions/rigidbot.def.json b/resources/definitions/rigidbot.def.json new file mode 100644 index 0000000000..ace8300d5d --- /dev/null +++ b/resources/definitions/rigidbot.def.json @@ -0,0 +1,102 @@ +{ + "id": "rigidbot", + "version": 2, + "name": "RigidBot", + "inherits": "fdmprinter", + "metadata": { + "visible": true, + "author": "RBC", + "manufacturer": "RigidBot", + "category": "Other", + "file_formats": "text/x-gcode", + "platform": "rigidbot_platform.stl" + }, + + "overrides": { + "machine_width": { + "default_value": 254 + }, + "machine_depth": { + "default_value": 254 + }, + "machine_height": { + "default_value": 254 + }, + "machine_heated_bed": { + "default_value": true + }, + "machine_nozzle_heat_up_speed": { + "default_value": 2 + }, + "machine_nozzle_cool_down_speed": { + "default_value": 2 + }, + "gantry_height": { + "default_value": 0 + }, + "machine_gcode_flavor": { + "default_value": "RepRap (Marlin/Sprinter)" + }, + "machine_start_gcode": { + "default_value": ";Sliced at: {day} {date} {time}\n;Basic settings: Layer height: {layer_height} Walls: {wall_thickness} Fill: {infill_sparse_density}\n;Print time: {print_time}\n;Filament used: {filament_amount}m {filament_weight}g\n;Filament cost: {filament_cost}\n;M190 S{print_bed_temperature} ;Uncomment to add your own bed temperature line\n;M109 S{print_temperature} ;Uncomment to add your own temperature line\nG21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nM205 X8 ;X/Y Jerk settings\nG1 Z15.0 F{travel_speed} ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E7 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F{travel_speed}\n;Put printing message on LCD screen\nM117 Rigibot Printing..." + }, + "machine_end_gcode": { + "default_value": ";End GCode\nM104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+10 E-1 X-20 Y-20 F{travel_speed} ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nG1 Y230 F3000 ;move Y so the head is out of the way and Plate is moved forward\nM84 ;steppers off\nG90 ;absolute positioning\n;{profile_string}" + }, + "layer_height": { + "default_value": 0.2 + }, + "wall_thickness": { + "default_value": 0.8 + }, + "top_bottom_thickness": { + "default_value": 0.3 + }, + "material_print_temperature": { + "default_value": 195 + }, + "material_bed_temperature": { + "default_value": 60 + }, + "material_diameter": { + "default_value": 1.75 + }, + "speed_print": { + "default_value": 60 + }, + "speed_infill": { + "default_value": 100 + }, + "speed_topbottom": { + "default_value": 15 + }, + "speed_travel": { + "default_value": 150 + }, + "speed_layer_0": { + "default_value": 15, + "minimum_value": "0.1" + }, + "infill_overlap": { + "default_value": 10 + }, + "cool_fan_enabled": { + "default_value": false + }, + "cool_fan_speed": { + "default_value": 0 + }, + "skirt_line_count": { + "default_value": 3, + "enabled": "adhesion_type == \"Skirt\"" + }, + "skirt_gap": { + "default_value": 4, + "enabled": "adhesion_type == \"Skirt\"" + }, + "skirt_minimal_length": { + "default_value": 200, + "enabled": "adhesion_type == \"Skirt\"" + } + } +} diff --git a/resources/definitions/rigidbot_big.def.json b/resources/definitions/rigidbot_big.def.json new file mode 100644 index 0000000000..ce27d36745 --- /dev/null +++ b/resources/definitions/rigidbot_big.def.json @@ -0,0 +1,105 @@ +{ + "id": "rigidbotbig", + "version": 2, + "name": "RigidBotBig", + "inherits": "fdmprinter", + "metadata": { + "visible": true, + "author": "RBC", + "manufacturer": "RigidBot", + "category": "Other", + "file_formats": "text/x-gcode", + "platform": "rigidbotbig_platform.stl" + }, + + "overrides": { + "machine_width": { + "default_value": 400 + }, + "machine_depth": { + "default_value": 300 + }, + "machine_height": { + "default_value": 254 + }, + "machine_heated_bed": { + "default_value": true + }, + "machine_nozzle_size": { + "default_value": 0.4 + }, + "machine_nozzle_heat_up_speed": { + "default_value": 2 + }, + "machine_nozzle_cool_down_speed": { + "default_value": 2 + }, + "gantry_height": { + "default_value": 0 + }, + "machine_gcode_flavor": { + "default_value": "RepRap (Marlin/Sprinter)" + }, + "machine_start_gcode": { + "default_value": ";Sliced at: {day} {date} {time}\n;Basic settings: Layer height: {layer_height} Walls: {wall_thickness} Fill: {infill_sparse_density}\n;Print time: {print_time}\n;Filament used: {filament_amount}m {filament_weight}g\n;Filament cost: {filament_cost}\n;M190 S{print_bed_temperature} ;Uncomment to add your own bed temperature line\n;M109 S{print_temperature} ;Uncomment to add your own temperature line\nG21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nM205 X8 ;X/Y Jerk settings\nG1 Z15.0 F{travel_speed} ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E7 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F{travel_speed}\n;Put printing message on LCD screen\nM117 Rigibot Printing..." + }, + "machine_end_gcode": { + "default_value": ";End GCode\nM104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+10 E-1 X-20 Y-20 F{travel_speed} ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nG1 Y230 F3000 ;move Y so the head is out of the way and Plate is moved forward\nM84 ;steppers off\nG90 ;absolute positioning\n;{profile_string}" + }, + "layer_height": { + "default_value": 0.2 + }, + "wall_thickness": { + "default_value": 0.8 + }, + "top_bottom_thickness": { + "default_value": 0.3 + }, + "material_print_temperature": { + "default_value": 195 + }, + "material_bed_temperature": { + "default_value": 60 + }, + "material_diameter": { + "default_value": 1.75 + }, + "speed_print": { + "default_value": 60 + }, + "speed_infill": { + "default_value": 100 + }, + "speed_topbottom": { + "default_value": 15 + }, + "speed_travel": { + "default_value": 150 + }, + "speed_layer_0": { + "default_value": 15, + "minimum_value": "0.1" + }, + "infill_overlap": { + "default_value": 10 + }, + "cool_fan_enabled": { + "default_value": false + }, + "cool_fan_speed": { + "default_value": 0 + }, + "skirt_line_count": { + "default_value": 3, + "enabled": "adhesion_type == \"Skirt\"" + }, + "skirt_gap": { + "default_value": 4, + "enabled": "adhesion_type == \"Skirt\"" + }, + "skirt_minimal_length": { + "default_value": 200, + "enabled": "adhesion_type == \"Skirt\"" + } + } +} \ No newline at end of file diff --git a/resources/definitions/ultimaker.def.json b/resources/definitions/ultimaker.def.json new file mode 100644 index 0000000000..5df38d07cb --- /dev/null +++ b/resources/definitions/ultimaker.def.json @@ -0,0 +1,11 @@ +{ + "id": "ultimaker_base", + "version": 2, + "name": "Ultimaker", + "inherits": "fdmprinter", + "metadata": { + "author": "Ultimaker", + "manufacturer": "Ultimaker", + "visible": false + } +} diff --git a/resources/definitions/ultimaker2.def.json b/resources/definitions/ultimaker2.def.json new file mode 100644 index 0000000000..7b2222e5b3 --- /dev/null +++ b/resources/definitions/ultimaker2.def.json @@ -0,0 +1,108 @@ +{ + "id": "ultimaker2", + "version": 2, + "name": "Ultimaker 2", + "inherits": "ultimaker", + "metadata": { + "visible": true, + "author": "Ultimaker", + "manufacturer": "Ultimaker", + "category": "Ultimaker", + "file_formats": "text/x-gcode", + "icon": "icon_ultimaker2.png", + "platform": "ultimaker2_platform.obj", + "platform_texture": "Ultimaker2backplate.png", + "platform_offset": [9, 0, 0] + }, + "overrides": { + "machine_start_gcode" : { + "default_value": "" + }, + "machine_end_gcode" : { + "default_value": "" + }, + "machine_width": { + "default_value": 223 + }, + "machine_depth": { + "default_value": 223 + }, + "machine_height": { + "default_value": 205 + }, + "machine_heated_bed": { + "default_value": true + }, + "machine_head_with_fans_polygon": + { + "default_value": [ + [ -42, 12 ], + [ -42, -32 ], + [ 62, 12 ], + [ 62, -32 ] + ] + }, + "machine_center_is_zero": { + "default_value": false + }, + "machine_nozzle_size": { + "default_value": 0.4, + "minimum_value": "0.001" + }, + "machine_nozzle_heat_up_speed": { + "default_value": 2 + }, + "machine_nozzle_cool_down_speed": { + "default_value": 2 + }, + "gantry_height": { + "default_value": 55 + }, + "machine_use_extruder_offset_to_offset_coords": { + "default_value": true + }, + "machine_gcode_flavor": { + "default_value": "UltiGCode" + }, + "machine_disallowed_areas": { + "default_value": [ + [[-115, 112.5], [ -82, 112.5], [ -84, 102.5], [-115, 102.5]], + [[ 115, 112.5], [ 115, 102.5], [ 110, 102.5], [ 108, 112.5]], + [[-115, -112.5], [-115, -104.5], [ -84, -104.5], [ -82, -112.5]], + [[ 115, -112.5], [ 108, -112.5], [ 110, -104.5], [ 115, -104.5]] + ]}, + "machine_nozzle_tip_outer_diameter": { + "default_value": 1 + }, + "machine_nozzle_head_distance": { + "default_value": 3 + }, + "machine_nozzle_expansion_angle": { + "default_value": 45 + }, + "material_print_temperature": { + "enabled": "False" + }, + "material_bed_temperature": { + "enabled": "False" + }, + "material_diameter": { + "enabled": "False" + }, + "material_flow": { + "enabled": "False" + }, + "retraction_amount": { + "enabled": "False" + }, + "retraction_speed": { + "enabled": "False" + }, + "retraction_retract_speed": { + "enabled": "False" + }, + "retraction_prime_speed": { + "enabled": "False" + } + } +} diff --git a/resources/definitions/ultimaker2_extended.def.json b/resources/definitions/ultimaker2_extended.def.json new file mode 100644 index 0000000000..e3c7d1fd01 --- /dev/null +++ b/resources/definitions/ultimaker2_extended.def.json @@ -0,0 +1,21 @@ +{ + "id": "ultimaker2_extended", + "version": 2, + "name": "Ultimaker 2 Extended", + "inherits": "ultimaker2", + "metadata": { + "author": "Ultimaker", + "manufacturer": "Ultimaker", + "category": "Ultimaker", + "file_formats": "text/x-gcode", + "icon": "icon_ultimaker2.png", + "platform": "ultimaker2_platform.obj", + "platform_texture": "Ultimaker2Extendedbackplate.png" + }, + + "overrides": { + "machine_height": { + "default_value": 315 + } + } +} diff --git a/resources/definitions/ultimaker2_extended_plus.def.json b/resources/definitions/ultimaker2_extended_plus.def.json new file mode 100644 index 0000000000..50f0e73b9f --- /dev/null +++ b/resources/definitions/ultimaker2_extended_plus.def.json @@ -0,0 +1,29 @@ +{ + "id": "ultimaker2_extended_plus", + "version": 2, + "name": "Ultimaker 2 Extended+", + "inherits": "ultimaker2_plus", + "metadata": { + "author": "Ultimaker", + "manufacturer": "Ultimaker", + "category": "Ultimaker", + "file_formats": "text/x-gcode", + "platform": "ultimaker2_platform.obj", + "platform_texture": "Ultimaker2ExtendedPlusbackplate.png" + }, + + "overrides": { + "machine_height": { + "default_value": 313 + }, + "machine_show_variants": { + "default_value": true + }, + "machine_nozzle_head_distance": { + "default_value": 5 + }, + "machine_nozzle_expansion_angle": { + "default_value": 45 + } + } +} diff --git a/resources/definitions/ultimaker2_go.def.json b/resources/definitions/ultimaker2_go.def.json new file mode 100644 index 0000000000..d3ef53d633 --- /dev/null +++ b/resources/definitions/ultimaker2_go.def.json @@ -0,0 +1,39 @@ +{ + "id": "ultimaker2_go", + "version": 2, + "name": "Ultimaker 2 Go", + "inherits": "ultimaker2", + "metadata": { + "author": "Ultimaker", + "manufacturer": "Ultimaker", + "category": "Ultimaker", + "file_formats": "text/x-gcode", + "icon": "icon_ultimaker2.png", + "platform": "ultimaker2go_platform.obj", + "platform_texture": "Ultimaker2Gobackplate.png", + "platform_offset": [0, 0, 0] + }, + + "overrides": { + "machine_width": { + "default_value": 120 + }, + "machine_depth": { + "default_value": 120 + }, + "machine_height": { + "default_value": 115 + }, + "machine_heated_bed": { + "default_value": false + }, + "machine_disallowed_areas": { + "default_value": [ + [[-60, 60], [-33, 60], [-35, 52], [-60, 52]], + [[ 60, 60], [ 60, 52], [ 35, 52], [ 33, 60]], + [[-60, -60], [-60, -52], [-35, -52], [-33, -60]], + [[ 60, -60], [ 33, -60], [ 35, -52], [ 60, -52]] + ] + } + } +} diff --git a/resources/definitions/ultimaker2_plus.def.json b/resources/definitions/ultimaker2_plus.def.json new file mode 100644 index 0000000000..4432fab170 --- /dev/null +++ b/resources/definitions/ultimaker2_plus.def.json @@ -0,0 +1,77 @@ +{ + "id": "ultimaker2_plus", + "version": 2, + "name": "Ultimaker 2+", + "inherits": "ultimaker2", + "metadata": { + "author": "Ultimaker", + "manufacturer": "Ultimaker", + "category": "Ultimaker", + "file_formats": "text/x-gcode", + "platform": "ultimaker2_platform.obj", + "platform_texture": "Ultimaker2Plusbackplate.png", + "preferred_variant": "ultimaker2_plus_0.4", + "preferred_material": "*pla*", + "preferred_quality": "*normal*", + "has_variants": true, + "has_materials": true, + "has_machine_materials": true, + "has_machine_quality": true + }, + + "overrides": { + "speed_infill": { + "value": "speed_print" + }, + "speed_wall_x": { + "value": "speed_wall" + }, + "layer_height_0": { + "value": "round(machine_nozzle_size / 1.5, 2)" + }, + "line_width": { + "value": "round(machine_nozzle_size * 0.875, 2)" + }, + "speed_layer_0": { + "default_value": 20 + }, + "speed_support": { + "value": "speed_wall_0" + }, + "machine_height": { + "default_value": 203 + }, + "machine_show_variants": { + "default_value": true + }, + "gantry_height": { + "default_value": 52 + }, + "machine_nozzle_head_distance": { + "default_value": 5 + }, + "machine_nozzle_expansion_angle": { + "default_value": 45 + }, + "machine_heat_zone_length": { + "default_value": 20 + }, + "machine_head_with_fans_polygon": + { + "default_value": [ + [ -44, 14 ], + [ -44, -34 ], + [ 64, 14 ], + [ 64, -34 ] + ] + }, + "machine_disallowed_areas": { + "default_value": [ + [[-115, 112.5], [ -78, 112.5], [ -80, 102.5], [-115, 102.5]], + [[ 115, 112.5], [ 115, 102.5], [ 105, 102.5], [ 103, 112.5]], + [[-115, -112.5], [-115, -104.5], [ -84, -104.5], [ -82, -112.5]], + [[ 115, -112.5], [ 108, -112.5], [ 110, -104.5], [ 115, -104.5]] + ] + } + } +} diff --git a/resources/definitions/ultimaker_original.def.json b/resources/definitions/ultimaker_original.def.json new file mode 100644 index 0000000000..55668946a0 --- /dev/null +++ b/resources/definitions/ultimaker_original.def.json @@ -0,0 +1,72 @@ +{ + "id": "ultimaker_original", + "version": 2, + "name": "Ultimaker Original", + "inherits": "ultimaker", + "metadata": { + "visible": true, + "author": "Ultimaker", + "manufacturer": "Ultimaker", + "category": "Ultimaker", + "file_formats": "text/x-gcode", + "icon": "icon_ultimaker.png", + "platform": "ultimaker_platform.stl", + "has_materials": true, + "preferred_material": "*pla*", + "preferred_quality": "*normal*", + "pages": [ + "SelectUpgradedParts", + "UpgradeFirmware", + "UltimakerCheckup", + "BedLeveling" + ] + }, + + "overrides": { + "machine_width": { + "default_value": 205 + }, + "machine_height": { + "default_value": 200 + }, + "machine_depth": { + "default_value": 205 + }, + "machine_center_is_zero": { + "default_value": false + }, + "machine_nozzle_size": { + "default_value": 0.4 + }, + "machine_nozzle_heat_up_speed": { + "default_value": 2 + }, + "machine_nozzle_cool_down_speed": { + "default_value": 2 + }, + "machine_head_with_fans_polygon": + { + "default_value": [ + [ -75, 35 ], + [ -75, -18 ], + [ 18, 35 ], + [ 18, -18 ] + ] + }, + "gantry_height": { + "default_value": 55 + }, + "machine_use_extruder_offset_to_offset_coords": { + "default_value": true + }, + "machine_gcode_flavor": { + "default_value": "RepRap (Marlin/Sprinter)" + }, + "machine_start_gcode": { + "default_value": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG1 Z15.0 F9000 ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E6 ;extrude 6 mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F9000\n;Put printing message on LCD screen\nM117 Printing..." + }, + "machine_end_gcode": { + "default_value": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning" + } + } +} diff --git a/resources/definitions/ultimaker_original_plus.def.json b/resources/definitions/ultimaker_original_plus.def.json new file mode 100644 index 0000000000..830050beb0 --- /dev/null +++ b/resources/definitions/ultimaker_original_plus.def.json @@ -0,0 +1,26 @@ +{ + "id": "ultimaker_original_plus", + "version": 2, + "name": "Ultimaker Original+", + "inherits": "ultimaker_original", + "metadata": { + "author": "Ultimaker", + "manufacturer": "Ultimaker", + "category": "Ultimaker", + "file_formats": "text/x-gcode", + "icon": "icon_ultimaker.png", + "platform": "ultimaker2_platform.obj", + "platform_texture": "UltimakerPlusbackplate.png", + "pages": [ + "UpgradeFirmware", + "UltimakerCheckup", + "BedLeveling" + ] + }, + + "overrides": { + "machine_heated_bed": { + "default_value": true + } + } +} diff --git a/resources/definitions/uniqbot_one.def.json b/resources/definitions/uniqbot_one.def.json new file mode 100644 index 0000000000..1342e065a2 --- /dev/null +++ b/resources/definitions/uniqbot_one.def.json @@ -0,0 +1,55 @@ +{ + "id": "uniqbot_one", + "version": 2, + "name": "Uniqbot", + "inherits": "fdmprinter", + "metadata": { + "author": "Unimatech", + "manufacturer": "Unimatech", + "category": "Other", + "file_formats": "text/x-gcode", + "icon": "icon_ultimaker2.png" + }, + + "overrides": { + "machine_heated_bed": { + "default_value": false + }, + "machine_width": { + "default_value": 140 + }, + "machine_height": { + "default_value": 120 + }, + "machine_depth": { + "default_value": 160 + }, + "machine_center_is_zero": { + "default_value": false + }, + "machine_nozzle_size": { + "default_value": 0.5 + }, + "material_diameter": { + "default_value": 1.75 + }, + "machine_nozzle_heat_up_speed": { + "default_value": 2 + }, + "machine_nozzle_cool_down_speed": { + "default_value": 2 + }, + "gantry_height": { + "default_value": 55 + }, + "machine_gcode_flavor": { + "default_value": "RepRap (Marlin/Sprinter)" + }, + "machine_start_gcode": { + "default_value": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG1 Z15.0 F9000 ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E3 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F9000\n;Put printing message on LCD screen\nM117 Printing..." + }, + "machine_end_gcode": { + "default_value": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning" + } + } +} diff --git a/resources/i18n/de/fdmprinter.json.po b/resources/i18n/de/fdmprinter.json.po index 9ba0fdca1f..e9a04a21ff 100644 --- a/resources/i18n/de/fdmprinter.json.po +++ b/resources/i18n/de/fdmprinter.json.po @@ -2414,3 +2414,16 @@ msgid "" "which in turn results in less upward connections with the next layer. Only " "applies to Wire Printing." msgstr "Der Abstand zwischen der Düse und den horizontalen Abwärtslinien. Bei einem größeren Abstand haben die diagonalen Abwärtslinien einen weniger spitzen Winkel, was wiederum weniger Aufwärtsverbindungen zur nächsten Schicht zur Folge hat. Dies gilt nur für das Drucken mit Drahtstruktur." + +#: fdmprinter.json +msgctxt "layer_0_z_overlap label" +msgid "Initial Layer Z Overlap" +msgstr "Z Überlappung der ersten Schicht" + +#: fdmprinter.json +msgctxt "layer_0_z_overlap description" +msgid "" +"Make the first and second layer of the object overlap in the Z direction to " +"compensate for the filament lost in the airgap. All model pieces above the first " +"model layer will be shifted down by this amount." +msgstr "Die erste und die zweite Schicht des Objekts überlappen sich in der Z-Richtung, um das verlorene Filament in dem Luftspalt zu kompensieren. Alle Schichten über der ersten Schicht, verschieben sich in der Z-Richtung mit gewähltem Abstand nach unten." diff --git a/resources/i18n/en/fdmprinter.json.po b/resources/i18n/en/fdmprinter.json.po index 9ee03631bb..4578306bfb 100644 --- a/resources/i18n/en/fdmprinter.json.po +++ b/resources/i18n/en/fdmprinter.json.po @@ -2483,3 +2483,16 @@ msgid "" "which in turn results in less upward connections with the next layer. Only " "applies to Wire Printing." msgstr "Distance between the nozzle and horizontally downward lines. Larger clearance results in diagonally downward lines with a less steep angle, which in turn results in fewer upward connections with the next layer. Only applies to Wire Printing." + +#: fdmprinter.json +msgctxt "layer_0_z_overlap label" +msgid "Initial Layer Z Overlap" +msgstr "Initial Layer Z Overlap" + +#: fdmprinter.json +msgctxt "layer_0_z_overlap description" +msgid "" +"Make the first and second layer of the object overlap in the Z direction to " +"compensate for the filament lost in the airgap. All models above the first " +"model layer will be shifted down by this amount." +msgstr "Make the first and second layer of the object overlap in the Z direction to compensate for the filament lost in the airgap. All models above the first model layer will be shifted down by this amount." diff --git a/resources/i18n/es/fdmprinter.json.po b/resources/i18n/es/fdmprinter.json.po index a3e79fa69a..2c1f044147 100644 --- a/resources/i18n/es/fdmprinter.json.po +++ b/resources/i18n/es/fdmprinter.json.po @@ -2414,3 +2414,16 @@ msgid "" "which in turn results in less upward connections with the next layer. Only " "applies to Wire Printing." msgstr "Distancia entre la tobera y líneas descendentes en horizontal. Cuanto mayor sea la holgura, menos pronunciado será el ángulo de las líneas descendentes en diagonal, lo que a su vez se traduce en menos conexiones ascendentes con la siguiente capa. Solo se aplica a la impresión de alambre." + +#: fdmprinter.json +msgctxt "layer_0_z_overlap label" +msgid "Initial Layer Z Overlap" +msgstr "Superposición de las capas iniciales en Z" + +#: fdmprinter.json +msgctxt "layer_0_z_overlap description" +msgid "" +"Make the first and second layer of the object overlap in the Z direction to " +"compensate for the filament lost in the airgap. All models above the first " +"model layer will be shifted down by this amount." +msgstr "La superposición entre la primera y segunda capa del objeto para compensar la pérdida de material en el hueco de aire. Todas las capas por encima de la primera capa se desplazan hacia abajo por esta cantidad." diff --git a/resources/i18n/fdmprinter.json.pot b/resources/i18n/fdmprinter.json.pot index b7c6f07b46..b8870ef252 100644 --- a/resources/i18n/fdmprinter.json.pot +++ b/resources/i18n/fdmprinter.json.pot @@ -2414,3 +2414,16 @@ msgid "" "which in turn results in less upward connections with the next layer. Only " "applies to Wire Printing." msgstr "" + +#: fdmprinter.json +msgctxt "layer_0_z_overlap label" +msgid "Initial Layer Z Overlap" +msgstr "" + +#: fdmprinter.json +msgctxt "layer_0_z_overlap description" +msgid "" +"Make the first and second layer of the object overlap in the Z direction to " +"compensate for the filament lost in the airgap. All models above the first " +"model layer will be shifted down by this amount." +msgstr "" diff --git a/resources/i18n/fi/fdmprinter.json.po b/resources/i18n/fi/fdmprinter.json.po index ad12060cea..cc402b0e54 100644 --- a/resources/i18n/fi/fdmprinter.json.po +++ b/resources/i18n/fi/fdmprinter.json.po @@ -2414,3 +2414,16 @@ msgid "" "which in turn results in less upward connections with the next layer. Only " "applies to Wire Printing." msgstr "Suuttimen ja vaakasuoraan laskevien linjojen välinen etäisyys. Suurempi väli aiheuttaa vähemmän jyrkän kulman diagonaalisesti laskeviin linjoihin, mikä puolestaan johtaa harvempiin yläliitoksiin seuraavan kerroksen kanssa. Koskee vain rautalankamallin tulostusta." + +#: fdmprinter.json +msgctxt "layer_0_z_overlap label" +msgid "Initial Layer Z Overlap" +msgstr "Z Päällekkäisyys Alkukerroksen" + +#: fdmprinter.json +msgctxt "layer_0_z_overlap description" +msgid "" +"Make the first and second layer of the object overlap in the Z direction to " +"compensate for the filament lost in the airgap. All models above the first " +"model layer will be shifted down by this amount." +msgstr "Tee ensimmäinen ja toinen kerros esineen päällekkäisyys Z-suunnassa kompensoimiseksi filamentti hävisi ilmaväli. Kaikki mallit yläpuolella ensimmäinen malli kerros on siirtynyt alaspäin tämän määrän." diff --git a/resources/i18n/fr/fdmprinter.json.po b/resources/i18n/fr/fdmprinter.json.po index 7a49440b04..f8e10fa5f4 100644 --- a/resources/i18n/fr/fdmprinter.json.po +++ b/resources/i18n/fr/fdmprinter.json.po @@ -2414,3 +2414,16 @@ msgid "" "which in turn results in less upward connections with the next layer. Only " "applies to Wire Printing." msgstr "Distance entre la buse et les lignes descendantes horizontalement. Un espacement plus important génère des lignes diagonalement descendantes avec un angle moins abrupt, qui génère alors des connexions moins ascendantes avec la couche suivante. Uniquement applicable à l'impression filaire." + +#: fdmprinter.json +msgctxt "layer_0_z_overlap label" +msgid "Initial Layer Z Overlap" +msgstr "" + +#: fdmprinter.json +msgctxt "layer_0_z_overlap description" +msgid "" +"Make the first and second layer of the object overlap in the Z direction to " +"compensate for the filament lost in the airgap. All models above the first " +"model layer will be shifted down by this amount." +msgstr "La première et la deuxième couche de l'objet se chevauchent dans la direction Z pour compenser le filament perdu dans l'entrefer. Toutes les chouches au-dessus de la première couce du modèle seront décalées de ce montant." diff --git a/resources/i18n/it/fdmprinter.json.po b/resources/i18n/it/fdmprinter.json.po index b0e04c4308..40b5e36916 100644 --- a/resources/i18n/it/fdmprinter.json.po +++ b/resources/i18n/it/fdmprinter.json.po @@ -2414,3 +2414,18 @@ msgid "" "which in turn results in less upward connections with the next layer. Only " "applies to Wire Printing." msgstr "Indica la distanza tra l'ugello e le linee diagonali verso il basso. Un maggior gioco risulta in linee diagonali verso il basso con un minor angolo di inclinazione, cosa che a sua volta si traduce in meno collegamenti verso l'alto con lo strato successivo. Applicabile solo alla funzione Wire Printing." + +#: fdmprinter.json +#, fuzzy +msgctxt "layer_0_z_overlap label" +msgid "Initial Layer Z Overlap" +msgstr "Z Sovrapposizione Primo Strato" + +#: fdmprinter.json +#, fuzzy +msgctxt "layer_0_z_overlap description" +msgid "" +"Make the first and second layer of the object overlap in the Z direction to " +"compensate for the filament lost in the airgap. All models above the first " +"model layer will be shifted down by this amount." +msgstr "Effettuare il primo e secondo strato di sovrapposizione oggetto nella direzione Z per compensare il filamento perso nel traferro. Tutti i modelli sopra il primo strato del modello saranno spostate verso il basso di questa quantità." diff --git a/resources/i18n/nl/fdmprinter.json.po b/resources/i18n/nl/fdmprinter.json.po index ff8f896a74..2c6e8a1df8 100644 --- a/resources/i18n/nl/fdmprinter.json.po +++ b/resources/i18n/nl/fdmprinter.json.po @@ -2414,3 +2414,16 @@ msgid "" "which in turn results in less upward connections with the next layer. Only " "applies to Wire Printing." msgstr "De afstand tussen de nozzle en horizontaal neergaande lijnen. Een grotere tussenruimte zorgt voor diagonaal neerwaarts gaande lijnen met een minder steile hoek. Hierdoor ontstaan minder opwaartse verbindingen met de volgende laag. Alleen van toepassing op Draadprinten." + +#: fdmprinter.json +msgctxt "layer_0_z_overlap label" +msgid "Initial Layer Z Overlap" +msgstr "Z Overlap Eerste Laag" + +#: fdmprinter.json +msgctxt "layer_0_z_overlap description" +msgid "" +"Make the first and second layer of the object overlap in the Z direction to " +"compensate for the filament lost in the airgap. All models above the first " +"model layer will be shifted down by this amount." +msgstr "Laat de eerste en tweede laag overlappen in de Z-richting om te compenseren voor verloren materiaal in de luchtlaag. Alle stukjes model boven de eerste laag worden met deze hoveelheid naar beneden verschoven." diff --git a/resources/machines/RigidBot.json b/resources/machines/RigidBot.json deleted file mode 100644 index efd5a6e72c..0000000000 --- a/resources/machines/RigidBot.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "id": "rigidbot", - "version": 1, - "name": "RigidBot", - "manufacturer": "Other", - "author": "RBC", - "platform": "rigidbot_platform.stl", - "file_formats": "text/x-gcode", - "inherits": "fdmprinter.json", - - "machine_settings": { - - "machine_width": { "default": 254 }, - "machine_depth": { "default": 254 }, - "machine_height": { "default": 254 }, - "machine_heated_bed": { "default": true }, - - "machine_nozzle_size": { "default": 0.4, - "visible": true - }, - "machine_nozzle_heat_up_speed": { "default": 2.0 }, - "machine_nozzle_cool_down_speed": { "default": 2.0 }, - "machine_head_shape_min_x": { "default": 0 }, - "machine_head_shape_min_y": { "default": 0 }, - "machine_head_shape_max_x": { "default": 0 }, - "machine_head_shape_max_y": { "default": 0 }, - "machine_nozzle_gantry_distance": { "default": 0 }, - "machine_gcode_flavor": { "default": "RepRap (Marlin/Sprinter)" }, - - "machine_start_gcode": { - "default": ";Sliced at: {day} {date} {time}\n;Basic settings: Layer height: {layer_height} Walls: {wall_thickness} Fill: {infill_sparse_density}\n;Print time: {print_time}\n;Filament used: {filament_amount}m {filament_weight}g\n;Filament cost: {filament_cost}\n;M190 S{print_bed_temperature} ;Uncomment to add your own bed temperature line\n;M109 S{print_temperature} ;Uncomment to add your own temperature line\nG21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nM205 X8 ;X/Y Jerk settings\nG1 Z15.0 F{travel_speed} ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E7 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F{travel_speed}\n;Put printing message on LCD screen\nM117 Rigibot Printing..." - }, - "machine_end_gcode": { - "default": ";End GCode\nM104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+10 E-1 X-20 Y-20 F{travel_speed} ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nG1 Y230 F3000 ;move Y so the head is out of the way and Plate is moved forward\nM84 ;steppers off\nG90 ;absolute positioning\n;{profile_string}" - } - }, - - "overrides": { - "layer_height": { "default": 0.2 }, - "wall_thickness": { "default": 0.8 }, - "top_bottom_thickness": { "default": 0.3, "visible": true }, - "material_print_temperature": { "default": 195, "visible": true }, - "material_bed_temperature": { "default": 60, "visible": true }, - "material_diameter": { "default": 1.75, "visible": true }, - "speed_print": { "default": 60.0, "visible": true }, - "speed_infill": { "default": 100.0, "visible": true }, - "speed_topbottom": { "default": 15.0, "visible": true }, - "speed_travel": { "default": 150.0, "visible": true }, - "speed_layer_0": { "min_value": "0.1", "default": 15.0, "visible": true }, - "infill_overlap": { "default": 10.0 }, - "cool_fan_enabled": { "default": false, "visible": true }, - "cool_fan_speed": { "default": 0.0, "visible": true }, - "skirt_line_count": { "default": 3, "active_if": { "setting": "adhesion_type", "value": "None" } }, - "skirt_gap": { "default": 4.0, "active_if": { "setting": "adhesion_type", "value": "None" } }, - "skirt_minimal_length": { "default": 200.0, "active_if": { "setting": "adhesion_type", "value": "None" } } - } -} diff --git a/resources/machines/RigidBotBig.json b/resources/machines/RigidBotBig.json deleted file mode 100644 index 0f8fdb1481..0000000000 --- a/resources/machines/RigidBotBig.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "id": "rigidbotbig", - "version": 1, - "name": "RigidBotBig", - "manufacturer": "Other", - "author": "RBC", - "platform": "rigidbotbig_platform.stl", - "file_formats": "text/x-gcode", - "inherits": "fdmprinter.json", - - "machine_settings": { - - "machine_width": { "default": 400 }, - "machine_depth": { "default": 300 }, - "machine_height": { "default": 254 }, - "machine_heated_bed": { "default": true }, - - "machine_nozzle_size": { "default": 0.4}, - "machine_nozzle_heat_up_speed": { "default": 2.0 }, - "machine_nozzle_cool_down_speed": { "default": 2.0 }, - "machine_head_shape_min_x": { "default": 0 }, - "machine_head_shape_min_y": { "default": 0 }, - "machine_head_shape_max_x": { "default": 0 }, - "machine_head_shape_max_y": { "default": 0 }, - "machine_nozzle_gantry_distance": { "default": 0 }, - "machine_gcode_flavor": { "default": "RepRap (Marlin/Sprinter)" }, - - "machine_start_gcode": { - "default": ";Sliced at: {day} {date} {time}\n;Basic settings: Layer height: {layer_height} Walls: {wall_thickness} Fill: {infill_sparse_density}\n;Print time: {print_time}\n;Filament used: {filament_amount}m {filament_weight}g\n;Filament cost: {filament_cost}\n;M190 S{print_bed_temperature} ;Uncomment to add your own bed temperature line\n;M109 S{print_temperature} ;Uncomment to add your own temperature line\nG21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nM205 X8 ;X/Y Jerk settings\nG1 Z15.0 F{travel_speed} ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E7 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F{travel_speed}\n;Put printing message on LCD screen\nM117 Rigibot Printing..." - }, - "machine_end_gcode": { - "default": ";End GCode\nM104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+10 E-1 X-20 Y-20 F{travel_speed} ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nG1 Y230 F3000 ;move Y so the head is out of the way and Plate is moved forward\nM84 ;steppers off\nG90 ;absolute positioning\n;{profile_string}" - } - }, - - "overrides": { - "layer_height": { "default": 0.2 }, - "wall_thickness": { "default": 0.8 }, - "top_bottom_thickness": { "default": 0.3, "visible": true }, - "material_print_temperature": { "default": 195, "visible": true }, - "material_bed_temperature": { "default": 60, "visible": true }, - "material_diameter": { "default": 1.75, "visible": true }, - "speed_print": { "default": 60.0, "visible": true}, - "speed_infill": { "default": 100.0, "visible": true }, - "speed_topbottom": { "default": 15.0, "visible": true }, - "speed_travel": { "default": 150.0, "visible": true }, - "speed_layer_0": { "min_value": "0.1", "default": 15.0, "visible": true }, - "infill_overlap": { "default": 10.0 }, - "cool_fan_enabled": { "default": false, "visible": true}, - "cool_fan_speed": { "default": 0.0, "visible": true }, - "skirt_line_count": { "default": 3, "active_if": { "setting": "adhesion_type", "value": "None" } }, - "skirt_gap": { "default": 4.0, "active_if": { "setting": "adhesion_type", "value": "None" } }, - "skirt_minimal_length": { "default": 200.0, "active_if": { "setting": "adhesion_type", "value": "None" } } - } -} diff --git a/resources/machines/bq_hephestos.json b/resources/machines/bq_hephestos.json deleted file mode 100644 index e3aa354b75..0000000000 --- a/resources/machines/bq_hephestos.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "id": "bq_hephestos", - "version": 1, - "name": "BQ Prusa i3 Hephestos", - "manufacturer": "Other", - "author": "BQ", - "platform": "bq_hephestos_platform.stl", - "file_formats": "text/x-gcode", - "inherits": "fdmprinter.json", - - "overrides": { - "machine_start_gcode": { - "default": "; -- START GCODE --\nG21 ;set units to millimetres\nG90 ;set to absolute positioning\nM106 S0 ;set fan speed to zero (turned off)\nG28 X0 Y0 ;move to the X/Y origin (Home)\nG28 Z0 ;move to the Z origin (Home)\nG1 Z15.0 F1200 ;move Z to position 15.0 mm\nG92 E0 ;zero the extruded length\nG1 E20 F200 ;extrude 20mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F7200 ;set feedrate to 120 mm/sec\n; -- end of START GCODE --" - }, - "machine_end_gcode": { - "default": "; -- END GCODE --\nM104 S0 ;set extruder temperature to zero (turned off)\nG91 ;set to relative positioning\nG1 E-20 F300 ;retract the filament a bit to release some of the pressure\nG1 Z10 ;move extruder up 10 mm\nG90 ;set to absolute positioning\nG1 X0 Y180 F1200 ;expose the platform\nM84 ;turn off steppers\n; -- end of END GCODE --" - }, - "machine_width": { - "default": 215 - }, - "machine_depth": { - "default": 210 - }, - "machine_height": { - "default": 180 - }, - "machine_heated_bed": { - "default": false - }, - "machine_center_is_zero": { - "default": false - }, - "machine_gcode_flavor": { - "default": "RepRap" - }, - "machine_platform_offset": { - "default": [0, -82, 0] - }, - "layer_height": { "default": 0.2 }, - "layer_height_0": { "default": 0.2, "visible": false }, - "wall_thickness": { "default": 1.0, "visible": false }, - "top_bottom_thickness": { "default": 1.0, "visible": false}, - "bottom_thickness": { "default": 1.0, "visible": false }, - "material_print_temperature": { "default": 220, "visible": true }, - "material_bed_temperature": { "default": 0, "visible": false }, - "material_diameter": { "default": 1.75, "visible": true }, - "speed_print": { "default": 40.0}, - "speed_infill": { "default": 40.0, "visible": true }, - "speed_wall": { "default": 35.0, "visible": true}, - "speed_topbottom": { "default": 35.0, "visible": true }, - "speed_travel": { "default": 120.0 }, - "speed_layer_0": { "default": 20.0, "visible": false }, - "support_enable": { "default": true } - } -} diff --git a/resources/machines/bq_hephestos_2.json b/resources/machines/bq_hephestos_2.json deleted file mode 100644 index 8b1ed34caa..0000000000 --- a/resources/machines/bq_hephestos_2.json +++ /dev/null @@ -1,63 +0,0 @@ -{ - "id": "bq_hephestos_2", - "version": 1, - "name": "BQ Hephestos 2", - "manufacturer": "Other", - "author": "BQ", - "platform": "bq_hephestos_2_platform.stl", - "file_formats": "text/x-gcode", - "inherits": "fdmprinter.json", - - "overrides": { - "machine_start_gcode": { - "default": "; -- START GCODE --\nM800 ; Custom GCODE to fire start print procedure\n; -- end of START GCODE --" - }, - "machine_end_gcode": { - "default": "; -- END GCODE --\nM801 ; Custom GCODE to fire end print procedure\n; -- end of END GCODE --" - }, - "machine_width": { - "default": 210 - }, - "machine_depth": { - "default": 297 - }, - "machine_height": { - "default": 220 - }, - "machine_heated_bed": { - "default": false - }, - "machine_center_is_zero": { - "default": false - }, - "machine_gcode_flavor": { - "default": "RepRap" - }, - "machine_platform_offset": { - "default": [6, 1320, 0] - }, - "material_print_temperature": { "default": 210.0, "visible": true }, - "material_bed_temperature": { "default": 0 }, - "material_diameter": { "default": 1.75 }, - "layer_height": { "default": 0.2 }, - "layer_height_0": { "default": 0.2, "visible": true }, - "wall_line_count": { "default": 3, "visible": false }, - "wall_thickness": { "default": 1.2, "visible": false }, - "top_bottom_thickness": { "default": 1.2, "visible": false }, - "infill_sparse_density": { "default": 20.0 }, - "infill_overlap": { "default": 15.0, "visible": false }, - "speed_print": { "default": 60.0 }, - "speed_travel": { "default": 160.0 }, - "speed_layer_0": { "default": 30.0, "visible": true }, - "speed_wall_x": { "default": 35.0, "visible": false }, - "speed_wall_0": { "default": 30.0, "visible": false }, - "speed_infill": { "default": 80.0, "visible": true }, - "speed_topbottom": { "default": 35.0, "visible": false }, - "skirt_speed": { "default": 35.0, "visible": false }, - "skirt_line_count": { "default": 4 }, - "skirt_minimal_length": { "default": 30.0, "visible": false }, - "skirt_gap": { "default": 6.0 }, - "cool_fan_full_at_height": { "default": 0.4, "visible": false }, - "support_enable": { "default": false } - } -} diff --git a/resources/machines/bq_hephestos_xl.json b/resources/machines/bq_hephestos_xl.json deleted file mode 100644 index 5ce1dc3a7f..0000000000 --- a/resources/machines/bq_hephestos_xl.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "id": "bq_hephestos_xl", - "version": 1, - "name": "BQ Prusa i3 Hephestos XL", - "manufacturer": "Other", - "author": "BQ", - "platform": "bq_hephestos_platform.stl", - "file_formats": "text/x-gcode", - "inherits": "fdmprinter.json", - - "overrides": { - "machine_start_gcode": { - "default": "; -- START GCODE --\nG21 ;set units to millimetres\nG90 ;set to absolute positioning\nM106 S0 ;set fan speed to zero (turned off)\nG28 X0 Y0 ;move to the X/Y origin (Home)\nG28 Z0 ;move to the Z origin (Home)\nG1 Z15.0 F1200 ;move Z to position 15.0 mm\nG92 E0 ;zero the extruded length\nG1 E20 F200 ;extrude 20mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F7200 ;set feedrate to 120 mm/sec\n; -- end of START GCODE --" - }, - "machine_end_gcode": { - "default": "; -- END GCODE --\nM104 S0 ;set extruder temperature to zero (turned off)\nG91 ;set to relative positioning\nG1 E-20 F300 ;retract the filament a bit to release some of the pressure\nG1 Z10 ;move extruder up 10 mm\nG90 ;set to absolute positioning\nG1 X0 Y180 F1200 ;expose the platform\nM84 ;turn off steppers\n; -- end of END GCODE --" - }, - "machine_width": { - "default": 200 - }, - "machine_depth": { - "default": 300 - }, - "machine_height": { - "default": 180 - }, - "machine_heated_bed": { - "default": false - }, - "machine_center_is_zero": { - "default": false - }, - "machine_gcode_flavor": { - "default": "RepRap" - }, - "machine_platform_offset": { - "default": [0, -82, 0] - }, - "layer_height": { "default": 0.2 }, - "layer_height_0": { "default": 0.2, "visible": false }, - "wall_thickness": { "default": 1.0, "visible": false }, - "top_bottom_thickness": { "default": 1.0, "visible": false}, - "bottom_thickness": { "default": 1.0, "visible": false }, - "material_print_temperature": { "default": 220, "visible": true }, - "material_bed_temperature": { "default": 0, "visible": false }, - "material_diameter": { "default": 1.75, "visible": true }, - "speed_print": { "default": 40.0}, - "speed_infill": { "default": 40.0, "visible": true }, - "speed_wall": { "default": 35.0, "visible": true}, - "speed_topbottom": { "default": 35.0, "visible": true }, - "speed_travel": { "default": 120.0 }, - "speed_layer_0": { "default": 20.0, "visible": false }, - "support_enable": { "default": true } - } -} diff --git a/resources/machines/bq_witbox.json b/resources/machines/bq_witbox.json deleted file mode 100644 index 83ac707ff6..0000000000 --- a/resources/machines/bq_witbox.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "id": "bq_witbox", - "version": 1, - "name": "BQ Witbox", - "manufacturer": "Other", - "author": "BQ", - "platform": "bq_witbox_platform.stl", - "file_formats": "text/x-gcode", - "inherits": "fdmprinter.json", - - "overrides": { - "machine_start_gcode": { - "default": "; -- START GCODE --\nG21 ;set units to millimetres\nG90 ;set to absolute positioning\nM106 S0 ;set fan speed to zero (turned off)\nG28 X0 Y0 ;move to the X/Y origin (Home)\nG28 Z0 ;move to the Z origin (Home)\nG1 Z15.0 F1200 ;move Z to position 15.0 mm\nG92 E0 ;zero the extruded length\nG1 E20 F200 ;extrude 20mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F7200 ;set feedrate to 120 mm/sec\n; -- end of START GCODE --" - }, - "machine_end_gcode": { - "default": "; -- END GCODE --\nM104 S0 ;set extruder temperature to zero (turned off)\nG91 ;set to relative positioning\nG1 E-20 F300 ;retract the filament a bit to release some of the pressure\nG90 ;set to absolute positioning\nG1 Z200 ;move the platform to the bottom\nG28 X0 Y0 ;move to the X/Y origin (Home)\nM84 ;turn off steppers\n; -- end of END GCODE --" - }, - "machine_width": { - "default": 297 - }, - "machine_depth": { - "default": 210 - }, - "machine_height": { - "default": 200 - }, - "machine_heated_bed": { - "default": false - }, - "machine_center_is_zero": { - "default": false - }, - "machine_gcode_flavor": { - "default": "RepRap" - }, - "machine_platform_offset": { - "default": [0, -145, -38] - }, - "layer_height": { "default": 0.2 }, - "layer_height_0": { "default": 0.2, "visible": false }, - "wall_thickness": { "default": 1.0, "visible": false }, - "top_bottom_thickness": { "default": 1.0, "visible": false}, - "bottom_thickness": { "default": 1.0, "visible": false }, - "material_print_temperature": { "default": 220, "visible": true }, - "material_bed_temperature": { "default": 0, "visible": false }, - "material_diameter": { "default": 1.75, "visible": true }, - "speed_print": { "default": 40.0}, - "speed_infill": { "default": 40.0, "visible": true }, - "speed_wall": { "default": 35.0, "visible": true}, - "speed_topbottom": { "default": 35.0, "visible": true }, - "speed_travel": { "default": 120.0 }, - "speed_layer_0": { "default": 20.0, "visible": false }, - "support_enable": { "default": true } - } -} diff --git a/resources/machines/bq_witbox_2.json b/resources/machines/bq_witbox_2.json deleted file mode 100644 index 61ce18a161..0000000000 --- a/resources/machines/bq_witbox_2.json +++ /dev/null @@ -1,63 +0,0 @@ -{ - "id": "bq_witbox_2", - "version": 1, - "name": "BQ Witbox 2", - "manufacturer": "Other", - "author": "BQ", - "platform": "bq_witbox_platform.stl", - "file_formats": "text/x-gcode", - "inherits": "fdmprinter.json", - - "overrides": { - "machine_start_gcode": { - "default": "; -- START GCODE --\nM800 ; Custom GCODE to fire start print procedure\n; -- end of START GCODE --" - }, - "machine_end_gcode": { - "default": "; -- END GCODE --\nM801 ; Custom GCODE to fire end print procedure\n; -- end of END GCODE --" - }, - "machine_width": { - "default": 297 - }, - "machine_depth": { - "default": 210 - }, - "machine_height": { - "default": 200 - }, - "machine_heated_bed": { - "default": false - }, - "machine_center_is_zero": { - "default": false - }, - "machine_gcode_flavor": { - "default": "RepRap" - }, - "machine_platform_offset": { - "default": [0, -145, -38] - }, - "material_print_temperature": { "default": 210.0, "visible": true }, - "material_bed_temperature": { "default": 0 }, - "material_diameter": { "default": 1.75 }, - "layer_height": { "default": 0.2 }, - "layer_height_0": { "default": 0.2, "visible": true }, - "wall_line_count": { "default": 3, "visible": false }, - "wall_thickness": { "default": 1.2, "visible": false }, - "top_bottom_thickness": { "default": 1.2, "visible": false }, - "infill_sparse_density": { "default": 20.0 }, - "infill_overlap": { "default": 15.0, "visible": false }, - "speed_print": { "default": 60.0 }, - "speed_travel": { "default": 160.0 }, - "speed_layer_0": { "default": 30.0, "visible": true }, - "speed_wall_x": { "default": 35.0, "visible": false }, - "speed_wall_0": { "default": 30.0, "visible": false }, - "speed_infill": { "default": 80.0, "visible": true }, - "speed_topbottom": { "default": 35.0, "visible": false }, - "skirt_speed": { "default": 35.0, "visible": false }, - "skirt_line_count": { "default": 4 }, - "skirt_minimal_length": { "default": 30.0, "visible": false }, - "skirt_gap": { "default": 6.0 }, - "cool_fan_full_at_height": { "default": 0.4, "visible": false }, - "support_enable": { "default": false } - } -} diff --git a/resources/machines/dual_extrusion_printer.json b/resources/machines/dual_extrusion_printer.json deleted file mode 100644 index 2977345bcb..0000000000 --- a/resources/machines/dual_extrusion_printer.json +++ /dev/null @@ -1,311 +0,0 @@ -{ - "version": 1, - "id": "dual_extrusion", - "name": "Dual Extrusion Base File", - "file_formats": "text/x-gcode;application/x-stl-ascii;application/x-stl-binary;application/x-wavefront-obj;application/x3g", - "inherits": "fdmprinter.json", - - "visible": false, - - "machine_extruder_trains": { - "0": { - "extruder_nr": { "default": 0 }, - "machine_nozzle_offset_x": { "default": 0.0 }, - "machine_nozzle_offset_y": { "default": 0.0 } - }, - "1": { - "extruder_nr": { "default": 1 } - } - }, - - "machine_settings": { - "machine_use_extruder_offset_to_offset_coords": { "default": false }, - - "machine_nozzle_offset_x": { "default": 0, "SEE_machine_extruder_trains": true }, - "machine_nozzle_offset_y": { "default": 0, "SEE_machine_extruder_trains": true }, - "machine_extruder_start_code": { "default": "", "SEE_machine_extruder_trains": true }, - "machine_extruder_start_pos_abs": { "default": false, "SEE_machine_extruder_trains": true }, - "machine_extruder_start_pos_x": { "default": 0, "SEE_machine_extruder_trains": true }, - "machine_extruder_start_pos_y": { "default": 0, "SEE_machine_extruder_trains": true }, - "machine_extruder_end_pos_abs": { "default": false, "SEE_machine_extruder_trains": true }, - "machine_extruder_end_pos_x": { "default": 0, "SEE_machine_extruder_trains": true }, - "machine_extruder_end_pos_y": { "default": 0, "SEE_machine_extruder_trains": true }, - "machine_extruder_end_code": { "default": "", "SEE_machine_extruder_trains": true } - }, - "overrides": { - "speed_print": { - "children": { - "speed_prime_tower": { - "label": "Prime Tower Speed", - "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.", - "unit": "mm/s", - "type": "float", - "min_value": "0.1", - "max_value_warning": "150", - "default": 60, - "visible": false, - "enabled": "prime_tower_enable", - "global_only": true - } - } - }, - "line_width": { - "children": { - "prime_tower_line_width": { - "label": "Prime Tower Line Width", - "description": "Width of a single prime tower line.", - "unit": "mm", - "min_value": "0.0001", - "min_value_warning": "0.2", - "max_value_warning": "5", - "default": 0.4, - "type": "float", - "visible": false, - "enabled": "prime_tower_enable", - "global_only": true - } - } - } - }, - "categories": { - "dual": { - "label": "Dual Extrusion", - "visible": true, - "icon": "category_dual", - "settings": { - "extruder_nr": { - "label": "Extruder", - "description": "The extruder train used for printing. This is used in multi-extrusion.", - "type": "int", - "default": 0, - "min_value": "0", - "max_value": "machine_extruder_count - 1", - "always_visible": true - }, - "adhesion_extruder_nr": { - "label": "Platform Adhesion Extruder", - "description": "The extruder train to use for printing the skirt/brim/raft. This is used in multi-extrusion.", - "type": "int", - "default": 0, - "min_value": "0", - "max_value": "machine_extruder_count - 1", - "global_only": true - }, - "support_extruder_nr": { - "label": "Support Extruder", - "description": "The extruder train to use for printing the support. This is used in multi-extrusion.", - "type": "int", - "default": 0, - "min_value": "0", - "max_value": "machine_extruder_count - 1", - "global_only": true, - "children": { - "support_infill_extruder_nr": { - "label": "Support Infill Extruder", - "description": "The extruder train to use for printing the infill of the support. This is used in multi-extrusion.", - "type": "int", - "default": 0, - "min_value": "0", - "max_value": "machine_extruder_count - 1", - "global_only": true - }, - "support_extruder_nr_layer_0": { - "label": "First Layer Support Extruder", - "description": "The extruder train to use for printing the first layer of support infill. This is used in multi-extrusion.", - "type": "int", - "default": 0, - "min_value": "0", - "max_value": "machine_extruder_count - 1", - "global_only": true - }, - "support_roof_extruder_nr": { - "label": "Support Roof Extruder", - "description": "The extruder train to use for printing the roof of the support. This is used in multi-extrusion.", - "type": "int", - "default": 0, - "min_value": "0", - "max_value": "machine_extruder_count - 1", - "enabled": "support_roof_enable", - "global_only": true - } - } - }, - "prime_tower_enable": { - "label": "Enable Prime Tower", - "description": "Print a tower next to the print which serves to prime the material after each nozzle switch.", - "type": "boolean", - "visible": true, - "default": false, - "global_only": true - }, - "prime_tower_size": { - "label": "Prime Tower Size", - "description": "The width of the prime tower.", - "visible": false, - "type": "float", - "unit": "mm", - "default": 15, - "min_value": "0", - "max_value_warning": "20", - "inherit_function": "15 if prime_tower_enable else 0", - "enabled": "prime_tower_enable", - "global_only": true - }, - "prime_tower_position_x": { - "label": "Prime Tower X Position", - "description": "The x position of the prime tower.", - "visible": false, - "type": "float", - "unit": "mm", - "default": 200, - "min_value_warning": "-1000", - "max_value_warning": "1000", - "enabled": "prime_tower_enable", - "global_only": true - }, - "prime_tower_position_y": { - "label": "Prime Tower Y Position", - "description": "The y position of the prime tower.", - "visible": false, - "type": "float", - "unit": "mm", - "default": 200, - "min_value_warning": "-1000", - "max_value_warning": "1000", - "enabled": "prime_tower_enable", - "global_only": true - }, - "prime_tower_flow": { - "label": "Prime Tower Flow", - "description": "Flow compensation: the amount of material extruded is multiplied by this value.", - "visible": false, - "unit": "%", - "default": 100, - "type": "float", - "min_value": "5", - "min_value_warning": "50", - "max_value_warning": "150", - "enabled": "prime_tower_enable", - "global_only": true - }, - "prime_tower_wipe_enabled": { - "label": "Wipe Nozzle on Prime tower", - "description": "After printing the prime tower with the one nozzle, wipe the oozed material from the other nozzle off on the prime tower.", - "type": "boolean", - "default": false, - "enabled": "prime_tower_enable", - "global_only": true - }, - "multiple_mesh_overlap": { - "label": "Dual Extrusion Overlap", - "description": "Make the objects printed with different extruder trains overlap a bit. This makes the different materials bond together better.", - "visible": false, - "type": "float", - "unit": "mm", - "default": 0.15, - "min_value": "0", - "max_value_warning": "1.0", - "global_only": true - }, - "ooze_shield_enabled": { - "label": "Enable Ooze Shield", - "description": "Enable exterior ooze shield. This will create a shell around the object which is likely to wipe a second nozzle if it's at the same height as the first nozzle.", - "type": "boolean", - "default": false, - "global_only": true - }, - "ooze_shield_angle": { - "label": "Ooze Shield Angle", - "description": "The maximum angle a part in the ooze shield will have. With 0 degrees being vertical, and 90 degrees being horizontal. A smaller angle leads to less failed ooze shields, but more material.", - "unit": "°", - "type": "float", - "min_value": "0", - "max_value": "90", - "default": 60, - "visible": false, - "enabled": "ooze_shield_enabled", - "global_only": true - }, - "ooze_shield_dist": { - "label": "Ooze Shields Distance", - "description": "Distance of the ooze shield from the print, in the X/Y directions.", - "unit": "mm", - "type": "float", - "min_value": "0", - "max_value_warning": "30", - "default": 2, - "visible": false, - "enabled": "ooze_shield_enabled", - "global_only": true - } - } - }, - "material": { - "settings": { - "material_standby_temperature": { - "label": "Standby Temperature", - "description": "The temperature of the nozzle when another nozzle is currently used for printing.", - "unit": "°C", - "type": "float", - "default": 150, - "min_value": "0", - "max_value_warning": "260", - "global_only": "True", - "visible": false - }, - "switch_extruder_retraction_amount": { - "label": "Nozzle Switch Retraction Distance", - "description": "The amount of retraction: Set at 0 for no retraction at all. This should generally be the same as the length of the heat zone.", - "unit": "mm", - "type": "float", - "default": 20, - "min_value_warning": "0", - "max_value_warning": "100", - "visible": false, - "inherit_function": "machine_heat_zone_length", - "enabled": "retraction_enable", - "global_only": true - }, - "switch_extruder_retraction_speeds": { - "label": "Nozzle Switch Retraction Speed", - "description": "The speed at which the filament is retracted. A higher retraction speed works better, but a very high retraction speed can lead to filament grinding.", - "unit": "mm/s", - "type": "float", - "default": 20, - "min_value": "0.1", - "max_value_warning": "300", - "visible": false, - "inherit": false, - "enabled": "retraction_enable", - "global_only": true, - "children": { - "switch_extruder_retraction_speed": { - "label": "Nozzle Switch Retract Speed", - "description": "The speed at which the filament is retracted during a nozzle switch retract. ", - "unit": "mm/s", - "type": "float", - "default": 20, - "min_value": "0.1", - "max_value_warning": "300", - "visible": false, - "enabled": "retraction_enable", - "global_only": true - }, - "switch_extruder_prime_speed": { - "label": "Nozzle Switch Prime Speed", - "description": "The speed at which the filament is pushed back after a nozzle switch retraction.", - "unit": "mm/s", - "type": "float", - "default": 20, - "min_value": "0.1", - "max_value_warning": "300", - "visible": false, - "enabled": "retraction_enable", - "global_only": true - } - } - } - } - } - } -} diff --git a/resources/machines/fdmprinter.json b/resources/machines/fdmprinter.json deleted file mode 100644 index 23f5a67af9..0000000000 --- a/resources/machines/fdmprinter.json +++ /dev/null @@ -1,2411 +0,0 @@ -{ - "id": "fdmprinter", - "visible": false, - "version": 1, - "name": "FDM Printer Base Description", - "author": "Ultimaker B.V.", - "manufacturer": "Ultimaker", - "file_formats": "text/x-gcode;application/x-stl-ascii;application/x-stl-binary;application/x-wavefront-obj;application/x3g", - - "add_pages": [], - - "machine_settings": { - "machine_show_variants": { - "description": "Wether to show the different variants of this machine, which are described in separate json files.", - "default": false - }, - "machine_start_gcode": { - "description": "Gcode commands to be executed at the very start - separated by \\n.", - "default": "G28 ; Home\nG1 Z15.0 F6000 ;move the platform down 15mm\n;Prime the extruder\nG92 E0\nG1 F200 E3\nG92 E0", - "global_only": true - }, - "machine_end_gcode": { - "description": "Gcode commands to be executed at the very end - separated by \\n.", - "default": "M104 S0\nM140 S0\n;Retract the filament\nG92 E1\nG1 E-1 F300\nG28 X0 Y0\nM84", - "global_only": true - }, - "material_bed_temp_wait": { - "description": "Whether to insert a command to wait until the bed temperature is reached at the start.", - "default": true, - "global_only": true - }, - "material_print_temp_wait": { - "description": "Whether to insert a command to wait until the nozzle temperatures are reached at the start.", - "default": true, - "global_only": true - }, - "material_print_temp_prepend": { - "description": "Whether to include nozzle temperature commands at the start of the gcode. When the start_gcode already contains nozzle temperature commands Cura frontend will automatically disable this setting.", - "default": true, - "global_only": true - }, - "material_bed_temp_prepend": { - "description": "Whether to include bed temperature commands at the start of the gcode. When the start_gcode already contains bed temperature commands Cura frontend will automatically disable this setting.", - "default": true, - "global_only": true - }, - "machine_width": { - "description": "The width (X-direction) of the printable area.", - "default": 100, - "global_only": true - }, - "machine_depth": { - "description": "The depth (Y-direction) of the printable area.", - "default": 100, - "global_only": true - }, - "machine_height": { - "description": "The height (Z-direction) of the printable area.", - "default": 100, - "global_only": true - }, - "machine_heated_bed": { - "description": "Whether the machine has a heated bed present.", - "default": false, - "global_only": true - }, - "machine_center_is_zero": { - "description": "Whether the X/Y coordinates of the zero position of the printer is at the center of the printable area.", - "default": false, - "global_only": true - }, - "machine_extruder_count": { - "description": "Number of extruder trains. An extruder train is the combination of a feeder, bowden tube, and nozzle.", - "default": 1, - "global_only": true - }, - "machine_nozzle_tip_outer_diameter": { - "description": "The outer diameter of the tip of the nozzle.", - "default": 1, - "SEE_machine_extruder_trains": true, - "global_only": true - }, - "machine_nozzle_head_distance": { - "description": "The height difference between the tip of the nozzle and the lowest part of the print head.", - "default": 3, - "SEE_machine_extruder_trains": true, - "global_only": true - }, - "machine_nozzle_expansion_angle": { - "description": "The angle between the horizontal plane and the conical part right above the tip of the nozzle.", - "default": 45, - "SEE_machine_extruder_trains": true, - "global_only": true - }, - "machine_heat_zone_length": { - "description": "The distance from the tip of the nozzle in which heat from the nozzle is transfered to the filament.", - "default": 16, - "SEE_machine_extruder_trains": true, - "global_only": true - }, - "machine_nozzle_heat_up_speed": { - "description": "The speed (°C/s) by which the nozzle heats up averaged over the window of normal printing temperatures and the standby temperature.", - "default": 2.0, - "SEE_machine_extruder_trains": true, - "global_only": true - }, - "machine_nozzle_cool_down_speed": { - "description": "The speed (°C/s) by which the nozzle cools down averaged over the window of normal printing temperatures and the standby temperature.", - "default": 2.0, - "SEE_machine_extruder_trains": true, - "global_only": true - }, - "machine_gcode_flavor": { - "description": "The type of gcode to be generated.", - "default": "RepRap", - "global_only": true - }, - "machine_disallowed_areas": { - "description": "A list of polygons with areas the print head is not allowed to enter.", - "type": "polygons", - "default": [], - "global_only": true - }, - "machine_platform_offset": { - "description": "Where to display the platform mesh.", - "default": [ - 0, - 0, - 0 - ], - "global_only": true - }, - "machine_head_polygon": { - "description": "A 2D silhouette of the print head (fan caps excluded).", - "type": "polygon", - "default": [ - [ - -1, - 1 - ], - [ - -1, - -1 - ], - [ - 1, - -1 - ], - [ - 1, - 1 - ] - ], - "global_only": true - }, - "machine_head_with_fans_polygon": { - "description": "A 2D silhouette of the print head (fan caps included).", - "type": "polygon", - "default": [ - [ - -20, - 10 - ], - [ - 10, - 10 - ], - [ - 10, - -10 - ], - [ - -20, - -10 - ] - ], - "global_only": true - }, - "gantry_height": { - "description": "The height difference between the tip of the nozzle and the gantry system (X and Y axes).", - "default": 99999999999, - "global_only": true - } - }, - "categories": { - "machine": { - "label": "Machine", - "visible": true, - "icon": "category_machine", - "settings": { - "machine_nozzle_size": { - "label": "Nozzle Diameter", - "description": "The inner diameter of the nozzle. Change this setting when using a non-standard nozzle size.", - "unit": "mm", - "type": "float", - "default": 0.4, - "min_value": "0.001", - "max_value_warning": "10", - "visible": false - } - }, - "global_only": true - }, - "resolution": { - "label": "Quality", - "visible": true, - "icon": "category_layer_height", - "settings": { - "layer_height": { - "label": "Layer Height", - "description": "The height of each layer in mm. Higher values produce faster prints in lower resolution, lower values produce slower prints in higher resolution.", - "unit": "mm", - "type": "float", - "default": 0.1, - "min_value": "0.001", - "min_value_warning": "0.04", - "max_value_warning": "0.8 * machine_nozzle_size", - "global_only": "True" - }, - "layer_height_0": { - "label": "Initial Layer Height", - "description": "The height of the initial layer in mm. A thicker initial layer makes adhesion to the build plate easier.", - "unit": "mm", - "type": "float", - "default": 0.3, - "min_value": "0.001", - "min_value_warning": "0.04", - "max_value_warning": "0.8 * machine_nozzle_size", - "visible": false, - "global_only": "True" - }, - "line_width": { - "label": "Line Width", - "description": "Width of a single line. Generally, the width of each line should correspond to the width of the nozzle. However, slightly reducing this value could produce better prints.", - "unit": "mm", - "min_value": "0.0001", - "min_value_warning": "0.2", - "max_value_warning": "2 * machine_nozzle_size", - "default": 0.4, - "type": "float", - "visible": false, - "inherit_function": "machine_nozzle_size", - "children": { - "wall_line_width": { - "label": "Wall Line Width", - "description": "Width of a single wall line.", - "unit": "mm", - "min_value": "0.0001", - "min_value_warning": "0.2", - "max_value_warning": "5", - "default": 0.4, - "type": "float", - "visible": false, - "children": { - "wall_line_width_0": { - "label": "Outer Wall Line Width", - "description": "Width of the outermost wall line. By lowering this value, higher levels of detail can be printed.", - "unit": "mm", - "min_value": "0.0001", - "min_value_warning": "0.2", - "max_value_warning": "5", - "default": 0.4, - "type": "float", - "visible": false - }, - "wall_line_width_x": { - "label": "Inner Wall(s) Line Width", - "description": "Width of a single wall line for all wall lines except the outermost one.", - "unit": "mm", - "min_value": "0.0001", - "min_value_warning": "0.2", - "max_value_warning": "5", - "default": 0.4, - "type": "float", - "visible": false - } - } - }, - "skin_line_width": { - "label": "Top/bottom Line Width", - "description": "Width of a single top/bottom line.", - "unit": "mm", - "min_value": "0.0001", - "min_value_warning": "0.2", - "max_value_warning": "5", - "default": 0.4, - "type": "float", - "visible": false - }, - "infill_line_width": { - "label": "Infill Line Width", - "description": "Width of a single infill line.", - "unit": "mm", - "min_value": "0.0001", - "min_value_warning": "0.2", - "max_value_warning": "5", - "default": 0.4, - "type": "float", - "visible": false - }, - "skirt_line_width": { - "label": "Skirt Line Width", - "description": "Width of a single skirt line.", - "unit": "mm", - "min_value": "0.0001", - "min_value_warning": "0.2", - "max_value_warning": "5", - "default": 0.4, - "type": "float", - "visible": false, - "global_only": true - }, - "support_line_width": { - "label": "Support Line Width", - "description": "Width of a single support structure line.", - "unit": "mm", - "min_value": "0.0001", - "min_value_warning": "0.2", - "max_value_warning": "5", - "default": 0.4, - "type": "float", - "visible": false, - "enabled": "support_enable", - "global_only": true - }, - "support_roof_line_width": { - "label": "Support Roof Line Width", - "description": "Width of a single support roof line.", - "unit": "mm", - "default": 0.4, - "min_value": "0.0001", - "max_value_warning": "machine_nozzle_size * 2", - "type": "float", - "visible": false, - "enabled": "support_roof_enable", - "global_only": true - } - } - } - } - }, - "shell": { - "label": "Shell", - "visible": true, - "icon": "category_shell", - "settings": { - "wall_thickness": { - "label": "Wall Thickness", - "description": "The thickness of the outside walls in the horizontal direction. This value divided by the wall line width defines the number of walls.", - "unit": "mm", - "default": 0.8, - "min_value": "0", - "min_value_warning": "line_width", - "max_value_warning": "5 * line_width", - "type": "float", - "visible": true, - "children": { - "wall_line_count": { - "label": "Wall Line Count", - "description": "The number of walls. When calculated by the wall thickness, this value is rounded to a whole number.", - "default": 2, - "min_value": "0", - "type": "int", - "visible": false, - "inherit_function": "1 if magic_spiralize else max(1, round((wall_thickness - wall_line_width_0) / wall_line_width_x) + 1)" - } - } - }, - "top_bottom_thickness": { - "label": "Top/Bottom Thickness", - "description": "The thickness of the top/bottom layers in the print. This value divided by the layer height defines the number of top/bottom layers.", - "unit": "mm", - "default": 0.8, - "min_value": "0", - "max_value": "5", - "min_value_warning": "0.6", - "type": "float", - "visible": true, - "children": { - "top_thickness": { - "label": "Top Thickness", - "description": "The thickness of the top layers in the print. This value divided by the layer height defines the number of top layers.", - "unit": "mm", - "default": 0.8, - "min_value": "0", - "max_value_warning": "100", - "type": "float", - "visible": false, - "children": { - "top_layers": { - "label": "Top Layers", - "description": "The number of top layers. When calculated by the top thickness, this value is rounded to a whole number.", - "default": 8, - "min_value": "0", - "max_value_warning": "100", - "type": "int", - "visible": false, - "inherit_function": "0 if infill_sparse_density == 100 else math.ceil(round(parent_value / layer_height, 4))" - } - } - }, - "bottom_thickness": { - "label": "Bottom Thickness", - "description": "The thickness of the bottom layers in the print. This value divided by the layer height defines the number of bottom layers.", - "unit": "mm", - "default": 0.6, - "min_value": "0", - "type": "float", - "visible": false, - "children": { - "bottom_layers": { - "label": "Bottom Layers", - "description": "The number of bottom layers. When calculated by the bottom thickness, this value is rounded to a whole number.", - "min_value": "0", - "default": 6, - "type": "int", - "visible": false, - "inherit_function": "999999 if infill_sparse_density == 100 else math.ceil(round(parent_value / layer_height, 4))" - } - } - } - } - }, - "top_bottom_pattern": { - "label": "Top/Bottom Pattern", - "description": "The pattern of the top/bottom layers.", - "type": "enum", - "options": { - "lines": "Lines", - "concentric": "Concentric", - "zigzag": "Zig Zag" - }, - "default": "lines", - "visible": false - }, - "wall_0_inset": { - "label": "Outer Wall Inset", - "description": "Inset applied to the path of the outer wall. If the outer wall is smaller than the nozzle, and printed after the inner walls, use this offset to get the hole in the nozzle to overlap with the inner walls instead of the outside of the object.", - "unit": "mm", - "type": "float", - "default": 0.0, - "inherit_function": "(machine_nozzle_size - wall_line_width_0) / 2 if wall_line_width_0 < machine_nozzle_size else 0", - "min_value_warning": "0", - "max_value_warning": "machine_nozzle_size", - "visible": false - }, - "alternate_extra_perimeter": { - "label": "Alternate Extra Wall", - "description": "Prints an extra wall at every other layer. This way infill gets caught between these extra walls, resulting in stronger prints.", - "type": "boolean", - "default": false, - "visible": false, - "inherit": false - }, - "remove_overlapping_walls_enabled": { - "label": "Remove Overlapping Wall Parts", - "description": "Remove parts of a wall which share an overlap which would result in overextrusion in some places. These overlaps occur in thin parts and sharp corners in models.", - "type": "boolean", - "default": false, - "visible": false, - "enabled": "False", - "children": { - "remove_overlapping_walls_0_enabled": { - "label": "Remove Overlapping Outer Wall Parts", - "description": "Remove parts of an outer wall which share an overlap which would result in overextrusion in some places. These overlaps occur in thin pieces in a model and sharp corners.", - "type": "boolean", - "default": false, - "visible": false, - "inherit": true, - "enabled": "False" - }, - "remove_overlapping_walls_x_enabled": { - "label": "Remove Overlapping Inner Wall Parts", - "description": "Remove parts of an inner wall that would otherwise overlap and cause over-extrusion. These overlaps occur in thin pieces in a model and sharp corners.", - "type": "boolean", - "default": true, - "visible": false, - "inherit": false - } - } - }, - "fill_perimeter_gaps": { - "label": "Fill Gaps Between Walls", - "description": "Fills the gaps between walls when overlapping inner wall parts are removed.", - "type": "enum", - "options": { - "nowhere": "Nowhere", - "everywhere": "Everywhere", - "skin": "Skin" - }, - "default": "everywhere", - "visible": false, - "enabled": "remove_overlapping_walls_x_enabled" - }, - "travel_compensate_overlapping_walls_enabled": { - "label": "Compensate Wall Overlaps", - "description": "Compensate the flow for parts of a wall being printed where there is already a wall in place.", - "type": "boolean", - "default": true, - "visible": false, - "children": { - "travel_compensate_overlapping_walls_0_enabled": { - "label": "Compensate Outer Wall Overlaps", - "description": "Compensate the flow for parts of an outer wall being printed where there is already a wall in place.", - "type": "boolean", - "default": true, - "visible": false, - "inherit_function": "parent_value" - }, - "travel_compensate_overlapping_walls_x_enabled": { - "label": "Compensate Inner Wall Overlaps", - "description": "Compensate the flow for parts of an inner wall being printed where there is already a wall in place.", - "type": "boolean", - "default": true, - "visible": false, - "inherit_function": "parent_value" - } - } - }, - "xy_offset": { - "label": "Horizontal Expansion", - "description": "Amount of offset applied to all polygons in each layer. Positive values can compensate for too big holes; negative values can compensate for too small holes.", - "unit": "mm", - "type": "float", - "min_value_warning": "-10", - "max_value_warning": "10", - "default": 0, - "visible": false - }, - "z_seam_type": { - "label": "Z Seam Alignment", - "description": "Starting point of each path in a layer. When paths in consecutive layers start at the same point a vertical seam may show on the print. When aligning these at the back, the seam is easiest to remove. When placed randomly the inaccuracies at the paths' start will be less noticeable. When taking the shortest path the print will be quicker.", - "type": "enum", - "options": { - "back": "Back", - "shortest": "Shortest", - "random": "Random" - }, - "default": "shortest", - "visible": false - }, - "skin_no_small_gaps_heuristic": { - "label": "Ignore Small Z Gaps", - "description": "When the model has small vertical gaps, about 5% extra computation time can be spent on generating top and bottom skin in these narrow spaces. In such case, disable the setting.", - "type": "boolean", - "default": true, - "visible": false - } - } - }, - "infill": { - "label": "Infill", - "visible": true, - "icon": "category_infill", - "settings": { - "infill_sparse_density": { - "label": "Infill Density", - "description": "Adjusts the density of infill of the print.", - "unit": "%", - "type": "float", - "default": 20, - "min_value": "0", - "max_value_warning": "100", - "children": { - "infill_line_distance": { - "label": "Infill Line Distance", - "description": "Distance between the printed infill lines. This setting is calculated by the infill density and the infill line width.", - "unit": "mm", - "type": "float", - "default": 2, - "min_value": "0", - "visible": false, - "inherit_function": "0 if infill_sparse_density == 0 else (infill_line_width * 100) / infill_sparse_density * (2 if infill_pattern == \"grid\" else (3 if infill_pattern == \"triangles\" else 1))" - } - } - }, - "infill_pattern": { - "label": "Infill Pattern", - "description": "The pattern of the infill material of the print. The line and zig zag infill swap direction on alternate layers, reducing material cost. The grid, triangle and concentric patterns are fully printed every layer.", - "type": "enum", - "visible": false, - "options": { - "grid": "Grid", - "lines": "Lines", - "triangles": "Triangles", - "concentric": "Concentric", - "zigzag": "Zig Zag" - }, - "default": "grid", - "inherit_function": "'lines' if infill_sparse_density > 25 else 'grid'" - }, - "infill_overlap": { - "label": "Infill Overlap Percentage", - "description": "The amount of overlap between the infill and the walls. A slight overlap allows the walls to connect firmly to the infill.", - "unit": "%", - "type": "float", - "default": 10, - "inherit_function": "10 if infill_sparse_density < 95 else 0", - "min_value_warning": "-50", - "max_value_warning": "100", - "visible": false, - "children": { - "infill_overlap_mm": { - "label": "Infill Overlap", - "description": "The amount of overlap between the infill and the walls. A slight overlap allows the walls to connect firmly to the infill.", - "unit": "mm", - "type": "float", - "default": 0.04, - "min_value_warning": "-0.5 * machine_nozzle_size", - "max_value_warning": "machine_nozzle_size", - "inherit_function": "infill_line_width * parent_value / 100 if infill_sparse_density < 95 else 0", - "visible": false - } - } - }, - "infill_wipe_dist": { - "label": "Infill Wipe Distance", - "description": "Distance of a travel move inserted after every infill line, to make the infill stick to the walls better. This option is similar to infill overlap, but without extrusion and only on one end of the infill line.", - "unit": "mm", - "type": "float", - "default": 0.04, - "inherit_function": "wall_line_width_0 / 4 if wall_line_count == 1 else wall_line_width_x / 4", - "min_value_warning": "0", - "max_value_warning": "machine_nozzle_size", - "visible": false - }, - "infill_sparse_thickness": { - "label": "Infill Layer Thickness", - "description": "The thickness per layer of infill material. This value should always be a multiple of the layer height and is otherwise rounded.", - "unit": "mm", - "type": "float", - "default": 0.1, - "min_value": "0.0001", - "max_value_warning": "0.32", - "max_value": "1000", - "visible": false, - "inherit_function": "layer_height" - }, - "infill_before_walls": { - "label": "Infill Before Walls", - "description": "Print the infill before printing the walls. Printing the walls first may lead to more accurate walls, but overhangs print worse. Printing the infill first leads to sturdier walls, but the infill pattern might sometimes show through the surface.", - "type": "boolean", - "default": true, - "visible": false - } - } - }, - "material": { - "label": "Material", - "visible": true, - "icon": "category_material", - "settings": { - "material_flow_dependent_temperature": { - "label": "Auto Temperature", - "description": "Change the temperature for each layer automatically with the average flow speed of that layer.", - "type": "boolean", - "default": false, - "visible": false, - "enabled": "False", - "global_only": true - }, - "material_print_temperature": { - "label": "Printing Temperature", - "description": "The temperature used for printing. Set at 0 to pre-heat the printer manually.", - "unit": "°C", - "type": "float", - "default": 210, - "min_value": "0", - "max_value_warning": "260", - "enabled": "not (material_flow_dependent_temperature)" - }, - "material_flow_temp_graph": { - "label": "Flow Temperature Graph", - "description": "Data linking material flow (in mm3 per second) to temperature (degrees Celsius).", - "unit": "", - "type": "string", - "default": "[[3.5,200],[7.0,240]]", - "enabled": "False", - "enabled_before_removal": "material_flow_dependent_temperature", - "global_only": true - }, - "material_extrusion_cool_down_speed": { - "label": "Extrusion Cool Down Speed Modifier", - "description": "The extra speed by which the nozzle cools while extruding. The same value is used to signify the heat up speed lost when heating up while extruding.", - "unit": "°C/s", - "type": "float", - "default": 0.5, - "min_value": "0", - "max_value_warning": "10.0", - "global_only": "True", - "enabled": "False", - "enabled_before_removal": "material_flow_dependent_temperature or machine_extruder_count > 1", - "visible": false - }, - "material_bed_temperature": { - "label": "Bed Temperature", - "description": "The temperature used for the heated bed. Set at 0 to pre-heat the printer manually.", - "unit": "°C", - "type": "float", - "default": 60, - "min_value": "0", - "max_value_warning": "260", - "enabled": "machine_heated_bed", - "global_only": "True" - }, - "material_diameter": { - "label": "Diameter", - "description": "Adjusts the diameter of the filament used. Match this value with the diameter of the used filament.", - "unit": "mm", - "type": "float", - "default": 2.85, - "min_value": "0.0001", - "min_value_warning": "0.4", - "max_value_warning": "3.5", - "global_only": "True" - }, - "material_flow": { - "label": "Flow", - "description": "Flow compensation: the amount of material extruded is multiplied by this value.", - "unit": "%", - "default": 100, - "type": "float", - "min_value": "5", - "min_value_warning": "50", - "max_value_warning": "150" - }, - "retraction_enable": { - "label": "Enable Retraction", - "description": "Retract the filament when the nozzle is moving over a non-printed area. ", - "type": "boolean", - "default": true, - "visible": true - }, - "retraction_amount": { - "label": "Retraction Distance", - "description": "The length of material retracted during a retraction move.", - "unit": "mm", - "type": "float", - "default": 6.5, - "min_value_warning": "-0.0001", - "max_value_warning": "10.0", - "visible": false, - "inherit": false, - "enabled": "retraction_enable" - }, - "retraction_speed": { - "label": "Retraction Speed", - "description": "The speed at which the filament is retracted and primed during a retraction move.", - "unit": "mm/s", - "type": "float", - "default": 25, - "min_value": "0", - "max_value": "299792458000", - "max_value_warning": "100", - "visible": false, - "inherit": false, - "enabled": "retraction_enable", - "children": { - "retraction_retract_speed": { - "label": "Retraction Retract Speed", - "description": "The speed at which the filament is retracted during a retraction move.", - "unit": "mm/s", - "type": "float", - "default": 25, - "min_value": "0", - "max_value": "299792458000", - "max_value_warning": "100", - "visible": false, - "enabled": "retraction_enable" - }, - "retraction_prime_speed": { - "label": "Retraction Prime Speed", - "description": "The speed at which the filament is primed during a retraction move.", - "unit": "mm/s", - "type": "float", - "default": 25, - "min_value": "0", - "max_value": "299792458000", - "max_value_warning": "100", - "visible": false, - "enabled": "retraction_enable" - } - } - }, - "retraction_extra_prime_amount": { - "label": "Retraction Extra Prime Amount", - "description": "Some material can ooze away during a travel move, which can be compensated for here.", - "unit": "mm³", - "type": "float", - "default": 0, - "min_value_warning": "-0.0001", - "max_value_warning": "5.0", - "visible": false, - "inherit": false, - "enabled": "retraction_enable" - }, - "retraction_min_travel": { - "label": "Retraction Minimum Travel", - "description": "The minimum distance of travel needed for a retraction to happen at all. This helps to get fewer retractions in a small area.", - "unit": "mm", - "type": "float", - "default": 1.5, - "inherit_function": "line_width * 2", - "min_value": "0", - "max_value_warning": "10", - "visible": false, - "inherit": false, - "enabled": "retraction_enable" - }, - "retraction_count_max": { - "label": "Maximum Retraction Count", - "description": "This setting limits the number of retractions occurring within the minimum extrusion distance window. Further retractions within this window will be ignored. This avoids retracting repeatedly on the same piece of filament, as that can flatten the filament and cause grinding issues.", - "default": 45, - "min_value": "0", - "max_value_warning": "100", - "type": "int", - "visible": false, - "inherit": false, - "enabled": "retraction_enable" - }, - "retraction_extrusion_window": { - "label": "Minimum Extrusion Distance Window", - "description": "The window in which the maximum retraction count is enforced. This value should be approximately the same as the retraction distance, so that effectively the number of times a retraction passes the same patch of material is limited.", - "unit": "mm", - "type": "float", - "default": 4.5, - "min_value": "0", - "max_value_warning": "retraction_amount * 2", - "visible": false, - "inherit_function": "retraction_amount", - "enabled": "retraction_enable" - }, - "retraction_hop": { - "label": "Z Hop when Retracting", - "description": "Whenever a retraction is done, the build plate is lowered to create clearance between the nozzle and the print. It prevents the nozzle from hitting the print during travel moves, reducing the chance to knock the print from the build plate.", - "unit": "mm", - "type": "float", - "default": 0, - "min_value_warning": "-0.0001", - "max_value_warning": "10", - "visible": false, - "inherit": false, - "enabled": "retraction_enable" - } - } - }, - "speed": { - "label": "Speed", - "visible": true, - "icon": "category_speed", - "settings": { - "speed_print": { - "label": "Print Speed", - "description": "The speed at which printing happens.", - "unit": "mm/s", - "type": "float", - "min_value": "0.1", - "max_value_warning": "150", - "max_value": "299792458000", - "default": 60, - "children": { - "speed_infill": { - "label": "Infill Speed", - "description": "The speed at which infill is printed.", - "unit": "mm/s", - "type": "float", - "min_value": "0.1", - "max_value": "299792458000", - "max_value_warning": "150", - "default": 60, - "visible": false - }, - "speed_wall": { - "label": "Wall Speed", - "description": "The speed at which the walls are printed.", - "unit": "mm/s", - "type": "float", - "min_value": "0.1", - "max_value": "299792458000", - "max_value_warning": "150", - "default": 30, - "visible": false, - "inherit_function": "parent_value / 2", - "children": { - "speed_wall_0": { - "label": "Outer Wall Speed", - "description": "The speed at which the outermost walls are printed. Printing the outer wall at a lower speed improves the final skin quality. However, having a large difference between the inner wall speed and the outer wall speed will effect quality in a negative way.", - "unit": "mm/s", - "type": "float", - "min_value": "0.1", - "max_value": "299792458000", - "max_value_warning": "150", - "default": 30, - "visible": false - }, - "speed_wall_x": { - "label": "Inner Wall Speed", - "description": "The speed at which all inner walls are printed Printing the inner wall faster than the outer wall will reduce printing time. It works well to set this in between the outer wall speed and the infill speed.", - "unit": "mm/s", - "type": "float", - "min_value": "0.1", - "max_value": "299792458000", - "max_value_warning": "150", - "default": 60, - "visible": false, - "inherit_function": "parent_value * 2" - } - } - }, - "speed_topbottom": { - "label": "Top/Bottom Speed", - "description": "The speed at which top/bottom layers are printed.", - "unit": "mm/s", - "type": "float", - "min_value": "0.1", - "max_value": "299792458000", - "max_value_warning": "150", - "default": 30, - "visible": false, - "inherit_function": "parent_value / 2" - }, - "speed_support": { - "label": "Support Speed", - "description": "The speed at which the support structure is printed. Printing support at higher speeds can greatly reduce printing time. The surface quality of the support structure is not important since it is removed after printing.", - "unit": "mm/s", - "type": "float", - "min_value": "0.1", - "max_value": "299792458000", - "max_value_warning": "150", - "default": 60, - "visible": false, - "inherit_function": "speed_print", - "enabled": "support_roof_enable", - "children": { - "speed_support_infill": { - "label": "Support Infill Speed", - "description": "The speed at which the infill of support is printed. Printing the infill at lower speeds improves stability.", - "unit": "mm/s", - "type": "float", - "default": 60, - "min_value": "0.1", - "max_value": "299792458000", - "max_value_warning": "150", - "visible": false, - "inherit": true, - "enabled": "support_enable", - "global_only": true - }, - "speed_support_roof": { - "label": "Support Roof Speed", - "description": "The speed at which the roofs of support are printed. Printing the support roof at lower speeds can improve overhang quality.", - "unit": "mm/s", - "type": "float", - "default": 40, - "min_value": "0.1", - "max_value": "299792458000", - "max_value_warning": "150", - "visible": false, - "enabled": "support_roof_enable", - "inherit_function": "parent_value / 1.5", - "global_only": true - } - } - } - } - }, - "speed_travel": { - "label": "Travel Speed", - "description": "The speed at which travel moves are made.", - "unit": "mm/s", - "type": "float", - "default": 120, - "min_value": "0.1", - "max_value": "299792458000", - "max_value_warning": "300", - "inherit_function": "speed_print if magic_spiralize else 120", - "global_only": true - }, - "speed_layer_0": { - "label": "Initial Layer Speed", - "description": "The print speed for the initial layer. A lower value is advised to improve adhesion to the build plate.", - "unit": "mm/s", - "type": "float", - "default": 30, - "min_value": "0.1", - "max_value": "299792458000", - "max_value_warning": "300", - "visible": false - }, - "skirt_speed": { - "label": "Skirt Speed", - "description": "The speed at which the skirt and brim are printed. Normally this is done at the initial layer speed, but sometimes you might want to print the skirt at a different speed.", - "unit": "mm/s", - "type": "float", - "default": 30, - "min_value": "0.1", - "max_value": "299792458000", - "max_value_warning": "300", - "visible": false, - "inherit_function": "speed_layer_0", - "global_only": true - }, - "speed_slowdown_layers": { - "label": "Number of Slower Layers", - "description": "The first few layers are printed slower than the rest of the object, to get better adhesion to the build plate and improve the overall success rate of prints. The speed is gradually increased over these layers.", - "type": "int", - "default": 2, - "min_value": "0", - "max_value": "299792458000", - "max_value_warning": "300", - "visible": false, - "global_only": true - } - } - }, - "travel": { - "label": "Travel", - "visible": true, - "icon": "category_travel", - "settings": { - "retraction_combing": { - "label": "Combing Mode", - "description": "Combing keeps the nozzle within already printed areas when traveling. This results in slightly longer travel moves but reduces the need for retractions. If combing is off, the material will retract and the nozzle moves in a straight line to the next point. It is also possible to avoid combing over top/bottom skin areas by combing within the infill only. It is also possible to avoid combing over top/bottom skin areas by combing within the infill only.", - "type": "enum", - "options": { - "off": "Off", - "all": "All", - "noskin": "No Skin" - }, - "default": "all", - "visible": false, - "global_only": true - }, - "travel_avoid_other_parts": { - "label": "Avoid Printed Parts when Traveling", - "description": "The nozzle avoids already printed parts when traveling. This option is only available when combing is enabled.", - "type": "boolean", - "default": true, - "visible": false, - "enabled": "retraction_combing != \"off\"", - "global_only": "True" - }, - "travel_avoid_distance": { - "label": "Travel Avoid Distance", - "description": "The distance between the nozzle and already printed parts when avoiding during travel moves.", - "unit": "mm", - "type": "float", - "default": 1.5, - "inherit_function": "machine_nozzle_tip_outer_diameter / 2 * 1.25", - "min_value": "0", - "max_value_warning": "machine_nozzle_tip_outer_diameter * 5", - "visible": false, - "inherit": false, - "enabled": "retraction_combing != \"off\" and travel_avoid_other_parts", - "global_only": "True" - } - } - }, - "cooling": { - "label": "Cooling", - "visible": true, - "icon": "category_cool", - "settings": { - "cool_fan_enabled": { - "label": "Enable Cooling Fans", - "description": "Enables the cooling fans while printing. The fans improve print quality on layers with short layer times and bridging / overhangs.", - "type": "boolean", - "default": true, - "global_only": "True" - }, - "cool_fan_speed": { - "label": "Fan Speed", - "description": "The speed at which the cooling fans spin.", - "unit": "%", - "type": "float", - "min_value": "0", - "max_value": "100", - "default": 100, - "visible": false, - "inherit_function": "100.0 if cool_fan_enabled else 0.0", - "enabled": "cool_fan_enabled", - "global_only": "True", - "children": { - "cool_fan_speed_min": { - "label": "Regular Fan Speed", - "description": "The speed at which the fans spin before hitting the threshold. When a layer prints faster than the threshold, the fan speed gradually inclines towards the maximum fan speed.", - "unit": "%", - "type": "float", - "min_value": "0", - "max_value": "100", - "inherit_function": "parent_value", - "default": 100, - "visible": false, - "enabled": "cool_fan_enabled", - "global_only": "True" - }, - "cool_fan_speed_max": { - "label": "Maximum Fan Speed", - "description": "The speed at which the fans spin on the minimum layer time. The fan speed gradually increases between the regular fan speed and maximum fan speed when the threshold is hit.", - "unit": "%", - "type": "float", - "min_value": "max(0, cool_fan_speed_min)", - "max_value": "100", - "default": 100, - "visible": false, - "enabled": "cool_fan_enabled", - "global_only": "True" - } - } - }, - "cool_min_layer_time_fan_speed_max": { - "label": "Regular/Maximum Fan Speed Threshold", - "description": "The layer time which sets the threshold between regular fan speed and maximum fan speed. Layers that print slower than this time use regular fan speed. For faster layers the fan speed gradually increases towards the maximum fan speed.", - "unit": "sec", - "type": "float", - "default": 10, - "min_value": "cool_min_layer_time", - "max_value_warning": "600", - "visible": false, - "global_only": "True" - }, - "cool_fan_full_at_height": { - "label": "Regular Fan Speed at Height", - "description": "The height at which the fans spin on regular fan speed. At the layers below the fan speed gradually increases from zero to regular fan speed.", - "unit": "mm", - "type": "float", - "default": 0.5, - "inherit_function": "layer_height_0", - "min_value": "0", - "max_value_warning": "10.0", - "visible": false, - "global_only": "True", - "children": { - "cool_fan_full_layer": { - "label": "Regular Fan Speed at Layer", - "description": "The layer at which the fans spin on regular fan speed. If regular fan speed at height is set, this value is calculated and rounded to a whole number.", - "type": "int", - "default": 1, - "min_value": "0", - "max_value_warning": "100", - "visible": false, - "inherit_function": "max(0, int(round((parent_value - layer_height_0) / layer_height, 0)))", - "global_only": "True" - } - } - }, - "cool_min_layer_time": { - "label": "Minimum Layer Time", - "description": "The minimum time spent in a layer. This forces the printer to slow down, to at least spend the time set here in one layer. This allows the printed material to cool down properly before printing the next layer.", - "unit": "sec", - "type": "float", - "default": 5, - "min_value": "0", - "max_value_warning": "600", - "visible": false, - "global_only": "True" - }, - "cool_min_speed": { - "label": "Minimum Speed", - "description": "The minimum print speed, despite slowing down due to the minimum layer time. When the printer would slow down too much, the pressure in the nozzle would be too low and result in bad print quality.", - "unit": "mm/s", - "type": "float", - "default": 10, - "min_value": "0", - "max_value_warning": "100", - "visible": false, - "global_only": "True" - }, - "cool_lift_head": { - "label": "Lift Head", - "description": "When the minimum speed is hit because of minimum layer time, lift the head away from the print and wait the extra time until the minimum layer time is reached.", - "type": "boolean", - "default": false, - "visible": false, - "global_only": "True" - } - } - }, - "support": { - "label": "Support", - "visible": true, - "icon": "category_support", - "settings": { - "support_enable": { - "label": "Enable Support", - "description": "Enable support structures. These structures support parts of the model with severe overhangs.", - "type": "boolean", - "default": false - }, - "support_type": { - "label": "Support Placement", - "description": "Adjusts the placement of the support structures. The placement can be set to touching build plate or everywhere. When set to everywhere the support structures will also be printed on the model.", - "type": "enum", - "options": { - "buildplate": "Touching Buildplate", - "everywhere": "Everywhere" - }, - "default": "everywhere", - "enabled": "support_enable" - }, - "support_angle": { - "label": "Support Overhang Angle", - "description": "The minimum angle of overhangs for which support is added. At a value of 0° all overhangs are supported, 90° will not provide any support.", - "unit": "°", - "type": "float", - "min_value": "0", - "max_value": "90", - "default": 50, - "visible": false, - "enabled": "support_enable" - }, - "support_pattern": { - "label": "Support Pattern", - "description": "The pattern of the support structures of the print. The different options available result in sturdy or easy to remove support.", - "type": "enum", - "options": { - "lines": "Lines", - "grid": "Grid", - "triangles": "Triangles", - "concentric": "Concentric", - "zigzag": "Zig Zag" - }, - "default": "zigzag", - "visible": false, - "enabled": "support_enable", - "global_only": true - }, - "support_connect_zigzags": { - "label": "Connect Support ZigZags", - "description": "Connect the ZigZags. This will increase the strength of the zig zag support structure.", - "type": "boolean", - "default": true, - "visible": false, - "enabled": "support_enable and (support_pattern == \"zigzag\")", - "global_only": true - }, - "support_infill_rate": { - "label": "Support Density", - "description": "Adjusts the density of the support structure. A higher value results in better overhangs, but the supports are harder to remove.", - "unit": "%", - "type": "float", - "min_value": "0", - "max_value_warning": "100", - "default": 15, - "visible": false, - "enabled": "support_enable", - "global_only": true, - "children": { - "support_line_distance": { - "label": "Support Line Distance", - "description": "Distance between the printed support structure lines. This setting is calculated by the support density.", - "unit": "mm", - "type": "float", - "min_value": "0", - "default": 2.66, - "visible": false, - "enabled": "support_enable", - "inherit_function": "(support_line_width * 100) / parent_value * (2 if support_pattern == \"grid\" else (3 if support_pattern == \"triangles\" else 1))", - "global_only": true - } - } - }, - "support_z_distance": { - "label": "Support Z Distance", - "description": "Distance from the top/bottom of the support structure to the print. This gap provides clearance to remove the supports after the model is printed. This value is rounded down to a multiple of the layer height.", - "unit": "mm", - "type": "float", - "min_value": "0", - "max_value_warning": "10", - "default": 0.15, - "visible": false, - "enabled": "support_enable", - - "children": { - "support_top_distance": { - "label": "Support Top Distance", - "description": "Distance from the top of the support to the print.", - "unit": "mm", - "min_value": "0", - "max_value_warning": "10", - "default": 0.15, - "type": "float", - "visible": false, - "enabled": "support_enable" - }, - "support_bottom_distance": { - "label": "Support Bottom Distance", - "description": "Distance from the print to the bottom of the support.", - "unit": "mm", - "min_value": "0", - "max_value_warning": "10", - "default": 0.1, - "inherit_function": "0.1 if support_type == 'everywhere' else 0", - "type": "float", - "visible": false, - "enabled": "support_enable and support_type == 'everywhere'" - } - } - }, - "support_xy_distance": { - "label": "Support X/Y Distance", - "description": "Distance of the support structure from the print in the X/Y directions.", - "unit": "mm", - "type": "float", - "min_value": "0", - "max_value_warning": "10", - "default": 0.7, - "visible": false, - "enabled": "support_enable" - }, - "support_xy_overrides_z": { - "label": "Support Distance Priority", - "description": "Whether the Support X/Y Distance overrides the Support Z Distance or vice versa. When X/Y overrides Z the X/Y distance can push away the support from the model, influencing the actual Z distance to the overhang. We can disable this by not applying the X/Y distance around overhangs.", - "type": "enum", - "options": { - "xy_overrides_z": "X/Y overrides Z", - "z_overrides_xy": "Z overrides X/Y" - }, - "default": "z_overrides_xy", - "visible": false, - "enabled": "support_enable" - }, - "support_xy_distance_overhang": { - "label": "Minimum Support X/Y Distance", - "description": "Distance of the support structure from the overhang in the X/Y directions. ", - "unit": "mm", - "type": "float", - "min_value": "0", - "max_value_warning": "10", - "default": 0.2, - "visible": false, - "inherit_function": "machine_nozzle_size / 2", - "enabled": "support_enable and support_xy_overrides_z==\"z_overrides_xy\"" - }, - "support_bottom_stair_step_height": { - "label": "Support Stair Step Height", - "description": "The height of the steps of the stair-like bottom of support resting on the model. A low value makes the support harder to remove, but too high values can lead to unstable support structures.", - "unit": "mm", - "type": "float", - "default": 0.3, - "min_value": "0", - "max_value_warning": "1.0", - "visible": false, - "enabled": "support_enable" - }, - "support_join_distance": { - "label": "Support Join Distance", - "description": "The maximum distance between support structures in the X/Y directions. When seperate structures are closer together than this value, the structures merge into one.", - "unit": "mm", - "type": "float", - "default": 2.0, - "min_value_warning": "0", - "max_value_warning": "10", - "visible": false, - "enabled": "support_enable" - }, - "support_offset": { - "label": "Support Horizontal Expansion", - "description": "Amount of offset applied to all support polygons in each layer. Positive values can smooth out the support areas and result in more sturdy support.", - "unit": "mm", - "type": "float", - "default": 0.2, - "min_value_warning": "-0.5", - "max_value_warning": "5.0", - "visible": false, - "enabled": "support_enable" - }, - "support_area_smoothing": { - "label": "Support Area Smoothing", - "description": "Maximum distance in the X/Y directions of a line segment which is to be smoothed out. Ragged lines are introduced by the join distance and support bridge, which cause the machine to resonate. Smoothing the support areas won't cause them to break with the constraints, except it might change the overhang.", - "unit": "mm", - "type": "float", - "default": 0.6, - "min_value": "0", - "max_value_warning": "1.0", - "visible": false, - "enabled": "support_enable" - }, - "support_roof_enable": { - "label": "Enable Support Roof", - "description": "Generate a dense top skin at the top of the support on which the model is printed.", - "type": "boolean", - "default": false, - "visible": true, - "enabled": "support_enable" - }, - "support_roof_height": { - "label": "Support Roof Thickness", - "description": "The thickness of the support roofs.", - "unit": "mm", - "type": "float", - "default": 1, - "min_value": "0", - "max_value_warning": "10", - "visible": false, - "enabled": "support_roof_enable" - }, - "support_roof_density": { - "label": "Support Roof Density", - "description": "Adjusts the density of the roof of the support structure. A higher value results in better overhangs, but the supports are harder to remove.", - "unit": "%", - "type": "float", - "default": 100, - "min_value": "0", - "max_value_warning": "100", - "enabled":"support_roof_enable", - "global_only": true, - "children": { - "support_roof_line_distance": { - "label": "Support Roof Line Distance", - "description": "Distance between the printed support roof lines. This setting is calculated by the support roof Density, but can be adjusted separately.", - "unit": "mm", - "type": "float", - "default": 0.4, - "min_value": "0", - "visible": false, - "inherit_function": "0 if parent_value == 0 else (support_roof_line_width * 100) / parent_value * (2 if support_roof_pattern == \"grid\" else (3 if support_roof_pattern == \"triangles\" else 1))", - "enabled": "support_roof_enable", - "global_only": true - } - } - }, - "support_roof_pattern": { - "label": "Support Roof Pattern", - "description": "The pattern with which the top of the support is printed.", - "type": "enum", - "visible": false, - "options": { - "lines": "Lines", - "grid": "Grid", - "triangles": "Triangles", - "concentric": "Concentric", - "zigzag": "Zig Zag" - }, - "default": "concentric", - "enabled": "support_roof_enable", - "global_only": true - }, - "support_use_towers": { - "label": "Use Towers", - "description": "Use specialized towers to support tiny overhang areas. These towers have a larger diameter than the region they support. Near the overhang the towers' diameter decreases, forming a roof.", - "type": "boolean", - "default": true, - "visible": false, - "enabled": "support_enable" - }, - "support_tower_diameter": { - "label": "Tower Diameter", - "description": "The diameter of a special tower.", - "unit": "mm", - "type": "float", - "default": 3.0, - "min_value": "0", - "max_value_warning": "10", - "visible": false, - "enabled": "support_enable and support_use_towers" - }, - "support_minimal_diameter": { - "label": "Minimum Diameter", - "description": "Minimum diameter in the X/Y directions of a small area which is to be supported by a specialized support tower.", - "unit": "mm", - "type": "float", - "default": 3.0, - "min_value": "0", - "max_value_warning": "10", - "max_value": "support_tower_diameter", - "inherit": true, - "visible": false, - "enabled": "support_enable and support_use_towers" - }, - "support_tower_roof_angle": { - "label": "Tower Roof Angle", - "description": "The angle of a rooftop of a tower. A higher value results in pointed tower roofs, a lower value results in flattened tower roofs.", - "unit": "°", - "type": "int", - "min_value": "0", - "max_value": "90", - "default": 65, - "visible": false, - "enabled": "support_enable and support_use_towers" - } - } - }, - "platform_adhesion": { - "label": "Platform Adhesion", - "visible": true, - "icon": "category_adhesion", - "settings": { - "adhesion_type": { - "label": "Platform Adhesion Type", - "description": "Different options that help to improve both priming your extrusion and adhesion to the build plate. Brim adds a single layer flat area around the base of your object to prevent warping. Raft adds a thick grid with a roof below the object. Skirt is a line printed around the object, but not connected to the model.", - "type": "enum", - "options": { - "skirt": "Skirt", - "brim": "Brim", - "raft": "Raft" - }, - "default": "brim", - "global_only": "True" - }, - "skirt_line_count": { - "label": "Skirt Line Count", - "description": "Multiple skirt lines help to prime your extrusion better for small objects. Setting this to 0 will disable the skirt.", - "type": "int", - "default": 1, - "min_value": "0", - "max_value_warning": "10", - "enabled": "adhesion_type == \"skirt\"", - "global_only": "True", - "visible": false - }, - "skirt_gap": { - "label": "Skirt Distance", - "description": "The horizontal distance between the skirt and the first layer of the print.\nThis is the minimum distance, multiple skirt lines will extend outwards from this distance.", - "unit": "mm", - "type": "float", - "default": 3, - "min_value_warning": "0", - "max_value_warning": "100", - "enabled": "adhesion_type == \"skirt\"", - "global_only": "True", - "visible": false - }, - "skirt_minimal_length": { - "label": "Skirt Minimum Length", - "description": "The minimum length of the skirt. If this length is not reached by the skirt line count, more skirt lines will be added until the minimum length is reached. Note: If the line count is set to 0 this is ignored.", - "unit": "mm", - "type": "float", - "default": 250, - "min_value": "0", - "min_value_warning": "25", - "max_value_warning": "2500", - "enabled": "adhesion_type == \"skirt\"", - "global_only": "True", - "visible": false - }, - "brim_width": { - "label": "Brim Width", - "description": "The distance from the model to the outermost brim line. A larger brim enhances adhesion to the build plate, but also reduces the effective print area.", - "type": "float", - "unit": "mm", - "default": 8.0, - "min_value": "0.0", - "max_value_warning": "100.0", - "enabled": "adhesion_type == \"brim\"", - "global_only": "True", - "visible": true, - "children": { - "brim_line_count": { - "label": "Brim Line Count", - "description": "The number of lines used for a brim. More brim lines enhance adhesion to the build plate, but also reduces the effective print area.", - "type": "int", - "default": 20, - "min_value": "0", - "max_value_warning": "300", - "inherit_function": "math.ceil(parent_value / skirt_line_width)", - "enabled": "adhesion_type == \"brim\"", - "global_only": "True", - "visible": false - } - } - }, - "raft_margin": { - "label": "Raft Extra Margin", - "description": "If the raft is enabled, this is the extra raft area around the object which is also given a raft. Increasing this margin will create a stronger raft while using more material and leaving less area for your print.", - "unit": "mm", - "type": "float", - "default": 5, - "min_value_warning": "0", - "max_value_warning": "10", - "enabled": "adhesion_type == \"raft\"", - "global_only": "True", - "visible": false - }, - "raft_airgap": { - "label": "Raft Air Gap", - "description": "The gap between the final raft layer and the first layer of the object. Only the first layer is raised by this amount to lower the bonding between the raft layer and the object. Makes it easier to peel off the raft.", - "unit": "mm", - "type": "float", - "default": 0.35, - "min_value": "0", - "max_value_warning": "1.0", - "enabled": "adhesion_type == \"raft\"", - "global_only": "True", - "visible": true - }, - "raft_surface_layers": { - "label": "Raft Top Layers", - "description": "The number of top layers on top of the 2nd raft layer. These are fully filled layers that the object sits on. 2 layers result in a smoother top surface than 1.", - "type": "int", - "default": 2, - "min_value": "0", - "max_value_warning": "20", - "enabled": "adhesion_type == \"raft\"", - "global_only": "True", - "visible": true - }, - "raft_surface_thickness": { - "label": "Raft Top Layer Thickness", - "description": "Layer thickness of the top raft layers.", - "unit": "mm", - "type": "float", - "default": 0.1, - "min_value": "0", - "max_value_warning": "2.0", - "enabled": "adhesion_type == \"raft\"", - "global_only": "True", - "visible": false - }, - "raft_surface_line_width": { - "label": "Raft Top Line Width", - "description": "Width of the lines in the top surface of the raft. These can be thin lines so that the top of the raft becomes smooth.", - "unit": "mm", - "type": "float", - "default": 0.3, - "min_value": "0.0001", - "max_value_warning": "machine_nozzle_size * 2", - "enabled": "adhesion_type == \"raft\"", - "global_only": "True", - "visible": false - }, - "raft_surface_line_spacing": { - "label": "Raft Top Spacing", - "description": "The distance between the raft lines for the top raft layers. The spacing should be equal to the line width, so that the surface is solid.", - "unit": "mm", - "type": "float", - "default": 0.3, - "min_value": "0.0001", - "max_value_warning": "5.0", - "enabled": "adhesion_type == \"raft\"", - "inherit_function": "raft_surface_line_width", - "global_only": "True", - "visible": false - }, - "raft_interface_thickness": { - "label": "Raft Middle Thickness", - "description": "Layer thickness of the middle raft layer.", - "unit": "mm", - "type": "float", - "default": 0.27, - "min_value": "0", - "max_value_warning": "5.0", - "enabled": "adhesion_type == \"raft\"", - "global_only": "True", - "visible": false - }, - "raft_interface_line_width": { - "label": "Raft Middle Line Width", - "description": "Width of the lines in the middle raft layer. Making the second layer extrude more causes the lines to stick to the bed.", - "unit": "mm", - "type": "float", - "default": 1, - "inherit_function": "line_width", - "min_value": "0.0001", - "max_value_warning": "machine_nozzle_size * 2", - "enabled": "adhesion_type == \"raft\"", - "global_only": "True", - "visible": false - }, - "raft_interface_line_spacing": { - "label": "Raft Middle Spacing", - "description": "The distance between the raft lines for the middle raft layer. The spacing of the middle should be quite wide, while being dense enough to support the top raft layers.", - "unit": "mm", - "type": "float", - "default": 1.0, - "min_value": "0", - "max_value_warning": "15.0", - "enabled": "adhesion_type == \"raft\"", - "global_only": "True", - "visible": false - }, - "raft_base_thickness": { - "label": "Raft Base Thickness", - "description": "Layer thickness of the base raft layer. This should be a thick layer which sticks firmly to the printer bed.", - "unit": "mm", - "type": "float", - "default": 0.3, - "min_value": "0", - "max_value_warning": "5.0", - "enabled": "adhesion_type == \"raft\"", - "global_only": "True", - "visible": false - }, - "raft_base_line_width": { - "label": "Raft Base Line Width", - "description": "Width of the lines in the base raft layer. These should be thick lines to assist in bed adhesion.", - "unit": "mm", - "type": "float", - "default": 1, - "min_value": "0.0001", - "inherit_function": "line_width", - "max_value_warning": "machine_nozzle_size * 2", - "enabled": "adhesion_type == \"raft\"", - "global_only": "True", - "visible": false - }, - "raft_base_line_spacing": { - "label": "Raft Line Spacing", - "description": "The distance between the raft lines for the base raft layer. Wide spacing makes for easy removal of the raft from the build plate.", - "unit": "mm", - "type": "float", - "default": 3.0, - "min_value": "0.0001", - "max_value_warning": "100", - "enabled": "adhesion_type == \"raft\"", - "global_only": "True", - "visible": false - }, - "raft_speed": { - "label": "Raft Print Speed", - "description": "The speed at which the raft is printed.", - "unit": "mm/s", - "type": "float", - "default": 30, - "min_value": "0.1", - "max_value": "299792458000", - "max_value_warning": "200", - "enabled": "adhesion_type == \"raft\"", - "inherit_function": "speed_print / 60 * 30", - "global_only": "True", - "visible": false, - "children": { - "raft_surface_speed": { - "label": "Raft Surface Print Speed", - "description": "The speed at which the surface raft layers are printed. These should be printed a bit slower, so that the nozzle can slowly smooth out adjacent surface lines.", - "unit": "mm/s", - "type": "float", - "default": 30, - "min_value": "0.1", - "max_value": "299792458000", - "max_value_warning": "100", - "enabled": "adhesion_type == \"raft\"", - "inherit_function": "parent_value", - "global_only": "True", - "visible": false - }, - "raft_interface_speed": { - "label": "Raft Interface Print Speed", - "description": "The speed at which the interface raft layer is printed. This should be printed quite slowly, as the volume of material coming out of the nozzle is quite high.", - "unit": "mm/s", - "type": "float", - "default": 15, - "min_value": "0.1", - "max_value": "299792458000", - "max_value_warning": "150", - "enabled": "adhesion_type == \"raft\"", - "inherit_function": "0.5 * parent_value", - "global_only": "True", - "visible": false - }, - "raft_base_speed": { - "label": "Raft Base Print Speed", - "description": "The speed at which the base raft layer is printed. This should be printed quite slowly, as the volume of material coming out of the nozzle is quite high.", - "unit": "mm/s", - "type": "float", - "default": 15, - "min_value": "0.1", - "max_value": "299792458000", - "max_value_warning": "200", - "enabled": "adhesion_type == \"raft\"", - "inherit_function": "0.5 * parent_value", - "global_only": "True", - "visible": false - } - } - }, - "raft_fan_speed": { - "label": "Raft Fan Speed", - "description": "The fan speed for the raft.", - "unit": "%", - "type": "float", - "min_value": "0", - "max_value": "100", - "default": 100, - "global_only": "True", - "visible": false, - "enabled": "adhesion_type == \"raft\"", - "children": { - "raft_surface_fan_speed": { - "label": "Raft Surface Fan Speed", - "description": "The fan speed for the surface raft layers.", - "unit": "%", - "type": "float", - "min_value": "0", - "max_value": "100", - "default": 100, - "global_only": "True", - "visible": false, - "inherit": true, - "enabled": "adhesion_type == \"raft\"" - }, - "raft_interface_fan_speed": { - "label": "Raft Interface Fan Speed", - "description": "The fan speed for the interface raft layer.", - "unit": "%", - "type": "float", - "min_value": "0", - "max_value": "100", - "default": 100, - "global_only": "True", - "visible": false, - "inherit": true, - "enabled": "adhesion_type == \"raft\"" - }, - "raft_base_fan_speed": { - "label": "Raft Base Fan Speed", - "description": "The fan speed for the base raft layer.", - "unit": "%", - "type": "float", - "min_value": "0", - "max_value": "100", - "default": 100, - "global_only": "True", - "visible": false, - "inherit": true, - "enabled": "adhesion_type == \"raft\"" - } - } - } - } - }, - "meshfix": { - "label": "Mesh Fixes", - "visible": true, - "icon": "category_fixes", - "settings": { - "meshfix_union_all": { - "label": "Union Overlapping Volumes", - "description": "Ignore the internal geometry arising from overlapping volumes and print the volumes as one. This may cause internal cavities to disappear.", - "type": "boolean", - "default": true, - "visible": false - }, - "meshfix_union_all_remove_holes": { - "label": "Remove All Holes", - "description": "Remove the holes in each layer and keep only the outside shape. This will ignore any invisible internal geometry. However, it also ignores layer holes which can be viewed from above or below.", - "type": "boolean", - "default": false, - "visible": false - }, - "meshfix_extensive_stitching": { - "label": "Extensive Stitching", - "description": "Extensive stitching tries to stitch up open holes in the mesh by closing the hole with touching polygons. This option can introduce a lot of processing time.", - "type": "boolean", - "default": false, - "visible": false - }, - "meshfix_keep_open_polygons": { - "label": "Keep Disconnected Faces", - "description": "Normally Cura tries to stitch up small holes in the mesh and remove parts of a layer with big holes. Enabling this option keeps those parts which cannot be stitched. This option should be used as a last resort option when everything else fails to produce proper GCode.", - "type": "boolean", - "default": false, - "visible": false - } - } - }, - "blackmagic": { - "label": "Special Modes", - "visible": true, - "icon": "category_blackmagic", - "settings": { - "print_sequence": { - "label": "Print Sequence", - "description": "Whether to print all objects one layer at a time or to wait for one object to finish, before moving on to the next. One at a time mode is only possible if all models are separated in such a way that the whole print head can move in between and all models are lower than the distance between the nozzle and the X/Y axes.", - "type": "enum", - "options": { - "all_at_once": "All at Once", - "one_at_a_time": "One at a Time" - }, - "default": "all_at_once", - "visible": true, - "global_only": true - }, - "magic_mesh_surface_mode": { - "label": "Surface Mode", - "description": "Treat the model as a surface only, a volume, or volumes with loose surfaces. The normal print mode only prints enclosed volumes. \"Surface\" prints a single wall tracing the mesh surface with no infill and no top/bottom skin. \"Both\" prints enclosed volumes like normal and any remaining polygons as surfaces.", - "type": "enum", - "options": { - "normal": "Normal", - "surface": "Surface", - "both": "Both" - }, - "default": "normal", - "visible": false - }, - "magic_spiralize": { - "label": "Spiralize Outer Contour", - "description": "Spiralize smooths out the Z move of the outer edge. This will create a steady Z increase over the whole print. This feature turns a solid object into a single walled print with a solid bottom. This feature used to be called Joris in older versions.", - "type": "boolean", - "default": false, - "visible": false, - "global_only": "True" - } - } - }, - "experimental": - { - "label": "Experimental", - "visible": true, - "icon": "category_blackmagic", - "settings": { - "draft_shield_enabled": { - "label": "Enable Draft Shield", - "description": "This will create a wall around the object, which traps (hot) air and shields against exterior airflow. Especially useful for materials which warp easily.", - "type": "boolean", - "default": false, - "global_only": true - }, - "draft_shield_dist": { - "label": "Draft Shield X/Y Distance", - "description": "Distance of the draft shield from the print, in the X/Y directions.", - "unit": "mm", - "type": "float", - "min_value": "0", - "max_value_warning": "100", - "default": 10, - "visible": false, - "enabled": "draft_shield_enabled", - "global_only": true - }, - "draft_shield_height_limitation": { - "label": "Draft Shield Limitation", - "description": "Set the height of the draft shield. Choose to print the draft shield at the full height of the object or at a limited height.", - "type": "enum", - "options": { - "full": "Full", - "limited": "Limited" - }, - "default": "full", - "visible": false, - "enabled": "draft_shield_enabled", - "global_only": true - }, - "draft_shield_height": { - "label": "Draft Shield Height", - "description": "Height limitation of the draft shield. Above this height no draft shield will be printed.", - "unit": "mm", - "type": "float", - "min_value": "0", - "max_value_warning": "9999", - "default": 0, - "inherit_function": "9999 if draft_shield_height_limitation == 'full' and draft_shield_enabled else 0.0", - "visible": false, - "enabled": "draft_shield_height_limitation == \"limited\"", - "global_only": true - }, - "conical_overhang_enabled": { - "label": "Make Overhang Printable", - "description": "Change the geometry of the printed model such that minimal support is required. Steep overhangs will become shallow overhangs. Overhanging areas will drop down to become more vertical.", - "type": "boolean", - "default": false, - "visible": false - }, - "conical_overhang_angle": { - "label": "Maximum Model Angle", - "description": "The maximum angle of overhangs after the they have been made printable. At a value of 0° all overhangs are replaced by a piece of model connected to the build plate, 90° will not change the model in any way.", - "unit": "°", - "type": "float", - "min_value": "0", - "max_value": "89", - "default": 50, - "visible": true, - "enabled": "conical_overhang_enabled" - }, - "coasting_enable": { - "label": "Enable Coasting", - "description": "Coasting replaces the last part of an extrusion path with a travel path. The oozed material is used to print the last piece of the extrusion path in order to reduce stringing.", - "type": "boolean", - "default": false, - "visible": false, - "global_only": true - }, - "coasting_volume": { - "label": "Coasting Volume", - "description": "The volume otherwise oozed. This value should generally be close to the nozzle diameter cubed.", - "unit": "mm³", - "type": "float", - "default": 0.064, - "min_value": "0", - "max_value_warning": "2.0", - "visible": false, - "inherit": false, - "enabled": "coasting_enable", - "global_only": true - }, - "coasting_min_volume": { - "label": "Minimum Volume Before Coasting", - "description": "The smallest volume an extrusion path should have before allowing coasting. For smaller extrusion paths, less pressure has been built up in the bowden tube and so the coasted volume is scaled linearly. This value should always be larger than the Coasting Volume.", - "unit": "mm³", - "type": "float", - "default": 0.8, - "min_value": "0", - "max_value_warning": "10.0", - "visible": false, - "enabled": "coasting_enable", - "global_only": true - }, - "coasting_speed": { - "label": "Coasting Speed", - "description": "The speed by which to move during coasting, relative to the speed of the extrusion path. A value slightly under 100% is advised, since during the coasting move the pressure in the bowden tube drops.", - "unit": "%", - "type": "float", - "default": 90, - "min_value": "0.0001", - "max_value_warning": "100", - "visible": false, - "inherit": false, - "enabled": "coasting_enable", - "global_only": true - }, - "skin_outline_count": { - "label": "Extra Skin Wall Count", - "description": "Replaces the outermost part of the top/bottom pattern with a number of concentric lines. Using one or two lines improves roofs that start on infill material.", - "default": 0, - "min_value": "0", - "max_value_warning": "10", - "type": "int", - "visible": false - }, - "skin_alternate_rotation": { - "label": "Alternate Skin Rotation", - "description": "Alternate the direction in which the top/bottom layers are printed. Normally they are printed diagonally only. This setting adds the X-only and Y-only directions.", - "type": "boolean", - "default": false, - "visible": false, - "enabled": "top_bottom_pattern != \"concentric\"" - }, - "support_conical_enabled": { - "label": "Enable Conical Support", - "description": "Experimental feature: Make support areas smaller at the bottom than at the overhang.", - "type": "boolean", - "default": false, - "visible": true, - "enabled": "support_enable" - }, - "support_conical_angle": { - "label": "Conical Support Angle", - "description": "The angle of the tilt of conical support. With 0 degrees being vertical, and 90 degrees being horizontal. Smaller angles cause the support to be more sturdy, but consist of more material. Negative angles cause the base of the support to be wider than the top.", - "unit": "°", - "type": "float", - "min_value": "-90", - "min_value_warning": "-45", - "max_value_warning": "45", - "max_value": "90", - "default": 30, - "visible": false, - "enabled": "support_conical_enabled and support_enable" - }, - "support_conical_min_width": { - "label": "Conical Support Minimum Width", - "description": "Minimum width to which the base of the conical support area is reduced. Small widths can lead to unstable support structures.", - "unit": "mm", - "default": 5.0, - "min_value": "0", - "min_value_warning": "machine_nozzle_size * 3", - "max_value_warning": "100.0", - "type": "float", - "visible": false, - "enabled": "support_conical_enabled and support_enable" - }, - "magic_fuzzy_skin_enabled": { - "label": "Fuzzy Skin", - "description": "Randomly jitter while printing the outer wall, so that the surface has a rough and fuzzy look.", - "type": "boolean", - "default": false, - "visible": false - }, - "magic_fuzzy_skin_thickness": { - "label": "Fuzzy Skin Thickness", - "description": "The width within which to jitter. It's advised to keep this below the outer wall width, since the inner walls are unaltered.", - "type": "float", - "unit": "mm", - "default": 0.3, - "min_value": "0.001", - "max_value_warning": "wall_line_width_0", - "visible": false, - "enabled": "magic_fuzzy_skin_enabled" - }, - "magic_fuzzy_skin_point_density": { - "label": "Fuzzy Skin Density", - "description": "The average density of points introduced on each polygon in a layer. Note that the original points of the polygon are discarded, so a low density results in a reduction of the resolution.", - "type": "float", - "unit": "1/mm", - "default": 1.25, - "min_value": "0.008", - "min_value_warning": "0.1", - "max_value_warning": "10", - "max_value": "2 / magic_fuzzy_skin_thickness", - "visible": false, - "enabled": "magic_fuzzy_skin_enabled", - "children": { - "magic_fuzzy_skin_point_dist": { - "label": "Fuzzy Skin Point Distance", - "description": "The average distance between the random points introduced on each line segment. Note that the original points of the polygon are discarded, so a high smoothness results in a reduction of the resolution. This value must be higher than half the Fuzzy Skin Thickness.", - "type": "float", - "unit": "mm", - "default": 0.8, - "min_value": "magic_fuzzy_skin_thickness / 2", - "min_value_warning": "0.1", - "max_value_warning": "10", - "inherit_function": "10000 if parent_value == 0 else 1 / parent_value", - "visible": false, - "enabled": "magic_fuzzy_skin_enabled" - } - } - }, - "wireframe_enabled": { - "label": "Wire Printing", - "description": "Print only the outside surface with a sparse webbed structure, printing 'in thin air'. This is realized by horizontally printing the contours of the model at given Z intervals which are connected via upward and diagonally downward lines.", - "type": "boolean", - "default": false, - "visible": false, - "global_only": "True" - }, - "wireframe_height": { - "label": "WP Connection Height", - "description": "The height of the upward and diagonally downward lines between two horizontal parts. This determines the overall density of the net structure. Only applies to Wire Printing.", - "type": "float", - "unit": "mm", - "default": 3, - "min_value": "0.0001", - "max_value_warning": "20", - "visible": false, - "enabled": "wireframe_enabled", - "global_only": "True" - }, - "wireframe_roof_inset": { - "label": "WP Roof Inset Distance", - "description": "The distance covered when making a connection from a roof outline inward. Only applies to Wire Printing.", - "type": "float", - "unit": "mm", - "default": 3, - "min_value": "0", - "min_value_warning": "machine_nozzle_size", - "max_value_warning": "20", - "visible": false, - "enabled": "wireframe_enabled", - "inherit_function": "wireframe_height", - "global_only": "True" - }, - "wireframe_printspeed": { - "label": "WP Speed", - "description": "Speed at which the nozzle moves when extruding material. Only applies to Wire Printing.", - "unit": "mm/s", - "type": "float", - "default": 5, - "min_value": "0.1", - "max_value": "299792458000", - "max_value_warning": "50", - "visible": false, - "enabled": "wireframe_enabled", - "global_only": "True", - "children": { - "wireframe_printspeed_bottom": { - "label": "WP Bottom Printing Speed", - "description": "Speed of printing the first layer, which is the only layer touching the build platform. Only applies to Wire Printing.", - "unit": "mm/s", - "type": "float", - "default": 5, - "min_value": "0.1", - "max_value": "299792458000", - "max_value_warning": "50", - "visible": false, - "inherit": true, - "enabled": "wireframe_enabled", - "global_only": "True" - }, - "wireframe_printspeed_up": { - "label": "WP Upward Printing Speed", - "description": "Speed of printing a line upward 'in thin air'. Only applies to Wire Printing.", - "unit": "mm/s", - "type": "float", - "default": 5, - "min_value": "0.1", - "max_value": "299792458000", - "max_value_warning": "50", - "visible": false, - "inherit": true, - "enabled": "wireframe_enabled", - "global_only": "True" - }, - "wireframe_printspeed_down": { - "label": "WP Downward Printing Speed", - "description": "Speed of printing a line diagonally downward. Only applies to Wire Printing.", - "unit": "mm/s", - "type": "float", - "default": 5, - "min_value": "0.1", - "max_value": "299792458000", - "max_value_warning": "50", - "visible": false, - "inherit": true, - "enabled": "wireframe_enabled", - "global_only": "True" - }, - "wireframe_printspeed_flat": { - "label": "WP Horizontal Printing Speed", - "description": "Speed of printing the horizontal contours of the object. Only applies to Wire Printing.", - "unit": "mm/s", - "type": "float", - "default": 5, - "min_value": "0.1", - "max_value": "299792458000", - "max_value_warning": "100", - "visible": false, - "inherit": true, - "enabled": "wireframe_enabled", - "global_only": "True" - } - } - }, - "wireframe_flow": { - "label": "WP Flow", - "description": "Flow compensation: the amount of material extruded is multiplied by this value. Only applies to Wire Printing.", - "unit": "%", - "default": 100, - "min_value": "0", - "max_value_warning": "100", - "type": "float", - "visible": false, - "enabled": "wireframe_enabled", - "global_only": "True", - "children": { - "wireframe_flow_connection": { - "label": "WP Connection Flow", - "description": "Flow compensation when going up or down. Only applies to Wire Printing.", - "unit": "%", - "default": 100, - "min_value": "0", - "max_value_warning": "100", - "type": "float", - "visible": false, - "enabled": "wireframe_enabled", - "global_only": "True" - }, - "wireframe_flow_flat": { - "label": "WP Flat Flow", - "description": "Flow compensation when printing flat lines. Only applies to Wire Printing.", - "unit": "%", - "default": 100, - "min_value": "0", - "max_value_warning": "100", - "type": "float", - "visible": false, - "enabled": "wireframe_enabled", - "global_only": "True" - } - } - }, - "wireframe_top_delay": { - "label": "WP Top Delay", - "description": "Delay time after an upward move, so that the upward line can harden. Only applies to Wire Printing.", - "unit": "sec", - "type": "float", - "default": 0, - "min_value": "0", - "max_value_warning": "1", - "visible": false, - "enabled": "wireframe_enabled", - "global_only": "True" - }, - "wireframe_bottom_delay": { - "label": "WP Bottom Delay", - "description": "Delay time after a downward move. Only applies to Wire Printing.", - "unit": "sec", - "type": "float", - "default": 0, - "min_value": "0", - "max_value_warning": "1", - "visible": false, - "enabled": "wireframe_enabled", - "global_only": "True" - }, - "wireframe_flat_delay": { - "label": "WP Flat Delay", - "description": "Delay time between two horizontal segments. Introducing such a delay can cause better adhesion to previous layers at the connection points, while too long delays cause sagging. Only applies to Wire Printing.", - "unit": "sec", - "type": "float", - "default": 0.1, - "min_value": "0", - "max_value_warning": "0.5", - "visible": false, - "enabled": "wireframe_enabled", - "global_only": "True" - }, - "wireframe_up_half_speed": { - "label": "WP Ease Upward", - "description": "Distance of an upward move which is extruded with half speed.\nThis can cause better adhesion to previous layers, while not heating the material in those layers too much. Only applies to Wire Printing.", - "type": "float", - "unit": "mm", - "default": 0.3, - "min_value": "0", - "max_value_warning": "5.0", - "visible": false, - "enabled": "wireframe_enabled", - "global_only": "True" - }, - "wireframe_top_jump": { - "label": "WP Knot Size", - "description": "Creates a small knot at the top of an upward line, so that the consecutive horizontal layer has a better chance to connect to it. Only applies to Wire Printing.", - "type": "float", - "unit": "mm", - "default": 0.6, - "min_value": "0", - "max_value_warning": "2.0", - "visible": false, - "enabled": "wireframe_enabled", - "global_only": "True" - }, - "wireframe_fall_down": { - "label": "WP Fall Down", - "description": "Distance with which the material falls down after an upward extrusion. This distance is compensated for. Only applies to Wire Printing.", - "type": "float", - "unit": "mm", - "default": 0.5, - "min_value": "0", - "max_value_warning": "wireframe_height", - "visible": false, - "enabled": "wireframe_enabled", - "global_only": "True" - }, - "wireframe_drag_along": { - "label": "WP Drag Along", - "description": "Distance with which the material of an upward extrusion is dragged along with the diagonally downward extrusion. This distance is compensated for. Only applies to Wire Printing.", - "type": "float", - "unit": "mm", - "default": 0.6, - "min_value": "0", - "max_value_warning": "wireframe_height", - "visible": false, - "enabled": "wireframe_enabled", - "global_only": "True" - }, - "wireframe_strategy": { - "label": "WP Strategy", - "description": "Strategy for making sure two consecutive layers connect at each connection point. Retraction lets the upward lines harden in the right position, but may cause filament grinding. A knot can be made at the end of an upward line to heighten the chance of connecting to it and to let the line cool; however, it may require slow printing speeds. Another strategy is to compensate for the sagging of the top of an upward line; however, the lines won't always fall down as predicted.", - "type": "enum", - "options": { - "compensate": "Compensate", - "knot": "Knot", - "retract": "Retract" - }, - "default": "compensate", - "visible": false, - "enabled": "wireframe_enabled", - "global_only": "True" - }, - "wireframe_straight_before_down": { - "label": "WP Straighten Downward Lines", - "description": "Percentage of a diagonally downward line which is covered by a horizontal line piece. This can prevent sagging of the top most point of upward lines. Only applies to Wire Printing.", - "type": "float", - "unit": "%", - "default": 20, - "min_value": "0", - "max_value": "100", - "visible": false, - "enabled": "wireframe_enabled", - "global_only": "True" - }, - "wireframe_roof_fall_down": { - "label": "WP Roof Fall Down", - "description": "The distance which horizontal roof lines printed 'in thin air' fall down when being printed. This distance is compensated for. Only applies to Wire Printing.", - "type": "float", - "unit": "mm", - "default": 2, - "min_value_warning": "0", - "max_value_warning": "wireframe_roof_inset", - "visible": false, - "enabled": "wireframe_enabled", - "global_only": "True" - }, - "wireframe_roof_drag_along": { - "label": "WP Roof Drag Along", - "description": "The distance of the end piece of an inward line which gets dragged along when going back to the outer outline of the roof. This distance is compensated for. Only applies to Wire Printing.", - "type": "float", - "unit": "mm", - "default": 0.8, - "min_value": "0", - "max_value_warning": "10", - "visible": false, - "enabled": "wireframe_enabled", - "global_only": "True" - }, - "wireframe_roof_outer_delay": { - "label": "WP Roof Outer Delay", - "description": "Time spent at the outer perimeters of hole which is to become a roof. Longer times can ensure a better connection. Only applies to Wire Printing.", - "type": "float", - "unit": "sec", - "default": 0.2, - "min_value": "0", - "max_value_warning": "2.0", - "visible": false, - "enabled": "wireframe_enabled", - "global_only": "True" - }, - "wireframe_nozzle_clearance": { - "label": "WP Nozzle Clearance", - "description": "Distance between the nozzle and horizontally downward lines. Larger clearance results in diagonally downward lines with a less steep angle, which in turn results in less upward connections with the next layer. Only applies to Wire Printing.", - "type": "float", - "unit": "mm", - "default": 1, - "min_value_warning": "0", - "max_value_warning": "10.0", - "visible": false, - "enabled": "wireframe_enabled", - "global_only": "True" - } - } - } - } -} diff --git a/resources/machines/grr_neo.json b/resources/machines/grr_neo.json deleted file mode 100644 index e2eb9aae73..0000000000 --- a/resources/machines/grr_neo.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "id": "grr_neo", - "version": 1, - "name": "German RepRap Neo", - "manufacturer": "Other", - "author": "Other", - "icon": "icon_ultimaker.png", - "platform": "grr_neo_platform.stl", - "file_formats": "text/x-gcode", - "inherits": "fdmprinter.json", - "visible": "true", - - "overrides": { - "machine_width": { "default": 150 }, - "machine_height": { "default": 150 }, - "machine_depth": { "default": 150 }, - "machine_center_is_zero": { "default": false }, - "machine_nozzle_size": { "default": 0.5 }, - "machine_nozzle_heat_up_speed": { "default": 2.0 }, - "machine_nozzle_cool_down_speed": { "default": 2.0 }, - "machine_head_shape_min_x": { "default": 75 }, - "machine_head_shape_min_y": { "default": 18 }, - "machine_head_shape_max_x": { "default": 18 }, - "machine_head_shape_max_y": { "default": 35 }, - "machine_nozzle_gantry_distance": { "default": 55 }, - "machine_gcode_flavor": { "default": "RepRap (Marlin/Sprinter)" }, - - "machine_start_gcode": { - "default": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG1 Z15.0 F9000 ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E3 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F9000\n;Put printing message on LCD screen\nM117 Printing..." - }, - "machine_end_gcode": { - "default": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning" - }, - - "material_bed_temperature": { "visible": false } - } -} diff --git a/resources/machines/innovo-inventor.json b/resources/machines/innovo-inventor.json deleted file mode 100644 index a37143a8d7..0000000000 --- a/resources/machines/innovo-inventor.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "id": "innovo-inventor", - "version": 1, - "name": "Innovo INVENTOR", - "manufacturer": "Other", - "author": "AR", - "platform": "inventor_platform.stl", - "file_formats": "text/x-gcode", - "inherits": "fdmprinter.json", - - "machine_settings": { - "machine_width": {"default": 340}, - "machine_height": {"default": 290}, - "machine_depth": {"default": 300}, - "machine_heated_bed": { "default": true}, - "machine_center_is_zero": {"default": false}, - "machine_nozzle_size": {"default": 0.4}, - "machine_head_shape_min_x": {"default": 43.7}, - "machine_head_shape_min_y": {"default": 19.2}, - "machine_head_shape_max_x": {"default": 43.7}, - "machine_head_shape_max_y": {"default": 55}, - "machine_nozzle_gantry_distance": {"default": 82.3}, - "machine_nozzle_offset_x_1": {"default": 0}, - "machine_nozzle_offset_y_1": {"default": 15}, - "machine_gcode_flavor": {"default": "RepRap (Marlin/Sprinter)"}, - "machine_start_gcode": {"default": "G28 ; Home extruder\nM107 ; Turn off fan\nG90 ; Absolute positioning\nM82 ; Extruder in absolute mode\n{IF_BED}M190 S{BED}\n{IF_EXT0}M104 T0 S{TEMP0}\n{IF_EXT0}M109 T0 S{TEMP0}\n{IF_EXT1}M104 T1 S{TEMP1}\n{IF_EXT1}M109 T1 S{TEMP1}\nG32 S3 ; auto level\nG92 E0 ; Reset extruder position"}, - "machine_end_gcode": {"default": "M104 S0\nG91 ; relative positioning\nG1 E-2 F5000; retract 2mm\nG28 Z; move bed down\nG90 ; absolute positioning\nM84 ; disable motors"}, - "machine_platform_offset": {"default": [-180, -0.25, 160]} - }, - "overrides": { - "layer_height": { "default": 0.15}, - "wall_thickness": { "default": 0.8}, - "top_bottom_thickness": { "default": 0.3, "visible": true}, - "material_print_temperature": { "default": 215, "visible": true}, - "material_bed_temperature": { "default": 60, "visible": true}, - "material_diameter": { "default": 1.75, "visible": true}, - "speed_print": { "default": 60.0, "visible": true}, - "speed_infill": { "default": 100.0, "visible": true }, - "speed_topbottom": { "default": 30.0, "visible": true }, - "speed_travel": { "default": 150.0, "visible": true }, - "speed_layer_0": { "min_value": 0.1, "default": 30.0, "visible": true }, - "infill_overlap": { "default": 10.0 } - } -} \ No newline at end of file diff --git a/resources/machines/m180.json b/resources/machines/m180.json deleted file mode 100644 index 7e31577ac2..0000000000 --- a/resources/machines/m180.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "id": "m180", - "version": 1, - "name": "Malyan M180", - "manufacturer": "Other", - "icon": "icon_ultimaker.png", - "platform": "", - "file_formats": "application/x3g", - "inherits": "fdmprinter.json", - - "machine_settings": { - "machine_width": { "default": 230 }, - "machine_height": { "default": 165 }, - "machine_depth": { "default": 145 }, - "machine_center_is_zero": { "default": true }, - "machine_nozzle_size": { "default": 0.4, "min_value": "0.001" }, - "machine_head_with_fans_polygon": { - "default": [ - [ -75, 35 ], - [ -75, -18 ], - [ 18, -18 ], - [ 18, 35 ] - ] - }, - "gantry_height": { "default": 55 }, - "machine_gcode_flavor": { "default": "RepRap (Marlin/Sprinter)" }, - "machine_start_gcode": { "default": "M136\nM73 P0\nM103\nG21\nG90\nM320\n;(**** begin homing ****)\nG162 X Y F4000\nG161 Z F3500\nG92 Z-5\nG1 Z0.0\nG161 Z F100\nM132 X Y Z A B\n;(**** end homing ****)\nG92 X147 Y66 Z5\nG1 X105 Y-60 Z10 F4000.0\nG130 X127 Y127 A127 B127\nG0 X105 Y-60\nG1 Z0.3 F300\nG92 E0\nG1 X100 E10 F300\nG92 E0\nG1 Z0.0 F300\nM320" }, - "machine_end_gcode": { "default": "G92 Z0\nG1 Z10 F400\nM18\nM109 S0 T0\nM104 S0 T0\nM73 P100 (end build progress)\nG162 X Y F3000\nM18" } - }, - - "overrides": { - "material_bed_temperature": { "visible": "True" }, - "material_diameter": { - "default": 1.75, - "min_value_warning": "1.5", - "max_value_warning": "2.0" - } - } -} diff --git a/resources/machines/maker_starter.json b/resources/machines/maker_starter.json deleted file mode 100644 index 1d6dfa6a18..0000000000 --- a/resources/machines/maker_starter.json +++ /dev/null @@ -1,81 +0,0 @@ -{ - "id": "maker_starter", - "version": 1, - "name": "3DMaker Starter", - "manufacturer": "Other", - "author": "Other", - "icon": "icon_ultimaker2.png", - "platform": "makerstarter_platform.stl", - "file_formats": "text/x-gcode;application/x-stl-ascii;application/x-stl-binary;application/x-wavefront-obj", - "inherits": "fdmprinter.json", - - "overrides": { - "machine_width": { "default": 210 }, - "machine_depth": { "default": 185 }, - "machine_height": { "default": 200 }, - "machine_heated_bed": { "default": false }, - - "machine_center_is_zero": { "default": false }, - "machine_nozzle_size": { "default": 0.4 }, - "machine_nozzle_heat_up_speed": { "default": 2.0 }, - "machine_nozzle_cool_down_speed": { "default": 2.0 }, - "machine_head_shape_min_x": { "default": 0 }, - "machine_head_shape_min_y": { "default": 0 }, - "machine_head_shape_max_x": { "default": 0 }, - "machine_head_shape_max_y": { "default": 0 }, - "machine_nozzle_gantry_distance": { "default": 55 }, - "machine_gcode_flavor": { "default": "RepRap" }, - "machine_disallowed_areas": { "default": []}, - "machine_platform_offset": { "default": [0.0, 0.0, 0.0] }, - - "machine_nozzle_tip_outer_diameter": { "default": 1.0 }, - "machine_nozzle_head_distance": { "default": 3.0 }, - "machine_nozzle_expansion_angle": { "default": 45 }, - - "layer_height": { "default": 0.2 }, - "layer_height_0": { "default": 0.2, "visible": false }, - "wall_line_count": { "default": 2, "visible": true }, - "top_layers": { "default": 4, "visible": true }, - "bottom_layers": { "default": 4, "visible": true }, - "material_print_temperature": { "visible": false }, - "material_bed_temperature": { "visible": false }, - "material_diameter": { "default": 1.75, "visible": false }, - "material_flow": { "visible": false }, - "speed_print": { "default": 50.0 }, - "speed_wall": { "default": 30.0 }, - "speed_wall_0": { "default": 30.0 }, - "speed_wall_x": { "default": 30.0 }, - "speed_topbottom": { "default": 50.0 }, - "speed_support": { "default": 50.0 }, - "speed_travel": { "default": 120.0 }, - "speed_layer_0": { "default": 20.0 }, - "skirt_speed": { "default": 15.0 }, - "speed_slowdown_layers": { "default": 4 }, - "infill_sparse_density": { "default": 20.0 }, - "cool_fan_speed_min": { "default": 50.0 }, - "cool_fan_speed_max": { "default": 100.0 }, - "cool_fan_full_layer": { "default": 4, "visible": true }, - "cool_min_layer_time": { "default": 5.0 }, - "cool_min_layer_time_fan_speed_max": { "default": 10.0 }, - "support_type": { "default": "Everywhere" }, - "support_angle": { "default": 45.0, "visible": true }, - "support_xy_distance": { "default": 1 }, - "support_z_distance": { "default": 0.2 }, - "support_top_distance": { "default": 0.2 }, - "support_bottom_distance": { "default": 0.24 }, - "support_pattern": { "default": "ZigZag" }, - "support_infill_rate": { "default": 15, "visible": true }, - "adhesion_type": { "default": "Raft" }, - "skirt_minimal_length": { "default": 100.0 }, - "raft_base_line_spacing": { "default": 2.0 }, - "raft_base_thickness": { "default": 0.3 }, - "raft_base_line_width": { "default": 2.0 }, - "raft_base_speed": { "default": 15.0 }, - "raft_interface_thickness": { "default": 0.24 }, - "raft_interface_line_width": { "default": 0.6 }, - "raft_airgap": { "default": 0.2 }, - "raft_surface_layers": { "default": 2 } - } -} - - diff --git a/resources/machines/prusa_i3.json b/resources/machines/prusa_i3.json deleted file mode 100644 index dcbca32801..0000000000 --- a/resources/machines/prusa_i3.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "id": "prusa_i3", - "version": 1, - "name": "Prusa i3", - "manufacturer": "Other", - "author": "Other", - "icon": "icon_ultimaker2.png", - "platform": "prusai3_platform.stl", - "file_formats": "text/x-gcode", - "inherits": "fdmprinter.json", - - "overrides": { - "machine_heated_bed": { "default": true }, - "machine_width": { "default": 200 }, - "machine_height": { "default": 200 }, - "machine_depth": { "default": 200 }, - "machine_center_is_zero": { "default": false }, - "machine_nozzle_size": { "default": 0.4 }, - "material_diameter": { "default": 1.75 }, - "machine_nozzle_heat_up_speed": { "default": 2.0 }, - "machine_nozzle_cool_down_speed": { "default": 2.0 }, - "machine_head_shape_min_x": { "default": 75 }, - "machine_head_shape_min_y": { "default": 18 }, - "machine_head_shape_max_x": { "default": 18 }, - "machine_head_shape_max_y": { "default": 35 }, - "machine_nozzle_gantry_distance": { "default": 55 }, - "machine_gcode_flavor": { "default": "RepRap (Marlin/Sprinter)" }, - - "machine_start_gcode": { - "default": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG1 Z15.0 F9000 ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E3 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F9000\n;Put printing message on LCD screen\nM117 Printing..." - }, - "machine_end_gcode": { - "default": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning" - } - } -} diff --git a/resources/machines/prusa_i3_xl.json b/resources/machines/prusa_i3_xl.json deleted file mode 100644 index b66b974983..0000000000 --- a/resources/machines/prusa_i3_xl.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "id": "prusa_i3_xl", - "version": 1, - "name": "Prusa i3 xl", - "manufacturer": "Other", - "author": "Other", - "icon": "icon_ultimaker2.png", - "platform": "prusai3_xl_platform.stl", - "file_formats": "text/x-gcode", - "inherits": "fdmprinter.json", - - "overrides": { - "machine_heated_bed": { "default": true }, - "machine_width": { "default": 200 }, - "machine_height": { "default": 200 }, - "machine_depth": { "default": 270 }, - "machine_center_is_zero": { "default": false }, - "machine_nozzle_size": { "default": 0.4 }, - "material_diameter": { "default": 1.75 }, - "machine_nozzle_heat_up_speed": { "default": 2.0 }, - "machine_nozzle_cool_down_speed": { "default": 2.0 }, - "machine_head_shape_min_x": { "default": 75 }, - "machine_head_shape_min_y": { "default": 18 }, - "machine_head_shape_max_x": { "default": 18 }, - "machine_head_shape_max_y": { "default": 35 }, - "machine_nozzle_gantry_distance": { "default": 55 }, - "machine_gcode_flavor": { "default": "RepRap (Marlin/Sprinter)" }, - - "machine_start_gcode": { - "default": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG1 Z15.0 F9000 ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E3 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F9000\n;Put printing message on LCD screen\nM117 Printing..." - }, - "machine_end_gcode": { - "default": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning" - } - } -} diff --git a/resources/machines/ultimaker.json b/resources/machines/ultimaker.json deleted file mode 100644 index a7a9cd3994..0000000000 --- a/resources/machines/ultimaker.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "id": "ultimaker_base", - "version": 1, - "visible": false, - "name": "Ultimaker", - "manufacturer": "Ultimaker", - "author": "Ultimaker", - "inherits": "fdmprinter.json", - - "machine_preferences": { - "prefered_profile": "Normal Quality", - "prefered_variant": "0.4 mm", - "prefered_material": "PLA" - } -} diff --git a/resources/machines/ultimaker2.json b/resources/machines/ultimaker2.json deleted file mode 100644 index e19aec1336..0000000000 --- a/resources/machines/ultimaker2.json +++ /dev/null @@ -1,95 +0,0 @@ -{ - "id": "ultimaker2", - "version": 1, - "name": "Ultimaker 2", - "manufacturer": "Ultimaker", - "author": "Ultimaker", - "icon": "icon_ultimaker2.png", - "platform": "ultimaker2_platform.obj", - "platform_texture": "Ultimaker2backplate.png", - "file_formats": "text/x-gcode", - - "inherits": "ultimaker.json", - - "machine_extruder_trains": { - "0": { - "machine_nozzle_heat_up_speed": { - "default": 2.0 - }, - "machine_nozzle_cool_down_speed": { - "default": 2.0 - }, - "machine_nozzle_tip_outer_diameter": { - "default": 1 - }, - "machine_nozzle_head_distance": { - "default": 3 - }, - "machine_nozzle_expansion_angle": { - "default": 45 - }, - "machine_heat_zone_length": { - "default": 16 - } - } - }, - "machine_settings": { - "machine_start_gcode" : { "default": "" }, - "machine_end_gcode" : { "default": "" }, - "machine_width": { "default": 223 }, - "machine_depth": { "default": 223 }, - "machine_height": { "default": 205 }, - "machine_heated_bed": { "default": true }, - - "machine_head_with_fans_polygon": - { - "default": [ - [ - -42, - 12 - ], - [ - -42, - -32 - ], - [ - 62, - 12 - ], - [ - 62, - -32 - ] - ] - }, - "machine_center_is_zero": { "default": false }, - "machine_nozzle_size": { "default": 0.4, "min_value": "0.001"}, - "machine_nozzle_heat_up_speed": { "default": 2.0 }, - "machine_nozzle_cool_down_speed": { "default": 2.0 }, - "gantry_height": { "default": 55 }, - "machine_use_extruder_offset_to_offset_coords": { "default": true }, - "machine_gcode_flavor": { "default": "UltiGCode" }, - "machine_disallowed_areas": { "default": [ - [[-115.0, 112.5], [ -82.0, 112.5], [ -84.0, 102.5], [-115.0, 102.5]], - [[ 115.0, 112.5], [ 115.0, 102.5], [ 110.0, 102.5], [ 108.0, 112.5]], - [[-115.0, -112.5], [-115.0, -104.5], [ -84.0, -104.5], [ -82.0, -112.5]], - [[ 115.0, -112.5], [ 108.0, -112.5], [ 110.0, -104.5], [ 115.0, -104.5]] - ]}, - "machine_platform_offset": { "default": [9.0, 0.0, 0.0] }, - - "machine_nozzle_tip_outer_diameter": { "default": 1.0 }, - "machine_nozzle_head_distance": { "default": 3.0 }, - "machine_nozzle_expansion_angle": { "default": 45 } - }, - - "overrides": { - "material_print_temperature": { "enabled": "False" }, - "material_bed_temperature": { "enabled": "False" }, - "material_diameter": { "enabled": "False" }, - "material_flow": { "enabled": "False" }, - "retraction_amount": { "enabled": "False" }, - "retraction_speed": { "enabled": "False" }, - "retraction_retract_speed": { "enabled": "False" }, - "retraction_prime_speed": { "enabled": "False" } - } -} diff --git a/resources/machines/ultimaker2_extended.json b/resources/machines/ultimaker2_extended.json deleted file mode 100644 index 0cd5ff0002..0000000000 --- a/resources/machines/ultimaker2_extended.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "id": "ultimaker2_extended", - "version": 1, - "name": "Ultimaker 2 Extended", - "manufacturer": "Ultimaker", - "author": "Ultimaker", - "icon": "icon_ultimaker2.png", - "platform": "ultimaker2_platform.obj", - "platform_texture": "Ultimaker2Extendedbackplate.png", - "file_formats": "text/x-gcode", - "inherits": "ultimaker2.json", - - "machine_settings": { - "machine_height": { "default": 315 } - } -} diff --git a/resources/machines/ultimaker2_extended_plus.json b/resources/machines/ultimaker2_extended_plus.json deleted file mode 100644 index 34a1f894bb..0000000000 --- a/resources/machines/ultimaker2_extended_plus.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "id": "ultimaker2_extended_plus_base", - "version": 1, - "name": "Ultimaker 2 Extended+", - "manufacturer": "Ultimaker", - "author": "Ultimaker", - "platform": "ultimaker2_platform.obj", - "platform_texture": "Ultimaker2ExtendedPlusbackplate.png", - "visible": false, - "file_formats": "text/x-gcode", - "inherits": "ultimaker2plus.json", - - "machine_settings": { - "machine_height": { "default": 305}, - "machine_show_variants": { "default": true }, - "machine_nozzle_head_distance": { "default": 5 }, - "machine_nozzle_expansion_angle": { "default": 45 } - } -} diff --git a/resources/machines/ultimaker2_extended_plus_025.json b/resources/machines/ultimaker2_extended_plus_025.json deleted file mode 100644 index 187079aa33..0000000000 --- a/resources/machines/ultimaker2_extended_plus_025.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "id": "ultimaker2_extended_plus", - "version": 1, - "name": "Ultimaker 2 Extended+", - "manufacturer": "Ultimaker", - "author": "Ultimaker", - "platform": "ultimaker2_platform.obj", - "platform_texture": "Ultimaker2ExtendedPlusbackplate.png", - "file_formats": "text/x-gcode", - "inherits": "ultimaker2_extended_plus.json", - "variant": "0.25 mm", - "profiles_machine": "ultimaker2plus", - "machine_settings": { - "machine_nozzle_size": { "default": 0.25 }, - "machine_nozzle_tip_outer_diameter": { "default": 0.8 } - } -} diff --git a/resources/machines/ultimaker2_extended_plus_040.json b/resources/machines/ultimaker2_extended_plus_040.json deleted file mode 100644 index b548bbe423..0000000000 --- a/resources/machines/ultimaker2_extended_plus_040.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "id": "ultimaker2_extended_plus", - "version": 1, - "name": "Ultimaker 2 Extended+", - "manufacturer": "Ultimaker", - "author": "Ultimaker", - "platform": "ultimaker2_platform.obj", - "platform_texture": "Ultimaker2ExtendedPlusbackplate.png", - "file_formats": "text/x-gcode", - "inherits": "ultimaker2_extended_plus.json", - "variant": "0.4 mm", - "profiles_machine": "ultimaker2plus", - "machine_settings": { - "machine_nozzle_size": { "default": 0.40 }, - "machine_nozzle_tip_outer_diameter": { "default": 1.05 } - } -} diff --git a/resources/machines/ultimaker2_extended_plus_060.json b/resources/machines/ultimaker2_extended_plus_060.json deleted file mode 100644 index 9d39c267ba..0000000000 --- a/resources/machines/ultimaker2_extended_plus_060.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "id": "ultimaker2_extended_plus", - "version": 1, - "name": "Ultimaker 2 Extended+", - "manufacturer": "Ultimaker", - "author": "Ultimaker", - "platform": "ultimaker2_platform.obj", - "platform_texture": "Ultimaker2ExtendedPlusbackplate.png", - "file_formats": "text/x-gcode", - "inherits": "ultimaker2_extended_plus.json", - "variant": "0.6 mm", - "profiles_machine": "ultimaker2plus", - "machine_settings": { - "machine_nozzle_size": { "default": 0.60 }, - "machine_nozzle_tip_outer_diameter": { "default": 1.25 } - } -} diff --git a/resources/machines/ultimaker2_extended_plus_080.json b/resources/machines/ultimaker2_extended_plus_080.json deleted file mode 100644 index bf74998f57..0000000000 --- a/resources/machines/ultimaker2_extended_plus_080.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "id": "ultimaker2_extended_plus", - "version": 1, - "name": "Ultimaker 2 Extended+", - "manufacturer": "Ultimaker", - "author": "Ultimaker", - "platform": "ultimaker2_platform.obj", - "platform_texture": "Ultimaker2ExtendedPlusbackplate.png", - "file_formats": "text/x-gcode", - "inherits": "ultimaker2_extended_plus.json", - "variant": "0.8 mm", - "profiles_machine": "ultimaker2plus", - "machine_settings": { - "machine_nozzle_size": { "default": 0.80 }, - "machine_nozzle_tip_outer_diameter": { "default": 1.35 } - } -} diff --git a/resources/machines/ultimaker2_go.json b/resources/machines/ultimaker2_go.json deleted file mode 100644 index cc2cde09d7..0000000000 --- a/resources/machines/ultimaker2_go.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "id": "ultimaker2_go", - "version": 1, - "name": "Ultimaker 2 Go", - "manufacturer": "Ultimaker", - "author": "Ultimaker", - "icon": "icon_ultimaker2.png", - "platform": "ultimaker2go_platform.obj", - "platform_texture": "Ultimaker2Gobackplate.png", - "file_formats": "text/x-gcode", - "inherits": "ultimaker2.json", - - "overrides": { - "machine_width": { "default": 120 }, - "machine_depth": { "default": 120 }, - "machine_height": { "default": 115 }, - "machine_heated_bed": { "default": false }, - "machine_disallowed_areas": { "default": [ - [[-60.0, 60.0], [-33.0, 60.0], [-35.0, 52.0], [-60.0, 52.0]], - [[ 60.0, 60.0], [ 60.0, 52.0], [ 35.0, 52.0], [ 33.0, 60.0]], - [[-60.0, -60.0], [-60.0, -52.0], [-35.0, -52.0], [-33.0, -60.0]], - [[ 60.0, -60.0], [ 33.0, -60.0], [ 35.0, -52.0], [ 60.0, -52.0]] - ]}, - "machine_platform_offset": { "default": [0.0, 0.0, 0.0] } - } -} diff --git a/resources/machines/ultimaker2plus.json b/resources/machines/ultimaker2plus.json deleted file mode 100644 index d9a1fdf22d..0000000000 --- a/resources/machines/ultimaker2plus.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "id": "ultimaker2plus_base", - "version": 1, - "name": "Ultimaker 2+", - "manufacturer": "Ultimaker", - "author": "Ultimaker", - "platform": "ultimaker2_platform.obj", - "platform_texture": "Ultimaker2Plusbackplate.png", - "visible": false, - "file_formats": "text/x-gcode", - "inherits": "ultimaker2.json", - - "overrides": { - "speed_infill": { "inherit_function": "speed_print" }, - "speed_wall_x": { "inherit_function": "speed_wall" }, - "layer_height_0": { "inherit_function": "round(machine_nozzle_size / 1.5, 2)" }, - "line_width": { "inherit_function": "round(machine_nozzle_size * 0.875, 2)" }, - "speed_layer_0": { "default": "20" }, - "speed_support": { "inherit_function": "speed_wall_0" }, - "machine_show_variants": { "default": true }, - "gantry_height": { "default": 52 }, - "machine_nozzle_head_distance": { "default": 5 }, - "machine_nozzle_expansion_angle": { "default": 45 }, - "machine_heat_zone_length": { "default": 20 }, - "machine_head_with_fans_polygon": - { - "default": [ - [ - -44, - 14 - ], - [ - -44, - -34 - ], - [ - 64, - 14 - ], - [ - 64, - -34 - ] - ] - }, - "machine_disallowed_areas": { "default": [ - [[-115.0, 112.5], [ -78.0, 112.5], [ -80.0, 102.5], [-115.0, 102.5]], - [[ 115.0, 112.5], [ 115.0, 102.5], [ 105.0, 102.5], [ 103.0, 112.5]], - [[-115.0, -112.5], [-115.0, -104.5], [ -84.0, -104.5], [ -82.0, -112.5]], - [[ 115.0, -112.5], [ 108.0, -112.5], [ 110.0, -104.5], [ 115.0, -104.5]] - ]} - } -} diff --git a/resources/machines/ultimaker2plus_025.json b/resources/machines/ultimaker2plus_025.json deleted file mode 100644 index 2c022f8448..0000000000 --- a/resources/machines/ultimaker2plus_025.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "id": "ultimaker2plus", - "version": 1, - "name": "Ultimaker 2+", - "manufacturer": "Ultimaker", - "author": "Ultimaker", - "platform": "ultimaker2_platform.obj", - "platform_texture": "Ultimaker2Plusbackplate.png", - "file_formats": "text/x-gcode", - "inherits": "ultimaker2plus.json", - - "variant": "0.25 mm", - - "overrides": { - "speed_wall": { "inherit_function": "round(speed_print / 1.2, 1)" }, - "speed_wall_0": { "inherit_function": "1 if speed_wall < 5 else (speed_wall - 5)" }, - "speed_topbottom": { "inherit_function": "round(speed_print / 1.5, 1)" }, - "machine_nozzle_size": { "default": 0.25 }, - "machine_nozzle_tip_outer_diameter": { "default": 0.8 }, - "coasting_volume": { "default": 0.1 }, - "coasting_min_volume": { "default": 0.17 } - } -} diff --git a/resources/machines/ultimaker2plus_040.json b/resources/machines/ultimaker2plus_040.json deleted file mode 100644 index f5a0f5a710..0000000000 --- a/resources/machines/ultimaker2plus_040.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "id": "ultimaker2plus", - "version": 1, - "name": "Ultimaker 2+", - "manufacturer": "Ultimaker", - "author": "Ultimaker", - "platform": "ultimaker2_platform.obj", - "platform_texture": "Ultimaker2Plusbackplate.png", - "file_formats": "text/x-gcode", - "inherits": "ultimaker2plus.json", - - "variant": "0.4 mm", - - "overrides": { - "speed_wall": { "inherit_function": "round(speed_print / 1.25, 1)" }, - "speed_wall_0": { "inherit_function": "1 if speed_wall < 10 else (speed_wall - 10)" }, - "speed_topbottom": { "inherit_function": "round(speed_print / 2.25, 1)" }, - "machine_nozzle_size": { "default": 0.40 }, - "machine_nozzle_tip_outer_diameter": { "default": 1.05 } - } -} diff --git a/resources/machines/ultimaker2plus_060.json b/resources/machines/ultimaker2plus_060.json deleted file mode 100644 index 89538f2fd0..0000000000 --- a/resources/machines/ultimaker2plus_060.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "id": "ultimaker2plus", - "version": 1, - "name": "Ultimaker 2+", - "manufacturer": "Ultimaker", - "author": "Ultimaker", - "platform": "ultimaker2_platform.obj", - "platform_texture": "Ultimaker2Plusbackplate.png", - "file_formats": "text/x-gcode", - "inherits": "ultimaker2plus.json", - - "variant": "0.6 mm", - - "overrides": { - "speed_wall": { "inherit_function": "round(speed_print / 1.333333, 1)" }, - "speed_wall_0": { "inherit_function": "1 if speed_wall < 10 else (speed_wall - 10)" }, - "speed_topbottom": { "inherit_function": "round(speed_print / 2, 1)" }, - "machine_nozzle_size": { "default": 0.60 }, - "machine_nozzle_tip_outer_diameter": { "default": 1.25 }, - "coasting_volume": { "default": 1.36 } - } -} diff --git a/resources/machines/ultimaker2plus_080.json b/resources/machines/ultimaker2plus_080.json deleted file mode 100644 index e231fbb9f5..0000000000 --- a/resources/machines/ultimaker2plus_080.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "id": "ultimaker2plus", - "version": 1, - "name": "Ultimaker 2+", - "manufacturer": "Ultimaker", - "author": "Ultimaker", - "platform": "ultimaker2_platform.obj", - "platform_texture": "Ultimaker2Plusbackplate.png", - "file_formats": "text/x-gcode", - "inherits": "ultimaker2plus.json", - - "variant": "0.8 mm", - - "overrides": { - "speed_wall": { "inherit_function": "round(speed_print / 1.333333, 1)" }, - "speed_wall_0": { "inherit_function": "1 if speed_wall < 10 else (speed_wall - 10)" }, - "speed_topbottom": { "inherit_function": "round(speed_print / 2, 1)" }, - "machine_nozzle_size": { "default": 0.80 }, - "machine_nozzle_tip_outer_diameter": { "default": 1.35 }, - "coasting_volume": { "default": 3.22 } - } -} diff --git a/resources/machines/ultimaker_original.json b/resources/machines/ultimaker_original.json deleted file mode 100644 index 3e694c1b8e..0000000000 --- a/resources/machines/ultimaker_original.json +++ /dev/null @@ -1,83 +0,0 @@ -{ - "id": "ultimaker_original", - "version": 1, - "name": "Ultimaker Original", - "manufacturer": "Ultimaker", - "author": "Ultimaker", - "icon": "icon_ultimaker.png", - "platform": "ultimaker_platform.stl", - "file_formats": "text/x-gcode", - "inherits": "ultimaker.json", - - "pages": [ - "SelectUpgradedParts", - "UpgradeFirmware", - "UltimakerCheckup", - "BedLeveling" - ], - - "machine_extruder_trains": { - "0": { - "machine_nozzle_heat_up_speed": { - "default": 2.0 - }, - "machine_nozzle_cool_down_speed": { - "default": 2.0 - }, - "machine_nozzle_tip_outer_diameter": { - "default": 1 - }, - "machine_nozzle_head_distance": { - "default": 3 - }, - "machine_nozzle_expansion_angle": { - "default": 45 - }, - "machine_heat_zone_length": { - "default": 16 - } - } - }, - "overrides": { - "machine_width": { "default": 205 }, - "machine_height": { "default": 200 }, - "machine_depth": { "default": 205 }, - "machine_center_is_zero": { "default": false }, - "machine_nozzle_size": { "default": 0.4 }, - "machine_nozzle_heat_up_speed": { "default": 2.0 }, - "machine_nozzle_cool_down_speed": { "default": 2.0 }, - "machine_head_with_fans_polygon": - { - "default": [ - [ - -75, - 35 - ], - [ - -75, - -18 - ], - [ - 18, - 35 - ], - [ - 18, - -18 - ] - ] - }, - "gantry_height": { "default": 55 }, - "machine_use_extruder_offset_to_offset_coords": { "default": true }, - "machine_gcode_flavor": { "default": "RepRap (Marlin/Sprinter)" }, - - "machine_start_gcode": { - "default": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG1 Z15.0 F9000 ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E6 ;extrude 6 mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F9000\n;Put printing message on LCD screen\nM117 Printing..." - }, - "machine_end_gcode": { - "default": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning" - }, - - "machine_extruder_drive_upgrade": { "default": false } - } -} diff --git a/resources/machines/ultimaker_original_plus.json b/resources/machines/ultimaker_original_plus.json deleted file mode 100644 index 07c5a04549..0000000000 --- a/resources/machines/ultimaker_original_plus.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "id": "ultimaker_original_plus", - "version": 1, - "name": "Ultimaker Original+", - "manufacturer": "Ultimaker", - "author": "Ultimaker", - "icon": "icon_ultimaker.png", - "platform": "ultimaker2_platform.obj", - "platform_texture": "UltimakerPlusbackplate.png", - "file_formats": "text/x-gcode", - "inherits": "ultimaker_original.json", - - "pages": [ - "UpgradeFirmware", - "UltimakerCheckup", - "BedLeveling" - ], - - "overrides": { - "machine_heated_bed": { "default": true } - } -} diff --git a/resources/machines/uniqbot_one.json b/resources/machines/uniqbot_one.json deleted file mode 100644 index d1343e6c54..0000000000 --- a/resources/machines/uniqbot_one.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "id": "uniqbot_one", - "version": 1, - "name": "Uniqbot", - "manufacturer": "Other", - "author": "Unimatech", - "icon": "icon_ultimaker2.png", - "file_formats": "text/x-gcode", - "inherits": "fdmprinter.json", - - "overrides": { - "machine_heated_bed": { "default": false }, - "machine_width": { "default": 140 }, - "machine_height": { "default": 120 }, - "machine_depth": { "default": 160 }, - "machine_center_is_zero": { "default": false }, - "machine_nozzle_size": { "default": 0.5 }, - "material_diameter": { "default": 1.75 }, - "machine_nozzle_heat_up_speed": { "default": 2.0 }, - "machine_nozzle_cool_down_speed": { "default": 2.0 }, - "machine_nozzle_gantry_distance": { "default": 55 }, - "machine_gcode_flavor": { "default": "RepRap (Marlin/Sprinter)" }, - - "machine_start_gcode": { - "default": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG1 Z15.0 F9000 ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E3 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F9000\n;Put printing message on LCD screen\nM117 Printing..." - }, - "machine_end_gcode": { - "default": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning" - } - } -} diff --git a/resources/materials/generic_abs.xml.fdm_material b/resources/materials/generic_abs.xml.fdm_material new file mode 100644 index 0000000000..654b06d221 --- /dev/null +++ b/resources/materials/generic_abs.xml.fdm_material @@ -0,0 +1,34 @@ + + + + + + Generic + ABS + Generic + + 506c9f0d-e3aa-4bd4-b2d2-23e2425b1aa9 + 0 + #FF0000 + + + 1.07 + 2.85 + + + 250 + 80 + + + + + + + + + + + + diff --git a/resources/materials/generic_cpe.xml.fdm_material b/resources/materials/generic_cpe.xml.fdm_material new file mode 100644 index 0000000000..bbe6e328d2 --- /dev/null +++ b/resources/materials/generic_cpe.xml.fdm_material @@ -0,0 +1,34 @@ + + + + + + Generic + CPE + Generic + + 506c9f0d-e3aa-4bd4-b2d2-23e2425b1aa9 + 0 + #0000FF + + + 0.94 + 2.85 + + + 250 + 70 + + + + + + + + + + + + diff --git a/resources/materials/generic_pla.xml.fdm_material b/resources/materials/generic_pla.xml.fdm_material new file mode 100644 index 0000000000..40432d5849 --- /dev/null +++ b/resources/materials/generic_pla.xml.fdm_material @@ -0,0 +1,34 @@ + + + + + + Generic + PLA + Generic + + 506c9f0d-e3aa-4bd4-b2d2-23e2425b1aa9 + 0 + #00FF00 + + + 1.3 + 2.85 + + + 210 + 60 + + + + + + + + + + + + diff --git a/resources/meshes/mendel90_platform.stl b/resources/meshes/mendel90_platform.stl new file mode 100644 index 0000000000..706c90539d --- /dev/null +++ b/resources/meshes/mendel90_platform.stl @@ -0,0 +1,23858 @@ +solid OpenSCAD_Model + facet normal 0.866025 0.5 0 + outer loop + vertex -101.75 -104.5 20.5 + vertex -103.125 -102.118 0.5 + vertex -103.125 -102.118 20.5 + endloop + endfacet + facet normal 0.866025 0.5 0 + outer loop + vertex -103.125 -102.118 0.5 + vertex -101.75 -104.5 20.5 + vertex -101.75 -104.5 0.5 + endloop + endfacet + facet normal -0.866025 0.5 0 + outer loop + vertex -105.875 -102.118 0.5 + vertex -107 -104.067 20.5 + vertex -105.875 -102.118 20.5 + endloop + endfacet + facet normal -0.866025 0.5 -3.46791e-008 + outer loop + vertex -107.25 -104.5 0.5 + vertex -107 -104.067 20.5 + vertex -105.875 -102.118 0.5 + endloop + endfacet + facet normal -0.866026 0.499999 0 + outer loop + vertex -107 -104.067 20.5 + vertex -107.25 -104.5 0.5 + vertex -107.25 -104.5 20.5 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex -103.125 -102.118 0.5 + vertex -105.875 -102.118 20.5 + vertex -103.125 -102.118 20.5 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -105.875 -102.118 20.5 + vertex -103.125 -102.118 0.5 + vertex -105.875 -102.118 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -107 -82 20.5 + vertex -106.981 82 20.5 + vertex -106.981 -82 20.5 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex -106.981 82 20.5 + vertex -107 -82 20.5 + vertex -107 82 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 106.981 -82 20.5 + vertex -106.981 -82 20.5 + vertex 106.981 82 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -106.981 82 20.5 + vertex 106.981 82 20.5 + vertex -106.981 -82 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -106.981 -101 20.5 + vertex -103.125 -102.118 20.5 + vertex -105.875 -102.118 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 106.981 82 20.5 + vertex -106.981 82 20.5 + vertex -101.75 104.5 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -103.125 -102.118 20.5 + vertex -106.981 -101 20.5 + vertex -106.981 -82 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -107 -101 20.5 + vertex -105.875 -102.118 20.5 + vertex -107 -104.067 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.875 -102.118 20.5 + vertex -107 -101 20.5 + vertex -106.981 -101 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 107 -107 20.5 + vertex 105.875 -106.882 20.5 + vertex 107 -104.933 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 107 -107 20.5 + vertex 103.125 -106.882 20.5 + vertex 105.875 -106.882 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -101.75 -104.5 20.5 + vertex -106.981 -82 20.5 + vertex 106.981 -82 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.125 -106.882 20.5 + vertex -101.75 -104.5 20.5 + vertex 101.75 -104.5 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -103.125 -106.882 20.5 + vertex 103.125 -106.882 20.5 + vertex 107 -107 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.125 -106.882 20.5 + vertex -103.125 -106.882 20.5 + vertex -101.75 -104.5 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -107 -107 20.5 + vertex -103.125 -106.882 20.5 + vertex 107 -107 20.5 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex -103.125 -106.882 20.5 + vertex -107 -107 20.5 + vertex -105.875 -106.882 20.5 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex -105.875 -106.882 20.5 + vertex -107 -107 20.5 + vertex -107 -104.933 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 105.875 -102.118 20.5 + vertex 107 -101 20.5 + vertex 107 -104.067 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.125 -102.118 20.5 + vertex 106.981 -82 20.5 + vertex 106.981 -101 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 101.75 -104.5 20.5 + vertex 106.981 -82 20.5 + vertex 103.125 -102.118 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.125 -102.118 20.5 + vertex 106.981 -101 20.5 + vertex 105.875 -102.118 20.5 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 107 -101 20.5 + vertex 105.875 -102.118 20.5 + vertex 106.981 -101 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 106.981 -82 20.5 + vertex 107 82 20.5 + vertex 107 -82 20.5 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 107 82 20.5 + vertex 106.981 -82 20.5 + vertex 106.981 82 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 105.875 102.118 20.5 + vertex 107 101 20.5 + vertex 106.981 101 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 107 101 20.5 + vertex 105.875 102.118 20.5 + vertex 107 104.067 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -101.75 -104.5 20.5 + vertex 106.981 -82 20.5 + vertex 101.75 -104.5 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 106.981 82 20.5 + vertex 103.125 102.118 20.5 + vertex 106.981 101 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 106.981 101 20.5 + vertex 103.125 102.118 20.5 + vertex 105.875 102.118 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -106.981 -82 20.5 + vertex -101.75 -104.5 20.5 + vertex -103.125 -102.118 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 106.981 82 20.5 + vertex 101.75 104.5 20.5 + vertex 103.125 102.118 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 105.875 106.882 20.5 + vertex 107 107 20.5 + vertex 107 104.933 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.125 106.882 20.5 + vertex 107 107 20.5 + vertex 105.875 106.882 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 106.981 82 20.5 + vertex -101.75 104.5 20.5 + vertex 101.75 104.5 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 101.75 104.5 20.5 + vertex -101.75 104.5 20.5 + vertex 103.125 106.882 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -103.125 106.882 20.5 + vertex 103.125 106.882 20.5 + vertex -101.75 104.5 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.125 106.882 20.5 + vertex -103.125 106.882 20.5 + vertex 107 107 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -107 107 20.5 + vertex -103.125 106.882 20.5 + vertex -105.875 106.882 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -103.125 106.882 20.5 + vertex -107 107 20.5 + vertex 107 107 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -107 107 20.5 + vertex -105.875 106.882 20.5 + vertex -107 104.933 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -101.75 104.5 20.5 + vertex -106.981 82 20.5 + vertex -103.125 102.118 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -106.981 101 20.5 + vertex -103.125 102.118 20.5 + vertex -106.981 82 20.5 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex -103.125 102.118 20.5 + vertex -106.981 101 20.5 + vertex -105.875 102.118 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -107 101 20.5 + vertex -105.875 102.118 20.5 + vertex -106.981 101 20.5 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex -105.875 102.118 20.5 + vertex -107 101 20.5 + vertex -107 104.067 20.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 107 104.933 20.5 + vertex 107 104.067 20.5 + vertex 107.25 104.5 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 105.919 104.013 20.5 + vertex 105.99 104.5 20.5 + vertex 106 104.5 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 105.919 104.013 20.5 + vertex 105.909 104.016 20.5 + vertex 105.99 104.5 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 105.684 103.579 20.5 + vertex 105.909 104.016 20.5 + vertex 105.919 104.013 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 105.684 103.579 20.5 + vertex 105.676 103.585 20.5 + vertex 105.909 104.016 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 105.32 103.244 20.5 + vertex 105.676 103.585 20.5 + vertex 105.684 103.579 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 105.32 103.244 20.5 + vertex 105.315 103.253 20.5 + vertex 105.676 103.585 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 104.868 103.046 20.5 + vertex 105.315 103.253 20.5 + vertex 105.32 103.244 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 104.868 103.046 20.5 + vertex 104.866 103.056 20.5 + vertex 105.315 103.253 20.5 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 104.868 103.046 20.5 + vertex 104.377 103.015 20.5 + vertex 104.866 103.056 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 104.376 103.005 20.5 + vertex 104.377 103.015 20.5 + vertex 104.868 103.046 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 104.376 103.005 20.5 + vertex 103.901 103.135 20.5 + vertex 104.377 103.015 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.897 103.126 20.5 + vertex 103.901 103.135 20.5 + vertex 104.376 103.005 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.897 103.126 20.5 + vertex 103.491 103.404 20.5 + vertex 103.901 103.135 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.484 103.396 20.5 + vertex 103.491 103.404 20.5 + vertex 103.897 103.126 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.484 103.396 20.5 + vertex 103.19 103.791 20.5 + vertex 103.491 103.404 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.181 103.786 20.5 + vertex 103.19 103.791 20.5 + vertex 103.484 103.396 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.181 103.786 20.5 + vertex 103.03 104.255 20.5 + vertex 103.19 103.791 20.5 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 103.03 104.255 20.5 + vertex 103.02 104.253 20.5 + vertex 103.03 104.745 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.02 104.253 20.5 + vertex 103.03 104.255 20.5 + vertex 103.181 103.786 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 105.99 104.5 20.5 + vertex 105.919 104.987 20.5 + vertex 106 104.5 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 105.909 104.984 20.5 + vertex 105.919 104.987 20.5 + vertex 105.99 104.5 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 105.909 104.984 20.5 + vertex 105.684 105.421 20.5 + vertex 105.919 104.987 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 105.676 105.415 20.5 + vertex 105.684 105.421 20.5 + vertex 105.909 104.984 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 105.676 105.415 20.5 + vertex 105.32 105.756 20.5 + vertex 105.684 105.421 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 105.315 105.747 20.5 + vertex 105.32 105.756 20.5 + vertex 105.676 105.415 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 105.315 105.747 20.5 + vertex 104.868 105.954 20.5 + vertex 105.32 105.756 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 104.866 105.944 20.5 + vertex 104.868 105.954 20.5 + vertex 105.315 105.747 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 104.377 105.985 20.5 + vertex 104.868 105.954 20.5 + vertex 104.866 105.944 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 104.377 105.985 20.5 + vertex 104.376 105.995 20.5 + vertex 104.868 105.954 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.901 105.865 20.5 + vertex 104.376 105.995 20.5 + vertex 104.377 105.985 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.901 105.865 20.5 + vertex 103.897 105.874 20.5 + vertex 104.376 105.995 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.491 105.596 20.5 + vertex 103.897 105.874 20.5 + vertex 103.901 105.865 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.491 105.596 20.5 + vertex 103.484 105.604 20.5 + vertex 103.897 105.874 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.19 105.209 20.5 + vertex 103.484 105.604 20.5 + vertex 103.491 105.596 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.19 105.209 20.5 + vertex 103.181 105.214 20.5 + vertex 103.484 105.604 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.03 104.745 20.5 + vertex 103.181 105.214 20.5 + vertex 103.19 105.209 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.03 104.745 20.5 + vertex 103.02 104.747 20.5 + vertex 103.181 105.214 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.02 104.747 20.5 + vertex 103.03 104.745 20.5 + vertex 103.02 104.253 20.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 107 -104.067 20.5 + vertex 107 -104.933 20.5 + vertex 107.25 -104.5 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 105.919 -104.987 20.5 + vertex 105.99 -104.5 20.5 + vertex 106 -104.5 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 105.919 -104.987 20.5 + vertex 105.909 -104.984 20.5 + vertex 105.99 -104.5 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 105.684 -105.421 20.5 + vertex 105.909 -104.984 20.5 + vertex 105.919 -104.987 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 105.684 -105.421 20.5 + vertex 105.676 -105.415 20.5 + vertex 105.909 -104.984 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 105.32 -105.756 20.5 + vertex 105.676 -105.415 20.5 + vertex 105.684 -105.421 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 105.32 -105.756 20.5 + vertex 105.315 -105.747 20.5 + vertex 105.676 -105.415 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 104.868 -105.954 20.5 + vertex 105.315 -105.747 20.5 + vertex 105.32 -105.756 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 104.868 -105.954 20.5 + vertex 104.866 -105.944 20.5 + vertex 105.315 -105.747 20.5 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 104.868 -105.954 20.5 + vertex 104.377 -105.985 20.5 + vertex 104.866 -105.944 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 104.376 -105.995 20.5 + vertex 104.377 -105.985 20.5 + vertex 104.868 -105.954 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 104.376 -105.995 20.5 + vertex 103.901 -105.865 20.5 + vertex 104.377 -105.985 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.897 -105.874 20.5 + vertex 103.901 -105.865 20.5 + vertex 104.376 -105.995 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.897 -105.874 20.5 + vertex 103.491 -105.596 20.5 + vertex 103.901 -105.865 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.484 -105.604 20.5 + vertex 103.491 -105.596 20.5 + vertex 103.897 -105.874 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.484 -105.604 20.5 + vertex 103.19 -105.209 20.5 + vertex 103.491 -105.596 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.181 -105.214 20.5 + vertex 103.19 -105.209 20.5 + vertex 103.484 -105.604 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.181 -105.214 20.5 + vertex 103.03 -104.745 20.5 + vertex 103.19 -105.209 20.5 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 103.03 -104.745 20.5 + vertex 103.02 -104.747 20.5 + vertex 103.03 -104.255 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.02 -104.747 20.5 + vertex 103.03 -104.745 20.5 + vertex 103.181 -105.214 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 105.99 -104.5 20.5 + vertex 105.919 -104.013 20.5 + vertex 106 -104.5 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 105.909 -104.016 20.5 + vertex 105.919 -104.013 20.5 + vertex 105.99 -104.5 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 105.909 -104.016 20.5 + vertex 105.684 -103.579 20.5 + vertex 105.919 -104.013 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 105.676 -103.585 20.5 + vertex 105.684 -103.579 20.5 + vertex 105.909 -104.016 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 105.676 -103.585 20.5 + vertex 105.32 -103.244 20.5 + vertex 105.684 -103.579 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 105.315 -103.253 20.5 + vertex 105.32 -103.244 20.5 + vertex 105.676 -103.585 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 105.315 -103.253 20.5 + vertex 104.868 -103.046 20.5 + vertex 105.32 -103.244 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 104.866 -103.056 20.5 + vertex 104.868 -103.046 20.5 + vertex 105.315 -103.253 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 104.377 -103.015 20.5 + vertex 104.868 -103.046 20.5 + vertex 104.866 -103.056 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 104.377 -103.015 20.5 + vertex 104.376 -103.005 20.5 + vertex 104.868 -103.046 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.901 -103.135 20.5 + vertex 104.376 -103.005 20.5 + vertex 104.377 -103.015 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.901 -103.135 20.5 + vertex 103.897 -103.126 20.5 + vertex 104.376 -103.005 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.491 -103.404 20.5 + vertex 103.897 -103.126 20.5 + vertex 103.901 -103.135 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.491 -103.404 20.5 + vertex 103.484 -103.396 20.5 + vertex 103.897 -103.126 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.19 -103.791 20.5 + vertex 103.484 -103.396 20.5 + vertex 103.491 -103.404 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.19 -103.791 20.5 + vertex 103.181 -103.786 20.5 + vertex 103.484 -103.396 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.03 -104.255 20.5 + vertex 103.181 -103.786 20.5 + vertex 103.19 -103.791 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.03 -104.255 20.5 + vertex 103.02 -104.253 20.5 + vertex 103.181 -103.786 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.02 -104.253 20.5 + vertex 103.03 -104.255 20.5 + vertex 103.02 -104.747 20.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -107 104.933 20.5 + vertex -107.25 104.5 20.5 + vertex -107 104.067 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -103.081 104.013 20.5 + vertex -103.01 104.5 20.5 + vertex -103 104.5 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -103.081 104.013 20.5 + vertex -103.091 104.016 20.5 + vertex -103.01 104.5 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -103.316 103.579 20.5 + vertex -103.091 104.016 20.5 + vertex -103.081 104.013 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -103.316 103.579 20.5 + vertex -103.324 103.585 20.5 + vertex -103.091 104.016 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -103.68 103.244 20.5 + vertex -103.324 103.585 20.5 + vertex -103.316 103.579 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -103.68 103.244 20.5 + vertex -103.685 103.253 20.5 + vertex -103.324 103.585 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -104.132 103.046 20.5 + vertex -103.685 103.253 20.5 + vertex -103.68 103.244 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -104.132 103.046 20.5 + vertex -104.134 103.056 20.5 + vertex -103.685 103.253 20.5 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex -104.132 103.046 20.5 + vertex -104.623 103.015 20.5 + vertex -104.134 103.056 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -104.624 103.005 20.5 + vertex -104.623 103.015 20.5 + vertex -104.132 103.046 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -104.624 103.005 20.5 + vertex -105.099 103.135 20.5 + vertex -104.623 103.015 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.103 103.126 20.5 + vertex -105.099 103.135 20.5 + vertex -104.624 103.005 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.103 103.126 20.5 + vertex -105.509 103.404 20.5 + vertex -105.099 103.135 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.516 103.396 20.5 + vertex -105.509 103.404 20.5 + vertex -105.103 103.126 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.516 103.396 20.5 + vertex -105.81 103.791 20.5 + vertex -105.509 103.404 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.819 103.786 20.5 + vertex -105.81 103.791 20.5 + vertex -105.516 103.396 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.819 103.786 20.5 + vertex -105.97 104.255 20.5 + vertex -105.81 103.791 20.5 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex -105.97 104.255 20.5 + vertex -105.98 104.253 20.5 + vertex -105.97 104.745 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.98 104.253 20.5 + vertex -105.97 104.255 20.5 + vertex -105.819 103.786 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -103.01 104.5 20.5 + vertex -103.081 104.987 20.5 + vertex -103 104.5 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -103.091 104.984 20.5 + vertex -103.081 104.987 20.5 + vertex -103.01 104.5 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -103.091 104.984 20.5 + vertex -103.316 105.421 20.5 + vertex -103.081 104.987 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -103.324 105.415 20.5 + vertex -103.316 105.421 20.5 + vertex -103.091 104.984 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -103.324 105.415 20.5 + vertex -103.68 105.756 20.5 + vertex -103.316 105.421 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -103.685 105.747 20.5 + vertex -103.68 105.756 20.5 + vertex -103.324 105.415 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -103.685 105.747 20.5 + vertex -104.132 105.954 20.5 + vertex -103.68 105.756 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -104.134 105.944 20.5 + vertex -104.132 105.954 20.5 + vertex -103.685 105.747 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -104.623 105.985 20.5 + vertex -104.132 105.954 20.5 + vertex -104.134 105.944 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -104.623 105.985 20.5 + vertex -104.624 105.995 20.5 + vertex -104.132 105.954 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.099 105.865 20.5 + vertex -104.624 105.995 20.5 + vertex -104.623 105.985 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.099 105.865 20.5 + vertex -105.103 105.874 20.5 + vertex -104.624 105.995 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.509 105.596 20.5 + vertex -105.103 105.874 20.5 + vertex -105.099 105.865 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.509 105.596 20.5 + vertex -105.516 105.604 20.5 + vertex -105.103 105.874 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.81 105.209 20.5 + vertex -105.516 105.604 20.5 + vertex -105.509 105.596 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.81 105.209 20.5 + vertex -105.819 105.214 20.5 + vertex -105.516 105.604 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.97 104.745 20.5 + vertex -105.819 105.214 20.5 + vertex -105.81 105.209 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.97 104.745 20.5 + vertex -105.98 104.747 20.5 + vertex -105.819 105.214 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.98 104.747 20.5 + vertex -105.97 104.745 20.5 + vertex -105.98 104.253 20.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -107 -104.067 20.5 + vertex -107.25 -104.5 20.5 + vertex -107 -104.933 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -103.081 -104.987 20.5 + vertex -103.01 -104.5 20.5 + vertex -103 -104.5 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -103.081 -104.987 20.5 + vertex -103.091 -104.984 20.5 + vertex -103.01 -104.5 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -103.316 -105.421 20.5 + vertex -103.091 -104.984 20.5 + vertex -103.081 -104.987 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -103.316 -105.421 20.5 + vertex -103.324 -105.415 20.5 + vertex -103.091 -104.984 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -103.68 -105.756 20.5 + vertex -103.324 -105.415 20.5 + vertex -103.316 -105.421 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -103.68 -105.756 20.5 + vertex -103.685 -105.747 20.5 + vertex -103.324 -105.415 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -104.132 -105.954 20.5 + vertex -103.685 -105.747 20.5 + vertex -103.68 -105.756 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -104.132 -105.954 20.5 + vertex -104.134 -105.944 20.5 + vertex -103.685 -105.747 20.5 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex -104.132 -105.954 20.5 + vertex -104.623 -105.985 20.5 + vertex -104.134 -105.944 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -104.624 -105.995 20.5 + vertex -104.623 -105.985 20.5 + vertex -104.132 -105.954 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -104.624 -105.995 20.5 + vertex -105.099 -105.865 20.5 + vertex -104.623 -105.985 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.103 -105.874 20.5 + vertex -105.099 -105.865 20.5 + vertex -104.624 -105.995 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.103 -105.874 20.5 + vertex -105.509 -105.596 20.5 + vertex -105.099 -105.865 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.516 -105.604 20.5 + vertex -105.509 -105.596 20.5 + vertex -105.103 -105.874 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.516 -105.604 20.5 + vertex -105.81 -105.209 20.5 + vertex -105.509 -105.596 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.819 -105.214 20.5 + vertex -105.81 -105.209 20.5 + vertex -105.516 -105.604 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.819 -105.214 20.5 + vertex -105.97 -104.745 20.5 + vertex -105.81 -105.209 20.5 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex -105.97 -104.745 20.5 + vertex -105.98 -104.747 20.5 + vertex -105.97 -104.255 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.98 -104.747 20.5 + vertex -105.97 -104.745 20.5 + vertex -105.819 -105.214 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -103.01 -104.5 20.5 + vertex -103.081 -104.013 20.5 + vertex -103 -104.5 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -103.091 -104.016 20.5 + vertex -103.081 -104.013 20.5 + vertex -103.01 -104.5 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -103.091 -104.016 20.5 + vertex -103.316 -103.579 20.5 + vertex -103.081 -104.013 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -103.324 -103.585 20.5 + vertex -103.316 -103.579 20.5 + vertex -103.091 -104.016 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -103.324 -103.585 20.5 + vertex -103.68 -103.244 20.5 + vertex -103.316 -103.579 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -103.685 -103.253 20.5 + vertex -103.68 -103.244 20.5 + vertex -103.324 -103.585 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -103.685 -103.253 20.5 + vertex -104.132 -103.046 20.5 + vertex -103.68 -103.244 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -104.134 -103.056 20.5 + vertex -104.132 -103.046 20.5 + vertex -103.685 -103.253 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -104.623 -103.015 20.5 + vertex -104.132 -103.046 20.5 + vertex -104.134 -103.056 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -104.623 -103.015 20.5 + vertex -104.624 -103.005 20.5 + vertex -104.132 -103.046 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.099 -103.135 20.5 + vertex -104.624 -103.005 20.5 + vertex -104.623 -103.015 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.099 -103.135 20.5 + vertex -105.103 -103.126 20.5 + vertex -104.624 -103.005 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.509 -103.404 20.5 + vertex -105.103 -103.126 20.5 + vertex -105.099 -103.135 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.509 -103.404 20.5 + vertex -105.516 -103.396 20.5 + vertex -105.103 -103.126 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.81 -103.791 20.5 + vertex -105.516 -103.396 20.5 + vertex -105.509 -103.404 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.81 -103.791 20.5 + vertex -105.819 -103.786 20.5 + vertex -105.516 -103.396 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.97 -104.255 20.5 + vertex -105.819 -103.786 20.5 + vertex -105.81 -103.791 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.97 -104.255 20.5 + vertex -105.98 -104.253 20.5 + vertex -105.819 -103.786 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.98 -104.253 20.5 + vertex -105.97 -104.255 20.5 + vertex -105.98 -104.747 20.5 + endloop + endfacet + facet normal 0.866025 -0.5 0 + outer loop + vertex -103.125 -106.882 20.5 + vertex -101.75 -104.5 0.5 + vertex -101.75 -104.5 20.5 + endloop + endfacet + facet normal 0.866025 -0.5 0 + outer loop + vertex -101.75 -104.5 0.5 + vertex -103.125 -106.882 20.5 + vertex -103.125 -106.882 0.5 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex -101.75 -104.5 0.5 + vertex -103.081 -104.987 0.5 + vertex -103 -104.5 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -103.316 -105.421 0.5 + vertex -101.75 -104.5 0.5 + vertex -103.125 -106.882 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -101.75 -104.5 0.5 + vertex -103.316 -105.421 0.5 + vertex -103.081 -104.987 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -103.125 -106.882 0.5 + vertex -103.68 -105.756 0.5 + vertex -103.316 -105.421 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -103.125 -106.882 0.5 + vertex -104.132 -105.954 0.5 + vertex -103.68 -105.756 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -103.125 -106.882 0.5 + vertex -104.624 -105.995 0.5 + vertex -104.132 -105.954 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.875 -106.882 0.5 + vertex -104.624 -105.995 0.5 + vertex -103.125 -106.882 0.5 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex -104.624 -105.995 0.5 + vertex -105.875 -106.882 0.5 + vertex -105.103 -105.874 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.875 -106.882 0.5 + vertex -105.516 -105.604 0.5 + vertex -105.103 -105.874 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.875 -106.882 0.5 + vertex -105.819 -105.214 0.5 + vertex -105.516 -105.604 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -107.25 -104.5 0.5 + vertex -105.819 -105.214 0.5 + vertex -105.875 -106.882 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.98 -104.747 0.5 + vertex -107.25 -104.5 0.5 + vertex -105.98 -104.253 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.819 -105.214 0.5 + vertex -107.25 -104.5 0.5 + vertex -105.98 -104.747 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -103.081 -104.013 0.5 + vertex -101.75 -104.5 0.5 + vertex -103 -104.5 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -103.316 -103.579 0.5 + vertex -101.75 -104.5 0.5 + vertex -103.081 -104.013 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -101.75 -104.5 0.5 + vertex -103.316 -103.579 0.5 + vertex -103.125 -102.118 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -103.68 -103.244 0.5 + vertex -103.125 -102.118 0.5 + vertex -103.316 -103.579 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -104.132 -103.046 0.5 + vertex -103.125 -102.118 0.5 + vertex -103.68 -103.244 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -104.624 -103.005 0.5 + vertex -103.125 -102.118 0.5 + vertex -104.132 -103.046 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.875 -102.118 0.5 + vertex -104.624 -103.005 0.5 + vertex -105.103 -103.126 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -104.624 -103.005 0.5 + vertex -105.875 -102.118 0.5 + vertex -103.125 -102.118 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.516 -103.396 0.5 + vertex -105.875 -102.118 0.5 + vertex -105.103 -103.126 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.819 -103.786 0.5 + vertex -105.875 -102.118 0.5 + vertex -105.516 -103.396 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -107.25 -104.5 0.5 + vertex -105.819 -103.786 0.5 + vertex -105.98 -104.253 0.5 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex -105.819 -103.786 0.5 + vertex -107.25 -104.5 0.5 + vertex -105.875 -102.118 0.5 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -105.875 -106.882 0.5 + vertex -103.125 -106.882 20.5 + vertex -105.875 -106.882 20.5 + endloop + endfacet + facet normal 0 -1 -0 + outer loop + vertex -103.125 -106.882 20.5 + vertex -105.875 -106.882 0.5 + vertex -103.125 -106.882 0.5 + endloop + endfacet + facet normal -0.866026 -0.499999 0 + outer loop + vertex -107.25 -104.5 0.5 + vertex -107 -104.933 20.5 + vertex -107.25 -104.5 20.5 + endloop + endfacet + facet normal -0.866025 -0.5 -3.46791e-008 + outer loop + vertex -105.875 -106.882 0.5 + vertex -107 -104.933 20.5 + vertex -107.25 -104.5 0.5 + endloop + endfacet + facet normal -0.866025 -0.5 0 + outer loop + vertex -107 -104.933 20.5 + vertex -105.875 -106.882 0.5 + vertex -105.875 -106.882 20.5 + endloop + endfacet + facet normal 0.98636 0.164599 0 + outer loop + vertex -103 -104.5 0.5 + vertex -103.081 -104.013 -6.5 + vertex -103.081 -104.013 0.5 + endloop + endfacet + facet normal 0.98636 0.164599 0 + outer loop + vertex -103.081 -104.013 -6.5 + vertex -103 -104.5 0.5 + vertex -103 -104.5 -6.5 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -105.98 -104.747 -6.5 + vertex -105.98 -104.253 0.5 + vertex -105.98 -104.253 -6.5 + endloop + endfacet + facet normal -1 -0 0 + outer loop + vertex -105.98 -104.253 0.5 + vertex -105.98 -104.747 -6.5 + vertex -105.98 -104.747 0.5 + endloop + endfacet + facet normal 0.0825698 0.996585 -0 + outer loop + vertex -104.132 -103.046 -6.5 + vertex -104.624 -103.005 0.5 + vertex -104.132 -103.046 0.5 + endloop + endfacet + facet normal 0.0825698 0.996585 0 + outer loop + vertex -104.624 -103.005 0.5 + vertex -104.132 -103.046 -6.5 + vertex -104.624 -103.005 -6.5 + endloop + endfacet + facet normal 0.0825698 -0.996585 0 + outer loop + vertex -104.624 -105.995 -6.5 + vertex -104.132 -105.954 0.5 + vertex -104.624 -105.995 0.5 + endloop + endfacet + facet normal 0.0825698 -0.996585 0 + outer loop + vertex -104.132 -105.954 0.5 + vertex -104.624 -105.995 -6.5 + vertex -104.132 -105.954 -6.5 + endloop + endfacet + facet normal 0.401692 -0.915775 0 + outer loop + vertex -104.132 -105.954 -6.5 + vertex -103.68 -105.756 0.5 + vertex -104.132 -105.954 0.5 + endloop + endfacet + facet normal 0.401692 -0.915775 0 + outer loop + vertex -103.68 -105.756 0.5 + vertex -104.132 -105.954 -6.5 + vertex -103.68 -105.756 -6.5 + endloop + endfacet + facet normal 0.677285 0.73572 -0 + outer loop + vertex -103.316 -103.579 -6.5 + vertex -103.68 -103.244 0.5 + vertex -103.316 -103.579 0.5 + endloop + endfacet + facet normal 0.677285 0.73572 0 + outer loop + vertex -103.68 -103.244 0.5 + vertex -103.316 -103.579 -6.5 + vertex -103.68 -103.244 -6.5 + endloop + endfacet + facet normal 0.879474 0.475946 0 + outer loop + vertex -103.081 -104.013 0.5 + vertex -103.316 -103.579 -6.5 + vertex -103.316 -103.579 0.5 + endloop + endfacet + facet normal 0.879474 0.475946 0 + outer loop + vertex -103.316 -103.579 -6.5 + vertex -103.081 -104.013 0.5 + vertex -103.081 -104.013 -6.5 + endloop + endfacet + facet normal 0.401692 0.915775 -0 + outer loop + vertex -103.68 -103.244 -6.5 + vertex -104.132 -103.046 0.5 + vertex -103.68 -103.244 0.5 + endloop + endfacet + facet normal 0.401692 0.915775 0 + outer loop + vertex -104.132 -103.046 0.5 + vertex -103.68 -103.244 -6.5 + vertex -104.132 -103.046 -6.5 + endloop + endfacet + facet normal -0.789137 0.614218 0 + outer loop + vertex -105.819 -103.786 -6.5 + vertex -105.516 -103.396 0.5 + vertex -105.516 -103.396 -6.5 + endloop + endfacet + facet normal -0.789137 0.614218 0 + outer loop + vertex -105.516 -103.396 0.5 + vertex -105.819 -103.786 -6.5 + vertex -105.819 -103.786 0.5 + endloop + endfacet + facet normal -0.945823 0.324684 0 + outer loop + vertex -105.98 -104.253 -6.5 + vertex -105.819 -103.786 0.5 + vertex -105.819 -103.786 -6.5 + endloop + endfacet + facet normal -0.945823 0.324684 0 + outer loop + vertex -105.819 -103.786 0.5 + vertex -105.98 -104.253 -6.5 + vertex -105.98 -104.253 0.5 + endloop + endfacet + facet normal -0.245487 0.9694 0 + outer loop + vertex -104.624 -103.005 -6.5 + vertex -105.103 -103.126 0.5 + vertex -104.624 -103.005 0.5 + endloop + endfacet + facet normal -0.245487 0.9694 0 + outer loop + vertex -105.103 -103.126 0.5 + vertex -104.624 -103.005 -6.5 + vertex -105.103 -103.126 -6.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -103.081 -104.987 -6.5 + vertex -103.081 -104.013 -6.5 + vertex -103 -104.5 -6.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -103.316 -105.421 -6.5 + vertex -103.081 -104.013 -6.5 + vertex -103.081 -104.987 -6.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -103.316 -105.421 -6.5 + vertex -103.316 -103.579 -6.5 + vertex -103.081 -104.013 -6.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -103.68 -105.756 -6.5 + vertex -103.316 -103.579 -6.5 + vertex -103.316 -105.421 -6.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -103.68 -105.756 -6.5 + vertex -103.68 -103.244 -6.5 + vertex -103.316 -103.579 -6.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -104.132 -105.954 -6.5 + vertex -103.68 -103.244 -6.5 + vertex -103.68 -105.756 -6.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -104.132 -105.954 -6.5 + vertex -104.132 -103.046 -6.5 + vertex -103.68 -103.244 -6.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -104.624 -105.995 -6.5 + vertex -104.132 -103.046 -6.5 + vertex -104.132 -105.954 -6.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -104.624 -105.995 -6.5 + vertex -104.624 -103.005 -6.5 + vertex -104.132 -103.046 -6.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.103 -105.874 -6.5 + vertex -104.624 -103.005 -6.5 + vertex -104.624 -105.995 -6.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.103 -105.874 -6.5 + vertex -105.103 -103.126 -6.5 + vertex -104.624 -103.005 -6.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.516 -105.604 -6.5 + vertex -105.103 -103.126 -6.5 + vertex -105.103 -105.874 -6.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.516 -105.604 -6.5 + vertex -105.516 -103.396 -6.5 + vertex -105.103 -103.126 -6.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.819 -105.214 -6.5 + vertex -105.516 -103.396 -6.5 + vertex -105.516 -105.604 -6.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.819 -105.214 -6.5 + vertex -105.819 -103.786 -6.5 + vertex -105.516 -103.396 -6.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.98 -104.747 -6.5 + vertex -105.819 -103.786 -6.5 + vertex -105.819 -105.214 -6.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.819 -103.786 -6.5 + vertex -105.98 -104.747 -6.5 + vertex -105.98 -104.253 -6.5 + endloop + endfacet + facet normal -0.546943 0.83717 0 + outer loop + vertex -105.103 -103.126 -6.5 + vertex -105.516 -103.396 0.5 + vertex -105.103 -103.126 0.5 + endloop + endfacet + facet normal -0.546943 0.83717 0 + outer loop + vertex -105.516 -103.396 0.5 + vertex -105.103 -103.126 -6.5 + vertex -105.516 -103.396 -6.5 + endloop + endfacet + facet normal 0.98636 -0.164599 0 + outer loop + vertex -103.081 -104.987 0.5 + vertex -103 -104.5 -6.5 + vertex -103 -104.5 0.5 + endloop + endfacet + facet normal 0.98636 -0.164599 0 + outer loop + vertex -103 -104.5 -6.5 + vertex -103.081 -104.987 0.5 + vertex -103.081 -104.987 -6.5 + endloop + endfacet + facet normal 0.677285 -0.73572 0 + outer loop + vertex -103.68 -105.756 -6.5 + vertex -103.316 -105.421 0.5 + vertex -103.68 -105.756 0.5 + endloop + endfacet + facet normal 0.677285 -0.73572 0 + outer loop + vertex -103.316 -105.421 0.5 + vertex -103.68 -105.756 -6.5 + vertex -103.316 -105.421 -6.5 + endloop + endfacet + facet normal 0.879474 -0.475946 0 + outer loop + vertex -103.316 -105.421 0.5 + vertex -103.081 -104.987 -6.5 + vertex -103.081 -104.987 0.5 + endloop + endfacet + facet normal 0.879474 -0.475946 0 + outer loop + vertex -103.081 -104.987 -6.5 + vertex -103.316 -105.421 0.5 + vertex -103.316 -105.421 -6.5 + endloop + endfacet + facet normal -0.245487 -0.9694 0 + outer loop + vertex -105.103 -105.874 -6.5 + vertex -104.624 -105.995 0.5 + vertex -105.103 -105.874 0.5 + endloop + endfacet + facet normal -0.245487 -0.9694 -0 + outer loop + vertex -104.624 -105.995 0.5 + vertex -105.103 -105.874 -6.5 + vertex -104.624 -105.995 -6.5 + endloop + endfacet + facet normal -0.789137 -0.614218 0 + outer loop + vertex -105.516 -105.604 -6.5 + vertex -105.819 -105.214 0.5 + vertex -105.819 -105.214 -6.5 + endloop + endfacet + facet normal -0.789137 -0.614218 0 + outer loop + vertex -105.819 -105.214 0.5 + vertex -105.516 -105.604 -6.5 + vertex -105.516 -105.604 0.5 + endloop + endfacet + facet normal -0.945823 -0.324684 0 + outer loop + vertex -105.819 -105.214 -6.5 + vertex -105.98 -104.747 0.5 + vertex -105.98 -104.747 -6.5 + endloop + endfacet + facet normal -0.945823 -0.324684 0 + outer loop + vertex -105.98 -104.747 0.5 + vertex -105.819 -105.214 -6.5 + vertex -105.819 -105.214 0.5 + endloop + endfacet + facet normal -0.546943 -0.83717 0 + outer loop + vertex -105.516 -105.604 -6.5 + vertex -105.103 -105.874 0.5 + vertex -105.516 -105.604 0.5 + endloop + endfacet + facet normal -0.546943 -0.83717 -0 + outer loop + vertex -105.103 -105.874 0.5 + vertex -105.516 -105.604 -6.5 + vertex -105.103 -105.874 -6.5 + endloop + endfacet + facet normal -0.98636 -0.164599 0 + outer loop + vertex -103 -104.5 13.5 + vertex -103.081 -104.013 20.5 + vertex -103.081 -104.013 13.5 + endloop + endfacet + facet normal -0.98636 -0.164599 0 + outer loop + vertex -103.081 -104.013 20.5 + vertex -103 -104.5 13.5 + vertex -103 -104.5 20.5 + endloop + endfacet + facet normal 1 -0 0 + outer loop + vertex -105.98 -104.747 20.5 + vertex -105.98 -104.253 13.5 + vertex -105.98 -104.253 20.5 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex -105.98 -104.253 13.5 + vertex -105.98 -104.747 20.5 + vertex -105.98 -104.747 13.5 + endloop + endfacet + facet normal -0.0825698 -0.996585 0 + outer loop + vertex -104.624 -103.005 13.5 + vertex -104.132 -103.046 20.5 + vertex -104.624 -103.005 20.5 + endloop + endfacet + facet normal -0.0825698 -0.996585 -0 + outer loop + vertex -104.132 -103.046 20.5 + vertex -104.624 -103.005 13.5 + vertex -104.132 -103.046 13.5 + endloop + endfacet + facet normal -0.0825698 0.996585 0 + outer loop + vertex -104.132 -105.954 13.5 + vertex -104.624 -105.995 20.5 + vertex -104.132 -105.954 20.5 + endloop + endfacet + facet normal -0.0825698 0.996585 0 + outer loop + vertex -104.624 -105.995 20.5 + vertex -104.132 -105.954 13.5 + vertex -104.624 -105.995 13.5 + endloop + endfacet + facet normal -0.401692 0.915775 0 + outer loop + vertex -103.68 -105.756 13.5 + vertex -104.132 -105.954 20.5 + vertex -103.68 -105.756 20.5 + endloop + endfacet + facet normal -0.401692 0.915775 0 + outer loop + vertex -104.132 -105.954 20.5 + vertex -103.68 -105.756 13.5 + vertex -104.132 -105.954 13.5 + endloop + endfacet + facet normal -0.677285 -0.73572 0 + outer loop + vertex -103.68 -103.244 13.5 + vertex -103.316 -103.579 20.5 + vertex -103.68 -103.244 20.5 + endloop + endfacet + facet normal -0.677285 -0.73572 -0 + outer loop + vertex -103.316 -103.579 20.5 + vertex -103.68 -103.244 13.5 + vertex -103.316 -103.579 13.5 + endloop + endfacet + facet normal -0.879474 -0.475946 0 + outer loop + vertex -103.081 -104.013 13.5 + vertex -103.316 -103.579 20.5 + vertex -103.316 -103.579 13.5 + endloop + endfacet + facet normal -0.879474 -0.475946 0 + outer loop + vertex -103.316 -103.579 20.5 + vertex -103.081 -104.013 13.5 + vertex -103.081 -104.013 20.5 + endloop + endfacet + facet normal -0.401692 -0.915775 0 + outer loop + vertex -104.132 -103.046 13.5 + vertex -103.68 -103.244 20.5 + vertex -104.132 -103.046 20.5 + endloop + endfacet + facet normal -0.401692 -0.915775 -0 + outer loop + vertex -103.68 -103.244 20.5 + vertex -104.132 -103.046 13.5 + vertex -103.68 -103.244 13.5 + endloop + endfacet + facet normal 0.789137 -0.614218 0 + outer loop + vertex -105.819 -103.786 20.5 + vertex -105.516 -103.396 13.5 + vertex -105.516 -103.396 20.5 + endloop + endfacet + facet normal 0.789137 -0.614218 0 + outer loop + vertex -105.516 -103.396 13.5 + vertex -105.819 -103.786 20.5 + vertex -105.819 -103.786 13.5 + endloop + endfacet + facet normal 0.945823 -0.324684 0 + outer loop + vertex -105.98 -104.253 20.5 + vertex -105.819 -103.786 13.5 + vertex -105.819 -103.786 20.5 + endloop + endfacet + facet normal 0.945823 -0.324684 0 + outer loop + vertex -105.819 -103.786 13.5 + vertex -105.98 -104.253 20.5 + vertex -105.98 -104.253 13.5 + endloop + endfacet + facet normal 0.245487 -0.9694 0 + outer loop + vertex -105.103 -103.126 13.5 + vertex -104.624 -103.005 20.5 + vertex -105.103 -103.126 20.5 + endloop + endfacet + facet normal 0.245487 -0.9694 0 + outer loop + vertex -104.624 -103.005 20.5 + vertex -105.103 -103.126 13.5 + vertex -104.624 -103.005 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -103.081 -104.013 13.5 + vertex -103.01 -104.5 13.5 + vertex -103 -104.5 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -103.081 -104.013 13.5 + vertex -103.091 -104.016 13.5 + vertex -103.01 -104.5 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -103.316 -103.579 13.5 + vertex -103.091 -104.016 13.5 + vertex -103.081 -104.013 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -103.316 -103.579 13.5 + vertex -103.324 -103.585 13.5 + vertex -103.091 -104.016 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -103.68 -103.244 13.5 + vertex -103.324 -103.585 13.5 + vertex -103.316 -103.579 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -103.68 -103.244 13.5 + vertex -103.685 -103.253 13.5 + vertex -103.324 -103.585 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -104.132 -103.046 13.5 + vertex -103.685 -103.253 13.5 + vertex -103.68 -103.244 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -104.132 -103.046 13.5 + vertex -104.134 -103.056 13.5 + vertex -103.685 -103.253 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -104.132 -103.046 13.5 + vertex -104.623 -103.015 13.5 + vertex -104.134 -103.056 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -104.624 -103.005 13.5 + vertex -104.623 -103.015 13.5 + vertex -104.132 -103.046 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -104.624 -103.005 13.5 + vertex -105.099 -103.135 13.5 + vertex -104.623 -103.015 13.5 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -105.103 -103.126 13.5 + vertex -105.099 -103.135 13.5 + vertex -104.624 -103.005 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -105.103 -103.126 13.5 + vertex -105.509 -103.404 13.5 + vertex -105.099 -103.135 13.5 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -105.516 -103.396 13.5 + vertex -105.509 -103.404 13.5 + vertex -105.103 -103.126 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -105.516 -103.396 13.5 + vertex -105.81 -103.791 13.5 + vertex -105.509 -103.404 13.5 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -105.819 -103.786 13.5 + vertex -105.81 -103.791 13.5 + vertex -105.516 -103.396 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -105.819 -103.786 13.5 + vertex -105.97 -104.255 13.5 + vertex -105.81 -103.791 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -105.97 -104.255 13.5 + vertex -105.98 -104.253 13.5 + vertex -105.97 -104.745 13.5 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -105.98 -104.253 13.5 + vertex -105.97 -104.255 13.5 + vertex -105.819 -103.786 13.5 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -103.01 -104.5 13.5 + vertex -103.081 -104.987 13.5 + vertex -103 -104.5 13.5 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -103.091 -104.984 13.5 + vertex -103.081 -104.987 13.5 + vertex -103.01 -104.5 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -103.091 -104.984 13.5 + vertex -103.316 -105.421 13.5 + vertex -103.081 -104.987 13.5 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -103.324 -105.415 13.5 + vertex -103.316 -105.421 13.5 + vertex -103.091 -104.984 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -103.324 -105.415 13.5 + vertex -103.68 -105.756 13.5 + vertex -103.316 -105.421 13.5 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -103.685 -105.747 13.5 + vertex -103.68 -105.756 13.5 + vertex -103.324 -105.415 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -103.685 -105.747 13.5 + vertex -104.132 -105.954 13.5 + vertex -103.68 -105.756 13.5 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -104.134 -105.944 13.5 + vertex -104.132 -105.954 13.5 + vertex -103.685 -105.747 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -104.623 -105.985 13.5 + vertex -104.132 -105.954 13.5 + vertex -104.134 -105.944 13.5 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -104.623 -105.985 13.5 + vertex -104.624 -105.995 13.5 + vertex -104.132 -105.954 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -105.099 -105.865 13.5 + vertex -104.624 -105.995 13.5 + vertex -104.623 -105.985 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -105.099 -105.865 13.5 + vertex -105.103 -105.874 13.5 + vertex -104.624 -105.995 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -105.509 -105.596 13.5 + vertex -105.103 -105.874 13.5 + vertex -105.099 -105.865 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -105.509 -105.596 13.5 + vertex -105.516 -105.604 13.5 + vertex -105.103 -105.874 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -105.81 -105.209 13.5 + vertex -105.516 -105.604 13.5 + vertex -105.509 -105.596 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -105.81 -105.209 13.5 + vertex -105.819 -105.214 13.5 + vertex -105.516 -105.604 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -105.97 -104.745 13.5 + vertex -105.819 -105.214 13.5 + vertex -105.81 -105.209 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -105.97 -104.745 13.5 + vertex -105.98 -104.747 13.5 + vertex -105.819 -105.214 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -105.98 -104.747 13.5 + vertex -105.97 -104.745 13.5 + vertex -105.98 -104.253 13.5 + endloop + endfacet + facet normal 0.546943 -0.83717 0 + outer loop + vertex -105.516 -103.396 13.5 + vertex -105.103 -103.126 20.5 + vertex -105.516 -103.396 20.5 + endloop + endfacet + facet normal 0.546943 -0.83717 0 + outer loop + vertex -105.103 -103.126 20.5 + vertex -105.516 -103.396 13.5 + vertex -105.103 -103.126 13.5 + endloop + endfacet + facet normal -0.98636 0.164599 0 + outer loop + vertex -103.081 -104.987 13.5 + vertex -103 -104.5 20.5 + vertex -103 -104.5 13.5 + endloop + endfacet + facet normal -0.98636 0.164599 0 + outer loop + vertex -103 -104.5 20.5 + vertex -103.081 -104.987 13.5 + vertex -103.081 -104.987 20.5 + endloop + endfacet + facet normal 0.945823 0.324684 0 + outer loop + vertex -105.819 -105.214 20.5 + vertex -105.98 -104.747 13.5 + vertex -105.98 -104.747 20.5 + endloop + endfacet + facet normal 0.945823 0.324684 0 + outer loop + vertex -105.98 -104.747 13.5 + vertex -105.819 -105.214 20.5 + vertex -105.819 -105.214 13.5 + endloop + endfacet + facet normal -0.677285 0.73572 0 + outer loop + vertex -103.316 -105.421 13.5 + vertex -103.68 -105.756 20.5 + vertex -103.316 -105.421 20.5 + endloop + endfacet + facet normal -0.677285 0.73572 0 + outer loop + vertex -103.68 -105.756 20.5 + vertex -103.316 -105.421 13.5 + vertex -103.68 -105.756 13.5 + endloop + endfacet + facet normal -0.879474 0.475946 0 + outer loop + vertex -103.316 -105.421 13.5 + vertex -103.081 -104.987 20.5 + vertex -103.081 -104.987 13.5 + endloop + endfacet + facet normal -0.879474 0.475946 0 + outer loop + vertex -103.081 -104.987 20.5 + vertex -103.316 -105.421 13.5 + vertex -103.316 -105.421 20.5 + endloop + endfacet + facet normal 0.245487 0.9694 -0 + outer loop + vertex -104.624 -105.995 13.5 + vertex -105.103 -105.874 20.5 + vertex -104.624 -105.995 20.5 + endloop + endfacet + facet normal 0.245487 0.9694 0 + outer loop + vertex -105.103 -105.874 20.5 + vertex -104.624 -105.995 13.5 + vertex -105.103 -105.874 13.5 + endloop + endfacet + facet normal 0.789137 0.614218 0 + outer loop + vertex -105.516 -105.604 20.5 + vertex -105.819 -105.214 13.5 + vertex -105.819 -105.214 20.5 + endloop + endfacet + facet normal 0.789137 0.614218 0 + outer loop + vertex -105.819 -105.214 13.5 + vertex -105.516 -105.604 20.5 + vertex -105.516 -105.604 13.5 + endloop + endfacet + facet normal 0.546943 0.83717 -0 + outer loop + vertex -105.103 -105.874 13.5 + vertex -105.516 -105.604 20.5 + vertex -105.103 -105.874 20.5 + endloop + endfacet + facet normal 0.546943 0.83717 0 + outer loop + vertex -105.516 -105.604 20.5 + vertex -105.103 -105.874 13.5 + vertex -105.516 -105.604 13.5 + endloop + endfacet + facet normal 0.995974 0.0896469 0 + outer loop + vertex -101.75 -104.5 25.08 + vertex -101.794 -104.009 22.1 + vertex -101.794 -104.009 25.08 + endloop + endfacet + facet normal 0.995974 0.0896469 0 + outer loop + vertex -101.794 -104.009 22.1 + vertex -101.75 -104.5 25.08 + vertex -101.75 -104.5 22.1 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -107.239 -104.747 22.1 + vertex -107.239 -104.253 25.08 + vertex -107.239 -104.253 22.1 + endloop + endfacet + facet normal -1 -0 0 + outer loop + vertex -107.239 -104.253 25.08 + vertex -107.239 -104.747 22.1 + vertex -107.239 -104.747 25.08 + endloop + endfacet + facet normal 0.0448622 0.998993 -0 + outer loop + vertex -104.131 -101.775 22.1 + vertex -104.623 -101.753 25.08 + vertex -104.131 -101.775 25.08 + endloop + endfacet + facet normal 0.0448622 0.998993 0 + outer loop + vertex -104.623 -101.753 25.08 + vertex -104.131 -101.775 22.1 + vertex -104.623 -101.753 22.1 + endloop + endfacet + facet normal 0.0448622 -0.998993 0 + outer loop + vertex -104.623 -107.247 22.1 + vertex -104.131 -107.225 25.08 + vertex -104.623 -107.247 25.08 + endloop + endfacet + facet normal 0.0448622 -0.998993 0 + outer loop + vertex -104.131 -107.225 25.08 + vertex -104.623 -107.247 22.1 + vertex -104.131 -107.225 22.1 + endloop + endfacet + facet normal 0.809016 -0.587786 0 + outer loop + vertex -102.429 -106.309 25.08 + vertex -102.139 -105.91 22.1 + vertex -102.139 -105.91 25.08 + endloop + endfacet + facet normal 0.809016 -0.587786 0 + outer loop + vertex -102.139 -105.91 22.1 + vertex -102.429 -106.309 25.08 + vertex -102.429 -106.309 22.1 + endloop + endfacet + facet normal 0.691067 0.722791 -0 + outer loop + vertex -102.429 -102.691 22.1 + vertex -102.785 -102.35 25.08 + vertex -102.429 -102.691 25.08 + endloop + endfacet + facet normal 0.691067 0.722791 0 + outer loop + vertex -102.785 -102.35 25.08 + vertex -102.429 -102.691 22.1 + vertex -102.785 -102.35 22.1 + endloop + endfacet + facet normal -0.753075 0.657935 0 + outer loop + vertex -106.725 -102.884 22.1 + vertex -106.4 -102.512 25.08 + vertex -106.4 -102.512 22.1 + endloop + endfacet + facet normal -0.753075 0.657935 0 + outer loop + vertex -106.4 -102.512 25.08 + vertex -106.725 -102.884 22.1 + vertex -106.725 -102.884 25.08 + endloop + endfacet + facet normal -0.47387 0.880595 0 + outer loop + vertex -105.581 -101.971 22.1 + vertex -106.015 -102.205 25.08 + vertex -105.581 -101.971 25.08 + endloop + endfacet + facet normal -0.47387 0.880595 0 + outer loop + vertex -106.015 -102.205 25.08 + vertex -105.581 -101.971 22.1 + vertex -106.015 -102.205 22.1 + endloop + endfacet + facet normal 0.963965 -0.26603 0 + outer loop + vertex -101.925 -105.466 25.08 + vertex -101.794 -104.991 22.1 + vertex -101.794 -104.991 25.08 + endloop + endfacet + facet normal 0.963965 -0.26603 0 + outer loop + vertex -101.794 -104.991 22.1 + vertex -101.925 -105.466 25.08 + vertex -101.925 -105.466 22.1 + endloop + endfacet + facet normal 0.90097 0.433881 0 + outer loop + vertex -101.925 -103.534 25.08 + vertex -102.139 -103.09 22.1 + vertex -102.139 -103.09 25.08 + endloop + endfacet + facet normal 0.90097 0.433881 0 + outer loop + vertex -102.139 -103.09 22.1 + vertex -101.925 -103.534 25.08 + vertex -101.925 -103.534 22.1 + endloop + endfacet + facet normal 0.963965 0.26603 0 + outer loop + vertex -101.794 -104.009 25.08 + vertex -101.925 -103.534 22.1 + vertex -101.925 -103.534 25.08 + endloop + endfacet + facet normal 0.963965 0.26603 0 + outer loop + vertex -101.925 -103.534 22.1 + vertex -101.794 -104.009 25.08 + vertex -101.794 -104.009 22.1 + endloop + endfacet + facet normal 0.809016 0.587786 0 + outer loop + vertex -102.139 -103.09 25.08 + vertex -102.429 -102.691 22.1 + vertex -102.429 -102.691 25.08 + endloop + endfacet + facet normal 0.809016 0.587786 0 + outer loop + vertex -102.429 -102.691 22.1 + vertex -102.139 -103.09 25.08 + vertex -102.139 -103.09 22.1 + endloop + endfacet + facet normal 0.393015 0.919532 -0 + outer loop + vertex -103.197 -102.078 22.1 + vertex -103.65 -101.885 25.08 + vertex -103.197 -102.078 25.08 + endloop + endfacet + facet normal 0.393015 0.919532 0 + outer loop + vertex -103.65 -101.885 25.08 + vertex -103.197 -102.078 22.1 + vertex -103.65 -101.885 22.1 + endloop + endfacet + facet normal 0.222531 0.974926 -0 + outer loop + vertex -103.65 -101.885 22.1 + vertex -104.131 -101.775 25.08 + vertex -103.65 -101.885 25.08 + endloop + endfacet + facet normal 0.222531 0.974926 0 + outer loop + vertex -104.131 -101.775 25.08 + vertex -103.65 -101.885 22.1 + vertex -104.131 -101.775 22.1 + endloop + endfacet + facet normal 0.550891 0.834577 -0 + outer loop + vertex -102.785 -102.35 22.1 + vertex -103.197 -102.078 25.08 + vertex -102.785 -102.35 25.08 + endloop + endfacet + facet normal 0.550891 0.834577 0 + outer loop + vertex -103.197 -102.078 25.08 + vertex -102.785 -102.35 22.1 + vertex -103.197 -102.078 22.1 + endloop + endfacet + facet normal -0.936235 0.351374 0 + outer loop + vertex -107.151 -103.768 22.1 + vertex -106.978 -103.307 25.08 + vertex -106.978 -103.307 22.1 + endloop + endfacet + facet normal -0.936235 0.351374 0 + outer loop + vertex -106.978 -103.307 25.08 + vertex -107.151 -103.768 22.1 + vertex -107.151 -103.768 25.08 + endloop + endfacet + facet normal -0.85845 0.512897 0 + outer loop + vertex -106.978 -103.307 22.1 + vertex -106.725 -102.884 25.08 + vertex -106.725 -102.884 22.1 + endloop + endfacet + facet normal -0.85845 0.512897 0 + outer loop + vertex -106.725 -102.884 25.08 + vertex -106.978 -103.307 22.1 + vertex -106.978 -103.307 25.08 + endloop + endfacet + facet normal -0.983928 0.178565 0 + outer loop + vertex -107.239 -104.253 22.1 + vertex -107.151 -103.768 25.08 + vertex -107.151 -103.768 22.1 + endloop + endfacet + facet normal -0.983928 0.178565 0 + outer loop + vertex -107.151 -103.768 25.08 + vertex -107.239 -104.253 22.1 + vertex -107.239 -104.253 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -103.057 -104.5 25.08 + vertex -101.75 -104.5 25.08 + vertex -101.794 -104.009 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -103.057 -104.5 25.08 + vertex -101.794 -104.009 25.08 + vertex -101.925 -103.534 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -101.75 -104.5 25.08 + vertex -103.057 -104.5 25.08 + vertex -101.794 -104.991 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -103.057 -104.5 25.08 + vertex -101.925 -103.534 25.08 + vertex -102.139 -103.09 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -101.794 -104.991 25.08 + vertex -103.057 -104.5 25.08 + vertex -101.925 -105.466 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -103.778 -103.25 25.08 + vertex -102.139 -103.09 25.08 + vertex -102.429 -102.691 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -101.925 -105.466 25.08 + vertex -103.057 -104.5 25.08 + vertex -102.139 -105.91 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -103.778 -103.25 25.08 + vertex -102.429 -102.691 25.08 + vertex -102.785 -102.35 25.08 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -103.778 -105.75 25.08 + vertex -102.139 -105.91 25.08 + vertex -103.057 -104.5 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -102.139 -105.91 25.08 + vertex -103.778 -105.75 25.08 + vertex -102.429 -106.309 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -103.778 -103.25 25.08 + vertex -102.785 -102.35 25.08 + vertex -103.197 -102.078 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -103.778 -103.25 25.08 + vertex -103.197 -102.078 25.08 + vertex -103.65 -101.885 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -102.139 -103.09 25.08 + vertex -103.778 -103.25 25.08 + vertex -103.057 -104.5 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -104.131 -101.775 25.08 + vertex -103.778 -103.25 25.08 + vertex -103.65 -101.885 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -104.623 -101.753 25.08 + vertex -103.778 -103.25 25.08 + vertex -104.131 -101.775 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -105.222 -103.25 25.08 + vertex -104.623 -101.753 25.08 + vertex -105.112 -101.819 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -104.623 -101.753 25.08 + vertex -105.222 -103.25 25.08 + vertex -103.778 -103.25 25.08 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -105.581 -101.971 25.08 + vertex -105.222 -103.25 25.08 + vertex -105.112 -101.819 25.08 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -106.015 -102.205 25.08 + vertex -105.222 -103.25 25.08 + vertex -105.581 -101.971 25.08 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -106.4 -102.512 25.08 + vertex -105.222 -103.25 25.08 + vertex -106.015 -102.205 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -102.429 -106.309 25.08 + vertex -103.778 -105.75 25.08 + vertex -102.785 -106.65 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -102.785 -106.65 25.08 + vertex -103.778 -105.75 25.08 + vertex -103.197 -106.922 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -103.197 -106.922 25.08 + vertex -103.778 -105.75 25.08 + vertex -103.65 -107.115 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -103.778 -105.75 25.08 + vertex -104.131 -107.225 25.08 + vertex -103.65 -107.115 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -103.778 -105.75 25.08 + vertex -104.623 -107.247 25.08 + vertex -104.131 -107.225 25.08 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -105.222 -105.75 25.08 + vertex -104.623 -107.247 25.08 + vertex -103.778 -105.75 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -104.623 -107.247 25.08 + vertex -105.222 -105.75 25.08 + vertex -105.112 -107.181 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -105.222 -105.75 25.08 + vertex -105.581 -107.029 25.08 + vertex -105.112 -107.181 25.08 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -106.978 -105.693 25.08 + vertex -105.222 -105.75 25.08 + vertex -105.943 -104.5 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -105.222 -105.75 25.08 + vertex -106.015 -106.795 25.08 + vertex -105.581 -107.029 25.08 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -106.725 -102.884 25.08 + vertex -105.222 -103.25 25.08 + vertex -106.4 -102.512 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -106.978 -103.307 25.08 + vertex -105.222 -103.25 25.08 + vertex -106.725 -102.884 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -105.222 -105.75 25.08 + vertex -106.4 -106.488 25.08 + vertex -106.015 -106.795 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -105.222 -103.25 25.08 + vertex -106.978 -103.307 25.08 + vertex -105.943 -104.5 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -105.222 -105.75 25.08 + vertex -106.725 -106.116 25.08 + vertex -106.4 -106.488 25.08 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -107.151 -103.768 25.08 + vertex -105.943 -104.5 25.08 + vertex -106.978 -103.307 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -105.222 -105.75 25.08 + vertex -106.978 -105.693 25.08 + vertex -106.725 -106.116 25.08 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -107.239 -104.253 25.08 + vertex -105.943 -104.5 25.08 + vertex -107.151 -103.768 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -105.943 -104.5 25.08 + vertex -107.151 -105.232 25.08 + vertex -106.978 -105.693 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -107.239 -104.747 25.08 + vertex -105.943 -104.5 25.08 + vertex -107.239 -104.253 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -105.943 -104.5 25.08 + vertex -107.239 -104.747 25.08 + vertex -107.151 -105.232 25.08 + endloop + endfacet + facet normal -0.62349 0.781831 0 + outer loop + vertex -106.015 -102.205 22.1 + vertex -106.4 -102.512 25.08 + vertex -106.015 -102.205 25.08 + endloop + endfacet + facet normal -0.62349 0.781831 0 + outer loop + vertex -106.4 -102.512 25.08 + vertex -106.015 -102.205 22.1 + vertex -106.4 -102.512 22.1 + endloop + endfacet + facet normal -0.134229 0.99095 0 + outer loop + vertex -104.623 -101.753 22.1 + vertex -105.112 -101.819 25.08 + vertex -104.623 -101.753 25.08 + endloop + endfacet + facet normal -0.134229 0.99095 0 + outer loop + vertex -105.112 -101.819 25.08 + vertex -104.623 -101.753 22.1 + vertex -105.112 -101.819 22.1 + endloop + endfacet + facet normal 0.995974 -0.0896469 0 + outer loop + vertex -101.794 -104.991 25.08 + vertex -101.75 -104.5 22.1 + vertex -101.75 -104.5 25.08 + endloop + endfacet + facet normal 0.995974 -0.0896469 0 + outer loop + vertex -101.75 -104.5 22.1 + vertex -101.794 -104.991 25.08 + vertex -101.794 -104.991 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -103.01 -104.5 22.1 + vertex -101.75 -104.5 22.1 + vertex -101.794 -104.991 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -103.091 -104.984 22.1 + vertex -101.794 -104.991 22.1 + vertex -101.925 -105.466 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -101.75 -104.5 22.1 + vertex -103.01 -104.5 22.1 + vertex -101.794 -104.009 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -103.091 -104.984 22.1 + vertex -101.925 -105.466 22.1 + vertex -102.139 -105.91 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -103.091 -104.016 22.1 + vertex -101.794 -104.009 22.1 + vertex -103.01 -104.5 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -103.324 -105.415 22.1 + vertex -102.139 -105.91 22.1 + vertex -102.429 -106.309 22.1 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex -101.794 -104.009 22.1 + vertex -103.091 -104.016 22.1 + vertex -101.925 -103.534 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -103.324 -105.415 22.1 + vertex -102.429 -106.309 22.1 + vertex -102.785 -106.65 22.1 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex -101.925 -103.534 22.1 + vertex -103.091 -104.016 22.1 + vertex -102.139 -103.09 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -103.324 -103.585 22.1 + vertex -102.139 -103.09 22.1 + vertex -103.091 -104.016 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -101.794 -104.991 22.1 + vertex -103.091 -104.984 22.1 + vertex -103.01 -104.5 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -103.685 -105.747 22.1 + vertex -102.785 -106.65 22.1 + vertex -103.197 -106.922 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -102.139 -105.91 22.1 + vertex -103.324 -105.415 22.1 + vertex -103.091 -104.984 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -104.134 -105.944 22.1 + vertex -103.197 -106.922 22.1 + vertex -103.65 -107.115 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -102.785 -106.65 22.1 + vertex -103.685 -105.747 22.1 + vertex -103.324 -105.415 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -104.134 -105.944 22.1 + vertex -103.65 -107.115 22.1 + vertex -104.131 -107.225 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -103.197 -106.922 22.1 + vertex -104.134 -105.944 22.1 + vertex -103.685 -105.747 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -104.131 -107.225 22.1 + vertex -104.623 -105.985 22.1 + vertex -104.134 -105.944 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -104.623 -107.247 22.1 + vertex -104.623 -105.985 22.1 + vertex -104.131 -107.225 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.112 -107.181 22.1 + vertex -104.623 -105.985 22.1 + vertex -104.623 -107.247 22.1 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex -104.623 -105.985 22.1 + vertex -105.112 -107.181 22.1 + vertex -105.099 -105.865 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.581 -107.029 22.1 + vertex -105.099 -105.865 22.1 + vertex -105.112 -107.181 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -106.015 -106.795 22.1 + vertex -105.099 -105.865 22.1 + vertex -105.581 -107.029 22.1 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex -105.099 -105.865 22.1 + vertex -106.015 -106.795 22.1 + vertex -105.509 -105.596 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -106.4 -106.488 22.1 + vertex -105.509 -105.596 22.1 + vertex -106.015 -106.795 22.1 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex -105.509 -105.596 22.1 + vertex -106.725 -106.116 22.1 + vertex -105.81 -105.209 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -106.725 -106.116 22.1 + vertex -105.509 -105.596 22.1 + vertex -106.4 -106.488 22.1 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex -102.139 -103.09 22.1 + vertex -103.324 -103.585 22.1 + vertex -102.429 -102.691 22.1 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex -102.429 -102.691 22.1 + vertex -103.324 -103.585 22.1 + vertex -102.785 -102.35 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -103.685 -103.253 22.1 + vertex -102.785 -102.35 22.1 + vertex -103.324 -103.585 22.1 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex -102.785 -102.35 22.1 + vertex -103.685 -103.253 22.1 + vertex -103.197 -102.078 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -104.134 -103.056 22.1 + vertex -103.197 -102.078 22.1 + vertex -103.685 -103.253 22.1 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex -103.197 -102.078 22.1 + vertex -104.134 -103.056 22.1 + vertex -103.65 -101.885 22.1 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex -103.65 -101.885 22.1 + vertex -104.134 -103.056 22.1 + vertex -104.131 -101.775 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -104.623 -103.015 22.1 + vertex -104.131 -101.775 22.1 + vertex -104.134 -103.056 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -104.623 -103.015 22.1 + vertex -104.623 -101.753 22.1 + vertex -104.131 -101.775 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.112 -101.819 22.1 + vertex -104.623 -103.015 22.1 + vertex -105.099 -103.135 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -104.623 -103.015 22.1 + vertex -105.112 -101.819 22.1 + vertex -104.623 -101.753 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -106.015 -102.205 22.1 + vertex -105.099 -103.135 22.1 + vertex -105.509 -103.404 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.099 -103.135 22.1 + vertex -105.581 -101.971 22.1 + vertex -105.112 -101.819 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -106.725 -102.884 22.1 + vertex -105.509 -103.404 22.1 + vertex -105.81 -103.791 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -107.151 -103.768 22.1 + vertex -105.81 -103.791 22.1 + vertex -105.97 -104.255 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.099 -103.135 22.1 + vertex -106.015 -102.205 22.1 + vertex -105.581 -101.971 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -106.978 -105.693 22.1 + vertex -105.81 -105.209 22.1 + vertex -106.725 -106.116 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -107.151 -105.232 22.1 + vertex -105.81 -105.209 22.1 + vertex -106.978 -105.693 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.509 -103.404 22.1 + vertex -106.4 -102.512 22.1 + vertex -106.015 -102.205 22.1 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex -105.81 -105.209 22.1 + vertex -107.151 -105.232 22.1 + vertex -105.97 -104.745 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.509 -103.404 22.1 + vertex -106.725 -102.884 22.1 + vertex -106.4 -102.512 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -107.239 -104.747 22.1 + vertex -105.97 -104.745 22.1 + vertex -107.151 -105.232 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.81 -103.791 22.1 + vertex -106.978 -103.307 22.1 + vertex -106.725 -102.884 22.1 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex -105.97 -104.745 22.1 + vertex -107.239 -104.747 22.1 + vertex -105.97 -104.255 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.81 -103.791 22.1 + vertex -107.151 -103.768 22.1 + vertex -106.978 -103.307 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -107.239 -104.253 22.1 + vertex -105.97 -104.255 22.1 + vertex -107.239 -104.747 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.97 -104.255 22.1 + vertex -107.239 -104.253 22.1 + vertex -107.151 -103.768 22.1 + endloop + endfacet + facet normal 0.222531 -0.974926 0 + outer loop + vertex -104.131 -107.225 22.1 + vertex -103.65 -107.115 25.08 + vertex -104.131 -107.225 25.08 + endloop + endfacet + facet normal 0.222531 -0.974926 0 + outer loop + vertex -103.65 -107.115 25.08 + vertex -104.131 -107.225 22.1 + vertex -103.65 -107.115 22.1 + endloop + endfacet + facet normal -0.309018 0.951056 0 + outer loop + vertex -105.112 -101.819 22.1 + vertex -105.581 -101.971 25.08 + vertex -105.112 -101.819 25.08 + endloop + endfacet + facet normal -0.309018 0.951056 0 + outer loop + vertex -105.581 -101.971 25.08 + vertex -105.112 -101.819 22.1 + vertex -105.581 -101.971 22.1 + endloop + endfacet + facet normal 0.90097 -0.433881 0 + outer loop + vertex -102.139 -105.91 25.08 + vertex -101.925 -105.466 22.1 + vertex -101.925 -105.466 25.08 + endloop + endfacet + facet normal 0.90097 -0.433881 0 + outer loop + vertex -101.925 -105.466 22.1 + vertex -102.139 -105.91 25.08 + vertex -102.139 -105.91 22.1 + endloop + endfacet + facet normal -0.85845 -0.512897 0 + outer loop + vertex -106.725 -106.116 22.1 + vertex -106.978 -105.693 25.08 + vertex -106.978 -105.693 22.1 + endloop + endfacet + facet normal -0.85845 -0.512897 0 + outer loop + vertex -106.978 -105.693 25.08 + vertex -106.725 -106.116 22.1 + vertex -106.725 -106.116 25.08 + endloop + endfacet + facet normal -0.983928 -0.178565 0 + outer loop + vertex -107.151 -105.232 22.1 + vertex -107.239 -104.747 25.08 + vertex -107.239 -104.747 22.1 + endloop + endfacet + facet normal -0.983928 -0.178565 0 + outer loop + vertex -107.239 -104.747 25.08 + vertex -107.151 -105.232 22.1 + vertex -107.151 -105.232 25.08 + endloop + endfacet + facet normal 0.550891 -0.834577 0 + outer loop + vertex -103.197 -106.922 22.1 + vertex -102.785 -106.65 25.08 + vertex -103.197 -106.922 25.08 + endloop + endfacet + facet normal 0.550891 -0.834577 0 + outer loop + vertex -102.785 -106.65 25.08 + vertex -103.197 -106.922 22.1 + vertex -102.785 -106.65 22.1 + endloop + endfacet + facet normal 0.393015 -0.919532 0 + outer loop + vertex -103.65 -107.115 22.1 + vertex -103.197 -106.922 25.08 + vertex -103.65 -107.115 25.08 + endloop + endfacet + facet normal 0.393015 -0.919532 0 + outer loop + vertex -103.197 -106.922 25.08 + vertex -103.65 -107.115 22.1 + vertex -103.197 -106.922 22.1 + endloop + endfacet + facet normal -0.47387 -0.880595 0 + outer loop + vertex -106.015 -106.795 22.1 + vertex -105.581 -107.029 25.08 + vertex -106.015 -106.795 25.08 + endloop + endfacet + facet normal -0.47387 -0.880595 -0 + outer loop + vertex -105.581 -107.029 25.08 + vertex -106.015 -106.795 22.1 + vertex -105.581 -107.029 22.1 + endloop + endfacet + facet normal -0.309018 -0.951056 0 + outer loop + vertex -105.581 -107.029 22.1 + vertex -105.112 -107.181 25.08 + vertex -105.581 -107.029 25.08 + endloop + endfacet + facet normal -0.309018 -0.951056 -0 + outer loop + vertex -105.112 -107.181 25.08 + vertex -105.581 -107.029 22.1 + vertex -105.112 -107.181 22.1 + endloop + endfacet + facet normal -0.134229 -0.99095 0 + outer loop + vertex -105.112 -107.181 22.1 + vertex -104.623 -107.247 25.08 + vertex -105.112 -107.181 25.08 + endloop + endfacet + facet normal -0.134229 -0.99095 -0 + outer loop + vertex -104.623 -107.247 25.08 + vertex -105.112 -107.181 22.1 + vertex -104.623 -107.247 22.1 + endloop + endfacet + facet normal -0.936235 -0.351374 0 + outer loop + vertex -106.978 -105.693 22.1 + vertex -107.151 -105.232 25.08 + vertex -107.151 -105.232 22.1 + endloop + endfacet + facet normal -0.936235 -0.351374 0 + outer loop + vertex -107.151 -105.232 25.08 + vertex -106.978 -105.693 22.1 + vertex -106.978 -105.693 25.08 + endloop + endfacet + facet normal 0.691067 -0.722791 0 + outer loop + vertex -102.785 -106.65 22.1 + vertex -102.429 -106.309 25.08 + vertex -102.785 -106.65 25.08 + endloop + endfacet + facet normal 0.691067 -0.722791 0 + outer loop + vertex -102.429 -106.309 25.08 + vertex -102.785 -106.65 22.1 + vertex -102.429 -106.309 22.1 + endloop + endfacet + facet normal -0.753075 -0.657935 0 + outer loop + vertex -106.4 -106.488 22.1 + vertex -106.725 -106.116 25.08 + vertex -106.725 -106.116 22.1 + endloop + endfacet + facet normal -0.753075 -0.657935 0 + outer loop + vertex -106.725 -106.116 25.08 + vertex -106.4 -106.488 22.1 + vertex -106.4 -106.488 25.08 + endloop + endfacet + facet normal -0.62349 -0.781831 0 + outer loop + vertex -106.4 -106.488 22.1 + vertex -106.015 -106.795 25.08 + vertex -106.4 -106.488 25.08 + endloop + endfacet + facet normal -0.62349 -0.781831 -0 + outer loop + vertex -106.015 -106.795 25.08 + vertex -106.4 -106.488 22.1 + vertex -106.015 -106.795 22.1 + endloop + endfacet + facet normal 0.986363 0.164583 0 + outer loop + vertex -103.01 -104.5 20.5 + vertex -103.091 -104.016 13.5 + vertex -103.091 -104.016 20.5 + endloop + endfacet + facet normal 0.986363 0.164583 0 + outer loop + vertex -103.091 -104.016 13.5 + vertex -103.01 -104.5 20.5 + vertex -103.01 -104.5 13.5 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -105.97 -104.745 13.5 + vertex -105.97 -104.255 20.5 + vertex -105.97 -104.255 13.5 + endloop + endfacet + facet normal -1 -0 0 + outer loop + vertex -105.97 -104.255 20.5 + vertex -105.97 -104.745 13.5 + vertex -105.97 -104.745 20.5 + endloop + endfacet + facet normal -0.245484 0.969401 0 + outer loop + vertex -104.623 -103.015 13.5 + vertex -105.099 -103.135 20.5 + vertex -104.623 -103.015 20.5 + endloop + endfacet + facet normal -0.245484 0.969401 0 + outer loop + vertex -105.099 -103.135 20.5 + vertex -104.623 -103.015 13.5 + vertex -105.099 -103.135 13.5 + endloop + endfacet + facet normal 0.0825782 -0.996585 0 + outer loop + vertex -104.623 -105.985 13.5 + vertex -104.134 -105.944 20.5 + vertex -104.623 -105.985 20.5 + endloop + endfacet + facet normal 0.0825782 -0.996585 0 + outer loop + vertex -104.134 -105.944 20.5 + vertex -104.623 -105.985 13.5 + vertex -104.134 -105.944 13.5 + endloop + endfacet + facet normal 0.401702 0.915771 -0 + outer loop + vertex -103.685 -103.253 13.5 + vertex -104.134 -103.056 20.5 + vertex -103.685 -103.253 20.5 + endloop + endfacet + facet normal 0.401702 0.915771 0 + outer loop + vertex -104.134 -103.056 20.5 + vertex -103.685 -103.253 13.5 + vertex -104.134 -103.056 13.5 + endloop + endfacet + facet normal 0.0825782 0.996585 -0 + outer loop + vertex -104.134 -103.056 13.5 + vertex -104.623 -103.015 20.5 + vertex -104.134 -103.056 20.5 + endloop + endfacet + facet normal 0.0825782 0.996585 0 + outer loop + vertex -104.623 -103.015 20.5 + vertex -104.134 -103.056 13.5 + vertex -104.623 -103.015 13.5 + endloop + endfacet + facet normal -0.789139 0.614214 0 + outer loop + vertex -105.81 -103.791 13.5 + vertex -105.509 -103.404 20.5 + vertex -105.509 -103.404 13.5 + endloop + endfacet + facet normal -0.789139 0.614214 0 + outer loop + vertex -105.509 -103.404 20.5 + vertex -105.81 -103.791 13.5 + vertex -105.81 -103.791 20.5 + endloop + endfacet + facet normal -0.945816 0.324703 0 + outer loop + vertex -105.97 -104.255 13.5 + vertex -105.81 -103.791 20.5 + vertex -105.81 -103.791 13.5 + endloop + endfacet + facet normal -0.945816 0.324703 0 + outer loop + vertex -105.81 -103.791 20.5 + vertex -105.97 -104.255 13.5 + vertex -105.97 -104.255 20.5 + endloop + endfacet + facet normal -0.546948 0.837167 0 + outer loop + vertex -105.099 -103.135 13.5 + vertex -105.509 -103.404 20.5 + vertex -105.099 -103.135 20.5 + endloop + endfacet + facet normal -0.546948 0.837167 0 + outer loop + vertex -105.509 -103.404 20.5 + vertex -105.099 -103.135 13.5 + vertex -105.509 -103.404 13.5 + endloop + endfacet + facet normal -0.245484 -0.969401 0 + outer loop + vertex -105.099 -105.865 13.5 + vertex -104.623 -105.985 20.5 + vertex -105.099 -105.865 20.5 + endloop + endfacet + facet normal -0.245484 -0.969401 -0 + outer loop + vertex -104.623 -105.985 20.5 + vertex -105.099 -105.865 13.5 + vertex -104.623 -105.985 13.5 + endloop + endfacet + facet normal 0.677276 0.735729 -0 + outer loop + vertex -103.324 -103.585 13.5 + vertex -103.685 -103.253 20.5 + vertex -103.324 -103.585 20.5 + endloop + endfacet + facet normal 0.677276 0.735729 0 + outer loop + vertex -103.685 -103.253 20.5 + vertex -103.324 -103.585 13.5 + vertex -103.685 -103.253 13.5 + endloop + endfacet + facet normal 0.87947 0.475954 0 + outer loop + vertex -103.091 -104.016 20.5 + vertex -103.324 -103.585 13.5 + vertex -103.324 -103.585 20.5 + endloop + endfacet + facet normal 0.87947 0.475954 0 + outer loop + vertex -103.324 -103.585 13.5 + vertex -103.091 -104.016 20.5 + vertex -103.091 -104.016 13.5 + endloop + endfacet + facet normal 0.401702 -0.915771 0 + outer loop + vertex -104.134 -105.944 13.5 + vertex -103.685 -105.747 20.5 + vertex -104.134 -105.944 20.5 + endloop + endfacet + facet normal 0.401702 -0.915771 0 + outer loop + vertex -103.685 -105.747 20.5 + vertex -104.134 -105.944 13.5 + vertex -103.685 -105.747 13.5 + endloop + endfacet + facet normal 0.986363 -0.164583 0 + outer loop + vertex -103.091 -104.984 20.5 + vertex -103.01 -104.5 13.5 + vertex -103.01 -104.5 20.5 + endloop + endfacet + facet normal 0.986363 -0.164583 0 + outer loop + vertex -103.01 -104.5 13.5 + vertex -103.091 -104.984 20.5 + vertex -103.091 -104.984 13.5 + endloop + endfacet + facet normal -0.546948 -0.837167 0 + outer loop + vertex -105.509 -105.596 13.5 + vertex -105.099 -105.865 20.5 + vertex -105.509 -105.596 20.5 + endloop + endfacet + facet normal -0.546948 -0.837167 -0 + outer loop + vertex -105.099 -105.865 20.5 + vertex -105.509 -105.596 13.5 + vertex -105.099 -105.865 13.5 + endloop + endfacet + facet normal -0.945816 -0.324703 0 + outer loop + vertex -105.81 -105.209 13.5 + vertex -105.97 -104.745 20.5 + vertex -105.97 -104.745 13.5 + endloop + endfacet + facet normal -0.945816 -0.324703 0 + outer loop + vertex -105.97 -104.745 20.5 + vertex -105.81 -105.209 13.5 + vertex -105.81 -105.209 20.5 + endloop + endfacet + facet normal 0.677276 -0.735729 0 + outer loop + vertex -103.685 -105.747 13.5 + vertex -103.324 -105.415 20.5 + vertex -103.685 -105.747 20.5 + endloop + endfacet + facet normal 0.677276 -0.735729 0 + outer loop + vertex -103.324 -105.415 20.5 + vertex -103.685 -105.747 13.5 + vertex -103.324 -105.415 13.5 + endloop + endfacet + facet normal -0.789139 -0.614214 0 + outer loop + vertex -105.509 -105.596 13.5 + vertex -105.81 -105.209 20.5 + vertex -105.81 -105.209 13.5 + endloop + endfacet + facet normal -0.789139 -0.614214 0 + outer loop + vertex -105.81 -105.209 20.5 + vertex -105.509 -105.596 13.5 + vertex -105.509 -105.596 20.5 + endloop + endfacet + facet normal 0.87947 -0.475954 0 + outer loop + vertex -103.324 -105.415 20.5 + vertex -103.091 -104.984 13.5 + vertex -103.091 -104.984 20.5 + endloop + endfacet + facet normal 0.87947 -0.475954 0 + outer loop + vertex -103.091 -104.984 13.5 + vertex -103.324 -105.415 20.5 + vertex -103.324 -105.415 13.5 + endloop + endfacet + facet normal -0.866026 -0.5 0 + outer loop + vertex -103.057 -104.5 24.0867 + vertex -103.778 -103.25 25.08 + vertex -103.778 -103.25 24.0867 + endloop + endfacet + facet normal -0.866026 -0.5 0 + outer loop + vertex -103.778 -103.25 25.08 + vertex -103.057 -104.5 24.0867 + vertex -103.057 -104.5 25.08 + endloop + endfacet + facet normal 0.866026 -0.5 0 + outer loop + vertex -105.943 -104.5 25.08 + vertex -105.222 -103.25 24.0867 + vertex -105.222 -103.25 25.08 + endloop + endfacet + facet normal 0.866026 -0.5 0 + outer loop + vertex -105.222 -103.25 24.0867 + vertex -105.943 -104.5 25.08 + vertex -105.943 -104.5 24.0867 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -105.222 -103.25 24.0867 + vertex -103.778 -103.25 25.08 + vertex -105.222 -103.25 25.08 + endloop + endfacet + facet normal 0 -1 -0 + outer loop + vertex -103.778 -103.25 25.08 + vertex -105.222 -103.25 24.0867 + vertex -103.778 -103.25 24.0867 + endloop + endfacet + facet normal -0.866026 0.5 0 + outer loop + vertex -103.778 -105.75 24.0867 + vertex -103.057 -104.5 25.08 + vertex -103.057 -104.5 24.0867 + endloop + endfacet + facet normal -0.866026 0.5 0 + outer loop + vertex -103.057 -104.5 25.08 + vertex -103.778 -105.75 24.0867 + vertex -103.778 -105.75 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -103.778 -103.25 24.0867 + vertex -103.778 -105.75 24.0867 + vertex -103.057 -104.5 24.0867 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -105.222 -103.25 24.0867 + vertex -103.778 -105.75 24.0867 + vertex -103.778 -103.25 24.0867 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -105.222 -103.25 24.0867 + vertex -105.222 -105.75 24.0867 + vertex -103.778 -105.75 24.0867 + endloop + endfacet + facet normal 0 -0 1 + outer loop + vertex -105.222 -105.75 24.0867 + vertex -105.222 -103.25 24.0867 + vertex -105.943 -104.5 24.0867 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex -103.778 -105.75 24.0867 + vertex -105.222 -105.75 25.08 + vertex -103.778 -105.75 25.08 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -105.222 -105.75 25.08 + vertex -103.778 -105.75 24.0867 + vertex -105.222 -105.75 24.0867 + endloop + endfacet + facet normal 0.866026 0.5 0 + outer loop + vertex -105.222 -105.75 25.08 + vertex -105.943 -104.5 24.0867 + vertex -105.943 -104.5 25.08 + endloop + endfacet + facet normal 0.866026 0.5 0 + outer loop + vertex -105.943 -104.5 24.0867 + vertex -105.222 -105.75 25.08 + vertex -105.222 -105.75 24.0867 + endloop + endfacet + facet normal 0.866025 0.5 0 + outer loop + vertex -101.75 104.5 20.5 + vertex -103.125 106.882 0.5 + vertex -103.125 106.882 20.5 + endloop + endfacet + facet normal 0.866025 0.5 0 + outer loop + vertex -103.125 106.882 0.5 + vertex -101.75 104.5 20.5 + vertex -101.75 104.5 0.5 + endloop + endfacet + facet normal -0.866025 0.5 0 + outer loop + vertex -105.875 106.882 0.5 + vertex -107 104.933 20.5 + vertex -105.875 106.882 20.5 + endloop + endfacet + facet normal -0.866025 0.5 -3.46791e-008 + outer loop + vertex -107.25 104.5 0.5 + vertex -107 104.933 20.5 + vertex -105.875 106.882 0.5 + endloop + endfacet + facet normal -0.866026 0.499999 0 + outer loop + vertex -107 104.933 20.5 + vertex -107.25 104.5 0.5 + vertex -107.25 104.5 20.5 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex -103.125 106.882 0.5 + vertex -105.875 106.882 20.5 + vertex -103.125 106.882 20.5 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -105.875 106.882 20.5 + vertex -103.125 106.882 0.5 + vertex -105.875 106.882 0.5 + endloop + endfacet + facet normal 0.866025 -0.5 0 + outer loop + vertex -103.125 102.118 20.5 + vertex -101.75 104.5 0.5 + vertex -101.75 104.5 20.5 + endloop + endfacet + facet normal 0.866025 -0.5 0 + outer loop + vertex -101.75 104.5 0.5 + vertex -103.125 102.118 20.5 + vertex -103.125 102.118 0.5 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex -101.75 104.5 0.5 + vertex -103.081 104.013 0.5 + vertex -103 104.5 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -103.316 103.579 0.5 + vertex -101.75 104.5 0.5 + vertex -103.125 102.118 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -101.75 104.5 0.5 + vertex -103.316 103.579 0.5 + vertex -103.081 104.013 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -103.125 102.118 0.5 + vertex -103.68 103.244 0.5 + vertex -103.316 103.579 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -103.125 102.118 0.5 + vertex -104.132 103.046 0.5 + vertex -103.68 103.244 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -103.125 102.118 0.5 + vertex -104.624 103.005 0.5 + vertex -104.132 103.046 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.875 102.118 0.5 + vertex -104.624 103.005 0.5 + vertex -103.125 102.118 0.5 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex -104.624 103.005 0.5 + vertex -105.875 102.118 0.5 + vertex -105.103 103.126 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.875 102.118 0.5 + vertex -105.516 103.396 0.5 + vertex -105.103 103.126 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.875 102.118 0.5 + vertex -105.819 103.786 0.5 + vertex -105.516 103.396 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -107.25 104.5 0.5 + vertex -105.819 103.786 0.5 + vertex -105.875 102.118 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.98 104.253 0.5 + vertex -107.25 104.5 0.5 + vertex -105.98 104.747 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.819 103.786 0.5 + vertex -107.25 104.5 0.5 + vertex -105.98 104.253 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -103.081 104.987 0.5 + vertex -101.75 104.5 0.5 + vertex -103 104.5 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -103.316 105.421 0.5 + vertex -101.75 104.5 0.5 + vertex -103.081 104.987 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -101.75 104.5 0.5 + vertex -103.316 105.421 0.5 + vertex -103.125 106.882 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -103.68 105.756 0.5 + vertex -103.125 106.882 0.5 + vertex -103.316 105.421 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -104.132 105.954 0.5 + vertex -103.125 106.882 0.5 + vertex -103.68 105.756 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -104.624 105.995 0.5 + vertex -103.125 106.882 0.5 + vertex -104.132 105.954 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.875 106.882 0.5 + vertex -104.624 105.995 0.5 + vertex -105.103 105.874 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -104.624 105.995 0.5 + vertex -105.875 106.882 0.5 + vertex -103.125 106.882 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.516 105.604 0.5 + vertex -105.875 106.882 0.5 + vertex -105.103 105.874 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.819 105.214 0.5 + vertex -105.875 106.882 0.5 + vertex -105.516 105.604 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -107.25 104.5 0.5 + vertex -105.819 105.214 0.5 + vertex -105.98 104.747 0.5 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex -105.819 105.214 0.5 + vertex -107.25 104.5 0.5 + vertex -105.875 106.882 0.5 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -105.875 102.118 0.5 + vertex -103.125 102.118 20.5 + vertex -105.875 102.118 20.5 + endloop + endfacet + facet normal 0 -1 -0 + outer loop + vertex -103.125 102.118 20.5 + vertex -105.875 102.118 0.5 + vertex -103.125 102.118 0.5 + endloop + endfacet + facet normal -0.866026 -0.499999 0 + outer loop + vertex -107.25 104.5 0.5 + vertex -107 104.067 20.5 + vertex -107.25 104.5 20.5 + endloop + endfacet + facet normal -0.866025 -0.5 -3.46791e-008 + outer loop + vertex -105.875 102.118 0.5 + vertex -107 104.067 20.5 + vertex -107.25 104.5 0.5 + endloop + endfacet + facet normal -0.866025 -0.5 0 + outer loop + vertex -107 104.067 20.5 + vertex -105.875 102.118 0.5 + vertex -105.875 102.118 20.5 + endloop + endfacet + facet normal 0.98636 0.164599 0 + outer loop + vertex -103 104.5 0.5 + vertex -103.081 104.987 -6.5 + vertex -103.081 104.987 0.5 + endloop + endfacet + facet normal 0.98636 0.164599 0 + outer loop + vertex -103.081 104.987 -6.5 + vertex -103 104.5 0.5 + vertex -103 104.5 -6.5 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -105.98 104.253 -6.5 + vertex -105.98 104.747 0.5 + vertex -105.98 104.747 -6.5 + endloop + endfacet + facet normal -1 -0 0 + outer loop + vertex -105.98 104.747 0.5 + vertex -105.98 104.253 -6.5 + vertex -105.98 104.253 0.5 + endloop + endfacet + facet normal 0.0825698 0.996585 -0 + outer loop + vertex -104.132 105.954 -6.5 + vertex -104.624 105.995 0.5 + vertex -104.132 105.954 0.5 + endloop + endfacet + facet normal 0.0825698 0.996585 0 + outer loop + vertex -104.624 105.995 0.5 + vertex -104.132 105.954 -6.5 + vertex -104.624 105.995 -6.5 + endloop + endfacet + facet normal 0.0825698 -0.996585 0 + outer loop + vertex -104.624 103.005 -6.5 + vertex -104.132 103.046 0.5 + vertex -104.624 103.005 0.5 + endloop + endfacet + facet normal 0.0825698 -0.996585 0 + outer loop + vertex -104.132 103.046 0.5 + vertex -104.624 103.005 -6.5 + vertex -104.132 103.046 -6.5 + endloop + endfacet + facet normal 0.401692 -0.915775 0 + outer loop + vertex -104.132 103.046 -6.5 + vertex -103.68 103.244 0.5 + vertex -104.132 103.046 0.5 + endloop + endfacet + facet normal 0.401692 -0.915775 0 + outer loop + vertex -103.68 103.244 0.5 + vertex -104.132 103.046 -6.5 + vertex -103.68 103.244 -6.5 + endloop + endfacet + facet normal 0.677285 0.73572 -0 + outer loop + vertex -103.316 105.421 -6.5 + vertex -103.68 105.756 0.5 + vertex -103.316 105.421 0.5 + endloop + endfacet + facet normal 0.677285 0.73572 0 + outer loop + vertex -103.68 105.756 0.5 + vertex -103.316 105.421 -6.5 + vertex -103.68 105.756 -6.5 + endloop + endfacet + facet normal 0.879474 0.475946 0 + outer loop + vertex -103.081 104.987 0.5 + vertex -103.316 105.421 -6.5 + vertex -103.316 105.421 0.5 + endloop + endfacet + facet normal 0.879474 0.475946 0 + outer loop + vertex -103.316 105.421 -6.5 + vertex -103.081 104.987 0.5 + vertex -103.081 104.987 -6.5 + endloop + endfacet + facet normal 0.401692 0.915775 -0 + outer loop + vertex -103.68 105.756 -6.5 + vertex -104.132 105.954 0.5 + vertex -103.68 105.756 0.5 + endloop + endfacet + facet normal 0.401692 0.915775 0 + outer loop + vertex -104.132 105.954 0.5 + vertex -103.68 105.756 -6.5 + vertex -104.132 105.954 -6.5 + endloop + endfacet + facet normal -0.789137 0.614218 0 + outer loop + vertex -105.819 105.214 -6.5 + vertex -105.516 105.604 0.5 + vertex -105.516 105.604 -6.5 + endloop + endfacet + facet normal -0.789137 0.614218 0 + outer loop + vertex -105.516 105.604 0.5 + vertex -105.819 105.214 -6.5 + vertex -105.819 105.214 0.5 + endloop + endfacet + facet normal -0.945823 0.324684 0 + outer loop + vertex -105.98 104.747 -6.5 + vertex -105.819 105.214 0.5 + vertex -105.819 105.214 -6.5 + endloop + endfacet + facet normal -0.945823 0.324684 0 + outer loop + vertex -105.819 105.214 0.5 + vertex -105.98 104.747 -6.5 + vertex -105.98 104.747 0.5 + endloop + endfacet + facet normal -0.245487 0.9694 0 + outer loop + vertex -104.624 105.995 -6.5 + vertex -105.103 105.874 0.5 + vertex -104.624 105.995 0.5 + endloop + endfacet + facet normal -0.245487 0.9694 0 + outer loop + vertex -105.103 105.874 0.5 + vertex -104.624 105.995 -6.5 + vertex -105.103 105.874 -6.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -103.081 104.013 -6.5 + vertex -103.081 104.987 -6.5 + vertex -103 104.5 -6.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -103.316 103.579 -6.5 + vertex -103.081 104.987 -6.5 + vertex -103.081 104.013 -6.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -103.316 103.579 -6.5 + vertex -103.316 105.421 -6.5 + vertex -103.081 104.987 -6.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -103.68 103.244 -6.5 + vertex -103.316 105.421 -6.5 + vertex -103.316 103.579 -6.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -103.68 103.244 -6.5 + vertex -103.68 105.756 -6.5 + vertex -103.316 105.421 -6.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -104.132 103.046 -6.5 + vertex -103.68 105.756 -6.5 + vertex -103.68 103.244 -6.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -104.132 103.046 -6.5 + vertex -104.132 105.954 -6.5 + vertex -103.68 105.756 -6.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -104.624 103.005 -6.5 + vertex -104.132 105.954 -6.5 + vertex -104.132 103.046 -6.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -104.624 103.005 -6.5 + vertex -104.624 105.995 -6.5 + vertex -104.132 105.954 -6.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.103 103.126 -6.5 + vertex -104.624 105.995 -6.5 + vertex -104.624 103.005 -6.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.103 103.126 -6.5 + vertex -105.103 105.874 -6.5 + vertex -104.624 105.995 -6.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.516 103.396 -6.5 + vertex -105.103 105.874 -6.5 + vertex -105.103 103.126 -6.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.516 103.396 -6.5 + vertex -105.516 105.604 -6.5 + vertex -105.103 105.874 -6.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.819 103.786 -6.5 + vertex -105.516 105.604 -6.5 + vertex -105.516 103.396 -6.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.819 103.786 -6.5 + vertex -105.819 105.214 -6.5 + vertex -105.516 105.604 -6.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.98 104.253 -6.5 + vertex -105.819 105.214 -6.5 + vertex -105.819 103.786 -6.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.819 105.214 -6.5 + vertex -105.98 104.253 -6.5 + vertex -105.98 104.747 -6.5 + endloop + endfacet + facet normal -0.546943 0.83717 0 + outer loop + vertex -105.103 105.874 -6.5 + vertex -105.516 105.604 0.5 + vertex -105.103 105.874 0.5 + endloop + endfacet + facet normal -0.546943 0.83717 0 + outer loop + vertex -105.516 105.604 0.5 + vertex -105.103 105.874 -6.5 + vertex -105.516 105.604 -6.5 + endloop + endfacet + facet normal 0.98636 -0.164599 0 + outer loop + vertex -103.081 104.013 0.5 + vertex -103 104.5 -6.5 + vertex -103 104.5 0.5 + endloop + endfacet + facet normal 0.98636 -0.164599 0 + outer loop + vertex -103 104.5 -6.5 + vertex -103.081 104.013 0.5 + vertex -103.081 104.013 -6.5 + endloop + endfacet + facet normal 0.677285 -0.73572 0 + outer loop + vertex -103.68 103.244 -6.5 + vertex -103.316 103.579 0.5 + vertex -103.68 103.244 0.5 + endloop + endfacet + facet normal 0.677285 -0.73572 0 + outer loop + vertex -103.316 103.579 0.5 + vertex -103.68 103.244 -6.5 + vertex -103.316 103.579 -6.5 + endloop + endfacet + facet normal 0.879474 -0.475946 0 + outer loop + vertex -103.316 103.579 0.5 + vertex -103.081 104.013 -6.5 + vertex -103.081 104.013 0.5 + endloop + endfacet + facet normal 0.879474 -0.475946 0 + outer loop + vertex -103.081 104.013 -6.5 + vertex -103.316 103.579 0.5 + vertex -103.316 103.579 -6.5 + endloop + endfacet + facet normal -0.245487 -0.9694 0 + outer loop + vertex -105.103 103.126 -6.5 + vertex -104.624 103.005 0.5 + vertex -105.103 103.126 0.5 + endloop + endfacet + facet normal -0.245487 -0.9694 -0 + outer loop + vertex -104.624 103.005 0.5 + vertex -105.103 103.126 -6.5 + vertex -104.624 103.005 -6.5 + endloop + endfacet + facet normal -0.789137 -0.614218 0 + outer loop + vertex -105.516 103.396 -6.5 + vertex -105.819 103.786 0.5 + vertex -105.819 103.786 -6.5 + endloop + endfacet + facet normal -0.789137 -0.614218 0 + outer loop + vertex -105.819 103.786 0.5 + vertex -105.516 103.396 -6.5 + vertex -105.516 103.396 0.5 + endloop + endfacet + facet normal -0.945823 -0.324684 0 + outer loop + vertex -105.819 103.786 -6.5 + vertex -105.98 104.253 0.5 + vertex -105.98 104.253 -6.5 + endloop + endfacet + facet normal -0.945823 -0.324684 0 + outer loop + vertex -105.98 104.253 0.5 + vertex -105.819 103.786 -6.5 + vertex -105.819 103.786 0.5 + endloop + endfacet + facet normal -0.546943 -0.83717 0 + outer loop + vertex -105.516 103.396 -6.5 + vertex -105.103 103.126 0.5 + vertex -105.516 103.396 0.5 + endloop + endfacet + facet normal -0.546943 -0.83717 -0 + outer loop + vertex -105.103 103.126 0.5 + vertex -105.516 103.396 -6.5 + vertex -105.103 103.126 -6.5 + endloop + endfacet + facet normal -0.98636 -0.164599 0 + outer loop + vertex -103 104.5 13.5 + vertex -103.081 104.987 20.5 + vertex -103.081 104.987 13.5 + endloop + endfacet + facet normal -0.98636 -0.164599 0 + outer loop + vertex -103.081 104.987 20.5 + vertex -103 104.5 13.5 + vertex -103 104.5 20.5 + endloop + endfacet + facet normal 1 -0 0 + outer loop + vertex -105.98 104.253 20.5 + vertex -105.98 104.747 13.5 + vertex -105.98 104.747 20.5 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex -105.98 104.747 13.5 + vertex -105.98 104.253 20.5 + vertex -105.98 104.253 13.5 + endloop + endfacet + facet normal -0.0825698 -0.996585 0 + outer loop + vertex -104.624 105.995 13.5 + vertex -104.132 105.954 20.5 + vertex -104.624 105.995 20.5 + endloop + endfacet + facet normal -0.0825698 -0.996585 -0 + outer loop + vertex -104.132 105.954 20.5 + vertex -104.624 105.995 13.5 + vertex -104.132 105.954 13.5 + endloop + endfacet + facet normal -0.0825698 0.996585 0 + outer loop + vertex -104.132 103.046 13.5 + vertex -104.624 103.005 20.5 + vertex -104.132 103.046 20.5 + endloop + endfacet + facet normal -0.0825698 0.996585 0 + outer loop + vertex -104.624 103.005 20.5 + vertex -104.132 103.046 13.5 + vertex -104.624 103.005 13.5 + endloop + endfacet + facet normal -0.401692 0.915775 0 + outer loop + vertex -103.68 103.244 13.5 + vertex -104.132 103.046 20.5 + vertex -103.68 103.244 20.5 + endloop + endfacet + facet normal -0.401692 0.915775 0 + outer loop + vertex -104.132 103.046 20.5 + vertex -103.68 103.244 13.5 + vertex -104.132 103.046 13.5 + endloop + endfacet + facet normal -0.677285 -0.73572 0 + outer loop + vertex -103.68 105.756 13.5 + vertex -103.316 105.421 20.5 + vertex -103.68 105.756 20.5 + endloop + endfacet + facet normal -0.677285 -0.73572 -0 + outer loop + vertex -103.316 105.421 20.5 + vertex -103.68 105.756 13.5 + vertex -103.316 105.421 13.5 + endloop + endfacet + facet normal -0.879474 -0.475946 0 + outer loop + vertex -103.081 104.987 13.5 + vertex -103.316 105.421 20.5 + vertex -103.316 105.421 13.5 + endloop + endfacet + facet normal -0.879474 -0.475946 0 + outer loop + vertex -103.316 105.421 20.5 + vertex -103.081 104.987 13.5 + vertex -103.081 104.987 20.5 + endloop + endfacet + facet normal -0.401692 -0.915775 0 + outer loop + vertex -104.132 105.954 13.5 + vertex -103.68 105.756 20.5 + vertex -104.132 105.954 20.5 + endloop + endfacet + facet normal -0.401692 -0.915775 -0 + outer loop + vertex -103.68 105.756 20.5 + vertex -104.132 105.954 13.5 + vertex -103.68 105.756 13.5 + endloop + endfacet + facet normal 0.789137 -0.614218 0 + outer loop + vertex -105.819 105.214 20.5 + vertex -105.516 105.604 13.5 + vertex -105.516 105.604 20.5 + endloop + endfacet + facet normal 0.789137 -0.614218 0 + outer loop + vertex -105.516 105.604 13.5 + vertex -105.819 105.214 20.5 + vertex -105.819 105.214 13.5 + endloop + endfacet + facet normal 0.945823 -0.324684 0 + outer loop + vertex -105.98 104.747 20.5 + vertex -105.819 105.214 13.5 + vertex -105.819 105.214 20.5 + endloop + endfacet + facet normal 0.945823 -0.324684 0 + outer loop + vertex -105.819 105.214 13.5 + vertex -105.98 104.747 20.5 + vertex -105.98 104.747 13.5 + endloop + endfacet + facet normal 0.245487 -0.9694 0 + outer loop + vertex -105.103 105.874 13.5 + vertex -104.624 105.995 20.5 + vertex -105.103 105.874 20.5 + endloop + endfacet + facet normal 0.245487 -0.9694 0 + outer loop + vertex -104.624 105.995 20.5 + vertex -105.103 105.874 13.5 + vertex -104.624 105.995 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -103.081 104.987 13.5 + vertex -103.01 104.5 13.5 + vertex -103 104.5 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -103.081 104.987 13.5 + vertex -103.091 104.984 13.5 + vertex -103.01 104.5 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -103.316 105.421 13.5 + vertex -103.091 104.984 13.5 + vertex -103.081 104.987 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -103.316 105.421 13.5 + vertex -103.324 105.415 13.5 + vertex -103.091 104.984 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -103.68 105.756 13.5 + vertex -103.324 105.415 13.5 + vertex -103.316 105.421 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -103.68 105.756 13.5 + vertex -103.685 105.747 13.5 + vertex -103.324 105.415 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -104.132 105.954 13.5 + vertex -103.685 105.747 13.5 + vertex -103.68 105.756 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -104.132 105.954 13.5 + vertex -104.134 105.944 13.5 + vertex -103.685 105.747 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -104.132 105.954 13.5 + vertex -104.623 105.985 13.5 + vertex -104.134 105.944 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -104.624 105.995 13.5 + vertex -104.623 105.985 13.5 + vertex -104.132 105.954 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -104.624 105.995 13.5 + vertex -105.099 105.865 13.5 + vertex -104.623 105.985 13.5 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -105.103 105.874 13.5 + vertex -105.099 105.865 13.5 + vertex -104.624 105.995 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -105.103 105.874 13.5 + vertex -105.509 105.596 13.5 + vertex -105.099 105.865 13.5 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -105.516 105.604 13.5 + vertex -105.509 105.596 13.5 + vertex -105.103 105.874 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -105.516 105.604 13.5 + vertex -105.81 105.209 13.5 + vertex -105.509 105.596 13.5 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -105.819 105.214 13.5 + vertex -105.81 105.209 13.5 + vertex -105.516 105.604 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -105.819 105.214 13.5 + vertex -105.97 104.745 13.5 + vertex -105.81 105.209 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -105.97 104.745 13.5 + vertex -105.98 104.747 13.5 + vertex -105.97 104.255 13.5 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -105.98 104.747 13.5 + vertex -105.97 104.745 13.5 + vertex -105.819 105.214 13.5 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -103.01 104.5 13.5 + vertex -103.081 104.013 13.5 + vertex -103 104.5 13.5 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -103.091 104.016 13.5 + vertex -103.081 104.013 13.5 + vertex -103.01 104.5 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -103.091 104.016 13.5 + vertex -103.316 103.579 13.5 + vertex -103.081 104.013 13.5 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -103.324 103.585 13.5 + vertex -103.316 103.579 13.5 + vertex -103.091 104.016 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -103.324 103.585 13.5 + vertex -103.68 103.244 13.5 + vertex -103.316 103.579 13.5 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -103.685 103.253 13.5 + vertex -103.68 103.244 13.5 + vertex -103.324 103.585 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -103.685 103.253 13.5 + vertex -104.132 103.046 13.5 + vertex -103.68 103.244 13.5 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -104.134 103.056 13.5 + vertex -104.132 103.046 13.5 + vertex -103.685 103.253 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -104.623 103.015 13.5 + vertex -104.132 103.046 13.5 + vertex -104.134 103.056 13.5 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -104.623 103.015 13.5 + vertex -104.624 103.005 13.5 + vertex -104.132 103.046 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -105.099 103.135 13.5 + vertex -104.624 103.005 13.5 + vertex -104.623 103.015 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -105.099 103.135 13.5 + vertex -105.103 103.126 13.5 + vertex -104.624 103.005 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -105.509 103.404 13.5 + vertex -105.103 103.126 13.5 + vertex -105.099 103.135 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -105.509 103.404 13.5 + vertex -105.516 103.396 13.5 + vertex -105.103 103.126 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -105.81 103.791 13.5 + vertex -105.516 103.396 13.5 + vertex -105.509 103.404 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -105.81 103.791 13.5 + vertex -105.819 103.786 13.5 + vertex -105.516 103.396 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -105.97 104.255 13.5 + vertex -105.819 103.786 13.5 + vertex -105.81 103.791 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -105.97 104.255 13.5 + vertex -105.98 104.253 13.5 + vertex -105.819 103.786 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -105.98 104.253 13.5 + vertex -105.97 104.255 13.5 + vertex -105.98 104.747 13.5 + endloop + endfacet + facet normal 0.546943 -0.83717 0 + outer loop + vertex -105.516 105.604 13.5 + vertex -105.103 105.874 20.5 + vertex -105.516 105.604 20.5 + endloop + endfacet + facet normal 0.546943 -0.83717 0 + outer loop + vertex -105.103 105.874 20.5 + vertex -105.516 105.604 13.5 + vertex -105.103 105.874 13.5 + endloop + endfacet + facet normal -0.98636 0.164599 0 + outer loop + vertex -103.081 104.013 13.5 + vertex -103 104.5 20.5 + vertex -103 104.5 13.5 + endloop + endfacet + facet normal -0.98636 0.164599 0 + outer loop + vertex -103 104.5 20.5 + vertex -103.081 104.013 13.5 + vertex -103.081 104.013 20.5 + endloop + endfacet + facet normal 0.945823 0.324684 0 + outer loop + vertex -105.819 103.786 20.5 + vertex -105.98 104.253 13.5 + vertex -105.98 104.253 20.5 + endloop + endfacet + facet normal 0.945823 0.324684 0 + outer loop + vertex -105.98 104.253 13.5 + vertex -105.819 103.786 20.5 + vertex -105.819 103.786 13.5 + endloop + endfacet + facet normal -0.677285 0.73572 0 + outer loop + vertex -103.316 103.579 13.5 + vertex -103.68 103.244 20.5 + vertex -103.316 103.579 20.5 + endloop + endfacet + facet normal -0.677285 0.73572 0 + outer loop + vertex -103.68 103.244 20.5 + vertex -103.316 103.579 13.5 + vertex -103.68 103.244 13.5 + endloop + endfacet + facet normal -0.879474 0.475946 0 + outer loop + vertex -103.316 103.579 13.5 + vertex -103.081 104.013 20.5 + vertex -103.081 104.013 13.5 + endloop + endfacet + facet normal -0.879474 0.475946 0 + outer loop + vertex -103.081 104.013 20.5 + vertex -103.316 103.579 13.5 + vertex -103.316 103.579 20.5 + endloop + endfacet + facet normal 0.245487 0.9694 -0 + outer loop + vertex -104.624 103.005 13.5 + vertex -105.103 103.126 20.5 + vertex -104.624 103.005 20.5 + endloop + endfacet + facet normal 0.245487 0.9694 0 + outer loop + vertex -105.103 103.126 20.5 + vertex -104.624 103.005 13.5 + vertex -105.103 103.126 13.5 + endloop + endfacet + facet normal 0.789137 0.614218 0 + outer loop + vertex -105.516 103.396 20.5 + vertex -105.819 103.786 13.5 + vertex -105.819 103.786 20.5 + endloop + endfacet + facet normal 0.789137 0.614218 0 + outer loop + vertex -105.819 103.786 13.5 + vertex -105.516 103.396 20.5 + vertex -105.516 103.396 13.5 + endloop + endfacet + facet normal 0.546943 0.83717 -0 + outer loop + vertex -105.103 103.126 13.5 + vertex -105.516 103.396 20.5 + vertex -105.103 103.126 20.5 + endloop + endfacet + facet normal 0.546943 0.83717 0 + outer loop + vertex -105.516 103.396 20.5 + vertex -105.103 103.126 13.5 + vertex -105.516 103.396 13.5 + endloop + endfacet + facet normal 0.995974 0.0896469 0 + outer loop + vertex -101.75 104.5 25.08 + vertex -101.794 104.991 22.1 + vertex -101.794 104.991 25.08 + endloop + endfacet + facet normal 0.995974 0.0896469 0 + outer loop + vertex -101.794 104.991 22.1 + vertex -101.75 104.5 25.08 + vertex -101.75 104.5 22.1 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -107.239 104.253 22.1 + vertex -107.239 104.747 25.08 + vertex -107.239 104.747 22.1 + endloop + endfacet + facet normal -1 -0 0 + outer loop + vertex -107.239 104.747 25.08 + vertex -107.239 104.253 22.1 + vertex -107.239 104.253 25.08 + endloop + endfacet + facet normal 0.0448622 0.998993 -0 + outer loop + vertex -104.131 107.225 22.1 + vertex -104.623 107.247 25.08 + vertex -104.131 107.225 25.08 + endloop + endfacet + facet normal 0.0448622 0.998993 0 + outer loop + vertex -104.623 107.247 25.08 + vertex -104.131 107.225 22.1 + vertex -104.623 107.247 22.1 + endloop + endfacet + facet normal 0.0448622 -0.998993 0 + outer loop + vertex -104.623 101.753 22.1 + vertex -104.131 101.775 25.08 + vertex -104.623 101.753 25.08 + endloop + endfacet + facet normal 0.0448622 -0.998993 0 + outer loop + vertex -104.131 101.775 25.08 + vertex -104.623 101.753 22.1 + vertex -104.131 101.775 22.1 + endloop + endfacet + facet normal 0.809016 -0.587786 0 + outer loop + vertex -102.429 102.691 25.08 + vertex -102.139 103.09 22.1 + vertex -102.139 103.09 25.08 + endloop + endfacet + facet normal 0.809016 -0.587786 0 + outer loop + vertex -102.139 103.09 22.1 + vertex -102.429 102.691 25.08 + vertex -102.429 102.691 22.1 + endloop + endfacet + facet normal 0.691067 0.722791 -0 + outer loop + vertex -102.429 106.309 22.1 + vertex -102.785 106.65 25.08 + vertex -102.429 106.309 25.08 + endloop + endfacet + facet normal 0.691067 0.722791 0 + outer loop + vertex -102.785 106.65 25.08 + vertex -102.429 106.309 22.1 + vertex -102.785 106.65 22.1 + endloop + endfacet + facet normal -0.753075 0.657935 0 + outer loop + vertex -106.725 106.116 22.1 + vertex -106.4 106.488 25.08 + vertex -106.4 106.488 22.1 + endloop + endfacet + facet normal -0.753075 0.657935 0 + outer loop + vertex -106.4 106.488 25.08 + vertex -106.725 106.116 22.1 + vertex -106.725 106.116 25.08 + endloop + endfacet + facet normal -0.47387 0.880595 0 + outer loop + vertex -105.581 107.029 22.1 + vertex -106.015 106.795 25.08 + vertex -105.581 107.029 25.08 + endloop + endfacet + facet normal -0.47387 0.880595 0 + outer loop + vertex -106.015 106.795 25.08 + vertex -105.581 107.029 22.1 + vertex -106.015 106.795 22.1 + endloop + endfacet + facet normal 0.963965 -0.26603 0 + outer loop + vertex -101.925 103.534 25.08 + vertex -101.794 104.009 22.1 + vertex -101.794 104.009 25.08 + endloop + endfacet + facet normal 0.963965 -0.26603 0 + outer loop + vertex -101.794 104.009 22.1 + vertex -101.925 103.534 25.08 + vertex -101.925 103.534 22.1 + endloop + endfacet + facet normal 0.90097 0.433881 0 + outer loop + vertex -101.925 105.466 25.08 + vertex -102.139 105.91 22.1 + vertex -102.139 105.91 25.08 + endloop + endfacet + facet normal 0.90097 0.433881 0 + outer loop + vertex -102.139 105.91 22.1 + vertex -101.925 105.466 25.08 + vertex -101.925 105.466 22.1 + endloop + endfacet + facet normal 0.963965 0.26603 0 + outer loop + vertex -101.794 104.991 25.08 + vertex -101.925 105.466 22.1 + vertex -101.925 105.466 25.08 + endloop + endfacet + facet normal 0.963965 0.26603 0 + outer loop + vertex -101.925 105.466 22.1 + vertex -101.794 104.991 25.08 + vertex -101.794 104.991 22.1 + endloop + endfacet + facet normal 0.809016 0.587786 0 + outer loop + vertex -102.139 105.91 25.08 + vertex -102.429 106.309 22.1 + vertex -102.429 106.309 25.08 + endloop + endfacet + facet normal 0.809016 0.587786 0 + outer loop + vertex -102.429 106.309 22.1 + vertex -102.139 105.91 25.08 + vertex -102.139 105.91 22.1 + endloop + endfacet + facet normal 0.393015 0.919532 -0 + outer loop + vertex -103.197 106.922 22.1 + vertex -103.65 107.115 25.08 + vertex -103.197 106.922 25.08 + endloop + endfacet + facet normal 0.393015 0.919532 0 + outer loop + vertex -103.65 107.115 25.08 + vertex -103.197 106.922 22.1 + vertex -103.65 107.115 22.1 + endloop + endfacet + facet normal 0.222531 0.974926 -0 + outer loop + vertex -103.65 107.115 22.1 + vertex -104.131 107.225 25.08 + vertex -103.65 107.115 25.08 + endloop + endfacet + facet normal 0.222531 0.974926 0 + outer loop + vertex -104.131 107.225 25.08 + vertex -103.65 107.115 22.1 + vertex -104.131 107.225 22.1 + endloop + endfacet + facet normal 0.550891 0.834577 -0 + outer loop + vertex -102.785 106.65 22.1 + vertex -103.197 106.922 25.08 + vertex -102.785 106.65 25.08 + endloop + endfacet + facet normal 0.550891 0.834577 0 + outer loop + vertex -103.197 106.922 25.08 + vertex -102.785 106.65 22.1 + vertex -103.197 106.922 22.1 + endloop + endfacet + facet normal -0.936235 0.351374 0 + outer loop + vertex -107.151 105.232 22.1 + vertex -106.978 105.693 25.08 + vertex -106.978 105.693 22.1 + endloop + endfacet + facet normal -0.936235 0.351374 0 + outer loop + vertex -106.978 105.693 25.08 + vertex -107.151 105.232 22.1 + vertex -107.151 105.232 25.08 + endloop + endfacet + facet normal -0.85845 0.512897 0 + outer loop + vertex -106.978 105.693 22.1 + vertex -106.725 106.116 25.08 + vertex -106.725 106.116 22.1 + endloop + endfacet + facet normal -0.85845 0.512897 0 + outer loop + vertex -106.725 106.116 25.08 + vertex -106.978 105.693 22.1 + vertex -106.978 105.693 25.08 + endloop + endfacet + facet normal -0.983928 0.178565 0 + outer loop + vertex -107.239 104.747 22.1 + vertex -107.151 105.232 25.08 + vertex -107.151 105.232 22.1 + endloop + endfacet + facet normal -0.983928 0.178565 0 + outer loop + vertex -107.151 105.232 25.08 + vertex -107.239 104.747 22.1 + vertex -107.239 104.747 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -103.057 104.5 25.08 + vertex -101.75 104.5 25.08 + vertex -101.794 104.991 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -103.057 104.5 25.08 + vertex -101.794 104.991 25.08 + vertex -101.925 105.466 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -101.75 104.5 25.08 + vertex -103.057 104.5 25.08 + vertex -101.794 104.009 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -103.057 104.5 25.08 + vertex -101.925 105.466 25.08 + vertex -102.139 105.91 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -101.794 104.009 25.08 + vertex -103.057 104.5 25.08 + vertex -101.925 103.534 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -103.778 105.75 25.08 + vertex -102.139 105.91 25.08 + vertex -102.429 106.309 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -101.925 103.534 25.08 + vertex -103.057 104.5 25.08 + vertex -102.139 103.09 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -103.778 105.75 25.08 + vertex -102.429 106.309 25.08 + vertex -102.785 106.65 25.08 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -103.778 103.25 25.08 + vertex -102.139 103.09 25.08 + vertex -103.057 104.5 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -102.139 103.09 25.08 + vertex -103.778 103.25 25.08 + vertex -102.429 102.691 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -103.778 105.75 25.08 + vertex -102.785 106.65 25.08 + vertex -103.197 106.922 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -103.778 105.75 25.08 + vertex -103.197 106.922 25.08 + vertex -103.65 107.115 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -102.139 105.91 25.08 + vertex -103.778 105.75 25.08 + vertex -103.057 104.5 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -104.131 107.225 25.08 + vertex -103.778 105.75 25.08 + vertex -103.65 107.115 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -104.623 107.247 25.08 + vertex -103.778 105.75 25.08 + vertex -104.131 107.225 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -105.222 105.75 25.08 + vertex -104.623 107.247 25.08 + vertex -105.112 107.181 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -104.623 107.247 25.08 + vertex -105.222 105.75 25.08 + vertex -103.778 105.75 25.08 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -105.581 107.029 25.08 + vertex -105.222 105.75 25.08 + vertex -105.112 107.181 25.08 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -106.015 106.795 25.08 + vertex -105.222 105.75 25.08 + vertex -105.581 107.029 25.08 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -106.4 106.488 25.08 + vertex -105.222 105.75 25.08 + vertex -106.015 106.795 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -102.429 102.691 25.08 + vertex -103.778 103.25 25.08 + vertex -102.785 102.35 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -102.785 102.35 25.08 + vertex -103.778 103.25 25.08 + vertex -103.197 102.078 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -103.197 102.078 25.08 + vertex -103.778 103.25 25.08 + vertex -103.65 101.885 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -103.778 103.25 25.08 + vertex -104.131 101.775 25.08 + vertex -103.65 101.885 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -103.778 103.25 25.08 + vertex -104.623 101.753 25.08 + vertex -104.131 101.775 25.08 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -105.222 103.25 25.08 + vertex -104.623 101.753 25.08 + vertex -103.778 103.25 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -104.623 101.753 25.08 + vertex -105.222 103.25 25.08 + vertex -105.112 101.819 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -105.222 103.25 25.08 + vertex -105.581 101.971 25.08 + vertex -105.112 101.819 25.08 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -106.978 103.307 25.08 + vertex -105.222 103.25 25.08 + vertex -105.943 104.5 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -105.222 103.25 25.08 + vertex -106.015 102.205 25.08 + vertex -105.581 101.971 25.08 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -106.725 106.116 25.08 + vertex -105.222 105.75 25.08 + vertex -106.4 106.488 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -106.978 105.693 25.08 + vertex -105.222 105.75 25.08 + vertex -106.725 106.116 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -105.222 103.25 25.08 + vertex -106.4 102.512 25.08 + vertex -106.015 102.205 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -105.222 105.75 25.08 + vertex -106.978 105.693 25.08 + vertex -105.943 104.5 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -105.222 103.25 25.08 + vertex -106.725 102.884 25.08 + vertex -106.4 102.512 25.08 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -107.151 105.232 25.08 + vertex -105.943 104.5 25.08 + vertex -106.978 105.693 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -105.222 103.25 25.08 + vertex -106.978 103.307 25.08 + vertex -106.725 102.884 25.08 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -107.239 104.747 25.08 + vertex -105.943 104.5 25.08 + vertex -107.151 105.232 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -105.943 104.5 25.08 + vertex -107.151 103.768 25.08 + vertex -106.978 103.307 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -107.239 104.253 25.08 + vertex -105.943 104.5 25.08 + vertex -107.239 104.747 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -105.943 104.5 25.08 + vertex -107.239 104.253 25.08 + vertex -107.151 103.768 25.08 + endloop + endfacet + facet normal -0.62349 0.781831 0 + outer loop + vertex -106.015 106.795 22.1 + vertex -106.4 106.488 25.08 + vertex -106.015 106.795 25.08 + endloop + endfacet + facet normal -0.62349 0.781831 0 + outer loop + vertex -106.4 106.488 25.08 + vertex -106.015 106.795 22.1 + vertex -106.4 106.488 22.1 + endloop + endfacet + facet normal -0.134229 0.99095 0 + outer loop + vertex -104.623 107.247 22.1 + vertex -105.112 107.181 25.08 + vertex -104.623 107.247 25.08 + endloop + endfacet + facet normal -0.134229 0.99095 0 + outer loop + vertex -105.112 107.181 25.08 + vertex -104.623 107.247 22.1 + vertex -105.112 107.181 22.1 + endloop + endfacet + facet normal 0.995974 -0.0896469 0 + outer loop + vertex -101.794 104.009 25.08 + vertex -101.75 104.5 22.1 + vertex -101.75 104.5 25.08 + endloop + endfacet + facet normal 0.995974 -0.0896469 0 + outer loop + vertex -101.75 104.5 22.1 + vertex -101.794 104.009 25.08 + vertex -101.794 104.009 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -103.01 104.5 22.1 + vertex -101.75 104.5 22.1 + vertex -101.794 104.009 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -103.091 104.016 22.1 + vertex -101.794 104.009 22.1 + vertex -101.925 103.534 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -101.75 104.5 22.1 + vertex -103.01 104.5 22.1 + vertex -101.794 104.991 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -103.091 104.016 22.1 + vertex -101.925 103.534 22.1 + vertex -102.139 103.09 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -103.091 104.984 22.1 + vertex -101.794 104.991 22.1 + vertex -103.01 104.5 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -103.324 103.585 22.1 + vertex -102.139 103.09 22.1 + vertex -102.429 102.691 22.1 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex -101.794 104.991 22.1 + vertex -103.091 104.984 22.1 + vertex -101.925 105.466 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -103.324 103.585 22.1 + vertex -102.429 102.691 22.1 + vertex -102.785 102.35 22.1 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex -101.925 105.466 22.1 + vertex -103.091 104.984 22.1 + vertex -102.139 105.91 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -103.324 105.415 22.1 + vertex -102.139 105.91 22.1 + vertex -103.091 104.984 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -101.794 104.009 22.1 + vertex -103.091 104.016 22.1 + vertex -103.01 104.5 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -103.685 103.253 22.1 + vertex -102.785 102.35 22.1 + vertex -103.197 102.078 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -102.139 103.09 22.1 + vertex -103.324 103.585 22.1 + vertex -103.091 104.016 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -104.134 103.056 22.1 + vertex -103.197 102.078 22.1 + vertex -103.65 101.885 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -102.785 102.35 22.1 + vertex -103.685 103.253 22.1 + vertex -103.324 103.585 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -104.134 103.056 22.1 + vertex -103.65 101.885 22.1 + vertex -104.131 101.775 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -103.197 102.078 22.1 + vertex -104.134 103.056 22.1 + vertex -103.685 103.253 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -104.131 101.775 22.1 + vertex -104.623 103.015 22.1 + vertex -104.134 103.056 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -104.623 101.753 22.1 + vertex -104.623 103.015 22.1 + vertex -104.131 101.775 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.112 101.819 22.1 + vertex -104.623 103.015 22.1 + vertex -104.623 101.753 22.1 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex -104.623 103.015 22.1 + vertex -105.112 101.819 22.1 + vertex -105.099 103.135 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.581 101.971 22.1 + vertex -105.099 103.135 22.1 + vertex -105.112 101.819 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -106.015 102.205 22.1 + vertex -105.099 103.135 22.1 + vertex -105.581 101.971 22.1 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex -105.099 103.135 22.1 + vertex -106.015 102.205 22.1 + vertex -105.509 103.404 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -106.4 102.512 22.1 + vertex -105.509 103.404 22.1 + vertex -106.015 102.205 22.1 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex -105.509 103.404 22.1 + vertex -106.725 102.884 22.1 + vertex -105.81 103.791 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -106.725 102.884 22.1 + vertex -105.509 103.404 22.1 + vertex -106.4 102.512 22.1 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex -102.139 105.91 22.1 + vertex -103.324 105.415 22.1 + vertex -102.429 106.309 22.1 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex -102.429 106.309 22.1 + vertex -103.324 105.415 22.1 + vertex -102.785 106.65 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -103.685 105.747 22.1 + vertex -102.785 106.65 22.1 + vertex -103.324 105.415 22.1 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex -102.785 106.65 22.1 + vertex -103.685 105.747 22.1 + vertex -103.197 106.922 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -104.134 105.944 22.1 + vertex -103.197 106.922 22.1 + vertex -103.685 105.747 22.1 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex -103.197 106.922 22.1 + vertex -104.134 105.944 22.1 + vertex -103.65 107.115 22.1 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex -103.65 107.115 22.1 + vertex -104.134 105.944 22.1 + vertex -104.131 107.225 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -104.623 105.985 22.1 + vertex -104.131 107.225 22.1 + vertex -104.134 105.944 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -104.623 105.985 22.1 + vertex -104.623 107.247 22.1 + vertex -104.131 107.225 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.112 107.181 22.1 + vertex -104.623 105.985 22.1 + vertex -105.099 105.865 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -104.623 105.985 22.1 + vertex -105.112 107.181 22.1 + vertex -104.623 107.247 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -106.015 106.795 22.1 + vertex -105.099 105.865 22.1 + vertex -105.509 105.596 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.099 105.865 22.1 + vertex -105.581 107.029 22.1 + vertex -105.112 107.181 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -106.725 106.116 22.1 + vertex -105.509 105.596 22.1 + vertex -105.81 105.209 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -107.151 105.232 22.1 + vertex -105.81 105.209 22.1 + vertex -105.97 104.745 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.099 105.865 22.1 + vertex -106.015 106.795 22.1 + vertex -105.581 107.029 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -106.978 103.307 22.1 + vertex -105.81 103.791 22.1 + vertex -106.725 102.884 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -107.151 103.768 22.1 + vertex -105.81 103.791 22.1 + vertex -106.978 103.307 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.509 105.596 22.1 + vertex -106.4 106.488 22.1 + vertex -106.015 106.795 22.1 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex -105.81 103.791 22.1 + vertex -107.151 103.768 22.1 + vertex -105.97 104.255 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.509 105.596 22.1 + vertex -106.725 106.116 22.1 + vertex -106.4 106.488 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -107.239 104.253 22.1 + vertex -105.97 104.255 22.1 + vertex -107.151 103.768 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.81 105.209 22.1 + vertex -106.978 105.693 22.1 + vertex -106.725 106.116 22.1 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex -105.97 104.255 22.1 + vertex -107.239 104.253 22.1 + vertex -105.97 104.745 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.81 105.209 22.1 + vertex -107.151 105.232 22.1 + vertex -106.978 105.693 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -107.239 104.747 22.1 + vertex -105.97 104.745 22.1 + vertex -107.239 104.253 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -105.97 104.745 22.1 + vertex -107.239 104.747 22.1 + vertex -107.151 105.232 22.1 + endloop + endfacet + facet normal 0.222531 -0.974926 0 + outer loop + vertex -104.131 101.775 22.1 + vertex -103.65 101.885 25.08 + vertex -104.131 101.775 25.08 + endloop + endfacet + facet normal 0.222531 -0.974926 0 + outer loop + vertex -103.65 101.885 25.08 + vertex -104.131 101.775 22.1 + vertex -103.65 101.885 22.1 + endloop + endfacet + facet normal -0.309018 0.951056 0 + outer loop + vertex -105.112 107.181 22.1 + vertex -105.581 107.029 25.08 + vertex -105.112 107.181 25.08 + endloop + endfacet + facet normal -0.309018 0.951056 0 + outer loop + vertex -105.581 107.029 25.08 + vertex -105.112 107.181 22.1 + vertex -105.581 107.029 22.1 + endloop + endfacet + facet normal 0.90097 -0.433881 0 + outer loop + vertex -102.139 103.09 25.08 + vertex -101.925 103.534 22.1 + vertex -101.925 103.534 25.08 + endloop + endfacet + facet normal 0.90097 -0.433881 0 + outer loop + vertex -101.925 103.534 22.1 + vertex -102.139 103.09 25.08 + vertex -102.139 103.09 22.1 + endloop + endfacet + facet normal -0.85845 -0.512897 0 + outer loop + vertex -106.725 102.884 22.1 + vertex -106.978 103.307 25.08 + vertex -106.978 103.307 22.1 + endloop + endfacet + facet normal -0.85845 -0.512897 0 + outer loop + vertex -106.978 103.307 25.08 + vertex -106.725 102.884 22.1 + vertex -106.725 102.884 25.08 + endloop + endfacet + facet normal -0.983928 -0.178565 0 + outer loop + vertex -107.151 103.768 22.1 + vertex -107.239 104.253 25.08 + vertex -107.239 104.253 22.1 + endloop + endfacet + facet normal -0.983928 -0.178565 0 + outer loop + vertex -107.239 104.253 25.08 + vertex -107.151 103.768 22.1 + vertex -107.151 103.768 25.08 + endloop + endfacet + facet normal 0.550891 -0.834577 0 + outer loop + vertex -103.197 102.078 22.1 + vertex -102.785 102.35 25.08 + vertex -103.197 102.078 25.08 + endloop + endfacet + facet normal 0.550891 -0.834577 0 + outer loop + vertex -102.785 102.35 25.08 + vertex -103.197 102.078 22.1 + vertex -102.785 102.35 22.1 + endloop + endfacet + facet normal 0.393015 -0.919532 0 + outer loop + vertex -103.65 101.885 22.1 + vertex -103.197 102.078 25.08 + vertex -103.65 101.885 25.08 + endloop + endfacet + facet normal 0.393015 -0.919532 0 + outer loop + vertex -103.197 102.078 25.08 + vertex -103.65 101.885 22.1 + vertex -103.197 102.078 22.1 + endloop + endfacet + facet normal -0.47387 -0.880595 0 + outer loop + vertex -106.015 102.205 22.1 + vertex -105.581 101.971 25.08 + vertex -106.015 102.205 25.08 + endloop + endfacet + facet normal -0.47387 -0.880595 -0 + outer loop + vertex -105.581 101.971 25.08 + vertex -106.015 102.205 22.1 + vertex -105.581 101.971 22.1 + endloop + endfacet + facet normal -0.309018 -0.951056 0 + outer loop + vertex -105.581 101.971 22.1 + vertex -105.112 101.819 25.08 + vertex -105.581 101.971 25.08 + endloop + endfacet + facet normal -0.309018 -0.951056 -0 + outer loop + vertex -105.112 101.819 25.08 + vertex -105.581 101.971 22.1 + vertex -105.112 101.819 22.1 + endloop + endfacet + facet normal -0.134229 -0.99095 0 + outer loop + vertex -105.112 101.819 22.1 + vertex -104.623 101.753 25.08 + vertex -105.112 101.819 25.08 + endloop + endfacet + facet normal -0.134229 -0.99095 -0 + outer loop + vertex -104.623 101.753 25.08 + vertex -105.112 101.819 22.1 + vertex -104.623 101.753 22.1 + endloop + endfacet + facet normal -0.936235 -0.351374 0 + outer loop + vertex -106.978 103.307 22.1 + vertex -107.151 103.768 25.08 + vertex -107.151 103.768 22.1 + endloop + endfacet + facet normal -0.936235 -0.351374 0 + outer loop + vertex -107.151 103.768 25.08 + vertex -106.978 103.307 22.1 + vertex -106.978 103.307 25.08 + endloop + endfacet + facet normal 0.691067 -0.722791 0 + outer loop + vertex -102.785 102.35 22.1 + vertex -102.429 102.691 25.08 + vertex -102.785 102.35 25.08 + endloop + endfacet + facet normal 0.691067 -0.722791 0 + outer loop + vertex -102.429 102.691 25.08 + vertex -102.785 102.35 22.1 + vertex -102.429 102.691 22.1 + endloop + endfacet + facet normal -0.753075 -0.657935 0 + outer loop + vertex -106.4 102.512 22.1 + vertex -106.725 102.884 25.08 + vertex -106.725 102.884 22.1 + endloop + endfacet + facet normal -0.753075 -0.657935 0 + outer loop + vertex -106.725 102.884 25.08 + vertex -106.4 102.512 22.1 + vertex -106.4 102.512 25.08 + endloop + endfacet + facet normal -0.62349 -0.781831 0 + outer loop + vertex -106.4 102.512 22.1 + vertex -106.015 102.205 25.08 + vertex -106.4 102.512 25.08 + endloop + endfacet + facet normal -0.62349 -0.781831 -0 + outer loop + vertex -106.015 102.205 25.08 + vertex -106.4 102.512 22.1 + vertex -106.015 102.205 22.1 + endloop + endfacet + facet normal 0.986363 0.164583 0 + outer loop + vertex -103.01 104.5 20.5 + vertex -103.091 104.984 13.5 + vertex -103.091 104.984 20.5 + endloop + endfacet + facet normal 0.986363 0.164583 0 + outer loop + vertex -103.091 104.984 13.5 + vertex -103.01 104.5 20.5 + vertex -103.01 104.5 13.5 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -105.97 104.255 13.5 + vertex -105.97 104.745 20.5 + vertex -105.97 104.745 13.5 + endloop + endfacet + facet normal -1 -0 0 + outer loop + vertex -105.97 104.745 20.5 + vertex -105.97 104.255 13.5 + vertex -105.97 104.255 20.5 + endloop + endfacet + facet normal -0.245484 0.969401 0 + outer loop + vertex -104.623 105.985 13.5 + vertex -105.099 105.865 20.5 + vertex -104.623 105.985 20.5 + endloop + endfacet + facet normal -0.245484 0.969401 0 + outer loop + vertex -105.099 105.865 20.5 + vertex -104.623 105.985 13.5 + vertex -105.099 105.865 13.5 + endloop + endfacet + facet normal 0.0825782 -0.996585 0 + outer loop + vertex -104.623 103.015 13.5 + vertex -104.134 103.056 20.5 + vertex -104.623 103.015 20.5 + endloop + endfacet + facet normal 0.0825782 -0.996585 0 + outer loop + vertex -104.134 103.056 20.5 + vertex -104.623 103.015 13.5 + vertex -104.134 103.056 13.5 + endloop + endfacet + facet normal 0.401702 0.915771 -0 + outer loop + vertex -103.685 105.747 13.5 + vertex -104.134 105.944 20.5 + vertex -103.685 105.747 20.5 + endloop + endfacet + facet normal 0.401702 0.915771 0 + outer loop + vertex -104.134 105.944 20.5 + vertex -103.685 105.747 13.5 + vertex -104.134 105.944 13.5 + endloop + endfacet + facet normal 0.0825782 0.996585 -0 + outer loop + vertex -104.134 105.944 13.5 + vertex -104.623 105.985 20.5 + vertex -104.134 105.944 20.5 + endloop + endfacet + facet normal 0.0825782 0.996585 0 + outer loop + vertex -104.623 105.985 20.5 + vertex -104.134 105.944 13.5 + vertex -104.623 105.985 13.5 + endloop + endfacet + facet normal -0.789139 0.614214 0 + outer loop + vertex -105.81 105.209 13.5 + vertex -105.509 105.596 20.5 + vertex -105.509 105.596 13.5 + endloop + endfacet + facet normal -0.789139 0.614214 0 + outer loop + vertex -105.509 105.596 20.5 + vertex -105.81 105.209 13.5 + vertex -105.81 105.209 20.5 + endloop + endfacet + facet normal -0.945816 0.324703 0 + outer loop + vertex -105.97 104.745 13.5 + vertex -105.81 105.209 20.5 + vertex -105.81 105.209 13.5 + endloop + endfacet + facet normal -0.945816 0.324703 0 + outer loop + vertex -105.81 105.209 20.5 + vertex -105.97 104.745 13.5 + vertex -105.97 104.745 20.5 + endloop + endfacet + facet normal -0.546948 0.837167 0 + outer loop + vertex -105.099 105.865 13.5 + vertex -105.509 105.596 20.5 + vertex -105.099 105.865 20.5 + endloop + endfacet + facet normal -0.546948 0.837167 0 + outer loop + vertex -105.509 105.596 20.5 + vertex -105.099 105.865 13.5 + vertex -105.509 105.596 13.5 + endloop + endfacet + facet normal -0.245484 -0.969401 0 + outer loop + vertex -105.099 103.135 13.5 + vertex -104.623 103.015 20.5 + vertex -105.099 103.135 20.5 + endloop + endfacet + facet normal -0.245484 -0.969401 -0 + outer loop + vertex -104.623 103.015 20.5 + vertex -105.099 103.135 13.5 + vertex -104.623 103.015 13.5 + endloop + endfacet + facet normal 0.677276 0.735729 -0 + outer loop + vertex -103.324 105.415 13.5 + vertex -103.685 105.747 20.5 + vertex -103.324 105.415 20.5 + endloop + endfacet + facet normal 0.677276 0.735729 0 + outer loop + vertex -103.685 105.747 20.5 + vertex -103.324 105.415 13.5 + vertex -103.685 105.747 13.5 + endloop + endfacet + facet normal 0.87947 0.475954 0 + outer loop + vertex -103.091 104.984 20.5 + vertex -103.324 105.415 13.5 + vertex -103.324 105.415 20.5 + endloop + endfacet + facet normal 0.87947 0.475954 0 + outer loop + vertex -103.324 105.415 13.5 + vertex -103.091 104.984 20.5 + vertex -103.091 104.984 13.5 + endloop + endfacet + facet normal 0.401702 -0.915771 0 + outer loop + vertex -104.134 103.056 13.5 + vertex -103.685 103.253 20.5 + vertex -104.134 103.056 20.5 + endloop + endfacet + facet normal 0.401702 -0.915771 0 + outer loop + vertex -103.685 103.253 20.5 + vertex -104.134 103.056 13.5 + vertex -103.685 103.253 13.5 + endloop + endfacet + facet normal 0.986363 -0.164583 0 + outer loop + vertex -103.091 104.016 20.5 + vertex -103.01 104.5 13.5 + vertex -103.01 104.5 20.5 + endloop + endfacet + facet normal 0.986363 -0.164583 0 + outer loop + vertex -103.01 104.5 13.5 + vertex -103.091 104.016 20.5 + vertex -103.091 104.016 13.5 + endloop + endfacet + facet normal -0.546948 -0.837167 0 + outer loop + vertex -105.509 103.404 13.5 + vertex -105.099 103.135 20.5 + vertex -105.509 103.404 20.5 + endloop + endfacet + facet normal -0.546948 -0.837167 -0 + outer loop + vertex -105.099 103.135 20.5 + vertex -105.509 103.404 13.5 + vertex -105.099 103.135 13.5 + endloop + endfacet + facet normal -0.945816 -0.324703 0 + outer loop + vertex -105.81 103.791 13.5 + vertex -105.97 104.255 20.5 + vertex -105.97 104.255 13.5 + endloop + endfacet + facet normal -0.945816 -0.324703 0 + outer loop + vertex -105.97 104.255 20.5 + vertex -105.81 103.791 13.5 + vertex -105.81 103.791 20.5 + endloop + endfacet + facet normal 0.677276 -0.735729 0 + outer loop + vertex -103.685 103.253 13.5 + vertex -103.324 103.585 20.5 + vertex -103.685 103.253 20.5 + endloop + endfacet + facet normal 0.677276 -0.735729 0 + outer loop + vertex -103.324 103.585 20.5 + vertex -103.685 103.253 13.5 + vertex -103.324 103.585 13.5 + endloop + endfacet + facet normal -0.789139 -0.614214 0 + outer loop + vertex -105.509 103.404 13.5 + vertex -105.81 103.791 20.5 + vertex -105.81 103.791 13.5 + endloop + endfacet + facet normal -0.789139 -0.614214 0 + outer loop + vertex -105.81 103.791 20.5 + vertex -105.509 103.404 13.5 + vertex -105.509 103.404 20.5 + endloop + endfacet + facet normal 0.87947 -0.475954 0 + outer loop + vertex -103.324 103.585 20.5 + vertex -103.091 104.016 13.5 + vertex -103.091 104.016 20.5 + endloop + endfacet + facet normal 0.87947 -0.475954 0 + outer loop + vertex -103.091 104.016 13.5 + vertex -103.324 103.585 20.5 + vertex -103.324 103.585 13.5 + endloop + endfacet + facet normal -0.866026 -0.5 0 + outer loop + vertex -103.057 104.5 24.0867 + vertex -103.778 105.75 25.08 + vertex -103.778 105.75 24.0867 + endloop + endfacet + facet normal -0.866026 -0.5 0 + outer loop + vertex -103.778 105.75 25.08 + vertex -103.057 104.5 24.0867 + vertex -103.057 104.5 25.08 + endloop + endfacet + facet normal 0.866026 -0.5 0 + outer loop + vertex -105.943 104.5 25.08 + vertex -105.222 105.75 24.0867 + vertex -105.222 105.75 25.08 + endloop + endfacet + facet normal 0.866026 -0.5 0 + outer loop + vertex -105.222 105.75 24.0867 + vertex -105.943 104.5 25.08 + vertex -105.943 104.5 24.0867 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -105.222 105.75 24.0867 + vertex -103.778 105.75 25.08 + vertex -105.222 105.75 25.08 + endloop + endfacet + facet normal 0 -1 -0 + outer loop + vertex -103.778 105.75 25.08 + vertex -105.222 105.75 24.0867 + vertex -103.778 105.75 24.0867 + endloop + endfacet + facet normal -0.866026 0.5 0 + outer loop + vertex -103.778 103.25 24.0867 + vertex -103.057 104.5 25.08 + vertex -103.057 104.5 24.0867 + endloop + endfacet + facet normal -0.866026 0.5 0 + outer loop + vertex -103.057 104.5 25.08 + vertex -103.778 103.25 24.0867 + vertex -103.778 103.25 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -103.778 105.75 24.0867 + vertex -103.778 103.25 24.0867 + vertex -103.057 104.5 24.0867 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -105.222 105.75 24.0867 + vertex -103.778 103.25 24.0867 + vertex -103.778 105.75 24.0867 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -105.222 105.75 24.0867 + vertex -105.222 103.25 24.0867 + vertex -103.778 103.25 24.0867 + endloop + endfacet + facet normal 0 -0 1 + outer loop + vertex -105.222 103.25 24.0867 + vertex -105.222 105.75 24.0867 + vertex -105.943 104.5 24.0867 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex -103.778 103.25 24.0867 + vertex -105.222 103.25 25.08 + vertex -103.778 103.25 25.08 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -105.222 103.25 25.08 + vertex -103.778 103.25 24.0867 + vertex -105.222 103.25 24.0867 + endloop + endfacet + facet normal 0.866026 0.5 0 + outer loop + vertex -105.222 103.25 25.08 + vertex -105.943 104.5 24.0867 + vertex -105.943 104.5 25.08 + endloop + endfacet + facet normal 0.866026 0.5 0 + outer loop + vertex -105.943 104.5 24.0867 + vertex -105.222 103.25 25.08 + vertex -105.222 103.25 24.0867 + endloop + endfacet + facet normal 0.866025 0.5 0 + outer loop + vertex 107 -104.067 20.5 + vertex 105.875 -102.118 0.5 + vertex 105.875 -102.118 20.5 + endloop + endfacet + facet normal 0.866026 0.499999 -0 + outer loop + vertex 107.25 -104.5 0.5 + vertex 107 -104.067 20.5 + vertex 107.25 -104.5 20.5 + endloop + endfacet + facet normal 0.866025 0.5 -3.46791e-008 + outer loop + vertex 107 -104.067 20.5 + vertex 107.25 -104.5 0.5 + vertex 105.875 -102.118 0.5 + endloop + endfacet + facet normal -0.866025 0.5 0 + outer loop + vertex 101.75 -104.5 0.5 + vertex 103.125 -102.118 20.5 + vertex 103.125 -102.118 0.5 + endloop + endfacet + facet normal -0.866025 0.5 0 + outer loop + vertex 103.125 -102.118 20.5 + vertex 101.75 -104.5 0.5 + vertex 101.75 -104.5 20.5 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex 105.875 -102.118 0.5 + vertex 103.125 -102.118 20.5 + vertex 105.875 -102.118 20.5 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 103.125 -102.118 20.5 + vertex 105.875 -102.118 0.5 + vertex 103.125 -102.118 0.5 + endloop + endfacet + facet normal 0.866026 -0.499999 0 + outer loop + vertex 107 -104.933 20.5 + vertex 107.25 -104.5 0.5 + vertex 107.25 -104.5 20.5 + endloop + endfacet + facet normal 0.866025 -0.5 0 + outer loop + vertex 105.875 -106.882 0.5 + vertex 107 -104.933 20.5 + vertex 105.875 -106.882 20.5 + endloop + endfacet + facet normal 0.866025 -0.5 -3.46791e-008 + outer loop + vertex 107 -104.933 20.5 + vertex 105.875 -106.882 0.5 + vertex 107.25 -104.5 0.5 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 107.25 -104.5 0.5 + vertex 105.919 -104.987 0.5 + vertex 106 -104.5 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 105.684 -105.421 0.5 + vertex 107.25 -104.5 0.5 + vertex 105.875 -106.882 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 107.25 -104.5 0.5 + vertex 105.684 -105.421 0.5 + vertex 105.919 -104.987 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 105.875 -106.882 0.5 + vertex 105.32 -105.756 0.5 + vertex 105.684 -105.421 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 105.875 -106.882 0.5 + vertex 104.868 -105.954 0.5 + vertex 105.32 -105.756 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 105.875 -106.882 0.5 + vertex 104.376 -105.995 0.5 + vertex 104.868 -105.954 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.125 -106.882 0.5 + vertex 104.376 -105.995 0.5 + vertex 105.875 -106.882 0.5 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 104.376 -105.995 0.5 + vertex 103.125 -106.882 0.5 + vertex 103.897 -105.874 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.125 -106.882 0.5 + vertex 103.484 -105.604 0.5 + vertex 103.897 -105.874 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.125 -106.882 0.5 + vertex 103.181 -105.214 0.5 + vertex 103.484 -105.604 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 101.75 -104.5 0.5 + vertex 103.181 -105.214 0.5 + vertex 103.125 -106.882 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.02 -104.747 0.5 + vertex 101.75 -104.5 0.5 + vertex 103.02 -104.253 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.181 -105.214 0.5 + vertex 101.75 -104.5 0.5 + vertex 103.02 -104.747 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 105.919 -104.013 0.5 + vertex 107.25 -104.5 0.5 + vertex 106 -104.5 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 105.684 -103.579 0.5 + vertex 107.25 -104.5 0.5 + vertex 105.919 -104.013 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 107.25 -104.5 0.5 + vertex 105.684 -103.579 0.5 + vertex 105.875 -102.118 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 105.32 -103.244 0.5 + vertex 105.875 -102.118 0.5 + vertex 105.684 -103.579 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 104.868 -103.046 0.5 + vertex 105.875 -102.118 0.5 + vertex 105.32 -103.244 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 104.376 -103.005 0.5 + vertex 105.875 -102.118 0.5 + vertex 104.868 -103.046 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.125 -102.118 0.5 + vertex 104.376 -103.005 0.5 + vertex 103.897 -103.126 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 104.376 -103.005 0.5 + vertex 103.125 -102.118 0.5 + vertex 105.875 -102.118 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.484 -103.396 0.5 + vertex 103.125 -102.118 0.5 + vertex 103.897 -103.126 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.181 -103.786 0.5 + vertex 103.125 -102.118 0.5 + vertex 103.484 -103.396 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 101.75 -104.5 0.5 + vertex 103.181 -103.786 0.5 + vertex 103.02 -104.253 0.5 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 103.181 -103.786 0.5 + vertex 101.75 -104.5 0.5 + vertex 103.125 -102.118 0.5 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 103.125 -106.882 0.5 + vertex 105.875 -106.882 20.5 + vertex 103.125 -106.882 20.5 + endloop + endfacet + facet normal 0 -1 -0 + outer loop + vertex 105.875 -106.882 20.5 + vertex 103.125 -106.882 0.5 + vertex 105.875 -106.882 0.5 + endloop + endfacet + facet normal -0.866025 -0.5 0 + outer loop + vertex 103.125 -106.882 0.5 + vertex 101.75 -104.5 20.5 + vertex 101.75 -104.5 0.5 + endloop + endfacet + facet normal -0.866025 -0.5 0 + outer loop + vertex 101.75 -104.5 20.5 + vertex 103.125 -106.882 0.5 + vertex 103.125 -106.882 20.5 + endloop + endfacet + facet normal 0.98636 0.164599 0 + outer loop + vertex 106 -104.5 0.5 + vertex 105.919 -104.013 -6.5 + vertex 105.919 -104.013 0.5 + endloop + endfacet + facet normal 0.98636 0.164599 0 + outer loop + vertex 105.919 -104.013 -6.5 + vertex 106 -104.5 0.5 + vertex 106 -104.5 -6.5 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex 103.02 -104.747 -6.5 + vertex 103.02 -104.253 0.5 + vertex 103.02 -104.253 -6.5 + endloop + endfacet + facet normal -1 -0 0 + outer loop + vertex 103.02 -104.253 0.5 + vertex 103.02 -104.747 -6.5 + vertex 103.02 -104.747 0.5 + endloop + endfacet + facet normal 0.0825698 0.996585 -0 + outer loop + vertex 104.868 -103.046 -6.5 + vertex 104.376 -103.005 0.5 + vertex 104.868 -103.046 0.5 + endloop + endfacet + facet normal 0.0825698 0.996585 0 + outer loop + vertex 104.376 -103.005 0.5 + vertex 104.868 -103.046 -6.5 + vertex 104.376 -103.005 -6.5 + endloop + endfacet + facet normal 0.0825698 -0.996585 0 + outer loop + vertex 104.376 -105.995 -6.5 + vertex 104.868 -105.954 0.5 + vertex 104.376 -105.995 0.5 + endloop + endfacet + facet normal 0.0825698 -0.996585 0 + outer loop + vertex 104.868 -105.954 0.5 + vertex 104.376 -105.995 -6.5 + vertex 104.868 -105.954 -6.5 + endloop + endfacet + facet normal 0.401692 -0.915775 0 + outer loop + vertex 104.868 -105.954 -6.5 + vertex 105.32 -105.756 0.5 + vertex 104.868 -105.954 0.5 + endloop + endfacet + facet normal 0.401692 -0.915775 0 + outer loop + vertex 105.32 -105.756 0.5 + vertex 104.868 -105.954 -6.5 + vertex 105.32 -105.756 -6.5 + endloop + endfacet + facet normal 0.677285 0.73572 -0 + outer loop + vertex 105.684 -103.579 -6.5 + vertex 105.32 -103.244 0.5 + vertex 105.684 -103.579 0.5 + endloop + endfacet + facet normal 0.677285 0.73572 0 + outer loop + vertex 105.32 -103.244 0.5 + vertex 105.684 -103.579 -6.5 + vertex 105.32 -103.244 -6.5 + endloop + endfacet + facet normal 0.879474 0.475946 0 + outer loop + vertex 105.919 -104.013 0.5 + vertex 105.684 -103.579 -6.5 + vertex 105.684 -103.579 0.5 + endloop + endfacet + facet normal 0.879474 0.475946 0 + outer loop + vertex 105.684 -103.579 -6.5 + vertex 105.919 -104.013 0.5 + vertex 105.919 -104.013 -6.5 + endloop + endfacet + facet normal 0.401692 0.915775 -0 + outer loop + vertex 105.32 -103.244 -6.5 + vertex 104.868 -103.046 0.5 + vertex 105.32 -103.244 0.5 + endloop + endfacet + facet normal 0.401692 0.915775 0 + outer loop + vertex 104.868 -103.046 0.5 + vertex 105.32 -103.244 -6.5 + vertex 104.868 -103.046 -6.5 + endloop + endfacet + facet normal -0.789137 0.614218 0 + outer loop + vertex 103.181 -103.786 -6.5 + vertex 103.484 -103.396 0.5 + vertex 103.484 -103.396 -6.5 + endloop + endfacet + facet normal -0.789137 0.614218 0 + outer loop + vertex 103.484 -103.396 0.5 + vertex 103.181 -103.786 -6.5 + vertex 103.181 -103.786 0.5 + endloop + endfacet + facet normal -0.945823 0.324684 0 + outer loop + vertex 103.02 -104.253 -6.5 + vertex 103.181 -103.786 0.5 + vertex 103.181 -103.786 -6.5 + endloop + endfacet + facet normal -0.945823 0.324684 0 + outer loop + vertex 103.181 -103.786 0.5 + vertex 103.02 -104.253 -6.5 + vertex 103.02 -104.253 0.5 + endloop + endfacet + facet normal -0.245487 0.9694 0 + outer loop + vertex 104.376 -103.005 -6.5 + vertex 103.897 -103.126 0.5 + vertex 104.376 -103.005 0.5 + endloop + endfacet + facet normal -0.245487 0.9694 0 + outer loop + vertex 103.897 -103.126 0.5 + vertex 104.376 -103.005 -6.5 + vertex 103.897 -103.126 -6.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 105.919 -104.987 -6.5 + vertex 105.919 -104.013 -6.5 + vertex 106 -104.5 -6.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 105.684 -105.421 -6.5 + vertex 105.919 -104.013 -6.5 + vertex 105.919 -104.987 -6.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 105.684 -105.421 -6.5 + vertex 105.684 -103.579 -6.5 + vertex 105.919 -104.013 -6.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 105.32 -105.756 -6.5 + vertex 105.684 -103.579 -6.5 + vertex 105.684 -105.421 -6.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 105.32 -105.756 -6.5 + vertex 105.32 -103.244 -6.5 + vertex 105.684 -103.579 -6.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 104.868 -105.954 -6.5 + vertex 105.32 -103.244 -6.5 + vertex 105.32 -105.756 -6.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 104.868 -105.954 -6.5 + vertex 104.868 -103.046 -6.5 + vertex 105.32 -103.244 -6.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 104.376 -105.995 -6.5 + vertex 104.868 -103.046 -6.5 + vertex 104.868 -105.954 -6.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 104.376 -105.995 -6.5 + vertex 104.376 -103.005 -6.5 + vertex 104.868 -103.046 -6.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.897 -105.874 -6.5 + vertex 104.376 -103.005 -6.5 + vertex 104.376 -105.995 -6.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.897 -105.874 -6.5 + vertex 103.897 -103.126 -6.5 + vertex 104.376 -103.005 -6.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.484 -105.604 -6.5 + vertex 103.897 -103.126 -6.5 + vertex 103.897 -105.874 -6.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.484 -105.604 -6.5 + vertex 103.484 -103.396 -6.5 + vertex 103.897 -103.126 -6.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.181 -105.214 -6.5 + vertex 103.484 -103.396 -6.5 + vertex 103.484 -105.604 -6.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.181 -105.214 -6.5 + vertex 103.181 -103.786 -6.5 + vertex 103.484 -103.396 -6.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.02 -104.747 -6.5 + vertex 103.181 -103.786 -6.5 + vertex 103.181 -105.214 -6.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.181 -103.786 -6.5 + vertex 103.02 -104.747 -6.5 + vertex 103.02 -104.253 -6.5 + endloop + endfacet + facet normal -0.546943 0.83717 0 + outer loop + vertex 103.897 -103.126 -6.5 + vertex 103.484 -103.396 0.5 + vertex 103.897 -103.126 0.5 + endloop + endfacet + facet normal -0.546943 0.83717 0 + outer loop + vertex 103.484 -103.396 0.5 + vertex 103.897 -103.126 -6.5 + vertex 103.484 -103.396 -6.5 + endloop + endfacet + facet normal 0.98636 -0.164599 0 + outer loop + vertex 105.919 -104.987 0.5 + vertex 106 -104.5 -6.5 + vertex 106 -104.5 0.5 + endloop + endfacet + facet normal 0.98636 -0.164599 0 + outer loop + vertex 106 -104.5 -6.5 + vertex 105.919 -104.987 0.5 + vertex 105.919 -104.987 -6.5 + endloop + endfacet + facet normal 0.677285 -0.73572 0 + outer loop + vertex 105.32 -105.756 -6.5 + vertex 105.684 -105.421 0.5 + vertex 105.32 -105.756 0.5 + endloop + endfacet + facet normal 0.677285 -0.73572 0 + outer loop + vertex 105.684 -105.421 0.5 + vertex 105.32 -105.756 -6.5 + vertex 105.684 -105.421 -6.5 + endloop + endfacet + facet normal 0.879474 -0.475946 0 + outer loop + vertex 105.684 -105.421 0.5 + vertex 105.919 -104.987 -6.5 + vertex 105.919 -104.987 0.5 + endloop + endfacet + facet normal 0.879474 -0.475946 0 + outer loop + vertex 105.919 -104.987 -6.5 + vertex 105.684 -105.421 0.5 + vertex 105.684 -105.421 -6.5 + endloop + endfacet + facet normal -0.245487 -0.9694 0 + outer loop + vertex 103.897 -105.874 -6.5 + vertex 104.376 -105.995 0.5 + vertex 103.897 -105.874 0.5 + endloop + endfacet + facet normal -0.245487 -0.9694 -0 + outer loop + vertex 104.376 -105.995 0.5 + vertex 103.897 -105.874 -6.5 + vertex 104.376 -105.995 -6.5 + endloop + endfacet + facet normal -0.789137 -0.614218 0 + outer loop + vertex 103.484 -105.604 -6.5 + vertex 103.181 -105.214 0.5 + vertex 103.181 -105.214 -6.5 + endloop + endfacet + facet normal -0.789137 -0.614218 0 + outer loop + vertex 103.181 -105.214 0.5 + vertex 103.484 -105.604 -6.5 + vertex 103.484 -105.604 0.5 + endloop + endfacet + facet normal -0.945823 -0.324684 0 + outer loop + vertex 103.181 -105.214 -6.5 + vertex 103.02 -104.747 0.5 + vertex 103.02 -104.747 -6.5 + endloop + endfacet + facet normal -0.945823 -0.324684 0 + outer loop + vertex 103.02 -104.747 0.5 + vertex 103.181 -105.214 -6.5 + vertex 103.181 -105.214 0.5 + endloop + endfacet + facet normal -0.546943 -0.83717 0 + outer loop + vertex 103.484 -105.604 -6.5 + vertex 103.897 -105.874 0.5 + vertex 103.484 -105.604 0.5 + endloop + endfacet + facet normal -0.546943 -0.83717 -0 + outer loop + vertex 103.897 -105.874 0.5 + vertex 103.484 -105.604 -6.5 + vertex 103.897 -105.874 -6.5 + endloop + endfacet + facet normal -0.98636 -0.164599 0 + outer loop + vertex 106 -104.5 13.5 + vertex 105.919 -104.013 20.5 + vertex 105.919 -104.013 13.5 + endloop + endfacet + facet normal -0.98636 -0.164599 0 + outer loop + vertex 105.919 -104.013 20.5 + vertex 106 -104.5 13.5 + vertex 106 -104.5 20.5 + endloop + endfacet + facet normal 1 -0 0 + outer loop + vertex 103.02 -104.747 20.5 + vertex 103.02 -104.253 13.5 + vertex 103.02 -104.253 20.5 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 103.02 -104.253 13.5 + vertex 103.02 -104.747 20.5 + vertex 103.02 -104.747 13.5 + endloop + endfacet + facet normal -0.0825698 -0.996585 0 + outer loop + vertex 104.376 -103.005 13.5 + vertex 104.868 -103.046 20.5 + vertex 104.376 -103.005 20.5 + endloop + endfacet + facet normal -0.0825698 -0.996585 -0 + outer loop + vertex 104.868 -103.046 20.5 + vertex 104.376 -103.005 13.5 + vertex 104.868 -103.046 13.5 + endloop + endfacet + facet normal -0.0825698 0.996585 0 + outer loop + vertex 104.868 -105.954 13.5 + vertex 104.376 -105.995 20.5 + vertex 104.868 -105.954 20.5 + endloop + endfacet + facet normal -0.0825698 0.996585 0 + outer loop + vertex 104.376 -105.995 20.5 + vertex 104.868 -105.954 13.5 + vertex 104.376 -105.995 13.5 + endloop + endfacet + facet normal -0.401692 0.915775 0 + outer loop + vertex 105.32 -105.756 13.5 + vertex 104.868 -105.954 20.5 + vertex 105.32 -105.756 20.5 + endloop + endfacet + facet normal -0.401692 0.915775 0 + outer loop + vertex 104.868 -105.954 20.5 + vertex 105.32 -105.756 13.5 + vertex 104.868 -105.954 13.5 + endloop + endfacet + facet normal -0.677285 -0.73572 0 + outer loop + vertex 105.32 -103.244 13.5 + vertex 105.684 -103.579 20.5 + vertex 105.32 -103.244 20.5 + endloop + endfacet + facet normal -0.677285 -0.73572 -0 + outer loop + vertex 105.684 -103.579 20.5 + vertex 105.32 -103.244 13.5 + vertex 105.684 -103.579 13.5 + endloop + endfacet + facet normal -0.879474 -0.475946 0 + outer loop + vertex 105.919 -104.013 13.5 + vertex 105.684 -103.579 20.5 + vertex 105.684 -103.579 13.5 + endloop + endfacet + facet normal -0.879474 -0.475946 0 + outer loop + vertex 105.684 -103.579 20.5 + vertex 105.919 -104.013 13.5 + vertex 105.919 -104.013 20.5 + endloop + endfacet + facet normal -0.401692 -0.915775 0 + outer loop + vertex 104.868 -103.046 13.5 + vertex 105.32 -103.244 20.5 + vertex 104.868 -103.046 20.5 + endloop + endfacet + facet normal -0.401692 -0.915775 -0 + outer loop + vertex 105.32 -103.244 20.5 + vertex 104.868 -103.046 13.5 + vertex 105.32 -103.244 13.5 + endloop + endfacet + facet normal 0.789137 -0.614218 0 + outer loop + vertex 103.181 -103.786 20.5 + vertex 103.484 -103.396 13.5 + vertex 103.484 -103.396 20.5 + endloop + endfacet + facet normal 0.789137 -0.614218 0 + outer loop + vertex 103.484 -103.396 13.5 + vertex 103.181 -103.786 20.5 + vertex 103.181 -103.786 13.5 + endloop + endfacet + facet normal 0.945823 -0.324684 0 + outer loop + vertex 103.02 -104.253 20.5 + vertex 103.181 -103.786 13.5 + vertex 103.181 -103.786 20.5 + endloop + endfacet + facet normal 0.945823 -0.324684 0 + outer loop + vertex 103.181 -103.786 13.5 + vertex 103.02 -104.253 20.5 + vertex 103.02 -104.253 13.5 + endloop + endfacet + facet normal 0.245487 -0.9694 0 + outer loop + vertex 103.897 -103.126 13.5 + vertex 104.376 -103.005 20.5 + vertex 103.897 -103.126 20.5 + endloop + endfacet + facet normal 0.245487 -0.9694 0 + outer loop + vertex 104.376 -103.005 20.5 + vertex 103.897 -103.126 13.5 + vertex 104.376 -103.005 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 105.919 -104.013 13.5 + vertex 105.99 -104.5 13.5 + vertex 106 -104.5 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 105.919 -104.013 13.5 + vertex 105.909 -104.016 13.5 + vertex 105.99 -104.5 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 105.684 -103.579 13.5 + vertex 105.909 -104.016 13.5 + vertex 105.919 -104.013 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 105.684 -103.579 13.5 + vertex 105.676 -103.585 13.5 + vertex 105.909 -104.016 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 105.32 -103.244 13.5 + vertex 105.676 -103.585 13.5 + vertex 105.684 -103.579 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 105.32 -103.244 13.5 + vertex 105.315 -103.253 13.5 + vertex 105.676 -103.585 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 104.868 -103.046 13.5 + vertex 105.315 -103.253 13.5 + vertex 105.32 -103.244 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 104.868 -103.046 13.5 + vertex 104.866 -103.056 13.5 + vertex 105.315 -103.253 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 104.868 -103.046 13.5 + vertex 104.377 -103.015 13.5 + vertex 104.866 -103.056 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 104.376 -103.005 13.5 + vertex 104.377 -103.015 13.5 + vertex 104.868 -103.046 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 104.376 -103.005 13.5 + vertex 103.901 -103.135 13.5 + vertex 104.377 -103.015 13.5 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex 103.897 -103.126 13.5 + vertex 103.901 -103.135 13.5 + vertex 104.376 -103.005 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 103.897 -103.126 13.5 + vertex 103.491 -103.404 13.5 + vertex 103.901 -103.135 13.5 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex 103.484 -103.396 13.5 + vertex 103.491 -103.404 13.5 + vertex 103.897 -103.126 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 103.484 -103.396 13.5 + vertex 103.19 -103.791 13.5 + vertex 103.491 -103.404 13.5 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex 103.181 -103.786 13.5 + vertex 103.19 -103.791 13.5 + vertex 103.484 -103.396 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 103.181 -103.786 13.5 + vertex 103.03 -104.255 13.5 + vertex 103.19 -103.791 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 103.03 -104.255 13.5 + vertex 103.02 -104.253 13.5 + vertex 103.03 -104.745 13.5 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex 103.02 -104.253 13.5 + vertex 103.03 -104.255 13.5 + vertex 103.181 -103.786 13.5 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex 105.99 -104.5 13.5 + vertex 105.919 -104.987 13.5 + vertex 106 -104.5 13.5 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex 105.909 -104.984 13.5 + vertex 105.919 -104.987 13.5 + vertex 105.99 -104.5 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 105.909 -104.984 13.5 + vertex 105.684 -105.421 13.5 + vertex 105.919 -104.987 13.5 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex 105.676 -105.415 13.5 + vertex 105.684 -105.421 13.5 + vertex 105.909 -104.984 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 105.676 -105.415 13.5 + vertex 105.32 -105.756 13.5 + vertex 105.684 -105.421 13.5 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex 105.315 -105.747 13.5 + vertex 105.32 -105.756 13.5 + vertex 105.676 -105.415 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 105.315 -105.747 13.5 + vertex 104.868 -105.954 13.5 + vertex 105.32 -105.756 13.5 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex 104.866 -105.944 13.5 + vertex 104.868 -105.954 13.5 + vertex 105.315 -105.747 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 104.377 -105.985 13.5 + vertex 104.868 -105.954 13.5 + vertex 104.866 -105.944 13.5 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex 104.377 -105.985 13.5 + vertex 104.376 -105.995 13.5 + vertex 104.868 -105.954 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 103.901 -105.865 13.5 + vertex 104.376 -105.995 13.5 + vertex 104.377 -105.985 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 103.901 -105.865 13.5 + vertex 103.897 -105.874 13.5 + vertex 104.376 -105.995 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 103.491 -105.596 13.5 + vertex 103.897 -105.874 13.5 + vertex 103.901 -105.865 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 103.491 -105.596 13.5 + vertex 103.484 -105.604 13.5 + vertex 103.897 -105.874 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 103.19 -105.209 13.5 + vertex 103.484 -105.604 13.5 + vertex 103.491 -105.596 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 103.19 -105.209 13.5 + vertex 103.181 -105.214 13.5 + vertex 103.484 -105.604 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 103.03 -104.745 13.5 + vertex 103.181 -105.214 13.5 + vertex 103.19 -105.209 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 103.03 -104.745 13.5 + vertex 103.02 -104.747 13.5 + vertex 103.181 -105.214 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 103.02 -104.747 13.5 + vertex 103.03 -104.745 13.5 + vertex 103.02 -104.253 13.5 + endloop + endfacet + facet normal 0.546943 -0.83717 0 + outer loop + vertex 103.484 -103.396 13.5 + vertex 103.897 -103.126 20.5 + vertex 103.484 -103.396 20.5 + endloop + endfacet + facet normal 0.546943 -0.83717 0 + outer loop + vertex 103.897 -103.126 20.5 + vertex 103.484 -103.396 13.5 + vertex 103.897 -103.126 13.5 + endloop + endfacet + facet normal -0.98636 0.164599 0 + outer loop + vertex 105.919 -104.987 13.5 + vertex 106 -104.5 20.5 + vertex 106 -104.5 13.5 + endloop + endfacet + facet normal -0.98636 0.164599 0 + outer loop + vertex 106 -104.5 20.5 + vertex 105.919 -104.987 13.5 + vertex 105.919 -104.987 20.5 + endloop + endfacet + facet normal 0.945823 0.324684 0 + outer loop + vertex 103.181 -105.214 20.5 + vertex 103.02 -104.747 13.5 + vertex 103.02 -104.747 20.5 + endloop + endfacet + facet normal 0.945823 0.324684 0 + outer loop + vertex 103.02 -104.747 13.5 + vertex 103.181 -105.214 20.5 + vertex 103.181 -105.214 13.5 + endloop + endfacet + facet normal -0.677285 0.73572 0 + outer loop + vertex 105.684 -105.421 13.5 + vertex 105.32 -105.756 20.5 + vertex 105.684 -105.421 20.5 + endloop + endfacet + facet normal -0.677285 0.73572 0 + outer loop + vertex 105.32 -105.756 20.5 + vertex 105.684 -105.421 13.5 + vertex 105.32 -105.756 13.5 + endloop + endfacet + facet normal -0.879474 0.475946 0 + outer loop + vertex 105.684 -105.421 13.5 + vertex 105.919 -104.987 20.5 + vertex 105.919 -104.987 13.5 + endloop + endfacet + facet normal -0.879474 0.475946 0 + outer loop + vertex 105.919 -104.987 20.5 + vertex 105.684 -105.421 13.5 + vertex 105.684 -105.421 20.5 + endloop + endfacet + facet normal 0.245487 0.9694 -0 + outer loop + vertex 104.376 -105.995 13.5 + vertex 103.897 -105.874 20.5 + vertex 104.376 -105.995 20.5 + endloop + endfacet + facet normal 0.245487 0.9694 0 + outer loop + vertex 103.897 -105.874 20.5 + vertex 104.376 -105.995 13.5 + vertex 103.897 -105.874 13.5 + endloop + endfacet + facet normal 0.789137 0.614218 0 + outer loop + vertex 103.484 -105.604 20.5 + vertex 103.181 -105.214 13.5 + vertex 103.181 -105.214 20.5 + endloop + endfacet + facet normal 0.789137 0.614218 0 + outer loop + vertex 103.181 -105.214 13.5 + vertex 103.484 -105.604 20.5 + vertex 103.484 -105.604 13.5 + endloop + endfacet + facet normal 0.546943 0.83717 -0 + outer loop + vertex 103.897 -105.874 13.5 + vertex 103.484 -105.604 20.5 + vertex 103.897 -105.874 20.5 + endloop + endfacet + facet normal 0.546943 0.83717 0 + outer loop + vertex 103.484 -105.604 20.5 + vertex 103.897 -105.874 13.5 + vertex 103.484 -105.604 13.5 + endloop + endfacet + facet normal 0.995974 0.0896469 0 + outer loop + vertex 107.25 -104.5 25.08 + vertex 107.206 -104.009 22.1 + vertex 107.206 -104.009 25.08 + endloop + endfacet + facet normal 0.995974 0.0896469 0 + outer loop + vertex 107.206 -104.009 22.1 + vertex 107.25 -104.5 25.08 + vertex 107.25 -104.5 22.1 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex 101.761 -104.747 22.1 + vertex 101.761 -104.253 25.08 + vertex 101.761 -104.253 22.1 + endloop + endfacet + facet normal -1 -0 0 + outer loop + vertex 101.761 -104.253 25.08 + vertex 101.761 -104.747 22.1 + vertex 101.761 -104.747 25.08 + endloop + endfacet + facet normal 0.0448622 0.998993 -0 + outer loop + vertex 104.869 -101.775 22.1 + vertex 104.377 -101.753 25.08 + vertex 104.869 -101.775 25.08 + endloop + endfacet + facet normal 0.0448622 0.998993 0 + outer loop + vertex 104.377 -101.753 25.08 + vertex 104.869 -101.775 22.1 + vertex 104.377 -101.753 22.1 + endloop + endfacet + facet normal 0.0448622 -0.998993 0 + outer loop + vertex 104.377 -107.247 22.1 + vertex 104.869 -107.225 25.08 + vertex 104.377 -107.247 25.08 + endloop + endfacet + facet normal 0.0448622 -0.998993 0 + outer loop + vertex 104.869 -107.225 25.08 + vertex 104.377 -107.247 22.1 + vertex 104.869 -107.225 22.1 + endloop + endfacet + facet normal 0.809016 -0.587786 0 + outer loop + vertex 106.571 -106.309 25.08 + vertex 106.861 -105.91 22.1 + vertex 106.861 -105.91 25.08 + endloop + endfacet + facet normal 0.809016 -0.587786 0 + outer loop + vertex 106.861 -105.91 22.1 + vertex 106.571 -106.309 25.08 + vertex 106.571 -106.309 22.1 + endloop + endfacet + facet normal 0.691067 0.722791 -0 + outer loop + vertex 106.571 -102.691 22.1 + vertex 106.215 -102.35 25.08 + vertex 106.571 -102.691 25.08 + endloop + endfacet + facet normal 0.691067 0.722791 0 + outer loop + vertex 106.215 -102.35 25.08 + vertex 106.571 -102.691 22.1 + vertex 106.215 -102.35 22.1 + endloop + endfacet + facet normal -0.753075 0.657935 0 + outer loop + vertex 102.275 -102.884 22.1 + vertex 102.6 -102.512 25.08 + vertex 102.6 -102.512 22.1 + endloop + endfacet + facet normal -0.753075 0.657935 0 + outer loop + vertex 102.6 -102.512 25.08 + vertex 102.275 -102.884 22.1 + vertex 102.275 -102.884 25.08 + endloop + endfacet + facet normal -0.47387 0.880595 0 + outer loop + vertex 103.419 -101.971 22.1 + vertex 102.985 -102.205 25.08 + vertex 103.419 -101.971 25.08 + endloop + endfacet + facet normal -0.47387 0.880595 0 + outer loop + vertex 102.985 -102.205 25.08 + vertex 103.419 -101.971 22.1 + vertex 102.985 -102.205 22.1 + endloop + endfacet + facet normal 0.963965 -0.26603 0 + outer loop + vertex 107.075 -105.466 25.08 + vertex 107.206 -104.991 22.1 + vertex 107.206 -104.991 25.08 + endloop + endfacet + facet normal 0.963965 -0.26603 0 + outer loop + vertex 107.206 -104.991 22.1 + vertex 107.075 -105.466 25.08 + vertex 107.075 -105.466 22.1 + endloop + endfacet + facet normal 0.90097 0.433881 0 + outer loop + vertex 107.075 -103.534 25.08 + vertex 106.861 -103.09 22.1 + vertex 106.861 -103.09 25.08 + endloop + endfacet + facet normal 0.90097 0.433881 0 + outer loop + vertex 106.861 -103.09 22.1 + vertex 107.075 -103.534 25.08 + vertex 107.075 -103.534 22.1 + endloop + endfacet + facet normal 0.963965 0.26603 0 + outer loop + vertex 107.206 -104.009 25.08 + vertex 107.075 -103.534 22.1 + vertex 107.075 -103.534 25.08 + endloop + endfacet + facet normal 0.963965 0.26603 0 + outer loop + vertex 107.075 -103.534 22.1 + vertex 107.206 -104.009 25.08 + vertex 107.206 -104.009 22.1 + endloop + endfacet + facet normal 0.809016 0.587786 0 + outer loop + vertex 106.861 -103.09 25.08 + vertex 106.571 -102.691 22.1 + vertex 106.571 -102.691 25.08 + endloop + endfacet + facet normal 0.809016 0.587786 0 + outer loop + vertex 106.571 -102.691 22.1 + vertex 106.861 -103.09 25.08 + vertex 106.861 -103.09 22.1 + endloop + endfacet + facet normal 0.393015 0.919532 -0 + outer loop + vertex 105.803 -102.078 22.1 + vertex 105.35 -101.885 25.08 + vertex 105.803 -102.078 25.08 + endloop + endfacet + facet normal 0.393015 0.919532 0 + outer loop + vertex 105.35 -101.885 25.08 + vertex 105.803 -102.078 22.1 + vertex 105.35 -101.885 22.1 + endloop + endfacet + facet normal 0.222531 0.974926 -0 + outer loop + vertex 105.35 -101.885 22.1 + vertex 104.869 -101.775 25.08 + vertex 105.35 -101.885 25.08 + endloop + endfacet + facet normal 0.222531 0.974926 0 + outer loop + vertex 104.869 -101.775 25.08 + vertex 105.35 -101.885 22.1 + vertex 104.869 -101.775 22.1 + endloop + endfacet + facet normal 0.550891 0.834577 -0 + outer loop + vertex 106.215 -102.35 22.1 + vertex 105.803 -102.078 25.08 + vertex 106.215 -102.35 25.08 + endloop + endfacet + facet normal 0.550891 0.834577 0 + outer loop + vertex 105.803 -102.078 25.08 + vertex 106.215 -102.35 22.1 + vertex 105.803 -102.078 22.1 + endloop + endfacet + facet normal -0.936235 0.351374 0 + outer loop + vertex 101.849 -103.768 22.1 + vertex 102.022 -103.307 25.08 + vertex 102.022 -103.307 22.1 + endloop + endfacet + facet normal -0.936235 0.351374 0 + outer loop + vertex 102.022 -103.307 25.08 + vertex 101.849 -103.768 22.1 + vertex 101.849 -103.768 25.08 + endloop + endfacet + facet normal -0.85845 0.512897 0 + outer loop + vertex 102.022 -103.307 22.1 + vertex 102.275 -102.884 25.08 + vertex 102.275 -102.884 22.1 + endloop + endfacet + facet normal -0.85845 0.512897 0 + outer loop + vertex 102.275 -102.884 25.08 + vertex 102.022 -103.307 22.1 + vertex 102.022 -103.307 25.08 + endloop + endfacet + facet normal -0.983928 0.178565 0 + outer loop + vertex 101.761 -104.253 22.1 + vertex 101.849 -103.768 25.08 + vertex 101.849 -103.768 22.1 + endloop + endfacet + facet normal -0.983928 0.178565 0 + outer loop + vertex 101.849 -103.768 25.08 + vertex 101.761 -104.253 22.1 + vertex 101.761 -104.253 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 105.943 -104.5 25.08 + vertex 107.25 -104.5 25.08 + vertex 107.206 -104.009 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 105.943 -104.5 25.08 + vertex 107.206 -104.009 25.08 + vertex 107.075 -103.534 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 107.25 -104.5 25.08 + vertex 105.943 -104.5 25.08 + vertex 107.206 -104.991 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 105.943 -104.5 25.08 + vertex 107.075 -103.534 25.08 + vertex 106.861 -103.09 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 107.206 -104.991 25.08 + vertex 105.943 -104.5 25.08 + vertex 107.075 -105.466 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 105.222 -103.25 25.08 + vertex 106.861 -103.09 25.08 + vertex 106.571 -102.691 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 107.075 -105.466 25.08 + vertex 105.943 -104.5 25.08 + vertex 106.861 -105.91 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 105.222 -103.25 25.08 + vertex 106.571 -102.691 25.08 + vertex 106.215 -102.35 25.08 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex 105.222 -105.75 25.08 + vertex 106.861 -105.91 25.08 + vertex 105.943 -104.5 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 106.861 -105.91 25.08 + vertex 105.222 -105.75 25.08 + vertex 106.571 -106.309 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 105.222 -103.25 25.08 + vertex 106.215 -102.35 25.08 + vertex 105.803 -102.078 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 105.222 -103.25 25.08 + vertex 105.803 -102.078 25.08 + vertex 105.35 -101.885 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 106.861 -103.09 25.08 + vertex 105.222 -103.25 25.08 + vertex 105.943 -104.5 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 104.869 -101.775 25.08 + vertex 105.222 -103.25 25.08 + vertex 105.35 -101.885 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 104.377 -101.753 25.08 + vertex 105.222 -103.25 25.08 + vertex 104.869 -101.775 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 103.778 -103.25 25.08 + vertex 104.377 -101.753 25.08 + vertex 103.888 -101.819 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 104.377 -101.753 25.08 + vertex 103.778 -103.25 25.08 + vertex 105.222 -103.25 25.08 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex 103.419 -101.971 25.08 + vertex 103.778 -103.25 25.08 + vertex 103.888 -101.819 25.08 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex 102.985 -102.205 25.08 + vertex 103.778 -103.25 25.08 + vertex 103.419 -101.971 25.08 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex 102.6 -102.512 25.08 + vertex 103.778 -103.25 25.08 + vertex 102.985 -102.205 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 106.571 -106.309 25.08 + vertex 105.222 -105.75 25.08 + vertex 106.215 -106.65 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 106.215 -106.65 25.08 + vertex 105.222 -105.75 25.08 + vertex 105.803 -106.922 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 105.803 -106.922 25.08 + vertex 105.222 -105.75 25.08 + vertex 105.35 -107.115 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 105.222 -105.75 25.08 + vertex 104.869 -107.225 25.08 + vertex 105.35 -107.115 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 105.222 -105.75 25.08 + vertex 104.377 -107.247 25.08 + vertex 104.869 -107.225 25.08 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex 103.778 -105.75 25.08 + vertex 104.377 -107.247 25.08 + vertex 105.222 -105.75 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 104.377 -107.247 25.08 + vertex 103.778 -105.75 25.08 + vertex 103.888 -107.181 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 103.778 -105.75 25.08 + vertex 103.419 -107.029 25.08 + vertex 103.888 -107.181 25.08 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex 102.022 -105.693 25.08 + vertex 103.778 -105.75 25.08 + vertex 103.057 -104.5 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 103.778 -105.75 25.08 + vertex 102.985 -106.795 25.08 + vertex 103.419 -107.029 25.08 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex 102.275 -102.884 25.08 + vertex 103.778 -103.25 25.08 + vertex 102.6 -102.512 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 102.022 -103.307 25.08 + vertex 103.778 -103.25 25.08 + vertex 102.275 -102.884 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 103.778 -105.75 25.08 + vertex 102.6 -106.488 25.08 + vertex 102.985 -106.795 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 103.778 -103.25 25.08 + vertex 102.022 -103.307 25.08 + vertex 103.057 -104.5 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 103.778 -105.75 25.08 + vertex 102.275 -106.116 25.08 + vertex 102.6 -106.488 25.08 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex 101.849 -103.768 25.08 + vertex 103.057 -104.5 25.08 + vertex 102.022 -103.307 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 103.778 -105.75 25.08 + vertex 102.022 -105.693 25.08 + vertex 102.275 -106.116 25.08 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex 101.761 -104.253 25.08 + vertex 103.057 -104.5 25.08 + vertex 101.849 -103.768 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 103.057 -104.5 25.08 + vertex 101.849 -105.232 25.08 + vertex 102.022 -105.693 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 101.761 -104.747 25.08 + vertex 103.057 -104.5 25.08 + vertex 101.761 -104.253 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 103.057 -104.5 25.08 + vertex 101.761 -104.747 25.08 + vertex 101.849 -105.232 25.08 + endloop + endfacet + facet normal -0.62349 0.781831 0 + outer loop + vertex 102.985 -102.205 22.1 + vertex 102.6 -102.512 25.08 + vertex 102.985 -102.205 25.08 + endloop + endfacet + facet normal -0.62349 0.781831 0 + outer loop + vertex 102.6 -102.512 25.08 + vertex 102.985 -102.205 22.1 + vertex 102.6 -102.512 22.1 + endloop + endfacet + facet normal -0.134229 0.99095 0 + outer loop + vertex 104.377 -101.753 22.1 + vertex 103.888 -101.819 25.08 + vertex 104.377 -101.753 25.08 + endloop + endfacet + facet normal -0.134229 0.99095 0 + outer loop + vertex 103.888 -101.819 25.08 + vertex 104.377 -101.753 22.1 + vertex 103.888 -101.819 22.1 + endloop + endfacet + facet normal 0.995974 -0.0896469 0 + outer loop + vertex 107.206 -104.991 25.08 + vertex 107.25 -104.5 22.1 + vertex 107.25 -104.5 25.08 + endloop + endfacet + facet normal 0.995974 -0.0896469 0 + outer loop + vertex 107.25 -104.5 22.1 + vertex 107.206 -104.991 25.08 + vertex 107.206 -104.991 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 105.99 -104.5 22.1 + vertex 107.25 -104.5 22.1 + vertex 107.206 -104.991 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 105.909 -104.984 22.1 + vertex 107.206 -104.991 22.1 + vertex 107.075 -105.466 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 107.25 -104.5 22.1 + vertex 105.99 -104.5 22.1 + vertex 107.206 -104.009 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 105.909 -104.984 22.1 + vertex 107.075 -105.466 22.1 + vertex 106.861 -105.91 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 105.909 -104.016 22.1 + vertex 107.206 -104.009 22.1 + vertex 105.99 -104.5 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 105.676 -105.415 22.1 + vertex 106.861 -105.91 22.1 + vertex 106.571 -106.309 22.1 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 107.206 -104.009 22.1 + vertex 105.909 -104.016 22.1 + vertex 107.075 -103.534 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 105.676 -105.415 22.1 + vertex 106.571 -106.309 22.1 + vertex 106.215 -106.65 22.1 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 107.075 -103.534 22.1 + vertex 105.909 -104.016 22.1 + vertex 106.861 -103.09 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 105.676 -103.585 22.1 + vertex 106.861 -103.09 22.1 + vertex 105.909 -104.016 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 107.206 -104.991 22.1 + vertex 105.909 -104.984 22.1 + vertex 105.99 -104.5 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 105.315 -105.747 22.1 + vertex 106.215 -106.65 22.1 + vertex 105.803 -106.922 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 106.861 -105.91 22.1 + vertex 105.676 -105.415 22.1 + vertex 105.909 -104.984 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 104.866 -105.944 22.1 + vertex 105.803 -106.922 22.1 + vertex 105.35 -107.115 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 106.215 -106.65 22.1 + vertex 105.315 -105.747 22.1 + vertex 105.676 -105.415 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 104.866 -105.944 22.1 + vertex 105.35 -107.115 22.1 + vertex 104.869 -107.225 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 105.803 -106.922 22.1 + vertex 104.866 -105.944 22.1 + vertex 105.315 -105.747 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 104.869 -107.225 22.1 + vertex 104.377 -105.985 22.1 + vertex 104.866 -105.944 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 104.377 -107.247 22.1 + vertex 104.377 -105.985 22.1 + vertex 104.869 -107.225 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.888 -107.181 22.1 + vertex 104.377 -105.985 22.1 + vertex 104.377 -107.247 22.1 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 104.377 -105.985 22.1 + vertex 103.888 -107.181 22.1 + vertex 103.901 -105.865 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.419 -107.029 22.1 + vertex 103.901 -105.865 22.1 + vertex 103.888 -107.181 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 102.985 -106.795 22.1 + vertex 103.901 -105.865 22.1 + vertex 103.419 -107.029 22.1 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 103.901 -105.865 22.1 + vertex 102.985 -106.795 22.1 + vertex 103.491 -105.596 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 102.6 -106.488 22.1 + vertex 103.491 -105.596 22.1 + vertex 102.985 -106.795 22.1 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 103.491 -105.596 22.1 + vertex 102.275 -106.116 22.1 + vertex 103.19 -105.209 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 102.275 -106.116 22.1 + vertex 103.491 -105.596 22.1 + vertex 102.6 -106.488 22.1 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 106.861 -103.09 22.1 + vertex 105.676 -103.585 22.1 + vertex 106.571 -102.691 22.1 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 106.571 -102.691 22.1 + vertex 105.676 -103.585 22.1 + vertex 106.215 -102.35 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 105.315 -103.253 22.1 + vertex 106.215 -102.35 22.1 + vertex 105.676 -103.585 22.1 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 106.215 -102.35 22.1 + vertex 105.315 -103.253 22.1 + vertex 105.803 -102.078 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 104.866 -103.056 22.1 + vertex 105.803 -102.078 22.1 + vertex 105.315 -103.253 22.1 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 105.803 -102.078 22.1 + vertex 104.866 -103.056 22.1 + vertex 105.35 -101.885 22.1 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 105.35 -101.885 22.1 + vertex 104.866 -103.056 22.1 + vertex 104.869 -101.775 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 104.377 -103.015 22.1 + vertex 104.869 -101.775 22.1 + vertex 104.866 -103.056 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 104.377 -103.015 22.1 + vertex 104.377 -101.753 22.1 + vertex 104.869 -101.775 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.888 -101.819 22.1 + vertex 104.377 -103.015 22.1 + vertex 103.901 -103.135 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 104.377 -103.015 22.1 + vertex 103.888 -101.819 22.1 + vertex 104.377 -101.753 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 102.985 -102.205 22.1 + vertex 103.901 -103.135 22.1 + vertex 103.491 -103.404 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.901 -103.135 22.1 + vertex 103.419 -101.971 22.1 + vertex 103.888 -101.819 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 102.275 -102.884 22.1 + vertex 103.491 -103.404 22.1 + vertex 103.19 -103.791 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 101.849 -103.768 22.1 + vertex 103.19 -103.791 22.1 + vertex 103.03 -104.255 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.901 -103.135 22.1 + vertex 102.985 -102.205 22.1 + vertex 103.419 -101.971 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 102.022 -105.693 22.1 + vertex 103.19 -105.209 22.1 + vertex 102.275 -106.116 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 101.849 -105.232 22.1 + vertex 103.19 -105.209 22.1 + vertex 102.022 -105.693 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.491 -103.404 22.1 + vertex 102.6 -102.512 22.1 + vertex 102.985 -102.205 22.1 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 103.19 -105.209 22.1 + vertex 101.849 -105.232 22.1 + vertex 103.03 -104.745 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.491 -103.404 22.1 + vertex 102.275 -102.884 22.1 + vertex 102.6 -102.512 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 101.761 -104.747 22.1 + vertex 103.03 -104.745 22.1 + vertex 101.849 -105.232 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.19 -103.791 22.1 + vertex 102.022 -103.307 22.1 + vertex 102.275 -102.884 22.1 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 103.03 -104.745 22.1 + vertex 101.761 -104.747 22.1 + vertex 103.03 -104.255 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.19 -103.791 22.1 + vertex 101.849 -103.768 22.1 + vertex 102.022 -103.307 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 101.761 -104.253 22.1 + vertex 103.03 -104.255 22.1 + vertex 101.761 -104.747 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.03 -104.255 22.1 + vertex 101.761 -104.253 22.1 + vertex 101.849 -103.768 22.1 + endloop + endfacet + facet normal 0.222531 -0.974926 0 + outer loop + vertex 104.869 -107.225 22.1 + vertex 105.35 -107.115 25.08 + vertex 104.869 -107.225 25.08 + endloop + endfacet + facet normal 0.222531 -0.974926 0 + outer loop + vertex 105.35 -107.115 25.08 + vertex 104.869 -107.225 22.1 + vertex 105.35 -107.115 22.1 + endloop + endfacet + facet normal -0.309018 0.951056 0 + outer loop + vertex 103.888 -101.819 22.1 + vertex 103.419 -101.971 25.08 + vertex 103.888 -101.819 25.08 + endloop + endfacet + facet normal -0.309018 0.951056 0 + outer loop + vertex 103.419 -101.971 25.08 + vertex 103.888 -101.819 22.1 + vertex 103.419 -101.971 22.1 + endloop + endfacet + facet normal 0.90097 -0.433881 0 + outer loop + vertex 106.861 -105.91 25.08 + vertex 107.075 -105.466 22.1 + vertex 107.075 -105.466 25.08 + endloop + endfacet + facet normal 0.90097 -0.433881 0 + outer loop + vertex 107.075 -105.466 22.1 + vertex 106.861 -105.91 25.08 + vertex 106.861 -105.91 22.1 + endloop + endfacet + facet normal -0.85845 -0.512897 0 + outer loop + vertex 102.275 -106.116 22.1 + vertex 102.022 -105.693 25.08 + vertex 102.022 -105.693 22.1 + endloop + endfacet + facet normal -0.85845 -0.512897 0 + outer loop + vertex 102.022 -105.693 25.08 + vertex 102.275 -106.116 22.1 + vertex 102.275 -106.116 25.08 + endloop + endfacet + facet normal -0.983928 -0.178565 0 + outer loop + vertex 101.849 -105.232 22.1 + vertex 101.761 -104.747 25.08 + vertex 101.761 -104.747 22.1 + endloop + endfacet + facet normal -0.983928 -0.178565 0 + outer loop + vertex 101.761 -104.747 25.08 + vertex 101.849 -105.232 22.1 + vertex 101.849 -105.232 25.08 + endloop + endfacet + facet normal 0.550891 -0.834577 0 + outer loop + vertex 105.803 -106.922 22.1 + vertex 106.215 -106.65 25.08 + vertex 105.803 -106.922 25.08 + endloop + endfacet + facet normal 0.550891 -0.834577 0 + outer loop + vertex 106.215 -106.65 25.08 + vertex 105.803 -106.922 22.1 + vertex 106.215 -106.65 22.1 + endloop + endfacet + facet normal 0.393015 -0.919532 0 + outer loop + vertex 105.35 -107.115 22.1 + vertex 105.803 -106.922 25.08 + vertex 105.35 -107.115 25.08 + endloop + endfacet + facet normal 0.393015 -0.919532 0 + outer loop + vertex 105.803 -106.922 25.08 + vertex 105.35 -107.115 22.1 + vertex 105.803 -106.922 22.1 + endloop + endfacet + facet normal -0.47387 -0.880595 0 + outer loop + vertex 102.985 -106.795 22.1 + vertex 103.419 -107.029 25.08 + vertex 102.985 -106.795 25.08 + endloop + endfacet + facet normal -0.47387 -0.880595 -0 + outer loop + vertex 103.419 -107.029 25.08 + vertex 102.985 -106.795 22.1 + vertex 103.419 -107.029 22.1 + endloop + endfacet + facet normal -0.309018 -0.951056 0 + outer loop + vertex 103.419 -107.029 22.1 + vertex 103.888 -107.181 25.08 + vertex 103.419 -107.029 25.08 + endloop + endfacet + facet normal -0.309018 -0.951056 -0 + outer loop + vertex 103.888 -107.181 25.08 + vertex 103.419 -107.029 22.1 + vertex 103.888 -107.181 22.1 + endloop + endfacet + facet normal -0.134229 -0.99095 0 + outer loop + vertex 103.888 -107.181 22.1 + vertex 104.377 -107.247 25.08 + vertex 103.888 -107.181 25.08 + endloop + endfacet + facet normal -0.134229 -0.99095 -0 + outer loop + vertex 104.377 -107.247 25.08 + vertex 103.888 -107.181 22.1 + vertex 104.377 -107.247 22.1 + endloop + endfacet + facet normal -0.936235 -0.351374 0 + outer loop + vertex 102.022 -105.693 22.1 + vertex 101.849 -105.232 25.08 + vertex 101.849 -105.232 22.1 + endloop + endfacet + facet normal -0.936235 -0.351374 0 + outer loop + vertex 101.849 -105.232 25.08 + vertex 102.022 -105.693 22.1 + vertex 102.022 -105.693 25.08 + endloop + endfacet + facet normal 0.691067 -0.722791 0 + outer loop + vertex 106.215 -106.65 22.1 + vertex 106.571 -106.309 25.08 + vertex 106.215 -106.65 25.08 + endloop + endfacet + facet normal 0.691067 -0.722791 0 + outer loop + vertex 106.571 -106.309 25.08 + vertex 106.215 -106.65 22.1 + vertex 106.571 -106.309 22.1 + endloop + endfacet + facet normal -0.753075 -0.657935 0 + outer loop + vertex 102.6 -106.488 22.1 + vertex 102.275 -106.116 25.08 + vertex 102.275 -106.116 22.1 + endloop + endfacet + facet normal -0.753075 -0.657935 0 + outer loop + vertex 102.275 -106.116 25.08 + vertex 102.6 -106.488 22.1 + vertex 102.6 -106.488 25.08 + endloop + endfacet + facet normal -0.62349 -0.781831 0 + outer loop + vertex 102.6 -106.488 22.1 + vertex 102.985 -106.795 25.08 + vertex 102.6 -106.488 25.08 + endloop + endfacet + facet normal -0.62349 -0.781831 -0 + outer loop + vertex 102.985 -106.795 25.08 + vertex 102.6 -106.488 22.1 + vertex 102.985 -106.795 22.1 + endloop + endfacet + facet normal 0.986363 0.164583 0 + outer loop + vertex 105.99 -104.5 20.5 + vertex 105.909 -104.016 13.5 + vertex 105.909 -104.016 20.5 + endloop + endfacet + facet normal 0.986363 0.164583 0 + outer loop + vertex 105.909 -104.016 13.5 + vertex 105.99 -104.5 20.5 + vertex 105.99 -104.5 13.5 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex 103.03 -104.745 13.5 + vertex 103.03 -104.255 20.5 + vertex 103.03 -104.255 13.5 + endloop + endfacet + facet normal -1 -0 0 + outer loop + vertex 103.03 -104.255 20.5 + vertex 103.03 -104.745 13.5 + vertex 103.03 -104.745 20.5 + endloop + endfacet + facet normal -0.245484 0.969401 0 + outer loop + vertex 104.377 -103.015 13.5 + vertex 103.901 -103.135 20.5 + vertex 104.377 -103.015 20.5 + endloop + endfacet + facet normal -0.245484 0.969401 0 + outer loop + vertex 103.901 -103.135 20.5 + vertex 104.377 -103.015 13.5 + vertex 103.901 -103.135 13.5 + endloop + endfacet + facet normal 0.0825782 -0.996585 0 + outer loop + vertex 104.377 -105.985 13.5 + vertex 104.866 -105.944 20.5 + vertex 104.377 -105.985 20.5 + endloop + endfacet + facet normal 0.0825782 -0.996585 0 + outer loop + vertex 104.866 -105.944 20.5 + vertex 104.377 -105.985 13.5 + vertex 104.866 -105.944 13.5 + endloop + endfacet + facet normal 0.401702 0.915771 -0 + outer loop + vertex 105.315 -103.253 13.5 + vertex 104.866 -103.056 20.5 + vertex 105.315 -103.253 20.5 + endloop + endfacet + facet normal 0.401702 0.915771 0 + outer loop + vertex 104.866 -103.056 20.5 + vertex 105.315 -103.253 13.5 + vertex 104.866 -103.056 13.5 + endloop + endfacet + facet normal 0.0825782 0.996585 -0 + outer loop + vertex 104.866 -103.056 13.5 + vertex 104.377 -103.015 20.5 + vertex 104.866 -103.056 20.5 + endloop + endfacet + facet normal 0.0825782 0.996585 0 + outer loop + vertex 104.377 -103.015 20.5 + vertex 104.866 -103.056 13.5 + vertex 104.377 -103.015 13.5 + endloop + endfacet + facet normal -0.789139 0.614214 0 + outer loop + vertex 103.19 -103.791 13.5 + vertex 103.491 -103.404 20.5 + vertex 103.491 -103.404 13.5 + endloop + endfacet + facet normal -0.789139 0.614214 0 + outer loop + vertex 103.491 -103.404 20.5 + vertex 103.19 -103.791 13.5 + vertex 103.19 -103.791 20.5 + endloop + endfacet + facet normal -0.945816 0.324703 0 + outer loop + vertex 103.03 -104.255 13.5 + vertex 103.19 -103.791 20.5 + vertex 103.19 -103.791 13.5 + endloop + endfacet + facet normal -0.945816 0.324703 0 + outer loop + vertex 103.19 -103.791 20.5 + vertex 103.03 -104.255 13.5 + vertex 103.03 -104.255 20.5 + endloop + endfacet + facet normal -0.546948 0.837167 0 + outer loop + vertex 103.901 -103.135 13.5 + vertex 103.491 -103.404 20.5 + vertex 103.901 -103.135 20.5 + endloop + endfacet + facet normal -0.546948 0.837167 0 + outer loop + vertex 103.491 -103.404 20.5 + vertex 103.901 -103.135 13.5 + vertex 103.491 -103.404 13.5 + endloop + endfacet + facet normal -0.245484 -0.969401 0 + outer loop + vertex 103.901 -105.865 13.5 + vertex 104.377 -105.985 20.5 + vertex 103.901 -105.865 20.5 + endloop + endfacet + facet normal -0.245484 -0.969401 -0 + outer loop + vertex 104.377 -105.985 20.5 + vertex 103.901 -105.865 13.5 + vertex 104.377 -105.985 13.5 + endloop + endfacet + facet normal 0.677276 0.735729 -0 + outer loop + vertex 105.676 -103.585 13.5 + vertex 105.315 -103.253 20.5 + vertex 105.676 -103.585 20.5 + endloop + endfacet + facet normal 0.677276 0.735729 0 + outer loop + vertex 105.315 -103.253 20.5 + vertex 105.676 -103.585 13.5 + vertex 105.315 -103.253 13.5 + endloop + endfacet + facet normal 0.87947 0.475954 0 + outer loop + vertex 105.909 -104.016 20.5 + vertex 105.676 -103.585 13.5 + vertex 105.676 -103.585 20.5 + endloop + endfacet + facet normal 0.87947 0.475954 0 + outer loop + vertex 105.676 -103.585 13.5 + vertex 105.909 -104.016 20.5 + vertex 105.909 -104.016 13.5 + endloop + endfacet + facet normal 0.401702 -0.915771 0 + outer loop + vertex 104.866 -105.944 13.5 + vertex 105.315 -105.747 20.5 + vertex 104.866 -105.944 20.5 + endloop + endfacet + facet normal 0.401702 -0.915771 0 + outer loop + vertex 105.315 -105.747 20.5 + vertex 104.866 -105.944 13.5 + vertex 105.315 -105.747 13.5 + endloop + endfacet + facet normal 0.986363 -0.164583 0 + outer loop + vertex 105.909 -104.984 20.5 + vertex 105.99 -104.5 13.5 + vertex 105.99 -104.5 20.5 + endloop + endfacet + facet normal 0.986363 -0.164583 0 + outer loop + vertex 105.99 -104.5 13.5 + vertex 105.909 -104.984 20.5 + vertex 105.909 -104.984 13.5 + endloop + endfacet + facet normal -0.546948 -0.837167 0 + outer loop + vertex 103.491 -105.596 13.5 + vertex 103.901 -105.865 20.5 + vertex 103.491 -105.596 20.5 + endloop + endfacet + facet normal -0.546948 -0.837167 -0 + outer loop + vertex 103.901 -105.865 20.5 + vertex 103.491 -105.596 13.5 + vertex 103.901 -105.865 13.5 + endloop + endfacet + facet normal -0.945816 -0.324703 0 + outer loop + vertex 103.19 -105.209 13.5 + vertex 103.03 -104.745 20.5 + vertex 103.03 -104.745 13.5 + endloop + endfacet + facet normal -0.945816 -0.324703 0 + outer loop + vertex 103.03 -104.745 20.5 + vertex 103.19 -105.209 13.5 + vertex 103.19 -105.209 20.5 + endloop + endfacet + facet normal 0.677276 -0.735729 0 + outer loop + vertex 105.315 -105.747 13.5 + vertex 105.676 -105.415 20.5 + vertex 105.315 -105.747 20.5 + endloop + endfacet + facet normal 0.677276 -0.735729 0 + outer loop + vertex 105.676 -105.415 20.5 + vertex 105.315 -105.747 13.5 + vertex 105.676 -105.415 13.5 + endloop + endfacet + facet normal -0.789139 -0.614214 0 + outer loop + vertex 103.491 -105.596 13.5 + vertex 103.19 -105.209 20.5 + vertex 103.19 -105.209 13.5 + endloop + endfacet + facet normal -0.789139 -0.614214 0 + outer loop + vertex 103.19 -105.209 20.5 + vertex 103.491 -105.596 13.5 + vertex 103.491 -105.596 20.5 + endloop + endfacet + facet normal 0.87947 -0.475954 0 + outer loop + vertex 105.676 -105.415 20.5 + vertex 105.909 -104.984 13.5 + vertex 105.909 -104.984 20.5 + endloop + endfacet + facet normal 0.87947 -0.475954 0 + outer loop + vertex 105.909 -104.984 13.5 + vertex 105.676 -105.415 20.5 + vertex 105.676 -105.415 13.5 + endloop + endfacet + facet normal -0.866026 -0.5 0 + outer loop + vertex 105.943 -104.5 24.0867 + vertex 105.222 -103.25 25.08 + vertex 105.222 -103.25 24.0867 + endloop + endfacet + facet normal -0.866026 -0.5 0 + outer loop + vertex 105.222 -103.25 25.08 + vertex 105.943 -104.5 24.0867 + vertex 105.943 -104.5 25.08 + endloop + endfacet + facet normal 0.866026 -0.5 0 + outer loop + vertex 103.057 -104.5 25.08 + vertex 103.778 -103.25 24.0867 + vertex 103.778 -103.25 25.08 + endloop + endfacet + facet normal 0.866026 -0.5 0 + outer loop + vertex 103.778 -103.25 24.0867 + vertex 103.057 -104.5 25.08 + vertex 103.057 -104.5 24.0867 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 103.778 -103.25 24.0867 + vertex 105.222 -103.25 25.08 + vertex 103.778 -103.25 25.08 + endloop + endfacet + facet normal 0 -1 -0 + outer loop + vertex 105.222 -103.25 25.08 + vertex 103.778 -103.25 24.0867 + vertex 105.222 -103.25 24.0867 + endloop + endfacet + facet normal -0.866026 0.5 0 + outer loop + vertex 105.222 -105.75 24.0867 + vertex 105.943 -104.5 25.08 + vertex 105.943 -104.5 24.0867 + endloop + endfacet + facet normal -0.866026 0.5 0 + outer loop + vertex 105.943 -104.5 25.08 + vertex 105.222 -105.75 24.0867 + vertex 105.222 -105.75 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 105.222 -103.25 24.0867 + vertex 105.222 -105.75 24.0867 + vertex 105.943 -104.5 24.0867 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex 103.778 -103.25 24.0867 + vertex 105.222 -105.75 24.0867 + vertex 105.222 -103.25 24.0867 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 103.778 -103.25 24.0867 + vertex 103.778 -105.75 24.0867 + vertex 105.222 -105.75 24.0867 + endloop + endfacet + facet normal 0 -0 1 + outer loop + vertex 103.778 -105.75 24.0867 + vertex 103.778 -103.25 24.0867 + vertex 103.057 -104.5 24.0867 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex 105.222 -105.75 24.0867 + vertex 103.778 -105.75 25.08 + vertex 105.222 -105.75 25.08 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 103.778 -105.75 25.08 + vertex 105.222 -105.75 24.0867 + vertex 103.778 -105.75 24.0867 + endloop + endfacet + facet normal 0.866026 0.5 0 + outer loop + vertex 103.778 -105.75 25.08 + vertex 103.057 -104.5 24.0867 + vertex 103.057 -104.5 25.08 + endloop + endfacet + facet normal 0.866026 0.5 0 + outer loop + vertex 103.057 -104.5 24.0867 + vertex 103.778 -105.75 25.08 + vertex 103.778 -105.75 24.0867 + endloop + endfacet + facet normal 0.866025 0.5 0 + outer loop + vertex 107 104.933 20.5 + vertex 105.875 106.882 0.5 + vertex 105.875 106.882 20.5 + endloop + endfacet + facet normal 0.866026 0.499999 -0 + outer loop + vertex 107.25 104.5 0.5 + vertex 107 104.933 20.5 + vertex 107.25 104.5 20.5 + endloop + endfacet + facet normal 0.866025 0.5 -3.46791e-008 + outer loop + vertex 107 104.933 20.5 + vertex 107.25 104.5 0.5 + vertex 105.875 106.882 0.5 + endloop + endfacet + facet normal -0.866025 0.5 0 + outer loop + vertex 101.75 104.5 0.5 + vertex 103.125 106.882 20.5 + vertex 103.125 106.882 0.5 + endloop + endfacet + facet normal -0.866025 0.5 0 + outer loop + vertex 103.125 106.882 20.5 + vertex 101.75 104.5 0.5 + vertex 101.75 104.5 20.5 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex 105.875 106.882 0.5 + vertex 103.125 106.882 20.5 + vertex 105.875 106.882 20.5 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 103.125 106.882 20.5 + vertex 105.875 106.882 0.5 + vertex 103.125 106.882 0.5 + endloop + endfacet + facet normal 0.866026 -0.499999 0 + outer loop + vertex 107 104.067 20.5 + vertex 107.25 104.5 0.5 + vertex 107.25 104.5 20.5 + endloop + endfacet + facet normal 0.866025 -0.5 0 + outer loop + vertex 105.875 102.118 0.5 + vertex 107 104.067 20.5 + vertex 105.875 102.118 20.5 + endloop + endfacet + facet normal 0.866025 -0.5 -3.46791e-008 + outer loop + vertex 107 104.067 20.5 + vertex 105.875 102.118 0.5 + vertex 107.25 104.5 0.5 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 107.25 104.5 0.5 + vertex 105.919 104.013 0.5 + vertex 106 104.5 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 105.684 103.579 0.5 + vertex 107.25 104.5 0.5 + vertex 105.875 102.118 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 107.25 104.5 0.5 + vertex 105.684 103.579 0.5 + vertex 105.919 104.013 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 105.875 102.118 0.5 + vertex 105.32 103.244 0.5 + vertex 105.684 103.579 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 105.875 102.118 0.5 + vertex 104.868 103.046 0.5 + vertex 105.32 103.244 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 105.875 102.118 0.5 + vertex 104.376 103.005 0.5 + vertex 104.868 103.046 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.125 102.118 0.5 + vertex 104.376 103.005 0.5 + vertex 105.875 102.118 0.5 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 104.376 103.005 0.5 + vertex 103.125 102.118 0.5 + vertex 103.897 103.126 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.125 102.118 0.5 + vertex 103.484 103.396 0.5 + vertex 103.897 103.126 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.125 102.118 0.5 + vertex 103.181 103.786 0.5 + vertex 103.484 103.396 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 101.75 104.5 0.5 + vertex 103.181 103.786 0.5 + vertex 103.125 102.118 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.02 104.253 0.5 + vertex 101.75 104.5 0.5 + vertex 103.02 104.747 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.181 103.786 0.5 + vertex 101.75 104.5 0.5 + vertex 103.02 104.253 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 105.919 104.987 0.5 + vertex 107.25 104.5 0.5 + vertex 106 104.5 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 105.684 105.421 0.5 + vertex 107.25 104.5 0.5 + vertex 105.919 104.987 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 107.25 104.5 0.5 + vertex 105.684 105.421 0.5 + vertex 105.875 106.882 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 105.32 105.756 0.5 + vertex 105.875 106.882 0.5 + vertex 105.684 105.421 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 104.868 105.954 0.5 + vertex 105.875 106.882 0.5 + vertex 105.32 105.756 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 104.376 105.995 0.5 + vertex 105.875 106.882 0.5 + vertex 104.868 105.954 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.125 106.882 0.5 + vertex 104.376 105.995 0.5 + vertex 103.897 105.874 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 104.376 105.995 0.5 + vertex 103.125 106.882 0.5 + vertex 105.875 106.882 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.484 105.604 0.5 + vertex 103.125 106.882 0.5 + vertex 103.897 105.874 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.181 105.214 0.5 + vertex 103.125 106.882 0.5 + vertex 103.484 105.604 0.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 101.75 104.5 0.5 + vertex 103.181 105.214 0.5 + vertex 103.02 104.747 0.5 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 103.181 105.214 0.5 + vertex 101.75 104.5 0.5 + vertex 103.125 106.882 0.5 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 103.125 102.118 0.5 + vertex 105.875 102.118 20.5 + vertex 103.125 102.118 20.5 + endloop + endfacet + facet normal 0 -1 -0 + outer loop + vertex 105.875 102.118 20.5 + vertex 103.125 102.118 0.5 + vertex 105.875 102.118 0.5 + endloop + endfacet + facet normal -0.866025 -0.5 0 + outer loop + vertex 103.125 102.118 0.5 + vertex 101.75 104.5 20.5 + vertex 101.75 104.5 0.5 + endloop + endfacet + facet normal -0.866025 -0.5 0 + outer loop + vertex 101.75 104.5 20.5 + vertex 103.125 102.118 0.5 + vertex 103.125 102.118 20.5 + endloop + endfacet + facet normal 0.98636 0.164599 0 + outer loop + vertex 106 104.5 0.5 + vertex 105.919 104.987 -6.5 + vertex 105.919 104.987 0.5 + endloop + endfacet + facet normal 0.98636 0.164599 0 + outer loop + vertex 105.919 104.987 -6.5 + vertex 106 104.5 0.5 + vertex 106 104.5 -6.5 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex 103.02 104.253 -6.5 + vertex 103.02 104.747 0.5 + vertex 103.02 104.747 -6.5 + endloop + endfacet + facet normal -1 -0 0 + outer loop + vertex 103.02 104.747 0.5 + vertex 103.02 104.253 -6.5 + vertex 103.02 104.253 0.5 + endloop + endfacet + facet normal 0.0825698 0.996585 -0 + outer loop + vertex 104.868 105.954 -6.5 + vertex 104.376 105.995 0.5 + vertex 104.868 105.954 0.5 + endloop + endfacet + facet normal 0.0825698 0.996585 0 + outer loop + vertex 104.376 105.995 0.5 + vertex 104.868 105.954 -6.5 + vertex 104.376 105.995 -6.5 + endloop + endfacet + facet normal 0.0825698 -0.996585 0 + outer loop + vertex 104.376 103.005 -6.5 + vertex 104.868 103.046 0.5 + vertex 104.376 103.005 0.5 + endloop + endfacet + facet normal 0.0825698 -0.996585 0 + outer loop + vertex 104.868 103.046 0.5 + vertex 104.376 103.005 -6.5 + vertex 104.868 103.046 -6.5 + endloop + endfacet + facet normal 0.401692 -0.915775 0 + outer loop + vertex 104.868 103.046 -6.5 + vertex 105.32 103.244 0.5 + vertex 104.868 103.046 0.5 + endloop + endfacet + facet normal 0.401692 -0.915775 0 + outer loop + vertex 105.32 103.244 0.5 + vertex 104.868 103.046 -6.5 + vertex 105.32 103.244 -6.5 + endloop + endfacet + facet normal 0.677285 0.73572 -0 + outer loop + vertex 105.684 105.421 -6.5 + vertex 105.32 105.756 0.5 + vertex 105.684 105.421 0.5 + endloop + endfacet + facet normal 0.677285 0.73572 0 + outer loop + vertex 105.32 105.756 0.5 + vertex 105.684 105.421 -6.5 + vertex 105.32 105.756 -6.5 + endloop + endfacet + facet normal 0.879474 0.475946 0 + outer loop + vertex 105.919 104.987 0.5 + vertex 105.684 105.421 -6.5 + vertex 105.684 105.421 0.5 + endloop + endfacet + facet normal 0.879474 0.475946 0 + outer loop + vertex 105.684 105.421 -6.5 + vertex 105.919 104.987 0.5 + vertex 105.919 104.987 -6.5 + endloop + endfacet + facet normal 0.401692 0.915775 -0 + outer loop + vertex 105.32 105.756 -6.5 + vertex 104.868 105.954 0.5 + vertex 105.32 105.756 0.5 + endloop + endfacet + facet normal 0.401692 0.915775 0 + outer loop + vertex 104.868 105.954 0.5 + vertex 105.32 105.756 -6.5 + vertex 104.868 105.954 -6.5 + endloop + endfacet + facet normal -0.789137 0.614218 0 + outer loop + vertex 103.181 105.214 -6.5 + vertex 103.484 105.604 0.5 + vertex 103.484 105.604 -6.5 + endloop + endfacet + facet normal -0.789137 0.614218 0 + outer loop + vertex 103.484 105.604 0.5 + vertex 103.181 105.214 -6.5 + vertex 103.181 105.214 0.5 + endloop + endfacet + facet normal -0.945823 0.324684 0 + outer loop + vertex 103.02 104.747 -6.5 + vertex 103.181 105.214 0.5 + vertex 103.181 105.214 -6.5 + endloop + endfacet + facet normal -0.945823 0.324684 0 + outer loop + vertex 103.181 105.214 0.5 + vertex 103.02 104.747 -6.5 + vertex 103.02 104.747 0.5 + endloop + endfacet + facet normal -0.245487 0.9694 0 + outer loop + vertex 104.376 105.995 -6.5 + vertex 103.897 105.874 0.5 + vertex 104.376 105.995 0.5 + endloop + endfacet + facet normal -0.245487 0.9694 0 + outer loop + vertex 103.897 105.874 0.5 + vertex 104.376 105.995 -6.5 + vertex 103.897 105.874 -6.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 105.919 104.013 -6.5 + vertex 105.919 104.987 -6.5 + vertex 106 104.5 -6.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 105.684 103.579 -6.5 + vertex 105.919 104.987 -6.5 + vertex 105.919 104.013 -6.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 105.684 103.579 -6.5 + vertex 105.684 105.421 -6.5 + vertex 105.919 104.987 -6.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 105.32 103.244 -6.5 + vertex 105.684 105.421 -6.5 + vertex 105.684 103.579 -6.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 105.32 103.244 -6.5 + vertex 105.32 105.756 -6.5 + vertex 105.684 105.421 -6.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 104.868 103.046 -6.5 + vertex 105.32 105.756 -6.5 + vertex 105.32 103.244 -6.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 104.868 103.046 -6.5 + vertex 104.868 105.954 -6.5 + vertex 105.32 105.756 -6.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 104.376 103.005 -6.5 + vertex 104.868 105.954 -6.5 + vertex 104.868 103.046 -6.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 104.376 103.005 -6.5 + vertex 104.376 105.995 -6.5 + vertex 104.868 105.954 -6.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.897 103.126 -6.5 + vertex 104.376 105.995 -6.5 + vertex 104.376 103.005 -6.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.897 103.126 -6.5 + vertex 103.897 105.874 -6.5 + vertex 104.376 105.995 -6.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.484 103.396 -6.5 + vertex 103.897 105.874 -6.5 + vertex 103.897 103.126 -6.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.484 103.396 -6.5 + vertex 103.484 105.604 -6.5 + vertex 103.897 105.874 -6.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.181 103.786 -6.5 + vertex 103.484 105.604 -6.5 + vertex 103.484 103.396 -6.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.181 103.786 -6.5 + vertex 103.181 105.214 -6.5 + vertex 103.484 105.604 -6.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.02 104.253 -6.5 + vertex 103.181 105.214 -6.5 + vertex 103.181 103.786 -6.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.181 105.214 -6.5 + vertex 103.02 104.253 -6.5 + vertex 103.02 104.747 -6.5 + endloop + endfacet + facet normal -0.546943 0.83717 0 + outer loop + vertex 103.897 105.874 -6.5 + vertex 103.484 105.604 0.5 + vertex 103.897 105.874 0.5 + endloop + endfacet + facet normal -0.546943 0.83717 0 + outer loop + vertex 103.484 105.604 0.5 + vertex 103.897 105.874 -6.5 + vertex 103.484 105.604 -6.5 + endloop + endfacet + facet normal 0.98636 -0.164599 0 + outer loop + vertex 105.919 104.013 0.5 + vertex 106 104.5 -6.5 + vertex 106 104.5 0.5 + endloop + endfacet + facet normal 0.98636 -0.164599 0 + outer loop + vertex 106 104.5 -6.5 + vertex 105.919 104.013 0.5 + vertex 105.919 104.013 -6.5 + endloop + endfacet + facet normal 0.677285 -0.73572 0 + outer loop + vertex 105.32 103.244 -6.5 + vertex 105.684 103.579 0.5 + vertex 105.32 103.244 0.5 + endloop + endfacet + facet normal 0.677285 -0.73572 0 + outer loop + vertex 105.684 103.579 0.5 + vertex 105.32 103.244 -6.5 + vertex 105.684 103.579 -6.5 + endloop + endfacet + facet normal 0.879474 -0.475946 0 + outer loop + vertex 105.684 103.579 0.5 + vertex 105.919 104.013 -6.5 + vertex 105.919 104.013 0.5 + endloop + endfacet + facet normal 0.879474 -0.475946 0 + outer loop + vertex 105.919 104.013 -6.5 + vertex 105.684 103.579 0.5 + vertex 105.684 103.579 -6.5 + endloop + endfacet + facet normal -0.245487 -0.9694 0 + outer loop + vertex 103.897 103.126 -6.5 + vertex 104.376 103.005 0.5 + vertex 103.897 103.126 0.5 + endloop + endfacet + facet normal -0.245487 -0.9694 -0 + outer loop + vertex 104.376 103.005 0.5 + vertex 103.897 103.126 -6.5 + vertex 104.376 103.005 -6.5 + endloop + endfacet + facet normal -0.789137 -0.614218 0 + outer loop + vertex 103.484 103.396 -6.5 + vertex 103.181 103.786 0.5 + vertex 103.181 103.786 -6.5 + endloop + endfacet + facet normal -0.789137 -0.614218 0 + outer loop + vertex 103.181 103.786 0.5 + vertex 103.484 103.396 -6.5 + vertex 103.484 103.396 0.5 + endloop + endfacet + facet normal -0.945823 -0.324684 0 + outer loop + vertex 103.181 103.786 -6.5 + vertex 103.02 104.253 0.5 + vertex 103.02 104.253 -6.5 + endloop + endfacet + facet normal -0.945823 -0.324684 0 + outer loop + vertex 103.02 104.253 0.5 + vertex 103.181 103.786 -6.5 + vertex 103.181 103.786 0.5 + endloop + endfacet + facet normal -0.546943 -0.83717 0 + outer loop + vertex 103.484 103.396 -6.5 + vertex 103.897 103.126 0.5 + vertex 103.484 103.396 0.5 + endloop + endfacet + facet normal -0.546943 -0.83717 -0 + outer loop + vertex 103.897 103.126 0.5 + vertex 103.484 103.396 -6.5 + vertex 103.897 103.126 -6.5 + endloop + endfacet + facet normal -0.98636 -0.164599 0 + outer loop + vertex 106 104.5 13.5 + vertex 105.919 104.987 20.5 + vertex 105.919 104.987 13.5 + endloop + endfacet + facet normal -0.98636 -0.164599 0 + outer loop + vertex 105.919 104.987 20.5 + vertex 106 104.5 13.5 + vertex 106 104.5 20.5 + endloop + endfacet + facet normal 1 -0 0 + outer loop + vertex 103.02 104.253 20.5 + vertex 103.02 104.747 13.5 + vertex 103.02 104.747 20.5 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 103.02 104.747 13.5 + vertex 103.02 104.253 20.5 + vertex 103.02 104.253 13.5 + endloop + endfacet + facet normal -0.0825698 -0.996585 0 + outer loop + vertex 104.376 105.995 13.5 + vertex 104.868 105.954 20.5 + vertex 104.376 105.995 20.5 + endloop + endfacet + facet normal -0.0825698 -0.996585 -0 + outer loop + vertex 104.868 105.954 20.5 + vertex 104.376 105.995 13.5 + vertex 104.868 105.954 13.5 + endloop + endfacet + facet normal -0.0825698 0.996585 0 + outer loop + vertex 104.868 103.046 13.5 + vertex 104.376 103.005 20.5 + vertex 104.868 103.046 20.5 + endloop + endfacet + facet normal -0.0825698 0.996585 0 + outer loop + vertex 104.376 103.005 20.5 + vertex 104.868 103.046 13.5 + vertex 104.376 103.005 13.5 + endloop + endfacet + facet normal -0.401692 0.915775 0 + outer loop + vertex 105.32 103.244 13.5 + vertex 104.868 103.046 20.5 + vertex 105.32 103.244 20.5 + endloop + endfacet + facet normal -0.401692 0.915775 0 + outer loop + vertex 104.868 103.046 20.5 + vertex 105.32 103.244 13.5 + vertex 104.868 103.046 13.5 + endloop + endfacet + facet normal -0.677285 -0.73572 0 + outer loop + vertex 105.32 105.756 13.5 + vertex 105.684 105.421 20.5 + vertex 105.32 105.756 20.5 + endloop + endfacet + facet normal -0.677285 -0.73572 -0 + outer loop + vertex 105.684 105.421 20.5 + vertex 105.32 105.756 13.5 + vertex 105.684 105.421 13.5 + endloop + endfacet + facet normal -0.879474 -0.475946 0 + outer loop + vertex 105.919 104.987 13.5 + vertex 105.684 105.421 20.5 + vertex 105.684 105.421 13.5 + endloop + endfacet + facet normal -0.879474 -0.475946 0 + outer loop + vertex 105.684 105.421 20.5 + vertex 105.919 104.987 13.5 + vertex 105.919 104.987 20.5 + endloop + endfacet + facet normal -0.401692 -0.915775 0 + outer loop + vertex 104.868 105.954 13.5 + vertex 105.32 105.756 20.5 + vertex 104.868 105.954 20.5 + endloop + endfacet + facet normal -0.401692 -0.915775 -0 + outer loop + vertex 105.32 105.756 20.5 + vertex 104.868 105.954 13.5 + vertex 105.32 105.756 13.5 + endloop + endfacet + facet normal 0.789137 -0.614218 0 + outer loop + vertex 103.181 105.214 20.5 + vertex 103.484 105.604 13.5 + vertex 103.484 105.604 20.5 + endloop + endfacet + facet normal 0.789137 -0.614218 0 + outer loop + vertex 103.484 105.604 13.5 + vertex 103.181 105.214 20.5 + vertex 103.181 105.214 13.5 + endloop + endfacet + facet normal 0.945823 -0.324684 0 + outer loop + vertex 103.02 104.747 20.5 + vertex 103.181 105.214 13.5 + vertex 103.181 105.214 20.5 + endloop + endfacet + facet normal 0.945823 -0.324684 0 + outer loop + vertex 103.181 105.214 13.5 + vertex 103.02 104.747 20.5 + vertex 103.02 104.747 13.5 + endloop + endfacet + facet normal 0.245487 -0.9694 0 + outer loop + vertex 103.897 105.874 13.5 + vertex 104.376 105.995 20.5 + vertex 103.897 105.874 20.5 + endloop + endfacet + facet normal 0.245487 -0.9694 0 + outer loop + vertex 104.376 105.995 20.5 + vertex 103.897 105.874 13.5 + vertex 104.376 105.995 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 105.919 104.987 13.5 + vertex 105.99 104.5 13.5 + vertex 106 104.5 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 105.919 104.987 13.5 + vertex 105.909 104.984 13.5 + vertex 105.99 104.5 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 105.684 105.421 13.5 + vertex 105.909 104.984 13.5 + vertex 105.919 104.987 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 105.684 105.421 13.5 + vertex 105.676 105.415 13.5 + vertex 105.909 104.984 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 105.32 105.756 13.5 + vertex 105.676 105.415 13.5 + vertex 105.684 105.421 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 105.32 105.756 13.5 + vertex 105.315 105.747 13.5 + vertex 105.676 105.415 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 104.868 105.954 13.5 + vertex 105.315 105.747 13.5 + vertex 105.32 105.756 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 104.868 105.954 13.5 + vertex 104.866 105.944 13.5 + vertex 105.315 105.747 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 104.868 105.954 13.5 + vertex 104.377 105.985 13.5 + vertex 104.866 105.944 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 104.376 105.995 13.5 + vertex 104.377 105.985 13.5 + vertex 104.868 105.954 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 104.376 105.995 13.5 + vertex 103.901 105.865 13.5 + vertex 104.377 105.985 13.5 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex 103.897 105.874 13.5 + vertex 103.901 105.865 13.5 + vertex 104.376 105.995 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 103.897 105.874 13.5 + vertex 103.491 105.596 13.5 + vertex 103.901 105.865 13.5 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex 103.484 105.604 13.5 + vertex 103.491 105.596 13.5 + vertex 103.897 105.874 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 103.484 105.604 13.5 + vertex 103.19 105.209 13.5 + vertex 103.491 105.596 13.5 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex 103.181 105.214 13.5 + vertex 103.19 105.209 13.5 + vertex 103.484 105.604 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 103.181 105.214 13.5 + vertex 103.03 104.745 13.5 + vertex 103.19 105.209 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 103.03 104.745 13.5 + vertex 103.02 104.747 13.5 + vertex 103.03 104.255 13.5 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex 103.02 104.747 13.5 + vertex 103.03 104.745 13.5 + vertex 103.181 105.214 13.5 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex 105.99 104.5 13.5 + vertex 105.919 104.013 13.5 + vertex 106 104.5 13.5 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex 105.909 104.016 13.5 + vertex 105.919 104.013 13.5 + vertex 105.99 104.5 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 105.909 104.016 13.5 + vertex 105.684 103.579 13.5 + vertex 105.919 104.013 13.5 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex 105.676 103.585 13.5 + vertex 105.684 103.579 13.5 + vertex 105.909 104.016 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 105.676 103.585 13.5 + vertex 105.32 103.244 13.5 + vertex 105.684 103.579 13.5 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex 105.315 103.253 13.5 + vertex 105.32 103.244 13.5 + vertex 105.676 103.585 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 105.315 103.253 13.5 + vertex 104.868 103.046 13.5 + vertex 105.32 103.244 13.5 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex 104.866 103.056 13.5 + vertex 104.868 103.046 13.5 + vertex 105.315 103.253 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 104.377 103.015 13.5 + vertex 104.868 103.046 13.5 + vertex 104.866 103.056 13.5 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex 104.377 103.015 13.5 + vertex 104.376 103.005 13.5 + vertex 104.868 103.046 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 103.901 103.135 13.5 + vertex 104.376 103.005 13.5 + vertex 104.377 103.015 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 103.901 103.135 13.5 + vertex 103.897 103.126 13.5 + vertex 104.376 103.005 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 103.491 103.404 13.5 + vertex 103.897 103.126 13.5 + vertex 103.901 103.135 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 103.491 103.404 13.5 + vertex 103.484 103.396 13.5 + vertex 103.897 103.126 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 103.19 103.791 13.5 + vertex 103.484 103.396 13.5 + vertex 103.491 103.404 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 103.19 103.791 13.5 + vertex 103.181 103.786 13.5 + vertex 103.484 103.396 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 103.03 104.255 13.5 + vertex 103.181 103.786 13.5 + vertex 103.19 103.791 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 103.03 104.255 13.5 + vertex 103.02 104.253 13.5 + vertex 103.181 103.786 13.5 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 103.02 104.253 13.5 + vertex 103.03 104.255 13.5 + vertex 103.02 104.747 13.5 + endloop + endfacet + facet normal 0.546943 -0.83717 0 + outer loop + vertex 103.484 105.604 13.5 + vertex 103.897 105.874 20.5 + vertex 103.484 105.604 20.5 + endloop + endfacet + facet normal 0.546943 -0.83717 0 + outer loop + vertex 103.897 105.874 20.5 + vertex 103.484 105.604 13.5 + vertex 103.897 105.874 13.5 + endloop + endfacet + facet normal -0.98636 0.164599 0 + outer loop + vertex 105.919 104.013 13.5 + vertex 106 104.5 20.5 + vertex 106 104.5 13.5 + endloop + endfacet + facet normal -0.98636 0.164599 0 + outer loop + vertex 106 104.5 20.5 + vertex 105.919 104.013 13.5 + vertex 105.919 104.013 20.5 + endloop + endfacet + facet normal 0.945823 0.324684 0 + outer loop + vertex 103.181 103.786 20.5 + vertex 103.02 104.253 13.5 + vertex 103.02 104.253 20.5 + endloop + endfacet + facet normal 0.945823 0.324684 0 + outer loop + vertex 103.02 104.253 13.5 + vertex 103.181 103.786 20.5 + vertex 103.181 103.786 13.5 + endloop + endfacet + facet normal -0.677285 0.73572 0 + outer loop + vertex 105.684 103.579 13.5 + vertex 105.32 103.244 20.5 + vertex 105.684 103.579 20.5 + endloop + endfacet + facet normal -0.677285 0.73572 0 + outer loop + vertex 105.32 103.244 20.5 + vertex 105.684 103.579 13.5 + vertex 105.32 103.244 13.5 + endloop + endfacet + facet normal -0.879474 0.475946 0 + outer loop + vertex 105.684 103.579 13.5 + vertex 105.919 104.013 20.5 + vertex 105.919 104.013 13.5 + endloop + endfacet + facet normal -0.879474 0.475946 0 + outer loop + vertex 105.919 104.013 20.5 + vertex 105.684 103.579 13.5 + vertex 105.684 103.579 20.5 + endloop + endfacet + facet normal 0.245487 0.9694 -0 + outer loop + vertex 104.376 103.005 13.5 + vertex 103.897 103.126 20.5 + vertex 104.376 103.005 20.5 + endloop + endfacet + facet normal 0.245487 0.9694 0 + outer loop + vertex 103.897 103.126 20.5 + vertex 104.376 103.005 13.5 + vertex 103.897 103.126 13.5 + endloop + endfacet + facet normal 0.789137 0.614218 0 + outer loop + vertex 103.484 103.396 20.5 + vertex 103.181 103.786 13.5 + vertex 103.181 103.786 20.5 + endloop + endfacet + facet normal 0.789137 0.614218 0 + outer loop + vertex 103.181 103.786 13.5 + vertex 103.484 103.396 20.5 + vertex 103.484 103.396 13.5 + endloop + endfacet + facet normal 0.546943 0.83717 -0 + outer loop + vertex 103.897 103.126 13.5 + vertex 103.484 103.396 20.5 + vertex 103.897 103.126 20.5 + endloop + endfacet + facet normal 0.546943 0.83717 0 + outer loop + vertex 103.484 103.396 20.5 + vertex 103.897 103.126 13.5 + vertex 103.484 103.396 13.5 + endloop + endfacet + facet normal 0.995974 0.0896469 0 + outer loop + vertex 107.25 104.5 25.08 + vertex 107.206 104.991 22.1 + vertex 107.206 104.991 25.08 + endloop + endfacet + facet normal 0.995974 0.0896469 0 + outer loop + vertex 107.206 104.991 22.1 + vertex 107.25 104.5 25.08 + vertex 107.25 104.5 22.1 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex 101.761 104.253 22.1 + vertex 101.761 104.747 25.08 + vertex 101.761 104.747 22.1 + endloop + endfacet + facet normal -1 -0 0 + outer loop + vertex 101.761 104.747 25.08 + vertex 101.761 104.253 22.1 + vertex 101.761 104.253 25.08 + endloop + endfacet + facet normal 0.0448622 0.998993 -0 + outer loop + vertex 104.869 107.225 22.1 + vertex 104.377 107.247 25.08 + vertex 104.869 107.225 25.08 + endloop + endfacet + facet normal 0.0448622 0.998993 0 + outer loop + vertex 104.377 107.247 25.08 + vertex 104.869 107.225 22.1 + vertex 104.377 107.247 22.1 + endloop + endfacet + facet normal 0.0448622 -0.998993 0 + outer loop + vertex 104.377 101.753 22.1 + vertex 104.869 101.775 25.08 + vertex 104.377 101.753 25.08 + endloop + endfacet + facet normal 0.0448622 -0.998993 0 + outer loop + vertex 104.869 101.775 25.08 + vertex 104.377 101.753 22.1 + vertex 104.869 101.775 22.1 + endloop + endfacet + facet normal 0.809016 -0.587786 0 + outer loop + vertex 106.571 102.691 25.08 + vertex 106.861 103.09 22.1 + vertex 106.861 103.09 25.08 + endloop + endfacet + facet normal 0.809016 -0.587786 0 + outer loop + vertex 106.861 103.09 22.1 + vertex 106.571 102.691 25.08 + vertex 106.571 102.691 22.1 + endloop + endfacet + facet normal 0.691067 0.722791 -0 + outer loop + vertex 106.571 106.309 22.1 + vertex 106.215 106.65 25.08 + vertex 106.571 106.309 25.08 + endloop + endfacet + facet normal 0.691067 0.722791 0 + outer loop + vertex 106.215 106.65 25.08 + vertex 106.571 106.309 22.1 + vertex 106.215 106.65 22.1 + endloop + endfacet + facet normal -0.753075 0.657935 0 + outer loop + vertex 102.275 106.116 22.1 + vertex 102.6 106.488 25.08 + vertex 102.6 106.488 22.1 + endloop + endfacet + facet normal -0.753075 0.657935 0 + outer loop + vertex 102.6 106.488 25.08 + vertex 102.275 106.116 22.1 + vertex 102.275 106.116 25.08 + endloop + endfacet + facet normal -0.47387 0.880595 0 + outer loop + vertex 103.419 107.029 22.1 + vertex 102.985 106.795 25.08 + vertex 103.419 107.029 25.08 + endloop + endfacet + facet normal -0.47387 0.880595 0 + outer loop + vertex 102.985 106.795 25.08 + vertex 103.419 107.029 22.1 + vertex 102.985 106.795 22.1 + endloop + endfacet + facet normal 0.963965 -0.26603 0 + outer loop + vertex 107.075 103.534 25.08 + vertex 107.206 104.009 22.1 + vertex 107.206 104.009 25.08 + endloop + endfacet + facet normal 0.963965 -0.26603 0 + outer loop + vertex 107.206 104.009 22.1 + vertex 107.075 103.534 25.08 + vertex 107.075 103.534 22.1 + endloop + endfacet + facet normal 0.90097 0.433881 0 + outer loop + vertex 107.075 105.466 25.08 + vertex 106.861 105.91 22.1 + vertex 106.861 105.91 25.08 + endloop + endfacet + facet normal 0.90097 0.433881 0 + outer loop + vertex 106.861 105.91 22.1 + vertex 107.075 105.466 25.08 + vertex 107.075 105.466 22.1 + endloop + endfacet + facet normal 0.963965 0.26603 0 + outer loop + vertex 107.206 104.991 25.08 + vertex 107.075 105.466 22.1 + vertex 107.075 105.466 25.08 + endloop + endfacet + facet normal 0.963965 0.26603 0 + outer loop + vertex 107.075 105.466 22.1 + vertex 107.206 104.991 25.08 + vertex 107.206 104.991 22.1 + endloop + endfacet + facet normal 0.809016 0.587786 0 + outer loop + vertex 106.861 105.91 25.08 + vertex 106.571 106.309 22.1 + vertex 106.571 106.309 25.08 + endloop + endfacet + facet normal 0.809016 0.587786 0 + outer loop + vertex 106.571 106.309 22.1 + vertex 106.861 105.91 25.08 + vertex 106.861 105.91 22.1 + endloop + endfacet + facet normal 0.393015 0.919532 -0 + outer loop + vertex 105.803 106.922 22.1 + vertex 105.35 107.115 25.08 + vertex 105.803 106.922 25.08 + endloop + endfacet + facet normal 0.393015 0.919532 0 + outer loop + vertex 105.35 107.115 25.08 + vertex 105.803 106.922 22.1 + vertex 105.35 107.115 22.1 + endloop + endfacet + facet normal 0.222531 0.974926 -0 + outer loop + vertex 105.35 107.115 22.1 + vertex 104.869 107.225 25.08 + vertex 105.35 107.115 25.08 + endloop + endfacet + facet normal 0.222531 0.974926 0 + outer loop + vertex 104.869 107.225 25.08 + vertex 105.35 107.115 22.1 + vertex 104.869 107.225 22.1 + endloop + endfacet + facet normal 0.550891 0.834577 -0 + outer loop + vertex 106.215 106.65 22.1 + vertex 105.803 106.922 25.08 + vertex 106.215 106.65 25.08 + endloop + endfacet + facet normal 0.550891 0.834577 0 + outer loop + vertex 105.803 106.922 25.08 + vertex 106.215 106.65 22.1 + vertex 105.803 106.922 22.1 + endloop + endfacet + facet normal -0.936235 0.351374 0 + outer loop + vertex 101.849 105.232 22.1 + vertex 102.022 105.693 25.08 + vertex 102.022 105.693 22.1 + endloop + endfacet + facet normal -0.936235 0.351374 0 + outer loop + vertex 102.022 105.693 25.08 + vertex 101.849 105.232 22.1 + vertex 101.849 105.232 25.08 + endloop + endfacet + facet normal -0.85845 0.512897 0 + outer loop + vertex 102.022 105.693 22.1 + vertex 102.275 106.116 25.08 + vertex 102.275 106.116 22.1 + endloop + endfacet + facet normal -0.85845 0.512897 0 + outer loop + vertex 102.275 106.116 25.08 + vertex 102.022 105.693 22.1 + vertex 102.022 105.693 25.08 + endloop + endfacet + facet normal -0.983928 0.178565 0 + outer loop + vertex 101.761 104.747 22.1 + vertex 101.849 105.232 25.08 + vertex 101.849 105.232 22.1 + endloop + endfacet + facet normal -0.983928 0.178565 0 + outer loop + vertex 101.849 105.232 25.08 + vertex 101.761 104.747 22.1 + vertex 101.761 104.747 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 105.943 104.5 25.08 + vertex 107.25 104.5 25.08 + vertex 107.206 104.991 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 105.943 104.5 25.08 + vertex 107.206 104.991 25.08 + vertex 107.075 105.466 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 107.25 104.5 25.08 + vertex 105.943 104.5 25.08 + vertex 107.206 104.009 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 105.943 104.5 25.08 + vertex 107.075 105.466 25.08 + vertex 106.861 105.91 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 107.206 104.009 25.08 + vertex 105.943 104.5 25.08 + vertex 107.075 103.534 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 105.222 105.75 25.08 + vertex 106.861 105.91 25.08 + vertex 106.571 106.309 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 107.075 103.534 25.08 + vertex 105.943 104.5 25.08 + vertex 106.861 103.09 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 105.222 105.75 25.08 + vertex 106.571 106.309 25.08 + vertex 106.215 106.65 25.08 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex 105.222 103.25 25.08 + vertex 106.861 103.09 25.08 + vertex 105.943 104.5 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 106.861 103.09 25.08 + vertex 105.222 103.25 25.08 + vertex 106.571 102.691 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 105.222 105.75 25.08 + vertex 106.215 106.65 25.08 + vertex 105.803 106.922 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 105.222 105.75 25.08 + vertex 105.803 106.922 25.08 + vertex 105.35 107.115 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 106.861 105.91 25.08 + vertex 105.222 105.75 25.08 + vertex 105.943 104.5 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 104.869 107.225 25.08 + vertex 105.222 105.75 25.08 + vertex 105.35 107.115 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 104.377 107.247 25.08 + vertex 105.222 105.75 25.08 + vertex 104.869 107.225 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 103.778 105.75 25.08 + vertex 104.377 107.247 25.08 + vertex 103.888 107.181 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 104.377 107.247 25.08 + vertex 103.778 105.75 25.08 + vertex 105.222 105.75 25.08 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex 103.419 107.029 25.08 + vertex 103.778 105.75 25.08 + vertex 103.888 107.181 25.08 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex 102.985 106.795 25.08 + vertex 103.778 105.75 25.08 + vertex 103.419 107.029 25.08 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex 102.6 106.488 25.08 + vertex 103.778 105.75 25.08 + vertex 102.985 106.795 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 106.571 102.691 25.08 + vertex 105.222 103.25 25.08 + vertex 106.215 102.35 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 106.215 102.35 25.08 + vertex 105.222 103.25 25.08 + vertex 105.803 102.078 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 105.803 102.078 25.08 + vertex 105.222 103.25 25.08 + vertex 105.35 101.885 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 105.222 103.25 25.08 + vertex 104.869 101.775 25.08 + vertex 105.35 101.885 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 105.222 103.25 25.08 + vertex 104.377 101.753 25.08 + vertex 104.869 101.775 25.08 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex 103.778 103.25 25.08 + vertex 104.377 101.753 25.08 + vertex 105.222 103.25 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 104.377 101.753 25.08 + vertex 103.778 103.25 25.08 + vertex 103.888 101.819 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 103.778 103.25 25.08 + vertex 103.419 101.971 25.08 + vertex 103.888 101.819 25.08 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex 102.022 103.307 25.08 + vertex 103.778 103.25 25.08 + vertex 103.057 104.5 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 103.778 103.25 25.08 + vertex 102.985 102.205 25.08 + vertex 103.419 101.971 25.08 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex 102.275 106.116 25.08 + vertex 103.778 105.75 25.08 + vertex 102.6 106.488 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 102.022 105.693 25.08 + vertex 103.778 105.75 25.08 + vertex 102.275 106.116 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 103.778 103.25 25.08 + vertex 102.6 102.512 25.08 + vertex 102.985 102.205 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 103.778 105.75 25.08 + vertex 102.022 105.693 25.08 + vertex 103.057 104.5 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 103.778 103.25 25.08 + vertex 102.275 102.884 25.08 + vertex 102.6 102.512 25.08 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex 101.849 105.232 25.08 + vertex 103.057 104.5 25.08 + vertex 102.022 105.693 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 103.778 103.25 25.08 + vertex 102.022 103.307 25.08 + vertex 102.275 102.884 25.08 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex 101.761 104.747 25.08 + vertex 103.057 104.5 25.08 + vertex 101.849 105.232 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 103.057 104.5 25.08 + vertex 101.849 103.768 25.08 + vertex 102.022 103.307 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 101.761 104.253 25.08 + vertex 103.057 104.5 25.08 + vertex 101.761 104.747 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 103.057 104.5 25.08 + vertex 101.761 104.253 25.08 + vertex 101.849 103.768 25.08 + endloop + endfacet + facet normal -0.62349 0.781831 0 + outer loop + vertex 102.985 106.795 22.1 + vertex 102.6 106.488 25.08 + vertex 102.985 106.795 25.08 + endloop + endfacet + facet normal -0.62349 0.781831 0 + outer loop + vertex 102.6 106.488 25.08 + vertex 102.985 106.795 22.1 + vertex 102.6 106.488 22.1 + endloop + endfacet + facet normal -0.134229 0.99095 0 + outer loop + vertex 104.377 107.247 22.1 + vertex 103.888 107.181 25.08 + vertex 104.377 107.247 25.08 + endloop + endfacet + facet normal -0.134229 0.99095 0 + outer loop + vertex 103.888 107.181 25.08 + vertex 104.377 107.247 22.1 + vertex 103.888 107.181 22.1 + endloop + endfacet + facet normal 0.995974 -0.0896469 0 + outer loop + vertex 107.206 104.009 25.08 + vertex 107.25 104.5 22.1 + vertex 107.25 104.5 25.08 + endloop + endfacet + facet normal 0.995974 -0.0896469 0 + outer loop + vertex 107.25 104.5 22.1 + vertex 107.206 104.009 25.08 + vertex 107.206 104.009 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 105.99 104.5 22.1 + vertex 107.25 104.5 22.1 + vertex 107.206 104.009 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 105.909 104.016 22.1 + vertex 107.206 104.009 22.1 + vertex 107.075 103.534 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 107.25 104.5 22.1 + vertex 105.99 104.5 22.1 + vertex 107.206 104.991 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 105.909 104.016 22.1 + vertex 107.075 103.534 22.1 + vertex 106.861 103.09 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 105.909 104.984 22.1 + vertex 107.206 104.991 22.1 + vertex 105.99 104.5 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 105.676 103.585 22.1 + vertex 106.861 103.09 22.1 + vertex 106.571 102.691 22.1 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 107.206 104.991 22.1 + vertex 105.909 104.984 22.1 + vertex 107.075 105.466 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 105.676 103.585 22.1 + vertex 106.571 102.691 22.1 + vertex 106.215 102.35 22.1 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 107.075 105.466 22.1 + vertex 105.909 104.984 22.1 + vertex 106.861 105.91 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 105.676 105.415 22.1 + vertex 106.861 105.91 22.1 + vertex 105.909 104.984 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 107.206 104.009 22.1 + vertex 105.909 104.016 22.1 + vertex 105.99 104.5 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 105.315 103.253 22.1 + vertex 106.215 102.35 22.1 + vertex 105.803 102.078 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 106.861 103.09 22.1 + vertex 105.676 103.585 22.1 + vertex 105.909 104.016 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 104.866 103.056 22.1 + vertex 105.803 102.078 22.1 + vertex 105.35 101.885 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 106.215 102.35 22.1 + vertex 105.315 103.253 22.1 + vertex 105.676 103.585 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 104.866 103.056 22.1 + vertex 105.35 101.885 22.1 + vertex 104.869 101.775 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 105.803 102.078 22.1 + vertex 104.866 103.056 22.1 + vertex 105.315 103.253 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 104.869 101.775 22.1 + vertex 104.377 103.015 22.1 + vertex 104.866 103.056 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 104.377 101.753 22.1 + vertex 104.377 103.015 22.1 + vertex 104.869 101.775 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.888 101.819 22.1 + vertex 104.377 103.015 22.1 + vertex 104.377 101.753 22.1 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 104.377 103.015 22.1 + vertex 103.888 101.819 22.1 + vertex 103.901 103.135 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.419 101.971 22.1 + vertex 103.901 103.135 22.1 + vertex 103.888 101.819 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 102.985 102.205 22.1 + vertex 103.901 103.135 22.1 + vertex 103.419 101.971 22.1 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 103.901 103.135 22.1 + vertex 102.985 102.205 22.1 + vertex 103.491 103.404 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 102.6 102.512 22.1 + vertex 103.491 103.404 22.1 + vertex 102.985 102.205 22.1 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 103.491 103.404 22.1 + vertex 102.275 102.884 22.1 + vertex 103.19 103.791 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 102.275 102.884 22.1 + vertex 103.491 103.404 22.1 + vertex 102.6 102.512 22.1 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 106.861 105.91 22.1 + vertex 105.676 105.415 22.1 + vertex 106.571 106.309 22.1 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 106.571 106.309 22.1 + vertex 105.676 105.415 22.1 + vertex 106.215 106.65 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 105.315 105.747 22.1 + vertex 106.215 106.65 22.1 + vertex 105.676 105.415 22.1 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 106.215 106.65 22.1 + vertex 105.315 105.747 22.1 + vertex 105.803 106.922 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 104.866 105.944 22.1 + vertex 105.803 106.922 22.1 + vertex 105.315 105.747 22.1 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 105.803 106.922 22.1 + vertex 104.866 105.944 22.1 + vertex 105.35 107.115 22.1 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 105.35 107.115 22.1 + vertex 104.866 105.944 22.1 + vertex 104.869 107.225 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 104.377 105.985 22.1 + vertex 104.869 107.225 22.1 + vertex 104.866 105.944 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 104.377 105.985 22.1 + vertex 104.377 107.247 22.1 + vertex 104.869 107.225 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.888 107.181 22.1 + vertex 104.377 105.985 22.1 + vertex 103.901 105.865 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 104.377 105.985 22.1 + vertex 103.888 107.181 22.1 + vertex 104.377 107.247 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 102.985 106.795 22.1 + vertex 103.901 105.865 22.1 + vertex 103.491 105.596 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.901 105.865 22.1 + vertex 103.419 107.029 22.1 + vertex 103.888 107.181 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 102.275 106.116 22.1 + vertex 103.491 105.596 22.1 + vertex 103.19 105.209 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 101.849 105.232 22.1 + vertex 103.19 105.209 22.1 + vertex 103.03 104.745 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.901 105.865 22.1 + vertex 102.985 106.795 22.1 + vertex 103.419 107.029 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 102.022 103.307 22.1 + vertex 103.19 103.791 22.1 + vertex 102.275 102.884 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 101.849 103.768 22.1 + vertex 103.19 103.791 22.1 + vertex 102.022 103.307 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.491 105.596 22.1 + vertex 102.6 106.488 22.1 + vertex 102.985 106.795 22.1 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 103.19 103.791 22.1 + vertex 101.849 103.768 22.1 + vertex 103.03 104.255 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.491 105.596 22.1 + vertex 102.275 106.116 22.1 + vertex 102.6 106.488 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 101.761 104.253 22.1 + vertex 103.03 104.255 22.1 + vertex 101.849 103.768 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.19 105.209 22.1 + vertex 102.022 105.693 22.1 + vertex 102.275 106.116 22.1 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 103.03 104.255 22.1 + vertex 101.761 104.253 22.1 + vertex 103.03 104.745 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.19 105.209 22.1 + vertex 101.849 105.232 22.1 + vertex 102.022 105.693 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 101.761 104.747 22.1 + vertex 103.03 104.745 22.1 + vertex 101.761 104.253 22.1 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 103.03 104.745 22.1 + vertex 101.761 104.747 22.1 + vertex 101.849 105.232 22.1 + endloop + endfacet + facet normal 0.222531 -0.974926 0 + outer loop + vertex 104.869 101.775 22.1 + vertex 105.35 101.885 25.08 + vertex 104.869 101.775 25.08 + endloop + endfacet + facet normal 0.222531 -0.974926 0 + outer loop + vertex 105.35 101.885 25.08 + vertex 104.869 101.775 22.1 + vertex 105.35 101.885 22.1 + endloop + endfacet + facet normal -0.309018 0.951056 0 + outer loop + vertex 103.888 107.181 22.1 + vertex 103.419 107.029 25.08 + vertex 103.888 107.181 25.08 + endloop + endfacet + facet normal -0.309018 0.951056 0 + outer loop + vertex 103.419 107.029 25.08 + vertex 103.888 107.181 22.1 + vertex 103.419 107.029 22.1 + endloop + endfacet + facet normal 0.90097 -0.433881 0 + outer loop + vertex 106.861 103.09 25.08 + vertex 107.075 103.534 22.1 + vertex 107.075 103.534 25.08 + endloop + endfacet + facet normal 0.90097 -0.433881 0 + outer loop + vertex 107.075 103.534 22.1 + vertex 106.861 103.09 25.08 + vertex 106.861 103.09 22.1 + endloop + endfacet + facet normal -0.85845 -0.512897 0 + outer loop + vertex 102.275 102.884 22.1 + vertex 102.022 103.307 25.08 + vertex 102.022 103.307 22.1 + endloop + endfacet + facet normal -0.85845 -0.512897 0 + outer loop + vertex 102.022 103.307 25.08 + vertex 102.275 102.884 22.1 + vertex 102.275 102.884 25.08 + endloop + endfacet + facet normal -0.983928 -0.178565 0 + outer loop + vertex 101.849 103.768 22.1 + vertex 101.761 104.253 25.08 + vertex 101.761 104.253 22.1 + endloop + endfacet + facet normal -0.983928 -0.178565 0 + outer loop + vertex 101.761 104.253 25.08 + vertex 101.849 103.768 22.1 + vertex 101.849 103.768 25.08 + endloop + endfacet + facet normal 0.550891 -0.834577 0 + outer loop + vertex 105.803 102.078 22.1 + vertex 106.215 102.35 25.08 + vertex 105.803 102.078 25.08 + endloop + endfacet + facet normal 0.550891 -0.834577 0 + outer loop + vertex 106.215 102.35 25.08 + vertex 105.803 102.078 22.1 + vertex 106.215 102.35 22.1 + endloop + endfacet + facet normal 0.393015 -0.919532 0 + outer loop + vertex 105.35 101.885 22.1 + vertex 105.803 102.078 25.08 + vertex 105.35 101.885 25.08 + endloop + endfacet + facet normal 0.393015 -0.919532 0 + outer loop + vertex 105.803 102.078 25.08 + vertex 105.35 101.885 22.1 + vertex 105.803 102.078 22.1 + endloop + endfacet + facet normal -0.47387 -0.880595 0 + outer loop + vertex 102.985 102.205 22.1 + vertex 103.419 101.971 25.08 + vertex 102.985 102.205 25.08 + endloop + endfacet + facet normal -0.47387 -0.880595 -0 + outer loop + vertex 103.419 101.971 25.08 + vertex 102.985 102.205 22.1 + vertex 103.419 101.971 22.1 + endloop + endfacet + facet normal -0.309018 -0.951056 0 + outer loop + vertex 103.419 101.971 22.1 + vertex 103.888 101.819 25.08 + vertex 103.419 101.971 25.08 + endloop + endfacet + facet normal -0.309018 -0.951056 -0 + outer loop + vertex 103.888 101.819 25.08 + vertex 103.419 101.971 22.1 + vertex 103.888 101.819 22.1 + endloop + endfacet + facet normal -0.134229 -0.99095 0 + outer loop + vertex 103.888 101.819 22.1 + vertex 104.377 101.753 25.08 + vertex 103.888 101.819 25.08 + endloop + endfacet + facet normal -0.134229 -0.99095 -0 + outer loop + vertex 104.377 101.753 25.08 + vertex 103.888 101.819 22.1 + vertex 104.377 101.753 22.1 + endloop + endfacet + facet normal -0.936235 -0.351374 0 + outer loop + vertex 102.022 103.307 22.1 + vertex 101.849 103.768 25.08 + vertex 101.849 103.768 22.1 + endloop + endfacet + facet normal -0.936235 -0.351374 0 + outer loop + vertex 101.849 103.768 25.08 + vertex 102.022 103.307 22.1 + vertex 102.022 103.307 25.08 + endloop + endfacet + facet normal 0.691067 -0.722791 0 + outer loop + vertex 106.215 102.35 22.1 + vertex 106.571 102.691 25.08 + vertex 106.215 102.35 25.08 + endloop + endfacet + facet normal 0.691067 -0.722791 0 + outer loop + vertex 106.571 102.691 25.08 + vertex 106.215 102.35 22.1 + vertex 106.571 102.691 22.1 + endloop + endfacet + facet normal -0.753075 -0.657935 0 + outer loop + vertex 102.6 102.512 22.1 + vertex 102.275 102.884 25.08 + vertex 102.275 102.884 22.1 + endloop + endfacet + facet normal -0.753075 -0.657935 0 + outer loop + vertex 102.275 102.884 25.08 + vertex 102.6 102.512 22.1 + vertex 102.6 102.512 25.08 + endloop + endfacet + facet normal -0.62349 -0.781831 0 + outer loop + vertex 102.6 102.512 22.1 + vertex 102.985 102.205 25.08 + vertex 102.6 102.512 25.08 + endloop + endfacet + facet normal -0.62349 -0.781831 -0 + outer loop + vertex 102.985 102.205 25.08 + vertex 102.6 102.512 22.1 + vertex 102.985 102.205 22.1 + endloop + endfacet + facet normal 0.986363 0.164583 0 + outer loop + vertex 105.99 104.5 20.5 + vertex 105.909 104.984 13.5 + vertex 105.909 104.984 20.5 + endloop + endfacet + facet normal 0.986363 0.164583 0 + outer loop + vertex 105.909 104.984 13.5 + vertex 105.99 104.5 20.5 + vertex 105.99 104.5 13.5 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex 103.03 104.255 13.5 + vertex 103.03 104.745 20.5 + vertex 103.03 104.745 13.5 + endloop + endfacet + facet normal -1 -0 0 + outer loop + vertex 103.03 104.745 20.5 + vertex 103.03 104.255 13.5 + vertex 103.03 104.255 20.5 + endloop + endfacet + facet normal -0.245484 0.969401 0 + outer loop + vertex 104.377 105.985 13.5 + vertex 103.901 105.865 20.5 + vertex 104.377 105.985 20.5 + endloop + endfacet + facet normal -0.245484 0.969401 0 + outer loop + vertex 103.901 105.865 20.5 + vertex 104.377 105.985 13.5 + vertex 103.901 105.865 13.5 + endloop + endfacet + facet normal 0.0825782 -0.996585 0 + outer loop + vertex 104.377 103.015 13.5 + vertex 104.866 103.056 20.5 + vertex 104.377 103.015 20.5 + endloop + endfacet + facet normal 0.0825782 -0.996585 0 + outer loop + vertex 104.866 103.056 20.5 + vertex 104.377 103.015 13.5 + vertex 104.866 103.056 13.5 + endloop + endfacet + facet normal 0.401702 0.915771 -0 + outer loop + vertex 105.315 105.747 13.5 + vertex 104.866 105.944 20.5 + vertex 105.315 105.747 20.5 + endloop + endfacet + facet normal 0.401702 0.915771 0 + outer loop + vertex 104.866 105.944 20.5 + vertex 105.315 105.747 13.5 + vertex 104.866 105.944 13.5 + endloop + endfacet + facet normal 0.0825782 0.996585 -0 + outer loop + vertex 104.866 105.944 13.5 + vertex 104.377 105.985 20.5 + vertex 104.866 105.944 20.5 + endloop + endfacet + facet normal 0.0825782 0.996585 0 + outer loop + vertex 104.377 105.985 20.5 + vertex 104.866 105.944 13.5 + vertex 104.377 105.985 13.5 + endloop + endfacet + facet normal -0.789139 0.614214 0 + outer loop + vertex 103.19 105.209 13.5 + vertex 103.491 105.596 20.5 + vertex 103.491 105.596 13.5 + endloop + endfacet + facet normal -0.789139 0.614214 0 + outer loop + vertex 103.491 105.596 20.5 + vertex 103.19 105.209 13.5 + vertex 103.19 105.209 20.5 + endloop + endfacet + facet normal -0.945816 0.324703 0 + outer loop + vertex 103.03 104.745 13.5 + vertex 103.19 105.209 20.5 + vertex 103.19 105.209 13.5 + endloop + endfacet + facet normal -0.945816 0.324703 0 + outer loop + vertex 103.19 105.209 20.5 + vertex 103.03 104.745 13.5 + vertex 103.03 104.745 20.5 + endloop + endfacet + facet normal -0.546948 0.837167 0 + outer loop + vertex 103.901 105.865 13.5 + vertex 103.491 105.596 20.5 + vertex 103.901 105.865 20.5 + endloop + endfacet + facet normal -0.546948 0.837167 0 + outer loop + vertex 103.491 105.596 20.5 + vertex 103.901 105.865 13.5 + vertex 103.491 105.596 13.5 + endloop + endfacet + facet normal -0.245484 -0.969401 0 + outer loop + vertex 103.901 103.135 13.5 + vertex 104.377 103.015 20.5 + vertex 103.901 103.135 20.5 + endloop + endfacet + facet normal -0.245484 -0.969401 -0 + outer loop + vertex 104.377 103.015 20.5 + vertex 103.901 103.135 13.5 + vertex 104.377 103.015 13.5 + endloop + endfacet + facet normal 0.677276 0.735729 -0 + outer loop + vertex 105.676 105.415 13.5 + vertex 105.315 105.747 20.5 + vertex 105.676 105.415 20.5 + endloop + endfacet + facet normal 0.677276 0.735729 0 + outer loop + vertex 105.315 105.747 20.5 + vertex 105.676 105.415 13.5 + vertex 105.315 105.747 13.5 + endloop + endfacet + facet normal 0.87947 0.475954 0 + outer loop + vertex 105.909 104.984 20.5 + vertex 105.676 105.415 13.5 + vertex 105.676 105.415 20.5 + endloop + endfacet + facet normal 0.87947 0.475954 0 + outer loop + vertex 105.676 105.415 13.5 + vertex 105.909 104.984 20.5 + vertex 105.909 104.984 13.5 + endloop + endfacet + facet normal 0.401702 -0.915771 0 + outer loop + vertex 104.866 103.056 13.5 + vertex 105.315 103.253 20.5 + vertex 104.866 103.056 20.5 + endloop + endfacet + facet normal 0.401702 -0.915771 0 + outer loop + vertex 105.315 103.253 20.5 + vertex 104.866 103.056 13.5 + vertex 105.315 103.253 13.5 + endloop + endfacet + facet normal 0.986363 -0.164583 0 + outer loop + vertex 105.909 104.016 20.5 + vertex 105.99 104.5 13.5 + vertex 105.99 104.5 20.5 + endloop + endfacet + facet normal 0.986363 -0.164583 0 + outer loop + vertex 105.99 104.5 13.5 + vertex 105.909 104.016 20.5 + vertex 105.909 104.016 13.5 + endloop + endfacet + facet normal -0.546948 -0.837167 0 + outer loop + vertex 103.491 103.404 13.5 + vertex 103.901 103.135 20.5 + vertex 103.491 103.404 20.5 + endloop + endfacet + facet normal -0.546948 -0.837167 -0 + outer loop + vertex 103.901 103.135 20.5 + vertex 103.491 103.404 13.5 + vertex 103.901 103.135 13.5 + endloop + endfacet + facet normal -0.945816 -0.324703 0 + outer loop + vertex 103.19 103.791 13.5 + vertex 103.03 104.255 20.5 + vertex 103.03 104.255 13.5 + endloop + endfacet + facet normal -0.945816 -0.324703 0 + outer loop + vertex 103.03 104.255 20.5 + vertex 103.19 103.791 13.5 + vertex 103.19 103.791 20.5 + endloop + endfacet + facet normal 0.677276 -0.735729 0 + outer loop + vertex 105.315 103.253 13.5 + vertex 105.676 103.585 20.5 + vertex 105.315 103.253 20.5 + endloop + endfacet + facet normal 0.677276 -0.735729 0 + outer loop + vertex 105.676 103.585 20.5 + vertex 105.315 103.253 13.5 + vertex 105.676 103.585 13.5 + endloop + endfacet + facet normal -0.789139 -0.614214 0 + outer loop + vertex 103.491 103.404 13.5 + vertex 103.19 103.791 20.5 + vertex 103.19 103.791 13.5 + endloop + endfacet + facet normal -0.789139 -0.614214 0 + outer loop + vertex 103.19 103.791 20.5 + vertex 103.491 103.404 13.5 + vertex 103.491 103.404 20.5 + endloop + endfacet + facet normal 0.87947 -0.475954 0 + outer loop + vertex 105.676 103.585 20.5 + vertex 105.909 104.016 13.5 + vertex 105.909 104.016 20.5 + endloop + endfacet + facet normal 0.87947 -0.475954 0 + outer loop + vertex 105.909 104.016 13.5 + vertex 105.676 103.585 20.5 + vertex 105.676 103.585 13.5 + endloop + endfacet + facet normal -0.866026 -0.5 0 + outer loop + vertex 105.943 104.5 24.0867 + vertex 105.222 105.75 25.08 + vertex 105.222 105.75 24.0867 + endloop + endfacet + facet normal -0.866026 -0.5 0 + outer loop + vertex 105.222 105.75 25.08 + vertex 105.943 104.5 24.0867 + vertex 105.943 104.5 25.08 + endloop + endfacet + facet normal 0.866026 -0.5 0 + outer loop + vertex 103.057 104.5 25.08 + vertex 103.778 105.75 24.0867 + vertex 103.778 105.75 25.08 + endloop + endfacet + facet normal 0.866026 -0.5 0 + outer loop + vertex 103.778 105.75 24.0867 + vertex 103.057 104.5 25.08 + vertex 103.057 104.5 24.0867 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 103.778 105.75 24.0867 + vertex 105.222 105.75 25.08 + vertex 103.778 105.75 25.08 + endloop + endfacet + facet normal 0 -1 -0 + outer loop + vertex 105.222 105.75 25.08 + vertex 103.778 105.75 24.0867 + vertex 105.222 105.75 24.0867 + endloop + endfacet + facet normal -0.866026 0.5 0 + outer loop + vertex 105.222 103.25 24.0867 + vertex 105.943 104.5 25.08 + vertex 105.943 104.5 24.0867 + endloop + endfacet + facet normal -0.866026 0.5 0 + outer loop + vertex 105.943 104.5 25.08 + vertex 105.222 103.25 24.0867 + vertex 105.222 103.25 25.08 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 105.222 105.75 24.0867 + vertex 105.222 103.25 24.0867 + vertex 105.943 104.5 24.0867 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex 103.778 105.75 24.0867 + vertex 105.222 103.25 24.0867 + vertex 105.222 105.75 24.0867 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 103.778 105.75 24.0867 + vertex 103.778 103.25 24.0867 + vertex 105.222 103.25 24.0867 + endloop + endfacet + facet normal 0 -0 1 + outer loop + vertex 103.778 103.25 24.0867 + vertex 103.778 105.75 24.0867 + vertex 103.057 104.5 24.0867 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex 105.222 103.25 24.0867 + vertex 103.778 103.25 25.08 + vertex 105.222 103.25 25.08 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 103.778 103.25 25.08 + vertex 105.222 103.25 24.0867 + vertex 103.778 103.25 24.0867 + endloop + endfacet + facet normal 0.866026 0.5 0 + outer loop + vertex 103.778 103.25 25.08 + vertex 103.057 104.5 24.0867 + vertex 103.057 104.5 25.08 + endloop + endfacet + facet normal 0.866026 0.5 0 + outer loop + vertex 103.057 104.5 24.0867 + vertex 103.778 103.25 25.08 + vertex 103.778 103.25 24.0867 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -106.981 -82 20.5 + vertex -106.981 -82 19.1223 + vertex -107 -82 20.5 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -106.981 -82 22.13 + vertex -106.981 -82 22.1 + vertex -107 -82 22.13 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex -96.3536 -82 26.7428 + vertex -96.4718 -82 27.0143 + vertex -96 -82 26.88 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -96.8364 -82 26.7428 + vertex -96.4718 -82 27.0143 + vertex -96.3536 -82 26.7428 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -96.4718 -82 27.0143 + vertex -96.8364 -82 26.7428 + vertex -96.9603 -82 26.969 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex -95.9185 -82 26.5333 + vertex -96 -82 26.88 + vertex -95.6084 -82 26.5844 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -96 -82 26.88 + vertex -95.9185 -82 26.5333 + vertex -96.3536 -82 26.7428 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -95.6175 -82 26.1557 + vertex -95.6084 -82 26.5844 + vertex -95.3502 -82 26.1673 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -95.6084 -82 26.5844 + vertex -95.6175 -82 26.1557 + vertex -95.9185 -82 26.5333 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -95.51 -82 25.685 + vertex -95.3502 -82 26.1673 + vertex -95.26 -82 25.685 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -95.3502 -82 26.1673 + vertex -95.51 -82 25.685 + vertex -95.6175 -82 26.1557 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex -95.3502 -82 25.2027 + vertex -95.51 -82 25.685 + vertex -95.26 -82 25.685 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -95.51 -82 25.685 + vertex -95.3502 -82 25.2027 + vertex -95.6175 -82 25.2143 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex -95.6084 -82 24.7856 + vertex -95.6175 -82 25.2143 + vertex -95.3502 -82 25.2027 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -95.6175 -82 25.2143 + vertex -95.6084 -82 24.7856 + vertex -95.9185 -82 24.8367 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -96 -82 24.49 + vertex -95.9185 -82 24.8367 + vertex -95.6084 -82 24.7856 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -96.4718 -82 24.3557 + vertex -96.3536 -82 24.6272 + vertex -96 -82 24.49 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -95.9185 -82 24.8367 + vertex -96 -82 24.49 + vertex -96.3536 -82 24.6272 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -97.2715 -82 26.5333 + vertex -96.9603 -82 26.969 + vertex -96.8364 -82 26.7428 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -96.9603 -82 26.969 + vertex -97.2715 -82 26.5333 + vertex -97.3995 -82 26.7503 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -97.2715 -82 26.5333 + vertex -97.73 -82 26.3878 + vertex -97.3995 -82 26.7503 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex -97.5725 -82 26.1557 + vertex -97.73 -82 26.3878 + vertex -97.2715 -82 26.5333 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -97.5725 -82 26.1557 + vertex -97.9073 -82 25.9303 + vertex -97.73 -82 26.3878 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex -97.68 -82 25.685 + vertex -97.9073 -82 25.9303 + vertex -97.5725 -82 26.1557 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -97.68 -82 25.685 + vertex -97.9073 -82 25.4397 + vertex -97.9073 -82 25.9303 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -97.5725 -82 25.2143 + vertex -97.9073 -82 25.4397 + vertex -97.68 -82 25.685 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -97.5725 -82 25.2143 + vertex -97.73 -82 24.9822 + vertex -97.9073 -82 25.4397 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex -97.5295 -82 24.7623 + vertex -97.5725 -82 25.2143 + vertex -97.2715 -82 24.8367 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -97.5725 -82 25.2143 + vertex -97.5295 -82 24.7623 + vertex -97.73 -82 24.9822 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex -96.9798 -82 24.4107 + vertex -97.2715 -82 24.8367 + vertex -96.8755 -82 24.646 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -106.523 -82 25.9943 + vertex -106.139 -82 26.2927 + vertex -106.146 -82 26.04 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -97.5295 -82 24.7623 + vertex -106.146 -82 26.04 + vertex -106.139 -82 26.2927 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -97.2715 -82 24.8367 + vertex -96.9798 -82 24.4107 + vertex -97.5295 -82 24.7623 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -96.8872 -82 24.3942 + vertex -96.8755 -82 24.646 + vertex -96.7696 -82 24.6272 + endloop + endfacet + facet normal -0 1 0 + outer loop + vertex -96.605 -82 24.368 + vertex -96.3536 -82 24.6272 + vertex -96.4718 -82 24.3557 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -97.5295 -82 24.7623 + vertex -96.9798 -82 24.4107 + vertex -106.146 -82 26.04 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -96.8755 -82 24.646 + vertex -96.8872 -82 24.3942 + vertex -96.9798 -82 24.4107 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -96.9798 -82 24.4107 + vertex -96.8872 -82 24.3942 + vertex -96.9603 -82 24.401 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -96.7696 -82 24.6272 + vertex -96.605 -82 24.368 + vertex -96.8872 -82 24.3942 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -96.3536 -82 24.6272 + vertex -96.605 -82 24.368 + vertex -96.7696 -82 24.6272 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -106.139 -82 26.2927 + vertex -106.523 -82 25.9943 + vertex -106.615 -82 26.235 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -106.523 -82 25.9943 + vertex -107.009 -82 25.9631 + vertex -106.615 -82 26.235 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex -106.816 -82 25.7924 + vertex -107.009 -82 25.9631 + vertex -106.523 -82 25.9943 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -106.816 -82 25.7924 + vertex -107.231 -82 25.5393 + vertex -107.009 -82 25.9631 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex -106.981 -82 25.4777 + vertex -107.231 -82 25.5393 + vertex -106.816 -82 25.7924 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -107 -82 24.13 + vertex -106.981 -82 25.4777 + vertex -106.981 -82 24.13 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -106.981 -82 25.4777 + vertex -107 -82 24.13 + vertex -107.231 -82 25.5393 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex -107 -82 22.13 + vertex -107.231 -82 25.5393 + vertex -107 -82 24.13 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -107 -82 22.1 + vertex -107 -82 22.13 + vertex -106.981 -82 22.1 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex -107 -82 22.1 + vertex -107.231 -82 25.5393 + vertex -107 -82 22.13 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -107.231 -82 19.0607 + vertex -107 -82 22.1 + vertex -107 -82 20.5 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -107.231 -82 19.0607 + vertex -107 -82 20.5 + vertex -106.981 -82 19.1223 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -107 -82 22.1 + vertex -107.231 -82 19.0607 + vertex -107.231 -82 25.5393 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -106.816 -82 18.8076 + vertex -107.231 -82 19.0607 + vertex -106.981 -82 19.1223 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -106.816 -82 18.8076 + vertex -107.009 -82 18.6369 + vertex -107.231 -82 19.0607 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -106.523 -82 18.6057 + vertex -107.009 -82 18.6369 + vertex -106.816 -82 18.8076 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -106.139 -82 18.3073 + vertex -106.523 -82 18.6057 + vertex -106.146 -82 18.56 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -106.523 -82 18.6057 + vertex -106.615 -82 18.365 + vertex -107.009 -82 18.6369 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -96.8872 -82 24.3942 + vertex -96.605 -82 24.368 + vertex -96.605 -82 24.344 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -96.9798 -82 20.1893 + vertex -97.2715 -82 19.7633 + vertex -97.5295 -82 19.8377 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -97.5725 -82 19.3857 + vertex -97.5295 -82 19.8377 + vertex -97.2715 -82 19.7633 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -97.5295 -82 19.8377 + vertex -97.5725 -82 19.3857 + vertex -97.73 -82 19.6178 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -97.5725 -82 19.3857 + vertex -97.9073 -82 19.1603 + vertex -97.73 -82 19.6178 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex -97.68 -82 18.915 + vertex -97.9073 -82 19.1603 + vertex -97.5725 -82 19.3857 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -97.68 -82 18.915 + vertex -97.9073 -82 18.6697 + vertex -97.9073 -82 19.1603 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -97.5725 -82 18.4443 + vertex -97.9073 -82 18.6697 + vertex -97.68 -82 18.915 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -97.5725 -82 18.4443 + vertex -97.73 -82 18.2122 + vertex -97.9073 -82 18.6697 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -97.2715 -82 18.0667 + vertex -97.73 -82 18.2122 + vertex -97.5725 -82 18.4443 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex -96.9603 -82 17.631 + vertex -97.2715 -82 18.0667 + vertex -96.8364 -82 17.8572 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -97.2715 -82 18.0667 + vertex -97.3995 -82 17.8497 + vertex -97.73 -82 18.2122 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex -95.9185 -82 19.7633 + vertex -96 -82 20.11 + vertex -95.6084 -82 19.8144 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -96 -82 20.11 + vertex -95.9185 -82 19.7633 + vertex -96.3536 -82 19.9728 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -95.6175 -82 19.3857 + vertex -95.6084 -82 19.8144 + vertex -95.3502 -82 19.3973 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -95.6084 -82 19.8144 + vertex -95.6175 -82 19.3857 + vertex -95.9185 -82 19.7633 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -95.51 -82 18.915 + vertex -95.3502 -82 19.3973 + vertex -95.26 -82 18.915 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -95.3502 -82 19.3973 + vertex -95.51 -82 18.915 + vertex -95.6175 -82 19.3857 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex -95.3502 -82 18.4327 + vertex -95.51 -82 18.915 + vertex -95.26 -82 18.915 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -95.51 -82 18.915 + vertex -95.3502 -82 18.4327 + vertex -95.6175 -82 18.4443 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex -95.6084 -82 18.0156 + vertex -95.6175 -82 18.4443 + vertex -95.3502 -82 18.4327 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -95.6175 -82 18.4443 + vertex -95.6084 -82 18.0156 + vertex -95.9185 -82 18.0667 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -96 -82 17.72 + vertex -95.9185 -82 18.0667 + vertex -95.6084 -82 18.0156 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex -96.4718 -82 17.5857 + vertex -96.8364 -82 17.8572 + vertex -96.3536 -82 17.8572 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -95.9185 -82 18.0667 + vertex -96 -82 17.72 + vertex -96.3536 -82 17.8572 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -96.4718 -82 17.5857 + vertex -96.3536 -82 17.8572 + vertex -96 -82 17.72 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -97.2715 -82 18.0667 + vertex -96.9603 -82 17.631 + vertex -97.3995 -82 17.8497 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -96.8364 -82 17.8572 + vertex -96.4718 -82 17.5857 + vertex -96.9603 -82 17.631 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -96.8872 -82 20.2058 + vertex -96.9798 -82 20.1893 + vertex -96.9603 -82 20.199 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex -96.7696 -82 19.9728 + vertex -96.8872 -82 20.2058 + vertex -96.605 -82 20.232 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -96.3536 -82 19.9728 + vertex -96.605 -82 20.232 + vertex -96.4718 -82 20.2443 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex -96.3536 -82 19.9728 + vertex -96.4718 -82 20.2443 + vertex -96 -82 20.11 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -96.605 -82 20.232 + vertex -96.3536 -82 19.9728 + vertex -96.7696 -82 19.9728 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex -96.8755 -82 19.954 + vertex -96.8872 -82 20.2058 + vertex -96.7696 -82 19.9728 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -96.8872 -82 20.2058 + vertex -96.8755 -82 19.954 + vertex -96.9798 -82 20.1893 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -97.2715 -82 19.7633 + vertex -96.9798 -82 20.1893 + vertex -96.8755 -82 19.954 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex -97.5295 -82 19.8377 + vertex -106.146 -82 18.56 + vertex -96.9798 -82 20.1893 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex -106.139 -82 18.3073 + vertex -106.146 -82 18.56 + vertex -97.5295 -82 19.8377 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -106.523 -82 18.6057 + vertex -106.139 -82 18.3073 + vertex -106.615 -82 18.365 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -96.605 -82 20.256 + vertex -96.605 -82 20.232 + vertex -96.8872 -82 20.2058 + endloop + endfacet + facet normal 0 -1 -0 + outer loop + vertex -96.605 -101 20.256 + vertex -96.8872 -101 20.2058 + vertex -96.605 -101 20.232 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 106.981 -101 20.5 + vertex 106.981 -101 19.1223 + vertex 107 -101 20.5 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -96.8872 -101 24.3942 + vertex -96.605 -101 24.344 + vertex -96.605 -101 24.368 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -106.139 -101 26.2927 + vertex -106.523 -101 25.9943 + vertex -106.146 -101 26.04 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -107.009 -101 25.9631 + vertex -106.523 -101 25.9943 + vertex -106.615 -101 26.235 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -107.009 -101 25.9631 + vertex -106.816 -101 25.7924 + vertex -106.523 -101 25.9943 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -107.231 -101 25.5393 + vertex -106.816 -101 25.7924 + vertex -107.009 -101 25.9631 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -107.231 -101 25.5393 + vertex -106.981 -101 25.4777 + vertex -106.816 -101 25.7924 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -107.231 -101 25.5393 + vertex -106.981 -101 24.13 + vertex -106.981 -101 25.4777 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -106.981 -101 24.13 + vertex -106.981 -101 22.13 + vertex 106.981 -101 24.13 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -107 -101 22.1 + vertex -106.981 -101 24.13 + vertex -107.231 -101 25.5393 + endloop + endfacet + facet normal 0 -1 -0 + outer loop + vertex -106.981 -101 24.13 + vertex -107 -101 22.1 + vertex -106.981 -101 22.13 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -107.231 -101 19.0607 + vertex -107 -101 22.1 + vertex -107.231 -101 25.5393 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -107 -101 20.5 + vertex -106.981 -101 19.1223 + vertex -106.981 -101 20.5 + endloop + endfacet + facet normal 0 -1 -0 + outer loop + vertex -107 -101 22.1 + vertex -107.231 -101 19.0607 + vertex -107 -101 20.5 + endloop + endfacet + facet normal 0 -1 -0 + outer loop + vertex -107 -101 20.5 + vertex -107.231 -101 19.0607 + vertex -106.981 -101 19.1223 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -107.231 -101 19.0607 + vertex -106.816 -101 18.8076 + vertex -106.981 -101 19.1223 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -107.009 -101 18.6369 + vertex -106.816 -101 18.8076 + vertex -107.231 -101 19.0607 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -107.009 -101 18.6369 + vertex -106.523 -101 18.6057 + vertex -106.816 -101 18.8076 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -106.615 -101 18.365 + vertex -106.523 -101 18.6057 + vertex -107.009 -101 18.6369 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -106.139 -101 18.3073 + vertex -106.523 -101 18.6057 + vertex -106.615 -101 18.365 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -106.523 -101 25.9943 + vertex -106.139 -101 26.2927 + vertex -106.615 -101 26.235 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -106.146 -101 26.04 + vertex -97.5295 -101 24.7623 + vertex -106.139 -101 26.2927 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -96.9798 -101 24.4107 + vertex -97.5295 -101 24.7623 + vertex -106.146 -101 26.04 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -97.5295 -101 24.7623 + vertex -96.9798 -101 24.4107 + vertex -96.8755 -101 24.646 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -96.605 -101 24.368 + vertex -96.3536 -101 24.6272 + vertex -96.7696 -101 24.6272 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -96.8872 -101 24.3942 + vertex -96.8755 -101 24.646 + vertex -96.9798 -101 24.4107 + endloop + endfacet + facet normal 0 -1 -0 + outer loop + vertex -96.8755 -101 24.646 + vertex -96.8872 -101 24.3942 + vertex -96.7696 -101 24.6272 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -96.8872 -101 24.3942 + vertex -96.9798 -101 24.4107 + vertex -96.9603 -101 24.401 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -96.605 -101 24.368 + vertex -96.7696 -101 24.6272 + vertex -96.8872 -101 24.3942 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -96.3536 -101 24.6272 + vertex -96.605 -101 24.368 + vertex -96.4718 -101 24.3557 + endloop + endfacet + facet normal 0 -1 -0 + outer loop + vertex -96.3536 -101 24.6272 + vertex -96.4718 -101 24.3557 + vertex -96 -101 24.49 + endloop + endfacet + facet normal 0 -1 -0 + outer loop + vertex -96.9603 -101 26.969 + vertex -97.2715 -101 26.5333 + vertex -96.8364 -101 26.7428 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -97.73 -101 26.3878 + vertex -97.2715 -101 26.5333 + vertex -97.3995 -101 26.7503 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -97.73 -101 26.3878 + vertex -97.5725 -101 26.1557 + vertex -97.2715 -101 26.5333 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -97.9073 -101 25.9303 + vertex -97.5725 -101 26.1557 + vertex -97.73 -101 26.3878 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -97.9073 -101 25.9303 + vertex -97.68 -101 25.685 + vertex -97.5725 -101 26.1557 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -97.9073 -101 25.4397 + vertex -97.68 -101 25.685 + vertex -97.9073 -101 25.9303 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -97.9073 -101 25.4397 + vertex -97.5725 -101 25.2143 + vertex -97.68 -101 25.685 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -97.73 -101 24.9822 + vertex -97.5725 -101 25.2143 + vertex -97.9073 -101 25.4397 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -97.5295 -101 24.7623 + vertex -97.5725 -101 25.2143 + vertex -97.73 -101 24.9822 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -97.5725 -101 25.2143 + vertex -97.5295 -101 24.7623 + vertex -97.2715 -101 24.8367 + endloop + endfacet + facet normal 0 -1 -0 + outer loop + vertex -97.2715 -101 24.8367 + vertex -97.5295 -101 24.7623 + vertex -96.8755 -101 24.646 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -96.8364 -101 26.7428 + vertex -96.4718 -101 27.0143 + vertex -96.9603 -101 26.969 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -97.2715 -101 26.5333 + vertex -96.9603 -101 26.969 + vertex -97.3995 -101 26.7503 + endloop + endfacet + facet normal 0 -1 -0 + outer loop + vertex -96.4718 -101 27.0143 + vertex -96.8364 -101 26.7428 + vertex -96.3536 -101 26.7428 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -96.4718 -101 27.0143 + vertex -96.3536 -101 26.7428 + vertex -96 -101 26.88 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -95.9185 -101 26.5333 + vertex -96 -101 26.88 + vertex -96.3536 -101 26.7428 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -96 -101 26.88 + vertex -95.9185 -101 26.5333 + vertex -95.6084 -101 26.5844 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -95.6175 -101 26.1557 + vertex -95.6084 -101 26.5844 + vertex -95.9185 -101 26.5333 + endloop + endfacet + facet normal 0 -1 -0 + outer loop + vertex -95.6084 -101 26.5844 + vertex -95.6175 -101 26.1557 + vertex -95.3502 -101 26.1673 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -95.51 -101 25.685 + vertex -95.3502 -101 26.1673 + vertex -95.6175 -101 26.1557 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -95.51 -101 25.685 + vertex -95.26 -101 25.685 + vertex -95.3502 -101 26.1673 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -95.3502 -101 25.2027 + vertex -95.51 -101 25.685 + vertex -95.6175 -101 25.2143 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -95.51 -101 25.685 + vertex -95.3502 -101 25.2027 + vertex -95.26 -101 25.685 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -95.6084 -101 24.7856 + vertex -95.6175 -101 25.2143 + vertex -95.9185 -101 24.8367 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -95.6175 -101 25.2143 + vertex -95.6084 -101 24.7856 + vertex -95.3502 -101 25.2027 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -96 -101 24.49 + vertex -95.9185 -101 24.8367 + vertex -96.3536 -101 24.6272 + endloop + endfacet + facet normal 0 -1 -0 + outer loop + vertex -95.9185 -101 24.8367 + vertex -96 -101 24.49 + vertex -95.6084 -101 24.7856 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 96.3536 -101 26.7428 + vertex 96.4718 -101 27.0143 + vertex 96 -101 26.88 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 96.8364 -101 26.7428 + vertex 96.4718 -101 27.0143 + vertex 96.3536 -101 26.7428 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 96.4718 -101 27.0143 + vertex 96.8364 -101 26.7428 + vertex 96.9603 -101 26.969 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 95.9185 -101 26.5333 + vertex 96 -101 26.88 + vertex 95.6084 -101 26.5844 + endloop + endfacet + facet normal 0 -1 -0 + outer loop + vertex 96 -101 26.88 + vertex 95.9185 -101 26.5333 + vertex 96.3536 -101 26.7428 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 95.6175 -101 26.1557 + vertex 95.6084 -101 26.5844 + vertex 95.3502 -101 26.1673 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 95.6084 -101 26.5844 + vertex 95.6175 -101 26.1557 + vertex 95.9185 -101 26.5333 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 95.51 -101 25.685 + vertex 95.3502 -101 26.1673 + vertex 95.26 -101 25.685 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 95.3502 -101 26.1673 + vertex 95.51 -101 25.685 + vertex 95.6175 -101 26.1557 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 95.3502 -101 25.2027 + vertex 95.51 -101 25.685 + vertex 95.26 -101 25.685 + endloop + endfacet + facet normal 0 -1 -0 + outer loop + vertex 95.51 -101 25.685 + vertex 95.3502 -101 25.2027 + vertex 95.6175 -101 25.2143 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 95.6084 -101 24.7856 + vertex 95.6175 -101 25.2143 + vertex 95.3502 -101 25.2027 + endloop + endfacet + facet normal 0 -1 -0 + outer loop + vertex 95.6175 -101 25.2143 + vertex 95.6084 -101 24.7856 + vertex 95.9185 -101 24.8367 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 96 -101 24.49 + vertex 95.9185 -101 24.8367 + vertex 95.6084 -101 24.7856 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 96.4718 -101 24.3557 + vertex 96.3536 -101 24.6272 + vertex 96 -101 24.49 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 95.9185 -101 24.8367 + vertex 96 -101 24.49 + vertex 96.3536 -101 24.6272 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 97.2715 -101 26.5333 + vertex 96.9603 -101 26.969 + vertex 96.8364 -101 26.7428 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 96.9603 -101 26.969 + vertex 97.2715 -101 26.5333 + vertex 97.3995 -101 26.7503 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 97.2715 -101 26.5333 + vertex 97.73 -101 26.3878 + vertex 97.3995 -101 26.7503 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 97.5725 -101 26.1557 + vertex 97.73 -101 26.3878 + vertex 97.2715 -101 26.5333 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 97.5725 -101 26.1557 + vertex 97.9073 -101 25.9303 + vertex 97.73 -101 26.3878 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 97.68 -101 25.685 + vertex 97.9073 -101 25.9303 + vertex 97.5725 -101 26.1557 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 97.68 -101 25.685 + vertex 97.9073 -101 25.4397 + vertex 97.9073 -101 25.9303 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 97.5725 -101 25.2143 + vertex 97.9073 -101 25.4397 + vertex 97.68 -101 25.685 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 97.5725 -101 25.2143 + vertex 97.73 -101 24.9822 + vertex 97.9073 -101 25.4397 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 97.5295 -101 24.7623 + vertex 97.5725 -101 25.2143 + vertex 97.2715 -101 24.8367 + endloop + endfacet + facet normal 0 -1 -0 + outer loop + vertex 97.5725 -101 25.2143 + vertex 97.5295 -101 24.7623 + vertex 97.73 -101 24.9822 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 96.9798 -101 24.4107 + vertex 97.2715 -101 24.8367 + vertex 96.8755 -101 24.646 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 106.523 -101 25.9943 + vertex 106.139 -101 26.2927 + vertex 106.146 -101 26.04 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 97.5295 -101 24.7623 + vertex 106.146 -101 26.04 + vertex 106.139 -101 26.2927 + endloop + endfacet + facet normal 0 -1 -0 + outer loop + vertex 97.2715 -101 24.8367 + vertex 96.9798 -101 24.4107 + vertex 97.5295 -101 24.7623 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 96.8872 -101 24.3942 + vertex 96.8755 -101 24.646 + vertex 96.7696 -101 24.6272 + endloop + endfacet + facet normal -0 -1 0 + outer loop + vertex 96.605 -101 24.368 + vertex 96.3536 -101 24.6272 + vertex 96.4718 -101 24.3557 + endloop + endfacet + facet normal 0 -1 -0 + outer loop + vertex 97.5295 -101 24.7623 + vertex 96.9798 -101 24.4107 + vertex 106.146 -101 26.04 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 96.8755 -101 24.646 + vertex 96.8872 -101 24.3942 + vertex 96.9798 -101 24.4107 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 96.9798 -101 24.4107 + vertex 96.8872 -101 24.3942 + vertex 96.9603 -101 24.401 + endloop + endfacet + facet normal 0 -1 -0 + outer loop + vertex 96.7696 -101 24.6272 + vertex 96.605 -101 24.368 + vertex 96.8872 -101 24.3942 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 96.3536 -101 24.6272 + vertex 96.605 -101 24.368 + vertex 96.7696 -101 24.6272 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 106.139 -101 26.2927 + vertex 106.523 -101 25.9943 + vertex 106.615 -101 26.235 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 106.523 -101 25.9943 + vertex 107.009 -101 25.9631 + vertex 106.615 -101 26.235 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 106.816 -101 25.7924 + vertex 107.009 -101 25.9631 + vertex 106.523 -101 25.9943 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 106.816 -101 25.7924 + vertex 107.231 -101 25.5393 + vertex 107.009 -101 25.9631 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 106.981 -101 25.4777 + vertex 107.231 -101 25.5393 + vertex 106.816 -101 25.7924 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 106.981 -101 24.13 + vertex 107.231 -101 25.5393 + vertex 106.981 -101 25.4777 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 106.981 -101 22.13 + vertex 106.981 -101 24.13 + vertex -106.981 -101 22.13 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 107 -101 22.1 + vertex 106.981 -101 24.13 + vertex 106.981 -101 22.13 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 107 -101 22.1 + vertex 106.981 -101 22.13 + vertex 106.981 -101 22.1 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 106.981 -101 24.13 + vertex 107 -101 22.1 + vertex 107.231 -101 25.5393 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 107.231 -101 19.0607 + vertex 107 -101 22.1 + vertex 107 -101 20.5 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 107.231 -101 19.0607 + vertex 107 -101 20.5 + vertex 106.981 -101 19.1223 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 107 -101 22.1 + vertex 107.231 -101 19.0607 + vertex 107.231 -101 25.5393 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 106.816 -101 18.8076 + vertex 107.231 -101 19.0607 + vertex 106.981 -101 19.1223 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 106.816 -101 18.8076 + vertex 107.009 -101 18.6369 + vertex 107.231 -101 19.0607 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 106.523 -101 18.6057 + vertex 107.009 -101 18.6369 + vertex 106.816 -101 18.8076 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 106.139 -101 18.3073 + vertex 106.523 -101 18.6057 + vertex 106.146 -101 18.56 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 106.523 -101 18.6057 + vertex 106.615 -101 18.365 + vertex 107.009 -101 18.6369 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 96.8872 -101 24.3942 + vertex 96.605 -101 24.368 + vertex 96.605 -101 24.344 + endloop + endfacet + facet normal 0 -1 -0 + outer loop + vertex -106.981 -101 22.13 + vertex -107 -101 22.1 + vertex -106.981 -101 22.1 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -96.9798 -101 20.1893 + vertex -96.8872 -101 20.2058 + vertex -96.9603 -101 20.199 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -96.8755 -101 19.954 + vertex -96.8872 -101 20.2058 + vertex -96.9798 -101 20.1893 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -96.8872 -101 20.2058 + vertex -96.7696 -101 19.9728 + vertex -96.605 -101 20.232 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -96.3536 -101 19.9728 + vertex -96.605 -101 20.232 + vertex -96.7696 -101 19.9728 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -96.605 -101 20.232 + vertex -96.3536 -101 19.9728 + vertex -96.4718 -101 20.2443 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -96.8872 -101 20.2058 + vertex -96.8755 -101 19.954 + vertex -96.7696 -101 19.9728 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -97.2715 -101 19.7633 + vertex -96.9798 -101 20.1893 + vertex -97.5295 -101 19.8377 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -106.146 -101 18.56 + vertex -97.5295 -101 19.8377 + vertex -96.9798 -101 20.1893 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -106.523 -101 18.6057 + vertex -106.139 -101 18.3073 + vertex -106.146 -101 18.56 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -106.146 -101 18.56 + vertex -106.139 -101 18.3073 + vertex -97.5295 -101 19.8377 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -96.4718 -101 20.2443 + vertex -96.3536 -101 19.9728 + vertex -96 -101 20.11 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -95.9185 -101 19.7633 + vertex -96 -101 20.11 + vertex -96.3536 -101 19.9728 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -96 -101 20.11 + vertex -95.9185 -101 19.7633 + vertex -95.6084 -101 19.8144 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -95.6175 -101 19.3857 + vertex -95.6084 -101 19.8144 + vertex -95.9185 -101 19.7633 + endloop + endfacet + facet normal 0 -1 -0 + outer loop + vertex -95.6084 -101 19.8144 + vertex -95.6175 -101 19.3857 + vertex -95.3502 -101 19.3973 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -95.51 -101 18.915 + vertex -95.3502 -101 19.3973 + vertex -95.6175 -101 19.3857 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -95.51 -101 18.915 + vertex -95.26 -101 18.915 + vertex -95.3502 -101 19.3973 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -95.3502 -101 18.4327 + vertex -95.51 -101 18.915 + vertex -95.6175 -101 18.4443 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -95.51 -101 18.915 + vertex -95.3502 -101 18.4327 + vertex -95.26 -101 18.915 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -95.6084 -101 18.0156 + vertex -95.6175 -101 18.4443 + vertex -95.9185 -101 18.0667 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -95.6175 -101 18.4443 + vertex -95.6084 -101 18.0156 + vertex -95.3502 -101 18.4327 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -96 -101 17.72 + vertex -95.9185 -101 18.0667 + vertex -96.3536 -101 17.8572 + endloop + endfacet + facet normal 0 -1 -0 + outer loop + vertex -95.9185 -101 18.0667 + vertex -96 -101 17.72 + vertex -95.6084 -101 18.0156 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -96.8364 -101 17.8572 + vertex -96 -101 17.72 + vertex -96.3536 -101 17.8572 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -96.4718 -101 17.5857 + vertex -96.8364 -101 17.8572 + vertex -96.9603 -101 17.631 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -96.8364 -101 17.8572 + vertex -96.4718 -101 17.5857 + vertex -96 -101 17.72 + endloop + endfacet + facet normal 0 -1 -0 + outer loop + vertex -96.9798 -101 20.1893 + vertex -97.2715 -101 19.7633 + vertex -96.8755 -101 19.954 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -97.5725 -101 19.3857 + vertex -97.5295 -101 19.8377 + vertex -97.73 -101 19.6178 + endloop + endfacet + facet normal 0 -1 -0 + outer loop + vertex -97.5295 -101 19.8377 + vertex -97.5725 -101 19.3857 + vertex -97.2715 -101 19.7633 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -97.9073 -101 19.1603 + vertex -97.5725 -101 19.3857 + vertex -97.73 -101 19.6178 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -97.9073 -101 19.1603 + vertex -97.68 -101 18.915 + vertex -97.5725 -101 19.3857 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -97.9073 -101 18.6697 + vertex -97.68 -101 18.915 + vertex -97.9073 -101 19.1603 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -97.9073 -101 18.6697 + vertex -97.5725 -101 18.4443 + vertex -97.68 -101 18.915 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -97.73 -101 18.2122 + vertex -97.5725 -101 18.4443 + vertex -97.9073 -101 18.6697 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -97.73 -101 18.2122 + vertex -97.2715 -101 18.0667 + vertex -97.5725 -101 18.4443 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -97.3995 -101 17.8497 + vertex -97.2715 -101 18.0667 + vertex -97.73 -101 18.2122 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -97.2715 -101 18.0667 + vertex -96.9603 -101 17.631 + vertex -96.8364 -101 17.8572 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -96.9603 -101 17.631 + vertex -97.2715 -101 18.0667 + vertex -97.3995 -101 17.8497 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 96.9798 -101 20.1893 + vertex 97.2715 -101 19.7633 + vertex 97.5295 -101 19.8377 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 97.5725 -101 19.3857 + vertex 97.5295 -101 19.8377 + vertex 97.2715 -101 19.7633 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 97.5295 -101 19.8377 + vertex 97.5725 -101 19.3857 + vertex 97.73 -101 19.6178 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 97.5725 -101 19.3857 + vertex 97.9073 -101 19.1603 + vertex 97.73 -101 19.6178 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 97.68 -101 18.915 + vertex 97.9073 -101 19.1603 + vertex 97.5725 -101 19.3857 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 97.68 -101 18.915 + vertex 97.9073 -101 18.6697 + vertex 97.9073 -101 19.1603 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 97.5725 -101 18.4443 + vertex 97.9073 -101 18.6697 + vertex 97.68 -101 18.915 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 97.5725 -101 18.4443 + vertex 97.73 -101 18.2122 + vertex 97.9073 -101 18.6697 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 97.2715 -101 18.0667 + vertex 97.73 -101 18.2122 + vertex 97.5725 -101 18.4443 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 96.9603 -101 17.631 + vertex 97.2715 -101 18.0667 + vertex 96.8364 -101 17.8572 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 97.2715 -101 18.0667 + vertex 97.3995 -101 17.8497 + vertex 97.73 -101 18.2122 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 95.9185 -101 19.7633 + vertex 96 -101 20.11 + vertex 95.6084 -101 19.8144 + endloop + endfacet + facet normal 0 -1 -0 + outer loop + vertex 96 -101 20.11 + vertex 95.9185 -101 19.7633 + vertex 96.3536 -101 19.9728 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 95.6175 -101 19.3857 + vertex 95.6084 -101 19.8144 + vertex 95.3502 -101 19.3973 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 95.6084 -101 19.8144 + vertex 95.6175 -101 19.3857 + vertex 95.9185 -101 19.7633 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 95.51 -101 18.915 + vertex 95.3502 -101 19.3973 + vertex 95.26 -101 18.915 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 95.3502 -101 19.3973 + vertex 95.51 -101 18.915 + vertex 95.6175 -101 19.3857 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 95.3502 -101 18.4327 + vertex 95.51 -101 18.915 + vertex 95.26 -101 18.915 + endloop + endfacet + facet normal 0 -1 -0 + outer loop + vertex 95.51 -101 18.915 + vertex 95.3502 -101 18.4327 + vertex 95.6175 -101 18.4443 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 95.6084 -101 18.0156 + vertex 95.6175 -101 18.4443 + vertex 95.3502 -101 18.4327 + endloop + endfacet + facet normal 0 -1 -0 + outer loop + vertex 95.6175 -101 18.4443 + vertex 95.6084 -101 18.0156 + vertex 95.9185 -101 18.0667 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 96 -101 17.72 + vertex 95.9185 -101 18.0667 + vertex 95.6084 -101 18.0156 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 96.4718 -101 17.5857 + vertex 96.8364 -101 17.8572 + vertex 96.3536 -101 17.8572 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 95.9185 -101 18.0667 + vertex 96 -101 17.72 + vertex 96.3536 -101 17.8572 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 96.4718 -101 17.5857 + vertex 96.3536 -101 17.8572 + vertex 96 -101 17.72 + endloop + endfacet + facet normal 0 -1 -0 + outer loop + vertex 97.2715 -101 18.0667 + vertex 96.9603 -101 17.631 + vertex 97.3995 -101 17.8497 + endloop + endfacet + facet normal 0 -1 -0 + outer loop + vertex 96.8364 -101 17.8572 + vertex 96.4718 -101 17.5857 + vertex 96.9603 -101 17.631 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 96.8872 -101 20.2058 + vertex 96.9798 -101 20.1893 + vertex 96.9603 -101 20.199 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 96.7696 -101 19.9728 + vertex 96.8872 -101 20.2058 + vertex 96.605 -101 20.232 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 96.3536 -101 19.9728 + vertex 96.605 -101 20.232 + vertex 96.4718 -101 20.2443 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 96.3536 -101 19.9728 + vertex 96.4718 -101 20.2443 + vertex 96 -101 20.11 + endloop + endfacet + facet normal 0 -1 -0 + outer loop + vertex 96.605 -101 20.232 + vertex 96.3536 -101 19.9728 + vertex 96.7696 -101 19.9728 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 96.8755 -101 19.954 + vertex 96.8872 -101 20.2058 + vertex 96.7696 -101 19.9728 + endloop + endfacet + facet normal 0 -1 -0 + outer loop + vertex 96.8872 -101 20.2058 + vertex 96.8755 -101 19.954 + vertex 96.9798 -101 20.1893 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 97.2715 -101 19.7633 + vertex 96.9798 -101 20.1893 + vertex 96.8755 -101 19.954 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 97.5295 -101 19.8377 + vertex 106.146 -101 18.56 + vertex 96.9798 -101 20.1893 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 106.139 -101 18.3073 + vertex 106.146 -101 18.56 + vertex 97.5295 -101 19.8377 + endloop + endfacet + facet normal 0 -1 -0 + outer loop + vertex 106.523 -101 18.6057 + vertex 106.139 -101 18.3073 + vertex 106.615 -101 18.365 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 96.605 -101 20.256 + vertex 96.605 -101 20.232 + vertex 96.8872 -101 20.2058 + endloop + endfacet + facet normal 0.175007 0 0.984567 + outer loop + vertex -106.139 -82 26.2927 + vertex -97.5295 -101 24.7623 + vertex -97.5295 -82 24.7623 + endloop + endfacet + facet normal 0.175007 0 0.984567 + outer loop + vertex -97.5295 -101 24.7623 + vertex -106.139 -82 26.2927 + vertex -106.139 -101 26.2927 + endloop + endfacet + facet normal 0.175 0 0.984568 + outer loop + vertex -96.8755 -82 24.646 + vertex -96.7696 -101 24.6272 + vertex -96.7696 -82 24.6272 + endloop + endfacet + facet normal 0.175 0 0.984568 + outer loop + vertex -96.7696 -101 24.6272 + vertex -96.8755 -82 24.646 + vertex -96.8755 -101 24.646 + endloop + endfacet + facet normal -0.120538 0 0.992709 + outer loop + vertex -106.615 -82 26.235 + vertex -106.139 -101 26.2927 + vertex -106.139 -82 26.2927 + endloop + endfacet + facet normal -0.120538 0 0.992709 + outer loop + vertex -106.139 -101 26.2927 + vertex -106.615 -82 26.235 + vertex -106.615 -101 26.235 + endloop + endfacet + facet normal -0.568069 0 0.822981 + outer loop + vertex -107.009 -82 25.9631 + vertex -106.615 -101 26.235 + vertex -106.615 -82 26.235 + endloop + endfacet + facet normal -0.568069 0 0.822981 + outer loop + vertex -106.615 -101 26.235 + vertex -107.009 -82 25.9631 + vertex -107.009 -101 25.9631 + endloop + endfacet + facet normal -0.885462 0 0.464712 + outer loop + vertex -107.231 -101 25.5393 + vertex -107.009 -82 25.9631 + vertex -107.231 -82 25.5393 + endloop + endfacet + facet normal -0.885462 0 0.464712 + outer loop + vertex -107.009 -82 25.9631 + vertex -107.231 -101 25.5393 + vertex -107.009 -101 25.9631 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -107.231 -101 19.0607 + vertex -107.231 -82 25.5393 + vertex -107.231 -82 19.0607 + endloop + endfacet + facet normal -1 -0 0 + outer loop + vertex -107.231 -82 25.5393 + vertex -107.231 -101 19.0607 + vertex -107.231 -101 25.5393 + endloop + endfacet + facet normal -0.885462 0 -0.464712 + outer loop + vertex -107.009 -101 18.6369 + vertex -107.231 -82 19.0607 + vertex -107.009 -82 18.6369 + endloop + endfacet + facet normal -0.885462 -0 -0.464712 + outer loop + vertex -107.231 -82 19.0607 + vertex -107.009 -101 18.6369 + vertex -107.231 -101 19.0607 + endloop + endfacet + facet normal -0.568069 0 -0.822981 + outer loop + vertex -107.009 -101 18.6369 + vertex -106.615 -82 18.365 + vertex -106.615 -101 18.365 + endloop + endfacet + facet normal -0.568069 0 -0.822981 + outer loop + vertex -106.615 -82 18.365 + vertex -107.009 -101 18.6369 + vertex -107.009 -82 18.6369 + endloop + endfacet + facet normal -0.120538 0 -0.992709 + outer loop + vertex -106.615 -101 18.365 + vertex -106.139 -82 18.3073 + vertex -106.139 -101 18.3073 + endloop + endfacet + facet normal -0.120538 0 -0.992709 + outer loop + vertex -106.139 -82 18.3073 + vertex -106.615 -101 18.365 + vertex -106.615 -82 18.365 + endloop + endfacet + facet normal 0.175008 0 -0.984567 + outer loop + vertex -106.139 -101 18.3073 + vertex -97.5295 -82 19.8377 + vertex -97.5295 -101 19.8377 + endloop + endfacet + facet normal 0.175008 0 -0.984567 + outer loop + vertex -97.5295 -82 19.8377 + vertex -106.139 -101 18.3073 + vertex -106.139 -82 18.3073 + endloop + endfacet + facet normal 0.175 0 -0.984568 + outer loop + vertex -96.8755 -101 19.954 + vertex -96.7696 -82 19.9728 + vertex -96.7696 -101 19.9728 + endloop + endfacet + facet normal 0.175 0 -0.984568 + outer loop + vertex -96.7696 -82 19.9728 + vertex -96.8755 -101 19.954 + vertex -96.8755 -82 19.954 + endloop + endfacet + facet normal 0.568073 0 0.822978 + outer loop + vertex -106.816 -82 18.8076 + vertex -106.523 -101 18.6057 + vertex -106.523 -82 18.6057 + endloop + endfacet + facet normal 0.568073 0 0.822978 + outer loop + vertex -106.523 -101 18.6057 + vertex -106.816 -82 18.8076 + vertex -106.816 -101 18.8076 + endloop + endfacet + facet normal 0.88547 -0 0.464697 + outer loop + vertex -106.981 -101 19.1223 + vertex -106.816 -82 18.8076 + vertex -106.981 -82 19.1223 + endloop + endfacet + facet normal 0.88547 0 0.464697 + outer loop + vertex -106.816 -82 18.8076 + vertex -106.981 -101 19.1223 + vertex -106.816 -101 18.8076 + endloop + endfacet + facet normal 1 -0 0 + outer loop + vertex -106.981 -101 25.4777 + vertex -106.981 -82 24.13 + vertex -106.981 -82 25.4777 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex -106.981 -82 24.13 + vertex -106.981 -101 25.4777 + vertex -106.981 -101 24.13 + endloop + endfacet + facet normal 1 -0 0 + outer loop + vertex -106.981 -101 20.5 + vertex -106.981 -82 19.1223 + vertex -106.981 -82 20.5 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex -106.981 -82 19.1223 + vertex -106.981 -101 20.5 + vertex -106.981 -101 19.1223 + endloop + endfacet + facet normal 1 -0 0 + outer loop + vertex -106.981 -101 22.13 + vertex -106.981 -82 22.1 + vertex -106.981 -82 22.13 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex -106.981 -82 22.1 + vertex -106.981 -101 22.13 + vertex -106.981 -101 22.1 + endloop + endfacet + facet normal 0.88547 0 -0.464697 + outer loop + vertex -106.816 -101 25.7924 + vertex -106.981 -82 25.4777 + vertex -106.816 -82 25.7924 + endloop + endfacet + facet normal 0.88547 0 -0.464697 + outer loop + vertex -106.981 -82 25.4777 + vertex -106.816 -101 25.7924 + vertex -106.981 -101 25.4777 + endloop + endfacet + facet normal 0.568073 0 -0.822978 + outer loop + vertex -106.816 -101 25.7924 + vertex -106.523 -82 25.9943 + vertex -106.523 -101 25.9943 + endloop + endfacet + facet normal 0.568073 0 -0.822978 + outer loop + vertex -106.523 -82 25.9943 + vertex -106.816 -101 25.7924 + vertex -106.816 -82 25.7924 + endloop + endfacet + facet normal 0.120522 0 -0.992711 + outer loop + vertex -106.523 -101 25.9943 + vertex -106.146 -82 26.04 + vertex -106.146 -101 26.04 + endloop + endfacet + facet normal 0.120522 0 -0.992711 + outer loop + vertex -106.146 -82 26.04 + vertex -106.523 -101 25.9943 + vertex -106.523 -82 25.9943 + endloop + endfacet + facet normal -0.175007 0 -0.984567 + outer loop + vertex -106.146 -101 26.04 + vertex -96.9798 -82 24.4107 + vertex -96.9798 -101 24.4107 + endloop + endfacet + facet normal -0.175007 0 -0.984567 + outer loop + vertex -96.9798 -82 24.4107 + vertex -106.146 -101 26.04 + vertex -106.146 -82 26.04 + endloop + endfacet + facet normal -0.175007 0 -0.984567 + outer loop + vertex -96.8872 -101 24.3942 + vertex -96.605 -82 24.344 + vertex -96.605 -101 24.344 + endloop + endfacet + facet normal -0.175007 0 -0.984567 + outer loop + vertex -96.605 -82 24.344 + vertex -96.8872 -101 24.3942 + vertex -96.8872 -82 24.3942 + endloop + endfacet + facet normal -0.175007 0 0.984567 + outer loop + vertex -106.146 -82 18.56 + vertex -96.9798 -101 20.1893 + vertex -96.9798 -82 20.1893 + endloop + endfacet + facet normal -0.175007 0 0.984567 + outer loop + vertex -96.9798 -101 20.1893 + vertex -106.146 -82 18.56 + vertex -106.146 -101 18.56 + endloop + endfacet + facet normal -0.175007 0 0.984567 + outer loop + vertex -96.8872 -82 20.2058 + vertex -96.605 -101 20.256 + vertex -96.605 -82 20.256 + endloop + endfacet + facet normal -0.175007 0 0.984567 + outer loop + vertex -96.605 -101 20.256 + vertex -96.8872 -82 20.2058 + vertex -96.8872 -101 20.2058 + endloop + endfacet + facet normal 0.120522 0 0.992711 + outer loop + vertex -106.523 -82 18.6057 + vertex -106.146 -101 18.56 + vertex -106.146 -82 18.56 + endloop + endfacet + facet normal 0.120522 0 0.992711 + outer loop + vertex -106.146 -101 18.56 + vertex -106.523 -82 18.6057 + vertex -106.523 -101 18.6057 + endloop + endfacet + facet normal 1 -0 0 + outer loop + vertex -96.605 -101 24.368 + vertex -96.605 -82 24.344 + vertex -96.605 -82 24.368 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex -96.605 -82 24.344 + vertex -96.605 -101 24.368 + vertex -96.605 -101 24.344 + endloop + endfacet + facet normal 1 -0 0 + outer loop + vertex -96.605 -101 20.256 + vertex -96.605 -82 20.232 + vertex -96.605 -82 20.256 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex -96.605 -82 20.232 + vertex -96.605 -101 20.256 + vertex -96.605 -101 20.232 + endloop + endfacet + facet normal 0.602619 0 -0.798029 + outer loop + vertex -96 -101 17.72 + vertex -95.6084 -82 18.0156 + vertex -95.6084 -101 18.0156 + endloop + endfacet + facet normal 0.602619 0 -0.798029 + outer loop + vertex -95.6084 -82 18.0156 + vertex -96 -101 17.72 + vertex -96 -82 17.72 + endloop + endfacet + facet normal 0.850222 0 -0.526424 + outer loop + vertex -95.3502 -101 18.4327 + vertex -95.6084 -82 18.0156 + vertex -95.3502 -82 18.4327 + endloop + endfacet + facet normal 0.850222 0 -0.526424 + outer loop + vertex -95.6084 -82 18.0156 + vertex -95.3502 -101 18.4327 + vertex -95.6084 -101 18.0156 + endloop + endfacet + facet normal 0.982973 0 -0.18375 + outer loop + vertex -95.26 -101 18.915 + vertex -95.3502 -82 18.4327 + vertex -95.26 -82 18.915 + endloop + endfacet + facet normal 0.982973 0 -0.18375 + outer loop + vertex -95.3502 -82 18.4327 + vertex -95.26 -101 18.915 + vertex -95.3502 -101 18.4327 + endloop + endfacet + facet normal 0.982973 -0 0.18375 + outer loop + vertex -95.3502 -101 19.3973 + vertex -95.26 -82 18.915 + vertex -95.3502 -82 19.3973 + endloop + endfacet + facet normal 0.982973 0 0.18375 + outer loop + vertex -95.26 -82 18.915 + vertex -95.3502 -101 19.3973 + vertex -95.26 -101 18.915 + endloop + endfacet + facet normal 0.850222 -0 0.526424 + outer loop + vertex -95.6084 -101 19.8144 + vertex -95.3502 -82 19.3973 + vertex -95.6084 -82 19.8144 + endloop + endfacet + facet normal 0.850222 0 0.526424 + outer loop + vertex -95.3502 -82 19.3973 + vertex -95.6084 -101 19.8144 + vertex -95.3502 -101 19.3973 + endloop + endfacet + facet normal 0.602619 0 0.798029 + outer loop + vertex -96 -82 20.11 + vertex -95.6084 -101 19.8144 + vertex -95.6084 -82 19.8144 + endloop + endfacet + facet normal 0.602619 0 0.798029 + outer loop + vertex -95.6084 -101 19.8144 + vertex -96 -82 20.11 + vertex -96 -101 20.11 + endloop + endfacet + facet normal 0.273665 0 0.961825 + outer loop + vertex -96.4718 -82 20.2443 + vertex -96 -101 20.11 + vertex -96 -82 20.11 + endloop + endfacet + facet normal 0.273665 0 0.961825 + outer loop + vertex -96 -101 20.11 + vertex -96.4718 -82 20.2443 + vertex -96.4718 -101 20.2443 + endloop + endfacet + facet normal -0.0922792 0 0.995733 + outer loop + vertex -96.9603 -82 20.199 + vertex -96.8872 -101 20.2058 + vertex -96.8872 -82 20.2058 + endloop + endfacet + facet normal -0.0922792 0 0.995733 + outer loop + vertex -96.8872 -101 20.2058 + vertex -96.9603 -82 20.199 + vertex -96.9603 -101 20.199 + endloop + endfacet + facet normal -0.0922857 0 0.995733 + outer loop + vertex -96.605 -82 20.232 + vertex -96.4718 -101 20.2443 + vertex -96.4718 -82 20.2443 + endloop + endfacet + facet normal -0.0922857 0 0.995733 + outer loop + vertex -96.4718 -101 20.2443 + vertex -96.605 -82 20.232 + vertex -96.605 -101 20.232 + endloop + endfacet + facet normal -0.445737 0 0.895164 + outer loop + vertex -96.9798 -82 20.1893 + vertex -96.9603 -101 20.199 + vertex -96.9603 -82 20.199 + endloop + endfacet + facet normal -0.445737 0 0.895164 + outer loop + vertex -96.9603 -101 20.199 + vertex -96.9798 -82 20.1893 + vertex -96.9798 -101 20.1893 + endloop + endfacet + facet normal -0.739002 0 0.673704 + outer loop + vertex -97.73 -101 19.6178 + vertex -97.5295 -82 19.8377 + vertex -97.73 -82 19.6178 + endloop + endfacet + facet normal -0.739002 0 0.673704 + outer loop + vertex -97.5295 -82 19.8377 + vertex -97.73 -101 19.6178 + vertex -97.5295 -101 19.8377 + endloop + endfacet + facet normal -0.932469 0 0.36125 + outer loop + vertex -97.9073 -101 19.1603 + vertex -97.73 -82 19.6178 + vertex -97.9073 -82 19.1603 + endloop + endfacet + facet normal -0.932469 0 0.36125 + outer loop + vertex -97.73 -82 19.6178 + vertex -97.9073 -101 19.1603 + vertex -97.73 -101 19.6178 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -97.9073 -101 18.6697 + vertex -97.9073 -82 19.1603 + vertex -97.9073 -82 18.6697 + endloop + endfacet + facet normal -1 -0 0 + outer loop + vertex -97.9073 -82 19.1603 + vertex -97.9073 -101 18.6697 + vertex -97.9073 -101 19.1603 + endloop + endfacet + facet normal -0.932469 0 -0.36125 + outer loop + vertex -97.73 -101 18.2122 + vertex -97.9073 -82 18.6697 + vertex -97.73 -82 18.2122 + endloop + endfacet + facet normal -0.932469 -0 -0.36125 + outer loop + vertex -97.9073 -82 18.6697 + vertex -97.73 -101 18.2122 + vertex -97.9073 -101 18.6697 + endloop + endfacet + facet normal -0.739009 0 -0.673695 + outer loop + vertex -97.3995 -101 17.8497 + vertex -97.73 -82 18.2122 + vertex -97.3995 -82 17.8497 + endloop + endfacet + facet normal -0.739009 -0 -0.673695 + outer loop + vertex -97.73 -82 18.2122 + vertex -97.3995 -101 17.8497 + vertex -97.73 -101 18.2122 + endloop + endfacet + facet normal -0.445745 0 -0.89516 + outer loop + vertex -97.3995 -101 17.8497 + vertex -96.9603 -82 17.631 + vertex -96.9603 -101 17.631 + endloop + endfacet + facet normal -0.445745 0 -0.89516 + outer loop + vertex -96.9603 -82 17.631 + vertex -97.3995 -101 17.8497 + vertex -97.3995 -82 17.8497 + endloop + endfacet + facet normal -0.0922827 0 -0.995733 + outer loop + vertex -96.9603 -101 17.631 + vertex -96.4718 -82 17.5857 + vertex -96.4718 -101 17.5857 + endloop + endfacet + facet normal -0.0922827 0 -0.995733 + outer loop + vertex -96.4718 -82 17.5857 + vertex -96.9603 -101 17.631 + vertex -96.9603 -82 17.631 + endloop + endfacet + facet normal 0.273665 0 -0.961825 + outer loop + vertex -96.4718 -101 17.5857 + vertex -96 -82 17.72 + vertex -96 -101 17.72 + endloop + endfacet + facet normal 0.273665 0 -0.961825 + outer loop + vertex -96 -82 17.72 + vertex -96.4718 -101 17.5857 + vertex -96.4718 -82 17.5857 + endloop + endfacet + facet normal 0.433867 0 0.900977 + outer loop + vertex -97.2715 -82 18.0667 + vertex -96.8364 -101 17.8572 + vertex -96.8364 -82 17.8572 + endloop + endfacet + facet normal 0.433867 0 0.900977 + outer loop + vertex -96.8364 -101 17.8572 + vertex -97.2715 -82 18.0667 + vertex -97.2715 -101 18.0667 + endloop + endfacet + facet normal 0.781848 -0 0.623469 + outer loop + vertex -97.5725 -101 18.4443 + vertex -97.2715 -82 18.0667 + vertex -97.5725 -82 18.4443 + endloop + endfacet + facet normal 0.781848 0 0.623469 + outer loop + vertex -97.2715 -82 18.0667 + vertex -97.5725 -101 18.4443 + vertex -97.2715 -101 18.0667 + endloop + endfacet + facet normal 0.974925 -0 0.222535 + outer loop + vertex -97.68 -101 18.915 + vertex -97.5725 -82 18.4443 + vertex -97.68 -82 18.915 + endloop + endfacet + facet normal 0.974925 0 0.222535 + outer loop + vertex -97.5725 -82 18.4443 + vertex -97.68 -101 18.915 + vertex -97.5725 -101 18.4443 + endloop + endfacet + facet normal 0.974925 0 -0.222535 + outer loop + vertex -97.5725 -101 19.3857 + vertex -97.68 -82 18.915 + vertex -97.5725 -82 19.3857 + endloop + endfacet + facet normal 0.974925 0 -0.222535 + outer loop + vertex -97.68 -82 18.915 + vertex -97.5725 -101 19.3857 + vertex -97.68 -101 18.915 + endloop + endfacet + facet normal 0.781848 0 -0.623469 + outer loop + vertex -97.2715 -101 19.7633 + vertex -97.5725 -82 19.3857 + vertex -97.2715 -82 19.7633 + endloop + endfacet + facet normal 0.781848 0 -0.623469 + outer loop + vertex -97.5725 -82 19.3857 + vertex -97.2715 -101 19.7633 + vertex -97.5725 -101 19.3857 + endloop + endfacet + facet normal 0.433867 0 -0.900977 + outer loop + vertex -97.2715 -101 19.7633 + vertex -96.8755 -82 19.954 + vertex -96.8755 -101 19.954 + endloop + endfacet + facet normal 0.433867 0 -0.900977 + outer loop + vertex -96.8755 -82 19.954 + vertex -97.2715 -101 19.7633 + vertex -97.2715 -82 19.7633 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -96.7696 -101 19.9728 + vertex -96.3536 -82 19.9728 + vertex -96.3536 -101 19.9728 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex -96.3536 -82 19.9728 + vertex -96.7696 -101 19.9728 + vertex -96.7696 -82 19.9728 + endloop + endfacet + facet normal -0.433867 0 -0.900977 + outer loop + vertex -96.3536 -101 19.9728 + vertex -95.9185 -82 19.7633 + vertex -95.9185 -101 19.7633 + endloop + endfacet + facet normal -0.433867 0 -0.900977 + outer loop + vertex -95.9185 -82 19.7633 + vertex -96.3536 -101 19.9728 + vertex -96.3536 -82 19.9728 + endloop + endfacet + facet normal -0.781848 0 -0.623469 + outer loop + vertex -95.6175 -101 19.3857 + vertex -95.9185 -82 19.7633 + vertex -95.6175 -82 19.3857 + endloop + endfacet + facet normal -0.781848 -0 -0.623469 + outer loop + vertex -95.9185 -82 19.7633 + vertex -95.6175 -101 19.3857 + vertex -95.9185 -101 19.7633 + endloop + endfacet + facet normal -0.974925 0 -0.222535 + outer loop + vertex -95.51 -101 18.915 + vertex -95.6175 -82 19.3857 + vertex -95.51 -82 18.915 + endloop + endfacet + facet normal -0.974925 -0 -0.222535 + outer loop + vertex -95.6175 -82 19.3857 + vertex -95.51 -101 18.915 + vertex -95.6175 -101 19.3857 + endloop + endfacet + facet normal -0.974925 0 0.222535 + outer loop + vertex -95.6175 -101 18.4443 + vertex -95.51 -82 18.915 + vertex -95.6175 -82 18.4443 + endloop + endfacet + facet normal -0.974925 0 0.222535 + outer loop + vertex -95.51 -82 18.915 + vertex -95.6175 -101 18.4443 + vertex -95.51 -101 18.915 + endloop + endfacet + facet normal -0.781848 0 0.623469 + outer loop + vertex -95.9185 -101 18.0667 + vertex -95.6175 -82 18.4443 + vertex -95.9185 -82 18.0667 + endloop + endfacet + facet normal -0.781848 0 0.623469 + outer loop + vertex -95.6175 -82 18.4443 + vertex -95.9185 -101 18.0667 + vertex -95.6175 -101 18.4443 + endloop + endfacet + facet normal -0.433867 0 0.900977 + outer loop + vertex -96.3536 -82 17.8572 + vertex -95.9185 -101 18.0667 + vertex -95.9185 -82 18.0667 + endloop + endfacet + facet normal -0.433867 0 0.900977 + outer loop + vertex -95.9185 -101 18.0667 + vertex -96.3536 -82 17.8572 + vertex -96.3536 -101 17.8572 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -96.8364 -82 17.8572 + vertex -96.3536 -101 17.8572 + vertex -96.3536 -82 17.8572 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -96.3536 -101 17.8572 + vertex -96.8364 -82 17.8572 + vertex -96.8364 -101 17.8572 + endloop + endfacet + facet normal 0.602619 0 -0.798029 + outer loop + vertex -96 -101 24.49 + vertex -95.6084 -82 24.7856 + vertex -95.6084 -101 24.7856 + endloop + endfacet + facet normal 0.602619 0 -0.798029 + outer loop + vertex -95.6084 -82 24.7856 + vertex -96 -101 24.49 + vertex -96 -82 24.49 + endloop + endfacet + facet normal 0.850222 0 -0.526424 + outer loop + vertex -95.3502 -101 25.2027 + vertex -95.6084 -82 24.7856 + vertex -95.3502 -82 25.2027 + endloop + endfacet + facet normal 0.850222 0 -0.526424 + outer loop + vertex -95.6084 -82 24.7856 + vertex -95.3502 -101 25.2027 + vertex -95.6084 -101 24.7856 + endloop + endfacet + facet normal 0.982973 0 -0.18375 + outer loop + vertex -95.26 -101 25.685 + vertex -95.3502 -82 25.2027 + vertex -95.26 -82 25.685 + endloop + endfacet + facet normal 0.982973 0 -0.18375 + outer loop + vertex -95.3502 -82 25.2027 + vertex -95.26 -101 25.685 + vertex -95.3502 -101 25.2027 + endloop + endfacet + facet normal 0.982973 -0 0.18375 + outer loop + vertex -95.3502 -101 26.1673 + vertex -95.26 -82 25.685 + vertex -95.3502 -82 26.1673 + endloop + endfacet + facet normal 0.982973 0 0.18375 + outer loop + vertex -95.26 -82 25.685 + vertex -95.3502 -101 26.1673 + vertex -95.26 -101 25.685 + endloop + endfacet + facet normal 0.850222 -0 0.526424 + outer loop + vertex -95.6084 -101 26.5844 + vertex -95.3502 -82 26.1673 + vertex -95.6084 -82 26.5844 + endloop + endfacet + facet normal 0.850222 0 0.526424 + outer loop + vertex -95.3502 -82 26.1673 + vertex -95.6084 -101 26.5844 + vertex -95.3502 -101 26.1673 + endloop + endfacet + facet normal 0.602619 0 0.798029 + outer loop + vertex -96 -82 26.88 + vertex -95.6084 -101 26.5844 + vertex -95.6084 -82 26.5844 + endloop + endfacet + facet normal 0.602619 0 0.798029 + outer loop + vertex -95.6084 -101 26.5844 + vertex -96 -82 26.88 + vertex -96 -101 26.88 + endloop + endfacet + facet normal 0.273665 0 0.961825 + outer loop + vertex -96.4718 -82 27.0143 + vertex -96 -101 26.88 + vertex -96 -82 26.88 + endloop + endfacet + facet normal 0.273665 0 0.961825 + outer loop + vertex -96 -101 26.88 + vertex -96.4718 -82 27.0143 + vertex -96.4718 -101 27.0143 + endloop + endfacet + facet normal -0.0922827 0 0.995733 + outer loop + vertex -96.9603 -82 26.969 + vertex -96.4718 -101 27.0143 + vertex -96.4718 -82 27.0143 + endloop + endfacet + facet normal -0.0922827 0 0.995733 + outer loop + vertex -96.4718 -101 27.0143 + vertex -96.9603 -82 26.969 + vertex -96.9603 -101 26.969 + endloop + endfacet + facet normal -0.445745 0 0.89516 + outer loop + vertex -97.3995 -82 26.7503 + vertex -96.9603 -101 26.969 + vertex -96.9603 -82 26.969 + endloop + endfacet + facet normal -0.445745 0 0.89516 + outer loop + vertex -96.9603 -101 26.969 + vertex -97.3995 -82 26.7503 + vertex -97.3995 -101 26.7503 + endloop + endfacet + facet normal -0.739009 0 0.673695 + outer loop + vertex -97.73 -101 26.3878 + vertex -97.3995 -82 26.7503 + vertex -97.73 -82 26.3878 + endloop + endfacet + facet normal -0.739009 0 0.673695 + outer loop + vertex -97.3995 -82 26.7503 + vertex -97.73 -101 26.3878 + vertex -97.3995 -101 26.7503 + endloop + endfacet + facet normal -0.932469 0 0.36125 + outer loop + vertex -97.9073 -101 25.9303 + vertex -97.73 -82 26.3878 + vertex -97.9073 -82 25.9303 + endloop + endfacet + facet normal -0.932469 0 0.36125 + outer loop + vertex -97.73 -82 26.3878 + vertex -97.9073 -101 25.9303 + vertex -97.73 -101 26.3878 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -97.9073 -101 25.4397 + vertex -97.9073 -82 25.9303 + vertex -97.9073 -82 25.4397 + endloop + endfacet + facet normal -1 -0 0 + outer loop + vertex -97.9073 -82 25.9303 + vertex -97.9073 -101 25.4397 + vertex -97.9073 -101 25.9303 + endloop + endfacet + facet normal -0.932469 0 -0.36125 + outer loop + vertex -97.73 -101 24.9822 + vertex -97.9073 -82 25.4397 + vertex -97.73 -82 24.9822 + endloop + endfacet + facet normal -0.932469 -0 -0.36125 + outer loop + vertex -97.9073 -82 25.4397 + vertex -97.73 -101 24.9822 + vertex -97.9073 -101 25.4397 + endloop + endfacet + facet normal -0.739002 0 -0.673704 + outer loop + vertex -97.5295 -101 24.7623 + vertex -97.73 -82 24.9822 + vertex -97.5295 -82 24.7623 + endloop + endfacet + facet normal -0.739002 -0 -0.673704 + outer loop + vertex -97.73 -82 24.9822 + vertex -97.5295 -101 24.7623 + vertex -97.73 -101 24.9822 + endloop + endfacet + facet normal -0.445737 0 -0.895164 + outer loop + vertex -96.9798 -101 24.4107 + vertex -96.9603 -82 24.401 + vertex -96.9603 -101 24.401 + endloop + endfacet + facet normal -0.445737 0 -0.895164 + outer loop + vertex -96.9603 -82 24.401 + vertex -96.9798 -101 24.4107 + vertex -96.9798 -82 24.4107 + endloop + endfacet + facet normal -0.0922857 0 -0.995733 + outer loop + vertex -96.605 -101 24.368 + vertex -96.4718 -82 24.3557 + vertex -96.4718 -101 24.3557 + endloop + endfacet + facet normal -0.0922857 0 -0.995733 + outer loop + vertex -96.4718 -82 24.3557 + vertex -96.605 -101 24.368 + vertex -96.605 -82 24.368 + endloop + endfacet + facet normal -0.0922792 0 -0.995733 + outer loop + vertex -96.9603 -101 24.401 + vertex -96.8872 -82 24.3942 + vertex -96.8872 -101 24.3942 + endloop + endfacet + facet normal -0.0922792 0 -0.995733 + outer loop + vertex -96.8872 -82 24.3942 + vertex -96.9603 -101 24.401 + vertex -96.9603 -82 24.401 + endloop + endfacet + facet normal 0.273665 0 -0.961825 + outer loop + vertex -96.4718 -101 24.3557 + vertex -96 -82 24.49 + vertex -96 -101 24.49 + endloop + endfacet + facet normal 0.273665 0 -0.961825 + outer loop + vertex -96 -82 24.49 + vertex -96.4718 -101 24.3557 + vertex -96.4718 -82 24.3557 + endloop + endfacet + facet normal 0.433867 0 0.900977 + outer loop + vertex -97.2715 -82 24.8367 + vertex -96.8755 -101 24.646 + vertex -96.8755 -82 24.646 + endloop + endfacet + facet normal 0.433867 0 0.900977 + outer loop + vertex -96.8755 -101 24.646 + vertex -97.2715 -82 24.8367 + vertex -97.2715 -101 24.8367 + endloop + endfacet + facet normal 0.781848 -0 0.623469 + outer loop + vertex -97.5725 -101 25.2143 + vertex -97.2715 -82 24.8367 + vertex -97.5725 -82 25.2143 + endloop + endfacet + facet normal 0.781848 0 0.623469 + outer loop + vertex -97.2715 -82 24.8367 + vertex -97.5725 -101 25.2143 + vertex -97.2715 -101 24.8367 + endloop + endfacet + facet normal 0.974925 -0 0.222535 + outer loop + vertex -97.68 -101 25.685 + vertex -97.5725 -82 25.2143 + vertex -97.68 -82 25.685 + endloop + endfacet + facet normal 0.974925 0 0.222535 + outer loop + vertex -97.5725 -82 25.2143 + vertex -97.68 -101 25.685 + vertex -97.5725 -101 25.2143 + endloop + endfacet + facet normal 0.974925 0 -0.222535 + outer loop + vertex -97.5725 -101 26.1557 + vertex -97.68 -82 25.685 + vertex -97.5725 -82 26.1557 + endloop + endfacet + facet normal 0.974925 0 -0.222535 + outer loop + vertex -97.68 -82 25.685 + vertex -97.5725 -101 26.1557 + vertex -97.68 -101 25.685 + endloop + endfacet + facet normal 0.781848 0 -0.623469 + outer loop + vertex -97.2715 -101 26.5333 + vertex -97.5725 -82 26.1557 + vertex -97.2715 -82 26.5333 + endloop + endfacet + facet normal 0.781848 0 -0.623469 + outer loop + vertex -97.5725 -82 26.1557 + vertex -97.2715 -101 26.5333 + vertex -97.5725 -101 26.1557 + endloop + endfacet + facet normal 0.433867 0 -0.900977 + outer loop + vertex -97.2715 -101 26.5333 + vertex -96.8364 -82 26.7428 + vertex -96.8364 -101 26.7428 + endloop + endfacet + facet normal 0.433867 0 -0.900977 + outer loop + vertex -96.8364 -82 26.7428 + vertex -97.2715 -101 26.5333 + vertex -97.2715 -82 26.5333 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -96.8364 -101 26.7428 + vertex -96.3536 -82 26.7428 + vertex -96.3536 -101 26.7428 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex -96.3536 -82 26.7428 + vertex -96.8364 -101 26.7428 + vertex -96.8364 -82 26.7428 + endloop + endfacet + facet normal -0.433867 0 -0.900977 + outer loop + vertex -96.3536 -101 26.7428 + vertex -95.9185 -82 26.5333 + vertex -95.9185 -101 26.5333 + endloop + endfacet + facet normal -0.433867 0 -0.900977 + outer loop + vertex -95.9185 -82 26.5333 + vertex -96.3536 -101 26.7428 + vertex -96.3536 -82 26.7428 + endloop + endfacet + facet normal -0.781848 0 -0.623469 + outer loop + vertex -95.6175 -101 26.1557 + vertex -95.9185 -82 26.5333 + vertex -95.6175 -82 26.1557 + endloop + endfacet + facet normal -0.781848 -0 -0.623469 + outer loop + vertex -95.9185 -82 26.5333 + vertex -95.6175 -101 26.1557 + vertex -95.9185 -101 26.5333 + endloop + endfacet + facet normal -0.974925 0 -0.222535 + outer loop + vertex -95.51 -101 25.685 + vertex -95.6175 -82 26.1557 + vertex -95.51 -82 25.685 + endloop + endfacet + facet normal -0.974925 -0 -0.222535 + outer loop + vertex -95.6175 -82 26.1557 + vertex -95.51 -101 25.685 + vertex -95.6175 -101 26.1557 + endloop + endfacet + facet normal -0.974925 0 0.222535 + outer loop + vertex -95.6175 -101 25.2143 + vertex -95.51 -82 25.685 + vertex -95.6175 -82 25.2143 + endloop + endfacet + facet normal -0.974925 0 0.222535 + outer loop + vertex -95.51 -82 25.685 + vertex -95.6175 -101 25.2143 + vertex -95.51 -101 25.685 + endloop + endfacet + facet normal -0.781848 0 0.623469 + outer loop + vertex -95.9185 -101 24.8367 + vertex -95.6175 -82 25.2143 + vertex -95.9185 -82 24.8367 + endloop + endfacet + facet normal -0.781848 0 0.623469 + outer loop + vertex -95.6175 -82 25.2143 + vertex -95.9185 -101 24.8367 + vertex -95.6175 -101 25.2143 + endloop + endfacet + facet normal -0.433867 0 0.900977 + outer loop + vertex -96.3536 -82 24.6272 + vertex -95.9185 -101 24.8367 + vertex -95.9185 -82 24.8367 + endloop + endfacet + facet normal -0.433867 0 0.900977 + outer loop + vertex -95.9185 -101 24.8367 + vertex -96.3536 -82 24.6272 + vertex -96.3536 -101 24.6272 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -96.7696 -82 24.6272 + vertex -96.3536 -101 24.6272 + vertex -96.3536 -82 24.6272 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -96.3536 -101 24.6272 + vertex -96.7696 -82 24.6272 + vertex -96.7696 -101 24.6272 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 96.605 101 20.256 + vertex 96.8872 101 20.2058 + vertex 96.605 101 20.232 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -106.981 101 20.5 + vertex -106.981 101 19.1223 + vertex -107 101 20.5 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 96.8872 101 24.3942 + vertex 96.605 101 24.344 + vertex 96.605 101 24.368 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 106.139 101 26.2927 + vertex 106.523 101 25.9943 + vertex 106.146 101 26.04 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 107.009 101 25.9631 + vertex 106.523 101 25.9943 + vertex 106.615 101 26.235 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 107.009 101 25.9631 + vertex 106.816 101 25.7924 + vertex 106.523 101 25.9943 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 107.231 101 25.5393 + vertex 106.816 101 25.7924 + vertex 107.009 101 25.9631 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 107.231 101 25.5393 + vertex 106.981 101 25.4777 + vertex 106.816 101 25.7924 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 107.231 101 25.5393 + vertex 106.981 101 24.13 + vertex 106.981 101 25.4777 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 106.981 101 24.13 + vertex 106.981 101 22.13 + vertex -106.981 101 24.13 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex 107 101 22.1 + vertex 106.981 101 24.13 + vertex 107.231 101 25.5393 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 106.981 101 24.13 + vertex 107 101 22.1 + vertex 106.981 101 22.13 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex 107.231 101 19.0607 + vertex 107 101 22.1 + vertex 107.231 101 25.5393 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 107 101 20.5 + vertex 106.981 101 19.1223 + vertex 106.981 101 20.5 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 107 101 22.1 + vertex 107.231 101 19.0607 + vertex 107 101 20.5 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 107 101 20.5 + vertex 107.231 101 19.0607 + vertex 106.981 101 19.1223 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 107.231 101 19.0607 + vertex 106.816 101 18.8076 + vertex 106.981 101 19.1223 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex 107.009 101 18.6369 + vertex 106.816 101 18.8076 + vertex 107.231 101 19.0607 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 107.009 101 18.6369 + vertex 106.523 101 18.6057 + vertex 106.816 101 18.8076 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex 106.615 101 18.365 + vertex 106.523 101 18.6057 + vertex 107.009 101 18.6369 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 106.139 101 18.3073 + vertex 106.523 101 18.6057 + vertex 106.615 101 18.365 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex 106.523 101 25.9943 + vertex 106.139 101 26.2927 + vertex 106.615 101 26.235 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 106.146 101 26.04 + vertex 97.5295 101 24.7623 + vertex 106.139 101 26.2927 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 96.9798 101 24.4107 + vertex 97.5295 101 24.7623 + vertex 106.146 101 26.04 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 97.5295 101 24.7623 + vertex 96.9798 101 24.4107 + vertex 96.8755 101 24.646 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex 96.605 101 24.368 + vertex 96.3536 101 24.6272 + vertex 96.7696 101 24.6272 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex 96.8872 101 24.3942 + vertex 96.8755 101 24.646 + vertex 96.9798 101 24.4107 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 96.8755 101 24.646 + vertex 96.8872 101 24.3942 + vertex 96.7696 101 24.6272 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 96.8872 101 24.3942 + vertex 96.9798 101 24.4107 + vertex 96.9603 101 24.401 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 96.605 101 24.368 + vertex 96.7696 101 24.6272 + vertex 96.8872 101 24.3942 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 96.3536 101 24.6272 + vertex 96.605 101 24.368 + vertex 96.4718 101 24.3557 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 96.3536 101 24.6272 + vertex 96.4718 101 24.3557 + vertex 96 101 24.49 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 96.9603 101 26.969 + vertex 97.2715 101 26.5333 + vertex 96.8364 101 26.7428 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 97.73 101 26.3878 + vertex 97.2715 101 26.5333 + vertex 97.3995 101 26.7503 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 97.73 101 26.3878 + vertex 97.5725 101 26.1557 + vertex 97.2715 101 26.5333 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 97.9073 101 25.9303 + vertex 97.5725 101 26.1557 + vertex 97.73 101 26.3878 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 97.9073 101 25.9303 + vertex 97.68 101 25.685 + vertex 97.5725 101 26.1557 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex 97.9073 101 25.4397 + vertex 97.68 101 25.685 + vertex 97.9073 101 25.9303 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 97.9073 101 25.4397 + vertex 97.5725 101 25.2143 + vertex 97.68 101 25.685 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex 97.73 101 24.9822 + vertex 97.5725 101 25.2143 + vertex 97.9073 101 25.4397 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 97.5295 101 24.7623 + vertex 97.5725 101 25.2143 + vertex 97.73 101 24.9822 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 97.5725 101 25.2143 + vertex 97.5295 101 24.7623 + vertex 97.2715 101 24.8367 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 97.2715 101 24.8367 + vertex 97.5295 101 24.7623 + vertex 96.8755 101 24.646 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex 96.8364 101 26.7428 + vertex 96.4718 101 27.0143 + vertex 96.9603 101 26.969 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex 97.2715 101 26.5333 + vertex 96.9603 101 26.969 + vertex 97.3995 101 26.7503 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 96.4718 101 27.0143 + vertex 96.8364 101 26.7428 + vertex 96.3536 101 26.7428 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 96.4718 101 27.0143 + vertex 96.3536 101 26.7428 + vertex 96 101 26.88 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 95.9185 101 26.5333 + vertex 96 101 26.88 + vertex 96.3536 101 26.7428 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 96 101 26.88 + vertex 95.9185 101 26.5333 + vertex 95.6084 101 26.5844 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex 95.6175 101 26.1557 + vertex 95.6084 101 26.5844 + vertex 95.9185 101 26.5333 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 95.6084 101 26.5844 + vertex 95.6175 101 26.1557 + vertex 95.3502 101 26.1673 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex 95.51 101 25.685 + vertex 95.3502 101 26.1673 + vertex 95.6175 101 26.1557 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 95.51 101 25.685 + vertex 95.26 101 25.685 + vertex 95.3502 101 26.1673 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 95.3502 101 25.2027 + vertex 95.51 101 25.685 + vertex 95.6175 101 25.2143 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 95.51 101 25.685 + vertex 95.3502 101 25.2027 + vertex 95.26 101 25.685 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 95.6084 101 24.7856 + vertex 95.6175 101 25.2143 + vertex 95.9185 101 24.8367 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 95.6175 101 25.2143 + vertex 95.6084 101 24.7856 + vertex 95.3502 101 25.2027 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex 96 101 24.49 + vertex 95.9185 101 24.8367 + vertex 96.3536 101 24.6272 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 95.9185 101 24.8367 + vertex 96 101 24.49 + vertex 95.6084 101 24.7856 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex -96.3536 101 26.7428 + vertex -96.4718 101 27.0143 + vertex -96 101 26.88 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -96.8364 101 26.7428 + vertex -96.4718 101 27.0143 + vertex -96.3536 101 26.7428 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -96.4718 101 27.0143 + vertex -96.8364 101 26.7428 + vertex -96.9603 101 26.969 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex -95.9185 101 26.5333 + vertex -96 101 26.88 + vertex -95.6084 101 26.5844 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -96 101 26.88 + vertex -95.9185 101 26.5333 + vertex -96.3536 101 26.7428 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -95.6175 101 26.1557 + vertex -95.6084 101 26.5844 + vertex -95.3502 101 26.1673 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -95.6084 101 26.5844 + vertex -95.6175 101 26.1557 + vertex -95.9185 101 26.5333 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -95.51 101 25.685 + vertex -95.3502 101 26.1673 + vertex -95.26 101 25.685 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -95.3502 101 26.1673 + vertex -95.51 101 25.685 + vertex -95.6175 101 26.1557 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex -95.3502 101 25.2027 + vertex -95.51 101 25.685 + vertex -95.26 101 25.685 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -95.51 101 25.685 + vertex -95.3502 101 25.2027 + vertex -95.6175 101 25.2143 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex -95.6084 101 24.7856 + vertex -95.6175 101 25.2143 + vertex -95.3502 101 25.2027 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -95.6175 101 25.2143 + vertex -95.6084 101 24.7856 + vertex -95.9185 101 24.8367 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -96 101 24.49 + vertex -95.9185 101 24.8367 + vertex -95.6084 101 24.7856 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -96.4718 101 24.3557 + vertex -96.3536 101 24.6272 + vertex -96 101 24.49 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -95.9185 101 24.8367 + vertex -96 101 24.49 + vertex -96.3536 101 24.6272 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -97.2715 101 26.5333 + vertex -96.9603 101 26.969 + vertex -96.8364 101 26.7428 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -96.9603 101 26.969 + vertex -97.2715 101 26.5333 + vertex -97.3995 101 26.7503 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -97.2715 101 26.5333 + vertex -97.73 101 26.3878 + vertex -97.3995 101 26.7503 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex -97.5725 101 26.1557 + vertex -97.73 101 26.3878 + vertex -97.2715 101 26.5333 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -97.5725 101 26.1557 + vertex -97.9073 101 25.9303 + vertex -97.73 101 26.3878 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex -97.68 101 25.685 + vertex -97.9073 101 25.9303 + vertex -97.5725 101 26.1557 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -97.68 101 25.685 + vertex -97.9073 101 25.4397 + vertex -97.9073 101 25.9303 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -97.5725 101 25.2143 + vertex -97.9073 101 25.4397 + vertex -97.68 101 25.685 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -97.5725 101 25.2143 + vertex -97.73 101 24.9822 + vertex -97.9073 101 25.4397 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex -97.5295 101 24.7623 + vertex -97.5725 101 25.2143 + vertex -97.2715 101 24.8367 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -97.5725 101 25.2143 + vertex -97.5295 101 24.7623 + vertex -97.73 101 24.9822 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex -96.9798 101 24.4107 + vertex -97.2715 101 24.8367 + vertex -96.8755 101 24.646 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -106.523 101 25.9943 + vertex -106.139 101 26.2927 + vertex -106.146 101 26.04 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -97.5295 101 24.7623 + vertex -106.146 101 26.04 + vertex -106.139 101 26.2927 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -97.2715 101 24.8367 + vertex -96.9798 101 24.4107 + vertex -97.5295 101 24.7623 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -96.8872 101 24.3942 + vertex -96.8755 101 24.646 + vertex -96.7696 101 24.6272 + endloop + endfacet + facet normal -0 1 0 + outer loop + vertex -96.605 101 24.368 + vertex -96.3536 101 24.6272 + vertex -96.4718 101 24.3557 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -97.5295 101 24.7623 + vertex -96.9798 101 24.4107 + vertex -106.146 101 26.04 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -96.8755 101 24.646 + vertex -96.8872 101 24.3942 + vertex -96.9798 101 24.4107 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -96.9798 101 24.4107 + vertex -96.8872 101 24.3942 + vertex -96.9603 101 24.401 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -96.7696 101 24.6272 + vertex -96.605 101 24.368 + vertex -96.8872 101 24.3942 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -96.3536 101 24.6272 + vertex -96.605 101 24.368 + vertex -96.7696 101 24.6272 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -106.139 101 26.2927 + vertex -106.523 101 25.9943 + vertex -106.615 101 26.235 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -106.523 101 25.9943 + vertex -107.009 101 25.9631 + vertex -106.615 101 26.235 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex -106.816 101 25.7924 + vertex -107.009 101 25.9631 + vertex -106.523 101 25.9943 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -106.816 101 25.7924 + vertex -107.231 101 25.5393 + vertex -107.009 101 25.9631 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex -106.981 101 25.4777 + vertex -107.231 101 25.5393 + vertex -106.816 101 25.7924 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex -106.981 101 24.13 + vertex -107.231 101 25.5393 + vertex -106.981 101 25.4777 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -106.981 101 22.13 + vertex -106.981 101 24.13 + vertex 106.981 101 22.13 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -107 101 22.1 + vertex -106.981 101 24.13 + vertex -106.981 101 22.13 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -107 101 22.1 + vertex -106.981 101 22.13 + vertex -106.981 101 22.1 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -106.981 101 24.13 + vertex -107 101 22.1 + vertex -107.231 101 25.5393 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -107.231 101 19.0607 + vertex -107 101 22.1 + vertex -107 101 20.5 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -107.231 101 19.0607 + vertex -107 101 20.5 + vertex -106.981 101 19.1223 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -107 101 22.1 + vertex -107.231 101 19.0607 + vertex -107.231 101 25.5393 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -106.816 101 18.8076 + vertex -107.231 101 19.0607 + vertex -106.981 101 19.1223 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -106.816 101 18.8076 + vertex -107.009 101 18.6369 + vertex -107.231 101 19.0607 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -106.523 101 18.6057 + vertex -107.009 101 18.6369 + vertex -106.816 101 18.8076 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -106.139 101 18.3073 + vertex -106.523 101 18.6057 + vertex -106.146 101 18.56 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -106.523 101 18.6057 + vertex -106.615 101 18.365 + vertex -107.009 101 18.6369 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -96.8872 101 24.3942 + vertex -96.605 101 24.368 + vertex -96.605 101 24.344 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 106.981 101 22.13 + vertex 107 101 22.1 + vertex 106.981 101 22.1 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 96.9798 101 20.1893 + vertex 96.8872 101 20.2058 + vertex 96.9603 101 20.199 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 96.8755 101 19.954 + vertex 96.8872 101 20.2058 + vertex 96.9798 101 20.1893 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 96.8872 101 20.2058 + vertex 96.7696 101 19.9728 + vertex 96.605 101 20.232 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 96.3536 101 19.9728 + vertex 96.605 101 20.232 + vertex 96.7696 101 19.9728 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 96.605 101 20.232 + vertex 96.3536 101 19.9728 + vertex 96.4718 101 20.2443 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 96.8872 101 20.2058 + vertex 96.8755 101 19.954 + vertex 96.7696 101 19.9728 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex 97.2715 101 19.7633 + vertex 96.9798 101 20.1893 + vertex 97.5295 101 19.8377 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 106.146 101 18.56 + vertex 97.5295 101 19.8377 + vertex 96.9798 101 20.1893 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 106.523 101 18.6057 + vertex 106.139 101 18.3073 + vertex 106.146 101 18.56 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 106.146 101 18.56 + vertex 106.139 101 18.3073 + vertex 97.5295 101 19.8377 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 96.4718 101 20.2443 + vertex 96.3536 101 19.9728 + vertex 96 101 20.11 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 95.9185 101 19.7633 + vertex 96 101 20.11 + vertex 96.3536 101 19.9728 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 96 101 20.11 + vertex 95.9185 101 19.7633 + vertex 95.6084 101 19.8144 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex 95.6175 101 19.3857 + vertex 95.6084 101 19.8144 + vertex 95.9185 101 19.7633 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 95.6084 101 19.8144 + vertex 95.6175 101 19.3857 + vertex 95.3502 101 19.3973 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex 95.51 101 18.915 + vertex 95.3502 101 19.3973 + vertex 95.6175 101 19.3857 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 95.51 101 18.915 + vertex 95.26 101 18.915 + vertex 95.3502 101 19.3973 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 95.3502 101 18.4327 + vertex 95.51 101 18.915 + vertex 95.6175 101 18.4443 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 95.51 101 18.915 + vertex 95.3502 101 18.4327 + vertex 95.26 101 18.915 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 95.6084 101 18.0156 + vertex 95.6175 101 18.4443 + vertex 95.9185 101 18.0667 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 95.6175 101 18.4443 + vertex 95.6084 101 18.0156 + vertex 95.3502 101 18.4327 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex 96 101 17.72 + vertex 95.9185 101 18.0667 + vertex 96.3536 101 17.8572 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 95.9185 101 18.0667 + vertex 96 101 17.72 + vertex 95.6084 101 18.0156 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 96.8364 101 17.8572 + vertex 96 101 17.72 + vertex 96.3536 101 17.8572 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 96.4718 101 17.5857 + vertex 96.8364 101 17.8572 + vertex 96.9603 101 17.631 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 96.8364 101 17.8572 + vertex 96.4718 101 17.5857 + vertex 96 101 17.72 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 96.9798 101 20.1893 + vertex 97.2715 101 19.7633 + vertex 96.8755 101 19.954 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex 97.5725 101 19.3857 + vertex 97.5295 101 19.8377 + vertex 97.73 101 19.6178 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 97.5295 101 19.8377 + vertex 97.5725 101 19.3857 + vertex 97.2715 101 19.7633 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 97.9073 101 19.1603 + vertex 97.5725 101 19.3857 + vertex 97.73 101 19.6178 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 97.9073 101 19.1603 + vertex 97.68 101 18.915 + vertex 97.5725 101 19.3857 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex 97.9073 101 18.6697 + vertex 97.68 101 18.915 + vertex 97.9073 101 19.1603 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 97.9073 101 18.6697 + vertex 97.5725 101 18.4443 + vertex 97.68 101 18.915 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex 97.73 101 18.2122 + vertex 97.5725 101 18.4443 + vertex 97.9073 101 18.6697 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 97.73 101 18.2122 + vertex 97.2715 101 18.0667 + vertex 97.5725 101 18.4443 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex 97.3995 101 17.8497 + vertex 97.2715 101 18.0667 + vertex 97.73 101 18.2122 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 97.2715 101 18.0667 + vertex 96.9603 101 17.631 + vertex 96.8364 101 17.8572 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 96.9603 101 17.631 + vertex 97.2715 101 18.0667 + vertex 97.3995 101 17.8497 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -96.9798 101 20.1893 + vertex -97.2715 101 19.7633 + vertex -97.5295 101 19.8377 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -97.5725 101 19.3857 + vertex -97.5295 101 19.8377 + vertex -97.2715 101 19.7633 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -97.5295 101 19.8377 + vertex -97.5725 101 19.3857 + vertex -97.73 101 19.6178 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -97.5725 101 19.3857 + vertex -97.9073 101 19.1603 + vertex -97.73 101 19.6178 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex -97.68 101 18.915 + vertex -97.9073 101 19.1603 + vertex -97.5725 101 19.3857 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -97.68 101 18.915 + vertex -97.9073 101 18.6697 + vertex -97.9073 101 19.1603 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -97.5725 101 18.4443 + vertex -97.9073 101 18.6697 + vertex -97.68 101 18.915 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -97.5725 101 18.4443 + vertex -97.73 101 18.2122 + vertex -97.9073 101 18.6697 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -97.2715 101 18.0667 + vertex -97.73 101 18.2122 + vertex -97.5725 101 18.4443 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex -96.9603 101 17.631 + vertex -97.2715 101 18.0667 + vertex -96.8364 101 17.8572 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -97.2715 101 18.0667 + vertex -97.3995 101 17.8497 + vertex -97.73 101 18.2122 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex -95.9185 101 19.7633 + vertex -96 101 20.11 + vertex -95.6084 101 19.8144 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -96 101 20.11 + vertex -95.9185 101 19.7633 + vertex -96.3536 101 19.9728 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -95.6175 101 19.3857 + vertex -95.6084 101 19.8144 + vertex -95.3502 101 19.3973 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -95.6084 101 19.8144 + vertex -95.6175 101 19.3857 + vertex -95.9185 101 19.7633 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -95.51 101 18.915 + vertex -95.3502 101 19.3973 + vertex -95.26 101 18.915 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -95.3502 101 19.3973 + vertex -95.51 101 18.915 + vertex -95.6175 101 19.3857 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex -95.3502 101 18.4327 + vertex -95.51 101 18.915 + vertex -95.26 101 18.915 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -95.51 101 18.915 + vertex -95.3502 101 18.4327 + vertex -95.6175 101 18.4443 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex -95.6084 101 18.0156 + vertex -95.6175 101 18.4443 + vertex -95.3502 101 18.4327 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -95.6175 101 18.4443 + vertex -95.6084 101 18.0156 + vertex -95.9185 101 18.0667 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -96 101 17.72 + vertex -95.9185 101 18.0667 + vertex -95.6084 101 18.0156 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex -96.4718 101 17.5857 + vertex -96.8364 101 17.8572 + vertex -96.3536 101 17.8572 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -95.9185 101 18.0667 + vertex -96 101 17.72 + vertex -96.3536 101 17.8572 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -96.4718 101 17.5857 + vertex -96.3536 101 17.8572 + vertex -96 101 17.72 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -97.2715 101 18.0667 + vertex -96.9603 101 17.631 + vertex -97.3995 101 17.8497 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -96.8364 101 17.8572 + vertex -96.4718 101 17.5857 + vertex -96.9603 101 17.631 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -96.8872 101 20.2058 + vertex -96.9798 101 20.1893 + vertex -96.9603 101 20.199 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex -96.7696 101 19.9728 + vertex -96.8872 101 20.2058 + vertex -96.605 101 20.232 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -96.3536 101 19.9728 + vertex -96.605 101 20.232 + vertex -96.4718 101 20.2443 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex -96.3536 101 19.9728 + vertex -96.4718 101 20.2443 + vertex -96 101 20.11 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -96.605 101 20.232 + vertex -96.3536 101 19.9728 + vertex -96.7696 101 19.9728 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex -96.8755 101 19.954 + vertex -96.8872 101 20.2058 + vertex -96.7696 101 19.9728 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -96.8872 101 20.2058 + vertex -96.8755 101 19.954 + vertex -96.9798 101 20.1893 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -97.2715 101 19.7633 + vertex -96.9798 101 20.1893 + vertex -96.8755 101 19.954 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex -97.5295 101 19.8377 + vertex -106.146 101 18.56 + vertex -96.9798 101 20.1893 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex -106.139 101 18.3073 + vertex -106.146 101 18.56 + vertex -97.5295 101 19.8377 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -106.523 101 18.6057 + vertex -106.139 101 18.3073 + vertex -106.615 101 18.365 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -96.605 101 20.256 + vertex -96.605 101 20.232 + vertex -96.8872 101 20.2058 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -96.8872 82 24.3942 + vertex -96.605 82 24.344 + vertex -96.605 82 24.368 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -106.139 82 26.2927 + vertex -106.523 82 25.9943 + vertex -106.146 82 26.04 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -107.009 82 25.9631 + vertex -106.523 82 25.9943 + vertex -106.615 82 26.235 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -107.009 82 25.9631 + vertex -106.816 82 25.7924 + vertex -106.523 82 25.9943 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -107.231 82 25.5393 + vertex -106.816 82 25.7924 + vertex -107.009 82 25.9631 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -107.231 82 25.5393 + vertex -106.981 82 25.4777 + vertex -106.816 82 25.7924 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -107.231 82 25.5393 + vertex -107 82 24.13 + vertex -106.981 82 25.4777 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -107.231 82 25.5393 + vertex -107 82 22.13 + vertex -107 82 24.13 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -107 82 22.13 + vertex -107 82 22.1 + vertex -106.981 82 22.13 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -107.231 82 25.5393 + vertex -107 82 22.1 + vertex -107 82 22.13 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -107.231 82 19.0607 + vertex -107 82 22.1 + vertex -107.231 82 25.5393 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -107 82 20.5 + vertex -106.981 82 19.1223 + vertex -106.981 82 20.5 + endloop + endfacet + facet normal 0 -1 -0 + outer loop + vertex -107 82 22.1 + vertex -107.231 82 19.0607 + vertex -107 82 20.5 + endloop + endfacet + facet normal 0 -1 -0 + outer loop + vertex -107 82 20.5 + vertex -107.231 82 19.0607 + vertex -106.981 82 19.1223 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -107.231 82 19.0607 + vertex -106.816 82 18.8076 + vertex -106.981 82 19.1223 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -107.009 82 18.6369 + vertex -106.816 82 18.8076 + vertex -107.231 82 19.0607 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -107.009 82 18.6369 + vertex -106.523 82 18.6057 + vertex -106.816 82 18.8076 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -106.615 82 18.365 + vertex -106.523 82 18.6057 + vertex -107.009 82 18.6369 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -106.139 82 18.3073 + vertex -106.523 82 18.6057 + vertex -106.615 82 18.365 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -106.523 82 25.9943 + vertex -106.139 82 26.2927 + vertex -106.615 82 26.235 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -106.146 82 26.04 + vertex -97.5295 82 24.7623 + vertex -106.139 82 26.2927 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -96.9798 82 24.4107 + vertex -97.5295 82 24.7623 + vertex -106.146 82 26.04 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -97.5295 82 24.7623 + vertex -96.9798 82 24.4107 + vertex -96.8755 82 24.646 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -96.605 82 24.368 + vertex -96.3536 82 24.6272 + vertex -96.7696 82 24.6272 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -96.8872 82 24.3942 + vertex -96.8755 82 24.646 + vertex -96.9798 82 24.4107 + endloop + endfacet + facet normal 0 -1 -0 + outer loop + vertex -96.8755 82 24.646 + vertex -96.8872 82 24.3942 + vertex -96.7696 82 24.6272 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -96.8872 82 24.3942 + vertex -96.9798 82 24.4107 + vertex -96.9603 82 24.401 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -96.605 82 24.368 + vertex -96.7696 82 24.6272 + vertex -96.8872 82 24.3942 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -96.3536 82 24.6272 + vertex -96.605 82 24.368 + vertex -96.4718 82 24.3557 + endloop + endfacet + facet normal 0 -1 -0 + outer loop + vertex -96.3536 82 24.6272 + vertex -96.4718 82 24.3557 + vertex -96 82 24.49 + endloop + endfacet + facet normal 0 -1 -0 + outer loop + vertex -96.9603 82 26.969 + vertex -97.2715 82 26.5333 + vertex -96.8364 82 26.7428 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -97.73 82 26.3878 + vertex -97.2715 82 26.5333 + vertex -97.3995 82 26.7503 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -97.73 82 26.3878 + vertex -97.5725 82 26.1557 + vertex -97.2715 82 26.5333 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -97.9073 82 25.9303 + vertex -97.5725 82 26.1557 + vertex -97.73 82 26.3878 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -97.9073 82 25.9303 + vertex -97.68 82 25.685 + vertex -97.5725 82 26.1557 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -97.9073 82 25.4397 + vertex -97.68 82 25.685 + vertex -97.9073 82 25.9303 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -97.9073 82 25.4397 + vertex -97.5725 82 25.2143 + vertex -97.68 82 25.685 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -97.73 82 24.9822 + vertex -97.5725 82 25.2143 + vertex -97.9073 82 25.4397 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -97.5295 82 24.7623 + vertex -97.5725 82 25.2143 + vertex -97.73 82 24.9822 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -97.5725 82 25.2143 + vertex -97.5295 82 24.7623 + vertex -97.2715 82 24.8367 + endloop + endfacet + facet normal 0 -1 -0 + outer loop + vertex -97.2715 82 24.8367 + vertex -97.5295 82 24.7623 + vertex -96.8755 82 24.646 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -96.8364 82 26.7428 + vertex -96.4718 82 27.0143 + vertex -96.9603 82 26.969 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -97.2715 82 26.5333 + vertex -96.9603 82 26.969 + vertex -97.3995 82 26.7503 + endloop + endfacet + facet normal 0 -1 -0 + outer loop + vertex -96.4718 82 27.0143 + vertex -96.8364 82 26.7428 + vertex -96.3536 82 26.7428 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -96.4718 82 27.0143 + vertex -96.3536 82 26.7428 + vertex -96 82 26.88 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -95.9185 82 26.5333 + vertex -96 82 26.88 + vertex -96.3536 82 26.7428 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -96 82 26.88 + vertex -95.9185 82 26.5333 + vertex -95.6084 82 26.5844 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -95.6175 82 26.1557 + vertex -95.6084 82 26.5844 + vertex -95.9185 82 26.5333 + endloop + endfacet + facet normal 0 -1 -0 + outer loop + vertex -95.6084 82 26.5844 + vertex -95.6175 82 26.1557 + vertex -95.3502 82 26.1673 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -95.51 82 25.685 + vertex -95.3502 82 26.1673 + vertex -95.6175 82 26.1557 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -95.51 82 25.685 + vertex -95.26 82 25.685 + vertex -95.3502 82 26.1673 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -95.3502 82 25.2027 + vertex -95.51 82 25.685 + vertex -95.6175 82 25.2143 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -95.51 82 25.685 + vertex -95.3502 82 25.2027 + vertex -95.26 82 25.685 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -95.6084 82 24.7856 + vertex -95.6175 82 25.2143 + vertex -95.9185 82 24.8367 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -95.6175 82 25.2143 + vertex -95.6084 82 24.7856 + vertex -95.3502 82 25.2027 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -96 82 24.49 + vertex -95.9185 82 24.8367 + vertex -96.3536 82 24.6272 + endloop + endfacet + facet normal 0 -1 -0 + outer loop + vertex -95.9185 82 24.8367 + vertex -96 82 24.49 + vertex -95.6084 82 24.7856 + endloop + endfacet + facet normal 0 -1 -0 + outer loop + vertex -106.981 82 25.4777 + vertex -107 82 24.13 + vertex -106.981 82 24.13 + endloop + endfacet + facet normal 0 -1 -0 + outer loop + vertex -106.981 82 22.13 + vertex -107 82 22.1 + vertex -106.981 82 22.1 + endloop + endfacet + facet normal 0 -1 -0 + outer loop + vertex -96.605 82 20.256 + vertex -96.8872 82 20.2058 + vertex -96.605 82 20.232 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -96.9798 82 20.1893 + vertex -96.8872 82 20.2058 + vertex -96.9603 82 20.199 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -96.8755 82 19.954 + vertex -96.8872 82 20.2058 + vertex -96.9798 82 20.1893 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -96.8872 82 20.2058 + vertex -96.7696 82 19.9728 + vertex -96.605 82 20.232 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -96.3536 82 19.9728 + vertex -96.605 82 20.232 + vertex -96.7696 82 19.9728 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -96.605 82 20.232 + vertex -96.3536 82 19.9728 + vertex -96.4718 82 20.2443 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -96.8872 82 20.2058 + vertex -96.8755 82 19.954 + vertex -96.7696 82 19.9728 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -97.2715 82 19.7633 + vertex -96.9798 82 20.1893 + vertex -97.5295 82 19.8377 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -106.146 82 18.56 + vertex -97.5295 82 19.8377 + vertex -96.9798 82 20.1893 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -106.523 82 18.6057 + vertex -106.139 82 18.3073 + vertex -106.146 82 18.56 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -106.146 82 18.56 + vertex -106.139 82 18.3073 + vertex -97.5295 82 19.8377 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -96.4718 82 20.2443 + vertex -96.3536 82 19.9728 + vertex -96 82 20.11 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -95.9185 82 19.7633 + vertex -96 82 20.11 + vertex -96.3536 82 19.9728 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -96 82 20.11 + vertex -95.9185 82 19.7633 + vertex -95.6084 82 19.8144 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -95.6175 82 19.3857 + vertex -95.6084 82 19.8144 + vertex -95.9185 82 19.7633 + endloop + endfacet + facet normal 0 -1 -0 + outer loop + vertex -95.6084 82 19.8144 + vertex -95.6175 82 19.3857 + vertex -95.3502 82 19.3973 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -95.51 82 18.915 + vertex -95.3502 82 19.3973 + vertex -95.6175 82 19.3857 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -95.51 82 18.915 + vertex -95.26 82 18.915 + vertex -95.3502 82 19.3973 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -95.3502 82 18.4327 + vertex -95.51 82 18.915 + vertex -95.6175 82 18.4443 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -95.51 82 18.915 + vertex -95.3502 82 18.4327 + vertex -95.26 82 18.915 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -95.6084 82 18.0156 + vertex -95.6175 82 18.4443 + vertex -95.9185 82 18.0667 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -95.6175 82 18.4443 + vertex -95.6084 82 18.0156 + vertex -95.3502 82 18.4327 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -96 82 17.72 + vertex -95.9185 82 18.0667 + vertex -96.3536 82 17.8572 + endloop + endfacet + facet normal 0 -1 -0 + outer loop + vertex -95.9185 82 18.0667 + vertex -96 82 17.72 + vertex -95.6084 82 18.0156 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -96.8364 82 17.8572 + vertex -96 82 17.72 + vertex -96.3536 82 17.8572 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -96.4718 82 17.5857 + vertex -96.8364 82 17.8572 + vertex -96.9603 82 17.631 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -96.8364 82 17.8572 + vertex -96.4718 82 17.5857 + vertex -96 82 17.72 + endloop + endfacet + facet normal 0 -1 -0 + outer loop + vertex -96.9798 82 20.1893 + vertex -97.2715 82 19.7633 + vertex -96.8755 82 19.954 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -97.5725 82 19.3857 + vertex -97.5295 82 19.8377 + vertex -97.73 82 19.6178 + endloop + endfacet + facet normal 0 -1 -0 + outer loop + vertex -97.5295 82 19.8377 + vertex -97.5725 82 19.3857 + vertex -97.2715 82 19.7633 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -97.9073 82 19.1603 + vertex -97.5725 82 19.3857 + vertex -97.73 82 19.6178 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -97.9073 82 19.1603 + vertex -97.68 82 18.915 + vertex -97.5725 82 19.3857 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -97.9073 82 18.6697 + vertex -97.68 82 18.915 + vertex -97.9073 82 19.1603 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -97.9073 82 18.6697 + vertex -97.5725 82 18.4443 + vertex -97.68 82 18.915 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -97.73 82 18.2122 + vertex -97.5725 82 18.4443 + vertex -97.9073 82 18.6697 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -97.73 82 18.2122 + vertex -97.2715 82 18.0667 + vertex -97.5725 82 18.4443 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -97.3995 82 17.8497 + vertex -97.2715 82 18.0667 + vertex -97.73 82 18.2122 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -97.2715 82 18.0667 + vertex -96.9603 82 17.631 + vertex -96.8364 82 17.8572 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -96.9603 82 17.631 + vertex -97.2715 82 18.0667 + vertex -97.3995 82 17.8497 + endloop + endfacet + facet normal 0.175007 0 0.984567 + outer loop + vertex -106.139 101 26.2927 + vertex -97.5295 82 24.7623 + vertex -97.5295 101 24.7623 + endloop + endfacet + facet normal 0.175007 0 0.984567 + outer loop + vertex -97.5295 82 24.7623 + vertex -106.139 101 26.2927 + vertex -106.139 82 26.2927 + endloop + endfacet + facet normal 0.175 0 0.984568 + outer loop + vertex -96.8755 101 24.646 + vertex -96.7696 82 24.6272 + vertex -96.7696 101 24.6272 + endloop + endfacet + facet normal 0.175 0 0.984568 + outer loop + vertex -96.7696 82 24.6272 + vertex -96.8755 101 24.646 + vertex -96.8755 82 24.646 + endloop + endfacet + facet normal -0.120538 0 0.992709 + outer loop + vertex -106.615 101 26.235 + vertex -106.139 82 26.2927 + vertex -106.139 101 26.2927 + endloop + endfacet + facet normal -0.120538 0 0.992709 + outer loop + vertex -106.139 82 26.2927 + vertex -106.615 101 26.235 + vertex -106.615 82 26.235 + endloop + endfacet + facet normal -0.568069 0 0.822981 + outer loop + vertex -107.009 101 25.9631 + vertex -106.615 82 26.235 + vertex -106.615 101 26.235 + endloop + endfacet + facet normal -0.568069 0 0.822981 + outer loop + vertex -106.615 82 26.235 + vertex -107.009 101 25.9631 + vertex -107.009 82 25.9631 + endloop + endfacet + facet normal -0.885462 0 0.464712 + outer loop + vertex -107.231 82 25.5393 + vertex -107.009 101 25.9631 + vertex -107.231 101 25.5393 + endloop + endfacet + facet normal -0.885462 0 0.464712 + outer loop + vertex -107.009 101 25.9631 + vertex -107.231 82 25.5393 + vertex -107.009 82 25.9631 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -107.231 82 19.0607 + vertex -107.231 101 25.5393 + vertex -107.231 101 19.0607 + endloop + endfacet + facet normal -1 -0 0 + outer loop + vertex -107.231 101 25.5393 + vertex -107.231 82 19.0607 + vertex -107.231 82 25.5393 + endloop + endfacet + facet normal -0.885462 0 -0.464712 + outer loop + vertex -107.009 82 18.6369 + vertex -107.231 101 19.0607 + vertex -107.009 101 18.6369 + endloop + endfacet + facet normal -0.885462 -0 -0.464712 + outer loop + vertex -107.231 101 19.0607 + vertex -107.009 82 18.6369 + vertex -107.231 82 19.0607 + endloop + endfacet + facet normal -0.568069 0 -0.822981 + outer loop + vertex -107.009 82 18.6369 + vertex -106.615 101 18.365 + vertex -106.615 82 18.365 + endloop + endfacet + facet normal -0.568069 0 -0.822981 + outer loop + vertex -106.615 101 18.365 + vertex -107.009 82 18.6369 + vertex -107.009 101 18.6369 + endloop + endfacet + facet normal -0.120538 0 -0.992709 + outer loop + vertex -106.615 82 18.365 + vertex -106.139 101 18.3073 + vertex -106.139 82 18.3073 + endloop + endfacet + facet normal -0.120538 0 -0.992709 + outer loop + vertex -106.139 101 18.3073 + vertex -106.615 82 18.365 + vertex -106.615 101 18.365 + endloop + endfacet + facet normal 0.175008 0 -0.984567 + outer loop + vertex -106.139 82 18.3073 + vertex -97.5295 101 19.8377 + vertex -97.5295 82 19.8377 + endloop + endfacet + facet normal 0.175008 0 -0.984567 + outer loop + vertex -97.5295 101 19.8377 + vertex -106.139 82 18.3073 + vertex -106.139 101 18.3073 + endloop + endfacet + facet normal 0.175 0 -0.984568 + outer loop + vertex -96.8755 82 19.954 + vertex -96.7696 101 19.9728 + vertex -96.7696 82 19.9728 + endloop + endfacet + facet normal 0.175 0 -0.984568 + outer loop + vertex -96.7696 101 19.9728 + vertex -96.8755 82 19.954 + vertex -96.8755 101 19.954 + endloop + endfacet + facet normal 0.568073 0 0.822978 + outer loop + vertex -106.816 101 18.8076 + vertex -106.523 82 18.6057 + vertex -106.523 101 18.6057 + endloop + endfacet + facet normal 0.568073 0 0.822978 + outer loop + vertex -106.523 82 18.6057 + vertex -106.816 101 18.8076 + vertex -106.816 82 18.8076 + endloop + endfacet + facet normal 0.88547 -0 0.464697 + outer loop + vertex -106.981 82 19.1223 + vertex -106.816 101 18.8076 + vertex -106.981 101 19.1223 + endloop + endfacet + facet normal 0.88547 0 0.464697 + outer loop + vertex -106.816 101 18.8076 + vertex -106.981 82 19.1223 + vertex -106.816 82 18.8076 + endloop + endfacet + facet normal 1 -0 0 + outer loop + vertex -106.981 82 25.4777 + vertex -106.981 101 24.13 + vertex -106.981 101 25.4777 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex -106.981 101 24.13 + vertex -106.981 82 25.4777 + vertex -106.981 82 24.13 + endloop + endfacet + facet normal 1 -0 0 + outer loop + vertex -106.981 82 20.5 + vertex -106.981 101 19.1223 + vertex -106.981 101 20.5 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex -106.981 101 19.1223 + vertex -106.981 82 20.5 + vertex -106.981 82 19.1223 + endloop + endfacet + facet normal 1 -0 0 + outer loop + vertex -106.981 82 22.13 + vertex -106.981 101 22.1 + vertex -106.981 101 22.13 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex -106.981 101 22.1 + vertex -106.981 82 22.13 + vertex -106.981 82 22.1 + endloop + endfacet + facet normal 0.88547 0 -0.464697 + outer loop + vertex -106.816 82 25.7924 + vertex -106.981 101 25.4777 + vertex -106.816 101 25.7924 + endloop + endfacet + facet normal 0.88547 0 -0.464697 + outer loop + vertex -106.981 101 25.4777 + vertex -106.816 82 25.7924 + vertex -106.981 82 25.4777 + endloop + endfacet + facet normal 0.568073 0 -0.822978 + outer loop + vertex -106.816 82 25.7924 + vertex -106.523 101 25.9943 + vertex -106.523 82 25.9943 + endloop + endfacet + facet normal 0.568073 0 -0.822978 + outer loop + vertex -106.523 101 25.9943 + vertex -106.816 82 25.7924 + vertex -106.816 101 25.7924 + endloop + endfacet + facet normal 0.120522 0 -0.992711 + outer loop + vertex -106.523 82 25.9943 + vertex -106.146 101 26.04 + vertex -106.146 82 26.04 + endloop + endfacet + facet normal 0.120522 0 -0.992711 + outer loop + vertex -106.146 101 26.04 + vertex -106.523 82 25.9943 + vertex -106.523 101 25.9943 + endloop + endfacet + facet normal -0.175007 0 -0.984567 + outer loop + vertex -106.146 82 26.04 + vertex -96.9798 101 24.4107 + vertex -96.9798 82 24.4107 + endloop + endfacet + facet normal -0.175007 0 -0.984567 + outer loop + vertex -96.9798 101 24.4107 + vertex -106.146 82 26.04 + vertex -106.146 101 26.04 + endloop + endfacet + facet normal -0.175007 0 -0.984567 + outer loop + vertex -96.8872 82 24.3942 + vertex -96.605 101 24.344 + vertex -96.605 82 24.344 + endloop + endfacet + facet normal -0.175007 0 -0.984567 + outer loop + vertex -96.605 101 24.344 + vertex -96.8872 82 24.3942 + vertex -96.8872 101 24.3942 + endloop + endfacet + facet normal -0.175007 0 0.984567 + outer loop + vertex -106.146 101 18.56 + vertex -96.9798 82 20.1893 + vertex -96.9798 101 20.1893 + endloop + endfacet + facet normal -0.175007 0 0.984567 + outer loop + vertex -96.9798 82 20.1893 + vertex -106.146 101 18.56 + vertex -106.146 82 18.56 + endloop + endfacet + facet normal -0.175007 0 0.984567 + outer loop + vertex -96.8872 101 20.2058 + vertex -96.605 82 20.256 + vertex -96.605 101 20.256 + endloop + endfacet + facet normal -0.175007 0 0.984567 + outer loop + vertex -96.605 82 20.256 + vertex -96.8872 101 20.2058 + vertex -96.8872 82 20.2058 + endloop + endfacet + facet normal 0.120522 0 0.992711 + outer loop + vertex -106.523 101 18.6057 + vertex -106.146 82 18.56 + vertex -106.146 101 18.56 + endloop + endfacet + facet normal 0.120522 0 0.992711 + outer loop + vertex -106.146 82 18.56 + vertex -106.523 101 18.6057 + vertex -106.523 82 18.6057 + endloop + endfacet + facet normal 1 -0 0 + outer loop + vertex -96.605 82 24.368 + vertex -96.605 101 24.344 + vertex -96.605 101 24.368 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex -96.605 101 24.344 + vertex -96.605 82 24.368 + vertex -96.605 82 24.344 + endloop + endfacet + facet normal 1 -0 0 + outer loop + vertex -96.605 82 20.256 + vertex -96.605 101 20.232 + vertex -96.605 101 20.256 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex -96.605 101 20.232 + vertex -96.605 82 20.256 + vertex -96.605 82 20.232 + endloop + endfacet + facet normal 0.602619 0 -0.798029 + outer loop + vertex -96 82 17.72 + vertex -95.6084 101 18.0156 + vertex -95.6084 82 18.0156 + endloop + endfacet + facet normal 0.602619 0 -0.798029 + outer loop + vertex -95.6084 101 18.0156 + vertex -96 82 17.72 + vertex -96 101 17.72 + endloop + endfacet + facet normal 0.850222 0 -0.526424 + outer loop + vertex -95.3502 82 18.4327 + vertex -95.6084 101 18.0156 + vertex -95.3502 101 18.4327 + endloop + endfacet + facet normal 0.850222 0 -0.526424 + outer loop + vertex -95.6084 101 18.0156 + vertex -95.3502 82 18.4327 + vertex -95.6084 82 18.0156 + endloop + endfacet + facet normal 0.982973 0 -0.18375 + outer loop + vertex -95.26 82 18.915 + vertex -95.3502 101 18.4327 + vertex -95.26 101 18.915 + endloop + endfacet + facet normal 0.982973 0 -0.18375 + outer loop + vertex -95.3502 101 18.4327 + vertex -95.26 82 18.915 + vertex -95.3502 82 18.4327 + endloop + endfacet + facet normal 0.982973 -0 0.18375 + outer loop + vertex -95.3502 82 19.3973 + vertex -95.26 101 18.915 + vertex -95.3502 101 19.3973 + endloop + endfacet + facet normal 0.982973 0 0.18375 + outer loop + vertex -95.26 101 18.915 + vertex -95.3502 82 19.3973 + vertex -95.26 82 18.915 + endloop + endfacet + facet normal 0.850222 -0 0.526424 + outer loop + vertex -95.6084 82 19.8144 + vertex -95.3502 101 19.3973 + vertex -95.6084 101 19.8144 + endloop + endfacet + facet normal 0.850222 0 0.526424 + outer loop + vertex -95.3502 101 19.3973 + vertex -95.6084 82 19.8144 + vertex -95.3502 82 19.3973 + endloop + endfacet + facet normal 0.602619 0 0.798029 + outer loop + vertex -96 101 20.11 + vertex -95.6084 82 19.8144 + vertex -95.6084 101 19.8144 + endloop + endfacet + facet normal 0.602619 0 0.798029 + outer loop + vertex -95.6084 82 19.8144 + vertex -96 101 20.11 + vertex -96 82 20.11 + endloop + endfacet + facet normal 0.273665 0 0.961825 + outer loop + vertex -96.4718 101 20.2443 + vertex -96 82 20.11 + vertex -96 101 20.11 + endloop + endfacet + facet normal 0.273665 0 0.961825 + outer loop + vertex -96 82 20.11 + vertex -96.4718 101 20.2443 + vertex -96.4718 82 20.2443 + endloop + endfacet + facet normal -0.0922792 0 0.995733 + outer loop + vertex -96.9603 101 20.199 + vertex -96.8872 82 20.2058 + vertex -96.8872 101 20.2058 + endloop + endfacet + facet normal -0.0922792 0 0.995733 + outer loop + vertex -96.8872 82 20.2058 + vertex -96.9603 101 20.199 + vertex -96.9603 82 20.199 + endloop + endfacet + facet normal -0.0922857 0 0.995733 + outer loop + vertex -96.605 101 20.232 + vertex -96.4718 82 20.2443 + vertex -96.4718 101 20.2443 + endloop + endfacet + facet normal -0.0922857 0 0.995733 + outer loop + vertex -96.4718 82 20.2443 + vertex -96.605 101 20.232 + vertex -96.605 82 20.232 + endloop + endfacet + facet normal -0.445737 0 0.895164 + outer loop + vertex -96.9798 101 20.1893 + vertex -96.9603 82 20.199 + vertex -96.9603 101 20.199 + endloop + endfacet + facet normal -0.445737 0 0.895164 + outer loop + vertex -96.9603 82 20.199 + vertex -96.9798 101 20.1893 + vertex -96.9798 82 20.1893 + endloop + endfacet + facet normal -0.739002 0 0.673704 + outer loop + vertex -97.73 82 19.6178 + vertex -97.5295 101 19.8377 + vertex -97.73 101 19.6178 + endloop + endfacet + facet normal -0.739002 0 0.673704 + outer loop + vertex -97.5295 101 19.8377 + vertex -97.73 82 19.6178 + vertex -97.5295 82 19.8377 + endloop + endfacet + facet normal -0.932469 0 0.36125 + outer loop + vertex -97.9073 82 19.1603 + vertex -97.73 101 19.6178 + vertex -97.9073 101 19.1603 + endloop + endfacet + facet normal -0.932469 0 0.36125 + outer loop + vertex -97.73 101 19.6178 + vertex -97.9073 82 19.1603 + vertex -97.73 82 19.6178 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -97.9073 82 18.6697 + vertex -97.9073 101 19.1603 + vertex -97.9073 101 18.6697 + endloop + endfacet + facet normal -1 -0 0 + outer loop + vertex -97.9073 101 19.1603 + vertex -97.9073 82 18.6697 + vertex -97.9073 82 19.1603 + endloop + endfacet + facet normal -0.932469 0 -0.36125 + outer loop + vertex -97.73 82 18.2122 + vertex -97.9073 101 18.6697 + vertex -97.73 101 18.2122 + endloop + endfacet + facet normal -0.932469 -0 -0.36125 + outer loop + vertex -97.9073 101 18.6697 + vertex -97.73 82 18.2122 + vertex -97.9073 82 18.6697 + endloop + endfacet + facet normal -0.739009 0 -0.673695 + outer loop + vertex -97.3995 82 17.8497 + vertex -97.73 101 18.2122 + vertex -97.3995 101 17.8497 + endloop + endfacet + facet normal -0.739009 -0 -0.673695 + outer loop + vertex -97.73 101 18.2122 + vertex -97.3995 82 17.8497 + vertex -97.73 82 18.2122 + endloop + endfacet + facet normal -0.445745 0 -0.89516 + outer loop + vertex -97.3995 82 17.8497 + vertex -96.9603 101 17.631 + vertex -96.9603 82 17.631 + endloop + endfacet + facet normal -0.445745 0 -0.89516 + outer loop + vertex -96.9603 101 17.631 + vertex -97.3995 82 17.8497 + vertex -97.3995 101 17.8497 + endloop + endfacet + facet normal -0.0922827 0 -0.995733 + outer loop + vertex -96.9603 82 17.631 + vertex -96.4718 101 17.5857 + vertex -96.4718 82 17.5857 + endloop + endfacet + facet normal -0.0922827 0 -0.995733 + outer loop + vertex -96.4718 101 17.5857 + vertex -96.9603 82 17.631 + vertex -96.9603 101 17.631 + endloop + endfacet + facet normal 0.273665 0 -0.961825 + outer loop + vertex -96.4718 82 17.5857 + vertex -96 101 17.72 + vertex -96 82 17.72 + endloop + endfacet + facet normal 0.273665 0 -0.961825 + outer loop + vertex -96 101 17.72 + vertex -96.4718 82 17.5857 + vertex -96.4718 101 17.5857 + endloop + endfacet + facet normal 0.433867 0 0.900977 + outer loop + vertex -97.2715 101 18.0667 + vertex -96.8364 82 17.8572 + vertex -96.8364 101 17.8572 + endloop + endfacet + facet normal 0.433867 0 0.900977 + outer loop + vertex -96.8364 82 17.8572 + vertex -97.2715 101 18.0667 + vertex -97.2715 82 18.0667 + endloop + endfacet + facet normal 0.781848 -0 0.623469 + outer loop + vertex -97.5725 82 18.4443 + vertex -97.2715 101 18.0667 + vertex -97.5725 101 18.4443 + endloop + endfacet + facet normal 0.781848 0 0.623469 + outer loop + vertex -97.2715 101 18.0667 + vertex -97.5725 82 18.4443 + vertex -97.2715 82 18.0667 + endloop + endfacet + facet normal 0.974925 -0 0.222535 + outer loop + vertex -97.68 82 18.915 + vertex -97.5725 101 18.4443 + vertex -97.68 101 18.915 + endloop + endfacet + facet normal 0.974925 0 0.222535 + outer loop + vertex -97.5725 101 18.4443 + vertex -97.68 82 18.915 + vertex -97.5725 82 18.4443 + endloop + endfacet + facet normal 0.974925 0 -0.222535 + outer loop + vertex -97.5725 82 19.3857 + vertex -97.68 101 18.915 + vertex -97.5725 101 19.3857 + endloop + endfacet + facet normal 0.974925 0 -0.222535 + outer loop + vertex -97.68 101 18.915 + vertex -97.5725 82 19.3857 + vertex -97.68 82 18.915 + endloop + endfacet + facet normal 0.781848 0 -0.623469 + outer loop + vertex -97.2715 82 19.7633 + vertex -97.5725 101 19.3857 + vertex -97.2715 101 19.7633 + endloop + endfacet + facet normal 0.781848 0 -0.623469 + outer loop + vertex -97.5725 101 19.3857 + vertex -97.2715 82 19.7633 + vertex -97.5725 82 19.3857 + endloop + endfacet + facet normal 0.433867 0 -0.900977 + outer loop + vertex -97.2715 82 19.7633 + vertex -96.8755 101 19.954 + vertex -96.8755 82 19.954 + endloop + endfacet + facet normal 0.433867 0 -0.900977 + outer loop + vertex -96.8755 101 19.954 + vertex -97.2715 82 19.7633 + vertex -97.2715 101 19.7633 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -96.7696 82 19.9728 + vertex -96.3536 101 19.9728 + vertex -96.3536 82 19.9728 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex -96.3536 101 19.9728 + vertex -96.7696 82 19.9728 + vertex -96.7696 101 19.9728 + endloop + endfacet + facet normal -0.433867 0 -0.900977 + outer loop + vertex -96.3536 82 19.9728 + vertex -95.9185 101 19.7633 + vertex -95.9185 82 19.7633 + endloop + endfacet + facet normal -0.433867 0 -0.900977 + outer loop + vertex -95.9185 101 19.7633 + vertex -96.3536 82 19.9728 + vertex -96.3536 101 19.9728 + endloop + endfacet + facet normal -0.781848 0 -0.623469 + outer loop + vertex -95.6175 82 19.3857 + vertex -95.9185 101 19.7633 + vertex -95.6175 101 19.3857 + endloop + endfacet + facet normal -0.781848 -0 -0.623469 + outer loop + vertex -95.9185 101 19.7633 + vertex -95.6175 82 19.3857 + vertex -95.9185 82 19.7633 + endloop + endfacet + facet normal -0.974925 0 -0.222535 + outer loop + vertex -95.51 82 18.915 + vertex -95.6175 101 19.3857 + vertex -95.51 101 18.915 + endloop + endfacet + facet normal -0.974925 -0 -0.222535 + outer loop + vertex -95.6175 101 19.3857 + vertex -95.51 82 18.915 + vertex -95.6175 82 19.3857 + endloop + endfacet + facet normal -0.974925 0 0.222535 + outer loop + vertex -95.6175 82 18.4443 + vertex -95.51 101 18.915 + vertex -95.6175 101 18.4443 + endloop + endfacet + facet normal -0.974925 0 0.222535 + outer loop + vertex -95.51 101 18.915 + vertex -95.6175 82 18.4443 + vertex -95.51 82 18.915 + endloop + endfacet + facet normal -0.781848 0 0.623469 + outer loop + vertex -95.9185 82 18.0667 + vertex -95.6175 101 18.4443 + vertex -95.9185 101 18.0667 + endloop + endfacet + facet normal -0.781848 0 0.623469 + outer loop + vertex -95.6175 101 18.4443 + vertex -95.9185 82 18.0667 + vertex -95.6175 82 18.4443 + endloop + endfacet + facet normal -0.433867 0 0.900977 + outer loop + vertex -96.3536 101 17.8572 + vertex -95.9185 82 18.0667 + vertex -95.9185 101 18.0667 + endloop + endfacet + facet normal -0.433867 0 0.900977 + outer loop + vertex -95.9185 82 18.0667 + vertex -96.3536 101 17.8572 + vertex -96.3536 82 17.8572 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -96.8364 101 17.8572 + vertex -96.3536 82 17.8572 + vertex -96.3536 101 17.8572 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -96.3536 82 17.8572 + vertex -96.8364 101 17.8572 + vertex -96.8364 82 17.8572 + endloop + endfacet + facet normal 0.602619 0 -0.798029 + outer loop + vertex -96 82 24.49 + vertex -95.6084 101 24.7856 + vertex -95.6084 82 24.7856 + endloop + endfacet + facet normal 0.602619 0 -0.798029 + outer loop + vertex -95.6084 101 24.7856 + vertex -96 82 24.49 + vertex -96 101 24.49 + endloop + endfacet + facet normal 0.850222 0 -0.526424 + outer loop + vertex -95.3502 82 25.2027 + vertex -95.6084 101 24.7856 + vertex -95.3502 101 25.2027 + endloop + endfacet + facet normal 0.850222 0 -0.526424 + outer loop + vertex -95.6084 101 24.7856 + vertex -95.3502 82 25.2027 + vertex -95.6084 82 24.7856 + endloop + endfacet + facet normal 0.982973 0 -0.18375 + outer loop + vertex -95.26 82 25.685 + vertex -95.3502 101 25.2027 + vertex -95.26 101 25.685 + endloop + endfacet + facet normal 0.982973 0 -0.18375 + outer loop + vertex -95.3502 101 25.2027 + vertex -95.26 82 25.685 + vertex -95.3502 82 25.2027 + endloop + endfacet + facet normal 0.982973 -0 0.18375 + outer loop + vertex -95.3502 82 26.1673 + vertex -95.26 101 25.685 + vertex -95.3502 101 26.1673 + endloop + endfacet + facet normal 0.982973 0 0.18375 + outer loop + vertex -95.26 101 25.685 + vertex -95.3502 82 26.1673 + vertex -95.26 82 25.685 + endloop + endfacet + facet normal 0.850222 -0 0.526424 + outer loop + vertex -95.6084 82 26.5844 + vertex -95.3502 101 26.1673 + vertex -95.6084 101 26.5844 + endloop + endfacet + facet normal 0.850222 0 0.526424 + outer loop + vertex -95.3502 101 26.1673 + vertex -95.6084 82 26.5844 + vertex -95.3502 82 26.1673 + endloop + endfacet + facet normal 0.602619 0 0.798029 + outer loop + vertex -96 101 26.88 + vertex -95.6084 82 26.5844 + vertex -95.6084 101 26.5844 + endloop + endfacet + facet normal 0.602619 0 0.798029 + outer loop + vertex -95.6084 82 26.5844 + vertex -96 101 26.88 + vertex -96 82 26.88 + endloop + endfacet + facet normal 0.273665 0 0.961825 + outer loop + vertex -96.4718 101 27.0143 + vertex -96 82 26.88 + vertex -96 101 26.88 + endloop + endfacet + facet normal 0.273665 0 0.961825 + outer loop + vertex -96 82 26.88 + vertex -96.4718 101 27.0143 + vertex -96.4718 82 27.0143 + endloop + endfacet + facet normal -0.0922827 0 0.995733 + outer loop + vertex -96.9603 101 26.969 + vertex -96.4718 82 27.0143 + vertex -96.4718 101 27.0143 + endloop + endfacet + facet normal -0.0922827 0 0.995733 + outer loop + vertex -96.4718 82 27.0143 + vertex -96.9603 101 26.969 + vertex -96.9603 82 26.969 + endloop + endfacet + facet normal -0.445745 0 0.89516 + outer loop + vertex -97.3995 101 26.7503 + vertex -96.9603 82 26.969 + vertex -96.9603 101 26.969 + endloop + endfacet + facet normal -0.445745 0 0.89516 + outer loop + vertex -96.9603 82 26.969 + vertex -97.3995 101 26.7503 + vertex -97.3995 82 26.7503 + endloop + endfacet + facet normal -0.739009 0 0.673695 + outer loop + vertex -97.73 82 26.3878 + vertex -97.3995 101 26.7503 + vertex -97.73 101 26.3878 + endloop + endfacet + facet normal -0.739009 0 0.673695 + outer loop + vertex -97.3995 101 26.7503 + vertex -97.73 82 26.3878 + vertex -97.3995 82 26.7503 + endloop + endfacet + facet normal -0.932469 0 0.36125 + outer loop + vertex -97.9073 82 25.9303 + vertex -97.73 101 26.3878 + vertex -97.9073 101 25.9303 + endloop + endfacet + facet normal -0.932469 0 0.36125 + outer loop + vertex -97.73 101 26.3878 + vertex -97.9073 82 25.9303 + vertex -97.73 82 26.3878 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -97.9073 82 25.4397 + vertex -97.9073 101 25.9303 + vertex -97.9073 101 25.4397 + endloop + endfacet + facet normal -1 -0 0 + outer loop + vertex -97.9073 101 25.9303 + vertex -97.9073 82 25.4397 + vertex -97.9073 82 25.9303 + endloop + endfacet + facet normal -0.932469 0 -0.36125 + outer loop + vertex -97.73 82 24.9822 + vertex -97.9073 101 25.4397 + vertex -97.73 101 24.9822 + endloop + endfacet + facet normal -0.932469 -0 -0.36125 + outer loop + vertex -97.9073 101 25.4397 + vertex -97.73 82 24.9822 + vertex -97.9073 82 25.4397 + endloop + endfacet + facet normal -0.739002 0 -0.673704 + outer loop + vertex -97.5295 82 24.7623 + vertex -97.73 101 24.9822 + vertex -97.5295 101 24.7623 + endloop + endfacet + facet normal -0.739002 -0 -0.673704 + outer loop + vertex -97.73 101 24.9822 + vertex -97.5295 82 24.7623 + vertex -97.73 82 24.9822 + endloop + endfacet + facet normal -0.445737 0 -0.895164 + outer loop + vertex -96.9798 82 24.4107 + vertex -96.9603 101 24.401 + vertex -96.9603 82 24.401 + endloop + endfacet + facet normal -0.445737 0 -0.895164 + outer loop + vertex -96.9603 101 24.401 + vertex -96.9798 82 24.4107 + vertex -96.9798 101 24.4107 + endloop + endfacet + facet normal -0.0922857 0 -0.995733 + outer loop + vertex -96.605 82 24.368 + vertex -96.4718 101 24.3557 + vertex -96.4718 82 24.3557 + endloop + endfacet + facet normal -0.0922857 0 -0.995733 + outer loop + vertex -96.4718 101 24.3557 + vertex -96.605 82 24.368 + vertex -96.605 101 24.368 + endloop + endfacet + facet normal -0.0922792 0 -0.995733 + outer loop + vertex -96.9603 82 24.401 + vertex -96.8872 101 24.3942 + vertex -96.8872 82 24.3942 + endloop + endfacet + facet normal -0.0922792 0 -0.995733 + outer loop + vertex -96.8872 101 24.3942 + vertex -96.9603 82 24.401 + vertex -96.9603 101 24.401 + endloop + endfacet + facet normal 0.273665 0 -0.961825 + outer loop + vertex -96.4718 82 24.3557 + vertex -96 101 24.49 + vertex -96 82 24.49 + endloop + endfacet + facet normal 0.273665 0 -0.961825 + outer loop + vertex -96 101 24.49 + vertex -96.4718 82 24.3557 + vertex -96.4718 101 24.3557 + endloop + endfacet + facet normal 0.433867 0 0.900977 + outer loop + vertex -97.2715 101 24.8367 + vertex -96.8755 82 24.646 + vertex -96.8755 101 24.646 + endloop + endfacet + facet normal 0.433867 0 0.900977 + outer loop + vertex -96.8755 82 24.646 + vertex -97.2715 101 24.8367 + vertex -97.2715 82 24.8367 + endloop + endfacet + facet normal 0.781848 -0 0.623469 + outer loop + vertex -97.5725 82 25.2143 + vertex -97.2715 101 24.8367 + vertex -97.5725 101 25.2143 + endloop + endfacet + facet normal 0.781848 0 0.623469 + outer loop + vertex -97.2715 101 24.8367 + vertex -97.5725 82 25.2143 + vertex -97.2715 82 24.8367 + endloop + endfacet + facet normal 0.974925 -0 0.222535 + outer loop + vertex -97.68 82 25.685 + vertex -97.5725 101 25.2143 + vertex -97.68 101 25.685 + endloop + endfacet + facet normal 0.974925 0 0.222535 + outer loop + vertex -97.5725 101 25.2143 + vertex -97.68 82 25.685 + vertex -97.5725 82 25.2143 + endloop + endfacet + facet normal 0.974925 0 -0.222535 + outer loop + vertex -97.5725 82 26.1557 + vertex -97.68 101 25.685 + vertex -97.5725 101 26.1557 + endloop + endfacet + facet normal 0.974925 0 -0.222535 + outer loop + vertex -97.68 101 25.685 + vertex -97.5725 82 26.1557 + vertex -97.68 82 25.685 + endloop + endfacet + facet normal 0.781848 0 -0.623469 + outer loop + vertex -97.2715 82 26.5333 + vertex -97.5725 101 26.1557 + vertex -97.2715 101 26.5333 + endloop + endfacet + facet normal 0.781848 0 -0.623469 + outer loop + vertex -97.5725 101 26.1557 + vertex -97.2715 82 26.5333 + vertex -97.5725 82 26.1557 + endloop + endfacet + facet normal 0.433867 0 -0.900977 + outer loop + vertex -97.2715 82 26.5333 + vertex -96.8364 101 26.7428 + vertex -96.8364 82 26.7428 + endloop + endfacet + facet normal 0.433867 0 -0.900977 + outer loop + vertex -96.8364 101 26.7428 + vertex -97.2715 82 26.5333 + vertex -97.2715 101 26.5333 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -96.8364 82 26.7428 + vertex -96.3536 101 26.7428 + vertex -96.3536 82 26.7428 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex -96.3536 101 26.7428 + vertex -96.8364 82 26.7428 + vertex -96.8364 101 26.7428 + endloop + endfacet + facet normal -0.433867 0 -0.900977 + outer loop + vertex -96.3536 82 26.7428 + vertex -95.9185 101 26.5333 + vertex -95.9185 82 26.5333 + endloop + endfacet + facet normal -0.433867 0 -0.900977 + outer loop + vertex -95.9185 101 26.5333 + vertex -96.3536 82 26.7428 + vertex -96.3536 101 26.7428 + endloop + endfacet + facet normal -0.781848 0 -0.623469 + outer loop + vertex -95.6175 82 26.1557 + vertex -95.9185 101 26.5333 + vertex -95.6175 101 26.1557 + endloop + endfacet + facet normal -0.781848 -0 -0.623469 + outer loop + vertex -95.9185 101 26.5333 + vertex -95.6175 82 26.1557 + vertex -95.9185 82 26.5333 + endloop + endfacet + facet normal -0.974925 0 -0.222535 + outer loop + vertex -95.51 82 25.685 + vertex -95.6175 101 26.1557 + vertex -95.51 101 25.685 + endloop + endfacet + facet normal -0.974925 -0 -0.222535 + outer loop + vertex -95.6175 101 26.1557 + vertex -95.51 82 25.685 + vertex -95.6175 82 26.1557 + endloop + endfacet + facet normal -0.974925 0 0.222535 + outer loop + vertex -95.6175 82 25.2143 + vertex -95.51 101 25.685 + vertex -95.6175 101 25.2143 + endloop + endfacet + facet normal -0.974925 0 0.222535 + outer loop + vertex -95.51 101 25.685 + vertex -95.6175 82 25.2143 + vertex -95.51 82 25.685 + endloop + endfacet + facet normal -0.781848 0 0.623469 + outer loop + vertex -95.9185 82 24.8367 + vertex -95.6175 101 25.2143 + vertex -95.9185 101 24.8367 + endloop + endfacet + facet normal -0.781848 0 0.623469 + outer loop + vertex -95.6175 101 25.2143 + vertex -95.9185 82 24.8367 + vertex -95.6175 82 25.2143 + endloop + endfacet + facet normal -0.433867 0 0.900977 + outer loop + vertex -96.3536 101 24.6272 + vertex -95.9185 82 24.8367 + vertex -95.9185 101 24.8367 + endloop + endfacet + facet normal -0.433867 0 0.900977 + outer loop + vertex -95.9185 82 24.8367 + vertex -96.3536 101 24.6272 + vertex -96.3536 82 24.6272 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -96.7696 101 24.6272 + vertex -96.3536 82 24.6272 + vertex -96.3536 101 24.6272 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -96.3536 82 24.6272 + vertex -96.7696 101 24.6272 + vertex -96.7696 82 24.6272 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 96.8872 -82 24.3942 + vertex 96.605 -82 24.344 + vertex 96.605 -82 24.368 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 106.139 -82 26.2927 + vertex 106.523 -82 25.9943 + vertex 106.146 -82 26.04 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 107.009 -82 25.9631 + vertex 106.523 -82 25.9943 + vertex 106.615 -82 26.235 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 107.009 -82 25.9631 + vertex 106.816 -82 25.7924 + vertex 106.523 -82 25.9943 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 107.231 -82 25.5393 + vertex 106.816 -82 25.7924 + vertex 107.009 -82 25.9631 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 107.231 -82 25.5393 + vertex 106.981 -82 25.4777 + vertex 106.816 -82 25.7924 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 107.231 -82 25.5393 + vertex 107 -82 24.13 + vertex 106.981 -82 25.4777 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 107.231 -82 25.5393 + vertex 107 -82 22.13 + vertex 107 -82 24.13 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 107 -82 22.13 + vertex 107 -82 22.1 + vertex 106.981 -82 22.13 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 107.231 -82 25.5393 + vertex 107 -82 22.1 + vertex 107 -82 22.13 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex 107.231 -82 19.0607 + vertex 107 -82 22.1 + vertex 107.231 -82 25.5393 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 107 -82 20.5 + vertex 106.981 -82 19.1223 + vertex 106.981 -82 20.5 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 107 -82 22.1 + vertex 107.231 -82 19.0607 + vertex 107 -82 20.5 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 107 -82 20.5 + vertex 107.231 -82 19.0607 + vertex 106.981 -82 19.1223 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 107.231 -82 19.0607 + vertex 106.816 -82 18.8076 + vertex 106.981 -82 19.1223 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex 107.009 -82 18.6369 + vertex 106.816 -82 18.8076 + vertex 107.231 -82 19.0607 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 107.009 -82 18.6369 + vertex 106.523 -82 18.6057 + vertex 106.816 -82 18.8076 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex 106.615 -82 18.365 + vertex 106.523 -82 18.6057 + vertex 107.009 -82 18.6369 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 106.139 -82 18.3073 + vertex 106.523 -82 18.6057 + vertex 106.615 -82 18.365 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex 106.523 -82 25.9943 + vertex 106.139 -82 26.2927 + vertex 106.615 -82 26.235 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 106.146 -82 26.04 + vertex 97.5295 -82 24.7623 + vertex 106.139 -82 26.2927 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 96.9798 -82 24.4107 + vertex 97.5295 -82 24.7623 + vertex 106.146 -82 26.04 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 97.5295 -82 24.7623 + vertex 96.9798 -82 24.4107 + vertex 96.8755 -82 24.646 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex 96.605 -82 24.368 + vertex 96.3536 -82 24.6272 + vertex 96.7696 -82 24.6272 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex 96.8872 -82 24.3942 + vertex 96.8755 -82 24.646 + vertex 96.9798 -82 24.4107 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 96.8755 -82 24.646 + vertex 96.8872 -82 24.3942 + vertex 96.7696 -82 24.6272 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 96.8872 -82 24.3942 + vertex 96.9798 -82 24.4107 + vertex 96.9603 -82 24.401 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 96.605 -82 24.368 + vertex 96.7696 -82 24.6272 + vertex 96.8872 -82 24.3942 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 96.3536 -82 24.6272 + vertex 96.605 -82 24.368 + vertex 96.4718 -82 24.3557 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 96.3536 -82 24.6272 + vertex 96.4718 -82 24.3557 + vertex 96 -82 24.49 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 96.9603 -82 26.969 + vertex 97.2715 -82 26.5333 + vertex 96.8364 -82 26.7428 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 97.73 -82 26.3878 + vertex 97.2715 -82 26.5333 + vertex 97.3995 -82 26.7503 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 97.73 -82 26.3878 + vertex 97.5725 -82 26.1557 + vertex 97.2715 -82 26.5333 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 97.9073 -82 25.9303 + vertex 97.5725 -82 26.1557 + vertex 97.73 -82 26.3878 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 97.9073 -82 25.9303 + vertex 97.68 -82 25.685 + vertex 97.5725 -82 26.1557 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex 97.9073 -82 25.4397 + vertex 97.68 -82 25.685 + vertex 97.9073 -82 25.9303 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 97.9073 -82 25.4397 + vertex 97.5725 -82 25.2143 + vertex 97.68 -82 25.685 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex 97.73 -82 24.9822 + vertex 97.5725 -82 25.2143 + vertex 97.9073 -82 25.4397 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 97.5295 -82 24.7623 + vertex 97.5725 -82 25.2143 + vertex 97.73 -82 24.9822 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 97.5725 -82 25.2143 + vertex 97.5295 -82 24.7623 + vertex 97.2715 -82 24.8367 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 97.2715 -82 24.8367 + vertex 97.5295 -82 24.7623 + vertex 96.8755 -82 24.646 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex 96.8364 -82 26.7428 + vertex 96.4718 -82 27.0143 + vertex 96.9603 -82 26.969 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex 97.2715 -82 26.5333 + vertex 96.9603 -82 26.969 + vertex 97.3995 -82 26.7503 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 96.4718 -82 27.0143 + vertex 96.8364 -82 26.7428 + vertex 96.3536 -82 26.7428 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 96.4718 -82 27.0143 + vertex 96.3536 -82 26.7428 + vertex 96 -82 26.88 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 95.9185 -82 26.5333 + vertex 96 -82 26.88 + vertex 96.3536 -82 26.7428 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 96 -82 26.88 + vertex 95.9185 -82 26.5333 + vertex 95.6084 -82 26.5844 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex 95.6175 -82 26.1557 + vertex 95.6084 -82 26.5844 + vertex 95.9185 -82 26.5333 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 95.6084 -82 26.5844 + vertex 95.6175 -82 26.1557 + vertex 95.3502 -82 26.1673 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex 95.51 -82 25.685 + vertex 95.3502 -82 26.1673 + vertex 95.6175 -82 26.1557 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 95.51 -82 25.685 + vertex 95.26 -82 25.685 + vertex 95.3502 -82 26.1673 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 95.3502 -82 25.2027 + vertex 95.51 -82 25.685 + vertex 95.6175 -82 25.2143 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 95.51 -82 25.685 + vertex 95.3502 -82 25.2027 + vertex 95.26 -82 25.685 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 95.6084 -82 24.7856 + vertex 95.6175 -82 25.2143 + vertex 95.9185 -82 24.8367 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 95.6175 -82 25.2143 + vertex 95.6084 -82 24.7856 + vertex 95.3502 -82 25.2027 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex 96 -82 24.49 + vertex 95.9185 -82 24.8367 + vertex 96.3536 -82 24.6272 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 95.9185 -82 24.8367 + vertex 96 -82 24.49 + vertex 95.6084 -82 24.7856 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 106.981 -82 25.4777 + vertex 107 -82 24.13 + vertex 106.981 -82 24.13 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 106.981 -82 22.13 + vertex 107 -82 22.1 + vertex 106.981 -82 22.1 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 96.605 -82 20.256 + vertex 96.8872 -82 20.2058 + vertex 96.605 -82 20.232 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 96.9798 -82 20.1893 + vertex 96.8872 -82 20.2058 + vertex 96.9603 -82 20.199 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 96.8755 -82 19.954 + vertex 96.8872 -82 20.2058 + vertex 96.9798 -82 20.1893 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 96.8872 -82 20.2058 + vertex 96.7696 -82 19.9728 + vertex 96.605 -82 20.232 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 96.3536 -82 19.9728 + vertex 96.605 -82 20.232 + vertex 96.7696 -82 19.9728 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 96.605 -82 20.232 + vertex 96.3536 -82 19.9728 + vertex 96.4718 -82 20.2443 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 96.8872 -82 20.2058 + vertex 96.8755 -82 19.954 + vertex 96.7696 -82 19.9728 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex 97.2715 -82 19.7633 + vertex 96.9798 -82 20.1893 + vertex 97.5295 -82 19.8377 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 106.146 -82 18.56 + vertex 97.5295 -82 19.8377 + vertex 96.9798 -82 20.1893 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 106.523 -82 18.6057 + vertex 106.139 -82 18.3073 + vertex 106.146 -82 18.56 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 106.146 -82 18.56 + vertex 106.139 -82 18.3073 + vertex 97.5295 -82 19.8377 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 96.4718 -82 20.2443 + vertex 96.3536 -82 19.9728 + vertex 96 -82 20.11 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 95.9185 -82 19.7633 + vertex 96 -82 20.11 + vertex 96.3536 -82 19.9728 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 96 -82 20.11 + vertex 95.9185 -82 19.7633 + vertex 95.6084 -82 19.8144 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex 95.6175 -82 19.3857 + vertex 95.6084 -82 19.8144 + vertex 95.9185 -82 19.7633 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 95.6084 -82 19.8144 + vertex 95.6175 -82 19.3857 + vertex 95.3502 -82 19.3973 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex 95.51 -82 18.915 + vertex 95.3502 -82 19.3973 + vertex 95.6175 -82 19.3857 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 95.51 -82 18.915 + vertex 95.26 -82 18.915 + vertex 95.3502 -82 19.3973 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 95.3502 -82 18.4327 + vertex 95.51 -82 18.915 + vertex 95.6175 -82 18.4443 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 95.51 -82 18.915 + vertex 95.3502 -82 18.4327 + vertex 95.26 -82 18.915 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 95.6084 -82 18.0156 + vertex 95.6175 -82 18.4443 + vertex 95.9185 -82 18.0667 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 95.6175 -82 18.4443 + vertex 95.6084 -82 18.0156 + vertex 95.3502 -82 18.4327 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex 96 -82 17.72 + vertex 95.9185 -82 18.0667 + vertex 96.3536 -82 17.8572 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 95.9185 -82 18.0667 + vertex 96 -82 17.72 + vertex 95.6084 -82 18.0156 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 96.8364 -82 17.8572 + vertex 96 -82 17.72 + vertex 96.3536 -82 17.8572 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 96.4718 -82 17.5857 + vertex 96.8364 -82 17.8572 + vertex 96.9603 -82 17.631 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 96.8364 -82 17.8572 + vertex 96.4718 -82 17.5857 + vertex 96 -82 17.72 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 96.9798 -82 20.1893 + vertex 97.2715 -82 19.7633 + vertex 96.8755 -82 19.954 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex 97.5725 -82 19.3857 + vertex 97.5295 -82 19.8377 + vertex 97.73 -82 19.6178 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 97.5295 -82 19.8377 + vertex 97.5725 -82 19.3857 + vertex 97.2715 -82 19.7633 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 97.9073 -82 19.1603 + vertex 97.5725 -82 19.3857 + vertex 97.73 -82 19.6178 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 97.9073 -82 19.1603 + vertex 97.68 -82 18.915 + vertex 97.5725 -82 19.3857 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex 97.9073 -82 18.6697 + vertex 97.68 -82 18.915 + vertex 97.9073 -82 19.1603 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 97.9073 -82 18.6697 + vertex 97.5725 -82 18.4443 + vertex 97.68 -82 18.915 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex 97.73 -82 18.2122 + vertex 97.5725 -82 18.4443 + vertex 97.9073 -82 18.6697 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 97.73 -82 18.2122 + vertex 97.2715 -82 18.0667 + vertex 97.5725 -82 18.4443 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex 97.3995 -82 17.8497 + vertex 97.2715 -82 18.0667 + vertex 97.73 -82 18.2122 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 97.2715 -82 18.0667 + vertex 96.9603 -82 17.631 + vertex 96.8364 -82 17.8572 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex 96.9603 -82 17.631 + vertex 97.2715 -82 18.0667 + vertex 97.3995 -82 17.8497 + endloop + endfacet + facet normal -0.175007 0 0.984567 + outer loop + vertex 97.5295 -82 24.7623 + vertex 106.139 -101 26.2927 + vertex 106.139 -82 26.2927 + endloop + endfacet + facet normal -0.175007 0 0.984567 + outer loop + vertex 106.139 -101 26.2927 + vertex 97.5295 -82 24.7623 + vertex 97.5295 -101 24.7623 + endloop + endfacet + facet normal -0.175 0 0.984568 + outer loop + vertex 96.7696 -82 24.6272 + vertex 96.8755 -101 24.646 + vertex 96.8755 -82 24.646 + endloop + endfacet + facet normal -0.175 0 0.984568 + outer loop + vertex 96.8755 -101 24.646 + vertex 96.7696 -82 24.6272 + vertex 96.7696 -101 24.6272 + endloop + endfacet + facet normal 0.120538 0 0.992709 + outer loop + vertex 106.139 -82 26.2927 + vertex 106.615 -101 26.235 + vertex 106.615 -82 26.235 + endloop + endfacet + facet normal 0.120538 0 0.992709 + outer loop + vertex 106.615 -101 26.235 + vertex 106.139 -82 26.2927 + vertex 106.139 -101 26.2927 + endloop + endfacet + facet normal 0.568069 0 0.822981 + outer loop + vertex 106.615 -82 26.235 + vertex 107.009 -101 25.9631 + vertex 107.009 -82 25.9631 + endloop + endfacet + facet normal 0.568069 0 0.822981 + outer loop + vertex 107.009 -101 25.9631 + vertex 106.615 -82 26.235 + vertex 106.615 -101 26.235 + endloop + endfacet + facet normal 0.885462 -0 0.464712 + outer loop + vertex 107.009 -101 25.9631 + vertex 107.231 -82 25.5393 + vertex 107.009 -82 25.9631 + endloop + endfacet + facet normal 0.885462 0 0.464712 + outer loop + vertex 107.231 -82 25.5393 + vertex 107.009 -101 25.9631 + vertex 107.231 -101 25.5393 + endloop + endfacet + facet normal 1 -0 0 + outer loop + vertex 107.231 -101 25.5393 + vertex 107.231 -82 19.0607 + vertex 107.231 -82 25.5393 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 107.231 -82 19.0607 + vertex 107.231 -101 25.5393 + vertex 107.231 -101 19.0607 + endloop + endfacet + facet normal 0.885462 0 -0.464712 + outer loop + vertex 107.231 -101 19.0607 + vertex 107.009 -82 18.6369 + vertex 107.231 -82 19.0607 + endloop + endfacet + facet normal 0.885462 0 -0.464712 + outer loop + vertex 107.009 -82 18.6369 + vertex 107.231 -101 19.0607 + vertex 107.009 -101 18.6369 + endloop + endfacet + facet normal 0.568069 0 -0.822981 + outer loop + vertex 106.615 -101 18.365 + vertex 107.009 -82 18.6369 + vertex 107.009 -101 18.6369 + endloop + endfacet + facet normal 0.568069 0 -0.822981 + outer loop + vertex 107.009 -82 18.6369 + vertex 106.615 -101 18.365 + vertex 106.615 -82 18.365 + endloop + endfacet + facet normal 0.120538 0 -0.992709 + outer loop + vertex 106.139 -101 18.3073 + vertex 106.615 -82 18.365 + vertex 106.615 -101 18.365 + endloop + endfacet + facet normal 0.120538 0 -0.992709 + outer loop + vertex 106.615 -82 18.365 + vertex 106.139 -101 18.3073 + vertex 106.139 -82 18.3073 + endloop + endfacet + facet normal -0.175008 0 -0.984567 + outer loop + vertex 97.5295 -101 19.8377 + vertex 106.139 -82 18.3073 + vertex 106.139 -101 18.3073 + endloop + endfacet + facet normal -0.175008 0 -0.984567 + outer loop + vertex 106.139 -82 18.3073 + vertex 97.5295 -101 19.8377 + vertex 97.5295 -82 19.8377 + endloop + endfacet + facet normal -0.175 0 -0.984568 + outer loop + vertex 96.7696 -101 19.9728 + vertex 96.8755 -82 19.954 + vertex 96.8755 -101 19.954 + endloop + endfacet + facet normal -0.175 0 -0.984568 + outer loop + vertex 96.8755 -82 19.954 + vertex 96.7696 -101 19.9728 + vertex 96.7696 -82 19.9728 + endloop + endfacet + facet normal -0.568073 0 0.822978 + outer loop + vertex 106.523 -82 18.6057 + vertex 106.816 -101 18.8076 + vertex 106.816 -82 18.8076 + endloop + endfacet + facet normal -0.568073 0 0.822978 + outer loop + vertex 106.816 -101 18.8076 + vertex 106.523 -82 18.6057 + vertex 106.523 -101 18.6057 + endloop + endfacet + facet normal -0.88547 0 0.464697 + outer loop + vertex 106.816 -101 18.8076 + vertex 106.981 -82 19.1223 + vertex 106.816 -82 18.8076 + endloop + endfacet + facet normal -0.88547 0 0.464697 + outer loop + vertex 106.981 -82 19.1223 + vertex 106.816 -101 18.8076 + vertex 106.981 -101 19.1223 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex 106.981 -101 24.13 + vertex 106.981 -82 25.4777 + vertex 106.981 -82 24.13 + endloop + endfacet + facet normal -1 -0 0 + outer loop + vertex 106.981 -82 25.4777 + vertex 106.981 -101 24.13 + vertex 106.981 -101 25.4777 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex 106.981 -101 19.1223 + vertex 106.981 -82 20.5 + vertex 106.981 -82 19.1223 + endloop + endfacet + facet normal -1 -0 0 + outer loop + vertex 106.981 -82 20.5 + vertex 106.981 -101 19.1223 + vertex 106.981 -101 20.5 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex 106.981 -101 22.1 + vertex 106.981 -82 22.13 + vertex 106.981 -82 22.1 + endloop + endfacet + facet normal -1 -0 0 + outer loop + vertex 106.981 -82 22.13 + vertex 106.981 -101 22.1 + vertex 106.981 -101 22.13 + endloop + endfacet + facet normal -0.88547 0 -0.464697 + outer loop + vertex 106.981 -101 25.4777 + vertex 106.816 -82 25.7924 + vertex 106.981 -82 25.4777 + endloop + endfacet + facet normal -0.88547 -0 -0.464697 + outer loop + vertex 106.816 -82 25.7924 + vertex 106.981 -101 25.4777 + vertex 106.816 -101 25.7924 + endloop + endfacet + facet normal -0.568073 0 -0.822978 + outer loop + vertex 106.523 -101 25.9943 + vertex 106.816 -82 25.7924 + vertex 106.816 -101 25.7924 + endloop + endfacet + facet normal -0.568073 0 -0.822978 + outer loop + vertex 106.816 -82 25.7924 + vertex 106.523 -101 25.9943 + vertex 106.523 -82 25.9943 + endloop + endfacet + facet normal -0.120522 0 -0.992711 + outer loop + vertex 106.146 -101 26.04 + vertex 106.523 -82 25.9943 + vertex 106.523 -101 25.9943 + endloop + endfacet + facet normal -0.120522 0 -0.992711 + outer loop + vertex 106.523 -82 25.9943 + vertex 106.146 -101 26.04 + vertex 106.146 -82 26.04 + endloop + endfacet + facet normal 0.175007 0 -0.984567 + outer loop + vertex 96.9798 -101 24.4107 + vertex 106.146 -82 26.04 + vertex 106.146 -101 26.04 + endloop + endfacet + facet normal 0.175007 0 -0.984567 + outer loop + vertex 106.146 -82 26.04 + vertex 96.9798 -101 24.4107 + vertex 96.9798 -82 24.4107 + endloop + endfacet + facet normal 0.175007 0 -0.984567 + outer loop + vertex 96.605 -101 24.344 + vertex 96.8872 -82 24.3942 + vertex 96.8872 -101 24.3942 + endloop + endfacet + facet normal 0.175007 0 -0.984567 + outer loop + vertex 96.8872 -82 24.3942 + vertex 96.605 -101 24.344 + vertex 96.605 -82 24.344 + endloop + endfacet + facet normal 0.175007 0 0.984567 + outer loop + vertex 96.9798 -82 20.1893 + vertex 106.146 -101 18.56 + vertex 106.146 -82 18.56 + endloop + endfacet + facet normal 0.175007 0 0.984567 + outer loop + vertex 106.146 -101 18.56 + vertex 96.9798 -82 20.1893 + vertex 96.9798 -101 20.1893 + endloop + endfacet + facet normal 0.175007 0 0.984567 + outer loop + vertex 96.605 -82 20.256 + vertex 96.8872 -101 20.2058 + vertex 96.8872 -82 20.2058 + endloop + endfacet + facet normal 0.175007 0 0.984567 + outer loop + vertex 96.8872 -101 20.2058 + vertex 96.605 -82 20.256 + vertex 96.605 -101 20.256 + endloop + endfacet + facet normal -0.120522 0 0.992711 + outer loop + vertex 106.146 -82 18.56 + vertex 106.523 -101 18.6057 + vertex 106.523 -82 18.6057 + endloop + endfacet + facet normal -0.120522 0 0.992711 + outer loop + vertex 106.523 -101 18.6057 + vertex 106.146 -82 18.56 + vertex 106.146 -101 18.56 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex 96.605 -101 24.344 + vertex 96.605 -82 24.368 + vertex 96.605 -82 24.344 + endloop + endfacet + facet normal -1 -0 0 + outer loop + vertex 96.605 -82 24.368 + vertex 96.605 -101 24.344 + vertex 96.605 -101 24.368 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex 96.605 -101 20.232 + vertex 96.605 -82 20.256 + vertex 96.605 -82 20.232 + endloop + endfacet + facet normal -1 -0 0 + outer loop + vertex 96.605 -82 20.256 + vertex 96.605 -101 20.232 + vertex 96.605 -101 20.256 + endloop + endfacet + facet normal -0.602619 0 -0.798029 + outer loop + vertex 95.6084 -101 18.0156 + vertex 96 -82 17.72 + vertex 96 -101 17.72 + endloop + endfacet + facet normal -0.602619 0 -0.798029 + outer loop + vertex 96 -82 17.72 + vertex 95.6084 -101 18.0156 + vertex 95.6084 -82 18.0156 + endloop + endfacet + facet normal -0.850222 0 -0.526424 + outer loop + vertex 95.6084 -101 18.0156 + vertex 95.3502 -82 18.4327 + vertex 95.6084 -82 18.0156 + endloop + endfacet + facet normal -0.850222 -0 -0.526424 + outer loop + vertex 95.3502 -82 18.4327 + vertex 95.6084 -101 18.0156 + vertex 95.3502 -101 18.4327 + endloop + endfacet + facet normal -0.982973 0 -0.18375 + outer loop + vertex 95.3502 -101 18.4327 + vertex 95.26 -82 18.915 + vertex 95.3502 -82 18.4327 + endloop + endfacet + facet normal -0.982973 -0 -0.18375 + outer loop + vertex 95.26 -82 18.915 + vertex 95.3502 -101 18.4327 + vertex 95.26 -101 18.915 + endloop + endfacet + facet normal -0.982973 0 0.18375 + outer loop + vertex 95.26 -101 18.915 + vertex 95.3502 -82 19.3973 + vertex 95.26 -82 18.915 + endloop + endfacet + facet normal -0.982973 0 0.18375 + outer loop + vertex 95.3502 -82 19.3973 + vertex 95.26 -101 18.915 + vertex 95.3502 -101 19.3973 + endloop + endfacet + facet normal -0.850222 0 0.526424 + outer loop + vertex 95.3502 -101 19.3973 + vertex 95.6084 -82 19.8144 + vertex 95.3502 -82 19.3973 + endloop + endfacet + facet normal -0.850222 0 0.526424 + outer loop + vertex 95.6084 -82 19.8144 + vertex 95.3502 -101 19.3973 + vertex 95.6084 -101 19.8144 + endloop + endfacet + facet normal -0.602619 0 0.798029 + outer loop + vertex 95.6084 -82 19.8144 + vertex 96 -101 20.11 + vertex 96 -82 20.11 + endloop + endfacet + facet normal -0.602619 0 0.798029 + outer loop + vertex 96 -101 20.11 + vertex 95.6084 -82 19.8144 + vertex 95.6084 -101 19.8144 + endloop + endfacet + facet normal -0.273665 0 0.961825 + outer loop + vertex 96 -82 20.11 + vertex 96.4718 -101 20.2443 + vertex 96.4718 -82 20.2443 + endloop + endfacet + facet normal -0.273665 0 0.961825 + outer loop + vertex 96.4718 -101 20.2443 + vertex 96 -82 20.11 + vertex 96 -101 20.11 + endloop + endfacet + facet normal 0.0922792 0 0.995733 + outer loop + vertex 96.8872 -82 20.2058 + vertex 96.9603 -101 20.199 + vertex 96.9603 -82 20.199 + endloop + endfacet + facet normal 0.0922792 0 0.995733 + outer loop + vertex 96.9603 -101 20.199 + vertex 96.8872 -82 20.2058 + vertex 96.8872 -101 20.2058 + endloop + endfacet + facet normal 0.0922857 0 0.995733 + outer loop + vertex 96.4718 -82 20.2443 + vertex 96.605 -101 20.232 + vertex 96.605 -82 20.232 + endloop + endfacet + facet normal 0.0922857 0 0.995733 + outer loop + vertex 96.605 -101 20.232 + vertex 96.4718 -82 20.2443 + vertex 96.4718 -101 20.2443 + endloop + endfacet + facet normal 0.445737 0 0.895164 + outer loop + vertex 96.9603 -82 20.199 + vertex 96.9798 -101 20.1893 + vertex 96.9798 -82 20.1893 + endloop + endfacet + facet normal 0.445737 0 0.895164 + outer loop + vertex 96.9798 -101 20.1893 + vertex 96.9603 -82 20.199 + vertex 96.9603 -101 20.199 + endloop + endfacet + facet normal 0.739002 -0 0.673704 + outer loop + vertex 97.5295 -101 19.8377 + vertex 97.73 -82 19.6178 + vertex 97.5295 -82 19.8377 + endloop + endfacet + facet normal 0.739002 0 0.673704 + outer loop + vertex 97.73 -82 19.6178 + vertex 97.5295 -101 19.8377 + vertex 97.73 -101 19.6178 + endloop + endfacet + facet normal 0.932469 -0 0.36125 + outer loop + vertex 97.73 -101 19.6178 + vertex 97.9073 -82 19.1603 + vertex 97.73 -82 19.6178 + endloop + endfacet + facet normal 0.932469 0 0.36125 + outer loop + vertex 97.9073 -82 19.1603 + vertex 97.73 -101 19.6178 + vertex 97.9073 -101 19.1603 + endloop + endfacet + facet normal 1 -0 0 + outer loop + vertex 97.9073 -101 19.1603 + vertex 97.9073 -82 18.6697 + vertex 97.9073 -82 19.1603 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 97.9073 -82 18.6697 + vertex 97.9073 -101 19.1603 + vertex 97.9073 -101 18.6697 + endloop + endfacet + facet normal 0.932469 0 -0.36125 + outer loop + vertex 97.9073 -101 18.6697 + vertex 97.73 -82 18.2122 + vertex 97.9073 -82 18.6697 + endloop + endfacet + facet normal 0.932469 0 -0.36125 + outer loop + vertex 97.73 -82 18.2122 + vertex 97.9073 -101 18.6697 + vertex 97.73 -101 18.2122 + endloop + endfacet + facet normal 0.739009 0 -0.673695 + outer loop + vertex 97.73 -101 18.2122 + vertex 97.3995 -82 17.8497 + vertex 97.73 -82 18.2122 + endloop + endfacet + facet normal 0.739009 0 -0.673695 + outer loop + vertex 97.3995 -82 17.8497 + vertex 97.73 -101 18.2122 + vertex 97.3995 -101 17.8497 + endloop + endfacet + facet normal 0.445745 0 -0.89516 + outer loop + vertex 96.9603 -101 17.631 + vertex 97.3995 -82 17.8497 + vertex 97.3995 -101 17.8497 + endloop + endfacet + facet normal 0.445745 0 -0.89516 + outer loop + vertex 97.3995 -82 17.8497 + vertex 96.9603 -101 17.631 + vertex 96.9603 -82 17.631 + endloop + endfacet + facet normal 0.0922827 0 -0.995733 + outer loop + vertex 96.4718 -101 17.5857 + vertex 96.9603 -82 17.631 + vertex 96.9603 -101 17.631 + endloop + endfacet + facet normal 0.0922827 0 -0.995733 + outer loop + vertex 96.9603 -82 17.631 + vertex 96.4718 -101 17.5857 + vertex 96.4718 -82 17.5857 + endloop + endfacet + facet normal -0.273665 0 -0.961825 + outer loop + vertex 96 -101 17.72 + vertex 96.4718 -82 17.5857 + vertex 96.4718 -101 17.5857 + endloop + endfacet + facet normal -0.273665 0 -0.961825 + outer loop + vertex 96.4718 -82 17.5857 + vertex 96 -101 17.72 + vertex 96 -82 17.72 + endloop + endfacet + facet normal -0.433867 0 0.900977 + outer loop + vertex 96.8364 -82 17.8572 + vertex 97.2715 -101 18.0667 + vertex 97.2715 -82 18.0667 + endloop + endfacet + facet normal -0.433867 0 0.900977 + outer loop + vertex 97.2715 -101 18.0667 + vertex 96.8364 -82 17.8572 + vertex 96.8364 -101 17.8572 + endloop + endfacet + facet normal -0.781848 0 0.623469 + outer loop + vertex 97.2715 -101 18.0667 + vertex 97.5725 -82 18.4443 + vertex 97.2715 -82 18.0667 + endloop + endfacet + facet normal -0.781848 0 0.623469 + outer loop + vertex 97.5725 -82 18.4443 + vertex 97.2715 -101 18.0667 + vertex 97.5725 -101 18.4443 + endloop + endfacet + facet normal -0.974925 0 0.222535 + outer loop + vertex 97.5725 -101 18.4443 + vertex 97.68 -82 18.915 + vertex 97.5725 -82 18.4443 + endloop + endfacet + facet normal -0.974925 0 0.222535 + outer loop + vertex 97.68 -82 18.915 + vertex 97.5725 -101 18.4443 + vertex 97.68 -101 18.915 + endloop + endfacet + facet normal -0.974925 0 -0.222535 + outer loop + vertex 97.68 -101 18.915 + vertex 97.5725 -82 19.3857 + vertex 97.68 -82 18.915 + endloop + endfacet + facet normal -0.974925 -0 -0.222535 + outer loop + vertex 97.5725 -82 19.3857 + vertex 97.68 -101 18.915 + vertex 97.5725 -101 19.3857 + endloop + endfacet + facet normal -0.781848 0 -0.623469 + outer loop + vertex 97.5725 -101 19.3857 + vertex 97.2715 -82 19.7633 + vertex 97.5725 -82 19.3857 + endloop + endfacet + facet normal -0.781848 -0 -0.623469 + outer loop + vertex 97.2715 -82 19.7633 + vertex 97.5725 -101 19.3857 + vertex 97.2715 -101 19.7633 + endloop + endfacet + facet normal -0.433867 0 -0.900977 + outer loop + vertex 96.8755 -101 19.954 + vertex 97.2715 -82 19.7633 + vertex 97.2715 -101 19.7633 + endloop + endfacet + facet normal -0.433867 0 -0.900977 + outer loop + vertex 97.2715 -82 19.7633 + vertex 96.8755 -101 19.954 + vertex 96.8755 -82 19.954 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 96.3536 -101 19.9728 + vertex 96.7696 -82 19.9728 + vertex 96.7696 -101 19.9728 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 96.7696 -82 19.9728 + vertex 96.3536 -101 19.9728 + vertex 96.3536 -82 19.9728 + endloop + endfacet + facet normal 0.433867 0 -0.900977 + outer loop + vertex 95.9185 -101 19.7633 + vertex 96.3536 -82 19.9728 + vertex 96.3536 -101 19.9728 + endloop + endfacet + facet normal 0.433867 0 -0.900977 + outer loop + vertex 96.3536 -82 19.9728 + vertex 95.9185 -101 19.7633 + vertex 95.9185 -82 19.7633 + endloop + endfacet + facet normal 0.781848 0 -0.623469 + outer loop + vertex 95.9185 -101 19.7633 + vertex 95.6175 -82 19.3857 + vertex 95.9185 -82 19.7633 + endloop + endfacet + facet normal 0.781848 0 -0.623469 + outer loop + vertex 95.6175 -82 19.3857 + vertex 95.9185 -101 19.7633 + vertex 95.6175 -101 19.3857 + endloop + endfacet + facet normal 0.974925 0 -0.222535 + outer loop + vertex 95.6175 -101 19.3857 + vertex 95.51 -82 18.915 + vertex 95.6175 -82 19.3857 + endloop + endfacet + facet normal 0.974925 0 -0.222535 + outer loop + vertex 95.51 -82 18.915 + vertex 95.6175 -101 19.3857 + vertex 95.51 -101 18.915 + endloop + endfacet + facet normal 0.974925 -0 0.222535 + outer loop + vertex 95.51 -101 18.915 + vertex 95.6175 -82 18.4443 + vertex 95.51 -82 18.915 + endloop + endfacet + facet normal 0.974925 0 0.222535 + outer loop + vertex 95.6175 -82 18.4443 + vertex 95.51 -101 18.915 + vertex 95.6175 -101 18.4443 + endloop + endfacet + facet normal 0.781848 -0 0.623469 + outer loop + vertex 95.6175 -101 18.4443 + vertex 95.9185 -82 18.0667 + vertex 95.6175 -82 18.4443 + endloop + endfacet + facet normal 0.781848 0 0.623469 + outer loop + vertex 95.9185 -82 18.0667 + vertex 95.6175 -101 18.4443 + vertex 95.9185 -101 18.0667 + endloop + endfacet + facet normal 0.433867 0 0.900977 + outer loop + vertex 95.9185 -82 18.0667 + vertex 96.3536 -101 17.8572 + vertex 96.3536 -82 17.8572 + endloop + endfacet + facet normal 0.433867 0 0.900977 + outer loop + vertex 96.3536 -101 17.8572 + vertex 95.9185 -82 18.0667 + vertex 95.9185 -101 18.0667 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex 96.3536 -82 17.8572 + vertex 96.8364 -101 17.8572 + vertex 96.8364 -82 17.8572 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 96.8364 -101 17.8572 + vertex 96.3536 -82 17.8572 + vertex 96.3536 -101 17.8572 + endloop + endfacet + facet normal -0.602619 0 -0.798029 + outer loop + vertex 95.6084 -101 24.7856 + vertex 96 -82 24.49 + vertex 96 -101 24.49 + endloop + endfacet + facet normal -0.602619 0 -0.798029 + outer loop + vertex 96 -82 24.49 + vertex 95.6084 -101 24.7856 + vertex 95.6084 -82 24.7856 + endloop + endfacet + facet normal -0.850222 0 -0.526424 + outer loop + vertex 95.6084 -101 24.7856 + vertex 95.3502 -82 25.2027 + vertex 95.6084 -82 24.7856 + endloop + endfacet + facet normal -0.850222 -0 -0.526424 + outer loop + vertex 95.3502 -82 25.2027 + vertex 95.6084 -101 24.7856 + vertex 95.3502 -101 25.2027 + endloop + endfacet + facet normal -0.982973 0 -0.18375 + outer loop + vertex 95.3502 -101 25.2027 + vertex 95.26 -82 25.685 + vertex 95.3502 -82 25.2027 + endloop + endfacet + facet normal -0.982973 -0 -0.18375 + outer loop + vertex 95.26 -82 25.685 + vertex 95.3502 -101 25.2027 + vertex 95.26 -101 25.685 + endloop + endfacet + facet normal -0.982973 0 0.18375 + outer loop + vertex 95.26 -101 25.685 + vertex 95.3502 -82 26.1673 + vertex 95.26 -82 25.685 + endloop + endfacet + facet normal -0.982973 0 0.18375 + outer loop + vertex 95.3502 -82 26.1673 + vertex 95.26 -101 25.685 + vertex 95.3502 -101 26.1673 + endloop + endfacet + facet normal -0.850222 0 0.526424 + outer loop + vertex 95.3502 -101 26.1673 + vertex 95.6084 -82 26.5844 + vertex 95.3502 -82 26.1673 + endloop + endfacet + facet normal -0.850222 0 0.526424 + outer loop + vertex 95.6084 -82 26.5844 + vertex 95.3502 -101 26.1673 + vertex 95.6084 -101 26.5844 + endloop + endfacet + facet normal -0.602619 0 0.798029 + outer loop + vertex 95.6084 -82 26.5844 + vertex 96 -101 26.88 + vertex 96 -82 26.88 + endloop + endfacet + facet normal -0.602619 0 0.798029 + outer loop + vertex 96 -101 26.88 + vertex 95.6084 -82 26.5844 + vertex 95.6084 -101 26.5844 + endloop + endfacet + facet normal -0.273665 0 0.961825 + outer loop + vertex 96 -82 26.88 + vertex 96.4718 -101 27.0143 + vertex 96.4718 -82 27.0143 + endloop + endfacet + facet normal -0.273665 0 0.961825 + outer loop + vertex 96.4718 -101 27.0143 + vertex 96 -82 26.88 + vertex 96 -101 26.88 + endloop + endfacet + facet normal 0.0922827 0 0.995733 + outer loop + vertex 96.4718 -82 27.0143 + vertex 96.9603 -101 26.969 + vertex 96.9603 -82 26.969 + endloop + endfacet + facet normal 0.0922827 0 0.995733 + outer loop + vertex 96.9603 -101 26.969 + vertex 96.4718 -82 27.0143 + vertex 96.4718 -101 27.0143 + endloop + endfacet + facet normal 0.445745 0 0.89516 + outer loop + vertex 96.9603 -82 26.969 + vertex 97.3995 -101 26.7503 + vertex 97.3995 -82 26.7503 + endloop + endfacet + facet normal 0.445745 0 0.89516 + outer loop + vertex 97.3995 -101 26.7503 + vertex 96.9603 -82 26.969 + vertex 96.9603 -101 26.969 + endloop + endfacet + facet normal 0.739009 -0 0.673695 + outer loop + vertex 97.3995 -101 26.7503 + vertex 97.73 -82 26.3878 + vertex 97.3995 -82 26.7503 + endloop + endfacet + facet normal 0.739009 0 0.673695 + outer loop + vertex 97.73 -82 26.3878 + vertex 97.3995 -101 26.7503 + vertex 97.73 -101 26.3878 + endloop + endfacet + facet normal 0.932469 -0 0.36125 + outer loop + vertex 97.73 -101 26.3878 + vertex 97.9073 -82 25.9303 + vertex 97.73 -82 26.3878 + endloop + endfacet + facet normal 0.932469 0 0.36125 + outer loop + vertex 97.9073 -82 25.9303 + vertex 97.73 -101 26.3878 + vertex 97.9073 -101 25.9303 + endloop + endfacet + facet normal 1 -0 0 + outer loop + vertex 97.9073 -101 25.9303 + vertex 97.9073 -82 25.4397 + vertex 97.9073 -82 25.9303 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 97.9073 -82 25.4397 + vertex 97.9073 -101 25.9303 + vertex 97.9073 -101 25.4397 + endloop + endfacet + facet normal 0.932469 0 -0.36125 + outer loop + vertex 97.9073 -101 25.4397 + vertex 97.73 -82 24.9822 + vertex 97.9073 -82 25.4397 + endloop + endfacet + facet normal 0.932469 0 -0.36125 + outer loop + vertex 97.73 -82 24.9822 + vertex 97.9073 -101 25.4397 + vertex 97.73 -101 24.9822 + endloop + endfacet + facet normal 0.739002 0 -0.673704 + outer loop + vertex 97.73 -101 24.9822 + vertex 97.5295 -82 24.7623 + vertex 97.73 -82 24.9822 + endloop + endfacet + facet normal 0.739002 0 -0.673704 + outer loop + vertex 97.5295 -82 24.7623 + vertex 97.73 -101 24.9822 + vertex 97.5295 -101 24.7623 + endloop + endfacet + facet normal 0.445737 0 -0.895164 + outer loop + vertex 96.9603 -101 24.401 + vertex 96.9798 -82 24.4107 + vertex 96.9798 -101 24.4107 + endloop + endfacet + facet normal 0.445737 0 -0.895164 + outer loop + vertex 96.9798 -82 24.4107 + vertex 96.9603 -101 24.401 + vertex 96.9603 -82 24.401 + endloop + endfacet + facet normal 0.0922857 0 -0.995733 + outer loop + vertex 96.4718 -101 24.3557 + vertex 96.605 -82 24.368 + vertex 96.605 -101 24.368 + endloop + endfacet + facet normal 0.0922857 0 -0.995733 + outer loop + vertex 96.605 -82 24.368 + vertex 96.4718 -101 24.3557 + vertex 96.4718 -82 24.3557 + endloop + endfacet + facet normal 0.0922792 0 -0.995733 + outer loop + vertex 96.8872 -101 24.3942 + vertex 96.9603 -82 24.401 + vertex 96.9603 -101 24.401 + endloop + endfacet + facet normal 0.0922792 0 -0.995733 + outer loop + vertex 96.9603 -82 24.401 + vertex 96.8872 -101 24.3942 + vertex 96.8872 -82 24.3942 + endloop + endfacet + facet normal -0.273665 0 -0.961825 + outer loop + vertex 96 -101 24.49 + vertex 96.4718 -82 24.3557 + vertex 96.4718 -101 24.3557 + endloop + endfacet + facet normal -0.273665 0 -0.961825 + outer loop + vertex 96.4718 -82 24.3557 + vertex 96 -101 24.49 + vertex 96 -82 24.49 + endloop + endfacet + facet normal -0.433867 0 0.900977 + outer loop + vertex 96.8755 -82 24.646 + vertex 97.2715 -101 24.8367 + vertex 97.2715 -82 24.8367 + endloop + endfacet + facet normal -0.433867 0 0.900977 + outer loop + vertex 97.2715 -101 24.8367 + vertex 96.8755 -82 24.646 + vertex 96.8755 -101 24.646 + endloop + endfacet + facet normal -0.781848 0 0.623469 + outer loop + vertex 97.2715 -101 24.8367 + vertex 97.5725 -82 25.2143 + vertex 97.2715 -82 24.8367 + endloop + endfacet + facet normal -0.781848 0 0.623469 + outer loop + vertex 97.5725 -82 25.2143 + vertex 97.2715 -101 24.8367 + vertex 97.5725 -101 25.2143 + endloop + endfacet + facet normal -0.974925 0 0.222535 + outer loop + vertex 97.5725 -101 25.2143 + vertex 97.68 -82 25.685 + vertex 97.5725 -82 25.2143 + endloop + endfacet + facet normal -0.974925 0 0.222535 + outer loop + vertex 97.68 -82 25.685 + vertex 97.5725 -101 25.2143 + vertex 97.68 -101 25.685 + endloop + endfacet + facet normal -0.974925 0 -0.222535 + outer loop + vertex 97.68 -101 25.685 + vertex 97.5725 -82 26.1557 + vertex 97.68 -82 25.685 + endloop + endfacet + facet normal -0.974925 -0 -0.222535 + outer loop + vertex 97.5725 -82 26.1557 + vertex 97.68 -101 25.685 + vertex 97.5725 -101 26.1557 + endloop + endfacet + facet normal -0.781848 0 -0.623469 + outer loop + vertex 97.5725 -101 26.1557 + vertex 97.2715 -82 26.5333 + vertex 97.5725 -82 26.1557 + endloop + endfacet + facet normal -0.781848 -0 -0.623469 + outer loop + vertex 97.2715 -82 26.5333 + vertex 97.5725 -101 26.1557 + vertex 97.2715 -101 26.5333 + endloop + endfacet + facet normal -0.433867 0 -0.900977 + outer loop + vertex 96.8364 -101 26.7428 + vertex 97.2715 -82 26.5333 + vertex 97.2715 -101 26.5333 + endloop + endfacet + facet normal -0.433867 0 -0.900977 + outer loop + vertex 97.2715 -82 26.5333 + vertex 96.8364 -101 26.7428 + vertex 96.8364 -82 26.7428 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 96.3536 -101 26.7428 + vertex 96.8364 -82 26.7428 + vertex 96.8364 -101 26.7428 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 96.8364 -82 26.7428 + vertex 96.3536 -101 26.7428 + vertex 96.3536 -82 26.7428 + endloop + endfacet + facet normal 0.433867 0 -0.900977 + outer loop + vertex 95.9185 -101 26.5333 + vertex 96.3536 -82 26.7428 + vertex 96.3536 -101 26.7428 + endloop + endfacet + facet normal 0.433867 0 -0.900977 + outer loop + vertex 96.3536 -82 26.7428 + vertex 95.9185 -101 26.5333 + vertex 95.9185 -82 26.5333 + endloop + endfacet + facet normal 0.781848 0 -0.623469 + outer loop + vertex 95.9185 -101 26.5333 + vertex 95.6175 -82 26.1557 + vertex 95.9185 -82 26.5333 + endloop + endfacet + facet normal 0.781848 0 -0.623469 + outer loop + vertex 95.6175 -82 26.1557 + vertex 95.9185 -101 26.5333 + vertex 95.6175 -101 26.1557 + endloop + endfacet + facet normal 0.974925 0 -0.222535 + outer loop + vertex 95.6175 -101 26.1557 + vertex 95.51 -82 25.685 + vertex 95.6175 -82 26.1557 + endloop + endfacet + facet normal 0.974925 0 -0.222535 + outer loop + vertex 95.51 -82 25.685 + vertex 95.6175 -101 26.1557 + vertex 95.51 -101 25.685 + endloop + endfacet + facet normal 0.974925 -0 0.222535 + outer loop + vertex 95.51 -101 25.685 + vertex 95.6175 -82 25.2143 + vertex 95.51 -82 25.685 + endloop + endfacet + facet normal 0.974925 0 0.222535 + outer loop + vertex 95.6175 -82 25.2143 + vertex 95.51 -101 25.685 + vertex 95.6175 -101 25.2143 + endloop + endfacet + facet normal 0.781848 -0 0.623469 + outer loop + vertex 95.6175 -101 25.2143 + vertex 95.9185 -82 24.8367 + vertex 95.6175 -82 25.2143 + endloop + endfacet + facet normal 0.781848 0 0.623469 + outer loop + vertex 95.9185 -82 24.8367 + vertex 95.6175 -101 25.2143 + vertex 95.9185 -101 24.8367 + endloop + endfacet + facet normal 0.433867 0 0.900977 + outer loop + vertex 95.9185 -82 24.8367 + vertex 96.3536 -101 24.6272 + vertex 96.3536 -82 24.6272 + endloop + endfacet + facet normal 0.433867 0 0.900977 + outer loop + vertex 96.3536 -101 24.6272 + vertex 95.9185 -82 24.8367 + vertex 95.9185 -101 24.8367 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex 96.3536 -82 24.6272 + vertex 96.7696 -101 24.6272 + vertex 96.7696 -82 24.6272 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 96.7696 -101 24.6272 + vertex 96.3536 -82 24.6272 + vertex 96.3536 -101 24.6272 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 106.981 82 20.5 + vertex 106.981 82 19.1223 + vertex 107 82 20.5 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 106.981 82 22.13 + vertex 106.981 82 22.1 + vertex 107 82 22.13 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 96.3536 82 26.7428 + vertex 96.4718 82 27.0143 + vertex 96 82 26.88 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 96.8364 82 26.7428 + vertex 96.4718 82 27.0143 + vertex 96.3536 82 26.7428 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 96.4718 82 27.0143 + vertex 96.8364 82 26.7428 + vertex 96.9603 82 26.969 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 95.9185 82 26.5333 + vertex 96 82 26.88 + vertex 95.6084 82 26.5844 + endloop + endfacet + facet normal 0 -1 -0 + outer loop + vertex 96 82 26.88 + vertex 95.9185 82 26.5333 + vertex 96.3536 82 26.7428 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 95.6175 82 26.1557 + vertex 95.6084 82 26.5844 + vertex 95.3502 82 26.1673 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 95.6084 82 26.5844 + vertex 95.6175 82 26.1557 + vertex 95.9185 82 26.5333 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 95.51 82 25.685 + vertex 95.3502 82 26.1673 + vertex 95.26 82 25.685 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 95.3502 82 26.1673 + vertex 95.51 82 25.685 + vertex 95.6175 82 26.1557 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 95.3502 82 25.2027 + vertex 95.51 82 25.685 + vertex 95.26 82 25.685 + endloop + endfacet + facet normal 0 -1 -0 + outer loop + vertex 95.51 82 25.685 + vertex 95.3502 82 25.2027 + vertex 95.6175 82 25.2143 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 95.6084 82 24.7856 + vertex 95.6175 82 25.2143 + vertex 95.3502 82 25.2027 + endloop + endfacet + facet normal 0 -1 -0 + outer loop + vertex 95.6175 82 25.2143 + vertex 95.6084 82 24.7856 + vertex 95.9185 82 24.8367 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 96 82 24.49 + vertex 95.9185 82 24.8367 + vertex 95.6084 82 24.7856 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 96.4718 82 24.3557 + vertex 96.3536 82 24.6272 + vertex 96 82 24.49 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 95.9185 82 24.8367 + vertex 96 82 24.49 + vertex 96.3536 82 24.6272 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 97.2715 82 26.5333 + vertex 96.9603 82 26.969 + vertex 96.8364 82 26.7428 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 96.9603 82 26.969 + vertex 97.2715 82 26.5333 + vertex 97.3995 82 26.7503 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 97.2715 82 26.5333 + vertex 97.73 82 26.3878 + vertex 97.3995 82 26.7503 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 97.5725 82 26.1557 + vertex 97.73 82 26.3878 + vertex 97.2715 82 26.5333 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 97.5725 82 26.1557 + vertex 97.9073 82 25.9303 + vertex 97.73 82 26.3878 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 97.68 82 25.685 + vertex 97.9073 82 25.9303 + vertex 97.5725 82 26.1557 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 97.68 82 25.685 + vertex 97.9073 82 25.4397 + vertex 97.9073 82 25.9303 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 97.5725 82 25.2143 + vertex 97.9073 82 25.4397 + vertex 97.68 82 25.685 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 97.5725 82 25.2143 + vertex 97.73 82 24.9822 + vertex 97.9073 82 25.4397 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 97.5295 82 24.7623 + vertex 97.5725 82 25.2143 + vertex 97.2715 82 24.8367 + endloop + endfacet + facet normal 0 -1 -0 + outer loop + vertex 97.5725 82 25.2143 + vertex 97.5295 82 24.7623 + vertex 97.73 82 24.9822 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 96.9798 82 24.4107 + vertex 97.2715 82 24.8367 + vertex 96.8755 82 24.646 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 106.523 82 25.9943 + vertex 106.139 82 26.2927 + vertex 106.146 82 26.04 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 97.5295 82 24.7623 + vertex 106.146 82 26.04 + vertex 106.139 82 26.2927 + endloop + endfacet + facet normal 0 -1 -0 + outer loop + vertex 97.2715 82 24.8367 + vertex 96.9798 82 24.4107 + vertex 97.5295 82 24.7623 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 96.8872 82 24.3942 + vertex 96.8755 82 24.646 + vertex 96.7696 82 24.6272 + endloop + endfacet + facet normal -0 -1 0 + outer loop + vertex 96.605 82 24.368 + vertex 96.3536 82 24.6272 + vertex 96.4718 82 24.3557 + endloop + endfacet + facet normal 0 -1 -0 + outer loop + vertex 97.5295 82 24.7623 + vertex 96.9798 82 24.4107 + vertex 106.146 82 26.04 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 96.8755 82 24.646 + vertex 96.8872 82 24.3942 + vertex 96.9798 82 24.4107 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 96.9798 82 24.4107 + vertex 96.8872 82 24.3942 + vertex 96.9603 82 24.401 + endloop + endfacet + facet normal 0 -1 -0 + outer loop + vertex 96.7696 82 24.6272 + vertex 96.605 82 24.368 + vertex 96.8872 82 24.3942 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 96.3536 82 24.6272 + vertex 96.605 82 24.368 + vertex 96.7696 82 24.6272 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 106.139 82 26.2927 + vertex 106.523 82 25.9943 + vertex 106.615 82 26.235 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 106.523 82 25.9943 + vertex 107.009 82 25.9631 + vertex 106.615 82 26.235 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 106.816 82 25.7924 + vertex 107.009 82 25.9631 + vertex 106.523 82 25.9943 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 106.816 82 25.7924 + vertex 107.231 82 25.5393 + vertex 107.009 82 25.9631 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 106.981 82 25.4777 + vertex 107.231 82 25.5393 + vertex 106.816 82 25.7924 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 107 82 24.13 + vertex 106.981 82 25.4777 + vertex 106.981 82 24.13 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 106.981 82 25.4777 + vertex 107 82 24.13 + vertex 107.231 82 25.5393 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 107 82 22.13 + vertex 107.231 82 25.5393 + vertex 107 82 24.13 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 107 82 22.1 + vertex 107 82 22.13 + vertex 106.981 82 22.1 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 107 82 22.1 + vertex 107.231 82 25.5393 + vertex 107 82 22.13 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 107.231 82 19.0607 + vertex 107 82 22.1 + vertex 107 82 20.5 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 107.231 82 19.0607 + vertex 107 82 20.5 + vertex 106.981 82 19.1223 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 107 82 22.1 + vertex 107.231 82 19.0607 + vertex 107.231 82 25.5393 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 106.816 82 18.8076 + vertex 107.231 82 19.0607 + vertex 106.981 82 19.1223 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 106.816 82 18.8076 + vertex 107.009 82 18.6369 + vertex 107.231 82 19.0607 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 106.523 82 18.6057 + vertex 107.009 82 18.6369 + vertex 106.816 82 18.8076 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 106.139 82 18.3073 + vertex 106.523 82 18.6057 + vertex 106.146 82 18.56 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 106.523 82 18.6057 + vertex 106.615 82 18.365 + vertex 107.009 82 18.6369 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 96.8872 82 24.3942 + vertex 96.605 82 24.368 + vertex 96.605 82 24.344 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 96.9798 82 20.1893 + vertex 97.2715 82 19.7633 + vertex 97.5295 82 19.8377 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 97.5725 82 19.3857 + vertex 97.5295 82 19.8377 + vertex 97.2715 82 19.7633 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 97.5295 82 19.8377 + vertex 97.5725 82 19.3857 + vertex 97.73 82 19.6178 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 97.5725 82 19.3857 + vertex 97.9073 82 19.1603 + vertex 97.73 82 19.6178 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 97.68 82 18.915 + vertex 97.9073 82 19.1603 + vertex 97.5725 82 19.3857 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 97.68 82 18.915 + vertex 97.9073 82 18.6697 + vertex 97.9073 82 19.1603 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 97.5725 82 18.4443 + vertex 97.9073 82 18.6697 + vertex 97.68 82 18.915 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 97.5725 82 18.4443 + vertex 97.73 82 18.2122 + vertex 97.9073 82 18.6697 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 97.2715 82 18.0667 + vertex 97.73 82 18.2122 + vertex 97.5725 82 18.4443 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 96.9603 82 17.631 + vertex 97.2715 82 18.0667 + vertex 96.8364 82 17.8572 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 97.2715 82 18.0667 + vertex 97.3995 82 17.8497 + vertex 97.73 82 18.2122 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 95.9185 82 19.7633 + vertex 96 82 20.11 + vertex 95.6084 82 19.8144 + endloop + endfacet + facet normal 0 -1 -0 + outer loop + vertex 96 82 20.11 + vertex 95.9185 82 19.7633 + vertex 96.3536 82 19.9728 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 95.6175 82 19.3857 + vertex 95.6084 82 19.8144 + vertex 95.3502 82 19.3973 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 95.6084 82 19.8144 + vertex 95.6175 82 19.3857 + vertex 95.9185 82 19.7633 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 95.51 82 18.915 + vertex 95.3502 82 19.3973 + vertex 95.26 82 18.915 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 95.3502 82 19.3973 + vertex 95.51 82 18.915 + vertex 95.6175 82 19.3857 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 95.3502 82 18.4327 + vertex 95.51 82 18.915 + vertex 95.26 82 18.915 + endloop + endfacet + facet normal 0 -1 -0 + outer loop + vertex 95.51 82 18.915 + vertex 95.3502 82 18.4327 + vertex 95.6175 82 18.4443 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 95.6084 82 18.0156 + vertex 95.6175 82 18.4443 + vertex 95.3502 82 18.4327 + endloop + endfacet + facet normal 0 -1 -0 + outer loop + vertex 95.6175 82 18.4443 + vertex 95.6084 82 18.0156 + vertex 95.9185 82 18.0667 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 96 82 17.72 + vertex 95.9185 82 18.0667 + vertex 95.6084 82 18.0156 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 96.4718 82 17.5857 + vertex 96.8364 82 17.8572 + vertex 96.3536 82 17.8572 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 95.9185 82 18.0667 + vertex 96 82 17.72 + vertex 96.3536 82 17.8572 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 96.4718 82 17.5857 + vertex 96.3536 82 17.8572 + vertex 96 82 17.72 + endloop + endfacet + facet normal 0 -1 -0 + outer loop + vertex 97.2715 82 18.0667 + vertex 96.9603 82 17.631 + vertex 97.3995 82 17.8497 + endloop + endfacet + facet normal 0 -1 -0 + outer loop + vertex 96.8364 82 17.8572 + vertex 96.4718 82 17.5857 + vertex 96.9603 82 17.631 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 96.8872 82 20.2058 + vertex 96.9798 82 20.1893 + vertex 96.9603 82 20.199 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 96.7696 82 19.9728 + vertex 96.8872 82 20.2058 + vertex 96.605 82 20.232 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 96.3536 82 19.9728 + vertex 96.605 82 20.232 + vertex 96.4718 82 20.2443 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 96.3536 82 19.9728 + vertex 96.4718 82 20.2443 + vertex 96 82 20.11 + endloop + endfacet + facet normal 0 -1 -0 + outer loop + vertex 96.605 82 20.232 + vertex 96.3536 82 19.9728 + vertex 96.7696 82 19.9728 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 96.8755 82 19.954 + vertex 96.8872 82 20.2058 + vertex 96.7696 82 19.9728 + endloop + endfacet + facet normal 0 -1 -0 + outer loop + vertex 96.8872 82 20.2058 + vertex 96.8755 82 19.954 + vertex 96.9798 82 20.1893 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 97.2715 82 19.7633 + vertex 96.9798 82 20.1893 + vertex 96.8755 82 19.954 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 97.5295 82 19.8377 + vertex 106.146 82 18.56 + vertex 96.9798 82 20.1893 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 106.139 82 18.3073 + vertex 106.146 82 18.56 + vertex 97.5295 82 19.8377 + endloop + endfacet + facet normal 0 -1 -0 + outer loop + vertex 106.523 82 18.6057 + vertex 106.139 82 18.3073 + vertex 106.615 82 18.365 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex 96.605 82 20.256 + vertex 96.605 82 20.232 + vertex 96.8872 82 20.2058 + endloop + endfacet + facet normal -0.175007 0 0.984567 + outer loop + vertex 97.5295 101 24.7623 + vertex 106.139 82 26.2927 + vertex 106.139 101 26.2927 + endloop + endfacet + facet normal -0.175007 0 0.984567 + outer loop + vertex 106.139 82 26.2927 + vertex 97.5295 101 24.7623 + vertex 97.5295 82 24.7623 + endloop + endfacet + facet normal -0.175 0 0.984568 + outer loop + vertex 96.7696 101 24.6272 + vertex 96.8755 82 24.646 + vertex 96.8755 101 24.646 + endloop + endfacet + facet normal -0.175 0 0.984568 + outer loop + vertex 96.8755 82 24.646 + vertex 96.7696 101 24.6272 + vertex 96.7696 82 24.6272 + endloop + endfacet + facet normal 0.120538 0 0.992709 + outer loop + vertex 106.139 101 26.2927 + vertex 106.615 82 26.235 + vertex 106.615 101 26.235 + endloop + endfacet + facet normal 0.120538 0 0.992709 + outer loop + vertex 106.615 82 26.235 + vertex 106.139 101 26.2927 + vertex 106.139 82 26.2927 + endloop + endfacet + facet normal 0.568069 0 0.822981 + outer loop + vertex 106.615 101 26.235 + vertex 107.009 82 25.9631 + vertex 107.009 101 25.9631 + endloop + endfacet + facet normal 0.568069 0 0.822981 + outer loop + vertex 107.009 82 25.9631 + vertex 106.615 101 26.235 + vertex 106.615 82 26.235 + endloop + endfacet + facet normal 0.885462 -0 0.464712 + outer loop + vertex 107.009 82 25.9631 + vertex 107.231 101 25.5393 + vertex 107.009 101 25.9631 + endloop + endfacet + facet normal 0.885462 0 0.464712 + outer loop + vertex 107.231 101 25.5393 + vertex 107.009 82 25.9631 + vertex 107.231 82 25.5393 + endloop + endfacet + facet normal 1 -0 0 + outer loop + vertex 107.231 82 25.5393 + vertex 107.231 101 19.0607 + vertex 107.231 101 25.5393 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 107.231 101 19.0607 + vertex 107.231 82 25.5393 + vertex 107.231 82 19.0607 + endloop + endfacet + facet normal 0.885462 0 -0.464712 + outer loop + vertex 107.231 82 19.0607 + vertex 107.009 101 18.6369 + vertex 107.231 101 19.0607 + endloop + endfacet + facet normal 0.885462 0 -0.464712 + outer loop + vertex 107.009 101 18.6369 + vertex 107.231 82 19.0607 + vertex 107.009 82 18.6369 + endloop + endfacet + facet normal 0.568069 0 -0.822981 + outer loop + vertex 106.615 82 18.365 + vertex 107.009 101 18.6369 + vertex 107.009 82 18.6369 + endloop + endfacet + facet normal 0.568069 0 -0.822981 + outer loop + vertex 107.009 101 18.6369 + vertex 106.615 82 18.365 + vertex 106.615 101 18.365 + endloop + endfacet + facet normal 0.120538 0 -0.992709 + outer loop + vertex 106.139 82 18.3073 + vertex 106.615 101 18.365 + vertex 106.615 82 18.365 + endloop + endfacet + facet normal 0.120538 0 -0.992709 + outer loop + vertex 106.615 101 18.365 + vertex 106.139 82 18.3073 + vertex 106.139 101 18.3073 + endloop + endfacet + facet normal -0.175008 0 -0.984567 + outer loop + vertex 97.5295 82 19.8377 + vertex 106.139 101 18.3073 + vertex 106.139 82 18.3073 + endloop + endfacet + facet normal -0.175008 0 -0.984567 + outer loop + vertex 106.139 101 18.3073 + vertex 97.5295 82 19.8377 + vertex 97.5295 101 19.8377 + endloop + endfacet + facet normal -0.175 0 -0.984568 + outer loop + vertex 96.7696 82 19.9728 + vertex 96.8755 101 19.954 + vertex 96.8755 82 19.954 + endloop + endfacet + facet normal -0.175 0 -0.984568 + outer loop + vertex 96.8755 101 19.954 + vertex 96.7696 82 19.9728 + vertex 96.7696 101 19.9728 + endloop + endfacet + facet normal -0.568073 0 0.822978 + outer loop + vertex 106.523 101 18.6057 + vertex 106.816 82 18.8076 + vertex 106.816 101 18.8076 + endloop + endfacet + facet normal -0.568073 0 0.822978 + outer loop + vertex 106.816 82 18.8076 + vertex 106.523 101 18.6057 + vertex 106.523 82 18.6057 + endloop + endfacet + facet normal -0.88547 0 0.464697 + outer loop + vertex 106.816 82 18.8076 + vertex 106.981 101 19.1223 + vertex 106.816 101 18.8076 + endloop + endfacet + facet normal -0.88547 0 0.464697 + outer loop + vertex 106.981 101 19.1223 + vertex 106.816 82 18.8076 + vertex 106.981 82 19.1223 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex 106.981 82 24.13 + vertex 106.981 101 25.4777 + vertex 106.981 101 24.13 + endloop + endfacet + facet normal -1 -0 0 + outer loop + vertex 106.981 101 25.4777 + vertex 106.981 82 24.13 + vertex 106.981 82 25.4777 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex 106.981 82 19.1223 + vertex 106.981 101 20.5 + vertex 106.981 101 19.1223 + endloop + endfacet + facet normal -1 -0 0 + outer loop + vertex 106.981 101 20.5 + vertex 106.981 82 19.1223 + vertex 106.981 82 20.5 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex 106.981 82 22.1 + vertex 106.981 101 22.13 + vertex 106.981 101 22.1 + endloop + endfacet + facet normal -1 -0 0 + outer loop + vertex 106.981 101 22.13 + vertex 106.981 82 22.1 + vertex 106.981 82 22.13 + endloop + endfacet + facet normal -0.88547 0 -0.464697 + outer loop + vertex 106.981 82 25.4777 + vertex 106.816 101 25.7924 + vertex 106.981 101 25.4777 + endloop + endfacet + facet normal -0.88547 -0 -0.464697 + outer loop + vertex 106.816 101 25.7924 + vertex 106.981 82 25.4777 + vertex 106.816 82 25.7924 + endloop + endfacet + facet normal -0.568073 0 -0.822978 + outer loop + vertex 106.523 82 25.9943 + vertex 106.816 101 25.7924 + vertex 106.816 82 25.7924 + endloop + endfacet + facet normal -0.568073 0 -0.822978 + outer loop + vertex 106.816 101 25.7924 + vertex 106.523 82 25.9943 + vertex 106.523 101 25.9943 + endloop + endfacet + facet normal -0.120522 0 -0.992711 + outer loop + vertex 106.146 82 26.04 + vertex 106.523 101 25.9943 + vertex 106.523 82 25.9943 + endloop + endfacet + facet normal -0.120522 0 -0.992711 + outer loop + vertex 106.523 101 25.9943 + vertex 106.146 82 26.04 + vertex 106.146 101 26.04 + endloop + endfacet + facet normal 0.175007 0 -0.984567 + outer loop + vertex 96.9798 82 24.4107 + vertex 106.146 101 26.04 + vertex 106.146 82 26.04 + endloop + endfacet + facet normal 0.175007 0 -0.984567 + outer loop + vertex 106.146 101 26.04 + vertex 96.9798 82 24.4107 + vertex 96.9798 101 24.4107 + endloop + endfacet + facet normal 0.175007 0 -0.984567 + outer loop + vertex 96.605 82 24.344 + vertex 96.8872 101 24.3942 + vertex 96.8872 82 24.3942 + endloop + endfacet + facet normal 0.175007 0 -0.984567 + outer loop + vertex 96.8872 101 24.3942 + vertex 96.605 82 24.344 + vertex 96.605 101 24.344 + endloop + endfacet + facet normal 0.175007 0 0.984567 + outer loop + vertex 96.9798 101 20.1893 + vertex 106.146 82 18.56 + vertex 106.146 101 18.56 + endloop + endfacet + facet normal 0.175007 0 0.984567 + outer loop + vertex 106.146 82 18.56 + vertex 96.9798 101 20.1893 + vertex 96.9798 82 20.1893 + endloop + endfacet + facet normal 0.175007 0 0.984567 + outer loop + vertex 96.605 101 20.256 + vertex 96.8872 82 20.2058 + vertex 96.8872 101 20.2058 + endloop + endfacet + facet normal 0.175007 0 0.984567 + outer loop + vertex 96.8872 82 20.2058 + vertex 96.605 101 20.256 + vertex 96.605 82 20.256 + endloop + endfacet + facet normal -0.120522 0 0.992711 + outer loop + vertex 106.146 101 18.56 + vertex 106.523 82 18.6057 + vertex 106.523 101 18.6057 + endloop + endfacet + facet normal -0.120522 0 0.992711 + outer loop + vertex 106.523 82 18.6057 + vertex 106.146 101 18.56 + vertex 106.146 82 18.56 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex 96.605 82 24.344 + vertex 96.605 101 24.368 + vertex 96.605 101 24.344 + endloop + endfacet + facet normal -1 -0 0 + outer loop + vertex 96.605 101 24.368 + vertex 96.605 82 24.344 + vertex 96.605 82 24.368 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex 96.605 82 20.232 + vertex 96.605 101 20.256 + vertex 96.605 101 20.232 + endloop + endfacet + facet normal -1 -0 0 + outer loop + vertex 96.605 101 20.256 + vertex 96.605 82 20.232 + vertex 96.605 82 20.256 + endloop + endfacet + facet normal -0.602619 0 -0.798029 + outer loop + vertex 95.6084 82 18.0156 + vertex 96 101 17.72 + vertex 96 82 17.72 + endloop + endfacet + facet normal -0.602619 0 -0.798029 + outer loop + vertex 96 101 17.72 + vertex 95.6084 82 18.0156 + vertex 95.6084 101 18.0156 + endloop + endfacet + facet normal -0.850222 0 -0.526424 + outer loop + vertex 95.6084 82 18.0156 + vertex 95.3502 101 18.4327 + vertex 95.6084 101 18.0156 + endloop + endfacet + facet normal -0.850222 -0 -0.526424 + outer loop + vertex 95.3502 101 18.4327 + vertex 95.6084 82 18.0156 + vertex 95.3502 82 18.4327 + endloop + endfacet + facet normal -0.982973 0 -0.18375 + outer loop + vertex 95.3502 82 18.4327 + vertex 95.26 101 18.915 + vertex 95.3502 101 18.4327 + endloop + endfacet + facet normal -0.982973 -0 -0.18375 + outer loop + vertex 95.26 101 18.915 + vertex 95.3502 82 18.4327 + vertex 95.26 82 18.915 + endloop + endfacet + facet normal -0.982973 0 0.18375 + outer loop + vertex 95.26 82 18.915 + vertex 95.3502 101 19.3973 + vertex 95.26 101 18.915 + endloop + endfacet + facet normal -0.982973 0 0.18375 + outer loop + vertex 95.3502 101 19.3973 + vertex 95.26 82 18.915 + vertex 95.3502 82 19.3973 + endloop + endfacet + facet normal -0.850222 0 0.526424 + outer loop + vertex 95.3502 82 19.3973 + vertex 95.6084 101 19.8144 + vertex 95.3502 101 19.3973 + endloop + endfacet + facet normal -0.850222 0 0.526424 + outer loop + vertex 95.6084 101 19.8144 + vertex 95.3502 82 19.3973 + vertex 95.6084 82 19.8144 + endloop + endfacet + facet normal -0.602619 0 0.798029 + outer loop + vertex 95.6084 101 19.8144 + vertex 96 82 20.11 + vertex 96 101 20.11 + endloop + endfacet + facet normal -0.602619 0 0.798029 + outer loop + vertex 96 82 20.11 + vertex 95.6084 101 19.8144 + vertex 95.6084 82 19.8144 + endloop + endfacet + facet normal -0.273665 0 0.961825 + outer loop + vertex 96 101 20.11 + vertex 96.4718 82 20.2443 + vertex 96.4718 101 20.2443 + endloop + endfacet + facet normal -0.273665 0 0.961825 + outer loop + vertex 96.4718 82 20.2443 + vertex 96 101 20.11 + vertex 96 82 20.11 + endloop + endfacet + facet normal 0.0922792 0 0.995733 + outer loop + vertex 96.8872 101 20.2058 + vertex 96.9603 82 20.199 + vertex 96.9603 101 20.199 + endloop + endfacet + facet normal 0.0922792 0 0.995733 + outer loop + vertex 96.9603 82 20.199 + vertex 96.8872 101 20.2058 + vertex 96.8872 82 20.2058 + endloop + endfacet + facet normal 0.0922857 0 0.995733 + outer loop + vertex 96.4718 101 20.2443 + vertex 96.605 82 20.232 + vertex 96.605 101 20.232 + endloop + endfacet + facet normal 0.0922857 0 0.995733 + outer loop + vertex 96.605 82 20.232 + vertex 96.4718 101 20.2443 + vertex 96.4718 82 20.2443 + endloop + endfacet + facet normal 0.445737 0 0.895164 + outer loop + vertex 96.9603 101 20.199 + vertex 96.9798 82 20.1893 + vertex 96.9798 101 20.1893 + endloop + endfacet + facet normal 0.445737 0 0.895164 + outer loop + vertex 96.9798 82 20.1893 + vertex 96.9603 101 20.199 + vertex 96.9603 82 20.199 + endloop + endfacet + facet normal 0.739002 -0 0.673704 + outer loop + vertex 97.5295 82 19.8377 + vertex 97.73 101 19.6178 + vertex 97.5295 101 19.8377 + endloop + endfacet + facet normal 0.739002 0 0.673704 + outer loop + vertex 97.73 101 19.6178 + vertex 97.5295 82 19.8377 + vertex 97.73 82 19.6178 + endloop + endfacet + facet normal 0.932469 -0 0.36125 + outer loop + vertex 97.73 82 19.6178 + vertex 97.9073 101 19.1603 + vertex 97.73 101 19.6178 + endloop + endfacet + facet normal 0.932469 0 0.36125 + outer loop + vertex 97.9073 101 19.1603 + vertex 97.73 82 19.6178 + vertex 97.9073 82 19.1603 + endloop + endfacet + facet normal 1 -0 0 + outer loop + vertex 97.9073 82 19.1603 + vertex 97.9073 101 18.6697 + vertex 97.9073 101 19.1603 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 97.9073 101 18.6697 + vertex 97.9073 82 19.1603 + vertex 97.9073 82 18.6697 + endloop + endfacet + facet normal 0.932469 0 -0.36125 + outer loop + vertex 97.9073 82 18.6697 + vertex 97.73 101 18.2122 + vertex 97.9073 101 18.6697 + endloop + endfacet + facet normal 0.932469 0 -0.36125 + outer loop + vertex 97.73 101 18.2122 + vertex 97.9073 82 18.6697 + vertex 97.73 82 18.2122 + endloop + endfacet + facet normal 0.739009 0 -0.673695 + outer loop + vertex 97.73 82 18.2122 + vertex 97.3995 101 17.8497 + vertex 97.73 101 18.2122 + endloop + endfacet + facet normal 0.739009 0 -0.673695 + outer loop + vertex 97.3995 101 17.8497 + vertex 97.73 82 18.2122 + vertex 97.3995 82 17.8497 + endloop + endfacet + facet normal 0.445745 0 -0.89516 + outer loop + vertex 96.9603 82 17.631 + vertex 97.3995 101 17.8497 + vertex 97.3995 82 17.8497 + endloop + endfacet + facet normal 0.445745 0 -0.89516 + outer loop + vertex 97.3995 101 17.8497 + vertex 96.9603 82 17.631 + vertex 96.9603 101 17.631 + endloop + endfacet + facet normal 0.0922827 0 -0.995733 + outer loop + vertex 96.4718 82 17.5857 + vertex 96.9603 101 17.631 + vertex 96.9603 82 17.631 + endloop + endfacet + facet normal 0.0922827 0 -0.995733 + outer loop + vertex 96.9603 101 17.631 + vertex 96.4718 82 17.5857 + vertex 96.4718 101 17.5857 + endloop + endfacet + facet normal -0.273665 0 -0.961825 + outer loop + vertex 96 82 17.72 + vertex 96.4718 101 17.5857 + vertex 96.4718 82 17.5857 + endloop + endfacet + facet normal -0.273665 0 -0.961825 + outer loop + vertex 96.4718 101 17.5857 + vertex 96 82 17.72 + vertex 96 101 17.72 + endloop + endfacet + facet normal -0.433867 0 0.900977 + outer loop + vertex 96.8364 101 17.8572 + vertex 97.2715 82 18.0667 + vertex 97.2715 101 18.0667 + endloop + endfacet + facet normal -0.433867 0 0.900977 + outer loop + vertex 97.2715 82 18.0667 + vertex 96.8364 101 17.8572 + vertex 96.8364 82 17.8572 + endloop + endfacet + facet normal -0.781848 0 0.623469 + outer loop + vertex 97.2715 82 18.0667 + vertex 97.5725 101 18.4443 + vertex 97.2715 101 18.0667 + endloop + endfacet + facet normal -0.781848 0 0.623469 + outer loop + vertex 97.5725 101 18.4443 + vertex 97.2715 82 18.0667 + vertex 97.5725 82 18.4443 + endloop + endfacet + facet normal -0.974925 0 0.222535 + outer loop + vertex 97.5725 82 18.4443 + vertex 97.68 101 18.915 + vertex 97.5725 101 18.4443 + endloop + endfacet + facet normal -0.974925 0 0.222535 + outer loop + vertex 97.68 101 18.915 + vertex 97.5725 82 18.4443 + vertex 97.68 82 18.915 + endloop + endfacet + facet normal -0.974925 0 -0.222535 + outer loop + vertex 97.68 82 18.915 + vertex 97.5725 101 19.3857 + vertex 97.68 101 18.915 + endloop + endfacet + facet normal -0.974925 -0 -0.222535 + outer loop + vertex 97.5725 101 19.3857 + vertex 97.68 82 18.915 + vertex 97.5725 82 19.3857 + endloop + endfacet + facet normal -0.781848 0 -0.623469 + outer loop + vertex 97.5725 82 19.3857 + vertex 97.2715 101 19.7633 + vertex 97.5725 101 19.3857 + endloop + endfacet + facet normal -0.781848 -0 -0.623469 + outer loop + vertex 97.2715 101 19.7633 + vertex 97.5725 82 19.3857 + vertex 97.2715 82 19.7633 + endloop + endfacet + facet normal -0.433867 0 -0.900977 + outer loop + vertex 96.8755 82 19.954 + vertex 97.2715 101 19.7633 + vertex 97.2715 82 19.7633 + endloop + endfacet + facet normal -0.433867 0 -0.900977 + outer loop + vertex 97.2715 101 19.7633 + vertex 96.8755 82 19.954 + vertex 96.8755 101 19.954 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 96.3536 82 19.9728 + vertex 96.7696 101 19.9728 + vertex 96.7696 82 19.9728 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 96.7696 101 19.9728 + vertex 96.3536 82 19.9728 + vertex 96.3536 101 19.9728 + endloop + endfacet + facet normal 0.433867 0 -0.900977 + outer loop + vertex 95.9185 82 19.7633 + vertex 96.3536 101 19.9728 + vertex 96.3536 82 19.9728 + endloop + endfacet + facet normal 0.433867 0 -0.900977 + outer loop + vertex 96.3536 101 19.9728 + vertex 95.9185 82 19.7633 + vertex 95.9185 101 19.7633 + endloop + endfacet + facet normal 0.781848 0 -0.623469 + outer loop + vertex 95.9185 82 19.7633 + vertex 95.6175 101 19.3857 + vertex 95.9185 101 19.7633 + endloop + endfacet + facet normal 0.781848 0 -0.623469 + outer loop + vertex 95.6175 101 19.3857 + vertex 95.9185 82 19.7633 + vertex 95.6175 82 19.3857 + endloop + endfacet + facet normal 0.974925 0 -0.222535 + outer loop + vertex 95.6175 82 19.3857 + vertex 95.51 101 18.915 + vertex 95.6175 101 19.3857 + endloop + endfacet + facet normal 0.974925 0 -0.222535 + outer loop + vertex 95.51 101 18.915 + vertex 95.6175 82 19.3857 + vertex 95.51 82 18.915 + endloop + endfacet + facet normal 0.974925 -0 0.222535 + outer loop + vertex 95.51 82 18.915 + vertex 95.6175 101 18.4443 + vertex 95.51 101 18.915 + endloop + endfacet + facet normal 0.974925 0 0.222535 + outer loop + vertex 95.6175 101 18.4443 + vertex 95.51 82 18.915 + vertex 95.6175 82 18.4443 + endloop + endfacet + facet normal 0.781848 -0 0.623469 + outer loop + vertex 95.6175 82 18.4443 + vertex 95.9185 101 18.0667 + vertex 95.6175 101 18.4443 + endloop + endfacet + facet normal 0.781848 0 0.623469 + outer loop + vertex 95.9185 101 18.0667 + vertex 95.6175 82 18.4443 + vertex 95.9185 82 18.0667 + endloop + endfacet + facet normal 0.433867 0 0.900977 + outer loop + vertex 95.9185 101 18.0667 + vertex 96.3536 82 17.8572 + vertex 96.3536 101 17.8572 + endloop + endfacet + facet normal 0.433867 0 0.900977 + outer loop + vertex 96.3536 82 17.8572 + vertex 95.9185 101 18.0667 + vertex 95.9185 82 18.0667 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex 96.3536 101 17.8572 + vertex 96.8364 82 17.8572 + vertex 96.8364 101 17.8572 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 96.8364 82 17.8572 + vertex 96.3536 101 17.8572 + vertex 96.3536 82 17.8572 + endloop + endfacet + facet normal -0.602619 0 -0.798029 + outer loop + vertex 95.6084 82 24.7856 + vertex 96 101 24.49 + vertex 96 82 24.49 + endloop + endfacet + facet normal -0.602619 0 -0.798029 + outer loop + vertex 96 101 24.49 + vertex 95.6084 82 24.7856 + vertex 95.6084 101 24.7856 + endloop + endfacet + facet normal -0.850222 0 -0.526424 + outer loop + vertex 95.6084 82 24.7856 + vertex 95.3502 101 25.2027 + vertex 95.6084 101 24.7856 + endloop + endfacet + facet normal -0.850222 -0 -0.526424 + outer loop + vertex 95.3502 101 25.2027 + vertex 95.6084 82 24.7856 + vertex 95.3502 82 25.2027 + endloop + endfacet + facet normal -0.982973 0 -0.18375 + outer loop + vertex 95.3502 82 25.2027 + vertex 95.26 101 25.685 + vertex 95.3502 101 25.2027 + endloop + endfacet + facet normal -0.982973 -0 -0.18375 + outer loop + vertex 95.26 101 25.685 + vertex 95.3502 82 25.2027 + vertex 95.26 82 25.685 + endloop + endfacet + facet normal -0.982973 0 0.18375 + outer loop + vertex 95.26 82 25.685 + vertex 95.3502 101 26.1673 + vertex 95.26 101 25.685 + endloop + endfacet + facet normal -0.982973 0 0.18375 + outer loop + vertex 95.3502 101 26.1673 + vertex 95.26 82 25.685 + vertex 95.3502 82 26.1673 + endloop + endfacet + facet normal -0.850222 0 0.526424 + outer loop + vertex 95.3502 82 26.1673 + vertex 95.6084 101 26.5844 + vertex 95.3502 101 26.1673 + endloop + endfacet + facet normal -0.850222 0 0.526424 + outer loop + vertex 95.6084 101 26.5844 + vertex 95.3502 82 26.1673 + vertex 95.6084 82 26.5844 + endloop + endfacet + facet normal -0.602619 0 0.798029 + outer loop + vertex 95.6084 101 26.5844 + vertex 96 82 26.88 + vertex 96 101 26.88 + endloop + endfacet + facet normal -0.602619 0 0.798029 + outer loop + vertex 96 82 26.88 + vertex 95.6084 101 26.5844 + vertex 95.6084 82 26.5844 + endloop + endfacet + facet normal -0.273665 0 0.961825 + outer loop + vertex 96 101 26.88 + vertex 96.4718 82 27.0143 + vertex 96.4718 101 27.0143 + endloop + endfacet + facet normal -0.273665 0 0.961825 + outer loop + vertex 96.4718 82 27.0143 + vertex 96 101 26.88 + vertex 96 82 26.88 + endloop + endfacet + facet normal 0.0922827 0 0.995733 + outer loop + vertex 96.4718 101 27.0143 + vertex 96.9603 82 26.969 + vertex 96.9603 101 26.969 + endloop + endfacet + facet normal 0.0922827 0 0.995733 + outer loop + vertex 96.9603 82 26.969 + vertex 96.4718 101 27.0143 + vertex 96.4718 82 27.0143 + endloop + endfacet + facet normal 0.445745 0 0.89516 + outer loop + vertex 96.9603 101 26.969 + vertex 97.3995 82 26.7503 + vertex 97.3995 101 26.7503 + endloop + endfacet + facet normal 0.445745 0 0.89516 + outer loop + vertex 97.3995 82 26.7503 + vertex 96.9603 101 26.969 + vertex 96.9603 82 26.969 + endloop + endfacet + facet normal 0.739009 -0 0.673695 + outer loop + vertex 97.3995 82 26.7503 + vertex 97.73 101 26.3878 + vertex 97.3995 101 26.7503 + endloop + endfacet + facet normal 0.739009 0 0.673695 + outer loop + vertex 97.73 101 26.3878 + vertex 97.3995 82 26.7503 + vertex 97.73 82 26.3878 + endloop + endfacet + facet normal 0.932469 -0 0.36125 + outer loop + vertex 97.73 82 26.3878 + vertex 97.9073 101 25.9303 + vertex 97.73 101 26.3878 + endloop + endfacet + facet normal 0.932469 0 0.36125 + outer loop + vertex 97.9073 101 25.9303 + vertex 97.73 82 26.3878 + vertex 97.9073 82 25.9303 + endloop + endfacet + facet normal 1 -0 0 + outer loop + vertex 97.9073 82 25.9303 + vertex 97.9073 101 25.4397 + vertex 97.9073 101 25.9303 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 97.9073 101 25.4397 + vertex 97.9073 82 25.9303 + vertex 97.9073 82 25.4397 + endloop + endfacet + facet normal 0.932469 0 -0.36125 + outer loop + vertex 97.9073 82 25.4397 + vertex 97.73 101 24.9822 + vertex 97.9073 101 25.4397 + endloop + endfacet + facet normal 0.932469 0 -0.36125 + outer loop + vertex 97.73 101 24.9822 + vertex 97.9073 82 25.4397 + vertex 97.73 82 24.9822 + endloop + endfacet + facet normal 0.739002 0 -0.673704 + outer loop + vertex 97.73 82 24.9822 + vertex 97.5295 101 24.7623 + vertex 97.73 101 24.9822 + endloop + endfacet + facet normal 0.739002 0 -0.673704 + outer loop + vertex 97.5295 101 24.7623 + vertex 97.73 82 24.9822 + vertex 97.5295 82 24.7623 + endloop + endfacet + facet normal 0.445737 0 -0.895164 + outer loop + vertex 96.9603 82 24.401 + vertex 96.9798 101 24.4107 + vertex 96.9798 82 24.4107 + endloop + endfacet + facet normal 0.445737 0 -0.895164 + outer loop + vertex 96.9798 101 24.4107 + vertex 96.9603 82 24.401 + vertex 96.9603 101 24.401 + endloop + endfacet + facet normal 0.0922857 0 -0.995733 + outer loop + vertex 96.4718 82 24.3557 + vertex 96.605 101 24.368 + vertex 96.605 82 24.368 + endloop + endfacet + facet normal 0.0922857 0 -0.995733 + outer loop + vertex 96.605 101 24.368 + vertex 96.4718 82 24.3557 + vertex 96.4718 101 24.3557 + endloop + endfacet + facet normal 0.0922792 0 -0.995733 + outer loop + vertex 96.8872 82 24.3942 + vertex 96.9603 101 24.401 + vertex 96.9603 82 24.401 + endloop + endfacet + facet normal 0.0922792 0 -0.995733 + outer loop + vertex 96.9603 101 24.401 + vertex 96.8872 82 24.3942 + vertex 96.8872 101 24.3942 + endloop + endfacet + facet normal -0.273665 0 -0.961825 + outer loop + vertex 96 82 24.49 + vertex 96.4718 101 24.3557 + vertex 96.4718 82 24.3557 + endloop + endfacet + facet normal -0.273665 0 -0.961825 + outer loop + vertex 96.4718 101 24.3557 + vertex 96 82 24.49 + vertex 96 101 24.49 + endloop + endfacet + facet normal -0.433867 0 0.900977 + outer loop + vertex 96.8755 101 24.646 + vertex 97.2715 82 24.8367 + vertex 97.2715 101 24.8367 + endloop + endfacet + facet normal -0.433867 0 0.900977 + outer loop + vertex 97.2715 82 24.8367 + vertex 96.8755 101 24.646 + vertex 96.8755 82 24.646 + endloop + endfacet + facet normal -0.781848 0 0.623469 + outer loop + vertex 97.2715 82 24.8367 + vertex 97.5725 101 25.2143 + vertex 97.2715 101 24.8367 + endloop + endfacet + facet normal -0.781848 0 0.623469 + outer loop + vertex 97.5725 101 25.2143 + vertex 97.2715 82 24.8367 + vertex 97.5725 82 25.2143 + endloop + endfacet + facet normal -0.974925 0 0.222535 + outer loop + vertex 97.5725 82 25.2143 + vertex 97.68 101 25.685 + vertex 97.5725 101 25.2143 + endloop + endfacet + facet normal -0.974925 0 0.222535 + outer loop + vertex 97.68 101 25.685 + vertex 97.5725 82 25.2143 + vertex 97.68 82 25.685 + endloop + endfacet + facet normal -0.974925 0 -0.222535 + outer loop + vertex 97.68 82 25.685 + vertex 97.5725 101 26.1557 + vertex 97.68 101 25.685 + endloop + endfacet + facet normal -0.974925 -0 -0.222535 + outer loop + vertex 97.5725 101 26.1557 + vertex 97.68 82 25.685 + vertex 97.5725 82 26.1557 + endloop + endfacet + facet normal -0.781848 0 -0.623469 + outer loop + vertex 97.5725 82 26.1557 + vertex 97.2715 101 26.5333 + vertex 97.5725 101 26.1557 + endloop + endfacet + facet normal -0.781848 -0 -0.623469 + outer loop + vertex 97.2715 101 26.5333 + vertex 97.5725 82 26.1557 + vertex 97.2715 82 26.5333 + endloop + endfacet + facet normal -0.433867 0 -0.900977 + outer loop + vertex 96.8364 82 26.7428 + vertex 97.2715 101 26.5333 + vertex 97.2715 82 26.5333 + endloop + endfacet + facet normal -0.433867 0 -0.900977 + outer loop + vertex 97.2715 101 26.5333 + vertex 96.8364 82 26.7428 + vertex 96.8364 101 26.7428 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 96.3536 82 26.7428 + vertex 96.8364 101 26.7428 + vertex 96.8364 82 26.7428 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 96.8364 101 26.7428 + vertex 96.3536 82 26.7428 + vertex 96.3536 101 26.7428 + endloop + endfacet + facet normal 0.433867 0 -0.900977 + outer loop + vertex 95.9185 82 26.5333 + vertex 96.3536 101 26.7428 + vertex 96.3536 82 26.7428 + endloop + endfacet + facet normal 0.433867 0 -0.900977 + outer loop + vertex 96.3536 101 26.7428 + vertex 95.9185 82 26.5333 + vertex 95.9185 101 26.5333 + endloop + endfacet + facet normal 0.781848 0 -0.623469 + outer loop + vertex 95.9185 82 26.5333 + vertex 95.6175 101 26.1557 + vertex 95.9185 101 26.5333 + endloop + endfacet + facet normal 0.781848 0 -0.623469 + outer loop + vertex 95.6175 101 26.1557 + vertex 95.9185 82 26.5333 + vertex 95.6175 82 26.1557 + endloop + endfacet + facet normal 0.974925 0 -0.222535 + outer loop + vertex 95.6175 82 26.1557 + vertex 95.51 101 25.685 + vertex 95.6175 101 26.1557 + endloop + endfacet + facet normal 0.974925 0 -0.222535 + outer loop + vertex 95.51 101 25.685 + vertex 95.6175 82 26.1557 + vertex 95.51 82 25.685 + endloop + endfacet + facet normal 0.974925 -0 0.222535 + outer loop + vertex 95.51 82 25.685 + vertex 95.6175 101 25.2143 + vertex 95.51 101 25.685 + endloop + endfacet + facet normal 0.974925 0 0.222535 + outer loop + vertex 95.6175 101 25.2143 + vertex 95.51 82 25.685 + vertex 95.6175 82 25.2143 + endloop + endfacet + facet normal 0.781848 -0 0.623469 + outer loop + vertex 95.6175 82 25.2143 + vertex 95.9185 101 24.8367 + vertex 95.6175 101 25.2143 + endloop + endfacet + facet normal 0.781848 0 0.623469 + outer loop + vertex 95.9185 101 24.8367 + vertex 95.6175 82 25.2143 + vertex 95.9185 82 24.8367 + endloop + endfacet + facet normal 0.433867 0 0.900977 + outer loop + vertex 95.9185 101 24.8367 + vertex 96.3536 82 24.6272 + vertex 96.3536 101 24.6272 + endloop + endfacet + facet normal 0.433867 0 0.900977 + outer loop + vertex 96.3536 82 24.6272 + vertex 95.9185 101 24.8367 + vertex 95.9185 82 24.8367 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex 96.3536 101 24.6272 + vertex 96.7696 82 24.6272 + vertex 96.7696 101 24.6272 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 96.7696 82 24.6272 + vertex 96.3536 101 24.6272 + vertex 96.3536 82 24.6272 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -107 -104.067 20.5 + vertex -107 -101 22.1 + vertex -107 -101 20.5 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -107 -107 22.1 + vertex -107 -104.067 20.5 + vertex -107 -104.933 20.5 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -107 -107 22.1 + vertex -107 -104.933 20.5 + vertex -107 -107 20.5 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -107 -104.067 20.5 + vertex -107 -107 22.1 + vertex -107 -101 22.1 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -107 104.933 20.5 + vertex -107 107 22.1 + vertex -107 107 20.5 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -107 104.067 20.5 + vertex -107 107 22.1 + vertex -107 104.933 20.5 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -107 101 22.1 + vertex -107 104.067 20.5 + vertex -107 101 20.5 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -107 104.067 20.5 + vertex -107 101 22.1 + vertex -107 107 22.1 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -107 -82 20.5 + vertex -107 82 22.1 + vertex -107 82 20.5 + endloop + endfacet + facet normal -1 -0 0 + outer loop + vertex -107 82 22.1 + vertex -107 -82 20.5 + vertex -107 -82 22.1 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -107 82 22.1 + vertex -106.981 -82 22.1 + vertex -106.981 82 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -106.981 -82 22.1 + vertex -107 82 22.1 + vertex -107 -82 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 106.981 82 22.1 + vertex -106.981 82 22.1 + vertex 106.981 -82 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 106.981 -82 22.1 + vertex -103.091 -104.016 22.1 + vertex -103.01 -104.5 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -106.981 82 22.1 + vertex -103.091 104.016 22.1 + vertex -103.324 103.585 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -106.981 -82 22.1 + vertex 106.981 -82 22.1 + vertex -106.981 82 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -106.981 82 22.1 + vertex -103.324 103.585 22.1 + vertex -103.685 103.253 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 106.981 -82 22.1 + vertex -106.981 -82 22.1 + vertex -103.091 -104.016 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -106.981 101 22.1 + vertex -103.685 103.253 22.1 + vertex -104.134 103.056 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -103.091 -104.016 22.1 + vertex -106.981 -82 22.1 + vertex -103.324 -103.585 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -106.981 101 22.1 + vertex -104.134 103.056 22.1 + vertex -104.623 103.015 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -103.324 -103.585 22.1 + vertex -106.981 -82 22.1 + vertex -103.685 -103.253 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -106.981 101 22.1 + vertex -104.623 103.015 22.1 + vertex -105.099 103.135 22.1 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -106.981 -101 22.1 + vertex -103.685 -103.253 22.1 + vertex -106.981 -82 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -106.981 101 22.1 + vertex -105.099 103.135 22.1 + vertex -105.509 103.404 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -103.685 -103.253 22.1 + vertex -106.981 -101 22.1 + vertex -104.134 -103.056 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -106.981 101 22.1 + vertex -105.509 103.404 22.1 + vertex -105.81 103.791 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -104.134 -103.056 22.1 + vertex -106.981 -101 22.1 + vertex -104.623 -103.015 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -107 101 22.1 + vertex -105.81 103.791 22.1 + vertex -105.97 104.255 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -104.623 -103.015 22.1 + vertex -106.981 -101 22.1 + vertex -105.099 -103.135 22.1 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex 104.866 103.056 22.1 + vertex 106.981 101 22.1 + vertex 105.315 103.253 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 106.981 -82 22.1 + vertex 105.909 -104.016 22.1 + vertex 105.99 -104.5 22.1 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex 104.377 103.015 22.1 + vertex 106.981 101 22.1 + vertex 104.866 103.056 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 106.981 -82 22.1 + vertex 105.676 -103.585 22.1 + vertex 105.909 -104.016 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 103.901 103.135 22.1 + vertex 106.981 101 22.1 + vertex 104.377 103.015 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 106.981 -82 22.1 + vertex 105.315 -103.253 22.1 + vertex 105.676 -103.585 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 106.981 101 22.1 + vertex 103.901 103.135 22.1 + vertex 106.981 82 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 106.981 -82 22.1 + vertex 104.866 -103.056 22.1 + vertex 105.315 -103.253 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 103.491 103.404 22.1 + vertex 106.981 82 22.1 + vertex 103.901 103.135 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 106.981 -82 22.1 + vertex 104.377 -103.015 22.1 + vertex 104.866 -103.056 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 103.19 103.791 22.1 + vertex 106.981 82 22.1 + vertex 103.491 103.404 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 106.981 -82 22.1 + vertex 103.901 -103.135 22.1 + vertex 104.377 -103.015 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 103.03 104.255 22.1 + vertex -103.091 104.016 22.1 + vertex 106.981 82 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 106.981 -82 22.1 + vertex 103.491 -103.404 22.1 + vertex 103.901 -103.135 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 103.03 104.255 22.1 + vertex 106.981 82 22.1 + vertex 103.19 103.791 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -106.981 82 22.1 + vertex 106.981 82 22.1 + vertex -103.091 104.016 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -103.091 104.016 22.1 + vertex 103.03 104.255 22.1 + vertex -103.01 104.5 22.1 + endloop + endfacet + facet normal 0 -0 1 + outer loop + vertex 103.03 -104.255 22.1 + vertex 106.981 -82 22.1 + vertex -103.01 -104.5 22.1 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex 105.99 104.5 22.1 + vertex 107 101 22.1 + vertex 107 107 22.1 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex 105.676 103.585 22.1 + vertex 107 101 22.1 + vertex 105.909 104.016 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 107 101 22.1 + vertex 105.676 103.585 22.1 + vertex 106.981 101 22.1 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex 105.315 103.253 22.1 + vertex 106.981 101 22.1 + vertex 105.676 103.585 22.1 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex 105.909 104.016 22.1 + vertex 107 101 22.1 + vertex 105.99 104.5 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 107 107 22.1 + vertex 105.909 104.984 22.1 + vertex 105.99 104.5 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 107 107 22.1 + vertex 105.676 105.415 22.1 + vertex 105.909 104.984 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 107 107 22.1 + vertex 105.315 105.747 22.1 + vertex 105.676 105.415 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 107 107 22.1 + vertex 104.866 105.944 22.1 + vertex 105.315 105.747 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 107 107 22.1 + vertex 104.377 105.985 22.1 + vertex 104.866 105.944 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 107 107 22.1 + vertex 103.901 105.865 22.1 + vertex 104.377 105.985 22.1 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -103.01 104.5 22.1 + vertex 103.03 104.255 22.1 + vertex 103.03 104.745 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 106.981 -82 22.1 + vertex 103.19 -103.791 22.1 + vertex 103.491 -103.404 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 106.981 -82 22.1 + vertex 103.03 -104.255 22.1 + vertex 103.19 -103.791 22.1 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -103.091 104.984 22.1 + vertex 103.03 104.745 22.1 + vertex 103.19 105.209 22.1 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -103.324 105.415 22.1 + vertex 103.19 105.209 22.1 + vertex 103.491 105.596 22.1 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -103.685 105.747 22.1 + vertex 103.491 105.596 22.1 + vertex 103.901 105.865 22.1 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -104.134 105.944 22.1 + vertex 103.901 105.865 22.1 + vertex 107 107 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 103.03 104.745 22.1 + vertex -103.091 104.984 22.1 + vertex -103.01 104.5 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 103.19 105.209 22.1 + vertex -103.324 105.415 22.1 + vertex -103.091 104.984 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 103.491 105.596 22.1 + vertex -103.685 105.747 22.1 + vertex -103.324 105.415 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 103.901 105.865 22.1 + vertex -104.134 105.944 22.1 + vertex -103.685 105.747 22.1 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -107 107 22.1 + vertex -104.134 105.944 22.1 + vertex 107 107 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -107 107 22.1 + vertex -105.97 104.255 22.1 + vertex -105.97 104.745 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -105.099 -103.135 22.1 + vertex -106.981 -101 22.1 + vertex -105.509 -103.404 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -103.685 103.253 22.1 + vertex -106.981 101 22.1 + vertex -106.981 82 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -104.134 105.944 22.1 + vertex -107 107 22.1 + vertex -104.623 105.985 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -107 107 22.1 + vertex -105.099 105.865 22.1 + vertex -104.623 105.985 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -107 107 22.1 + vertex -105.509 105.596 22.1 + vertex -105.099 105.865 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -107 107 22.1 + vertex -105.81 105.209 22.1 + vertex -105.509 105.596 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -107 107 22.1 + vertex -105.97 104.745 22.1 + vertex -105.81 105.209 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -105.97 104.255 22.1 + vertex -107 107 22.1 + vertex -107 101 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -105.81 103.791 22.1 + vertex -107 101 22.1 + vertex -106.981 101 22.1 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex 106.981 82 22.1 + vertex 107 -82 22.1 + vertex 107 82 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 107 -82 22.1 + vertex 106.981 82 22.1 + vertex 106.981 -82 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 105.99 -104.5 22.1 + vertex 107 -101 22.1 + vertex 106.981 -101 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 106.981 -82 22.1 + vertex 105.99 -104.5 22.1 + vertex 106.981 -101 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 107 -101 22.1 + vertex 105.99 -104.5 22.1 + vertex 107 -107 22.1 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex 105.909 -104.984 22.1 + vertex 107 -107 22.1 + vertex 105.99 -104.5 22.1 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex 105.676 -105.415 22.1 + vertex 107 -107 22.1 + vertex 105.909 -104.984 22.1 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex 105.315 -105.747 22.1 + vertex 107 -107 22.1 + vertex 105.676 -105.415 22.1 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex 104.866 -105.944 22.1 + vertex 107 -107 22.1 + vertex 105.315 -105.747 22.1 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex 104.377 -105.985 22.1 + vertex 107 -107 22.1 + vertex 104.866 -105.944 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 103.901 -105.865 22.1 + vertex 107 -107 22.1 + vertex 104.377 -105.985 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 103.03 -104.255 22.1 + vertex -103.01 -104.5 22.1 + vertex 103.03 -104.745 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -103.091 -104.984 22.1 + vertex 103.03 -104.745 22.1 + vertex -103.01 -104.5 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 103.03 -104.745 22.1 + vertex -103.091 -104.984 22.1 + vertex 103.19 -105.209 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -103.324 -105.415 22.1 + vertex 103.19 -105.209 22.1 + vertex -103.091 -104.984 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 103.19 -105.209 22.1 + vertex -103.324 -105.415 22.1 + vertex 103.491 -105.596 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -103.685 -105.747 22.1 + vertex 103.491 -105.596 22.1 + vertex -103.324 -105.415 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 103.491 -105.596 22.1 + vertex -103.685 -105.747 22.1 + vertex 103.901 -105.865 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -104.134 -105.944 22.1 + vertex 103.901 -105.865 22.1 + vertex -103.685 -105.747 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 103.901 -105.865 22.1 + vertex -104.134 -105.944 22.1 + vertex 107 -107 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -107 -107 22.1 + vertex -104.134 -105.944 22.1 + vertex -104.623 -105.985 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -105.509 -103.404 22.1 + vertex -106.981 -101 22.1 + vertex -105.81 -103.791 22.1 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -107 -101 22.1 + vertex -105.81 -103.791 22.1 + vertex -106.981 -101 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -105.81 -103.791 22.1 + vertex -107 -101 22.1 + vertex -105.97 -104.255 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -107 -107 22.1 + vertex -105.97 -104.255 22.1 + vertex -107 -101 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -104.134 -105.944 22.1 + vertex -107 -107 22.1 + vertex 107 -107 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -105.099 -105.865 22.1 + vertex -107 -107 22.1 + vertex -104.623 -105.985 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -105.509 -105.596 22.1 + vertex -107 -107 22.1 + vertex -105.099 -105.865 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -105.81 -105.209 22.1 + vertex -107 -107 22.1 + vertex -105.509 -105.596 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -105.97 -104.745 22.1 + vertex -107 -107 22.1 + vertex -105.81 -105.209 22.1 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -105.97 -104.255 22.1 + vertex -107 -107 22.1 + vertex -105.97 -104.745 22.1 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 107 -101 22.1 + vertex 107 -104.067 20.5 + vertex 107 -101 20.5 + endloop + endfacet + facet normal 1 -0 0 + outer loop + vertex 107 -107 22.1 + vertex 107 -104.067 20.5 + vertex 107 -101 22.1 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 107 -104.067 20.5 + vertex 107 -107 22.1 + vertex 107 -104.933 20.5 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 107 -104.933 20.5 + vertex 107 -107 22.1 + vertex 107 -107 20.5 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 107 107 22.1 + vertex 107 104.933 20.5 + vertex 107 107 20.5 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 107 107 22.1 + vertex 107 104.067 20.5 + vertex 107 104.933 20.5 + endloop + endfacet + facet normal 1 -0 0 + outer loop + vertex 107 101 22.1 + vertex 107 104.067 20.5 + vertex 107 107 22.1 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 107 104.067 20.5 + vertex 107 101 22.1 + vertex 107 101 20.5 + endloop + endfacet + facet normal 1 -0 0 + outer loop + vertex 107 -82 22.1 + vertex 107 82 20.5 + vertex 107 82 22.1 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 107 82 20.5 + vertex 107 -82 22.1 + vertex 107 -82 20.5 + endloop + endfacet + facet normal 0 1 -0 + outer loop + vertex 107 107 20.5 + vertex -107 107 22.1 + vertex 107 107 22.1 + endloop + endfacet + facet normal 0 1 0 + outer loop + vertex -107 107 22.1 + vertex 107 107 20.5 + vertex -107 107 20.5 + endloop + endfacet + facet normal 0 -1 0 + outer loop + vertex -107 -107 20.5 + vertex 107 -107 22.1 + vertex -107 -107 22.1 + endloop + endfacet + facet normal 0 -1 -0 + outer loop + vertex 107 -107 22.1 + vertex -107 -107 20.5 + vertex 107 -107 20.5 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -107 -82 22.13 + vertex -106.981 82 22.13 + vertex -106.981 -82 22.13 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex -106.981 82 22.13 + vertex -107 -82 22.13 + vertex -107 82 22.13 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -106.981 -82 22.13 + vertex 106.981 -82 22.13 + vertex 106.981 -101 22.13 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 106.981 -82 22.13 + vertex -106.981 -82 22.13 + vertex 106.981 82 22.13 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -106.981 -82 22.13 + vertex 106.981 -101 22.13 + vertex -106.981 -101 22.13 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex -106.981 82 22.13 + vertex 106.981 82 22.13 + vertex -106.981 -82 22.13 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 106.981 82 22.13 + vertex -106.981 82 22.13 + vertex 106.981 101 22.13 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 106.981 101 22.13 + vertex -106.981 82 22.13 + vertex -106.981 101 22.13 + endloop + endfacet + facet normal 0 0 -1 + outer loop + vertex 106.981 -82 22.13 + vertex 107 82 22.13 + vertex 107 -82 22.13 + endloop + endfacet + facet normal -0 0 -1 + outer loop + vertex 107 82 22.13 + vertex 106.981 -82 22.13 + vertex 106.981 82 22.13 + endloop + endfacet + facet normal 1 -0 0 + outer loop + vertex 107 -82 24.13 + vertex 107 82 22.13 + vertex 107 82 24.13 + endloop + endfacet + facet normal 1 0 0 + outer loop + vertex 107 82 22.13 + vertex 107 -82 24.13 + vertex 107 -82 22.13 + endloop + endfacet + facet normal -1 0 0 + outer loop + vertex -107 -82 22.13 + vertex -107 82 24.13 + vertex -107 82 22.13 + endloop + endfacet + facet normal -1 -0 0 + outer loop + vertex -107 82 24.13 + vertex -107 -82 22.13 + vertex -107 -82 24.13 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex -107 82 24.13 + vertex -106.981 -82 24.13 + vertex -106.981 82 24.13 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -106.981 -82 24.13 + vertex -107 82 24.13 + vertex -107 -82 24.13 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -106.981 82 24.13 + vertex 106.981 82 24.13 + vertex 106.981 101 24.13 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 106.981 82 24.13 + vertex -106.981 82 24.13 + vertex 106.981 -82 24.13 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -106.981 82 24.13 + vertex 106.981 101 24.13 + vertex -106.981 101 24.13 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex -106.981 -82 24.13 + vertex 106.981 -82 24.13 + vertex -106.981 82 24.13 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 106.981 -82 24.13 + vertex -106.981 -82 24.13 + vertex 106.981 -101 24.13 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 106.981 -101 24.13 + vertex -106.981 -82 24.13 + vertex -106.981 -101 24.13 + endloop + endfacet + facet normal -0 0 1 + outer loop + vertex 106.981 82 24.13 + vertex 107 -82 24.13 + vertex 107 82 24.13 + endloop + endfacet + facet normal 0 0 1 + outer loop + vertex 107 -82 24.13 + vertex 106.981 82 24.13 + vertex 106.981 -82 24.13 + endloop + endfacet +endsolid OpenSCAD_Model diff --git a/resources/profiles/general/Normal+Quality.cfg b/resources/profiles/general/Normal+Quality.cfg deleted file mode 100644 index 575c3343e2..0000000000 --- a/resources/profiles/general/Normal+Quality.cfg +++ /dev/null @@ -1,8 +0,0 @@ -[general] -version = 1 -name = Normal Quality -weight = -2 - -[settings] -speed_topbottom = 15 -speed_infill = 80 \ No newline at end of file diff --git a/resources/profiles/general/Ulti+Quality.cfg b/resources/profiles/general/Ulti+Quality.cfg deleted file mode 100644 index 1fa9b6085c..0000000000 --- a/resources/profiles/general/Ulti+Quality.cfg +++ /dev/null @@ -1,9 +0,0 @@ -[general] -version = 1 -name = Ulti Quality -weight = -4 - -[settings] -layer_height = 0.04 -speed_topbottom = 15 -speed_infill = 80 \ No newline at end of file diff --git a/resources/profiles/materials/abs.cfg b/resources/profiles/materials/abs.cfg deleted file mode 100644 index 67abc32810..0000000000 --- a/resources/profiles/materials/abs.cfg +++ /dev/null @@ -1,9 +0,0 @@ -[general] -version = 1 -type = material -name = ABS - -[settings] -material_print_temperature = 250 -material_bed_temperature = 80 -material_flow = 107 diff --git a/resources/profiles/materials/cpe.cfg b/resources/profiles/materials/cpe.cfg deleted file mode 100644 index 0621260745..0000000000 --- a/resources/profiles/materials/cpe.cfg +++ /dev/null @@ -1,8 +0,0 @@ -[general] -version = 1 -type = material -name = CPE - -[settings] -material_print_temperature = 250 -material_bed_temperature = 70 \ No newline at end of file diff --git a/resources/profiles/materials/pla.cfg b/resources/profiles/materials/pla.cfg deleted file mode 100644 index b5af61b9b6..0000000000 --- a/resources/profiles/materials/pla.cfg +++ /dev/null @@ -1,7 +0,0 @@ -[general] -version = 1 -type = material -name = PLA - -[settings] -material_bed_temperature = 60 \ No newline at end of file diff --git a/resources/profiles/ultimaker2+/pla_0.4_ulti.curaprofile b/resources/profiles/ultimaker2+/pla_0.4_ulti.curaprofile deleted file mode 100644 index db091d8e8d..0000000000 --- a/resources/profiles/ultimaker2+/pla_0.4_ulti.curaprofile +++ /dev/null @@ -1,21 +0,0 @@ -[general] -version = 1 -name = Ulti Quality -machine_type = ultimaker2plus -machine_variant = 0.4 mm -material = PLA -weight = -4 - -[settings] -line_width = 0.35 -layer_height = 0.04 -layer_height_0 = 0.26 -wall_thickness = 1.4 -top_bottom_thickness = 1.12 -infill_sparse_density = 25 -speed_print = 30 -speed_infill = 50 -speed_wall_x = 40 -speed_topbottom = 20 -speed_layer_0 = 25 -cool_min_layer_time_fan_speed_max = 15 diff --git a/resources/qml/Actions.qml b/resources/qml/Actions.qml index 003a3ceeec..7e03bd7102 100644 --- a/resources/qml/Actions.qml +++ b/resources/qml/Actions.qml @@ -1,9 +1,12 @@ // Copyright (c) 2015 Ultimaker B.V. // Cura is released under the terms of the AGPLv3 or higher. +pragma Singleton + import QtQuick 2.2 import QtQuick.Controls 1.1 import UM 1.1 as UM +import Cura 1.0 as Cura Item { @@ -45,6 +48,8 @@ Item property alias toggleFullScreen: toggleFullScreenAction; + property alias configureSettingVisibility: configureSettingVisibilityAction + UM.I18nCatalog{id: catalog; name:"cura"} Action @@ -60,6 +65,8 @@ Item text: catalog.i18nc("@action:inmenu menubar:edit","&Undo"); iconName: "edit-undo"; shortcut: StandardKey.Undo; + onTriggered: UM.OperationStack.undo(); + enabled: UM.OperationStack.canUndo; } Action @@ -68,6 +75,8 @@ Item text: catalog.i18nc("@action:inmenu menubar:edit","&Redo"); iconName: "edit-redo"; shortcut: StandardKey.Redo; + onTriggered: UM.OperationStack.redo(); + enabled: UM.OperationStack.canRedo; } Action @@ -101,22 +110,24 @@ Item Action { id: updateProfileAction; - enabled: UM.ActiveProfile.valid && !UM.ActiveProfile.readOnly && UM.ActiveProfile.hasCustomisedValues - text: catalog.i18nc("@action:inmenu menubar:profile","&Update Current Profile"); + enabled: Cura.MachineManager.isGlobalStackValid && Cura.MachineManager.hasUserSettings && !Cura.MachineManager.isReadOnly(Cura.MachineManager.activeQualityId) + text: catalog.i18nc("@action:inmenu menubar:profile","&Update profile with current settings"); + onTriggered: Cura.MachineManager.updateQualityContainerFromUserContainer() } Action { id: resetProfileAction; - enabled: UM.ActiveProfile.valid && UM.ActiveProfile.hasCustomisedValues - text: catalog.i18nc("@action:inmenu menubar:profile","&Reload Current Profile"); + enabled: Cura.MachineManager.hasUserSettings + text: catalog.i18nc("@action:inmenu menubar:profile","&Discard current settings"); + onTriggered: Cura.MachineManager.clearUserSettings(); } Action { id: addProfileAction; - enabled: UM.ActiveProfile.valid - text: catalog.i18nc("@action:inmenu menubar:profile","&Create New Profile..."); + enabled: Cura.MachineManager.isGlobalStackValid && Cura.MachineManager.hasUserSettings + text: catalog.i18nc("@action:inmenu menubar:profile","&Create profile from current settings..."); } Action @@ -132,12 +143,14 @@ Item text: catalog.i18nc("@action:inmenu menubar:help","Show Online &Documentation"); iconName: "help-contents"; shortcut: StandardKey.Help; + onTriggered: CuraActions.openDocumentation(); } Action { id: reportBugAction; text: catalog.i18nc("@action:inmenu menubar:help","Report a &Bug"); iconName: "tools-report-bug"; + onTriggered: CuraActions.openBugReportPage(); } Action @@ -154,6 +167,7 @@ Item enabled: UM.Controller.toolsEnabled; iconName: "edit-delete"; shortcut: StandardKey.Delete; + onTriggered: Printer.deleteSelection(); } Action @@ -176,6 +190,8 @@ Item text: catalog.i18nc("@action:inmenu menubar:edit","&Group Objects"); enabled: UM.Scene.numObjectsSelected > 1 ? true: false iconName: "object-group" + shortcut: "Ctrl+G"; + onTriggered: Printer.groupSelected(); } Action @@ -184,14 +200,18 @@ Item text: catalog.i18nc("@action:inmenu menubar:edit","Ungroup Objects"); enabled: UM.Scene.isGroupSelected iconName: "object-ungroup" + shortcut: "Ctrl+Shift+G"; + onTriggered: Printer.ungroupSelected(); } - + Action { id: mergeObjectsAction text: catalog.i18nc("@action:inmenu menubar:edit","&Merge Objects"); enabled: UM.Scene.numObjectsSelected > 1 ? true: false iconName: "merge"; + shortcut: "Ctrl+Alt+G"; + onTriggered: Printer.mergeSelected(); } Action @@ -208,6 +228,7 @@ Item enabled: UM.Controller.toolsEnabled; iconName: "edit-delete"; shortcut: "Ctrl+D"; + onTriggered: Printer.deleteAll(); } Action @@ -215,18 +236,21 @@ Item id: reloadAllAction; text: catalog.i18nc("@action:inmenu menubar:file","Re&load All Objects"); iconName: "document-revert"; + onTriggered: Printer.reloadAll(); } Action { id: resetAllTranslationAction; text: catalog.i18nc("@action:inmenu menubar:edit","Reset All Object Positions"); + onTriggered: Printer.resetAllTranslation(); } Action { id: resetAllAction; text: catalog.i18nc("@action:inmenu menubar:edit","Reset All Object &Transformations"); + onTriggered: Printer.resetAll(); } Action @@ -244,4 +268,10 @@ Item iconName: "view-list-text"; shortcut: StandardKey.WhatsThis; } + + Action + { + id: configureSettingVisibilityAction + text: catalog.i18nc("@action:menu", "Configure setting visiblity..."); + } } diff --git a/resources/qml/AddMachineDialog.qml b/resources/qml/AddMachineDialog.qml new file mode 100644 index 0000000000..9d2d1a24ff --- /dev/null +++ b/resources/qml/AddMachineDialog.qml @@ -0,0 +1,178 @@ +// Copyright (c) 2016 Ultimaker B.V. +// Cura is released under the terms of the AGPLv3 or higher. + +import QtQuick 2.2 +import QtQuick.Controls 1.1 +import QtQuick.Layouts 1.1 +import QtQuick.Window 2.1 + +import QtQuick.Controls.Styles 1.1 + +import UM 1.2 as UM +import Cura 1.0 as Cura + + +UM.Dialog +{ + id: base + title: catalog.i18nc("@title:window", "Add Printer") + property string activeManufacturer: "Ultimaker"; + + function getMachineName() + { + var name = machineList.model.getItem(machineList.currentIndex).name + return name + } + + ScrollView + { + id: machinesHolder + + anchors + { + left: parent.left; + top: parent.top; + right: parent.right; + bottom: parent.bottom; + } + ListView + { + id: machineList + + model: UM.DefinitionContainersModel + { + id: machineDefinitionsModel + filter: {"visible":true} + } + section.property: "manufacturer" + section.delegate: Button + { + text: section + style: ButtonStyle + { + background: Rectangle + { + border.width: 0 + color: "transparent"; + height: UM.Theme.getSize("standard_list_lineheight").height + width: machineList.width + } + label: Label + { + anchors.left: parent.left + anchors.leftMargin: UM.Theme.getSize("standard_arrow").width + UM.Theme.getSize("default_margin").width + text: control.text + color: palette.windowText + font.bold: true + UM.RecolorImage + { + id: downArrow + anchors.verticalCenter: parent.verticalCenter + anchors.right: parent.left + anchors.rightMargin: UM.Theme.getSize("default_margin").width + width: UM.Theme.getSize("standard_arrow").width + height: UM.Theme.getSize("standard_arrow").height + sourceSize.width: width + sourceSize.height: width + color: palette.windowText + source: base.activeManufacturer == section ? UM.Theme.getIcon("arrow_bottom") : UM.Theme.getIcon("arrow_right") + } + } + } + + onClicked: + { + base.activeManufacturer = section; + machineList.currentIndex = machineList.model.find("manufacturer", section) + machineName.text = getMachineName() + } + } + + delegate: RadioButton + { + id: machineButton + + anchors.left: parent.left + anchors.leftMargin: UM.Theme.getSize("standard_list_lineheight").width + + opacity: 1; + height: UM.Theme.getSize("standard_list_lineheight").height; + + checked: ListView.isCurrentItem; + + exclusiveGroup: printerGroup; + + text: model.name + + onClicked: + { + ListView.view.currentIndex = index; + machineName.text = getMachineName() + } + + states: State + { + name: "collapsed"; + when: base.activeManufacturer != model.manufacturer; + + PropertyChanges { target: machineButton; opacity: 0; height: 0; } + } + + transitions: + [ + Transition + { + to: "collapsed"; + SequentialAnimation + { + NumberAnimation { property: "opacity"; duration: 75; } + NumberAnimation { property: "height"; duration: 75; } + } + }, + Transition + { + from: "collapsed"; + SequentialAnimation + { + NumberAnimation { property: "height"; duration: 75; } + NumberAnimation { property: "opacity"; duration: 75; } + } + } + ] + } + } + } + + TextField + { + id: machineName; + text: getMachineName() + implicitWidth: UM.Theme.getSize("standard_list_input").width + maximumLength: 40 + anchors.bottom:parent.bottom + } + + Button + { + text: catalog.i18nc("@action:button", "Add Printer") + anchors.bottom: parent.bottom + anchors.right: parent.right + onClicked: + { + base.visible = false + var item = machineList.model.getItem(machineList.currentIndex); + Cura.MachineManager.addMachine(machineName.text, item.id) + } + } + + Item + { + UM.I18nCatalog + { + id: catalog; + name: "cura"; + } + SystemPalette { id: palette } + ExclusiveGroup { id: printerGroup; } + } +} diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index 1759eabfc6..6dd57e17c8 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -7,7 +7,8 @@ import QtQuick.Controls.Styles 1.1 import QtQuick.Layouts 1.1 import QtQuick.Dialogs 1.1 -import UM 1.1 as UM +import UM 1.2 as UM +import Cura 1.0 as Cura UM.MainWindow { @@ -53,7 +54,7 @@ UM.MainWindow title: catalog.i18nc("@title:menu menubar:toplevel","&File"); MenuItem { - action: actions.open; + action: Cura.Actions.open; } Menu @@ -92,7 +93,7 @@ UM.MainWindow text: catalog.i18nc("@action:inmenu menubar:file", "&Save Selection to File"); enabled: UM.Selection.hasSelection; iconName: "document-save-as"; - onTriggered: UM.OutputDeviceManager.requestWriteSelectionToDevice("local_file", Printer.jobName, { "filter_by_machine": false }); + onTriggered: UM.OutputDeviceManager.requestWriteSelectionToDevice("local_file", PrintInformation.jobName, { "filter_by_machine": false }); } Menu { @@ -108,18 +109,18 @@ UM.MainWindow MenuItem { text: model.description; - onTriggered: UM.OutputDeviceManager.requestWriteToDevice(model.id, Printer.jobName, { "filter_by_machine": false }); + onTriggered: UM.OutputDeviceManager.requestWriteToDevice(model.id, PrintInformation.jobName, { "filter_by_machine": false }); } onObjectAdded: saveAllMenu.insertItem(index, object) onObjectRemoved: saveAllMenu.removeItem(object) } } - MenuItem { action: actions.reloadAll; } + MenuItem { action: Cura.Actions.reloadAll; } MenuSeparator { } - MenuItem { action: actions.quit; } + MenuItem { action: Cura.Actions.quit; } } Menu @@ -127,17 +128,17 @@ UM.MainWindow //: Edit menu title: catalog.i18nc("@title:menu menubar:toplevel","&Edit"); - MenuItem { action: actions.undo; } - MenuItem { action: actions.redo; } + MenuItem { action: Cura.Actions.undo; } + MenuItem { action: Cura.Actions.redo; } MenuSeparator { } - MenuItem { action: actions.deleteSelection; } - MenuItem { action: actions.deleteAll; } - MenuItem { action: actions.resetAllTranslation; } - MenuItem { action: actions.resetAll; } + MenuItem { action: Cura.Actions.deleteSelection; } + MenuItem { action: Cura.Actions.deleteAll; } + MenuItem { action: Cura.Actions.resetAllTranslation; } + MenuItem { action: Cura.Actions.resetAll; } MenuSeparator { } - MenuItem { action: actions.groupObjects;} - MenuItem { action: actions.mergeObjects;} - MenuItem { action: actions.unGroupObjects;} + MenuItem { action: Cura.Actions.groupObjects;} + MenuItem { action: Cura.Actions.mergeObjects;} + MenuItem { action: Cura.Actions.unGroupObjects;} } Menu @@ -168,14 +169,17 @@ UM.MainWindow Instantiator { - model: UM.MachineInstancesModel { } + model: UM.ContainerStacksModel + { + filter: {"type": "machine"} + } MenuItem { text: model.name; checkable: true; - checked: model.active; + checked: Cura.MachineManager.activeMachineId == model.id exclusiveGroup: machineMenuGroup; - onTriggered: UM.MachineManager.setActiveMachineInstance(model.name) + onTriggered: Cura.MachineManager.setActiveMachine(model.id); } onObjectAdded: machineMenu.insertItem(index, object) onObjectRemoved: machineMenu.removeItem(object) @@ -187,13 +191,20 @@ UM.MainWindow Instantiator { - model: UM.MachineVariantsModel { } + model: UM.InstanceContainersModel + { + filter: + { + "type": "variant", + "definition": Cura.MachineManager.activeDefinitionId //Only show variants of this machine + } + } MenuItem { text: model.name; checkable: true; - checked: model.active; + checked: model.id == Cura.MachineManager.activeVariantId; exclusiveGroup: machineVariantsGroup; - onTriggered: UM.MachineManager.setActiveMachineVariant(model.name) + onTriggered: Cura.MachineManager.setActiveVariant(model.id) } onObjectAdded: machineMenu.insertItem(index, object) onObjectRemoved: machineMenu.removeItem(object) @@ -201,10 +212,10 @@ UM.MainWindow ExclusiveGroup { id: machineVariantsGroup; } - MenuSeparator { visible: UM.MachineManager.hasVariants; } + MenuSeparator { visible: Cura.MachineManager.hasVariants; } - MenuItem { action: actions.addMachine; } - MenuItem { action: actions.configureMachines; } + MenuItem { action: Cura.Actions.addMachine; } + MenuItem { action: Cura.Actions.configureMachines; } } Menu @@ -215,7 +226,26 @@ UM.MainWindow Instantiator { id: profileMenuInstantiator - model: UM.ProfilesModel {} + model: UM.InstanceContainersModel + { + filter: + { + var result = { "type": "quality" }; + if(Cura.MachineManager.filterQualityByMachine) + { + result.definition = Cura.MachineManager.activeDefinitionId; + if(Cura.MachineManager.hasMaterials) + { + result.material = Cura.MachineManager.activeMaterialId; + } + } + else + { + result.definition = "fdmprinter" + } + return result + } + } property int separatorIndex: -1 Loader { @@ -258,30 +288,20 @@ UM.MainWindow { id: item text: model_data ? model_data.name : "" - checkable: true; - checked: model_data ? model_data.active : false; - exclusiveGroup: profileMenuGroup; - onTriggered: - { - UM.MachineManager.setActiveProfile(model_data.name); - if (!model_data.active) { - //Selecting a profile was canceled; undo menu selection - profileMenuInstantiator.model.setProperty(model_index, "active", false); - var activeProfileName = UM.MachineManager.activeProfile; - var activeProfileIndex = profileMenuInstantiator.model.find("name", activeProfileName); - profileMenuInstantiator.model.setProperty(activeProfileIndex, "active", true); - } - } + checkable: true + checked: Cura.MachineManager.activeQualityId == model_data.id + exclusiveGroup: profileMenuGroup + onTriggered: Cura.MachineManager.setActiveQuality(model_data.id) } } MenuSeparator { id: profileMenuSeparator } - MenuItem { action: actions.updateProfile; } - MenuItem { action: actions.resetProfile; } - MenuItem { action: actions.addProfile; } + MenuItem { action: Cura.Actions.addProfile } + MenuItem { action: Cura.Actions.updateProfile } + MenuItem { action: Cura.Actions.resetProfile } MenuSeparator { } - MenuItem { action: actions.manageProfiles; } + MenuItem { action: Cura.Actions.manageProfiles } } Menu @@ -292,7 +312,8 @@ UM.MainWindow Instantiator { - model: UM.Models.extensionModel + id: extensions + model: UM.ExtensionModel { } Menu { @@ -306,7 +327,7 @@ UM.MainWindow MenuItem { text: model.text - onTriggered: UM.Models.extensionModel.subMenuTriggered(name, model.text) + onTriggered: extensions.model.subMenuTriggered(name, model.text) } onObjectAdded: sub_menu.insertItem(index, object) onObjectRemoved: sub_menu.removeItem(object) @@ -323,7 +344,7 @@ UM.MainWindow //: Settings menu title: catalog.i18nc("@title:menu menubar:toplevel","&Settings"); - MenuItem { action: actions.preferences; } + MenuItem { action: Cura.Actions.preferences; } } Menu @@ -331,11 +352,11 @@ UM.MainWindow //: Help menu title: catalog.i18nc("@title:menu menubar:toplevel","&Help"); - MenuItem { action: actions.showEngineLog; } - MenuItem { action: actions.documentation; } - MenuItem { action: actions.reportBug; } + MenuItem { action: Cura.Actions.showEngineLog; } + MenuItem { action: Cura.Actions.documentation; } + MenuItem { action: Cura.Actions.reportBug; } MenuSeparator { } - MenuItem { action: actions.about; } + MenuItem { action: Cura.Actions.about; } } } @@ -425,7 +446,7 @@ UM.MainWindow left: parent.left; //leftMargin: UM.Theme.getSize("loadfile_margin").width } - action: actions.open; + action: Cura.Actions.open; } Image @@ -512,23 +533,6 @@ UM.MainWindow } width: UM.Theme.getSize("sidebar").width; - - addMachineAction: actions.addMachine; - configureMachinesAction: actions.configureMachines; - addProfileAction: actions.addProfile; - updateProfileAction: actions.updateProfile; - resetProfileAction: actions.resetProfile; - manageProfilesAction: actions.manageProfiles; - - configureSettingsAction: Action - { - onTriggered: - { - preferences.visible = true; - preferences.setPage(2); - preferences.getCurrentItem().scrollToSection(source.key); - } - } } } } @@ -541,10 +545,13 @@ UM.MainWindow { //; Remove & re-add the general page as we want to use our own instead of uranium standard. removePage(0); - insertPage(0, catalog.i18nc("@title:tab","General"), Qt.resolvedUrl("GeneralPage.qml")); + insertPage(0, catalog.i18nc("@title:tab","General"), Qt.resolvedUrl("Preferences/GeneralPage.qml")); - //: View preferences page title - insertPage(1, catalog.i18nc("@title:tab","View"), Qt.resolvedUrl("ViewPage.qml")); + insertPage(2, catalog.i18nc("@title:tab", "Printers"), Qt.resolvedUrl("Preferences/MachinesPage.qml")); + + insertPage(3, catalog.i18nc("@title:tab", "Materials"), Qt.resolvedUrl("Preferences/MaterialsPage.qml")); + + insertPage(4, catalog.i18nc("@title:tab", "Profiles"), Qt.resolvedUrl("Preferences/ProfilesPage.qml")); //Force refresh setPage(0); @@ -561,101 +568,55 @@ UM.MainWindow } } - Actions + Connections { - id: actions; + target: Cura.Actions.preferences + onTriggered: preferences.visible = true + } - open.onTriggered: openDialog.open(); - - quit.onTriggered: base.visible = false; - - undo.onTriggered: UM.OperationStack.undo(); - undo.enabled: UM.OperationStack.canUndo; - redo.onTriggered: UM.OperationStack.redo(); - redo.enabled: UM.OperationStack.canRedo; - - deleteSelection.onTriggered: + Connections + { + target: Cura.Actions.addProfile + onTriggered: { - Printer.deleteSelection(); - } - - deleteObject.onTriggered: - { - if(objectContextMenu.objectId != 0) - { - Printer.deleteObject(objectContextMenu.objectId); - objectContextMenu.objectId = 0; - } - } - - multiplyObject.onTriggered: - { - if(objectContextMenu.objectId != 0) - { - Printer.multiplyObject(objectContextMenu.objectId, 1); - objectContextMenu.objectId = 0; - } - } - - centerObject.onTriggered: - { - if(objectContextMenu.objectId != 0) - { - Printer.centerObject(objectContextMenu.objectId); - objectContextMenu.objectId = 0; - } - } - - groupObjects.onTriggered: - { - Printer.groupSelected(); - } - - unGroupObjects.onTriggered: - { - Printer.ungroupSelected(); - } - - mergeObjects.onTriggered: - { - Printer.mergeSelected(); - } - - deleteAll.onTriggered: Printer.deleteAll(); - resetAllTranslation.onTriggered: Printer.resetAllTranslation(); - resetAll.onTriggered: Printer.resetAll(); - reloadAll.onTriggered: Printer.reloadAll(); - - addMachine.onTriggered: addMachineWizard.visible = true; - addProfile.onTriggered: - { - UM.MachineManager.createProfile(); + Cura.MachineManager.newQualityContainerFromQualityAndUser(); preferences.setPage(4); preferences.show(); // Show the renameDialog after a very short delay so the preference page has time to initiate showProfileNameDialogTimer.start(); } - updateProfile.onTriggered: UM.ActiveProfile.updateProfile(); - resetProfile.onTriggered: UM.ActiveProfile.discardChanges(); + } - preferences.onTriggered: preferences.visible = true; - configureMachines.onTriggered: + Connections + { + target: Cura.Actions.configureMachines + onTriggered: { preferences.visible = true; - preferences.setPage(3); + preferences.setPage(2); } - manageProfiles.onTriggered: + } + + Connections + { + target: Cura.Actions.manageProfiles + onTriggered: { preferences.visible = true; preferences.setPage(4); } + } - documentation.onTriggered: CuraActions.openDocumentation(); - reportBug.onTriggered: CuraActions.openBugReportPage(); - showEngineLog.onTriggered: engineLog.visible = true; - about.onTriggered: aboutDialog.visible = true; - toggleFullScreen.onTriggered: base.toggleFullscreen(); + Connections + { + target: Cura.Actions.configureSettingVisibility + onTriggered: + { + preferences.visible = true; + preferences.setPage(1); + preferences.getCurrentItem().scrollToSection(source.key); + } } Timer @@ -672,29 +633,70 @@ UM.MainWindow id: objectContextMenu; property variant objectId: -1; - MenuItem { action: actions.centerObject; } - MenuItem { action: actions.deleteObject; } - MenuItem { action: actions.multiplyObject; } + MenuItem { action: Cura.Actions.centerObject; } + MenuItem { action: Cura.Actions.deleteObject; } + MenuItem { action: Cura.Actions.multiplyObject; } MenuSeparator { } - MenuItem { action: actions.deleteAll; } - MenuItem { action: actions.reloadAll; } - MenuItem { action: actions.resetAllTranslation; } - MenuItem { action: actions.resetAll; } - MenuItem { action: actions.groupObjects; } - MenuItem { action: actions.mergeObjects; } - MenuItem { action: actions.unGroupObjects; } + MenuItem { action: Cura.Actions.deleteAll; } + MenuItem { action: Cura.Actions.reloadAll; } + MenuItem { action: Cura.Actions.resetAllTranslation; } + MenuItem { action: Cura.Actions.resetAll; } + MenuSeparator { } + MenuItem { action: Cura.Actions.groupObjects; } + MenuItem { action: Cura.Actions.mergeObjects; } + MenuItem { action: Cura.Actions.unGroupObjects; } + + Connections + { + target: Cura.Actions.deleteObject + onTriggered: + { + if(objectContextMenu.objectId != 0) + { + Printer.deleteObject(objectContextMenu.objectId); + objectContextMenu.objectId = 0; + } + } + } + + Connections + { + target: Cura.Actions.multiplyObject + onTriggered: + { + if(objectContextMenu.objectId != 0) + { + Printer.multiplyObject(objectContextMenu.objectId, 1); + objectContextMenu.objectId = 0; + } + } + } + + Connections + { + target: Cura.Actions.centerObject + onTriggered: + { + if(objectContextMenu.objectId != 0) + { + Printer.centerObject(objectContextMenu.objectId); + objectContextMenu.objectId = 0; + } + } + } } Menu { id: contextMenu; - MenuItem { action: actions.deleteAll; } - MenuItem { action: actions.reloadAll; } - MenuItem { action: actions.resetAllTranslation; } - MenuItem { action: actions.resetAll; } - MenuItem { action: actions.groupObjects; } - MenuItem { action: actions.mergeObjects; } - MenuItem { action: actions.unGroupObjects; } + MenuItem { action: Cura.Actions.deleteAll; } + MenuItem { action: Cura.Actions.reloadAll; } + MenuItem { action: Cura.Actions.resetAllTranslation; } + MenuItem { action: Cura.Actions.resetAll; } + MenuSeparator { } + MenuItem { action: Cura.Actions.groupObjects; } + MenuItem { action: Cura.Actions.mergeObjects; } + MenuItem { action: Cura.Actions.unGroupObjects; } } Connections @@ -713,6 +715,18 @@ UM.MainWindow } } + Connections + { + target: Cura.Actions.quit + onTriggered: base.visible = false; + } + + Connections + { + target: Cura.Actions.toggleFullScreen + onTriggered: base.toggleFullscreen(); + } + FileDialog { id: openDialog; @@ -737,14 +751,32 @@ UM.MainWindow } } + Connections + { + target: Cura.Actions.open + onTriggered: openDialog.open() + } + EngineLog { id: engineLog; } - AddMachineWizard + Connections { - id: addMachineWizard + target: Cura.Actions.showEngineLog + onTriggered: engineLog.visible = true; + } + + AddMachineDialog + { + id: addMachineDialog + } + + Connections + { + target: Cura.Actions.addMachine + onTriggered: addMachineDialog.visible = true; } AboutDialog @@ -752,13 +784,19 @@ UM.MainWindow id: aboutDialog } + Connections + { + target: Cura.Actions.about + onTriggered: aboutDialog.visible = true; + } + Connections { target: Printer onRequestAddPrinter: { - addMachineWizard.visible = true - addMachineWizard.firstRun = false + addMachineDialog.visible = true + addMachineDialog.firstRun = false } } @@ -775,10 +813,9 @@ UM.MainWindow base.visible = true; restart(); } - else if(UM.MachineManager.activeMachineInstance == "") + else if(Cura.MachineManager.activeMachineId == null || Cura.MachineManager.activeMachineId == "") { - addMachineWizard.firstRun = true; - addMachineWizard.open(); + addMachineDialog.open(); } } } diff --git a/resources/qml/GeneralPage.qml b/resources/qml/GeneralPage.qml deleted file mode 100644 index b2ff44b15a..0000000000 --- a/resources/qml/GeneralPage.qml +++ /dev/null @@ -1,167 +0,0 @@ -// Copyright (c) 2015 Ultimaker B.V. -// Uranium is released under the terms of the AGPLv3 or higher. - -import QtQuick 2.1 -import QtQuick.Controls 1.1 -import QtQuick.Layouts 1.1 -import QtQuick.Controls.Styles 1.1 - -import UM 1.1 as UM - -UM.PreferencesPage -{ - //: General configuration page title - title: catalog.i18nc("@title:tab","General") - - function setDefaultLanguage(languageCode) - { - //loops trough the languageList and sets the language using the languageCode - for(var i = 0; i < languageList.count; i++) - { - if (languageComboBox.model.get(i).code == languageCode) - { - languageComboBox.currentIndex = i - } - } - } - - function reset() - { - UM.Preferences.resetPreference("general/language") - UM.Preferences.resetPreference("physics/automatic_push_free") - UM.Preferences.resetPreference("mesh/scale_to_fit") - UM.Preferences.resetPreference("info/send_slice_info") - pushFreeCheckbox.checked = boolCheck(UM.Preferences.getValue("physics/automatic_push_free")) - sendDataCheckbox.checked = boolCheck(UM.Preferences.getValue("info/send_slice_info")) - scaleToFitCheckbox.checked = boolCheck(UM.Preferences.getValue("mesh/scale_to_fit")) - var defaultLanguage = UM.Preferences.getValue("general/language") - setDefaultLanguage(defaultLanguage) - } - - ColumnLayout - { - //: Language selection label - UM.I18nCatalog{id: catalog; name:"cura"} - - RowLayout - { - Label - { - id: languageLabel - text: catalog.i18nc("@label","Language:") - } - - ComboBox - { - id: languageComboBox - model: ListModel - { - id: languageList - - Component.onCompleted: { - append({ text: catalog.i18nc("@item:inlistbox", "English"), code: "en" }) - append({ text: catalog.i18nc("@item:inlistbox", "Finnish"), code: "fi" }) - append({ text: catalog.i18nc("@item:inlistbox", "French"), code: "fr" }) - append({ text: catalog.i18nc("@item:inlistbox", "German"), code: "de" }) - append({ text: catalog.i18nc("@item:inlistbox", "Italian"), code: "it" }) - append({ text: catalog.i18nc("@item:inlistbox", "Dutch"), code: "nl" }) - append({ text: catalog.i18nc("@item:inlistbox", "Spanish"), code: "es" }) - } - } - - currentIndex: - { - var code = UM.Preferences.getValue("general/language"); - for(var i = 0; i < languageList.count; ++i) - { - if(model.get(i).code == code) - { - return i - } - } - } - onActivated: UM.Preferences.setValue("general/language", model.get(index).code) - - Component.onCompleted: - { - // Because ListModel is stupid and does not allow using qsTr() for values. - for(var i = 0; i < languageList.count; ++i) - { - languageList.setProperty(i, "text", catalog.i18n(languageList.get(i).text)); - } - - // Glorious hack time. ComboBox does not update the text properly after changing the - // model. So change the indices around to force it to update. - currentIndex += 1; - currentIndex -= 1; - } - } - } - - Label - { - id: languageCaption - - //: Language change warning - text: catalog.i18nc("@label", "You will need to restart the application for language changes to have effect.") - wrapMode: Text.WordWrap - font.italic: true - } - - UM.TooltipArea { - width: childrenRect.width - height: childrenRect.height - text: catalog.i18nc("@info:tooltip", "Should objects on the platform be moved so that they no longer intersect.") - - CheckBox - { - id: pushFreeCheckbox - text: catalog.i18nc("@option:check", "Ensure objects are kept apart") - checked: boolCheck(UM.Preferences.getValue("physics/automatic_push_free")) - onCheckedChanged: UM.Preferences.setValue("physics/automatic_push_free", checked) - } - } - - UM.TooltipArea { - width: childrenRect.width - height: childrenRect.height - text: catalog.i18nc("@info:tooltip","Should opened files be scaled to the build volume if they are too large?") - - CheckBox - { - id: scaleToFitCheckbox - text: catalog.i18nc("@option:check","Scale large files") - checked: boolCheck(UM.Preferences.getValue("mesh/scale_to_fit")) - onCheckedChanged: UM.Preferences.setValue("mesh/scale_to_fit", checked) - } - } - - UM.TooltipArea { - width: childrenRect.width - height: childrenRect.height - text: catalog.i18nc("@info:tooltip","Should opened files be scaled up if they are extremely small?") - - CheckBox - { - id: scaleTinyCheckbox - text: catalog.i18nc("@option:check","Scale extremely small files") - checked: boolCheck(UM.Preferences.getValue("mesh/scale_tiny_meshes")) - onCheckedChanged: UM.Preferences.setValue("mesh/scale_tiny_meshes", checked) - } - } - - UM.TooltipArea { - width: childrenRect.width - height: childrenRect.height - text: catalog.i18nc("@info:tooltip","Should anonymous data about your print be sent to Ultimaker? Note, no models, IP addresses or other personally identifiable information is sent or stored.") - - CheckBox - { - id: sendDataCheckbox - text: catalog.i18nc("@option:check","Send (anonymous) print information") - checked: boolCheck(UM.Preferences.getValue("info/send_slice_info")) - onCheckedChanged: UM.Preferences.setValue("info/send_slice_info", checked) - } - } - } -} diff --git a/resources/qml/JobSpecs.qml b/resources/qml/JobSpecs.qml index fac4fd841d..e73bf145de 100644 --- a/resources/qml/JobSpecs.qml +++ b/resources/qml/JobSpecs.qml @@ -7,53 +7,33 @@ import QtQuick.Controls.Styles 1.1 import QtQuick.Layouts 1.1 import UM 1.1 as UM +import Cura 1.0 as Cura Rectangle { - id: base; + id: base - property bool activity: Printer.getPlatformActivity; + property bool activity: Printer.getPlatformActivity property string fileBaseName - property variant activeMachineInstance: UM.MachineManager.activeMachineInstance + property variant activeMachineName: Cura.MachineManager.activeMachineName - onActiveMachineInstanceChanged: + onActiveMachineNameChanged: { - base.createFileName() + printJobTextfield.text = PrintInformation.createJobName(base.fileBaseName); } UM.I18nCatalog { id: catalog; name:"cura"} - property variant printDuration: PrintInformation.currentPrintTime; - property real printMaterialAmount: PrintInformation.materialAmount; + property variant printDuration: PrintInformation.currentPrintTime + property real printMaterialAmount: PrintInformation.materialAmount height: childrenRect.height color: "transparent" - function createFileName(){ - var splitMachineName = UM.MachineManager.activeMachineInstance.split(" ") - var abbrMachine = '' - for (var i = 0; i < splitMachineName.length; i++){ - if (splitMachineName[i].search(/ultimaker/i) != -1){ - abbrMachine += 'UM' - } - else{ - if (splitMachineName[i].charAt(0).search(/[0-9]/g) == -1) - abbrMachine += splitMachineName[i].charAt(0) - } - var regExpAdditives = /[0-9\+]/g; - var resultAdditives = splitMachineName[i].match(regExpAdditives); - if (resultAdditives != null){ - for (var j = 0; j < resultAdditives.length; j++){ - abbrMachine += resultAdditives[j] - - } - } - } - printJobTextfield.text = abbrMachine + '_' + base.fileBaseName - } - - Connections { + Connections + { target: backgroundItem - onHasMesh: { + onHasMesh: + { base.fileBaseName = name } } @@ -61,20 +41,20 @@ Rectangle { onActivityChanged: { if (activity == true && base.fileBaseName == ''){ //this only runs when you open a file from the terminal (or something that works the same way; for example when you drag a file on the icon in MacOS or use 'open with' on Windows) - base.fileBaseName = Printer.jobName //it gets the fileBaseName from CuraApplication.py because this saves the filebase when the file is opened using the terminal (or something alike) - base.createFileName() + base.fileBaseName = PrintInformation.jobName; //get the fileBaseName from PrintInformation.py because this saves the filebase when the file is opened using the terminal (or something alike) + printJobTextfield.text = PrintInformation.createJobName(base.fileBaseName); } if (activity == true && base.fileBaseName != ''){ //this runs in all other cases where there is a mesh on the buildplate (activity == true). It uses the fileBaseName from the hasMesh signal - base.createFileName() + printJobTextfield.text = PrintInformation.createJobName(base.fileBaseName); } if (activity == false){ //When there is no mesh in the buildplate; the printJobTextField is set to an empty string so it doesn't set an empty string as a jobName (which is later used for saving the file) - printJobTextfield.text = '' + printJobTextfield.text = ''; } } - Rectangle + Rectangle { id: jobNameRow anchors.top: parent.top @@ -95,22 +75,22 @@ Rectangle { width: UM.Theme.getSize("save_button_specs_icons").width height: UM.Theme.getSize("save_button_specs_icons").height - onClicked: + onClicked: { - printJobTextfield.selectAll() - printJobTextfield.focus = true + printJobTextfield.selectAll(); + printJobTextfield.focus = true; } style: ButtonStyle { background: Rectangle { color: "transparent" - UM.RecolorImage + UM.RecolorImage { - width: UM.Theme.getSize("save_button_specs_icons").width - height: UM.Theme.getSize("save_button_specs_icons").height - sourceSize.width: width - sourceSize.height: width + width: UM.Theme.getSize("save_button_specs_icons").width; + height: UM.Theme.getSize("save_button_specs_icons").height; + sourceSize.width: width; + sourceSize.height: width; color: control.hovered ? UM.Theme.getColor("setting_control_button_hover") : UM.Theme.getColor("text"); source: UM.Theme.getIcon("pencil"); } @@ -130,15 +110,15 @@ Rectangle { text: '' horizontalAlignment: TextInput.AlignRight onTextChanged: { - Printer.setJobName(text) + PrintInformation.setJobName(text); } onEditingFinished: { if (printJobTextfield.text != ''){ - printJobTextfield.focus = false + printJobTextfield.focus = false; } } validator: RegExpValidator { - regExp: /^[^\\ \/ \.]*$/ + regExp: /^[^\\ \/ \*\?\|\[\]]*$/ } style: TextFieldStyle{ textColor: UM.Theme.getColor("setting_control_text"); @@ -183,7 +163,7 @@ Rectangle { sourceSize.width: width sourceSize.height: width color: UM.Theme.getColor("text_subtext") - source: UM.Theme.getIcon("print_time"); + source: UM.Theme.getIcon("print_time") } Label{ id: timeSpec @@ -204,7 +184,7 @@ Rectangle { sourceSize.width: width sourceSize.height: width color: UM.Theme.getColor("text_subtext") - source: UM.Theme.getIcon("category_material"); + source: UM.Theme.getIcon("category_material") } Label{ id: lengthSpec @@ -212,7 +192,7 @@ Rectangle { anchors.verticalCenter: parent.verticalCenter font: UM.Theme.getFont("small") color: UM.Theme.getColor("text_subtext") - text: base.printMaterialAmount <= 0 ? catalog.i18nc("@label", "0.0 m") : catalog.i18nc("@label", "%1 m").arg(base.printMaterialAmount) + text: catalog.i18nc("@label", "%1 m").arg(base.printMaterialAmount > 0 ? base.printMaterialAmount : 0) } } } diff --git a/resources/qml/Preferences/GeneralPage.qml b/resources/qml/Preferences/GeneralPage.qml new file mode 100644 index 0000000000..2886f94d92 --- /dev/null +++ b/resources/qml/Preferences/GeneralPage.qml @@ -0,0 +1,326 @@ +// Copyright (c) 2015 Ultimaker B.V. +// Uranium is released under the terms of the AGPLv3 or higher. + +import QtQuick 2.1 +import QtQuick.Controls 1.1 +import QtQuick.Layouts 1.1 +import QtQuick.Controls.Styles 1.1 + +import UM 1.1 as UM + +UM.PreferencesPage +{ + //: General configuration page title + title: catalog.i18nc("@title:tab","General") + + function setDefaultLanguage(languageCode) + { + //loops trough the languageList and sets the language using the languageCode + for(var i = 0; i < languageList.count; i++) + { + if (languageComboBox.model.get(i).code == languageCode) + { + languageComboBox.currentIndex = i + } + } + } + + function reset() + { + UM.Preferences.resetPreference("general/language") + var defaultLanguage = UM.Preferences.getValue("general/language") + setDefaultLanguage(defaultLanguage) + + UM.Preferences.resetPreference("physics/automatic_push_free") + pushFreeCheckbox.checked = boolCheck(UM.Preferences.getValue("physics/automatic_push_free")) + UM.Preferences.resetPreference("mesh/scale_to_fit") + scaleToFitCheckbox.checked = boolCheck(UM.Preferences.getValue("mesh/scale_to_fit")) + UM.Preferences.resetPreference("mesh/scale_tiny_meshes") + scaleTinyCheckbox.checked = boolCheck(UM.Preferences.getValue("mesh/scale_tiny_meshes")) + UM.Preferences.resetPreference("cura/jobname_prefix") + prefixJobNameCheckbox.checked = boolCheck(UM.Preferences.getValue("cura/jobname_prefix")) + UM.Preferences.resetPreference("view/show_overhang"); + showOverhangCheckbox.checked = boolCheck(UM.Preferences.getValue("view/show_overhang")) + UM.Preferences.resetPreference("view/center_on_select"); + centerOnSelectCheckbox.checked = boolCheck(UM.Preferences.getValue("view/center_on_select")) + UM.Preferences.resetPreference("view/top_layer_count"); + topLayerCountCheckbox.checked = boolCheck(UM.Preferences.getValue("view/top_layer_count")) + + if (plugins.model.find("id", "SliceInfoPlugin") > -1) { + UM.Preferences.resetPreference("info/send_slice_info") + sendDataCheckbox.checked = boolCheck(UM.Preferences.getValue("info/send_slice_info")) + } + if (plugins.model.find("id", "UpdateChecker") > -1) { + UM.Preferences.resetPreference("info/automatic_update_check") + checkUpdatesCheckbox.checked = boolCheck(UM.Preferences.getValue("info/automatic_update_check")) + } + } + + Column + { + //: Language selection label + UM.I18nCatalog{id: catalog; name:"cura"} + + Label + { + font.bold: true + text: catalog.i18nc("@label","Interface") + } + + Row + { + Label + { + id: languageLabel + text: catalog.i18nc("@label","Language:") + anchors.verticalCenter: languageComboBox.verticalCenter + } + + ComboBox + { + id: languageComboBox + model: ListModel + { + id: languageList + + Component.onCompleted: { + append({ text: catalog.i18nc("@item:inlistbox", "English"), code: "en" }) + append({ text: catalog.i18nc("@item:inlistbox", "Finnish"), code: "fi" }) + append({ text: catalog.i18nc("@item:inlistbox", "French"), code: "fr" }) + append({ text: catalog.i18nc("@item:inlistbox", "German"), code: "de" }) + append({ text: catalog.i18nc("@item:inlistbox", "Italian"), code: "it" }) + append({ text: catalog.i18nc("@item:inlistbox", "Dutch"), code: "nl" }) + append({ text: catalog.i18nc("@item:inlistbox", "Spanish"), code: "es" }) + } + } + + currentIndex: + { + var code = UM.Preferences.getValue("general/language"); + for(var i = 0; i < languageList.count; ++i) + { + if(model.get(i).code == code) + { + return i + } + } + } + onActivated: UM.Preferences.setValue("general/language", model.get(index).code) + + Component.onCompleted: + { + // Because ListModel is stupid and does not allow using qsTr() for values. + for(var i = 0; i < languageList.count; ++i) + { + languageList.setProperty(i, "text", catalog.i18n(languageList.get(i).text)); + } + + // Glorious hack time. ComboBox does not update the text properly after changing the + // model. So change the indices around to force it to update. + currentIndex += 1; + currentIndex -= 1; + } + } + } + + Label + { + id: languageCaption + + //: Language change warning + text: catalog.i18nc("@label", "You will need to restart the application for language changes to have effect.") + wrapMode: Text.WordWrap + font.italic: true + } + + Item + { + //: Spacer + height: UM.Theme.getSize("default_margin").height + width: UM.Theme.getSize("default_margin").width + } + + Label + { + font.bold: true + text: catalog.i18nc("@label","Viewport behavior") + } + + UM.TooltipArea + { + width: childrenRect.width; + height: childrenRect.height; + + text: catalog.i18nc("@info:tooltip","Highlight unsupported areas of the model in red. Without support these areas will not print properly.") + + CheckBox + { + id: showOverhangCheckbox + + checked: boolCheck(UM.Preferences.getValue("view/show_overhang")) + onClicked: UM.Preferences.setValue("view/show_overhang", checked) + + text: catalog.i18nc("@option:check","Display overhang"); + } + } + + UM.TooltipArea { + width: childrenRect.width; + height: childrenRect.height; + text: catalog.i18nc("@info:tooltip","Moves the camera so the object is in the center of the view when an object is selected") + + CheckBox + { + id: centerOnSelectCheckbox + text: catalog.i18nc("@action:button","Center camera when item is selected"); + checked: boolCheck(UM.Preferences.getValue("view/center_on_select")) + onClicked: UM.Preferences.setValue("view/center_on_select", checked) + } + } + + UM.TooltipArea { + width: childrenRect.width + height: childrenRect.height + text: catalog.i18nc("@info:tooltip", "Should objects on the platform be moved so that they no longer intersect?") + + CheckBox + { + id: pushFreeCheckbox + text: catalog.i18nc("@option:check", "Ensure objects are kept apart") + checked: boolCheck(UM.Preferences.getValue("physics/automatic_push_free")) + onCheckedChanged: UM.Preferences.setValue("physics/automatic_push_free", checked) + } + } + + UM.TooltipArea { + width: childrenRect.width; + height: childrenRect.height; + text: catalog.i18nc("@info:tooltip","Display 5 top layers in layer view or only the top-most layer. Rendering 5 layers takes longer, but may show more information.") + + CheckBox + { + id: topLayerCountCheckbox + text: catalog.i18nc("@action:button","Display five top layers in layer view"); + checked: UM.Preferences.getValue("view/top_layer_count") == 5 + onClicked: + { + if(UM.Preferences.getValue("view/top_layer_count") == 5) + { + UM.Preferences.setValue("view/top_layer_count", 1) + } + else + { + UM.Preferences.setValue("view/top_layer_count", 5) + } + } + } + } + + Item + { + //: Spacer + height: UM.Theme.getSize("default_margin").height + width: UM.Theme.getSize("default_margin").height + } + + Label + { + font.bold: true + text: catalog.i18nc("@label","Opening files") + } + + UM.TooltipArea { + width: childrenRect.width + height: childrenRect.height + text: catalog.i18nc("@info:tooltip","Should objects be scaled to the build volume if they are too large?") + + CheckBox + { + id: scaleToFitCheckbox + text: catalog.i18nc("@option:check","Scale large objects") + checked: boolCheck(UM.Preferences.getValue("mesh/scale_to_fit")) + onCheckedChanged: UM.Preferences.setValue("mesh/scale_to_fit", checked) + } + } + + UM.TooltipArea { + width: childrenRect.width + height: childrenRect.height + text: catalog.i18nc("@info:tooltip","Should objects be scaled up if they are extremely small?") + + CheckBox + { + id: scaleTinyCheckbox + text: catalog.i18nc("@option:check","Scale extremely small objects") + checked: boolCheck(UM.Preferences.getValue("mesh/scale_tiny_meshes")) + onCheckedChanged: UM.Preferences.setValue("mesh/scale_tiny_meshes", checked) + } + } + + UM.TooltipArea { + width: childrenRect.width + height: childrenRect.height + text: catalog.i18nc("@info:tooltip", "Should a prefix based on the printer name be added to the print job name automatically?") + + CheckBox + { + id: prefixJobNameCheckbox + text: catalog.i18nc("@option:check", "Add machine prefix to job name") + checked: boolCheck(UM.Preferences.getValue("cura/jobname_prefix")) + onCheckedChanged: UM.Preferences.setValue("cura/jobname_prefix", checked) + } + } + + Item + { + //: Spacer + height: UM.Theme.getSize("default_margin").height + width: UM.Theme.getSize("default_margin").height + } + + Label + { + font.bold: true + visible: checkUpdatesCheckbox.visible || sendDataCheckbox.visible + text: catalog.i18nc("@label","Privacy") + } + + UM.TooltipArea { + visible: plugins.model.find("id", "UpdateChecker") > -1 + width: childrenRect.width + height: visible ? childrenRect.height : 0 + text: catalog.i18nc("@info:tooltip","Should Cura check for updates when the program is started?") + + CheckBox + { + id: checkUpdatesCheckbox + text: catalog.i18nc("@option:check","Check for updates on start") + checked: boolCheck(UM.Preferences.getValue("info/automatic_update_check")) + onCheckedChanged: UM.Preferences.setValue("info/automatic_update_check", checked) + } + } + + UM.TooltipArea { + visible: plugins.model.find("id", "SliceInfoPlugin") > -1 + width: childrenRect.width + height: visible ? childrenRect.height : 0 + text: catalog.i18nc("@info:tooltip","Should anonymous data about your print be sent to Ultimaker? Note, no models, IP addresses or other personally identifiable information is sent or stored.") + + CheckBox + { + id: sendDataCheckbox + text: catalog.i18nc("@option:check","Send (anonymous) print information") + checked: boolCheck(UM.Preferences.getValue("info/send_slice_info")) + onCheckedChanged: UM.Preferences.setValue("info/send_slice_info", checked) + } + } + + //: Invisible list used to check if a plugin exists + ListView + { + id: plugins + model: UM.PluginsModel { } + visible: false + } + } +} diff --git a/resources/qml/Preferences/MachinesPage.qml b/resources/qml/Preferences/MachinesPage.qml new file mode 100644 index 0000000000..faef019deb --- /dev/null +++ b/resources/qml/Preferences/MachinesPage.qml @@ -0,0 +1,78 @@ +// Copyright (c) 2016 Ultimaker B.V. +// Uranium is released under the terms of the AGPLv3 or higher. + +import QtQuick 2.1 +import QtQuick.Controls 1.1 + +import UM 1.2 as UM +import Cura 1.0 as Cura + +UM.ManagementPage +{ + id: base; + + title: catalog.i18nc("@title:tab", "Printers"); + model: UM.ContainerStacksModel + { + filter: {"type": "machine"} + } + + activeId: Cura.MachineManager.activeMachineId + activeIndex: { + for(var i = 0; i < model.rowCount(); i++) { + if (model.getItem(i).id == Cura.MachineManager.activeMachineId) { + return i; + } + } + return -1; + } + + onAddObject: Printer.requestAddPrinter() + onRemoveObject: confirmDialog.open(); + onRenameObject: renameDialog.open(); + onActivateObject: Cura.MachineManager.setActiveMachine(base.currentItem.id) + + removeEnabled: base.currentItem != null && model.rowCount() > 1 + renameEnabled: base.currentItem != null + activateEnabled: base.currentItem != null && base.currentItem.id != Cura.MachineManager.activeMachineId + + Flow + { + anchors.fill: parent; + spacing: UM.Theme.getSize("default_margin").height; + + Label + { + text: base.currentItem && base.currentItem.name ? base.currentItem.name : "" + font: UM.Theme.getFont("large") + width: parent.width + elide: Text.ElideRight + } + + Label { text: catalog.i18nc("@label", "Type"); width: parent.width * 0.2; } + Label { text: base.currentItem && base.currentItem.typeName ? base.currentItem.typeName : ""; width: parent.width * 0.7; } + + UM.I18nCatalog { id: catalog; name: "uranium"; } + + UM.ConfirmRemoveDialog + { + id: confirmDialog; + object: base.currentItem && base.currentItem.name ? base.currentItem.name : ""; + onYes: Cura.MachineManager.removeMachine(base.currentItem.id); + } + + UM.RenameDialog + { + id: renameDialog; + object: base.currentItem && base.currentItem.name ? base.currentItem.name : ""; + onAccepted: + { + Cura.MachineManager.renameMachine(base.currentItem.id, newName.trim()); + //Reselect current item to update details panel + var index = objectList.currentIndex + objectList.currentIndex = -1 + objectList.currentIndex = index + } + } + } +} diff --git a/resources/qml/Preferences/MaterialsPage.qml b/resources/qml/Preferences/MaterialsPage.qml new file mode 100644 index 0000000000..af0f0c1bd2 --- /dev/null +++ b/resources/qml/Preferences/MaterialsPage.qml @@ -0,0 +1,241 @@ +// Copyright (c) 2016 Ultimaker B.V. +// Uranium is released under the terms of the AGPLv3 or higher. + +import QtQuick 2.1 +import QtQuick.Controls 1.1 +import QtQuick.Dialogs 1.2 + +import UM 1.2 as UM +import Cura 1.0 as Cura + +UM.ManagementPage +{ + id: base; + + title: catalog.i18nc("@title:tab", "Materials"); + + model: UM.InstanceContainersModel + { + filter: + { + var result = { "type": "material" } + if(Cura.MachineManager.filterMaterialsByMachine) + { + result.definition = Cura.MachineManager.activeDefinitionId + if(Cura.MachineManager.hasVariants) + { + result.variant = Cura.MachineManager.activeVariantId + } + } + else + { + result.definition = "fdmprinter" + } + return result + } + } + + activeId: Cura.MachineManager.activeMaterialId + activeIndex: { + for(var i = 0; i < model.rowCount(); i++) { + if (model.getItem(i).id == Cura.MachineManager.activeMaterialId) { + return i; + } + } + return -1; + } + + addEnabled: false + removeEnabled: false + renameEnabled: false + + scrollviewCaption: " " + detailsVisible: true + + property string currency: UM.Preferences.getValue("general/currency") + + Item { + UM.I18nCatalog { id: catalog; name: "cura"; } + + visible: base.currentItem != null + anchors.fill: parent + + Label { id: profileName; text: materialProperties.name; font: UM.Theme.getFont("large"); width: parent.width; } + + TabView { + id: scrollView + anchors.left: parent.left + anchors.right: parent.right + anchors.top: profileName.bottom + anchors.topMargin: UM.Theme.getSize("default_margin").height + anchors.bottom: parent.bottom + + Tab { + title: "Information" + anchors.margins: UM.Theme.getSize("default_margin").height + + Flow { + id: containerGrid + + width: scrollView.width; + property real columnWidth: width / 2 + + Label { width: parent.columnWidth; text: catalog.i18nc("@label", "Profile Type") } + Label { width: parent.columnWidth; text: materialProperties.profile_type } + + Label { width: parent.columnWidth; text: catalog.i18nc("@label", "Supplier") } + Label { width: parent.columnWidth; text: materialProperties.supplier } + + Label { width: parent.columnWidth; text: catalog.i18nc("@label", "Material Type") } + Label { width: parent.columnWidth; text: materialProperties.material_type } + + Label { width: parent.columnWidth; text: catalog.i18nc("@label", "Color") } + + Row { + width: parent.columnWidth; + spacing: UM.Theme.getSize("default_margin").width/2 + Rectangle { + color: materialProperties.color_code + width: colorLabel.height + height: colorLabel.height + border.width: UM.Theme.getSize("default_lining").height + } + Label { id: colorLabel; text: materialProperties.color_name } + } + + Item { width: parent.width; height: UM.Theme.getSize("default_margin").height } + + Label { width: parent.width; text: "" + catalog.i18nc("@label", "Properties") + "" } + + Label { width: parent.columnWidth; text: catalog.i18nc("@label", "Density") } + Label { width: parent.columnWidth; text: materialProperties.density } + + Label { width: parent.columnWidth; text: catalog.i18nc("@label", "Diameter") } + Label { width: parent.columnWidth; text: materialProperties.diameter } + + Label { + text: catalog.i18nc("@label", "Filament cost") + width: parent.columnWidth; + height: spoolCostInput.height + verticalAlignment: Text.AlignVCenter + } + + Row { + width: parent.columnWidth; + Label { + text: base.currency ? base.currency + " " : " " + anchors.verticalCenter: parent.verticalCenter + } + TextField { + id: spoolCostInput + text: materialProperties.spool_cost + } + } + + Label { width: parent.columnWidth; text: catalog.i18nc("@label", "Filament weight") } + Label { width: parent.columnWidth; text: materialProperties.spool_weight + " " + "g" } + + Label { width: parent.columnWidth; text: catalog.i18nc("@label", "Filament length") } + Label { width: parent.columnWidth; text: materialProperties.spool_length + " " + "m" } + + Label { width: parent.columnWidth; text: catalog.i18nc("@label", "Cost per meter") } + Label { width: parent.columnWidth; text: catalog.i18nc("@label", "approx. %1 %2/m").arg(materialProperties.cost_per_meter).arg(base.currency); } + + Item { width: parent.width; height: UM.Theme.getSize("default_margin").height } + + Label { + text: materialProperties.description ? "" + catalog.i18nc("@label", "Information") + "
" + materialProperties.description : ""; + width: parent.width + wrapMode: Text.WordWrap + } + Label { + text: materialProperties.adhesion_info ? "" + catalog.i18nc("@label", "Adhesion") + "
" + materialProperties.adhesion_info : ""; + width: parent.width + wrapMode: Text.WordWrap + } + } + } + Tab { + title: catalog.i18nc("@label", "Print settings") + anchors.margins: UM.Theme.getSize("default_margin").height + + Grid { + columns: 2 + spacing: UM.Theme.getSize("default_margin").width + + Column { + Repeater { + model: base.currentItem ? base.currentItem.settings : null + Label { + text: modelData.name.toString(); + elide: Text.ElideMiddle; + } + } + } + Column { + Repeater { + model: base.currentItem ? base.currentItem.settings : null + Label { text: modelData.value.toString() + " " + modelData.unit.toString(); } + } + } + } + } + } + + QtObject + { + id: materialProperties + + property string name: "Unknown"; + property string profile_type: "Unknown"; + property string supplier: "Unknown"; + property string material_type: "Unknown"; + + property string color_name: "Yellow"; + property color color_code: "yellow"; + + property string density: "Unknown"; + property string diameter: "Unknown"; + + property string spool_cost: "Unknown"; + property string spool_weight: "Unknown"; + property string spool_length: "Unknown"; + property string cost_per_meter: "Unknown"; + + property string description: ""; + property string adhesion_info: ""; + } + } + + onCurrentItemChanged: + { + if(currentItem == null) + { + return + } + + materialProperties.name = currentItem.name; + + if(currentItem.metadata != undefined && currentItem.metadata != null) + { + materialProperties.supplier = currentItem.metadata.brand ? currentItem.metadata.brand : "Unknown"; + materialProperties.material_type = currentItem.metadata.material ? currentItem.metadata.material : "Unknown"; + materialProperties.color_name = currentItem.metadata.color_name ? currentItem.metadata.color_name : "Yellow"; + materialProperties.color_code = currentItem.metadata.color_code ? currentItem.metadata.color_code : "yellow"; + + materialProperties.description = currentItem.metadata.description ? currentItem.metadata.description : ""; + materialProperties.adhesion_info = currentItem.metadata.adhesion_info ? currentItem.metadata.adhesion_info : ""; + + if(currentItem.metadata.properties != undefined && currentItem.metadata.properties != null) + { + materialProperties.density = currentItem.metadata.properties.density ? currentItem.metadata.properties.density : "Unknown"; + materialProperties.diameter = currentItem.metadata.properties.diameter ? currentItem.metadata.properties.diameter : "Unknown"; + } + else + { + materialProperties.density = "Unknown"; + materialProperties.diameter = "Unknown"; + } + } + } +} diff --git a/resources/qml/Preferences/ProfilesPage.qml b/resources/qml/Preferences/ProfilesPage.qml new file mode 100644 index 0000000000..1f90d7c889 --- /dev/null +++ b/resources/qml/Preferences/ProfilesPage.qml @@ -0,0 +1,309 @@ +// Copyright (c) 2015 Ultimaker B.V. +// Uranium is released under the terms of the AGPLv3 or higher. + +import QtQuick 2.1 +import QtQuick.Controls 1.1 +import QtQuick.Dialogs 1.2 + +import UM 1.2 as UM +import Cura 1.0 as Cura + +UM.ManagementPage +{ + id: base; + + title: catalog.i18nc("@title:tab", "Profiles"); + addText: base.currentItem && (base.currentItem.id == Cura.MachineManager.activeQualityId) ? catalog.i18nc("@label", "Create") : catalog.i18nc("@label", "Duplicate") + + model: UM.InstanceContainersModel + { + filter: + { + var result = { "type": "quality" }; + if(Cura.MachineManager.filterQualityByMachine) + { + result.definition = Cura.MachineManager.activeDefinitionId; + if(Cura.MachineManager.hasMaterials) + { + result.material = Cura.MachineManager.activeMaterialId; + } + } + else + { + result.definition = "fdmprinter" + } + return result + } + } + + section.property: "readOnly" + section.delegate: Rectangle + { + height: childrenRect.height; + + Label + { + anchors.left: parent.left; + anchors.leftMargin: UM.Theme.getSize("default_lining").width; + text: section == "true" ? catalog.i18nc("@label", "Protected profiles") : catalog.i18nc("@label", "Custom profiles") + font.bold: true + } + } + + activeId: Cura.MachineManager.activeQualityId + activeIndex: { + for(var i = 0; i < model.rowCount(); i++) { + if (model.getItem(i).id == Cura.MachineManager.activeQualityId) { + return i; + } + } + return -1; + } + + onActivateObject: Cura.MachineManager.setActiveQuality(currentItem.id) + onAddObject: { + var selectedContainer; + if (objectList.currentItem.id == Cura.MachineManager.activeQualityId) { + selectedContainer = Cura.MachineManager.newQualityContainerFromQualityAndUser(); + } else { + selectedContainer = Cura.MachineManager.duplicateContainer(base.currentItem.id); + } + base.selectContainer(selectedContainer); + + renameDialog.removeWhenRejected = true; + renameDialog.open(); + renameDialog.selectText(); + } + onRemoveObject: confirmDialog.open(); + onRenameObject: { renameDialog.removeWhenRejected = false; renameDialog.open(); renameDialog.selectText(); } + + activateEnabled: currentItem != null ? currentItem.id != Cura.MachineManager.activeQualityId : false; + addEnabled: currentItem != null; + removeEnabled: currentItem != null ? !currentItem.readOnly : false; + renameEnabled: currentItem != null ? !currentItem.readOnly : false; + + scrollviewCaption: catalog.i18nc("@label %1 is printer name","Printer: %1").arg(Cura.MachineManager.activeMachineName) + + signal showProfileNameDialog() + onShowProfileNameDialog: { renameDialog.removeWhenRejected = true; renameDialog.open(); renameDialog.selectText(); } + + signal selectContainer(string id) + onSelectContainer: { + objectList.currentIndex = objectList.model.find("id", id); + } + + Item { + visible: base.currentItem != null + anchors.fill: parent + + Label { + id: profileName + text: base.currentItem ? base.currentItem.name : "" + font: UM.Theme.getFont("large") + width: parent.width + elide: Text.ElideRight + } + + Row { + id: currentSettingsActions + visible: currentItem.id == Cura.MachineManager.activeQualityId + + anchors.left: parent.left + anchors.top: profileName.bottom + anchors.topMargin: UM.Theme.getSize("default_margin").height + + Button + { + text: { + return catalog.i18nc("@action:button", "Update profile with current settings"); + } + enabled: Cura.MachineManager.hasUserSettings && !Cura.MachineManager.isReadOnly(Cura.MachineManager.activeQualityId) + onClicked: Cura.MachineManager.updateQualityContainerFromUserContainer() + } + + Button + { + text: catalog.i18nc("@action:button", "Discard current settings"); + enabled: Cura.MachineManager.hasUserSettings + onClicked: Cura.MachineManager.clearUserSettings(); + } + } + + Column { + id: profileNotices + anchors.top: currentSettingsActions.visible ? currentSettingsActions.bottom : currentSettingsActions.anchors.top + anchors.topMargin: UM.Theme.getSize("default_margin").height + anchors.left: parent.left + anchors.right: parent.right + spacing: UM.Theme.getSize("default_margin").height + + Label { + id: defaultsMessage + visible: !currentItem.metadata.has_settings + text: catalog.i18nc("@action:label", "This profile has no settings and uses the defaults specified by the printer.") + wrapMode: Text.WordWrap + width: parent.width + } + Label { + id: noCurrentSettingsMessage + visible: currentItem.id == Cura.MachineManager.activeQualityId && !Cura.MachineManager.hasUserSettings + text: catalog.i18nc("@action:label", "Your current settings match the selected profile.") + wrapMode: Text.WordWrap + width: parent.width + } + } + + ScrollView { + id: scrollView + + anchors.left: parent.left + anchors.top: profileNotices.visible ? profileNotices.bottom : profileNotices.anchors.top + anchors.topMargin: UM.Theme.getSize("default_margin").height + anchors.right: parent.right + anchors.bottom: parent.bottom + + ListView { + model: Cura.ContainerSettingsModel{ containers: (currentItem.id == Cura.MachineManager.activeQualityId) ? [base.currentItem.id, Cura.MachineManager.activeUserProfileId] : [base.currentItem.id] } + delegate: Row { + property variant setting: model + spacing: UM.Theme.getSize("default_margin").width/2 + Label { + text: model.label + elide: Text.ElideMiddle + width: scrollView.width / 100 * 40 + } + Repeater { + model: setting.values.length + Label { + text: setting.values[index].toString() + width: scrollView.width / 100 * 15 + elide: Text.ElideRight + font.strikeout: index < setting.values.length - 1 && setting.values[index + 1] != "" + opacity: font.strikeout ? 0.5 : 1 + } + } + Label { + text: model.unit + } + } + header: Row { + visible: currentItem.id == Cura.MachineManager.activeQualityId + spacing: UM.Theme.getSize("default_margin").width + Label { + text: catalog.i18nc("@action:label", "Profile:") + width: scrollView.width / 100 * 55 + horizontalAlignment: Text.AlignRight + font.bold: true + } + Label { + text: catalog.i18nc("@action:label", "Current:") + visible: currentItem.id == Cura.MachineManager.activeQualityId + font.bold: true + } + } + section.property: "category" + section.criteria: ViewSection.FullString + section.delegate: Label { + text: section + font.bold: true + } + } + } + } + + buttons: Row { + + Button + { + text: catalog.i18nc("@action:button", "Import"); + iconName: "document-import"; + onClicked: importDialog.open(); + } + + Button + { + text: catalog.i18nc("@action:button", "Export") + iconName: "document-export" + onClicked: exportDialog.open() + enabled: currentItem != null + } + } + + Item + { + UM.I18nCatalog { id: catalog; name: "uranium"; } + + UM.ConfirmRemoveDialog + { + id: confirmDialog + object: base.currentItem != null ? base.currentItem.name : "" + onYes: Cura.MachineManager.removeQualityContainer(base.currentItem.id) + } + UM.RenameDialog + { + id: renameDialog; + object: base.currentItem != null ? base.currentItem.name : "" + property bool removeWhenRejected: false + onAccepted: Cura.MachineManager.renameQualityContainer(base.currentItem.id, newName) + onRejected: { + if(removeWhenRejected) { + Cura.MachineManager.removeQualityContainer(base.currentItem.id) + } + } + } + MessageDialog + { + id: messageDialog + title: catalog.i18nc("@window:title", "Import Profile"); + standardButtons: StandardButton.Ok + modality: Qt.ApplicationModal + } + + FileDialog + { + id: importDialog; + title: catalog.i18nc("@title:window", "Import Profile"); + selectExisting: true; + nameFilters: base.model.getFileNameFilters("profile_reader") + folder: base.model.getDefaultPath() + onAccepted: + { + var result = base.model.importProfile(fileUrl) + messageDialog.text = result.message + if(result.status == "ok") + { + messageDialog.icon = StandardIcon.Information + } + else if(result.status == "duplicate") + { + messageDialog.icon = StandardIcon.Warning + } + else + { + messageDialog.icon = StandardIcon.Critical + } + messageDialog.open() + } + } + + FileDialog + { + id: exportDialog; + title: catalog.i18nc("@title:window", "Export Profile"); + selectExisting: false; + nameFilters: base.model.getFileNameFilters("profile_writer") + folder: base.model.getDefaultPath() + onAccepted: + { + var result = base.model.exportProfile(base.currentItem.id, fileUrl, selectedNameFilter) + if(result && result.status == "error") + { + messageDialog.icon = StandardIcon.Critical + messageDialog.text = result.message + messageDialog.open() + } + // else pop-up Message thing from python code + } + } + } +} diff --git a/resources/qml/ProfileSetup.qml b/resources/qml/ProfileSetup.qml deleted file mode 100644 index d6ff042a44..0000000000 --- a/resources/qml/ProfileSetup.qml +++ /dev/null @@ -1,156 +0,0 @@ -// Copyright (c) 2015 Ultimaker B.V. -// Cura is released under the terms of the AGPLv3 or higher. - -import QtQuick 2.2 -import QtQuick.Controls 1.1 -import QtQuick.Controls.Styles 1.1 -import QtQuick.Layouts 1.1 - -import UM 1.1 as UM - -Item{ - id: base; - UM.I18nCatalog { id: catalog; name:"cura"} - property int totalHeightProfileSetup: childrenRect.height - property Action manageProfilesAction - property Action addProfileAction - property Action updateProfileAction - property Action resetProfileAction - - signal showTooltip(Item item, point location, string text) - signal hideTooltip() - - Rectangle{ - id: globalProfileRow - anchors.top: base.top - height: UM.Theme.getSize("sidebar_setup").height - width: base.width - - Label{ - id: globalProfileLabel - anchors.left: parent.left - anchors.leftMargin: UM.Theme.getSize("default_margin").width; - anchors.verticalCenter: parent.verticalCenter - text: catalog.i18nc("@label","Profile:"); - width: parent.width/100*45 - font: UM.Theme.getFont("default"); - color: UM.Theme.getColor("text"); - } - - ToolButton { - property int rightMargin: customisedSettings.visible ? customisedSettings.width + UM.Theme.getSize("default_margin").width / 2 : 0 - - id: globalProfileSelection - text: UM.MachineManager.activeProfile - width: parent.width/100*55 - height: UM.Theme.getSize("setting_control").height - anchors.right: parent.right - anchors.rightMargin: UM.Theme.getSize("default_margin").width - anchors.verticalCenter: parent.verticalCenter - tooltip: UM.MachineManager.activeProfile - style: UM.Theme.styles.sidebar_header_button - - menu: Menu - { - id: profileSelectionMenu - Instantiator - { - id: profileSelectionInstantiator - model: UM.ProfilesModel {} - property int separatorIndex: -1 - - Loader { - property QtObject model_data: model - property int model_index: index - sourceComponent: menuItemDelegate - } - onObjectAdded: - { - //Insert a separator between readonly and custom profiles - if(separatorIndex < 0 && index > 0) { - if(model.getItem(index-1).readOnly != model.getItem(index).readOnly) { - profileSelectionMenu.insertSeparator(index); - separatorIndex = index; - } - } - //Because of the separator, custom profiles move one index lower - profileSelectionMenu.insertItem((model.getItem(index).readOnly) ? index : index + 1, object.item); - } - onObjectRemoved: - { - //When adding a profile, the menu is rebuild by removing all items. - //If a separator was added, we need to remove that too. - if(separatorIndex >= 0) - { - profileSelectionMenu.removeItem(profileSelectionMenu.items[separatorIndex]) - separatorIndex = -1; - } - profileSelectionMenu.removeItem(object.item); - } - } - ExclusiveGroup { id: profileSelectionMenuGroup; } - - Component - { - id: menuItemDelegate - MenuItem - { - id: item - text: model_data ? model_data.name : "" - checkable: true; - checked: model_data ? model_data.active : false; - exclusiveGroup: profileSelectionMenuGroup; - onTriggered: - { - UM.MachineManager.setActiveProfile(model_data.name); - if (!model_data.active) { - //Selecting a profile was canceled; undo menu selection - profileSelectionInstantiator.model.setProperty(model_index, "active", false); - var activeProfileName = UM.MachineManager.activeProfile; - var activeProfileIndex = profileSelectionInstantiator.model.find("name", activeProfileName); - profileSelectionInstantiator.model.setProperty(activeProfileIndex, "active", true); - } - } - } - } - - MenuSeparator { } - MenuItem { - action: base.updateProfileAction; - } - MenuItem { - action: base.resetProfileAction; - } - MenuItem { - action: base.addProfileAction; - } - MenuSeparator { } - MenuItem { - action: base.manageProfilesAction; - } - } - } - UM.SimpleButton { - id: customisedSettings - - visible: UM.ActiveProfile.hasCustomisedValues - height: parent.height * 0.6 - width: parent.height * 0.6 - - anchors.verticalCenter: parent.verticalCenter - anchors.right: parent.right - anchors.rightMargin: UM.Theme.getSize("setting_preferences_button_margin").width - - color: hovered ? UM.Theme.getColor("setting_control_button_hover") : UM.Theme.getColor("setting_control_button"); - iconSource: UM.Theme.getIcon("star"); - - onClicked: base.manageProfilesAction.trigger() - onEntered: - { - var content = catalog.i18nc("@tooltip","Some setting values are different from the values stored in the profile.\n\nClick to open the profile manager.") - base.showTooltip(globalProfileRow, Qt.point(0, globalProfileRow.height / 2), content) - } - onExited: base.hideTooltip() - } - } -} diff --git a/resources/qml/SaveButton.qml b/resources/qml/SaveButton.qml index acdb43d67b..8b95de15ee 100644 --- a/resources/qml/SaveButton.qml +++ b/resources/qml/SaveButton.qml @@ -14,21 +14,33 @@ Rectangle { property real progress: UM.Backend.progress; property int backendState: UM.Backend.state; + property bool activity: Printer.getPlatformActivity; //Behavior on progress { NumberAnimation { duration: 250; } } property int totalHeight: childrenRect.height + UM.Theme.getSize("default_margin").height property string fileBaseName - property string statusText: { - if(base.backendState == 0) { - if(!activity) { - return catalog.i18nc("@label:PrintjobStatus","Please load a 3d model"); - } else { - return catalog.i18nc("@label:PrintjobStatus","Preparing to slice..."); - } - } else if(base.backendState == 1) { - return catalog.i18nc("@label:PrintjobStatus","Slicing..."); - } else { - return catalog.i18nc("@label:PrintjobStatus","Ready to ") + UM.OutputDeviceManager.activeDeviceShortDescription; + property string statusText: + { + if(!activity) + { + return catalog.i18nc("@label:PrintjobStatus", "Please load a 3d model"); + } + + if(base.backendState == 1) + { + return catalog.i18nc("@label:PrintjobStatus", "Preparing to slice..."); + } + else if(base.backendState == 2) + { + return catalog.i18nc("@label:PrintjobStatus", "Slicing..."); + } + else if(base.backendState == 3) + { + return catalog.i18nc("@label:PrintjobStatus %1 is target operation","Ready to %1").arg(UM.OutputDeviceManager.activeDeviceShortDescription); + } + else if(base.backendState == 4) + { + return catalog.i18nc("@label:PrintjobStatus", "Unable to Slice") } } @@ -60,7 +72,7 @@ Rectangle { height: parent.height color: UM.Theme.getColor("progressbar_control") radius: UM.Theme.getSize("progressbar_radius").width - visible: base.backendState == 1 ? true : false + visible: base.backendState == 2 ? true : false } } @@ -76,17 +88,17 @@ Rectangle { id: saveToButton tooltip: UM.OutputDeviceManager.activeDeviceDescription; - enabled: base.backendState == 2 && base.activity == true + enabled: base.backendState == 3 && base.activity == true height: UM.Theme.getSize("save_button_save_to_button").height anchors.top: parent.top - anchors.right: deviceSelectionMenu.left; - anchors.rightMargin: -3 * UM.Theme.getSize("default_lining").width; + anchors.right: deviceSelectionMenu.visible ? deviceSelectionMenu.left : parent.right + anchors.rightMargin: deviceSelectionMenu.visible ? -3 * UM.Theme.getSize("default_lining").width : UM.Theme.getSize("default_margin").width text: UM.OutputDeviceManager.activeDeviceShortDescription onClicked: { - UM.OutputDeviceManager.requestWriteToDevice(UM.OutputDeviceManager.activeDevice, Printer.jobName, { "filter_by_machine": true }) + UM.OutputDeviceManager.requestWriteToDevice(UM.OutputDeviceManager.activeDevice, PrintInformation.jobName, { "filter_by_machine": true }) } style: ButtonStyle { @@ -127,9 +139,9 @@ Rectangle { anchors.rightMargin: UM.Theme.getSize("default_margin").width width: UM.Theme.getSize("save_button_save_to_button").height height: UM.Theme.getSize("save_button_save_to_button").height - enabled: base.backendState == 2 && base.activity == true + enabled: base.backendState == 3 && base.activity == true + visible: devicesModel.deviceCount > 1 - //iconSource: UM.Theme.icons[UM.OutputDeviceManager.activeDeviceIconName]; style: ButtonStyle { background: Rectangle { diff --git a/resources/qml/Settings/SettingCategory.qml b/resources/qml/Settings/SettingCategory.qml new file mode 100644 index 0000000000..83bd7f1f82 --- /dev/null +++ b/resources/qml/Settings/SettingCategory.qml @@ -0,0 +1,85 @@ +// Copyright (c) 2015 Ultimaker B.V. +// Uranium is released under the terms of the AGPLv3 or higher. + +import QtQuick 2.2 +import QtQuick.Controls 1.1 +import QtQuick.Controls.Styles 1.1 +import QtQuick.Layouts 1.1 + +import UM 1.1 as UM +import Cura 1.0 as Cura + +Button { + id: base; + + style: UM.Theme.styles.sidebar_category; + + signal showTooltip(string text); + signal hideTooltip(); + signal contextMenuRequested() + + text: definition.label + iconSource: UM.Theme.getIcon(definition.icon) + + checkable: true + checked: definition.expanded + + onClicked: { forceActiveFocus(); definition.expanded ? settingDefinitionsModel.collapse(definition.key) : settingDefinitionsModel.expandAll(definition.key) } + + UM.SimpleButton + { + id: settingsButton + + visible: base.hovered || settingsButton.hovered + height: base.height * 0.6 + width: base.height * 0.6 + + anchors { + right: inheritButton.visible ? inheritButton.left : parent.right + rightMargin: inheritButton.visible? UM.Theme.getSize("default_margin").width / 2 : UM.Theme.getSize("setting_preferences_button_margin").width + verticalCenter: parent.verticalCenter; + } + + color: UM.Theme.getColor("setting_control_button"); + hoverColor: UM.Theme.getColor("setting_control_button_hover") + iconSource: UM.Theme.getIcon("settings"); + + onClicked: { + Cura.Actions.configureSettingVisibility.trigger(definition) + } + } + + UM.SimpleButton + { + id: inheritButton; + + anchors.verticalCenter: parent.verticalCenter + anchors.right: parent.right + anchors.rightMargin: UM.Theme.getSize("setting_preferences_button_margin").width + + visible: false //hiddenValuesCount > 0 + height: parent.height / 2 + width: height + + onClicked: + { + base.showAllHiddenInheritedSettings() + } + + color: UM.Theme.getColor("setting_control_button") + hoverColor: UM.Theme.getColor("setting_control_button_hover") + iconSource: UM.Theme.getIcon("notice") + + onEntered: + { + base.showTooltip(catalog.i18nc("@label","Some hidden settings use values different from their normal calculated value.\n\nClick to make these settings visible.")) + } + + onExited: + { + base.hideTooltip(); + } + + UM.I18nCatalog { id: catalog; name: "cura" } + } +} diff --git a/resources/qml/Settings/SettingCheckBox.qml b/resources/qml/Settings/SettingCheckBox.qml new file mode 100644 index 0000000000..9b50c82395 --- /dev/null +++ b/resources/qml/Settings/SettingCheckBox.qml @@ -0,0 +1,79 @@ +// Copyright (c) 2015 Ultimaker B.V. +// Uranium is released under the terms of the AGPLv3 or higher. + +import QtQuick 2.1 +import QtQuick.Layouts 1.1 +import QtQuick.Controls 1.1 +import QtQuick.Controls.Styles 1.1 + +import UM 1.2 as UM + +SettingItem +{ + id: base + + contents: MouseArea + { + id: control + anchors.fill: parent + hoverEnabled: true + + property bool checked: + { + switch(propertyProvider.properties.value) + { + case "True": + return true + case "False": + return false + default: + return propertyProvider.properties.value + } + } + + onClicked: { forceActiveFocus(); propertyProvider.setPropertyValue("value", !checked) } + + Rectangle + { + anchors + { + top: parent.top + bottom: parent.bottom + left: parent.left + } + width: height + + color: + { + if (!enabled) + { + return UM.Theme.getColor("setting_control_disabled") + } + if(control.containsMouse || control.activeFocus) + { + return UM.Theme.getColor("setting_control_highlight") + } + else + { + return UM.Theme.getColor("setting_control") + } + } + + border.width: UM.Theme.getSize("default_lining").width + border.color: !enabled ? UM.Theme.getColor("setting_control_disabled_border") : control.containsMouse ? UM.Theme.getColor("setting_control_border_highlight") : UM.Theme.getColor("setting_control_border") + + UM.RecolorImage { + anchors.verticalCenter: parent.verticalCenter + anchors.horizontalCenter: parent.horizontalCenter + width: parent.width/2.5 + height: parent.height/2.5 + sourceSize.width: width + sourceSize.height: width + color: !enabled ? UM.Theme.getColor("setting_control_disabled_text") : UM.Theme.getColor("setting_control_text"); + source: UM.Theme.getIcon("check") + opacity: control.checked ? 1 : 0 + Behavior on opacity { NumberAnimation { duration: 100; } } + } + } + } +} diff --git a/resources/qml/Settings/SettingComboBox.qml b/resources/qml/Settings/SettingComboBox.qml new file mode 100644 index 0000000000..5308e45f5a --- /dev/null +++ b/resources/qml/Settings/SettingComboBox.qml @@ -0,0 +1,109 @@ +// Copyright (c) 2015 Ultimaker B.V. +// Uranium is released under the terms of the AGPLv3 or higher. + +import QtQuick 2.1 +import QtQuick.Controls 1.1 +import QtQuick.Controls.Styles 1.1 + +import UM 1.1 as UM + +SettingItem +{ + id: base + + contents: ComboBox + { + id: control + + model: definition.options + textRole: "value"; + + anchors.fill: parent + + MouseArea + { + anchors.fill: parent; + acceptedButtons: Qt.NoButton; + onWheel: wheel.accepted = true; + } + + style: ComboBoxStyle + { + background: Rectangle + { + color: + { + if (!enabled) + { + return UM.Theme.getColor("setting_control_disabled") + } + if(control.hovered || base.activeFocus) + { + return UM.Theme.getColor("setting_control_highlight") + } + else + { + return UM.Theme.getColor("setting_control") + } + } + border.width: UM.Theme.getSize("default_lining").width; + border.color: !enabled ? UM.Theme.getColor("setting_control_disabled_border") : control.hovered ? UM.Theme.getColor("setting_control_border_highlight") : UM.Theme.getColor("setting_control_border"); + } + label: Item + { + Label + { + anchors.left: parent.left; + anchors.leftMargin: UM.Theme.getSize("default_lining").width + anchors.right: downArrow.left; + anchors.rightMargin: UM.Theme.getSize("default_lining").width; + anchors.verticalCenter: parent.verticalCenter; + + text: control.currentText; + font: UM.Theme.getFont("default"); + color: !enabled ? UM.Theme.getColor("setting_control_disabled_text") : UM.Theme.getColor("setting_control_text"); + + elide: Text.ElideRight; + verticalAlignment: Text.AlignVCenter; + } + + UM.RecolorImage + { + id: downArrow + anchors.right: parent.right; + anchors.rightMargin: UM.Theme.getSize("default_lining").width * 2; + anchors.verticalCenter: parent.verticalCenter; + + source: UM.Theme.getIcon("arrow_bottom") + width: UM.Theme.getSize("standard_arrow").width + height: UM.Theme.getSize("standard_arrow").height + sourceSize.width: width + 5 + sourceSize.height: width + 5 + + color: UM.Theme.getColor("setting_control_text"); + + } + } + } + + onActivated: { forceActiveFocus(); provider.setPropertyValue("value", definition.options[index].key) } + onModelChanged: updateCurrentIndex(); + + Connections + { + target: provider + onPropertiesChanged: control.updateCurrentIndex() + } + + function updateCurrentIndex() { + for(var i = 0; i < definition.options.length; ++i) { + if(definition.options[i].key == provider.properties.value) { + currentIndex = i; + return; + } + } + + currentIndex = -1; + } + } +} diff --git a/resources/qml/Settings/SettingExtruder.qml b/resources/qml/Settings/SettingExtruder.qml new file mode 100644 index 0000000000..72c5299b15 --- /dev/null +++ b/resources/qml/Settings/SettingExtruder.qml @@ -0,0 +1,131 @@ +// Copyright (c) 2016 Ultimaker B.V. +// Uranium is released under the terms of the AGPLv3 or higher. + +import QtQuick 2.1 +import QtQuick.Controls 1.1 +import QtQuick.Controls.Styles 1.1 + +import UM 1.1 as UM +import Cura 1.0 as Cura + +SettingItem +{ + id: base + + contents: ComboBox + { + id: control + + model: Cura.ExtrudersModel + { + id: extruders_model + } + textRole: "name" + + anchors.fill: parent + + MouseArea + { + anchors.fill: parent + acceptedButtons: Qt.NoButton + onWheel: wheel.accepted = true; + } + + style: ComboBoxStyle + { + background: Rectangle + { + color: + { + if (!enabled) + { + return UM.Theme.getColor("setting_control_disabled"); + } + if(control.hovered || base.activeFocus) + { + return UM.Theme.getColor("setting_control_highlight"); + } + else + { + return UM.Theme.getColor("setting_control"); + } + } + border.width: UM.Theme.getSize("default_lining").width + border.color: !enabled ? UM.Theme.getColor("setting_control_disabled_border") : control.hovered ? UM.Theme.getColor("setting_control_border_highlight") : UM.Theme.getColor("setting_control_border") + } + label: Item + { + Rectangle + { + id: swatch + height: UM.Theme.getSize("setting_control").height / 2 + width: height + anchors.left: parent.left + anchors.leftMargin: UM.Theme.getSize("default_lining").width + anchors.verticalCenter: parent.verticalCenter + + color: extruders_model.getItem(control.currentIndex).colour + border.width: UM.Theme.getSize("default_lining").width + border.color: !enabled ? UM.Theme.getColor("setting_control_disabled_border") : UM.Theme.getColor("setting_control_border") + } + Label + { + anchors.left: swatch.right + anchors.leftMargin: UM.Theme.getSize("default_lining").width + anchors.right: downArrow.left + anchors.rightMargin: UM.Theme.getSize("default_lining").width + anchors.verticalCenter: parent.verticalCenter + + text: control.currentText + font: UM.Theme.getFont("default") + color: !enabled ? UM.Theme.getColor("setting_control_disabled_text") : UM.Theme.getColor("setting_control_text") + + elide: Text.ElideRight + verticalAlignment: Text.AlignVCenter + } + + UM.RecolorImage + { + id: downArrow + anchors.right: parent.right + anchors.rightMargin: UM.Theme.getSize("default_lining").width * 2 + anchors.verticalCenter: parent.verticalCenter + + source: UM.Theme.getIcon("arrow_bottom") + width: UM.Theme.getSize("standard_arrow").width + height: UM.Theme.getSize("standard_arrow").height + sourceSize.width: width + 5 + sourceSize.height: width + 5 + + color: UM.Theme.getColor("setting_control_text") + } + } + } + + onActivated: + { + forceActiveFocus(); + provider.setPropertyValue("value", extruders_model.getItem(index).index) + } + onModelChanged: updateCurrentIndex(); + + Connections + { + target: provider + onPropertiesChanged: control.updateCurrentIndex(); + } + + function updateCurrentIndex() + { + for(var i = 0; i < extruders_model.rowCount(); ++i) + { + if(extruders_model.getItem(i).index == provider.properties.value) + { + currentIndex = i; + return; + } + } + currentIndex = -1; + } + } +} diff --git a/resources/qml/Settings/SettingItem.qml b/resources/qml/Settings/SettingItem.qml new file mode 100644 index 0000000000..e98c06329d --- /dev/null +++ b/resources/qml/Settings/SettingItem.qml @@ -0,0 +1,259 @@ +// Copyright (c) 2015 Ultimaker B.V. +// Uranium is released under the terms of the AGPLv3 or higher. + +import QtQuick 2.1 +import QtQuick.Layouts 1.1 +import QtQuick.Controls 1.1 +import QtQuick.Controls.Styles 1.1 + +import UM 1.1 as UM +import Cura 1.0 as Cura + +import "." + +Item { + id: base; + + height: UM.Theme.getSize("section").height; + + property alias contents: controlContainer.children; + property alias hovered: mouse.containsMouse + + property var showRevertButton: true + property var showInheritButton: true + property var doDepthIndentation: true + + // Create properties to put property provider stuff in (bindings break in qt 5.5.1 otherwise) + property var state: propertyProvider.properties.state + property var stackLevels: propertyProvider.stackLevels + property var stackLevel: stackLevels[0] + + signal contextMenuRequested() + signal showTooltip(string text); + signal hideTooltip(); + + property string tooltipText: + { + var affects = settingDefinitionsModel.getRequiredBy(definition.key, "value") + var affected_by = settingDefinitionsModel.getRequires(definition.key, "value") + + var affected_by_list = "" + for(var i in affected_by) + { + affected_by_list += "
  • %1
  • \n".arg(affected_by[i].label) + } + + var affects_list = "" + for(var i in affects) + { + affects_list += "
  • %1
  • \n".arg(affects[i].label) + } + + var tooltip = "%1\n

    %2

    ".arg(definition.label).arg(definition.description) + + if(affects_list != "") + { + tooltip += "
    %1\n
      \n%2
    ".arg(catalog.i18nc("@label", "Affects")).arg(affects_list) + } + + if(affected_by_list != "") + { + tooltip += "
    %1\n
      \n%2
    ".arg(catalog.i18nc("@label", "Affected By")).arg(affected_by_list) + } + + return tooltip + } + + MouseArea + { + id: mouse; + + anchors.fill: parent; + + acceptedButtons: Qt.RightButton; + hoverEnabled: true; + + onClicked: base.contextMenuRequested(); + + onEntered: { + hoverTimer.start(); + } + + onExited: { + if(controlContainer.item && controlContainer.item.hovered) { + return; + } + hoverTimer.stop(); + base.hideTooltip(); + } + + Timer { + id: hoverTimer; + interval: 500; + repeat: false; + + onTriggered: + { + base.showTooltip(base.tooltipText); + } + } + + Label + { + id: label; + + anchors.left: parent.left; + anchors.leftMargin: doDepthIndentation ? (UM.Theme.getSize("section_icon_column").width + 5) + ((definition.depth - 1) * UM.Theme.getSize("setting_control_depth_margin").width) : 0 + anchors.right: settingControls.left; + anchors.verticalCenter: parent.verticalCenter + + height: UM.Theme.getSize("section").height; + verticalAlignment: Text.AlignVCenter; + + text: definition.label + elide: Text.ElideMiddle; + + color: UM.Theme.getColor("setting_control_text"); + font: UM.Theme.getFont("default"); + } + + Row + { + id: settingControls + + height: parent.height / 2 + spacing: UM.Theme.getSize("default_margin").width / 2 + + anchors { + right: controlContainer.left + rightMargin: UM.Theme.getSize("default_margin").width / 2 + verticalCenter: parent.verticalCenter + } + + UM.SimpleButton + { + id: revertButton; + + visible: base.stackLevel == 0 && base.showRevertButton + + height: parent.height; + width: height; + + backgroundColor: UM.Theme.getColor("setting_control"); + hoverBackgroundColor: UM.Theme.getColor("setting_control_highlight") + color: UM.Theme.getColor("setting_control_button") + hoverColor: UM.Theme.getColor("setting_control_button_hover") + + iconSource: UM.Theme.getIcon("reset") + + onClicked: { + revertButton.focus = true + propertyProvider.removeFromContainer(0) + } + + onEntered: { hoverTimer.stop(); base.showTooltip(catalog.i18nc("@label", "This setting has a value that is different from the profile.\n\nClick to restore the value of the profile.")) } + onExited: base.showTooltip(base.tooltipText); + } + + UM.SimpleButton + { + // This button shows when the setting has an inherited function, but is overriden by profile. + id: inheritButton; + // Inherit button needs to be visible if; + // - User made changes that override any loaded settings + // - This setting item uses inherit button at all + // - The type of the value of any deeper container is an "object" (eg; is a function) + visible: + { + var state = base.state == "InstanceState.User"; + var has_setting_function = false; + for (var i = 1; i < base.stackLevels.length; i++) + { + has_setting_function = typeof(propertyProvider.getPropertyValue("value", base.stackLevels[i])) == "object"; + if(has_setting_function) + { + break; + } + } + return state && base.showInheritButton && has_setting_function && typeof(propertyProvider.getPropertyValue("value", base.stackLevels[0])) != "object" + } + + height: parent.height; + width: height; + + onClicked: { + focus = true; + + // Get the most shallow function value (eg not a number) that we can find. + var last_entry = propertyProvider.stackLevels[propertyProvider.stackLevels.length] + for (var i = 1; i < base.stackLevels.length; i++) + { + var has_setting_function = typeof(propertyProvider.getPropertyValue("value", base.stackLevels[i])) == "object"; + if(has_setting_function) + { + last_entry = propertyProvider.stackLevels[i] + break; + } + } + + if(last_entry == 4 && base.stackLevel == 0 && base.stackLevels.length == 2) + { + // Special case of the inherit reset. If only the definition (4th container) and the first + // entry (user container) are set, we can simply remove the container. + propertyProvider.removeFromContainer(0) + } + else if(last_entry - 1 == base.stackLevel) + { + // Another special case. The setting that is overriden is only 1 instance container deeper, + // so we can remove it. + propertyProvider.removeFromContainer(0) + } + else + { + // Put that entry into the "top" instance container. + // This ensures that the value in any of the deeper containers need not be removed, which is + // needed for the reset button (which deletes the top value) to correctly go back to profile + // defaults. + propertyProvider.setPropertyValue("value", propertyProvider.getPropertyValue("value", last_entry)) + propertyProvider.setPropertyValue("state", "InstanceState.Calculated") + } + } + + backgroundColor: UM.Theme.getColor("setting_control"); + hoverBackgroundColor: UM.Theme.getColor("setting_control_highlight") + color: UM.Theme.getColor("setting_control_button") + hoverColor: UM.Theme.getColor("setting_control_button_hover") + + iconSource: UM.Theme.getIcon("notice"); + + onEntered: { hoverTimer.stop(); base.showTooltip(catalog.i18nc("@label", "This setting is normally calculated, but it currently has an absolute value set.\n\nClick to restore the calculated value.")) } + onExited: base.showTooltip(base.tooltipText); + } + + } + + Item + { + id: controlContainer; + + enabled: provider.isValueUsed + + anchors.right: parent.right; + anchors.rightMargin: UM.Theme.getSize("default_margin").width + anchors.verticalCenter: parent.verticalCenter; + width: UM.Theme.getSize("setting_control").width; + height: UM.Theme.getSize("setting_control").height + } + } + + Connections + { + target: Cura.MachineManager + onBlurSettings: + { + revertButton.focus = true + } + } + + UM.I18nCatalog { id: catalog; name: "cura" } +} diff --git a/resources/qml/Settings/SettingTextField.qml b/resources/qml/Settings/SettingTextField.qml new file mode 100644 index 0000000000..bf6fc34c93 --- /dev/null +++ b/resources/qml/Settings/SettingTextField.qml @@ -0,0 +1,119 @@ +// Copyright (c) 2015 Ultimaker B.V. +// Uranium is released under the terms of the AGPLv3 or higher. + +import QtQuick 2.2 +import QtQuick.Controls 1.2 + +import UM 1.1 as UM + +SettingItem +{ + id: base + + contents: Rectangle + { + id: control + + anchors.fill: parent + + border.width: UM.Theme.getSize("default_lining").width + border.color: !enabled ? UM.Theme.getColor("setting_control_disabled_border") : hovered ? UM.Theme.getColor("setting_control_border_highlight") : UM.Theme.getColor("setting_control_border") + + property variant parentValue: value //From parent loader + function notifyReset() { + input.text = format(parentValue) + } + + color: { + if (!enabled) + { + return UM.Theme.getColor("setting_control_disabled") + } + switch(propertyProvider.properties.validationState) + { + case "ValidatorState.Exception": + return UM.Theme.getColor("setting_validation_error") + case "ValidatorState.MinimumError": + return UM.Theme.getColor("setting_validation_error") + case "ValidatorState.MaximumError": + return UM.Theme.getColor("setting_validation_error") + case "ValidatorState.MinimumWarning": + return UM.Theme.getColor("setting_validation_warning") + case "ValidatorState.MaximumWarning": + return UM.Theme.getColor("setting_validation_warning") + case "ValidatorState.Valid": + return UM.Theme.getColor("setting_validation_ok") + + default: + return UM.Theme.getColor("setting_control") + } + } + + Rectangle + { + anchors.fill: parent; + anchors.margins: UM.Theme.getSize("default_lining").width; + color: UM.Theme.getColor("setting_control_highlight") + opacity: !control.hovered ? 0 : propertyProvider.properties.validationState == "ValidatorState.Valid" ? 1.0 : 0.35; + } + + Label + { + anchors.right: parent.right; + anchors.rightMargin: UM.Theme.getSize("setting_unit_margin").width + anchors.verticalCenter: parent.verticalCenter; + + text: definition.unit; + color: UM.Theme.getColor("setting_unit") + font: UM.Theme.getFont("default") + } + + MouseArea + { + id: mouseArea + anchors.fill: parent; + //hoverEnabled: true; + cursorShape: Qt.IBeamCursor + } + + TextInput + { + id: input + + anchors + { + left: parent.left + leftMargin: UM.Theme.getSize("setting_unit_margin").width + right: parent.right + verticalCenter: parent.verticalCenter + } + + Keys.onReleased: + { + propertyProvider.setPropertyValue("value", text) + } + + onEditingFinished: + { + propertyProvider.setPropertyValue("value", text) + } + + color: !enabled ? UM.Theme.getColor("setting_control_disabled_text") : UM.Theme.getColor("setting_control_text") + font: UM.Theme.getFont("default"); + + selectByMouse: true; + + maximumLength: 10; + + validator: RegExpValidator { regExp: /[0-9.,-]{0,10}/ } + + Binding + { + target: input + property: "text" + value: propertyProvider.properties.value + when: !input.activeFocus + } + } + } +} diff --git a/resources/qml/Settings/SettingUnknown.qml b/resources/qml/Settings/SettingUnknown.qml new file mode 100644 index 0000000000..55e26b6695 --- /dev/null +++ b/resources/qml/Settings/SettingUnknown.qml @@ -0,0 +1,19 @@ +// Copyright (c) 2015 Ultimaker B.V. +// Uranium is released under the terms of the AGPLv3 or higher. + +import QtQuick 2.1 +import QtQuick.Controls 1.1 + +import UM 1.2 as UM + +SettingItem +{ + contents: Label + { + anchors.fill: parent + text: value + " " + unit; + color: UM.Theme.getColor("setting_control_text") + + verticalAlignment: Qt.AlignVCenter + } +} diff --git a/resources/qml/Settings/SettingView.qml b/resources/qml/Settings/SettingView.qml new file mode 100644 index 0000000000..4be2326b0a --- /dev/null +++ b/resources/qml/Settings/SettingView.qml @@ -0,0 +1,153 @@ +// Copyright (c) 2015 Ultimaker B.V. +// Uranium is released under the terms of the AGPLv3 or higher. + +import QtQuick 2.2 +import QtQuick.Controls 1.1 +import QtQuick.Controls.Styles 1.1 +import QtQuick.Layouts 1.1 + +import UM 1.2 as UM +import Cura 1.0 as Cura + +ScrollView +{ + id: base; + + style: UM.Theme.styles.scrollview; + flickableItem.flickableDirection: Flickable.VerticalFlick; + + property Action configureSettings; + signal showTooltip(Item item, point location, string text); + signal hideTooltip(); + + ListView + { + id: contents + spacing: UM.Theme.getSize("default_lining").height; + cacheBuffer: 1000000; // Set a large cache to effectively just cache every list item. + + model: UM.SettingDefinitionsModel { + id: definitionsModel; + containerId: Cura.MachineManager.activeDefinitionId + exclude: ["machine_settings"] + visibilityHandler: UM.SettingPreferenceVisibilityHandler { } + + filter: + { + if(ExtruderManager.activeExtruderStackId) + { + return { "settable_per_extruder": true } + } + return { } + } + } + + delegate: Loader + { + id: delegate + + width: UM.Theme.getSize("sidebar").width; + height: provider.properties.enabled == "True" ? UM.Theme.getSize("section").height : 0 + Behavior on height { NumberAnimation { duration: 100 } } + opacity: provider.properties.enabled == "True" ? 1 : 0 + Behavior on opacity { NumberAnimation { duration: 100 } } + enabled: provider.properties.enabled == "True" + + property var definition: model + property var settingDefinitionsModel: definitionsModel + property var propertyProvider: provider + + //Qt5.4.2 and earlier has a bug where this causes a crash: https://bugreports.qt.io/browse/QTBUG-35989 + //In addition, while it works for 5.5 and higher, the ordering of the actual combo box drop down changes, + //causing nasty issues when selecting different options. So disable asynchronous loading of enum type completely. + asynchronous: model.type != "enum" && model.type != "extruder" + active: model.type != undefined + + source: + { + switch(model.type) + { + case "int": + return "SettingTextField.qml" + case "float": + return "SettingTextField.qml" + case "enum": + return "SettingComboBox.qml" + case "extruder": + return "SettingExtruder.qml" + case "bool": + return "SettingCheckBox.qml" + case "str": + return "SettingTextField.qml" + case "category": + return "SettingCategory.qml" + default: + return "SettingUnknown.qml" + } + } + + UM.SettingPropertyProvider + { + id: provider + + containerStackId: ExtruderManager.activeExtruderStackId ? ExtruderManager.activeExtruderStackId : Cura.MachineManager.activeMachineId + key: model.key ? model.key : "" + watchedProperties: [ "value", "enabled", "state", "validationState" ] + storeIndex: 0 + } + + Connections + { + target: item + onContextMenuRequested: { contextMenu.key = model.key; contextMenu.popup() } + onShowTooltip: base.showTooltip(delegate, { x: 0, y: delegate.height / 2 }, text) + onHideTooltip: base.hideTooltip() + } + } + + UM.I18nCatalog { id: catalog; name: "uranium"; } + + add: Transition { + SequentialAnimation { + NumberAnimation { properties: "height"; from: 0; duration: 100 } + NumberAnimation { properties: "opacity"; from: 0; duration: 100 } + } + } + remove: Transition { + SequentialAnimation { + NumberAnimation { properties: "opacity"; to: 0; duration: 100 } + NumberAnimation { properties: "height"; to: 0; duration: 100 } + } + } + addDisplaced: Transition { + NumberAnimation { properties: "x,y"; duration: 100 } + } + removeDisplaced: Transition { + SequentialAnimation { + PauseAnimation { duration: 100; } + NumberAnimation { properties: "x,y"; duration: 100 } + } + } + + Menu + { + id: contextMenu; + + property string key; + + MenuItem + { + //: Settings context menu action + text: catalog.i18nc("@action:menu", "Hide this setting"); + onTriggered: definitionsModel.hide(contextMenu.key); + } + MenuItem + { + //: Settings context menu action + text: catalog.i18nc("@action:menu", "Configure setting visiblity..."); + + onTriggered: Cura.Actions.configureSettingVisibility.trigger(contextMenu); + } + } + } +} diff --git a/resources/qml/Sidebar.qml b/resources/qml/Sidebar.qml index 5426125194..4c8d671a7f 100644 --- a/resources/qml/Sidebar.qml +++ b/resources/qml/Sidebar.qml @@ -7,27 +7,24 @@ import QtQuick.Controls.Styles 1.1 import QtQuick.Layouts 1.1 import UM 1.1 as UM +import Cura 1.0 as Cura Rectangle { id: base; - property Action addMachineAction; - property Action configureMachinesAction; - property Action addProfileAction; - property Action updateProfileAction; - property Action resetProfileAction; - property Action manageProfilesAction; - property Action configureSettingsAction; property int currentModeIndex; + // Is there an output device for this printer? + property bool printerConnected: Cura.MachineManager.printerOutputDevices.length != 0 + color: UM.Theme.getColor("sidebar"); UM.I18nCatalog { id: catalog; name:"cura"} function showTooltip(item, position, text) { tooltip.text = text; - position = item.mapToItem(base, position.x, position.y / 2); + position = item.mapToItem(base, position.x, position.y); tooltip.show(position); } @@ -52,8 +49,11 @@ Rectangle width: parent.width height: totalHeightHeader - addMachineAction: base.addMachineAction; - configureMachinesAction: base.configureMachinesAction; + anchors.top: parent.top + anchors.topMargin: UM.Theme.getSize("default_margin").height + + onShowTooltip: base.showTooltip(item, location, text) + onHideTooltip: base.hideTooltip() } Rectangle { @@ -65,21 +65,6 @@ Rectangle anchors.topMargin: UM.Theme.getSize("default_margin").height } - ProfileSetup { - id: profileItem - addProfileAction: base.addProfileAction - updateProfileAction: base.updateProfileAction - resetProfileAction: base.resetProfileAction - manageProfilesAction: base.manageProfilesAction - anchors.top: settingsModeSelection.bottom - anchors.topMargin: UM.Theme.getSize("default_margin").height - width: parent.width - height: totalHeightProfileSetup - - onShowTooltip: base.showTooltip(item, location, text) - onHideTooltip: base.hideTooltip() - } - currentModeIndex: { var index = parseInt(UM.Preferences.getValue("cura/active_mode")) @@ -172,7 +157,7 @@ Rectangle id: sidebarContents anchors.bottom: footerSeparator.top - anchors.top: profileItem.bottom + anchors.top: settingsModeSelection.bottom anchors.topMargin: UM.Theme.getSize("default_margin").height anchors.left: base.left anchors.right: base.right @@ -247,7 +232,6 @@ Rectangle id: sidebarAdvanced; visible: false; - configureSettings: base.configureSettingsAction; onShowTooltip: base.showTooltip(item, location, text) onHideTooltip: base.hideTooltip() } diff --git a/resources/qml/SidebarAdvanced.qml b/resources/qml/SidebarAdvanced.qml index 8a231aa53d..30f4e74db6 100644 --- a/resources/qml/SidebarAdvanced.qml +++ b/resources/qml/SidebarAdvanced.qml @@ -5,9 +5,9 @@ import QtQuick 2.0 import QtQuick.Controls 1.2 -import UM 1.0 as UM +import "Settings" -UM.SettingView { - expandedCategories: Printer.expandedCategories; - onExpandedCategoriesChanged: Printer.setExpandedCategories(expandedCategories); +SettingView { +// expandedCategories: Printer.expandedCategories; +// onExpandedCategoriesChanged: Printer.setExpandedCategories(expandedCategories); } diff --git a/resources/qml/SidebarHeader.qml b/resources/qml/SidebarHeader.qml index b5fcc880f6..55a104a21f 100644 --- a/resources/qml/SidebarHeader.qml +++ b/resources/qml/SidebarHeader.qml @@ -5,80 +5,73 @@ import QtQuick 2.2 import QtQuick.Controls 1.1 import QtQuick.Controls.Styles 1.1 -import UM 1.1 as UM +import UM 1.2 as UM +import Cura 1.0 as Cura -Item +Column { id: base; - // Machine Setup - property Action addMachineAction; - property Action configureMachinesAction; - UM.I18nCatalog { id: catalog; name:"cura"} + property int totalHeightHeader: childrenRect.height + property int currentExtruderIndex; - Rectangle { - id: sidebarTabRow - width: base.width - height: 0 - anchors.top: parent.top - color: UM.Theme.getColor("sidebar_header_bar") - } + spacing: UM.Theme.getSize("default_margin").height - Label{ - id: printjobTabLabel - text: catalog.i18nc("@label:listbox","Print Job"); - anchors.left: parent.left - anchors.leftMargin: UM.Theme.getSize("default_margin").width; - anchors.top: sidebarTabRow.bottom - anchors.topMargin: UM.Theme.getSize("default_margin").height - width: parent.width/100*45 - font: UM.Theme.getFont("large"); - color: UM.Theme.getColor("text") - } + signal showTooltip(Item item, point location, string text) + signal hideTooltip() - Rectangle { + Row + { id: machineSelectionRow - width: base.width height: UM.Theme.getSize("sidebar_setup").height - anchors.top: printjobTabLabel.bottom - anchors.topMargin: UM.Theme.getSize("default_margin").height - anchors.horizontalCenter: parent.horizontalCenter - Label{ + anchors + { + left: parent.left + leftMargin: UM.Theme.getSize("default_margin").width + right: parent.right + rightMargin: UM.Theme.getSize("default_margin").width + } + + Label + { id: machineSelectionLabel - //: Machine selection label - text: catalog.i18nc("@label:listbox","Printer:"); - anchors.left: parent.left - anchors.leftMargin: UM.Theme.getSize("default_margin").width + text: catalog.i18nc("@label:listbox", "Printer:"); anchors.verticalCenter: parent.verticalCenter font: UM.Theme.getFont("default"); color: UM.Theme.getColor("text"); + + width: parent.width * 0.45 - UM.Theme.getSize("default_margin").width } - ToolButton { + ToolButton + { id: machineSelection - text: UM.MachineManager.activeMachineInstance; - width: parent.width/100*55 + text: Cura.MachineManager.activeMachineName; + height: UM.Theme.getSize("setting_control").height - tooltip: UM.MachineManager.activeMachineInstance; - anchors.right: parent.right - anchors.rightMargin: UM.Theme.getSize("default_margin").width + tooltip: Cura.MachineManager.activeMachineName; anchors.verticalCenter: parent.verticalCenter style: UM.Theme.styles.sidebar_header_button + width: parent.width * 0.55 + UM.Theme.getSize("default_margin").width + menu: Menu { id: machineSelectionMenu Instantiator { - model: UM.MachineInstancesModel { } + model: UM.ContainerStacksModel + { + filter: {"type": "machine"} + } MenuItem { text: model.name; checkable: true; - checked: model.active; + checked: Cura.MachineManager.activeMachineId == model.id exclusiveGroup: machineSelectionMenuGroup; - onTriggered: UM.MachineManager.setActiveMachineInstance(model.name); + onTriggered: Cura.MachineManager.setActiveMachine(model.id); } onObjectAdded: machineSelectionMenu.insertItem(index, object) onObjectRemoved: machineSelectionMenu.removeItem(object) @@ -88,45 +81,141 @@ Item MenuSeparator { } - MenuItem { action: base.addMachineAction; } - MenuItem { action: base.configureMachinesAction; } + MenuItem { action: Cura.Actions.addMachine; } + MenuItem { action: Cura.Actions.configureMachines; } } } } - Rectangle { - id: variantRow - anchors.top: machineSelectionRow.bottom - anchors.topMargin: visible ? UM.Theme.getSize("default_margin").height : 0 - width: base.width - height: visible ? UM.Theme.getSize("sidebar_setup").height : 0 - visible: UM.MachineManager.hasVariants || UM.MachineManager.hasMaterials + ListView + { + id: extrudersList + property var index: 0 - Label{ + visible: machineExtruderCount.properties.value > 1 + height: UM.Theme.getSize("sidebar_header_mode_toggle").height + + boundsBehavior: Flickable.StopAtBounds + + anchors + { + left: parent.left + leftMargin: UM.Theme.getSize("default_margin").width + right: parent.right + rightMargin: UM.Theme.getSize("default_margin").width + } + + ExclusiveGroup { id: extruderMenuGroup; } + + orientation: ListView.Horizontal + + model: Cura.ExtrudersModel { id: extrudersModel; addGlobal: true } + + delegate: Button + { + height: ListView.view.height + width: ListView.view.width / extrudersModel.rowCount() + + text: model.name + exclusiveGroup: extruderMenuGroup; + checkable: true; + checked: base.currentExtruderIndex == index + + onClicked: + { + focus = true; //Changing focus applies the currently-being-typed values so it can change the displayed setting values. + base.currentExtruderIndex = index; + ExtruderManager.setActiveExtruderIndex(index); + } + + style: ButtonStyle + { + background: Rectangle + { + border.width: UM.Theme.getSize("default_lining").width + border.color: control.checked ? UM.Theme.getColor("toggle_checked_border") : + control.pressed ? UM.Theme.getColor("toggle_active_border") : + control.hovered ? UM.Theme.getColor("toggle_hovered_border") : UM.Theme.getColor("toggle_unchecked_border") + color: control.checked ? UM.Theme.getColor("toggle_checked") : + control.pressed ? UM.Theme.getColor("toggle_active") : + control.hovered ? UM.Theme.getColor("toggle_hovered") : UM.Theme.getColor("toggle_unchecked") + Behavior on color { ColorAnimation { duration: 50; } } + + Rectangle + { + id: swatch + height: UM.Theme.getSize("setting_control").height / 2 + width: height + anchors.left: parent.left + anchors.leftMargin: (parent.height - height) / 2 + anchors.verticalCenter: parent.verticalCenter + + color: model.colour + border.width: UM.Theme.getSize("default_lining").width + border.color: UM.Theme.getColor("toggle_checked") + } + + Label + { + anchors.verticalCenter: parent.verticalCenter + anchors.left: swatch.right + anchors.leftMargin: UM.Theme.getSize("default_margin").width / 2 + anchors.right: parent.right + anchors.rightMargin: UM.Theme.getSize("default_margin").width / 2 + + color: control.checked ? UM.Theme.getColor("toggle_checked_text") : + control.pressed ? UM.Theme.getColor("toggle_active_text") : + control.hovered ? UM.Theme.getColor("toggle_hovered_text") : UM.Theme.getColor("toggle_unchecked_text") + + font: UM.Theme.getFont("default") + text: control.text + elide: Text.ElideRight + } + } + label: Item { } + } + } + } + + Row + { + id: variantRow + + height: UM.Theme.getSize("sidebar_setup").height + visible: Cura.MachineManager.hasVariants || Cura.MachineManager.hasMaterials + + anchors + { + left: parent.left + leftMargin: UM.Theme.getSize("default_margin").width + right: parent.right + rightMargin: UM.Theme.getSize("default_margin").width + } + + Label + { id: variantLabel - text: (UM.MachineManager.hasVariants && UM.MachineManager.hasMaterials) ? catalog.i18nc("@label","Nozzle & Material:"): - UM.MachineManager.hasVariants ? catalog.i18nc("@label","Nozzle:") : catalog.i18nc("@label","Material:"); - anchors.left: parent.left - anchors.leftMargin: UM.Theme.getSize("default_margin").width + text: (Cura.MachineManager.hasVariants && Cura.MachineManager.hasMaterials) ? catalog.i18nc("@label","Nozzle & Material:"): + Cura.MachineManager.hasVariants ? catalog.i18nc("@label","Nozzle:") : catalog.i18nc("@label","Material:"); + anchors.verticalCenter: parent.verticalCenter - width: parent.width/100*45 + width: parent.width * 0.45 - UM.Theme.getSize("default_margin").width font: UM.Theme.getFont("default"); color: UM.Theme.getColor("text"); } - Rectangle { - anchors.right: parent.right - anchors.rightMargin: UM.Theme.getSize("default_margin").width + Rectangle + { anchors.verticalCenter: parent.verticalCenter - width: parent.width/100*55 + width: parent.width * 0.55 + UM.Theme.getSize("default_margin").width height: UM.Theme.getSize("setting_control").height ToolButton { id: variantSelection - text: UM.MachineManager.activeMachineVariant - tooltip: UM.MachineManager.activeMachineVariant; - visible: UM.MachineManager.hasVariants + text: Cura.MachineManager.activeVariantName + tooltip: Cura.MachineManager.activeVariantName; + visible: Cura.MachineManager.hasVariants height: UM.Theme.getSize("setting_control").height width: materialSelection.visible ? (parent.width - UM.Theme.getSize("default_margin").width) / 2 : parent.width @@ -139,23 +228,23 @@ Item Instantiator { id: variantSelectionInstantiator - model: UM.MachineVariantsModel { id: variantsModel } + model: UM.InstanceContainersModel + { + filter: + { + "type": "variant", + "definition": Cura.MachineManager.activeDefinitionId //Only show variants of this machine + } + } MenuItem { text: model.name; checkable: true; - checked: model.active; + checked: model.id == Cura.MachineManager.activeVariantId; exclusiveGroup: variantSelectionMenuGroup; onTriggered: { - UM.MachineManager.setActiveMachineVariant(variantsModel.getItem(index).name); - if (typeof(model) !== "undefined" && !model.active) { - //Selecting a variant was canceled; undo menu selection - variantSelectionInstantiator.model.setProperty(index, "active", false); - var activeMachineVariantName = UM.MachineManager.activeMachineVariant; - var activeMachineVariantIndex = variantSelectionInstantiator.model.find("name", activeMachineVariantName); - variantSelectionInstantiator.model.setProperty(activeMachineVariantIndex, "active", true); - } + Cura.MachineManager.setActiveVariant(model.id); } } onObjectAdded: variantsSelectionMenu.insertItem(index, object) @@ -168,9 +257,9 @@ Item ToolButton { id: materialSelection - text: UM.MachineManager.activeMaterial - tooltip: UM.MachineManager.activeMaterial - visible: UM.MachineManager.hasMaterials + text: Cura.MachineManager.activeMaterialName + tooltip: Cura.MachineManager.activeMaterialName + visible: Cura.MachineManager.hasMaterials height: UM.Theme.getSize("setting_control").height width: variantSelection.visible ? (parent.width - UM.Theme.getSize("default_margin").width) / 2 : parent.width @@ -183,23 +272,35 @@ Item Instantiator { id: materialSelectionInstantiator - model: UM.MachineMaterialsModel { id: machineMaterialsModel } + model: UM.InstanceContainersModel + { + filter: + { + var result = { "type": "material" } + if(Cura.MachineManager.filterMaterialsByMachine) + { + result.definition = Cura.MachineManager.activeDefinitionId + if(Cura.MachineManager.hasVariants) + { + result.variant = Cura.MachineManager.activeVariantId + } + } + else + { + result.definition = "fdmprinter" + } + return result + } + } MenuItem { text: model.name; checkable: true; - checked: model.active; + checked: model.id == Cura.MachineManager.activeMaterialId; exclusiveGroup: materialSelectionMenuGroup; onTriggered: { - UM.MachineManager.setActiveMaterial(machineMaterialsModel.getItem(index).name); - if (typeof(model) !== "undefined" && !model.active) { - //Selecting a material was canceled; undo menu selection - materialSelectionInstantiator.model.setProperty(index, "active", false); - var activeMaterialName = UM.MachineManager.activeMaterial; - var activeMaterialIndex = materialSelectionInstantiator.model.find("name", activeMaterialName); - materialSelectionInstantiator.model.setProperty(activeMaterialIndex, "active", true); - } + Cura.MachineManager.setActiveMaterial(model.id); } } onObjectAdded: materialSelectionMenu.insertItem(index, object) @@ -211,4 +312,157 @@ Item } } } + + Row + { + id: globalProfileRow + height: UM.Theme.getSize("sidebar_setup").height + + anchors + { + left: parent.left + leftMargin: UM.Theme.getSize("default_margin").width + right: parent.right + rightMargin: UM.Theme.getSize("default_margin").width + } + + + Label + { + id: globalProfileLabel + text: catalog.i18nc("@label","Profile:"); + width: parent.width * 0.45 - UM.Theme.getSize("default_margin").width + font: UM.Theme.getFont("default"); + color: UM.Theme.getColor("text"); + } + + ToolButton + { + id: globalProfileSelection + text: Cura.MachineManager.activeQualityName + width: parent.width * 0.55 + UM.Theme.getSize("default_margin").width + height: UM.Theme.getSize("setting_control").height + tooltip: Cura.MachineManager.activeQualityName + style: UM.Theme.styles.sidebar_header_button + + menu: Menu + { + id: profileSelectionMenu + Instantiator + { + id: profileSelectionInstantiator + model: UM.InstanceContainersModel + { + filter: + { + var result = { "type": "quality" }; + if(Cura.MachineManager.filterQualityByMachine) + { + result.definition = Cura.MachineManager.activeDefinitionId; + if(Cura.MachineManager.hasMaterials) + { + result.material = Cura.MachineManager.activeMaterialId; + } + } + else + { + result.definition = "fdmprinter" + } + return result + } + } + property int separatorIndex: -1 + + Loader { + property QtObject model_data: model + property int model_index: index + sourceComponent: menuItemDelegate + } + onObjectAdded: + { + //Insert a separator between readonly and custom profiles + if(separatorIndex < 0 && index > 0) + { + if(model.getItem(index-1).readOnly != model.getItem(index).readOnly) + { + profileSelectionMenu.insertSeparator(index); + separatorIndex = index; + } + } + //Because of the separator, custom profiles move one index lower + profileSelectionMenu.insertItem((model.getItem(index).readOnly) ? index : index + 1, object.item); + } + onObjectRemoved: + { + //When adding a profile, the menu is rebuilt by removing all items. + //If a separator was added, we need to remove that too. + if(separatorIndex >= 0) + { + profileSelectionMenu.removeItem(profileSelectionMenu.items[separatorIndex]) + separatorIndex = -1; + } + profileSelectionMenu.removeItem(object.item); + } + } + ExclusiveGroup { id: profileSelectionMenuGroup; } + + Component + { + id: menuItemDelegate + MenuItem + { + id: item + text: model_data ? model_data.name : "" + checkable: true + checked: model_data != null ? Cura.MachineManager.activeQualityId == model_data.id : false + exclusiveGroup: profileSelectionMenuGroup; + onTriggered: Cura.MachineManager.setActiveQuality(model_data.id) + } + } + + MenuSeparator { } + MenuItem { action: Cura.Actions.addProfile } + MenuItem { action: Cura.Actions.updateProfile } + MenuItem { action: Cura.Actions.resetProfile } + MenuSeparator { } + MenuItem { action: Cura.Actions.manageProfiles } + } + + UM.SimpleButton + { + id: customisedSettings + + visible: Cura.MachineManager.hasUserSettings + height: parent.height * 0.6 + width: parent.height * 0.6 + + anchors.verticalCenter: parent.verticalCenter + anchors.right: parent.right + anchors.rightMargin: UM.Theme.getSize("setting_preferences_button_margin").width - UM.Theme.getSize("default_margin").width + + color: hovered ? UM.Theme.getColor("setting_control_button_hover") : UM.Theme.getColor("setting_control_button"); + iconSource: UM.Theme.getIcon("star"); + + onClicked: Cura.Actions.manageProfiles.trigger() + onEntered: + { + var content = catalog.i18nc("@tooltip","Some setting values are different from the values stored in the profile.\n\nClick to open the profile manager.") + base.showTooltip(globalProfileRow, Qt.point(0, globalProfileRow.height / 2), content) + } + onExited: base.hideTooltip() + } + } + } + + UM.SettingPropertyProvider + { + id: machineExtruderCount + + containerStackId: Cura.MachineManager.activeMachineId + key: "machine_extruder_count" + watchedProperties: [ "value" ] + storeIndex: 0 + } + + UM.I18nCatalog { id: catalog; name:"cura" } } diff --git a/resources/qml/SidebarSimple.qml b/resources/qml/SidebarSimple.qml index f3c551ab0c..80870ac29f 100644 --- a/resources/qml/SidebarSimple.qml +++ b/resources/qml/SidebarSimple.qml @@ -6,7 +6,8 @@ import QtQuick.Controls 1.1 import QtQuick.Controls.Styles 1.1 import QtQuick.Layouts 1.1 -import UM 1.1 as UM +import UM 1.2 as UM +import Cura 1.0 as Cura Item { @@ -27,13 +28,13 @@ Item id: infillCellLeft anchors.top: parent.top anchors.left: parent.left - width: base.width/100* 35 - UM.Theme.getSize("default_margin").width + width: base.width / 100 * 35 - UM.Theme.getSize("default_margin").width height: childrenRect.height Label{ id: infillLabel //: Infill selection label - text: catalog.i18nc("@label","Infill:"); + text: catalog.i18nc("@label", "Infill:"); font: UM.Theme.getFont("default"); color: UM.Theme.getColor("text"); anchors.top: parent.top @@ -56,12 +57,7 @@ Item Repeater { id: infillListView property int activeIndex: { - if(!UM.ActiveProfile.valid) - { - return -1; - } - - var density = parseInt(UM.ActiveProfile.settingValues.getValue("infill_sparse_density")); + var density = parseInt(infillDensity.properties.value) for(var i = 0; i < infillModel.count; ++i) { if(density > infillModel.get(i).percentageMin && density <= infillModel.get(i).percentageMax ) @@ -89,7 +85,7 @@ Item { return UM.Theme.getColor("setting_control_selected") } - else if(mousearea.containsMouse) + else if(infillMouseArea.containsMouse) { return UM.Theme.getColor("setting_control_border_highlight") } @@ -110,17 +106,17 @@ Item } MouseArea { - id: mousearea + id: infillMouseArea anchors.fill: parent hoverEnabled: true onClicked: { if (infillListView.activeIndex != index) { - UM.MachineManager.setSettingValue("infill_sparse_density", model.percentage) + infillDensity.setPropertyValue("value", model.percentage) } } onEntered: { - base.showTooltip(infillCellRight, Qt.point(-infillCellRight.x, parent.height), model.text); + base.showTooltip(infillCellRight, Qt.point(-infillCellRight.x, 0), model.text); } onExited: { base.hideTooltip(); @@ -179,165 +175,143 @@ Item } Rectangle { - id: helpersCellLeft + id: helpersCell anchors.top: infillCellRight.bottom anchors.topMargin: UM.Theme.getSize("default_margin").height anchors.left: parent.left - width: parent.width/100*35 - UM.Theme.getSize("default_margin").width + anchors.right: parent.right height: childrenRect.height Label{ + id: adhesionHelperLabel anchors.left: parent.left anchors.leftMargin: UM.Theme.getSize("default_margin").width - //: Helpers selection label - text: catalog.i18nc("@label:listbox","Helpers:"); + anchors.verticalCenter: brimCheckBox.verticalCenter + width: parent.width / 100 * 35 - 3 * UM.Theme.getSize("default_margin").width + //: Bed adhesion label + text: catalog.i18nc("@label:listbox", "Bed Adhesion:"); font: UM.Theme.getFont("default"); color: UM.Theme.getColor("text"); } - } - Rectangle { - id: helpersCellRight - anchors.top: helpersCellLeft.top - anchors.left: helpersCellLeft.right - width: parent.width/100*65 - UM.Theme.getSize("default_margin").width - height: childrenRect.height CheckBox{ id: brimCheckBox - property bool hovered_ex: false + property alias _hovered: brimMouseArea.containsMouse anchors.top: parent.top - anchors.left: parent.left + anchors.left: adhesionHelperLabel.right + anchors.leftMargin: UM.Theme.getSize("default_margin").width //: Setting enable skirt adhesion checkbox - text: catalog.i18nc("@option:check","Generate Brim"); + text: catalog.i18nc("@option:check", "Print Brim"); style: UM.Theme.styles.checkbox; - checked: UM.ActiveProfile.valid ? UM.ActiveProfile.settingValues.getValue("adhesion_type") == "brim" : false; + checked: platformAdhesionType.properties.value == "brim" + MouseArea { + id: brimMouseArea anchors.fill: parent hoverEnabled: true onClicked: { - UM.MachineManager.setSettingValue("adhesion_type", !parent.checked?"brim":"skirt") + platformAdhesionType.setPropertyValue("value", !parent.checked ? "brim" : "skirt") } onEntered: { - parent.hovered_ex = true - base.showTooltip(brimCheckBox, Qt.point(-helpersCellRight.x, parent.height), + base.showTooltip(brimCheckBox, Qt.point(-brimCheckBox.x, 0), catalog.i18nc("@label", "Enable printing a brim. This will add a single-layer-thick flat area around your object which is easy to cut off afterwards.")); } onExited: { - parent.hovered_ex = false base.hideTooltip(); } } } + + Label{ + id: supportHelperLabel + anchors.left: parent.left + anchors.leftMargin: UM.Theme.getSize("default_margin").width + anchors.verticalCenter: supportCheckBox.verticalCenter + width: parent.width / 100 * 35 - 3 * UM.Theme.getSize("default_margin").width + //: Support label + text: catalog.i18nc("@label:listbox", "Support:"); + font: UM.Theme.getFont("default"); + color: UM.Theme.getColor("text"); + } + CheckBox{ id: supportCheckBox - property bool hovered_ex: false + visible: machineExtruderCount.properties.value <= 1 + property alias _hovered: supportMouseArea.containsMouse anchors.top: brimCheckBox.bottom anchors.topMargin: UM.Theme.getSize("default_margin").height - anchors.left: parent.left + anchors.left: supportHelperLabel.right + anchors.leftMargin: UM.Theme.getSize("default_margin").width //: Setting enable support checkbox - text: catalog.i18nc("@option:check","Generate Support Structure"); + text: catalog.i18nc("@option:check", "Print Support Structure"); style: UM.Theme.styles.checkbox; - checked: UM.ActiveProfile.valid ? UM.ActiveProfile.settingValues.getValue("support_enable") : false; + checked: supportEnabled.properties.value == "True" MouseArea { + id: supportMouseArea anchors.fill: parent hoverEnabled: true onClicked: { - UM.MachineManager.setSettingValue("support_enable", !parent.checked) + supportEnabled.setPropertyValue("value", !parent.checked) } onEntered: { - parent.hovered_ex = true - base.showTooltip(supportCheckBox, Qt.point(-helpersCellRight.x, parent.height), + base.showTooltip(supportCheckBox, Qt.point(-supportCheckBox.x, 0), catalog.i18nc("@label", "Enable printing support structures. This will build up supporting structures below the model to prevent the model from sagging or printing in mid air.")); } onExited: { - parent.hovered_ex = false base.hideTooltip(); } } } - } - function populateExtruderModel() - { - extruderModel.clear() - var extruder_count = UM.MachineManager.getSettingValue("machine_extruder_count"); - for(var extruder = 0; extruder < extruder_count ; extruder++) { - extruderModel.append({ - name: catalog.i18nc("@label", "Extruder %1").arg(extruder), - text: catalog.i18nc("@label", "Extruder %1").arg(extruder), - value: extruder - }) - } - } - - Rectangle { - id: multiExtrusionCell - anchors.top: helpersCellRight.bottom - anchors.topMargin: UM.Theme.getSize("default_margin").height - anchors.left: parent.left - width: parent.width - height: childrenRect.height - // Use both UM.ActiveProfile and UM.MachineManager to force UM.MachineManager.getSettingValue() to be reevaluated - visible: UM.ActiveProfile.settingValues.getValue("machine_extruder_count") || (UM.MachineManager.getSettingValue("machine_extruder_count") > 1) - - Label { - id: mainExtruderLabel - text: catalog.i18nc("@label:listbox","Print object with:") - font: UM.Theme.getFont("default") - color: UM.Theme.getColor("text") - width: base.width/100* 35 - 2*UM.Theme.getSize("default_margin").width - anchors.left: parent.left - anchors.leftMargin: UM.Theme.getSize("default_margin").width - anchors.verticalCenter: mainExtruderCombobox.verticalCenter - } - ComboBox { - id: mainExtruderCombobox - model: extruderModel - anchors.top: parent.top - anchors.left: supportExtruderLabel.right - style: UM.Theme.styles.combobox - currentIndex: UM.ActiveProfile.valid ? UM.ActiveProfile.settingValues.getValue("extruder_nr") : 0 - onActivated: { - UM.MachineManager.setSettingValue("extruder_nr", index) - } - } - - Label { - id: supportExtruderLabel - visible: supportCheckBox.checked - text: catalog.i18nc("@label:listbox","Print support with:") - font: UM.Theme.getFont("default") - color: UM.Theme.getColor("text") - width: base.width/100* 35 - 2*UM.Theme.getSize("default_margin").width - height: visible ? mainExtruderLabel.height : 0 - anchors.left: parent.left - anchors.leftMargin: UM.Theme.getSize("default_margin").width - anchors.verticalCenter: supportExtruderCombobox.verticalCenter - } ComboBox { id: supportExtruderCombobox - visible: supportCheckBox.checked + visible: machineExtruderCount.properties.value > 1 model: extruderModel - height: visible ? mainExtruderCombobox.height : 0 - anchors.top: mainExtruderCombobox.bottom + + anchors.top: brimCheckBox.bottom anchors.topMargin: UM.Theme.getSize("default_margin").height - anchors.left: supportExtruderLabel.right + anchors.left: supportHelperLabel.right + anchors.leftMargin: UM.Theme.getSize("default_margin").width + width: parent.width / 100 * 45 + style: UM.Theme.styles.combobox - currentIndex: UM.ActiveProfile.valid ? UM.ActiveProfile.settingValues.getValue("support_extruder_nr") : 0 + property alias _hovered: supportExtruderMouseArea.containsMouse + + currentIndex: supportEnabled.properties.value == "True" ? parseFloat(supportExtruderNr.properties.value) + 1 : 0 onActivated: { - UM.MachineManager.setSettingValue("support_extruder_nr", index) + if(index==0) { + supportEnabled.setPropertyValue("value", false); + } else { + supportEnabled.setPropertyValue("value", true); + supportExtruderNr.setPropertyValue("value", index - 1); + } + } + MouseArea { + id: supportExtruderMouseArea + anchors.fill: parent + hoverEnabled: true + acceptedButtons: Qt.NoButton + onEntered: + { + base.showTooltip(supportExtruderCombobox, Qt.point(-supportExtruderCombobox.x, 0), + catalog.i18nc("@label", "Select which extruder to use for support. This will build up supporting structures below the model to prevent the model from sagging or printing in mid air.")); + } + onExited: + { + base.hideTooltip(); + } } } @@ -348,14 +322,27 @@ Item Connections { id: machineChange - target: UM.MachineManager - onActiveMachineInstanceChanged: populateExtruderModel() + target: Cura.MachineManager + onGlobalContainerChanged: populateExtruderModel() + } + } + + function populateExtruderModel() + { + extruderModel.clear(); + extruderModel.append({ + text: catalog.i18nc("@label", "Don't print support") + }) + for(var extruder = 0; extruder < machineExtruderCount.properties.value ; extruder++) { + extruderModel.append({ + text: catalog.i18nc("@label", "Print using Extruder %1").arg(extruder + 1) + }) } } Rectangle { id: tipsCell - anchors.top: multiExtrusionCell.visible? multiExtrusionCell.bottom : helpersCellRight.bottom + anchors.top: helpersCell.bottom anchors.topMargin: UM.Theme.getSize("default_margin").height anchors.left: parent.left width: parent.width @@ -368,11 +355,60 @@ Item anchors.rightMargin: UM.Theme.getSize("default_margin").width wrapMode: Text.WordWrap //: Tips label - text: catalog.i18nc("@label","Need help improving your prints? Read the Ultimaker Troubleshooting Guides").arg("https://ultimaker.com/en/troubleshooting"); + text: catalog.i18nc("@label", "Need help improving your prints? Read the Ultimaker Troubleshooting Guides").arg("https://ultimaker.com/en/troubleshooting"); font: UM.Theme.getFont("default"); color: UM.Theme.getColor("text"); linkColor: UM.Theme.getColor("text_link") onLinkActivated: Qt.openUrlExternally(link) } } + + UM.SettingPropertyProvider + { + id: infillDensity + + containerStackId: Cura.MachineManager.activeMachineId + key: "infill_sparse_density" + watchedProperties: [ "value" ] + storeIndex: 0 + } + + UM.SettingPropertyProvider + { + id: platformAdhesionType + + containerStackId: Cura.MachineManager.activeMachineId + key: "adhesion_type" + watchedProperties: [ "value" ] + storeIndex: 0 + } + + UM.SettingPropertyProvider + { + id: supportEnabled + + containerStackId: Cura.MachineManager.activeMachineId + key: "support_enable" + watchedProperties: [ "value" ] + storeIndex: 0 + } + + UM.SettingPropertyProvider + { + id: machineExtruderCount + + containerStackId: Cura.MachineManager.activeMachineId + key: "machine_extruder_count" + watchedProperties: [ "value" ] + storeIndex: 0 + } + UM.SettingPropertyProvider + { + id: supportExtruderNr + + containerStackId: Cura.MachineManager.activeMachineId + key: "support_extruder_nr" + watchedProperties: [ "value" ] + storeIndex: 0 + } } diff --git a/resources/qml/SidebarTooltip.qml b/resources/qml/SidebarTooltip.qml index 1c7f4bcb76..5cb7ff1f0b 100644 --- a/resources/qml/SidebarTooltip.qml +++ b/resources/qml/SidebarTooltip.qml @@ -31,7 +31,7 @@ UM.PointingRectangle { y = position.y - UM.Theme.getSize("tooltip_arrow_margins").height; } base.opacity = 1; - target = Qt.point(40 , position.y) + target = Qt.point(40 , position.y + UM.Theme.getSize("tooltip_arrow_margins").height / 2) } function hide() { diff --git a/resources/qml/Toolbar.qml b/resources/qml/Toolbar.qml index d5274cd873..bde063de10 100644 --- a/resources/qml/Toolbar.qml +++ b/resources/qml/Toolbar.qml @@ -25,7 +25,7 @@ Item { Repeater { id: repeat - model: UM.Models.toolModel + model: UM.ToolModel { } Button { text: model.name diff --git a/resources/qml/ViewPage.qml b/resources/qml/ViewPage.qml deleted file mode 100644 index 7d840f7ab0..0000000000 --- a/resources/qml/ViewPage.qml +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright (c) 2015 Ultimaker B.V. -// Cura is released under the terms of the AGPLv3 or higher. - -import QtQuick 2.1 -import QtQuick.Controls 1.1 -import QtQuick.Layouts 1.1 -import QtQuick.Controls.Styles 1.1 - -import UM 1.1 as UM - -UM.PreferencesPage -{ - id: preferencesPage - - //: View configuration page title - title: catalog.i18nc("@title:window","View"); - - function reset() - { - UM.Preferences.resetPreference("view/show_overhang"); - UM.Preferences.resetPreference("view/center_on_select"); - } - - Column - { - UM.I18nCatalog { id: catalog; name:"cura"} - - UM.TooltipArea - { - width: childrenRect.width; - height: childrenRect.height; - - text: catalog.i18nc("@info:tooltip","Highlight unsupported areas of the model in red. Without support these areas will not print properly.") - - CheckBox - { - id: overhangCheckbox - - checked: boolCheck(UM.Preferences.getValue("view/show_overhang")) - onClicked: UM.Preferences.setValue("view/show_overhang", checked) - - text: catalog.i18nc("@option:check","Display overhang"); - } - } - - UM.TooltipArea { - width: childrenRect.width; - height: childrenRect.height; - text: catalog.i18nc("@info:tooltip","Moves the camera so the object is in the center of the view when an object is selected") - - CheckBox - { - id: centerCheckbox - text: catalog.i18nc("@action:button","Center camera when item is selected"); - checked: boolCheck(UM.Preferences.getValue("view/center_on_select")) - onClicked: UM.Preferences.setValue("view/center_on_select", checked) - } - } - - Connections { - target: UM.Preferences - onPreferenceChanged: - { - overhangCheckbox.checked = boolCheck(UM.Preferences.getValue("view/show_overhang")) - centerCheckbox.checked = boolCheck(UM.Preferences.getValue("view/center_on_select")) - } - } - } -} diff --git a/resources/qml/WizardPages/SelectUpgradedParts.qml b/resources/qml/WizardPages/SelectUpgradedParts.qml index 4a327a6ed4..a49401ada9 100644 --- a/resources/qml/WizardPages/SelectUpgradedParts.qml +++ b/resources/qml/WizardPages/SelectUpgradedParts.qml @@ -17,9 +17,6 @@ Item Component.onDestruction: { - if (extruderCheckBox.checked == true){ - UM.MachineManager.setMachineSettingValue("machine_extruder_drive_upgrade", true) - } if (heatedBedCheckBox1.checked == true || heatedBedCheckBox2.checked == true){ UM.MachineManager.setMachineSettingValue("machine_heated_bed", true) } @@ -52,12 +49,6 @@ Item anchors.topMargin: UM.Theme.getSize("default_margin").height width: parent.width - UM.Theme.getSize("default_margin").width CheckBox - { - id: extruderCheckBox - text: catalog.i18nc("@option:check","Extruder driver ugrades") - checked: true - } - CheckBox { id: heatedBedCheckBox1 text: catalog.i18nc("@option:check","Heated printer bed") diff --git a/resources/profiles/general/High+Quality.cfg b/resources/quality/high.inst.cfg similarity index 59% rename from resources/profiles/general/High+Quality.cfg rename to resources/quality/high.inst.cfg index a006c7a995..b4498c6c8b 100644 --- a/resources/profiles/general/High+Quality.cfg +++ b/resources/quality/high.inst.cfg @@ -1,10 +1,13 @@ [general] -version = 1 +version = 2 name = High Quality +definition = fdmprinter + +[metadata] +type = quality weight = -3 -[settings] +[values] layer_height = 0.06 speed_topbottom = 15 speed_infill = 80 - diff --git a/resources/profiles/general/Low+Quality.cfg b/resources/quality/low.inst.cfg similarity index 74% rename from resources/profiles/general/Low+Quality.cfg rename to resources/quality/low.inst.cfg index f7f4e5d6b7..d34a7c6461 100644 --- a/resources/profiles/general/Low+Quality.cfg +++ b/resources/quality/low.inst.cfg @@ -1,9 +1,13 @@ [general] -version = 1 +version = 2 name = Low Quality +definition = fdmprinter + +[metadata] +type = quality weight = -1 -[settings] +[values] infill_sparse_density = 10 layer_height = 0.15 cool_min_layer_time = 3 @@ -12,4 +16,3 @@ speed_wall_x = 80 speed_infill = 100 wall_thickness = 1 speed_topbottom = 30 - diff --git a/resources/quality/normal.inst.cfg b/resources/quality/normal.inst.cfg new file mode 100644 index 0000000000..417c7c700f --- /dev/null +++ b/resources/quality/normal.inst.cfg @@ -0,0 +1,10 @@ +[general] +version = 2 +name = Normal Quality +definition = fdmprinter + +[metadata] +type = quality +weight = -2 + +[values] diff --git a/resources/quality/ultimaker2_extended_plus/um2ep_abs_0.25_normal.inst.cfg b/resources/quality/ultimaker2_extended_plus/um2ep_abs_0.25_normal.inst.cfg new file mode 100644 index 0000000000..11b926378d --- /dev/null +++ b/resources/quality/ultimaker2_extended_plus/um2ep_abs_0.25_normal.inst.cfg @@ -0,0 +1,22 @@ +[general] +version = 2 +name = High Quality +definition = ultimaker2_extended_plus + +[metadata] +type = quality +material = generic_abs_ultimaker2_extended_plus_0.25_mm +weight = -2 + +[values] +layer_height = 0.06 +wall_thickness = 0.88 +top_bottom_thickness = 0.72 +infill_sparse_density = 22 +speed_print = 30 +cool_min_layer_time = 3 +cool_fan_speed_min = 20 +cool_min_speed = 10 +cool_min_layer_time_fan_speed_max = 15 + + diff --git a/resources/quality/ultimaker2_extended_plus/um2ep_abs_0.4_fast.inst.cfg b/resources/quality/ultimaker2_extended_plus/um2ep_abs_0.4_fast.inst.cfg new file mode 100644 index 0000000000..bdeeb935f4 --- /dev/null +++ b/resources/quality/ultimaker2_extended_plus/um2ep_abs_0.4_fast.inst.cfg @@ -0,0 +1,25 @@ +[general] +version = 2 +name = Fast Print +definition = ultimaker2_extended_plus + +[metadata] +type = quality +material = generic_abs_ultimaker2_extended_plus_0.4_mm +weight = -1 + +[values] +layer_height = 0.15 +wall_thickness = 0.7 +top_bottom_thickness = 0.75 +infill_sparse_density = 18 +speed_print = 55 +speed_wall = 40 +speed_topbottom = 30 +speed_travel = 150 +speed_layer_0 = 30 +cool_min_layer_time = 3 +cool_fan_speed_min = 20 +cool_min_speed = 10 +cool_min_layer_time_fan_speed_max = 15 + diff --git a/resources/quality/ultimaker2_extended_plus/um2ep_abs_0.4_high.inst.cfg b/resources/quality/ultimaker2_extended_plus/um2ep_abs_0.4_high.inst.cfg new file mode 100644 index 0000000000..d658ee5bb5 --- /dev/null +++ b/resources/quality/ultimaker2_extended_plus/um2ep_abs_0.4_high.inst.cfg @@ -0,0 +1,22 @@ +[general] +version = 2 +name = High Quality +definition = ultimaker2_extended_plus + +[metadata] +type = quality +material = generic_abs_ultimaker2_extended_plus_0.4_mm +weight = -3 + +[values] +layer_height = 0.06 +wall_thickness = 1.05 +top_bottom_thickness = 0.72 +infill_sparse_density = 22 +speed_print = 45 +speed_wall = 30 +cool_min_layer_time = 3 +cool_fan_speed_min = 20 +cool_min_speed = 10 +cool_min_layer_time_fan_speed_max = 15 + diff --git a/resources/quality/ultimaker2_extended_plus/um2ep_abs_0.4_normal.inst.cfg b/resources/quality/ultimaker2_extended_plus/um2ep_abs_0.4_normal.inst.cfg new file mode 100644 index 0000000000..ff024ccc69 --- /dev/null +++ b/resources/quality/ultimaker2_extended_plus/um2ep_abs_0.4_normal.inst.cfg @@ -0,0 +1,21 @@ +[general] +version = 2 +name = Normal Quality +definition = ultimaker2_extended_plus + +[metadata] +type = quality +material = generic_abs_ultimaker2_extended_plus_0.4_mm +weight = -2 + +[values] +layer_height = 0.1 +wall_thickness = 1.05 +top_bottom_thickness = 0.8 +infill_sparse_density = 20 +speed_print = 45 +speed_wall = 30 +cool_min_layer_time = 3 +cool_fan_speed_min = 20 +cool_min_speed = 10 +cool_min_layer_time_fan_speed_max = 15 diff --git a/resources/quality/ultimaker2_extended_plus/um2ep_abs_0.6_normal.inst.cfg b/resources/quality/ultimaker2_extended_plus/um2ep_abs_0.6_normal.inst.cfg new file mode 100644 index 0000000000..c2f4daa86f --- /dev/null +++ b/resources/quality/ultimaker2_extended_plus/um2ep_abs_0.6_normal.inst.cfg @@ -0,0 +1,23 @@ +[general] +version = 2 +name = Normal Quality +definition = ultimaker2_extended_plus + +[metadata] +type = quality +material = generic_abs_ultimaker2_extended_plus_0.6_mm +weight = -2 + +[values] +layer_height = 0.15 +wall_thickness = 1.59 +top_bottom_thickness = 1.2 +infill_sparse_density = 20 +speed_print = 40 +speed_infill = 55 +cool_min_layer_time = 3 +cool_fan_speed_min = 50 +cool_min_speed = 20 +cool_min_layer_time_fan_speed_max = 20 + + diff --git a/resources/quality/ultimaker2_extended_plus/um2ep_abs_0.8_normal.inst.cfg b/resources/quality/ultimaker2_extended_plus/um2ep_abs_0.8_normal.inst.cfg new file mode 100644 index 0000000000..362e844214 --- /dev/null +++ b/resources/quality/ultimaker2_extended_plus/um2ep_abs_0.8_normal.inst.cfg @@ -0,0 +1,21 @@ +[general] +version = 2 +name = Fast Print +definition = ultimaker2_extended_plus + +[metadata] +type = quality +material = generic_abs_ultimaker2_extended_plus_0.8_mm +weight = -2 + +[values] +layer_height = 0.2 +wall_thickness = 2.1 +top_bottom_thickness = 1.2 +infill_sparse_density = 20 +speed_print = 40 +cool_min_layer_time = 3 +cool_fan_speed_min = 50 +cool_min_speed = 15 +cool_min_layer_time_fan_speed_max = 25 + diff --git a/resources/quality/ultimaker2_extended_plus/um2ep_cpe_0.25_normal.inst.cfg b/resources/quality/ultimaker2_extended_plus/um2ep_cpe_0.25_normal.inst.cfg new file mode 100644 index 0000000000..f4d9264d3e --- /dev/null +++ b/resources/quality/ultimaker2_extended_plus/um2ep_cpe_0.25_normal.inst.cfg @@ -0,0 +1,21 @@ +[general] +version = 2 +name = High Quality +definition = ultimaker2_extended_plus + +[metadata] +type = quality +material = generic_cpe_ultimaker2_extended_plus_0.25_mm +weight = -2 + +[values] +layer_height = 0.06 +wall_thickness = 0.88 +top_bottom_thickness = 0.72 +infill_sparse_density = 22 +speed_print = 30 +cool_min_layer_time = 2 +cool_fan_speed_min = 20 +cool_min_speed = 15 +cool_min_layer_time_fan_speed_max = 15 + diff --git a/resources/quality/ultimaker2_extended_plus/um2ep_cpe_0.4_fast.inst.cfg b/resources/quality/ultimaker2_extended_plus/um2ep_cpe_0.4_fast.inst.cfg new file mode 100644 index 0000000000..f514f22294 --- /dev/null +++ b/resources/quality/ultimaker2_extended_plus/um2ep_cpe_0.4_fast.inst.cfg @@ -0,0 +1,25 @@ +[general] +version = 2 +name = Fast Print +definition = ultimaker2_extended_plus + +[metadata] +type = quality +material = generic_cpe_ultimaker2_extended_plus_0.4_mm +weight = -1 + +[values] +layer_height = 0.15 +wall_thickness = 0.7 +top_bottom_thickness = 0.75 +infill_sparse_density = 18 +speed_print = 45 +speed_wall = 40 +speed_travel = 150 +speed_layer_0 = 30 +cool_min_layer_time = 3 +cool_fan_speed_min = 80 +cool_min_speed = 10 +cool_min_layer_time_fan_speed_max = 15 + + diff --git a/resources/quality/ultimaker2_extended_plus/um2ep_cpe_0.4_high.inst.cfg b/resources/quality/ultimaker2_extended_plus/um2ep_cpe_0.4_high.inst.cfg new file mode 100644 index 0000000000..0c68be2f5f --- /dev/null +++ b/resources/quality/ultimaker2_extended_plus/um2ep_cpe_0.4_high.inst.cfg @@ -0,0 +1,21 @@ +[general] +version = 2 +name = High Quality +definition = ultimaker2_extended_plus + +[metadata] +type = quality +material = generic_cpe_ultimaker2_extended_plus_0.4_mm +weight = -3 + +[values] +layer_height = 0.06 +wall_thickness = 1.05 +top_bottom_thickness = 0.72 +infill_sparse_density = 22 +speed_print = 45 +speed_wall = 30 +cool_min_layer_time = 2 +cool_fan_speed_min = 80 +cool_min_speed = 15 +cool_min_layer_time_fan_speed_max = 15 diff --git a/resources/quality/ultimaker2_extended_plus/um2ep_cpe_0.4_normal.inst.cfg b/resources/quality/ultimaker2_extended_plus/um2ep_cpe_0.4_normal.inst.cfg new file mode 100644 index 0000000000..26ea8ce9bc --- /dev/null +++ b/resources/quality/ultimaker2_extended_plus/um2ep_cpe_0.4_normal.inst.cfg @@ -0,0 +1,22 @@ +[general] +version = 2 +name = Normal Quality +definition = ultimaker2_extended_plus + +[metadata] +type = quality +material = generic_cpe_ultimaker2_extended_plus_0.4_mm +weight = -2 + +[values] +layer_height = 0.1 +wall_thickness = 1.05 +top_bottom_thickness = 0.8 +infill_sparse_density = 20 +speed_print = 45 +speed_wall = 30 +cool_min_layer_time = 3 +cool_fan_speed_min = 80 +cool_min_speed = 10 +cool_min_layer_time_fan_speed_max = 15 + diff --git a/resources/quality/ultimaker2_extended_plus/um2ep_cpe_0.6_normal.inst.cfg b/resources/quality/ultimaker2_extended_plus/um2ep_cpe_0.6_normal.inst.cfg new file mode 100644 index 0000000000..d6d10dbe1a --- /dev/null +++ b/resources/quality/ultimaker2_extended_plus/um2ep_cpe_0.6_normal.inst.cfg @@ -0,0 +1,20 @@ +[general] +version = 2 +name = Normal Quality +definition = ultimaker2_extended_plus + +[metadata] +type = quality +material = generic_cpe_ultimaker2_extended_plus_0.6_mm +weight = -2 + +[values] +layer_height = 0.15 +wall_thickness = 1.59 +top_bottom_thickness = 1.2 +infill_sparse_density = 20 +speed_print = 40 +cool_min_layer_time = 5 +cool_fan_speed_min = 80 +cool_min_speed = 8 +cool_min_layer_time_fan_speed_max = 20 diff --git a/resources/quality/ultimaker2_extended_plus/um2ep_cpe_0.8_normal.inst.cfg b/resources/quality/ultimaker2_extended_plus/um2ep_cpe_0.8_normal.inst.cfg new file mode 100644 index 0000000000..53d5e0bc8c --- /dev/null +++ b/resources/quality/ultimaker2_extended_plus/um2ep_cpe_0.8_normal.inst.cfg @@ -0,0 +1,20 @@ +[general] +version = 2 +name = Fast Print +definition = ultimaker2_extended_plus + +[metadata] +type = quality +material = generic_cpe_ultimaker2_extended_plus_0.8_mm +weight = -2 + +[values] +layer_height = 0.2 +wall_thickness = 2.1 +top_bottom_thickness = 1.2 +infill_sparse_density = 20 +speed_print = 40 +cool_min_layer_time = 3 +cool_fan_speed_min = 80 +cool_min_speed = 8 +cool_min_layer_time_fan_speed_max = 25 diff --git a/resources/quality/ultimaker2_extended_plus/um2ep_pla_0.25_normal.inst.cfg b/resources/quality/ultimaker2_extended_plus/um2ep_pla_0.25_normal.inst.cfg new file mode 100644 index 0000000000..5e54b3194a --- /dev/null +++ b/resources/quality/ultimaker2_extended_plus/um2ep_pla_0.25_normal.inst.cfg @@ -0,0 +1,18 @@ +[general] +version = 2 +name = High Quality +definition = ultimaker2_extended_plus + +[metadata] +type = quality +material = generic_pla_ultimaker2_extended_plus_0.25_mm +weight = -2 + +[values] +layer_height = 0.06 +wall_thickness = 0.88 +top_bottom_thickness = 0.72 +infill_sparse_density = 22 +speed_print = 30 +cool_min_layer_time = 5 +cool_min_speed = 10 diff --git a/resources/profiles/ultimaker2+/pla_0.4_fast.curaprofile b/resources/quality/ultimaker2_extended_plus/um2ep_pla_0.4_fast.inst.cfg similarity index 62% rename from resources/profiles/ultimaker2+/pla_0.4_fast.curaprofile rename to resources/quality/ultimaker2_extended_plus/um2ep_pla_0.4_fast.inst.cfg index 06e401c139..893256bb33 100644 --- a/resources/profiles/ultimaker2+/pla_0.4_fast.curaprofile +++ b/resources/quality/ultimaker2_extended_plus/um2ep_pla_0.4_fast.inst.cfg @@ -1,12 +1,14 @@ [general] -version = 1 +version = 2 name = Fast Print -machine_type = ultimaker2plus -machine_variant = 0.4 mm -material = PLA +definition = ultimaker2_extended_plus + +[metadata] +type = quality +material = generic_pla_ultimaker2_extended_plus_0.4_mm weight = -1 -[settings] +[values] layer_height = 0.15 wall_thickness = 0.7 top_bottom_thickness = 0.75 diff --git a/resources/profiles/ultimaker2+/pla_0.4_high.curaprofile b/resources/quality/ultimaker2_extended_plus/um2ep_pla_0.4_high.inst.cfg similarity index 58% rename from resources/profiles/ultimaker2+/pla_0.4_high.curaprofile rename to resources/quality/ultimaker2_extended_plus/um2ep_pla_0.4_high.inst.cfg index 5e2f762354..844e2b3eac 100644 --- a/resources/profiles/ultimaker2+/pla_0.4_high.curaprofile +++ b/resources/quality/ultimaker2_extended_plus/um2ep_pla_0.4_high.inst.cfg @@ -1,12 +1,14 @@ [general] -version = 1 +version = 2 name = High Quality -machine_type = ultimaker2plus -machine_variant = 0.4 mm -material = PLA +definition = ultimaker2_extended_plus + +[metadata] +type = quality +material = generic_pla_ultimaker2_extended_plus_0.4_mm weight = -3 -[settings] +[values] layer_height = 0.06 wall_thickness = 1.05 top_bottom_thickness = 0.72 diff --git a/resources/profiles/ultimaker2+/pla_0.4_normal.curaprofile b/resources/quality/ultimaker2_extended_plus/um2ep_pla_0.4_normal.inst.cfg similarity index 58% rename from resources/profiles/ultimaker2+/pla_0.4_normal.curaprofile rename to resources/quality/ultimaker2_extended_plus/um2ep_pla_0.4_normal.inst.cfg index 689a3251b2..47d511446a 100644 --- a/resources/profiles/ultimaker2+/pla_0.4_normal.curaprofile +++ b/resources/quality/ultimaker2_extended_plus/um2ep_pla_0.4_normal.inst.cfg @@ -1,12 +1,14 @@ [general] -version = 1 +version = 2 name = Normal Quality -machine_type = ultimaker2plus -machine_variant = 0.4 mm -material = PLA +definition = ultimaker2_extended_plus + +[metadata] +type = quality +material = generic_pla_ultimaker2_extended_plus_0.4_mm weight = -2 -[settings] +[values] layer_height = 0.1 wall_thickness = 1.05 top_bottom_thickness = 0.8 diff --git a/resources/profiles/ultimaker2+/pla_0.6_normal.curaprofile b/resources/quality/ultimaker2_extended_plus/um2ep_pla_0.6_normal.inst.cfg similarity index 58% rename from resources/profiles/ultimaker2+/pla_0.6_normal.curaprofile rename to resources/quality/ultimaker2_extended_plus/um2ep_pla_0.6_normal.inst.cfg index 188ed42a95..a2b15b6f16 100644 --- a/resources/profiles/ultimaker2+/pla_0.6_normal.curaprofile +++ b/resources/quality/ultimaker2_extended_plus/um2ep_pla_0.6_normal.inst.cfg @@ -1,12 +1,14 @@ [general] -version = 1 +version = 2 name = Normal Quality -machine_type = ultimaker2plus -machine_variant = 0.6 mm -material = PLA +definition = ultimaker2_extended_plus + +[metadata] +material = generic_pla_ultimaker2_extended_plus_0.6_mm +type = quality weight = -2 -[settings] +[values] layer_height = 0.15 wall_thickness = 1.59 top_bottom_thickness = 1.2 diff --git a/resources/profiles/ultimaker2+/pla_0.8_normal.curaprofile b/resources/quality/ultimaker2_extended_plus/um2ep_pla_0.8_normal.inst.cfg similarity index 58% rename from resources/profiles/ultimaker2+/pla_0.8_normal.curaprofile rename to resources/quality/ultimaker2_extended_plus/um2ep_pla_0.8_normal.inst.cfg index 92cb4a6054..08b5bec667 100644 --- a/resources/profiles/ultimaker2+/pla_0.8_normal.curaprofile +++ b/resources/quality/ultimaker2_extended_plus/um2ep_pla_0.8_normal.inst.cfg @@ -1,12 +1,14 @@ [general] -version = 1 +version = 2 name = Fast Print -machine_type = ultimaker2plus -machine_variant = 0.8 mm -material = PLA +definition = ultimaker2_extended_plus + +[metadata] +material = generic_pla_ultimaker2_extended_plus_0.8_mm +type = quality weight = -2 -[settings] +[values] layer_height = 0.2 wall_thickness = 2.1 top_bottom_thickness = 1.2 diff --git a/resources/profiles/ultimaker2+/pla_0.25_normal.curaprofile b/resources/quality/ultimaker2_plus/pla_0.25_normal.inst.cfg similarity index 61% rename from resources/profiles/ultimaker2+/pla_0.25_normal.curaprofile rename to resources/quality/ultimaker2_plus/pla_0.25_normal.inst.cfg index 63c1fc9fdd..9a44582610 100644 --- a/resources/profiles/ultimaker2+/pla_0.25_normal.curaprofile +++ b/resources/quality/ultimaker2_plus/pla_0.25_normal.inst.cfg @@ -1,12 +1,14 @@ [general] -version = 1 +version = 2 name = High Quality -machine_type = ultimaker2plus -machine_variant = 0.25 mm -material = PLA +definition = ultimaker2_plus + +[metadata] +type = quality +material = generic_pla_ultimaker2_plus_0.25_mm weight = -2 -[settings] +[values] layer_height = 0.06 wall_thickness = 0.88 top_bottom_thickness = 0.72 diff --git a/resources/quality/ultimaker2_plus/pla_0.4_fast.inst.cfg b/resources/quality/ultimaker2_plus/pla_0.4_fast.inst.cfg new file mode 100644 index 0000000000..0df882e418 --- /dev/null +++ b/resources/quality/ultimaker2_plus/pla_0.4_fast.inst.cfg @@ -0,0 +1,22 @@ +[general] +version = 2 +name = Fast Print +definition = ultimaker2_plus + +[metadata] +type = quality +material = generic_pla_ultimaker2_plus_0.4_mm +weight = -1 + +[values] +layer_height = 0.15 +wall_thickness = 0.7 +top_bottom_thickness = 0.75 +infill_sparse_density = 18 +speed_print = 60 +speed_wall = 50 +speed_topbottom = 30 +speed_travel = 150 +speed_layer_0 = 30 +cool_min_layer_time = 5 +cool_min_speed = 10 diff --git a/resources/quality/ultimaker2_plus/pla_0.4_high.inst.cfg b/resources/quality/ultimaker2_plus/pla_0.4_high.inst.cfg new file mode 100644 index 0000000000..a8abdb081f --- /dev/null +++ b/resources/quality/ultimaker2_plus/pla_0.4_high.inst.cfg @@ -0,0 +1,19 @@ +[general] +version = 2 +name = High Quality +definition = ultimaker2_plus + +[metadata] +type = quality +material = generic_pla_ultimaker2_plus_0.4_mm +weight = -3 + +[values] +layer_height = 0.06 +wall_thickness = 1.05 +top_bottom_thickness = 0.72 +infill_sparse_density = 22 +speed_print = 50 +speed_topbottom = 20 +cool_min_layer_time = 5 +cool_min_speed = 10 diff --git a/resources/quality/ultimaker2_plus/pla_0.4_normal.inst.cfg b/resources/quality/ultimaker2_plus/pla_0.4_normal.inst.cfg new file mode 100644 index 0000000000..c29b017bbe --- /dev/null +++ b/resources/quality/ultimaker2_plus/pla_0.4_normal.inst.cfg @@ -0,0 +1,19 @@ +[general] +version = 2 +name = Normal Quality +definition = ultimaker2_plus + +[metadata] +type = quality +material = generic_pla_ultimaker2_plus_0.4_mm +weight = -2 + +[values] +layer_height = 0.1 +wall_thickness = 1.05 +top_bottom_thickness = 0.8 +infill_sparse_density = 20 +speed_print = 50 +speed_topbottom = 20 +cool_min_layer_time = 5 +cool_min_speed = 10 diff --git a/resources/quality/ultimaker2_plus/pla_0.6_normal.inst.cfg b/resources/quality/ultimaker2_plus/pla_0.6_normal.inst.cfg new file mode 100644 index 0000000000..5a0a840ae7 --- /dev/null +++ b/resources/quality/ultimaker2_plus/pla_0.6_normal.inst.cfg @@ -0,0 +1,21 @@ +[general] +version = 2 +name = Normal Quality +definition = ultimaker2_plus + +[metadata] +material = generic_pla_ultimaker2_plus_0.6_mm +type = quality +weight = -2 + +[values] +layer_height = 0.15 +wall_thickness = 1.59 +top_bottom_thickness = 1.2 +infill_sparse_density = 20 +speed_print = 55 +speed_wall = 40 +speed_wall_0 = 25 +speed_topbottom = 20 +cool_min_layer_time = 5 +cool_min_speed = 10 diff --git a/resources/quality/ultimaker2_plus/pla_0.8_normal.inst.cfg b/resources/quality/ultimaker2_plus/pla_0.8_normal.inst.cfg new file mode 100644 index 0000000000..bd90b8c059 --- /dev/null +++ b/resources/quality/ultimaker2_plus/pla_0.8_normal.inst.cfg @@ -0,0 +1,19 @@ +[general] +version = 2 +name = Fast Print +definition = ultimaker2_plus + +[metadata] +material = generic_pla_ultimaker2_plus_0.8_mm +type = quality +weight = -2 + +[values] +layer_height = 0.2 +wall_thickness = 2.1 +top_bottom_thickness = 1.2 +infill_sparse_density = 20 +speed_print = 40 +speed_wall_0 = 25 +cool_min_layer_time = 5 +cool_min_speed = 10 diff --git a/resources/profiles/ultimaker2+/abs_0.25_normal.curaprofile b/resources/quality/ultimaker2_plus/um2p_abs_0.25_normal.inst.cfg similarity index 68% rename from resources/profiles/ultimaker2+/abs_0.25_normal.curaprofile rename to resources/quality/ultimaker2_plus/um2p_abs_0.25_normal.inst.cfg index 9f45e9d01a..05a9bce71c 100644 --- a/resources/profiles/ultimaker2+/abs_0.25_normal.curaprofile +++ b/resources/quality/ultimaker2_plus/um2p_abs_0.25_normal.inst.cfg @@ -1,12 +1,14 @@ [general] -version = 1 +version = 2 name = High Quality -machine_type = ultimaker2plus -machine_variant = 0.25 mm -material = ABS +definition = ultimaker2_plus + +[metadata] +type = quality +material = generic_abs_ultimaker2_plus_0.25_mm weight = -2 -[settings] +[values] layer_height = 0.06 wall_thickness = 0.88 top_bottom_thickness = 0.72 diff --git a/resources/profiles/ultimaker2+/abs_0.4_fast.curaprofile b/resources/quality/ultimaker2_plus/um2p_abs_0.4_fast.inst.cfg similarity index 65% rename from resources/profiles/ultimaker2+/abs_0.4_fast.curaprofile rename to resources/quality/ultimaker2_plus/um2p_abs_0.4_fast.inst.cfg index 50018372b5..cd0a25981a 100644 --- a/resources/profiles/ultimaker2+/abs_0.4_fast.curaprofile +++ b/resources/quality/ultimaker2_plus/um2p_abs_0.4_fast.inst.cfg @@ -1,17 +1,21 @@ [general] -version = 1 +version = 2 name = Fast Print -machine_type = ultimaker2plus -machine_variant = 0.4 mm -material = ABS +definition = ultimaker2_plus + +[metadata] +type = quality +material = generic_abs_ultimaker2_plus_0.4_mm weight = -1 -[settings] +[values] layer_height = 0.15 wall_thickness = 0.7 top_bottom_thickness = 0.75 infill_sparse_density = 18 speed_print = 55 +speed_wall = 40 +speed_topbottom = 30 speed_travel = 150 speed_layer_0 = 30 cool_min_layer_time = 3 diff --git a/resources/profiles/ultimaker2+/abs_0.4_high.curaprofile b/resources/quality/ultimaker2_plus/um2p_abs_0.4_high.inst.cfg similarity index 65% rename from resources/profiles/ultimaker2+/abs_0.4_high.curaprofile rename to resources/quality/ultimaker2_plus/um2p_abs_0.4_high.inst.cfg index 341c9cc34f..4b1ece31ef 100644 --- a/resources/profiles/ultimaker2+/abs_0.4_high.curaprofile +++ b/resources/quality/ultimaker2_plus/um2p_abs_0.4_high.inst.cfg @@ -1,17 +1,20 @@ [general] -version = 1 +version = 2 name = High Quality -machine_type = ultimaker2plus -machine_variant = 0.4 mm -material = ABS +definition = ultimaker2_plus + +[metadata] +type = quality +material = generic_abs_ultimaker2_plus_0.4_mm weight = -3 -[settings] +[values] layer_height = 0.06 wall_thickness = 1.05 top_bottom_thickness = 0.72 infill_sparse_density = 22 speed_print = 45 +speed_wall = 30 cool_min_layer_time = 3 cool_fan_speed_min = 20 cool_min_speed = 10 diff --git a/resources/profiles/ultimaker2+/abs_0.4_normal.curaprofile b/resources/quality/ultimaker2_plus/um2p_abs_0.4_normal.inst.cfg similarity index 65% rename from resources/profiles/ultimaker2+/abs_0.4_normal.curaprofile rename to resources/quality/ultimaker2_plus/um2p_abs_0.4_normal.inst.cfg index d8fce8a4dd..f1b01fd408 100644 --- a/resources/profiles/ultimaker2+/abs_0.4_normal.curaprofile +++ b/resources/quality/ultimaker2_plus/um2p_abs_0.4_normal.inst.cfg @@ -1,17 +1,20 @@ [general] -version = 1 +version = 2 name = Normal Quality -machine_type = ultimaker2plus -machine_variant = 0.4 mm -material = ABS +definition = ultimaker2_plus + +[metadata] +type = quality +material = generic_abs_ultimaker2_plus_0.4_mm weight = -2 -[settings] +[values] layer_height = 0.1 wall_thickness = 1.05 top_bottom_thickness = 0.8 infill_sparse_density = 20 speed_print = 45 +speed_wall = 30 cool_min_layer_time = 3 cool_fan_speed_min = 20 cool_min_speed = 10 diff --git a/resources/profiles/ultimaker2+/abs_0.6_normal.curaprofile b/resources/quality/ultimaker2_plus/um2p_abs_0.6_normal.inst.cfg similarity index 65% rename from resources/profiles/ultimaker2+/abs_0.6_normal.curaprofile rename to resources/quality/ultimaker2_plus/um2p_abs_0.6_normal.inst.cfg index 5512450471..89e73dda38 100644 --- a/resources/profiles/ultimaker2+/abs_0.6_normal.curaprofile +++ b/resources/quality/ultimaker2_plus/um2p_abs_0.6_normal.inst.cfg @@ -1,17 +1,20 @@ [general] -version = 1 +version = 2 name = Normal Quality -machine_type = ultimaker2plus -machine_variant = 0.6 mm -material = ABS +definition = ultimaker2_plus + +[metadata] +type = quality +material = generic_abs_ultimaker2_plus_0.6_mm weight = -2 -[settings] +[values] layer_height = 0.15 wall_thickness = 1.59 top_bottom_thickness = 1.2 infill_sparse_density = 20 speed_print = 40 +speed_infill = 55 cool_min_layer_time = 3 cool_fan_speed_min = 50 cool_min_speed = 20 diff --git a/resources/profiles/ultimaker2+/abs_0.8_normal.curaprofile b/resources/quality/ultimaker2_plus/um2p_abs_0.8_normal.inst.cfg similarity index 67% rename from resources/profiles/ultimaker2+/abs_0.8_normal.curaprofile rename to resources/quality/ultimaker2_plus/um2p_abs_0.8_normal.inst.cfg index e5f27c51a2..2171fd3837 100644 --- a/resources/profiles/ultimaker2+/abs_0.8_normal.curaprofile +++ b/resources/quality/ultimaker2_plus/um2p_abs_0.8_normal.inst.cfg @@ -1,12 +1,14 @@ [general] -version = 1 +version = 2 name = Fast Print -machine_type = ultimaker2plus -machine_variant = 0.8 mm -material = ABS +definition = ultimaker2_plus + +[metadata] +type = quality +material = generic_abs_ultimaker2_plus_0.8_mm weight = -2 -[settings] +[values] layer_height = 0.2 wall_thickness = 2.1 top_bottom_thickness = 1.2 diff --git a/resources/profiles/ultimaker2+/cpe_0.25_normal.curaprofile b/resources/quality/ultimaker2_plus/um2p_cpe_0.25_normal.inst.cfg similarity index 68% rename from resources/profiles/ultimaker2+/cpe_0.25_normal.curaprofile rename to resources/quality/ultimaker2_plus/um2p_cpe_0.25_normal.inst.cfg index c4c09932d8..6a300ba27d 100644 --- a/resources/profiles/ultimaker2+/cpe_0.25_normal.curaprofile +++ b/resources/quality/ultimaker2_plus/um2p_cpe_0.25_normal.inst.cfg @@ -1,12 +1,14 @@ [general] -version = 1 +version = 2 name = High Quality -machine_type = ultimaker2plus -machine_variant = 0.25 mm -material = CPE +definition = ultimaker2_plus + +[metadata] +type = quality +material = generic_cpe_ultimaker2_plus_0.25_mm weight = -2 -[settings] +[values] layer_height = 0.06 wall_thickness = 0.88 top_bottom_thickness = 0.72 diff --git a/resources/profiles/ultimaker2+/cpe_0.4_fast.curaprofile b/resources/quality/ultimaker2_plus/um2p_cpe_0.4_fast.inst.cfg similarity index 68% rename from resources/profiles/ultimaker2+/cpe_0.4_fast.curaprofile rename to resources/quality/ultimaker2_plus/um2p_cpe_0.4_fast.inst.cfg index f9050e5ce5..e76c5205f5 100644 --- a/resources/profiles/ultimaker2+/cpe_0.4_fast.curaprofile +++ b/resources/quality/ultimaker2_plus/um2p_cpe_0.4_fast.inst.cfg @@ -1,17 +1,20 @@ [general] -version = 1 +version = 2 name = Fast Print -machine_type = ultimaker2plus -machine_variant = 0.4 mm -material = CPE +definition = ultimaker2_plus + +[metadata] +type = quality +material = generic_cpe_ultimaker2_plus_0.4_mm weight = -1 -[settings] +[values] layer_height = 0.15 wall_thickness = 0.7 top_bottom_thickness = 0.75 infill_sparse_density = 18 speed_print = 45 +speed_wall = 40 speed_travel = 150 speed_layer_0 = 30 cool_min_layer_time = 3 diff --git a/resources/profiles/ultimaker2+/cpe_0.4_high.curaprofile b/resources/quality/ultimaker2_plus/um2p_cpe_0.4_high.inst.cfg similarity index 65% rename from resources/profiles/ultimaker2+/cpe_0.4_high.curaprofile rename to resources/quality/ultimaker2_plus/um2p_cpe_0.4_high.inst.cfg index 377ab5b257..60f171dc17 100644 --- a/resources/profiles/ultimaker2+/cpe_0.4_high.curaprofile +++ b/resources/quality/ultimaker2_plus/um2p_cpe_0.4_high.inst.cfg @@ -1,17 +1,20 @@ [general] -version = 1 +version = 2 name = High Quality -machine_type = ultimaker2plus -machine_variant = 0.4 mm -material = CPE +definition = ultimaker2_plus + +[metadata] +type = quality +material = generic_cpe_ultimaker2_plus_0.4_mm weight = -3 -[settings] +[values] layer_height = 0.06 wall_thickness = 1.05 top_bottom_thickness = 0.72 infill_sparse_density = 22 speed_print = 45 +speed_wall = 30 cool_min_layer_time = 2 cool_fan_speed_min = 80 cool_min_speed = 15 diff --git a/resources/profiles/ultimaker2+/cpe_0.4_normal.curaprofile b/resources/quality/ultimaker2_plus/um2p_cpe_0.4_normal.inst.cfg similarity index 65% rename from resources/profiles/ultimaker2+/cpe_0.4_normal.curaprofile rename to resources/quality/ultimaker2_plus/um2p_cpe_0.4_normal.inst.cfg index e8142405ff..04116dbe21 100644 --- a/resources/profiles/ultimaker2+/cpe_0.4_normal.curaprofile +++ b/resources/quality/ultimaker2_plus/um2p_cpe_0.4_normal.inst.cfg @@ -1,17 +1,20 @@ [general] -version = 1 +version = 2 name = Normal Quality -machine_type = ultimaker2plus -machine_variant = 0.4 mm -material = CPE +definition = ultimaker2_plus + +[metadata] +type = quality +material = generic_cpe_ultimaker2_plus_0.4_mm weight = -2 -[settings] +[values] layer_height = 0.1 wall_thickness = 1.05 top_bottom_thickness = 0.8 infill_sparse_density = 20 speed_print = 45 +speed_wall = 30 cool_min_layer_time = 3 cool_fan_speed_min = 80 cool_min_speed = 10 diff --git a/resources/profiles/ultimaker2+/cpe_0.6_normal.curaprofile b/resources/quality/ultimaker2_plus/um2p_cpe_0.6_normal.inst.cfg similarity index 68% rename from resources/profiles/ultimaker2+/cpe_0.6_normal.curaprofile rename to resources/quality/ultimaker2_plus/um2p_cpe_0.6_normal.inst.cfg index 034fa17e1b..35e666e6d9 100644 --- a/resources/profiles/ultimaker2+/cpe_0.6_normal.curaprofile +++ b/resources/quality/ultimaker2_plus/um2p_cpe_0.6_normal.inst.cfg @@ -1,12 +1,14 @@ [general] -version = 1 +version = 2 name = Normal Quality -machine_type = ultimaker2plus -machine_variant = 0.6 mm -material = CPE +definition = ultimaker2_plus + +[metadata] +type = quality +material = generic_cpe_ultimaker2_plus_0.6_mm weight = -2 -[settings] +[values] layer_height = 0.15 wall_thickness = 1.59 top_bottom_thickness = 1.2 diff --git a/resources/profiles/ultimaker2+/cpe_0.8_normal.curaprofile b/resources/quality/ultimaker2_plus/um2p_cpe_0.8_normal.inst.cfg similarity index 67% rename from resources/profiles/ultimaker2+/cpe_0.8_normal.curaprofile rename to resources/quality/ultimaker2_plus/um2p_cpe_0.8_normal.inst.cfg index 523a5d3243..c36d1714a0 100644 --- a/resources/profiles/ultimaker2+/cpe_0.8_normal.curaprofile +++ b/resources/quality/ultimaker2_plus/um2p_cpe_0.8_normal.inst.cfg @@ -1,12 +1,14 @@ [general] -version = 1 +version = 2 name = Fast Print -machine_type = ultimaker2plus -machine_variant = 0.8 mm -material = CPE +definition = ultimaker2_plus + +[metadata] +type = quality +material = generic_cpe_ultimaker2_plus_0.8_mm weight = -2 -[settings] +[values] layer_height = 0.2 wall_thickness = 2.1 top_bottom_thickness = 1.2 diff --git a/resources/shaders/overhang.shader b/resources/shaders/overhang.shader index 4ae2821c7d..99cbdf913d 100644 --- a/resources/shaders/overhang.shader +++ b/resources/shaders/overhang.shader @@ -74,6 +74,7 @@ u_viewProjectionMatrix = view_projection_matrix u_normalMatrix = normal_matrix u_viewPosition = view_position u_lightPosition = light_0_position +u_diffuseColor = diffuse_color [attributes] a_vertex = vertex diff --git a/resources/themes/cura/styles.qml b/resources/themes/cura/styles.qml index e536c38ba7..1428c3d40a 100644 --- a/resources/themes/cura/styles.qml +++ b/resources/themes/cura/styles.qml @@ -280,46 +280,17 @@ QtObject { } } - property variant setting_item: UM.SettingItemStyle { - labelFont: Theme.getFont("default"); - labelColor: Theme.getColor("setting_control_text"); - - spacing: Theme.getSize("default_lining").height; - fixedHeight: Theme.getSize("setting").height; - - controlWidth: Theme.getSize("setting_control").width; - controlRightMargin: Theme.getSize("setting_control_margin").width; - controlColor: Theme.getColor("setting_control"); - controlHighlightColor: Theme.getColor("setting_control_highlight"); - controlBorderColor: Theme.getColor("setting_control_border"); - controlBorderHighlightColor: Theme.getColor("setting_control_border_highlight"); - controlTextColor: Theme.getColor("setting_control_text"); - controlBorderWidth: Theme.getSize("default_lining").width; - controlDisabledColor: Theme.getColor("setting_control_disabled"); - controlDisabledTextColor: Theme.getColor("setting_control_disabled_text"); - controlDisabledBorderColor: Theme.getColor("setting_control_disabled_border"); - controlFont: Theme.getFont("default"); - - validationErrorColor: Theme.getColor("setting_validation_error"); - validationWarningColor: Theme.getColor("setting_validation_warning"); - validationOkColor: Theme.getColor("setting_validation_ok"); - - unitRightMargin: Theme.getSize("setting_unit_margin").width; - unitColor: Theme.getColor("setting_unit"); - unitFont: Theme.getFont("default"); - } - property Component combobox: Component { ComboBoxStyle { background: Rectangle { - implicitHeight: UM.Theme.getSize("setting_control").height; - implicitWidth: UM.Theme.getSize("setting_control").width; + implicitHeight: Theme.getSize("setting_control").height; + implicitWidth: Theme.getSize("setting_control").width; - color: control.hovered ? Theme.getColor("setting_control_highlight") : Theme.getColor("setting_control"); + color: (control.hovered || control._hovered) ? Theme.getColor("setting_control_highlight") : Theme.getColor("setting_control"); Behavior on color { ColorAnimation { duration: 50; } } border.width: Theme.getSize("default_lining").width; - border.color: control.hovered ? Theme.getColor("setting_control_border_highlight") : Theme.getColor("setting_control_border"); + border.color: (control.hovered || control._hovered) ? Theme.getColor("setting_control_border_highlight") : Theme.getColor("setting_control_border"); } label: Item { Label { @@ -330,7 +301,7 @@ QtObject { anchors.verticalCenter: parent.verticalCenter; text: control.currentText; - font: UM.Theme.getFont("default"); + font: Theme.getFont("default"); color: !enabled ? Theme.getColor("setting_control_disabled_text") : Theme.getColor("setting_control_text"); elide: Text.ElideRight; @@ -343,9 +314,9 @@ QtObject { anchors.rightMargin: Theme.getSize("default_lining").width * 2; anchors.verticalCenter: parent.verticalCenter; - source: UM.Theme.getIcon("arrow_bottom") - width: UM.Theme.getSize("standard_arrow").width - height: UM.Theme.getSize("standard_arrow").height + source: Theme.getIcon("arrow_bottom") + width: Theme.getSize("standard_arrow").width + height: Theme.getSize("standard_arrow").height sourceSize.width: width + 5 sourceSize.height: width + 5 @@ -362,13 +333,13 @@ QtObject { implicitWidth: Theme.getSize("checkbox").width; implicitHeight: Theme.getSize("checkbox").height; - color: (control.hovered || control.hovered_ex) ? Theme.getColor("checkbox_hover") : Theme.getColor("checkbox"); + color: (control.hovered || control._hovered) ? Theme.getColor("checkbox_hover") : Theme.getColor("checkbox"); Behavior on color { ColorAnimation { duration: 50; } } radius: control.exclusiveGroup ? Theme.getSize("checkbox").width / 2 : 0 border.width: Theme.getSize("default_lining").width; - border.color: (control.hovered || control.hovered_ex) ? Theme.getColor("checkbox_border_hover") : Theme.getColor("checkbox_border"); + border.color: (control.hovered || control._hovered) ? Theme.getColor("checkbox_border_hover") : Theme.getColor("checkbox_border"); UM.RecolorImage { anchors.verticalCenter: parent.verticalCenter diff --git a/resources/themes/cura/theme.json b/resources/themes/cura/theme.json index 67df41ef7c..acd60e2646 100644 --- a/resources/themes/cura/theme.json +++ b/resources/themes/cura/theme.json @@ -176,7 +176,7 @@ "section_icon": [1.6, 1.6], "section_icon_column": [2.8, 0.0], - "setting": [19.0, 1.8], + "setting": [25.0, 1.8], "setting_control": [10.0, 2.0], "setting_control_depth_margin": [1.4, 0.0], "setting_preferences_button_margin": [3.3, 0.0], diff --git a/resources/variants/ultimaker2_extended_plus_0.25.inst.cfg b/resources/variants/ultimaker2_extended_plus_0.25.inst.cfg new file mode 100644 index 0000000000..b499db6163 --- /dev/null +++ b/resources/variants/ultimaker2_extended_plus_0.25.inst.cfg @@ -0,0 +1,17 @@ +[general] +name = 0.25 mm +version = 2 +definition = ultimaker2_extended_plus + +[metadata] +author = Ultimaker +type = variant + +[values] +machine_nozzle_size = 0.25 +machine_nozzle_tip_outer_diameter = 0.8 +coasting_volume = 0.1 +coasting_min_volume = 0.17 +speed_wall = =round(speed_print / 1.2, 1) +speed_wall_0 = =1 if speed_wall < 5 else (speed_wall - 5) +speed_topbottom = =round(speed_print / 1.5, 1) diff --git a/resources/variants/ultimaker2_extended_plus_0.4.inst.cfg b/resources/variants/ultimaker2_extended_plus_0.4.inst.cfg new file mode 100644 index 0000000000..d2fb6f76b1 --- /dev/null +++ b/resources/variants/ultimaker2_extended_plus_0.4.inst.cfg @@ -0,0 +1,15 @@ +[general] +name = 0.4 mm +version = 2 +definition = ultimaker2_extended_plus + +[metadata] +author = Ultimaker +type = variant + +[values] +machine_nozzle_size = 0.4 +machine_nozzle_tip_outer_diameter = 1.05 +speed_wall = =round(speed_print / 1.25, 1) +speed_wall_0 = =1 if speed_wall < 10 else (speed_wall - 10) +speed_topbottom = =round(speed_print / 2.25, 1) diff --git a/resources/variants/ultimaker2_extended_plus_0.6.inst.cfg b/resources/variants/ultimaker2_extended_plus_0.6.inst.cfg new file mode 100644 index 0000000000..e4f9f0ce45 --- /dev/null +++ b/resources/variants/ultimaker2_extended_plus_0.6.inst.cfg @@ -0,0 +1,16 @@ +[general] +name = 0.6 mm +version = 2 +definition = ultimaker2_extended_plus + +[metadata] +author = Ultimaker +type = variant + +[values] +machine_nozzle_size = 0.6 +machine_nozzle_tip_outer_diameter = 1.25 +coasting_volume = 1.36 +speed_wall = =round(speed_print * 4 / 3, 1) +speed_wall_0 = =1 if speed_wall < 10 else (speed_wall - 10) +speed_topbottom = =round(speed_print / 2, 1) diff --git a/resources/variants/ultimaker2_extended_plus_0.8.inst.cfg b/resources/variants/ultimaker2_extended_plus_0.8.inst.cfg new file mode 100644 index 0000000000..18570ea75d --- /dev/null +++ b/resources/variants/ultimaker2_extended_plus_0.8.inst.cfg @@ -0,0 +1,16 @@ +[general] +name = 0.8 mm +version = 2 +definition = ultimaker2_extended_plus + +[metadata] +author = Ultimaker +type = variant + +[values] +machine_nozzle_size = 0.8 +machine_nozzle_tip_outer_diameter = 1.35 +coasting_volume = 3.22 +speed_wall = =round(speed_print * 4 / 3, 1) +speed_wall_0 = =1 if speed_wall < 10 else (speed_wall - 10) +speed_topbottom = =round(speed_print / 2, 1) diff --git a/resources/variants/ultimaker2_plus_0.25.inst.cfg b/resources/variants/ultimaker2_plus_0.25.inst.cfg new file mode 100644 index 0000000000..7cab771101 --- /dev/null +++ b/resources/variants/ultimaker2_plus_0.25.inst.cfg @@ -0,0 +1,17 @@ +[general] +name = 0.25 mm +version = 2 +definition = ultimaker2_plus + +[metadata] +author = Ultimaker +type = variant + +[values] +machine_nozzle_size = 0.25 +machine_nozzle_tip_outer_diameter = 0.8 +coasting_volume = 0.1 +coasting_min_volume = 0.17 +speed_wall = =round(speed_print / 1.2, 1) +speed_wall_0 = =1 if speed_wall < 5 else (speed_wall - 5) +speed_topbottom = =round(speed_print / 1.5, 1) diff --git a/resources/variants/ultimaker2_plus_0.4.inst.cfg b/resources/variants/ultimaker2_plus_0.4.inst.cfg new file mode 100644 index 0000000000..748f367250 --- /dev/null +++ b/resources/variants/ultimaker2_plus_0.4.inst.cfg @@ -0,0 +1,15 @@ +[general] +name = 0.4 mm +version = 2 +definition = ultimaker2_plus + +[metadata] +author = Ultimaker +type = variant + +[values] +machine_nozzle_size = 0.4 +machine_nozzle_tip_outer_diameter = 1.05 +speed_wall = =round(speed_print / 1.25, 1) +speed_wall_0 = =1 if speed_wall < 10 else (speed_wall - 10) +speed_topbottom = =round(speed_print / 2.25, 1) diff --git a/resources/variants/ultimaker2_plus_0.6.inst.cfg b/resources/variants/ultimaker2_plus_0.6.inst.cfg new file mode 100644 index 0000000000..34d0f7a5cf --- /dev/null +++ b/resources/variants/ultimaker2_plus_0.6.inst.cfg @@ -0,0 +1,16 @@ +[general] +name = 0.6 mm +version = 2 +definition = ultimaker2_plus + +[metadata] +author = Ultimaker +type = variant + +[values] +machine_nozzle_size = 0.6 +machine_nozzle_tip_outer_diameter = 1.25 +coasting_volume = 1.36 +speed_wall = =round(speed_print * 4 / 3, 1) +speed_wall_0 = =1 if speed_wall < 10 else (speed_wall - 10) +speed_topbottom = =round(speed_print / 2, 1) diff --git a/resources/variants/ultimaker2_plus_0.8.inst.cfg b/resources/variants/ultimaker2_plus_0.8.inst.cfg new file mode 100644 index 0000000000..e719409060 --- /dev/null +++ b/resources/variants/ultimaker2_plus_0.8.inst.cfg @@ -0,0 +1,16 @@ +[general] +name = 0.8 mm +version = 2 +definition = ultimaker2_plus + +[metadata] +author = Ultimaker +type = variant + +[values] +machine_nozzle_size = 0.8 +machine_nozzle_tip_outer_diameter = 1.35 +coasting_volume = 3.22 +speed_wall = =round(speed_print * 4 / 3, 1) +speed_wall_0 = =1 if speed_wall < 10 else (speed_wall - 10) +speed_topbottom = =round(speed_print / 2, 1)