diff --git a/.gitignore b/.gitignore index 3ee62405a2..6a33e104a9 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ __pycache__ docs/html *.log resources/i18n/en +resources/i18n/7s resources/i18n/x-test resources/firmware resources/materials diff --git a/README.md b/README.md index b843be9a66..e3fa497933 100644 --- a/README.md +++ b/README.md @@ -50,12 +50,11 @@ Third party plugins * [X3G Writer](https://github.com/Ghostkeeper/X3GWriter): Adds support for exporting X3G files. * [Auto orientation](https://github.com/nallath/CuraOrientationPlugin): Calculate the optimal orientation for a model. * [OctoPrint Plugin](https://github.com/fieldofview/OctoPrintPlugin): Send printjobs directly to OctoPrint and monitor their progress in Cura. -* [WirelessPrinting Plugin](https://github.com/probonopd/WirelessPrinting): Print wirelessly from Cura to your 3D printer connected to an ESP8266 module. * [Electric Print Cost Calculator Plugin](https://github.com/zoff99/ElectricPrintCostCalculator): Calculate the electric costs of a print. Making profiles for other printers ---------------------------------- -There are two ways of doing it. You can either use the generator [here](http://quillford.github.io/CuraProfileMaker/) or you can use [this](https://github.com/Ultimaker/Cura/blob/master/resources/definitions/ultimaker_original.def.json) as a template. +If your make of printer is not in the list of supported printers, and using the "Custom FDM Printer" does not offer enough flexibility, you can use [this](https://github.com/Ultimaker/Cura/blob/master/resources/definitions/ultimaker_original.def.json) as a template. * Change the machine ID to something unique * Change the machine_name to your printer's name @@ -63,12 +62,12 @@ There are two ways of doing it. You can either use the generator [here](http://q * Set your machine's dimensions with machine_width, machine_depth, and machine_height * If your printer's origin is in the center of the bed, set machine_center_is_zero to true. * Set your print head dimensions with the machine_head_shape parameters -* Set the nozzle offset with machine_nozzle_offset_x and machine_nozzle_offset_y * Set the start and end gcode in machine_start_gcode and machine_end_gcode -* If your printer has a heated bed, set visible to true under material_bed_temperature Once you are done, put the profile you have made into resources/definitions, or in definitions in your cura profile folder. +If you want to make a definition for a multi-extrusion printer, have a look at [this](https://github.com/Ultimaker/Cura/blob/master/resources/definitions/ultimaker_original_dual.def.json) as a template, along with the two extruder definitions it references [here](https://github.com/Ultimaker/Cura/blob/master/resources/extruders/ultimaker_original_dual_1st.def.json) and [here](https://github.com/Ultimaker/Cura/blob/master/resources/extruders/ultimaker_original_dual_2nd.def.json) + Translating Cura ---------------- If you'd like to contribute a translation of Cura, please first look for [any existing translation](https://github.com/Ultimaker/Cura/tree/master/resources/i18n). If your language is already there in the source code but not in Cura's interface, it may be partially translated. @@ -89,4 +88,4 @@ To submit your translation, ideally you would make two pull requests where all ` After the translation is submitted, the Cura maintainers will check for its completeness and check whether it is consistent. We will take special care to look for common mistakes, such as translating mark-up `` code and such. We are often not fluent in every language, so we expect the translator and the international users to make corrections where necessary. Of course, there will always be some mistakes in every translation. -When the next Cura release comes around, some of the texts will have changed and some new texts will have been added. Around the time when the beta is released we will invoke a string freeze, meaning that no developer is allowed to make changes to the texts. Then we will update the translation template `.pot` files and ask all our translators to update their translations. If you are unable to update the translation in time for the actual release, we will remove the language from the drop-down menu in the Preferences window. The translation stays in Cura however, so that someone might pick it up again later and update it with the newest texts. Also, users who had previously selected the language can still continue Cura in their language but English text will appear among the original text. \ No newline at end of file +When the next Cura release comes around, some of the texts will have changed and some new texts will have been added. Around the time when the beta is released we will invoke a string freeze, meaning that no developer is allowed to make changes to the texts. Then we will update the translation template `.pot` files and ask all our translators to update their translations. If you are unable to update the translation in time for the actual release, we will remove the language from the drop-down menu in the Preferences window. The translation stays in Cura however, so that someone might pick it up again later and update it with the newest texts. Also, users who had previously selected the language can still continue Cura in their language but English text will appear among the original text. diff --git a/cura/BuildVolume.py b/cura/BuildVolume.py index e37268e244..bc5398cb1c 100755 --- a/cura/BuildVolume.py +++ b/cura/BuildVolume.py @@ -1,4 +1,4 @@ -# Copyright (c) 2016 Ultimaker B.V. +# Copyright (c) 2017 Ultimaker B.V. # Cura is released under the terms of the AGPLv3 or higher. from cura.Settings.ExtruderManager import ExtruderManager @@ -27,8 +27,9 @@ import math from typing import List -# Setting for clearance around the prime -PRIME_CLEARANCE = 6.5 +PRIME_CLEARANCE = 6.5 #Setting for clearance around the prime. +MAJOR_GRID_SIZE = 10 #Size of the grid cells. +MINOR_GRID_SIZE = 1 ## Build volume is a special kind of node that is responsible for rendering the printable area & disallowed areas. @@ -44,6 +45,8 @@ class BuildVolume(SceneNode): self._z_axis_color = None self._disallowed_area_color = None self._error_area_color = None + self._grid_color = None + self._grid_minor_color = None self._width = 0 self._height = 0 @@ -56,8 +59,9 @@ class BuildVolume(SceneNode): self._origin_line_length = 20 self._origin_line_width = 0.5 + self._plate_mesh = None self._grid_mesh = None - self._grid_shader = None + self._plate_shader = None self._disallowed_areas = [] self._disallowed_area_mesh = None @@ -167,14 +171,15 @@ class BuildVolume(SceneNode): if not self._shader: self._shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "default.shader")) - self._grid_shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "grid.shader")) + self._plate_shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "color.shader")) theme = Application.getInstance().getTheme() - self._grid_shader.setUniformValue("u_gridColor0", Color(*theme.getColor("buildplate").getRgb())) - self._grid_shader.setUniformValue("u_gridColor1", Color(*theme.getColor("buildplate_alt").getRgb())) + self._plate_shader.setUniformValue("u_color", Color(*theme.getColor("buildplate").getRgb())) + self._plate_shader.setUniformValue("u_z_bias", 0.000001) renderer.queueNode(self, mode = RenderBatch.RenderMode.Lines) renderer.queueNode(self, mesh = self._origin_mesh) - renderer.queueNode(self, mesh = self._grid_mesh, shader = self._grid_shader, backface_cull = True) + renderer.queueNode(self, mesh = self._plate_mesh, shader = self._plate_shader, backface_cull = True) + renderer.queueNode(self, mesh = self._grid_mesh, mode = RenderBatch.RenderMode.Lines, transparent = True) if self._disallowed_area_mesh: renderer.queueNode(self, mesh = self._disallowed_area_mesh, shader = self._shader, transparent = True, backface_cull = True, sort = -9) @@ -247,6 +252,8 @@ class BuildVolume(SceneNode): self._z_axis_color = Color(*theme.getColor("z_axis").getRgb()) self._disallowed_area_color = Color(*theme.getColor("disallowed_area").getRgb()) self._error_area_color = Color(*theme.getColor("error_area").getRgb()) + self._grid_color = Color(*theme.getColor("buildplate_grid").getRgb()) + self._grid_minor_color = Color(*theme.getColor("buildplate_grid_minor").getRgb()) min_w = -self._width / 2 max_w = self._width / 2 @@ -277,7 +284,7 @@ class BuildVolume(SceneNode): self.setMeshData(mb.build()) - # Build plate grid mesh + # Build plate surface. mb = MeshBuilder() mb.addQuad( Vector(min_w, min_h - z_fight_distance, min_d), @@ -289,6 +296,30 @@ class BuildVolume(SceneNode): for n in range(0, 6): v = mb.getVertex(n) mb.setVertexUVCoordinates(n, v[0], v[2]) + self._plate_mesh = mb.build() + + #Build plate grid mesh. + mb = MeshBuilder() + for x in range(0, int(math.ceil(max_w)), MAJOR_GRID_SIZE): + mb.addLine(Vector(x, min_h, min_d), Vector(x, min_h, max_d), color = self._grid_color) + #Start from 0 in both cases, so you need to do this in two for loops. + mb.addLine(Vector(-x, min_h, min_d), Vector(-x, min_h, max_d), color = self._grid_color) + for y in range(0, int(math.ceil(max_d)), MAJOR_GRID_SIZE): + mb.addLine(Vector(min_w, min_h, y), Vector(max_w, min_h, y), color = self._grid_color) + mb.addLine(Vector(min_w, min_h, -y), Vector(max_w, min_h, -y), color = self._grid_color) + + #More fine grained grid. + for x in range(0, int(math.ceil(max_w)), MINOR_GRID_SIZE): + if x % MAJOR_GRID_SIZE == 0: #Don't overlap with the major grid. + pass + mb.addLine(Vector(x, min_h, min_d), Vector(x, min_h, max_d), color = self._grid_minor_color) + mb.addLine(Vector(-x, min_h, min_d), Vector(-x, min_h, max_d), color = self._grid_minor_color) + for y in range(0, int(math.ceil(max_d)), MINOR_GRID_SIZE): + if y % MAJOR_GRID_SIZE == 0: + pass + mb.addLine(Vector(min_w, min_h, y), Vector(max_w, min_h, y), color = self._grid_minor_color) + mb.addLine(Vector(min_w, min_h, -y), Vector(max_w, min_h, -y), color = self._grid_minor_color) + self._grid_mesh = mb.build() else: @@ -304,7 +335,7 @@ class BuildVolume(SceneNode): mb.addArc(max_w, Vector.Unit_Y, center = (0, max_h, 0), color = self._volume_outline_color) self.setMeshData(mb.build().getTransformed(scale_matrix)) - # Build plate grid mesh + # Build plate surface. mb = MeshBuilder() mb.addVertex(0, min_h - z_fight_distance, 0) mb.addArc(max_w, Vector.Unit_Y, center = Vector(0, min_h - z_fight_distance, 0)) @@ -318,7 +349,40 @@ class BuildVolume(SceneNode): for n in range(0, mb.getVertexCount()): v = mb.getVertex(n) mb.setVertexUVCoordinates(n, v[0], v[2] * aspect) - self._grid_mesh = mb.build().getTransformed(scale_matrix) + self._plate_mesh = mb.build().getTransformed(scale_matrix) + + #Build plate grid mesh. + #We need to constrain the length of the lines to the build plate ellipsis. Time to get out the calculator! + mb = MeshBuilder() + for x in range(0, int(math.ceil(max_w)), MAJOR_GRID_SIZE): + #x / max_w is the fraction along the build plate we have progressed, counting from the centre. + #So x / max_w is sin(a), where a is the angle towards an endpoint of the grid line from the centre. + #So math.asin(x / max_w) is a. + #So math.cos(math.asin(x / max_w)) is half of the length of the grid line on a unit circle, which scales between 0 and 1. + length_factor = math.cos(math.asin(x / max_w)) + mb.addLine(Vector(x, min_h, min_d * length_factor), Vector(x, min_h, max_d * length_factor), color = self._grid_color) + #Start from 0 in both cases, so you need to do this in two for loops. + mb.addLine(Vector(-x, min_h, min_d * length_factor), Vector(-x, min_h, max_d * length_factor), color = self._grid_color) + for y in range(0, int(math.ceil(max_d)), MAJOR_GRID_SIZE): + length_factor = math.sin(math.acos(y / max_d)) + mb.addLine(Vector(min_w * length_factor, min_h, y), Vector(max_w * length_factor, min_h, y), color = self._grid_color) + mb.addLine(Vector(min_w * length_factor, min_h, -y), Vector(max_w * length_factor, min_h, -y), color = self._grid_color) + + #More fine grained grid. + for x in range(0, int(math.ceil(max_w)), MINOR_GRID_SIZE): + if x % MAJOR_GRID_SIZE == 0: #Don't overlap with the major grid. + pass + length_factor = math.cos(math.asin(x / max_w)) + mb.addLine(Vector(x, min_h, min_d * length_factor), Vector(x, min_h, max_d * length_factor), color = self._grid_minor_color) + mb.addLine(Vector(-x, min_h, min_d * length_factor), Vector(-x, min_h, max_d * length_factor), color = self._grid_minor_color) + for y in range(0, int(math.ceil(max_d)), MINOR_GRID_SIZE): + if y % MAJOR_GRID_SIZE == 0: + pass + length_factor = math.sin(math.acos(y / max_d)) + mb.addLine(Vector(min_w * length_factor, min_h, y), Vector(max_w * length_factor, min_h, y), color = self._grid_minor_color) + mb.addLine(Vector(min_w * length_factor, min_h, -y), Vector(max_w * length_factor, min_h, -y), color = self._grid_minor_color) + + self._grid_mesh = mb.build() # Indication of the machine origin if self._global_container_stack.getProperty("machine_center_is_zero", "value"): diff --git a/cura/Settings/CuraContainerStack.py b/cura/Settings/CuraContainerStack.py index cdda14ee18..eeb170c489 100755 --- a/cura/Settings/CuraContainerStack.py +++ b/cura/Settings/CuraContainerStack.py @@ -432,6 +432,7 @@ class CuraContainerStack(ContainerStack): # - If the machine definition has a metadata entry "has_machine_materials", the definition of the material should # be the same as the machine definition for this stack. Otherwise, the definition should be "fdmprinter". # - The container should have a metadata entry "type" with value "material". + # - The material should have an approximate diameter that matches the machine # - If the machine definition has a metadata entry "has_variants" and set to True, the "variant" metadata entry of # the material should be the same as the ID of the variant in the stack. Only applies if "has_machine_materials" is also True. # - If the stack currently has a material set, try to find a material that matches the current material by name. @@ -460,6 +461,9 @@ class CuraContainerStack(ContainerStack): if preferred_material: search_criteria["id"] = preferred_material + approximate_material_diameter = str(round(self.getProperty("material_diameter", "value"))) + search_criteria["approximate_diameter"] = approximate_material_diameter + materials = ContainerRegistry.getInstance().findInstanceContainers(**search_criteria) if not materials: Logger.log("w", "The preferred material \"{material}\" could not be found for stack {stack}", material = preferred_material, stack = self.id) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 5c07c83ece..7f7593a9d5 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -504,16 +504,6 @@ class MachineManager(QObject): return result - @pyqtProperty("QVariantList", notify = activeVariantChanged) - def activeMaterialIds(self): - result = [] - if ExtruderManager.getInstance().getActiveGlobalAndExtruderStacks() is not None: - for stack in ExtruderManager.getInstance().getActiveGlobalAndExtruderStacks(): - if stack.variant and stack.variant != self._empty_variant_container: - result.append(stack.variant.getId()) - - return result - @pyqtProperty("QVariantList", notify = activeMaterialChanged) def activeMaterialNames(self): result = [] diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index f6a8236c9e..590de1d49b 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -818,29 +818,27 @@ class ThreeMFWorkspaceReader(WorkspaceReader): each_extruder_stack.definitionChanges = each_changes_container if self._resolve_strategies["material"] == "new": + # the actual material instance container can have an ID such as + # __ + # which cannot be determined immediately, so here we use a HACK to find the right new material + # instance ID: + # - get the old material IDs for all material + # - find the old material with the longest common prefix in ID, that's the old material + # - update the name by replacing the old prefix with the new + # - find the new material container and set it to the stack + old_to_new_material_dict = {} for each_material in material_containers: - old_material = global_stack.material - - # check if the old material container has been renamed to this material container ID - # if the container hasn't been renamed, we do nothing. - new_id = self._id_mapping.get(old_material.getId()) - if new_id is None or new_id != each_material.getId(): - continue - - if old_material.getId() in self._id_mapping: - global_stack.material = each_material + # find the material's old name + for old_id, new_id in self._id_mapping.items(): + if each_material.getId() == new_id: + old_to_new_material_dict[old_id] = each_material + break + # replace old material in global and extruder stacks with new + self._replaceStackMaterialWithNew(global_stack, old_to_new_material_dict) + if extruder_stacks: for each_extruder_stack in extruder_stacks: - old_material = each_extruder_stack.material - - # check if the old material container has been renamed to this material container ID - # if the container hasn't been renamed, we do nothing. - new_id = self._id_mapping.get(old_material.getId()) - if new_id is None or new_id != each_material.getId(): - continue - - if old_material.getId() in self._id_mapping: - each_extruder_stack.material = each_material + self._replaceStackMaterialWithNew(each_extruder_stack, old_to_new_material_dict) if extruder_stacks: for stack in extruder_stacks: @@ -865,6 +863,61 @@ class ThreeMFWorkspaceReader(WorkspaceReader): nodes = [] return nodes + ## HACK: Replaces the material container in the given stack with a newly created material container. + # This function is used when the user chooses to resolve material conflicts by creating new ones. + def _replaceStackMaterialWithNew(self, stack, old_new_material_dict): + # The material containers in the project file are 'parent' material such as "generic_pla", + # but a material container used in a global/extruder stack is a 'child' material, + # such as "generic_pla_ultimaker3_AA_0.4", which can be formalised as the following: + # + # __ + # + # In the project loading, when a user chooses to resolve material conflicts by creating new ones, + # the old 'parent' material ID and the new 'parent' material ID are known, but not the child material IDs. + # In this case, the global stack and the extruder stacks need to use the newly created material, but the + # material containers they use are 'child' material. So, here, we need to find the right 'child' material for + # the stacks. + # + # This hack approach works as follows: + # - No matter there is a child material or not, the actual material we are looking for has the prefix + # "", which is the old material name. For the material in a stack, we know that the new + # material's ID will be "_blabla..", so we just need to replace the old material ID + # with the new one to get the new 'child' material. + # - Because the material containers have IDs such as "m #nn", if we use simple prefix matching, there can + # be a problem in the following scenario: + # - there are two materials in the project file, namely "m #1" and "m #11" + # - the child materials in use are for example: "m #1_um3_aa04", "m #11_um3_aa04" + # - if we only check for a simple prefix match, then "m #11_um3_aa04" will match with "m #1", but they + # are not the same material + # To avoid this, when doing the prefix matching, we use the result with the longest mactching prefix. + + # find the old material ID + old_material_id_in_stack = stack.material.getId() + best_matching_old_material_id = None + best_matching_old_meterial_prefix_length = -1 + for old_parent_material_id in old_new_material_dict: + if len(old_parent_material_id) < best_matching_old_meterial_prefix_length: + continue + if len(old_parent_material_id) <= len(old_material_id_in_stack): + if old_parent_material_id == old_material_id_in_stack[0:len(old_parent_material_id)]: + best_matching_old_meterial_prefix_length = len(old_parent_material_id) + best_matching_old_material_id = old_parent_material_id + + if best_matching_old_material_id is None: + Logger.log("w", "Cannot find any matching old material ID for stack [%s] material [%s]. Something can go wrong", + stack.getId(), old_material_id_in_stack) + return + + # find the new material container + new_material_id = old_new_material_dict[best_matching_old_material_id].getId() + old_material_id_in_stack[len(best_matching_old_material_id):] + new_material_containers = self._container_registry.findInstanceContainers(id = new_material_id, type = "material") + if not new_material_containers: + Logger.log("e", "Cannot find new material container [%s]", new_material_id) + return + + # replace the material in the given stack + stack.material = new_material_containers[0] + def _stripFileToId(self, file): mime_type = MimeTypeDatabase.getMimeTypeForFile(file) file = mime_type.stripExtension(file) diff --git a/plugins/ChangeLogPlugin/ChangeLog.txt b/plugins/ChangeLogPlugin/ChangeLog.txt index 3e101919d4..97651ecd1c 100755 --- a/plugins/ChangeLogPlugin/ChangeLog.txt +++ b/plugins/ChangeLogPlugin/ChangeLog.txt @@ -36,7 +36,7 @@ A dark theme for Cura. Select this theme to reduce eyestrain when working in dar The top bar user interface been improved so that “Prepare” and “Print” have moved from the right side of the interface to the left side. *New keyboard shortcuts -Models can now be manipulated on the build plate using hotkeys Q, A, Z, W, and tab keys. Q selects “move”, A selects “scale”, Z selects “rotate”, and W selects “mirror”. Use the tab key to navigate between interfaces. +Models can now be manipulated on the build plate using hotkeys Q, A, Z, W, and tab keys. Q selects “move”, A selects “scale”, Z selects “rotate”, and W selects “mirror”. Use the tab key to navigate between settings. *Plugin browser Easily download and install plugins using an integrated plugin browser. Go to “Extensions > Plugin Browser > Browse plugins” to select it. @@ -61,7 +61,7 @@ Polish language support added. This can be selected in the preferences menu. - Crashes when adding printers - Jerk fixes - Z-hop over-extrusion - +- Material diameter in machine settings *3rd party printers - Peopoly Moai diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index 3710d33965..d94c3be94f 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -427,6 +427,7 @@ class CuraEngineBackend(QObject, Backend): ## Convenient function: set need_slicing, emit state and clear layer data def needsSlicing(self): + self.stopSlicing() self._need_slicing = True self.processingProgress.emit(0.0) self.backendStateChange.emit(BackendState.NotStarted) diff --git a/plugins/LayerView/LayerView.qml b/plugins/LayerView/LayerView.qml index 095cc4d5b4..53f44f3f03 100755 --- a/plugins/LayerView/LayerView.qml +++ b/plugins/LayerView/LayerView.qml @@ -71,7 +71,7 @@ Item id: layersLabel anchors.left: parent.left text: catalog.i18nc("@label","View Mode: Layers") - font.bold: true + font: UM.Theme.getFont("default_bold"); color: UM.Theme.getColor("text") Layout.fillWidth: true elide: Text.ElideMiddle; @@ -90,6 +90,7 @@ Item id: layerViewTypesLabel anchors.left: parent.left text: catalog.i18nc("@label","Color scheme") + font: UM.Theme.getFont("default"); visible: !UM.LayerView.compatibilityMode Layout.fillWidth: true color: UM.Theme.getColor("text") @@ -148,6 +149,7 @@ Item id: compatibilityModeLabel anchors.left: parent.left text: catalog.i18nc("@label","Compatibility Mode") + font: UM.Theme.getFont("default") color: UM.Theme.getColor("text") visible: UM.LayerView.compatibilityMode Layout.fillWidth: true @@ -210,6 +212,7 @@ Item text: model.name elide: Text.ElideRight color: UM.Theme.getColor("text") + font: UM.Theme.getFont("default") anchors.verticalCenter: parent.verticalCenter anchors.left: extrudersModelCheckBox.left; anchors.right: extrudersModelCheckBox.right; @@ -275,6 +278,7 @@ Item Label { text: label + font: UM.Theme.getFont("default") elide: Text.ElideRight color: UM.Theme.getColor("text") anchors.verticalCenter: parent.verticalCenter @@ -340,6 +344,7 @@ Item Layout.preferredHeight: UM.Theme.getSize("layerview_row").height + UM.Theme.getSize("default_lining").height Layout.preferredWidth: UM.Theme.getSize("layerview_row").width color: UM.Theme.getColor("text") + font: UM.Theme.getFont("default") } } } diff --git a/plugins/MachineSettingsAction/MachineSettingsAction.qml b/plugins/MachineSettingsAction/MachineSettingsAction.qml index b5d6a6e649..40d3b5a960 100644 --- a/plugins/MachineSettingsAction/MachineSettingsAction.qml +++ b/plugins/MachineSettingsAction/MachineSettingsAction.qml @@ -233,6 +233,7 @@ Cura.MachineAction property string label: catalog.i18nc("@label", "Gantry height") property string unit: catalog.i18nc("@label", "mm") property string tooltip: catalog.i18nc("@tooltip", "The height difference between the tip of the nozzle and the gantry system (X and Y axes). Used to prevent collisions between previous prints and the gantry when printing \"One at a Time\".") + property bool forceUpdateOnChange: true } Item { width: UM.Theme.getSize("default_margin").width; height: UM.Theme.getSize("default_margin").height } diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml index c30c6c8d6a..07a8fc21bc 100644 --- a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml +++ b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml @@ -151,10 +151,43 @@ Item { UM.SettingPropertyProvider { id: inheritStackProvider - containerStackId: Cura.MachineManager.activeMachineId + containerStackId: UM.ActiveTool.properties.getValue("ContainerID") key: model.key watchedProperties: [ "limit_to_extruder" ] } + + Binding + { + target: provider + property: "containerStackId" + when: model.settable_per_extruder || (inheritStackProvider.properties.limit_to_extruder != null && inheritStackProvider.properties.limit_to_extruder >= 0); + value: + { + // associate this binding with Cura.MachineManager.activeMachineId in the beginning so this + // binding will be triggered when activeMachineId is changed too. + // Otherwise, if this value only depends on the extruderIds, it won't get updated when the + // machine gets changed. + var activeMachineId = Cura.MachineManager.activeMachineId; + + if(!model.settable_per_extruder || machineExtruderCount.properties.value == 1) + { + //Not settable per extruder or there only is global, so we must pick global. + return activeMachineId; + } + if(inheritStackProvider.properties.limit_to_extruder != null && inheritStackProvider.properties.limit_to_extruder >= 0) + { + //We have limit_to_extruder, so pick that stack. + return ExtruderManager.extruderIds[String(inheritStackProvider.properties.limit_to_extruder)]; + } + if(UM.ActiveTool.properties.getValue("ContainerID")) + { + //We're on an extruder tab. Pick the current extruder. + return UM.ActiveTool.properties.getValue("ContainerID"); + } + //No extruder tab is selected. Pick the global stack. Shouldn't happen any more since we removed the global tab. + return activeMachineId; + } + } } } } diff --git a/plugins/VersionUpgrade/VersionUpgrade25to26/VersionUpgrade25to26.py b/plugins/VersionUpgrade/VersionUpgrade25to26/VersionUpgrade25to26.py index 9c02d0387e..5b3632a095 100644 --- a/plugins/VersionUpgrade/VersionUpgrade25to26/VersionUpgrade25to26.py +++ b/plugins/VersionUpgrade/VersionUpgrade25to26/VersionUpgrade25to26.py @@ -114,6 +114,10 @@ class VersionUpgrade25to26(VersionUpgrade): parser.write(output) return [filename], [output.getvalue()] + ## Upgrades a machine stack from version 2.5 to 2.6 + # + # \param serialised The serialised form of a quality profile. + # \param filename The name of the file to upgrade. def upgradeMachineStack(self, serialised, filename): parser = configparser.ConfigParser(interpolation=None) parser.read_string(serialised) @@ -127,7 +131,7 @@ class VersionUpgrade25to26(VersionUpgrade): if definition_container_id == "custom" and not self._checkCustomFdmPrinterHasExtruderStack(machine_id): # go through all extruders and make sure that this custom FDM printer has 8 extruder stacks. - self._getNextUniqueCustomFdmPrinterExtruderStackIdIndex() + self._acquireNextUniqueCustomFdmPrinterExtruderStackIdIndex() for position in range(8): self._createCustomFdmPrinterExtruderStack(machine_id, position, quality_container_id, material_container_id) @@ -141,7 +145,8 @@ class VersionUpgrade25to26(VersionUpgrade): return [filename], [output.getvalue()] - def _getNextUniqueCustomFdmPrinterExtruderStackIdIndex(self): + ## Acquires the next unique extruder stack index number for the Custom FDM Printer. + def _acquireNextUniqueCustomFdmPrinterExtruderStackIdIndex(self): extruder_stack_dir = Resources.getPath(CuraApplication.ResourceTypes.ExtruderStack) file_name_list = os.listdir(extruder_stack_dir) file_name_list = [os.path.basename(file_name) for file_name in file_name_list] @@ -185,6 +190,7 @@ class VersionUpgrade25to26(VersionUpgrade): if machine_id != parser["metadata"]["machine"]: continue has_extruders = True + break return has_extruders @@ -198,6 +204,9 @@ class VersionUpgrade25to26(VersionUpgrade): # create a definition changes container for this stack definition_changes_parser = self._getCustomFdmPrinterDefinitionChanges(stack_id) definition_changes_id = definition_changes_parser["general"]["name"] + # create a user settings container + user_settings_parser = self._getCustomFdmPrinterUserSettings(stack_id) + user_settings_id = user_settings_parser["general"]["name"] parser = configparser.ConfigParser() parser.add_section("general") @@ -211,7 +220,7 @@ class VersionUpgrade25to26(VersionUpgrade): parser["metadata"]["position"] = str(position) parser.add_section("containers") - parser["containers"]["0"] = "empty" + parser["containers"]["0"] = user_settings_id parser["containers"]["1"] = "empty_quality_changes" parser["containers"]["2"] = quality_id parser["containers"]["3"] = material_id @@ -223,15 +232,22 @@ class VersionUpgrade25to26(VersionUpgrade): definition_changes_parser.write(definition_changes_output) definition_changes_filename = quote_plus(definition_changes_id) + ".inst.cfg" + user_settings_output = io.StringIO() + user_settings_parser.write(user_settings_output) + user_settings_filename = quote_plus(user_settings_id) + ".inst.cfg" + extruder_output = io.StringIO() parser.write(extruder_output) extruder_filename = quote_plus(stack_id) + ".extruder.cfg" extruder_stack_dir = Resources.getPath(CuraApplication.ResourceTypes.ExtruderStack) definition_changes_dir = Resources.getPath(CuraApplication.ResourceTypes.DefinitionChangesContainer) + user_settings_dir = Resources.getPath(CuraApplication.ResourceTypes.UserInstanceContainer) with open(os.path.join(definition_changes_dir, definition_changes_filename), "w") as f: f.write(definition_changes_output.getvalue()) + with open(os.path.join(user_settings_dir, user_settings_filename), "w") as f: + f.write(user_settings_output.getvalue()) with open(os.path.join(extruder_stack_dir, extruder_filename), "w") as f: f.write(extruder_output.getvalue()) @@ -255,3 +271,25 @@ class VersionUpgrade25to26(VersionUpgrade): parser.add_section("values") return parser + + ## Creates a user settings container which doesn't contain anything for the Custom FDM Printers. + # The container ID will be automatically generated according to the given stack name. + def _getCustomFdmPrinterUserSettings(self, stack_id: str): + # For the extruder stacks created in the upgrade, also create user_settings containers so the user changes + # will be saved. + user_settings_id = stack_id + "_user" + + parser = configparser.ConfigParser() + parser.add_section("general") + parser["general"]["version"] = str(2) + parser["general"]["name"] = user_settings_id + parser["general"]["definition"] = "custom" + + parser.add_section("metadata") + parser["metadata"]["extruder"] = stack_id + parser["metadata"]["type"] = "user" + parser["metadata"]["setting_version"] = str(1) + + parser.add_section("values") + + return parser diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index 41d45cfc9b..c81e23b219 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -548,7 +548,17 @@ class XmlMaterialProfile(InstanceContainer): if machine_compatibility: new_material_id = self.id + "_" + machine_id - new_material = XmlMaterialProfile(new_material_id) + # The child or derived material container may already exist. This can happen when a material in a + # project file and the a material in Cura have the same ID. + # In the case if a derived material already exists, override that material container because if + # the data in the parent material has been changed, the derived ones should be updated too. + found_materials = ContainerRegistry.getInstance().findInstanceContainers(id = new_material_id) + is_new_material = False + if found_materials: + new_material = found_materials[0] + else: + new_material = XmlMaterialProfile(new_material_id) + is_new_material = True # Update the private directly, as we want to prevent the lookup that is done when using setName new_material._name = self.getName() @@ -562,7 +572,8 @@ class XmlMaterialProfile(InstanceContainer): new_material._dirty = False - ContainerRegistry.getInstance().addContainer(new_material) + if is_new_material: + ContainerRegistry.getInstance().addContainer(new_material) hotends = machine.iterfind("./um:hotend", self.__namespaces) for hotend in hotends: @@ -594,7 +605,15 @@ class XmlMaterialProfile(InstanceContainer): new_hotend_id = self.id + "_" + machine_id + "_" + hotend_id.replace(" ", "_") - new_hotend_material = XmlMaterialProfile(new_hotend_id) + # Same as machine compatibility, keep the derived material containers consistent with the parent + # material + found_materials = ContainerRegistry.getInstance().findInstanceContainers(id = new_hotend_id) + is_new_material = False + if found_materials: + new_hotend_material = found_materials[0] + else: + new_hotend_material = XmlMaterialProfile(new_hotend_id) + is_new_material = True # Update the private directly, as we want to prevent the lookup that is done when using setName new_hotend_material._name = self.getName() @@ -612,7 +631,8 @@ class XmlMaterialProfile(InstanceContainer): new_hotend_material._dirty = False - ContainerRegistry.getInstance().addContainer(new_hotend_material) + if is_new_material: + ContainerRegistry.getInstance().addContainer(new_hotend_material) def _addSettingElement(self, builder, instance): try: diff --git a/resources/definitions/101Hero.def.json b/resources/definitions/101Hero.def.json index c629cb3769..3d19aef626 100644 --- a/resources/definitions/101Hero.def.json +++ b/resources/definitions/101Hero.def.json @@ -7,7 +7,6 @@ "visible": true, "author": "rikky", "manufacturer": "101Hero", - "category": "Other", "machine_extruder_trains": { "0": "fdmextruder" diff --git a/resources/definitions/3dator.def.json b/resources/definitions/3dator.def.json index fd67f3b797..b72a49a35b 100644 --- a/resources/definitions/3dator.def.json +++ b/resources/definitions/3dator.def.json @@ -7,7 +7,6 @@ "visible": true, "author": "3Dator GmbH", "manufacturer": "3Dator GmbH", - "category": "Other", "file_formats": "text/x-gcode", "icon": "icon_ultimaker2", "supports_usb_connection": true, diff --git a/resources/definitions/abax_pri3.def.json b/resources/definitions/abax_pri3.def.json index cf1f2b466d..fa826e6f94 100644 --- a/resources/definitions/abax_pri3.def.json +++ b/resources/definitions/abax_pri3.def.json @@ -7,7 +7,6 @@ "visible": true, "author": "ABAX 3d Technologies", "manufacturer": "ABAX 3d Technologies", - "category": "Other", "file_formats": "text/x-gcode" }, "overrides": { diff --git a/resources/definitions/abax_pri5.def.json b/resources/definitions/abax_pri5.def.json index aa2a7eec22..b5588e5c96 100644 --- a/resources/definitions/abax_pri5.def.json +++ b/resources/definitions/abax_pri5.def.json @@ -7,7 +7,6 @@ "visible": true, "author": "ABAX 3d Technologies", "manufacturer": "ABAX 3d Technologies", - "category": "Other", "file_formats": "text/x-gcode" }, "overrides": { diff --git a/resources/definitions/abax_titan.def.json b/resources/definitions/abax_titan.def.json index 75f1267b4f..53b768c93f 100644 --- a/resources/definitions/abax_titan.def.json +++ b/resources/definitions/abax_titan.def.json @@ -7,7 +7,6 @@ "visible": true, "author": "ABAX 3d Technologies", "manufacturer": "ABAX 3d Technologies", - "category": "Other", "file_formats": "text/x-gcode" }, "overrides": { diff --git a/resources/definitions/alya3dp.def.json b/resources/definitions/alya3dp.def.json index 8d1eb6730c..5fa6630f51 100644 --- a/resources/definitions/alya3dp.def.json +++ b/resources/definitions/alya3dp.def.json @@ -7,7 +7,6 @@ "visible": true, "author": "ALYA", "manufacturer": "ALYA", - "category": "Other", "file_formats": "text/x-gcode" }, diff --git a/resources/definitions/bfb.def.json b/resources/definitions/bfb.def.json index b685b3d94d..fddec169c5 100644 --- a/resources/definitions/bfb.def.json +++ b/resources/definitions/bfb.def.json @@ -7,7 +7,6 @@ "visible": true, "author": "Ultimaker", "manufacturer": "BFB", - "category": "Other", "file_formats": "text/x-gcode", "platform_offset": [ 0, 0, 0] }, diff --git a/resources/definitions/bq_hephestos.def.json b/resources/definitions/bq_hephestos.def.json index 9a49ecc1ae..91eeecb500 100644 --- a/resources/definitions/bq_hephestos.def.json +++ b/resources/definitions/bq_hephestos.def.json @@ -7,7 +7,6 @@ "visible": true, "author": "BQ", "manufacturer": "BQ", - "category": "Other", "file_formats": "text/x-gcode", "platform": "bq_hephestos_platform.stl", "platform_offset": [ 0, -82, 0] diff --git a/resources/definitions/bq_hephestos_2.def.json b/resources/definitions/bq_hephestos_2.def.json index 68f06e390f..272e547af0 100644 --- a/resources/definitions/bq_hephestos_2.def.json +++ b/resources/definitions/bq_hephestos_2.def.json @@ -7,7 +7,6 @@ "visible": true, "author": "BQ", "manufacturer": "BQ", - "category": "Other", "platform": "bq_hephestos_2_platform.stl", "platform_offset": [6, 1320, 0 ], "file_formats": "text/x-gcode" diff --git a/resources/definitions/bq_hephestos_xl.def.json b/resources/definitions/bq_hephestos_xl.def.json index 504f94c0ed..a5a183b1e9 100644 --- a/resources/definitions/bq_hephestos_xl.def.json +++ b/resources/definitions/bq_hephestos_xl.def.json @@ -7,7 +7,6 @@ "visible": true, "manufacturer": "BQ", "author": "BQ", - "category": "Other", "file_formats": "text/x-code", "platform": "bq_hephestos_platform.stl", "platform_offset": [ 0, -82, 0] diff --git a/resources/definitions/bq_witbox.def.json b/resources/definitions/bq_witbox.def.json index 4dfa3c805f..ca14151e7a 100644 --- a/resources/definitions/bq_witbox.def.json +++ b/resources/definitions/bq_witbox.def.json @@ -7,7 +7,6 @@ "visible": true, "author": "BQ", "manufacturer": "BQ", - "category": "Other", "file_formats": "text/x-gcode", "platform": "bq_witbox_platform.stl", "platform_offset": [ 0, -145, -38] diff --git a/resources/definitions/bq_witbox_2.def.json b/resources/definitions/bq_witbox_2.def.json index a3ef0925ba..f634d9c9c8 100644 --- a/resources/definitions/bq_witbox_2.def.json +++ b/resources/definitions/bq_witbox_2.def.json @@ -7,7 +7,6 @@ "visible": true, "author": "BQ", "manufacturer": "BQ", - "category": "Other", "file_formats": "text/x-gcode", "platform": "bq_witbox_platform.stl", "platform_offset": [0, -145, -38] diff --git a/resources/definitions/cartesio.def.json b/resources/definitions/cartesio.def.json index e5253f3b75..45b0111209 100644 --- a/resources/definitions/cartesio.def.json +++ b/resources/definitions/cartesio.def.json @@ -7,7 +7,6 @@ "visible": true, "author": "Scheepers", "manufacturer": "Cartesio bv", - "category": "Other", "file_formats": "text/x-gcode", "has_machine_quality": true, diff --git a/resources/definitions/creality_cr10.def.json b/resources/definitions/creality_cr10.def.json deleted file mode 100644 index 7335e4a3d4..0000000000 --- a/resources/definitions/creality_cr10.def.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "id": "creality-cr10", - "name": "Creality CR-10", - "version": 2, - "inherits": "fdmprinter", - "metadata": { - "visible": true, - "author": "Michael Wildermuth", - "manufacturer": "Creality3D", - "category": "Other", - "file_formats": "text/x-gcode" - }, - "overrides": { - "machine_width": { - "default_value": 300 - }, - "machine_height": { - "default_value": 400 - }, - "machine_depth": { - "default_value": 300 - }, - "machine_start_gcode": { - "default_value": "G21 ;metric values\nG90 ;absolute Positioning\nG28 ; home all axes\nG1 Z5 F3000 ; lift\nG1 X20 Y2 F1500 ; avoid binder clips\nG1 Z0.2 F3000 ; get ready to prime\nG92 E0 ; reset extrusion distance\nG1 X120 E10 F600 ; prime nozzle\nG1 X150 F5000 ; quick wipe" - }, - "machine_end_gcode": { - "default_value": "G91\nG1 F1800 E-3\nG1 F3000 Z10\nG90\nG28 X0 Y0 ; home x and y axis\nM106 S0 ; turn off cooling fan\nM104 S0 ; turn off extruder\nM140 S0 ; turn off bed\nM84 ; disable motors" - }, - "machine_heated_bed": { - "default_value": true - }, - "gantry_height": { - "default_value": 30 - } - } -} \ No newline at end of file diff --git a/resources/definitions/creality_cr10_beta.def.json b/resources/definitions/creality_cr10_beta.def.json new file mode 100644 index 0000000000..3567370cfa --- /dev/null +++ b/resources/definitions/creality_cr10_beta.def.json @@ -0,0 +1,95 @@ +{ + "id": "creality-cr10_beta", + "name": "Creality CR-10 Beta", + "version": 2, + "inherits": "fdmprinter", + "metadata": { + "visible": true, + "author": "Michael Wildermuth", + "manufacturer": "Creality3D", + "file_formats": "text/x-gcode" + }, + "overrides": { + "machine_width": { + "default_value": 300 + }, + "machine_height": { + "default_value": 400 + }, + "machine_depth": { + "default_value": 300 + }, + "material_diameter": { + "default_value": 1.75 + }, + "machine_nozzle_size": { + "default_value": 0.4 + }, + "layer_height": { + "default_value": 0.2 + }, + "layer_height_0": { + "default_value": 0.2 + }, + "top_bottom_thickness": { + "default_value": 0.6 + }, + "top_bottom_pattern": { + "default_value": "concentric" + }, + "infill_pattern": { + "value": "'triangles'" + }, + "retraction_enable": { + "default_value": true + }, + "retraction_amount": { + "default_value": 5 + }, + "retraction_speed": { + "default_value": 40 + }, + "cool_min_layer_time": { + "default_value": 15 + }, + "adhesion_type": { + "default_value": "skirt" + }, + "skirt_line_count": { + "default_value": 4 + }, + "skirt_gap": { + "default_value": 5 + }, + "machine_start_gcode": { + "default_value": "G21 ;metric values\nG90 ;absolute Positioning\nG28 ; home all axes\nG1 Z5 F3000 ; lift\nG1 X20 Y2 F1500 ; avoid binder clips\nG1 Z0.2 F3000 ; get ready to prime\nG92 E0 ; reset extrusion distance\nG1 X120 E10 F600 ; prime nozzle\nG1 X150 F5000 ; quick wipe" + }, + "machine_end_gcode": { + "default_value": "G91\nG1 F1800 E-3\nG1 F3000 Z10\nG90\nG28 X0 Y0 ; home x and y axis\nM106 S0 ; turn off cooling fan\nM104 S0 ; turn off extruder\nM140 S0 ; turn off bed\nM84 ; disable motors" + }, + "machine_heated_bed": { + "default_value": true + }, + "gantry_height": { + "default_value": 30 + }, + "acceleration_enabled": { + "default_value": true + }, + "acceleration_print": { + "default_value": 500 + }, + "acceleration_travel": { + "default_value": 500 + }, + "jerk_enabled": { + "default_value": true + }, + "jerk_print": { + "default_value": 20 + }, + "jerk_travel": { + "default_value": 20 + } + } +} \ No newline at end of file diff --git a/resources/definitions/creality_cr10s4_beta.def.json b/resources/definitions/creality_cr10s4_beta.def.json new file mode 100644 index 0000000000..9eae48e2be --- /dev/null +++ b/resources/definitions/creality_cr10s4_beta.def.json @@ -0,0 +1,23 @@ +{ + "id": "creality-cr10s4_beta", + "name": "Creality CR-10 S4 Beta", + "version": 2, + "inherits": "creality_cr10_beta", + "metadata": { + "visible": true, + "author": "Michael Wildermuth", + "manufacturer": "Creality3D", + "file_formats": "text/x-gcode" + }, + "overrides": { + "machine_width": { + "default_value": 400 + }, + "machine_height": { + "default_value": 400 + }, + "machine_depth": { + "default_value": 400 + } + } +} \ No newline at end of file diff --git a/resources/definitions/creality_cr10s5_beta.def.json b/resources/definitions/creality_cr10s5_beta.def.json new file mode 100644 index 0000000000..594d40ab83 --- /dev/null +++ b/resources/definitions/creality_cr10s5_beta.def.json @@ -0,0 +1,23 @@ +{ + "id": "creality-cr10s5_beta", + "name": "Creality CR-10 S5 Beta", + "version": 2, + "inherits": "creality_cr10_beta", + "metadata": { + "visible": true, + "author": "Michael Wildermuth", + "manufacturer": "Creality3D", + "file_formats": "text/x-gcode" + }, + "overrides": { + "machine_width": { + "default_value": 500 + }, + "machine_height": { + "default_value": 500 + }, + "machine_depth": { + "default_value": 500 + } + } +} \ No newline at end of file diff --git a/resources/definitions/dagoma_discoeasy200.def.json b/resources/definitions/dagoma_discoeasy200.def.json index 718c5b0873..8f1a792bc0 100755 --- a/resources/definitions/dagoma_discoeasy200.def.json +++ b/resources/definitions/dagoma_discoeasy200.def.json @@ -7,7 +7,6 @@ "visible": true, "author": "Dagoma", "manufacturer": "Dagoma", - "category": "Other", "file_formats": "text/x-gcode", "icon": "icon_ultimaker2.png", "platform": "discoeasy200.stl", diff --git a/resources/definitions/delta_go.def.json b/resources/definitions/delta_go.def.json index ccb659f973..36e0787039 100644 --- a/resources/definitions/delta_go.def.json +++ b/resources/definitions/delta_go.def.json @@ -4,39 +4,38 @@ "version": 2, "inherits": "fdmprinter", "metadata": { - "visible": true, - "author": "Deltaprintr", - "manufacturer": "Deltaprintr", - "category": "Other", - "file_formats": "text/x-gcode", - "platform_offset": [ 0, 0, 0], - "platform": "" - }, + "visible": true, + "author": "Deltaprintr", + "manufacturer": "Deltaprintr", + "file_formats": "text/x-gcode", + "platform_offset": [0, 0, 0], + "platform": "" + }, "overrides": { - "machine_name": { "default_value": "Delta Go" }, - "material_diameter": { "default_value": 1.75 }, - "default_material_print_temperature": { "default_value": 210 }, - "speed_travel": { "default_value": 150 }, - "prime_tower_size": { "default_value": 8.66 }, - "infill_sparse_density": { "default_value": 10 }, - "speed_wall_x": { "default_value": 30 }, - "speed_wall_0": { "default_value": 30 }, - "speed_topbottom": { "default_value": 20 }, - "layer_height": { "default_value": 0.15 }, - "speed_print": { "default_value": 30 }, - "machine_heated_bed": { "default_value": false }, - "machine_center_is_zero": { "default_value": true }, - "machine_height": { "default_value": 154 }, - "machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" }, - "machine_depth": { "default_value": 115 }, - "machine_width": { "default_value": 115 }, - "raft_airgap": { "default_value": 0.15 }, - "retraction_hop_enabled": { "value": "True" }, - "retraction_amount": { "default_value": 4.1 }, - "retraction_speed": { "default_value": 500 }, - "retraction_hop": { "value": "0.2" }, - "retraction_hop_only_when_collides": { "value": "True" }, - "brim_width": { "value": "5" }, - "machine_shape": { "default_value": "elliptic"} - } + "machine_name": { "default_value": "Delta Go" }, + "material_diameter": { "default_value": 1.75 }, + "default_material_print_temperature": { "default_value": 210 }, + "speed_travel": { "default_value": 150 }, + "prime_tower_size": { "default_value": 8.66 }, + "infill_sparse_density": { "default_value": 10 }, + "speed_wall_x": { "default_value": 30 }, + "speed_wall_0": { "default_value": 30 }, + "speed_topbottom": { "default_value": 20 }, + "layer_height": { "default_value": 0.15 }, + "speed_print": { "default_value": 30 }, + "machine_heated_bed": { "default_value": false }, + "machine_center_is_zero": { "default_value": true }, + "machine_height": { "default_value": 154 }, + "machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" }, + "machine_depth": { "default_value": 115 }, + "machine_width": { "default_value": 115 }, + "raft_airgap": { "default_value": 0.15 }, + "retraction_hop_enabled": { "value": "True" }, + "retraction_amount": { "default_value": 4.1 }, + "retraction_speed": { "default_value": 500 }, + "retraction_hop": { "value": "0.2" }, + "retraction_hop_only_when_collides": { "value": "True" }, + "brim_width": { "value": "5" }, + "machine_shape": { "default_value": "elliptic"} + } } diff --git a/resources/definitions/deltabot.def.json b/resources/definitions/deltabot.def.json index 1132f7e7bb..cee5ab1be1 100644 --- a/resources/definitions/deltabot.def.json +++ b/resources/definitions/deltabot.def.json @@ -7,7 +7,6 @@ "visible": true, "author": "Ultimaker", "manufacturer": "Danny Lu", - "category": "Other", "file_formats": "text/x-gcode", "platform_offset": [ 0, 0, 0] }, diff --git a/resources/definitions/easyarts_ares.def.json b/resources/definitions/easyarts_ares.def.json index 12273ed9ce..8d3e5338b6 100644 --- a/resources/definitions/easyarts_ares.def.json +++ b/resources/definitions/easyarts_ares.def.json @@ -7,7 +7,6 @@ "visible": true, "author": "nliaudat", "manufacturer": "EasyArts (discontinued)", - "category": "Other", "file_formats": "text/x-gcode" }, "overrides": { diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 21de5524cf..9ca3937123 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -6,7 +6,7 @@ { "type": "machine", "author": "Ultimaker", - "category": "Ultimaker", + "category": "Other", "manufacturer": "Unknown", "setting_version": 1, "file_formats": "text/x-gcode;application/x-stl-ascii;application/x-stl-binary;application/x-wavefront-obj;application/x3g", @@ -1510,6 +1510,44 @@ "limit_to_extruder": "infill_extruder_nr", "settable_per_mesh": true }, + "skin_preshrink": + { + "label": "Skin Pre-Shrink Distance", + "description": "The distance the skins are shrunk before considering them for skin expansion. Every skin area smaller than this value will disappear. This can help in limiting the amount of time and material spent on printing top/bottom skin at slanted surfaces in the model.", + "unit": "mm", + "type": "float", + "default_value": 0, + "minimum_value": "0", + "limit_to_extruder": "top_bottom_extruder_nr", + "settable_per_mesh": true, + "children": + { + "top_skin_preshrink": + { + "label": "Top Skin Pre-Shrink Distance", + "description": "The distance the top skins are shrunk before considering them for skin expansion. Every skin area smaller than this value will disappear. This can help in limiting the amount of time and material spent on printing top skin at slanted surfaces in the model.", + "unit": "mm", + "type": "float", + "default_value": 0, + "value": "skin_preshrink", + "minimum_value": "0", + "limit_to_extruder": "top_bottom_extruder_nr", + "settable_per_mesh": true + }, + "bottom_skin_preshrink": + { + "label": "Bottom Skin Pre-Shrink Distance", + "description": "The distance the bottom skins are shrunk before considering them for skin expansion. Every skin area smaller than this value will disappear. This can help in limiting the amount of time and material spent on printing bottom skin at slanted surfaces in the model.", + "unit": "mm", + "type": "float", + "default_value": 0, + "value": "skin_preshrink", + "minimum_value": "0", + "limit_to_extruder": "top_bottom_extruder_nr", + "settable_per_mesh": true + } + } + }, "expand_skins_into_infill": { "label": "Expand Skins Into Infill", @@ -4626,7 +4664,7 @@ "unit": "mm³", "default_value": 0, "minimum_value": "0", - "maximum_value_warning": "0.5", + "maximum_value_warning": "1", "settable_per_mesh": false, "settable_per_extruder": true }, diff --git a/resources/definitions/folgertech_FT-5.def.json b/resources/definitions/folgertech_FT-5.def.json index a7709e9395..71c6987a1a 100644 --- a/resources/definitions/folgertech_FT-5.def.json +++ b/resources/definitions/folgertech_FT-5.def.json @@ -6,7 +6,6 @@ "visible": true, "author": "Jaime van Kessel & Paul Bussiere", "manufacturer": "Folger Tech", - "category": "Other", "file_formats": "text/x-gcode", "platform": "FT-5_build_plate.stl" }, diff --git a/resources/definitions/grr_neo.def.json b/resources/definitions/grr_neo.def.json index d09126f3e4..42c2e75319 100644 --- a/resources/definitions/grr_neo.def.json +++ b/resources/definitions/grr_neo.def.json @@ -7,7 +7,6 @@ "visible": true, "author": "Simon Cor", "manufacturer": "German RepRap", - "category": "Other", "file_formats": "text/x-gcode", "icon": "icon_ultimaker.png", "platform": "grr_neo_platform.stl" diff --git a/resources/definitions/helloBEEprusa.def.json b/resources/definitions/helloBEEprusa.def.json index 0fee04f2e9..660e182187 100755 --- a/resources/definitions/helloBEEprusa.def.json +++ b/resources/definitions/helloBEEprusa.def.json @@ -7,7 +7,6 @@ "visible": true, "author": "BEEVERYCREATIVE", "manufacturer": "BEEVERYCREATIVE", - "category": "Other", "platform": "BEEVERYCREATIVE-helloBEEprusa.stl", "platform_offset": [-226, -75, -196], "file_formats": "text/x-gcode", diff --git a/resources/definitions/imade3d_jellybox.def.json b/resources/definitions/imade3d_jellybox.def.json index 86b34bfd5c..0c0f29c070 100644 --- a/resources/definitions/imade3d_jellybox.def.json +++ b/resources/definitions/imade3d_jellybox.def.json @@ -7,7 +7,6 @@ "visible": true, "author": "IMADE3D", "manufacturer": "IMADE3D", - "category": "Other", "platform": "imade3d_jellybox_platform.stl", "platform_offset": [ 0, -0.3, 0], "file_formats": "text/x-gcode", diff --git a/resources/definitions/innovo_inventor.def.json b/resources/definitions/innovo_inventor.def.json index 4b169c5e31..5fc6c83ca2 100644 --- a/resources/definitions/innovo_inventor.def.json +++ b/resources/definitions/innovo_inventor.def.json @@ -7,7 +7,6 @@ "visible": true, "author": "Adam Rumjahn", "manufacturer": "Innovo", - "category": "Other", "file_formats": "text/x-gcode", "platform": "inventor_platform.stl", "platform_offset": [-180, -0.25, 160] diff --git a/resources/definitions/julia.def.json b/resources/definitions/julia.def.json index a0eda65bb7..fe10473596 100644 --- a/resources/definitions/julia.def.json +++ b/resources/definitions/julia.def.json @@ -7,7 +7,6 @@ "visible": true, "author": "Ultimaker", "manufacturer": "Fracktal", - "category": "Other", "file_formats": "text/x-gcode", "platform_offset": [ 0, 0, 0] }, diff --git a/resources/definitions/kemiq_q2_beta.def.json b/resources/definitions/kemiq_q2_beta.def.json index 911fc584a9..d5bb8a895e 100644 --- a/resources/definitions/kemiq_q2_beta.def.json +++ b/resources/definitions/kemiq_q2_beta.def.json @@ -7,7 +7,6 @@ "visible": true, "author": "KEMIQ", "manufacturer": "KEMIQ", - "category": "Other", "file_formats": "text/x-gcode", "platform": "kemiq_q2.stl", "has_machine_quality": true, diff --git a/resources/definitions/kemiq_q2_gama.def.json b/resources/definitions/kemiq_q2_gama.def.json index 4f803ecdb8..1cb1b45c21 100644 --- a/resources/definitions/kemiq_q2_gama.def.json +++ b/resources/definitions/kemiq_q2_gama.def.json @@ -7,7 +7,6 @@ "visible": true, "author": "KEMIQ", "manufacturer": "KEMIQ", - "category": "Other", "file_formats": "text/x-gcode", "platform": "kemiq_q2.stl", "has_machine_quality": true, diff --git a/resources/definitions/kossel_mini.def.json b/resources/definitions/kossel_mini.def.json index e0e4665570..d915c148a3 100644 --- a/resources/definitions/kossel_mini.def.json +++ b/resources/definitions/kossel_mini.def.json @@ -7,7 +7,6 @@ "visible": true, "author": "Claudio Sampaio (Patola)", "manufacturer": "Other", - "category": "Other", "file_formats": "text/x-gcode", "icon": "icon_ultimaker2", "platform": "kossel_platform.stl", diff --git a/resources/definitions/kossel_pro.def.json b/resources/definitions/kossel_pro.def.json index c9dbd63a50..58f1c7f94e 100644 --- a/resources/definitions/kossel_pro.def.json +++ b/resources/definitions/kossel_pro.def.json @@ -7,7 +7,6 @@ "visible": true, "author": "Chris Petersen", "manufacturer": "OpenBeam", - "category": "Other", "file_formats": "text/x-gcode", "icon": "icon_ultimaker2", "platform": "kossel_pro_build_platform.stl", diff --git a/resources/definitions/kupido.def.json b/resources/definitions/kupido.def.json index 97be1a0152..8dec63f6ec 100644 --- a/resources/definitions/kupido.def.json +++ b/resources/definitions/kupido.def.json @@ -7,7 +7,6 @@ "visible": true, "author": "Ultimaker", "manufacturer": "Kupido", - "category": "Other", "file_formats": "text/x-gcode", "platform_offset": [ 0, 0, 0] }, diff --git a/resources/definitions/m180.def.json b/resources/definitions/m180.def.json index 04859d87b9..1e8ac1767b 100644 --- a/resources/definitions/m180.def.json +++ b/resources/definitions/m180.def.json @@ -7,7 +7,6 @@ "visible": true, "author": "Ruben Dulek", "manufacturer": "Malyan", - "category": "Other", "file_formats": "application/x3g" }, diff --git a/resources/definitions/makeR_pegasus.def.json b/resources/definitions/makeR_pegasus.def.json index 08f7702666..b164b2983f 100644 --- a/resources/definitions/makeR_pegasus.def.json +++ b/resources/definitions/makeR_pegasus.def.json @@ -7,7 +7,6 @@ "visible": true, "author": "makeR", "manufacturer": "makeR", - "category": "Other", "file_formats": "text/x-gcode", "icon": "icon_ultimaker2", "platform": "makeR_pegasus_platform.stl", diff --git a/resources/definitions/makeR_prusa_tairona_i3.def.json b/resources/definitions/makeR_prusa_tairona_i3.def.json index 612497d012..caccb2ebe6 100644 --- a/resources/definitions/makeR_prusa_tairona_i3.def.json +++ b/resources/definitions/makeR_prusa_tairona_i3.def.json @@ -7,11 +7,10 @@ "visible": true, "author": "makeR", "manufacturer": "makeR", - "category": "Other", "file_formats": "text/x-gcode", "icon": "icon_ultimaker2", "platform": "makeR_prusa_tairona_i3_platform.stl", - "platform_offset": [-2,0,0] + "platform_offset": [-2, 0, 0] }, "overrides": { diff --git a/resources/definitions/makeit_pro_l.def.json b/resources/definitions/makeit_pro_l.def.json index 30043cd906..36f7354b64 100644 --- a/resources/definitions/makeit_pro_l.def.json +++ b/resources/definitions/makeit_pro_l.def.json @@ -7,7 +7,6 @@ "visible": true, "author": "NA", "manufacturer": "NA", - "category": "Other", "file_formats": "text/x-gcode", "has_materials": false, "supported_actions": [ "MachineSettingsAction", "UpgradeFirmware" ], diff --git a/resources/definitions/makeit_pro_m.def.json b/resources/definitions/makeit_pro_m.def.json index abaec4c81f..f45e0b6635 100644 --- a/resources/definitions/makeit_pro_m.def.json +++ b/resources/definitions/makeit_pro_m.def.json @@ -7,7 +7,6 @@ "visible": true, "author": "NA", "manufacturer": "NA", - "category": "Other", "file_formats": "text/x-gcode", "has_materials": false, "supported_actions": [ "MachineSettingsAction", "UpgradeFirmware" ], diff --git a/resources/definitions/maker_starter.def.json b/resources/definitions/maker_starter.def.json index e4c09c75f2..8358ba0064 100644 --- a/resources/definitions/maker_starter.def.json +++ b/resources/definitions/maker_starter.def.json @@ -7,7 +7,6 @@ "visible": true, "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" diff --git a/resources/definitions/makerbotreplicator.def.json b/resources/definitions/makerbotreplicator.def.json index d762db67fc..7844976912 100644 --- a/resources/definitions/makerbotreplicator.def.json +++ b/resources/definitions/makerbotreplicator.def.json @@ -7,7 +7,6 @@ "visible": true, "author": "Ultimaker", "manufacturer": "MakerBot", - "category": "Other", "file_formats": "application/x3g", "platform_offset": [ 0, 0, 0] }, diff --git a/resources/definitions/mankati_fullscale_xt_plus.def.json b/resources/definitions/mankati_fullscale_xt_plus.def.json index c841859962..6c3115b1dc 100644 --- a/resources/definitions/mankati_fullscale_xt_plus.def.json +++ b/resources/definitions/mankati_fullscale_xt_plus.def.json @@ -7,7 +7,6 @@ "visible": true, "author": "RBC", "manufacturer": "Mankati", - "category": "Other", "file_formats": "text/x-gcode", "platform": "mankati_fullscale_xt_plus_platform.stl" }, diff --git a/resources/definitions/mendel90.def.json b/resources/definitions/mendel90.def.json index fee035cdd9..60f3307758 100644 --- a/resources/definitions/mendel90.def.json +++ b/resources/definitions/mendel90.def.json @@ -7,7 +7,6 @@ { "visible": true, "author": "Bo Herrmannsen", - "category": "Other", "manufacturer": "Nophead", "file_formats": "text/x-gcode", "platform": "mendel90_platform.stl", diff --git a/resources/definitions/ord.def.json b/resources/definitions/ord.def.json index bedd8c3121..d9909c4f1f 100644 --- a/resources/definitions/ord.def.json +++ b/resources/definitions/ord.def.json @@ -7,7 +7,6 @@ "visible": true, "author": "Ultimaker", "manufacturer": "ORD Solutions", - "category": "Other", "file_formats": "text/x-gcode", "machine_extruder_trains": { diff --git a/resources/definitions/peopoly_moai.def.json b/resources/definitions/peopoly_moai.def.json index 4bbb033fb7..6b0e0ae547 100644 --- a/resources/definitions/peopoly_moai.def.json +++ b/resources/definitions/peopoly_moai.def.json @@ -7,7 +7,6 @@ "visible": true, "author": "fieldOfView", "manufacturer": "Peopoly", - "category": "Other", "file_formats": "text/x-gcode", "has_machine_quality": true, "has_materials": false diff --git a/resources/definitions/printrbot_play.def.json b/resources/definitions/printrbot_play.def.json index bce67364f8..452b5e131f 100644 --- a/resources/definitions/printrbot_play.def.json +++ b/resources/definitions/printrbot_play.def.json @@ -7,7 +7,6 @@ "visible": true, "author": "Chris Pearson", "manufacturer": "Printrbot", - "category": "Other", "file_formats": "text/x-gcode", "platform": "printrbot_play.stl" }, diff --git a/resources/definitions/printrbot_play_heated.def.json b/resources/definitions/printrbot_play_heated.def.json index 878a4f358f..02157a0913 100644 --- a/resources/definitions/printrbot_play_heated.def.json +++ b/resources/definitions/printrbot_play_heated.def.json @@ -7,7 +7,6 @@ "visible": true, "author": "Chris Pearson", "manufacturer": "Printrbot", - "category": "Other", "file_formats": "text/x-gcode", "platform": "" }, diff --git a/resources/definitions/printrbot_simple.def.json b/resources/definitions/printrbot_simple.def.json index b0ece54f8f..eba47c88ae 100644 --- a/resources/definitions/printrbot_simple.def.json +++ b/resources/definitions/printrbot_simple.def.json @@ -7,7 +7,6 @@ "visible": true, "author": "Calvindog717", "manufacturer": "PrintrBot", - "category": "Other", "platform": "printrbot_simple_metal_platform.stl", "platform_offset": [0, -3.45, 0], "file_formats": "text/x-gcode" diff --git a/resources/definitions/printrbot_simple_extended.def.json b/resources/definitions/printrbot_simple_extended.def.json index 4cf9cb477c..b08e0c7d5d 100644 --- a/resources/definitions/printrbot_simple_extended.def.json +++ b/resources/definitions/printrbot_simple_extended.def.json @@ -7,7 +7,6 @@ "visible": true, "author": "samsector", "manufacturer": "PrintrBot", - "category": "Other", "platform": "printrbot_simple_metal_upgrade.stl", "platform_offset": [0, -0.3, 0], "file_formats": "text/x-gcode" diff --git a/resources/definitions/prusa_i3.def.json b/resources/definitions/prusa_i3.def.json index 307246dbc9..4f0f5b13d7 100644 --- a/resources/definitions/prusa_i3.def.json +++ b/resources/definitions/prusa_i3.def.json @@ -7,7 +7,6 @@ "visible": true, "author": "Quillford", "manufacturer": "Prusajr", - "category": "Other", "file_formats": "text/x-gcode", "icon": "icon_ultimaker2", "platform": "prusai3_platform.stl" diff --git a/resources/definitions/prusa_i3_mk2.def.json b/resources/definitions/prusa_i3_mk2.def.json index 02af039867..d4425728d4 100644 --- a/resources/definitions/prusa_i3_mk2.def.json +++ b/resources/definitions/prusa_i3_mk2.def.json @@ -7,7 +7,6 @@ "visible": true, "author": "Apsu", "manufacturer": "Prusa Research", - "category": "Other", "file_formats": "text/x-gcode", "icon": "icon_ultimaker2", "platform": "prusai3_platform.stl", diff --git a/resources/definitions/prusa_i3_xl.def.json b/resources/definitions/prusa_i3_xl.def.json index 9d792f8249..e49838c95f 100644 --- a/resources/definitions/prusa_i3_xl.def.json +++ b/resources/definitions/prusa_i3_xl.def.json @@ -7,7 +7,6 @@ "visible": true, "author": "guigashm", "manufacturer": "Prusajr", - "category": "Other", "file_formats": "text/x-gcode", "icon": "icon_ultimaker2.png", "platform": "prusai3_xl_platform.stl" diff --git a/resources/definitions/punchtec_connect_xl.def.json b/resources/definitions/punchtec_connect_xl.def.json index ce4245a04f..16ba59dcb7 100644 --- a/resources/definitions/punchtec_connect_xl.def.json +++ b/resources/definitions/punchtec_connect_xl.def.json @@ -7,7 +7,6 @@ "visible": true, "author": "Ultimaker", "manufacturer": "Punchtec", - "category": "Other", "file_formats": "text/x-gcode", "machine_extruder_trains": { diff --git a/resources/definitions/renkforce_rf100.def.json b/resources/definitions/renkforce_rf100.def.json index caf9b11860..55e764800a 100644 --- a/resources/definitions/renkforce_rf100.def.json +++ b/resources/definitions/renkforce_rf100.def.json @@ -5,7 +5,6 @@ "inherits": "fdmprinter", "metadata": { "author": "Simon Peter (based on RF100.ini by Conrad Electronic SE)", - "category": "Other", "file_formats": "text/x-gcode", "manufacturer": "Renkforce", "visible": true diff --git a/resources/definitions/rigid3d.def.json b/resources/definitions/rigid3d.def.json index b167646f6e..75e435f880 100644 --- a/resources/definitions/rigid3d.def.json +++ b/resources/definitions/rigid3d.def.json @@ -7,7 +7,6 @@ "visible": true, "author": "Ultimaker", "manufacturer": "Rigid3D", - "category": "Other", "file_formats": "text/x-gcode", "platform_offset": [ 0, 0, 0] }, diff --git a/resources/definitions/rigid3d_3rdgen.def.json b/resources/definitions/rigid3d_3rdgen.def.json index e7c73ed54d..3191817ecd 100644 --- a/resources/definitions/rigid3d_3rdgen.def.json +++ b/resources/definitions/rigid3d_3rdgen.def.json @@ -7,7 +7,6 @@ "visible": true, "author": "Ultimaker", "manufacturer": "Rigid3D", - "category": "Other", "file_formats": "text/x-gcode", "platform_offset": [ 0, 0, 0] }, diff --git a/resources/definitions/rigid3d_hobby.def.json b/resources/definitions/rigid3d_hobby.def.json index 09ba77f63c..02e3cc514c 100644 --- a/resources/definitions/rigid3d_hobby.def.json +++ b/resources/definitions/rigid3d_hobby.def.json @@ -7,7 +7,6 @@ "visible": true, "author": "Ultimaker", "manufacturer": "Rigid3D", - "category": "Other", "file_formats": "text/x-gcode", "platform_offset": [ 0, 0, 0] }, diff --git a/resources/definitions/rigid3d_zero.def.json b/resources/definitions/rigid3d_zero.def.json index d5f8c1ef6a..7e99112621 100644 --- a/resources/definitions/rigid3d_zero.def.json +++ b/resources/definitions/rigid3d_zero.def.json @@ -7,7 +7,6 @@ "visible": true, "author": "Ultimaker", "manufacturer": "Rigid3D", - "category": "Other", "file_formats": "text/x-gcode", "platform_offset": [ 0, 0, 0] }, diff --git a/resources/definitions/rigid3d_zero2.def.json b/resources/definitions/rigid3d_zero2.def.json index ddb98b0eb2..e2a77db895 100644 --- a/resources/definitions/rigid3d_zero2.def.json +++ b/resources/definitions/rigid3d_zero2.def.json @@ -7,7 +7,6 @@ "visible": true, "author": "Rigid3D", "manufacturer": "Rigid3D", - "category": "Other", "has_materials": false, "file_formats": "text/x-gcode", "platform": "rigid3d_zero2_platform.stl", diff --git a/resources/definitions/rigidbot.def.json b/resources/definitions/rigidbot.def.json index 1f63af8758..d183554947 100644 --- a/resources/definitions/rigidbot.def.json +++ b/resources/definitions/rigidbot.def.json @@ -7,7 +7,6 @@ "visible": true, "author": "RBC", "manufacturer": "RigidBot", - "category": "Other", "file_formats": "text/x-gcode", "platform": "rigidbot_platform.stl" }, diff --git a/resources/definitions/rigidbot_big.def.json b/resources/definitions/rigidbot_big.def.json index 8ba52303dd..33c4fd3d27 100644 --- a/resources/definitions/rigidbot_big.def.json +++ b/resources/definitions/rigidbot_big.def.json @@ -7,7 +7,6 @@ "visible": true, "author": "RBC", "manufacturer": "RigidBot", - "category": "Other", "file_formats": "text/x-gcode", "platform": "rigidbotbig_platform.stl" }, diff --git a/resources/definitions/robo_3d_r1.def.json b/resources/definitions/robo_3d_r1.def.json index b137b2054b..88b3fba01f 100644 --- a/resources/definitions/robo_3d_r1.def.json +++ b/resources/definitions/robo_3d_r1.def.json @@ -7,7 +7,6 @@ "visible": true, "author": "Ultimaker", "manufacturer": "Robo 3D", - "category": "Other", "file_formats": "text/x-gcode", "platform_offset": [ 0, 0, 0] }, diff --git a/resources/definitions/tam.def.json b/resources/definitions/tam.def.json index 87dba5f027..93ebe43ea6 100644 --- a/resources/definitions/tam.def.json +++ b/resources/definitions/tam.def.json @@ -7,7 +7,6 @@ "visible": true, "author": "typeamachines", "manufacturer": "typeamachines", - "category": "Other", "file_formats": "text/x-gcode", "platform": "tam_series1.stl", "platform_offset": [-580.0, -6.23, 253.5], diff --git a/resources/definitions/ultimaker.def.json b/resources/definitions/ultimaker.def.json index adf0ec8054..b11a84164a 100644 --- a/resources/definitions/ultimaker.def.json +++ b/resources/definitions/ultimaker.def.json @@ -6,6 +6,7 @@ "metadata": { "author": "Ultimaker", "manufacturer": "Ultimaker B.V.", + "category": "Ultimaker", "visible": false }, "overrides": { diff --git a/resources/definitions/ultimaker2.def.json b/resources/definitions/ultimaker2.def.json index f1db386e0d..1931e5f8e3 100644 --- a/resources/definitions/ultimaker2.def.json +++ b/resources/definitions/ultimaker2.def.json @@ -7,7 +7,6 @@ "visible": true, "author": "Ultimaker", "manufacturer": "Ultimaker B.V.", - "category": "Ultimaker", "weight": 3, "file_formats": "text/x-gcode", "icon": "icon_ultimaker2.png", diff --git a/resources/definitions/ultimaker2_extended.def.json b/resources/definitions/ultimaker2_extended.def.json index 687369d559..b83f24ed3a 100644 --- a/resources/definitions/ultimaker2_extended.def.json +++ b/resources/definitions/ultimaker2_extended.def.json @@ -6,7 +6,6 @@ "metadata": { "author": "Ultimaker", "manufacturer": "Ultimaker B.V.", - "category": "Ultimaker", "weight": 3, "file_formats": "text/x-gcode", "icon": "icon_ultimaker2.png", diff --git a/resources/definitions/ultimaker2_extended_plus.def.json b/resources/definitions/ultimaker2_extended_plus.def.json index 15256064f3..525aaf5b72 100644 --- a/resources/definitions/ultimaker2_extended_plus.def.json +++ b/resources/definitions/ultimaker2_extended_plus.def.json @@ -6,7 +6,6 @@ "metadata": { "author": "Ultimaker", "manufacturer": "Ultimaker B.V.", - "category": "Ultimaker", "quality_definition": "ultimaker2_plus", "weight": 2, "file_formats": "text/x-gcode", diff --git a/resources/definitions/ultimaker2_go.def.json b/resources/definitions/ultimaker2_go.def.json index 0803a91571..abf10ef680 100644 --- a/resources/definitions/ultimaker2_go.def.json +++ b/resources/definitions/ultimaker2_go.def.json @@ -6,7 +6,6 @@ "metadata": { "author": "Ultimaker", "manufacturer": "Ultimaker B.V.", - "category": "Ultimaker", "weight": 3, "file_formats": "text/x-gcode", "icon": "icon_ultimaker2.png", diff --git a/resources/definitions/ultimaker2_plus.def.json b/resources/definitions/ultimaker2_plus.def.json index ef5420e77a..7214e6b7fe 100644 --- a/resources/definitions/ultimaker2_plus.def.json +++ b/resources/definitions/ultimaker2_plus.def.json @@ -6,7 +6,6 @@ "metadata": { "author": "Ultimaker", "manufacturer": "Ultimaker B.V.", - "category": "Ultimaker", "weight": 1, "file_formats": "text/x-gcode", "platform": "ultimaker2_platform.obj", diff --git a/resources/definitions/ultimaker3.def.json b/resources/definitions/ultimaker3.def.json index ba1caeddb5..6221fa6228 100644 --- a/resources/definitions/ultimaker3.def.json +++ b/resources/definitions/ultimaker3.def.json @@ -6,7 +6,6 @@ "metadata": { "author": "Ultimaker", "manufacturer": "Ultimaker B.V.", - "category": "Ultimaker", "visible": true, "file_formats": "text/x-gcode", "platform": "ultimaker3_platform.obj", diff --git a/resources/definitions/ultimaker3_extended.def.json b/resources/definitions/ultimaker3_extended.def.json index 7cf90a1a90..e47ccf4ba3 100644 --- a/resources/definitions/ultimaker3_extended.def.json +++ b/resources/definitions/ultimaker3_extended.def.json @@ -6,7 +6,6 @@ "metadata": { "author": "Ultimaker", "manufacturer": "Ultimaker B.V.", - "category": "Ultimaker", "quality_definition": "ultimaker3", "visible": true, "file_formats": "text/x-gcode", diff --git a/resources/definitions/ultimaker_original.def.json b/resources/definitions/ultimaker_original.def.json index 82f309cc13..ef2f5fae5c 100644 --- a/resources/definitions/ultimaker_original.def.json +++ b/resources/definitions/ultimaker_original.def.json @@ -7,7 +7,6 @@ "visible": true, "author": "Ultimaker", "manufacturer": "Ultimaker B.V.", - "category": "Ultimaker", "weight": 4, "file_formats": "text/x-gcode", "icon": "icon_ultimaker.png", diff --git a/resources/definitions/ultimaker_original_dual.def.json b/resources/definitions/ultimaker_original_dual.def.json index 38dd2f0a04..8745434360 100644 --- a/resources/definitions/ultimaker_original_dual.def.json +++ b/resources/definitions/ultimaker_original_dual.def.json @@ -7,7 +7,6 @@ "visible": true, "author": "Ultimaker", "manufacturer": "Ultimaker B.V.", - "category": "Ultimaker", "weight": 4, "file_formats": "text/x-gcode", "icon": "icon_ultimaker.png", diff --git a/resources/definitions/ultimaker_original_plus.def.json b/resources/definitions/ultimaker_original_plus.def.json index 013e8bd717..8e401d550c 100644 --- a/resources/definitions/ultimaker_original_plus.def.json +++ b/resources/definitions/ultimaker_original_plus.def.json @@ -6,7 +6,6 @@ "metadata": { "author": "Ultimaker", "manufacturer": "Ultimaker B.V.", - "category": "Ultimaker", "weight": 4, "file_formats": "text/x-gcode", "icon": "icon_ultimaker.png", diff --git a/resources/definitions/uniqbot_one.def.json b/resources/definitions/uniqbot_one.def.json index 7ec5f162ea..410f7e57a6 100644 --- a/resources/definitions/uniqbot_one.def.json +++ b/resources/definitions/uniqbot_one.def.json @@ -6,7 +6,6 @@ "metadata": { "author": "Unimatech", "manufacturer": "Unimatech", - "category": "Other", "file_formats": "text/x-gcode", "icon": "icon_ultimaker2.png" }, diff --git a/resources/definitions/vertex_k8400.def.json b/resources/definitions/vertex_k8400.def.json index ac7ccd5e93..a23e1fc893 100644 --- a/resources/definitions/vertex_k8400.def.json +++ b/resources/definitions/vertex_k8400.def.json @@ -6,7 +6,6 @@ "metadata": { "visible": true, "manufacturer": "Velleman", - "category": "Other", "file_formats": "text/x-gcode", "icon": "icon_ultimaker2", "platform": "Vertex_build_panel.stl", diff --git a/resources/definitions/vertex_k8400_dual.def.json b/resources/definitions/vertex_k8400_dual.def.json index f6b3d6cfbb..9e24bab5d3 100644 --- a/resources/definitions/vertex_k8400_dual.def.json +++ b/resources/definitions/vertex_k8400_dual.def.json @@ -6,7 +6,6 @@ "metadata": { "visible": true, "manufacturer": "Velleman", - "category": "Other", "file_formats": "text/x-gcode", "icon": "icon_ultimaker2", "platform": "Vertex_build_panel.stl", diff --git a/resources/definitions/zone3d_printer.def.json b/resources/definitions/zone3d_printer.def.json index 1663ffdf2b..a1ed56c7ef 100644 --- a/resources/definitions/zone3d_printer.def.json +++ b/resources/definitions/zone3d_printer.def.json @@ -7,7 +7,6 @@ "visible": true, "author": "Ultimaker", "manufacturer": "Unknown", - "category": "Other", "file_formats": "text/x-gcode", "platform_offset": [ 0, 0, 0] }, diff --git a/resources/qml/Menus/MaterialMenu.qml b/resources/qml/Menus/MaterialMenu.qml index 9127276f3d..e167e65855 100644 --- a/resources/qml/Menus/MaterialMenu.qml +++ b/resources/qml/Menus/MaterialMenu.qml @@ -39,17 +39,20 @@ Menu visible: printerConnected && Cura.MachineManager.printerOutputDevices[0].materialNames.length > extruderIndex onTriggered: { - var material_id = Cura.MachineManager.printerOutputDevices[0].materialIds[extruderIndex]; + var activeExtruderIndex = ExtruderManager.activeExtruderIndex; + ExtruderManager.setActiveExtruderIndex(extruderIndex); + var materialId = Cura.MachineManager.printerOutputDevices[0].materialIds[extruderIndex]; var items = materialsModel.items; // materialsModel.find cannot be used because we need to look inside the metadata property of items for(var i in items) { - if (items[i]["metadata"]["GUID"] == material_id) + if (items[i]["metadata"]["GUID"] == materialId) { Cura.MachineManager.setActiveMaterial(items[i].id); break; } } + ExtruderManager.setActiveExtruderIndex(activeExtruderIndex); } } @@ -64,12 +67,15 @@ Menu MenuItem { text: model.name - checkable: true; - checked: model.id == Cura.MachineManager.activeMaterialId; - exclusiveGroup: group; + checkable: true + checked: model.id == Cura.MachineManager.allActiveMaterialIds[ExtruderManager.extruderIds[extruderIndex]] + exclusiveGroup: group onTriggered: { + var activeExtruderIndex = ExtruderManager.activeExtruderIndex; + ExtruderManager.setActiveExtruderIndex(extruderIndex); Cura.MachineManager.setActiveMaterial(model.id); + ExtruderManager.setActiveExtruderIndex(activeExtruderIndex); } } onObjectAdded: menu.insertItem(index, object) @@ -102,12 +108,15 @@ Menu MenuItem { text: model.name - checkable: true; - checked: model.id == Cura.MachineManager.activeMaterialId; - exclusiveGroup: group; + checkable: true + checked: model.id == Cura.MachineManager.allActiveMaterialIds[ExtruderManager.extruderIds[extruderIndex]] + exclusiveGroup: group onTriggered: { + var activeExtruderIndex = ExtruderManager.activeExtruderIndex; + ExtruderManager.setActiveExtruderIndex(extruderIndex); Cura.MachineManager.setActiveMaterial(model.id); + ExtruderManager.setActiveExtruderIndex(activeExtruderIndex); } } onObjectAdded: brandMaterialsMenu.insertItem(index, object) diff --git a/resources/qml/Menus/NozzleMenu.qml b/resources/qml/Menus/NozzleMenu.qml index a9fffc84ab..ee7ddacf98 100644 --- a/resources/qml/Menus/NozzleMenu.qml +++ b/resources/qml/Menus/NozzleMenu.qml @@ -30,12 +30,15 @@ Menu visible: printerConnected && Cura.MachineManager.printerOutputDevices[0].hotendIds.length > extruderIndex onTriggered: { + var activeExtruderIndex = ExtruderManager.activeExtruderIndex; + ExtruderManager.setActiveExtruderIndex(extruderIndex); var hotendId = Cura.MachineManager.printerOutputDevices[0].hotendIds[extruderIndex]; var itemIndex = nozzleInstantiator.model.find("name", hotendId); if(itemIndex > -1) { - Cura.MachineManager.setActiveVariant(nozzleInstantiator.model.getItem(itemIndex).id) + Cura.MachineManager.setActiveVariant(nozzleInstantiator.model.getItem(itemIndex).id); } + ExtruderManager.setActiveExtruderIndex(activeExtruderIndex); } } @@ -56,11 +59,17 @@ Menu } } MenuItem { - text: model.name; - checkable: true; - checked: model.id == Cura.MachineManager.activeVariantId; + text: model.name + checkable: true + checked: model.id == Cura.MachineManager.allActiveVariantIds[ExtruderManager.extruderIds[extruderIndex]] exclusiveGroup: group - onTriggered: Cura.MachineManager.setActiveVariant(model.id) + onTriggered: + { + var activeExtruderIndex = ExtruderManager.activeExtruderIndex; + ExtruderManager.setActiveExtruderIndex(extruderIndex); + Cura.MachineManager.setActiveVariant(model.id); + ExtruderManager.setActiveExtruderIndex(activeExtruderIndex); + } } onObjectAdded: menu.insertItem(index, object) onObjectRemoved: menu.removeItem(object) diff --git a/resources/qml/Preferences/GeneralPage.qml b/resources/qml/Preferences/GeneralPage.qml index 7c4ad16e10..b35bb6f9ac 100755 --- a/resources/qml/Preferences/GeneralPage.qml +++ b/resources/qml/Preferences/GeneralPage.qml @@ -161,6 +161,12 @@ UM.PreferencesPage append({ text: "Português do Brasil", code: "ptbr" }) append({ text: "Русский", code: "ru" }) append({ text: "Türkçe", code: "tr" }) + + var date_object = new Date(); + if (date_object.getUTCMonth() == 8 && date_object.getUTCDate() == 19) //Only add Pirate on the 19th of September. + { + append({ text: "Pirate", code: "7s" }) + } } } diff --git a/resources/qml/Sidebar.qml b/resources/qml/Sidebar.qml index 54c6d55049..f0b0299653 100755 --- a/resources/qml/Sidebar.qml +++ b/resources/qml/Sidebar.qml @@ -248,6 +248,7 @@ Rectangle width: parent.width * 0.7 + UM.Theme.getSize("sidebar_margin").width height: UM.Theme.getSize("setting_control").height + anchors.left: globalProfileLabel.right anchors.right: parent.right tooltip: Cura.MachineManager.activeQualityName style: UM.Theme.styles.sidebar_header_button diff --git a/resources/qml/SidebarHeader.qml b/resources/qml/SidebarHeader.qml index 1aefc58a38..606e629b45 100644 --- a/resources/qml/SidebarHeader.qml +++ b/resources/qml/SidebarHeader.qml @@ -160,46 +160,6 @@ Column visible: !extruderSelectionRow.visible } - // Print core row - Item - { - id: printCoreRow - height: UM.Theme.getSize("sidebar_setup").height - visible: Cura.MachineManager.hasVariants && !sidebar.monitoringPrint && !sidebar.hideSettings - - anchors - { - left: parent.left - leftMargin: UM.Theme.getSize("sidebar_margin").width - right: parent.right - rightMargin: UM.Theme.getSize("sidebar_margin").width - } - - Text - { - id: printCoreLabel - text: Cura.MachineManager.activeDefinitionVariantsName; - width: parent.width * 0.45 - UM.Theme.getSize("sidebar_margin").width - font: UM.Theme.getFont("default"); - color: UM.Theme.getColor("text"); - } - - ToolButton { - id: printCoreSelection - text: Cura.MachineManager.activeVariantName - tooltip: Cura.MachineManager.activeVariantName; - visible: Cura.MachineManager.hasVariants - - height: UM.Theme.getSize("setting_control").height - width: parent.width * 0.7 + UM.Theme.getSize("sidebar_margin").width - anchors.right: parent.right - style: UM.Theme.styles.sidebar_header_button - activeFocusOnPress: true; - - menu: NozzleMenu { extruderIndex: base.currentExtruderIndex } - } - } - // Material Row Item { @@ -219,7 +179,7 @@ Column { id: materialLabel text: catalog.i18nc("@label","Material"); - width: parent.width * 0.45 - UM.Theme.getSize("sidebar_margin").width + width: parent.width * 0.45 - UM.Theme.getSize("default_margin").width font: UM.Theme.getFont("default"); color: UM.Theme.getColor("text"); } @@ -256,6 +216,46 @@ Column } } + // Print core row + Item + { + id: printCoreRow + height: UM.Theme.getSize("sidebar_setup").height + visible: Cura.MachineManager.hasVariants && !sidebar.monitoringPrint && !sidebar.hideSettings + + anchors + { + left: parent.left + leftMargin: UM.Theme.getSize("sidebar_margin").width + right: parent.right + rightMargin: UM.Theme.getSize("sidebar_margin").width + } + + Text + { + id: printCoreLabel + text: Cura.MachineManager.activeDefinitionVariantsName; + width: parent.width * 0.45 - UM.Theme.getSize("default_margin").width + font: UM.Theme.getFont("default"); + color: UM.Theme.getColor("text"); + } + + ToolButton { + id: printCoreSelection + text: Cura.MachineManager.activeVariantName + tooltip: Cura.MachineManager.activeVariantName; + visible: Cura.MachineManager.hasVariants + + height: UM.Theme.getSize("setting_control").height + width: parent.width * 0.7 + UM.Theme.getSize("sidebar_margin").width + anchors.right: parent.right + style: UM.Theme.styles.sidebar_header_button + activeFocusOnPress: true; + + menu: NozzleMenu { extruderIndex: base.currentExtruderIndex } + } + } + // Material info row Item { diff --git a/resources/qml/Topbar.qml b/resources/qml/Topbar.qml index 83b9145345..a9b17dcf4b 100644 --- a/resources/qml/Topbar.qml +++ b/resources/qml/Topbar.qml @@ -57,8 +57,40 @@ Rectangle id: showMonitor height: UM.Theme.getSize("sidebar_header").height onClicked: base.startMonitoringPrint() - text: catalog.i18nc("@title:tab", "Print") - iconSource: UM.Theme.getIcon("tab_monitor") + text: catalog.i18nc("@title:tab", "Monitor") + iconSource: printerConnected ? UM.Theme.getIcon("tab_monitor_with_status") : UM.Theme.getIcon("tab_monitor") + property color overlayColor: + { + if(!printerAcceptsCommands) + { + return UM.Theme.getColor("status_unknown"); + } + + if(Cura.MachineManager.printerOutputDevices[0].printerState == "maintenance") + { + return UM.Theme.getColor("status_busy"); + } + switch(Cura.MachineManager.printerOutputDevices[0].jobState) + { + case "printing": + case "pre_print": + case "wait_cleanup": + case "pausing": + case "resuming": + return UM.Theme.getColor("status_busy"); + case "ready": + case "": + return UM.Theme.getColor("status_ready"); + case "paused": + return UM.Theme.getColor("status_paused"); + case "error": + return UM.Theme.getColor("status_stopped"); + case "offline": + return UM.Theme.getColor("status_offline"); + default: + return UM.Theme.getColor("text_reversed"); + } + } property string overlayIconSource: { if(!printerConnected) diff --git a/resources/quality/kemiq_q2/kemiq_q2_beta_pla_draft.inst.cfg b/resources/quality/kemiq_q2/kemiq_q2_beta_pla_draft.inst.cfg index 1959c251c2..400c45de94 100644 --- a/resources/quality/kemiq_q2/kemiq_q2_beta_pla_draft.inst.cfg +++ b/resources/quality/kemiq_q2/kemiq_q2_beta_pla_draft.inst.cfg @@ -14,13 +14,7 @@ setting_version = 2 layer_height = 0.35 adhesion_type = skirt -speed_print = 70 -speed_infill = 60 -speed_layer_0 = 20 -speed_wall_0 = 30 -speed_wall_x = 50 -speed_topbottom = 30 -speed_travel = 120 +speed_print = 60 material_print_temperature = 214 material_bed_temperature = 60 diff --git a/resources/quality/kemiq_q2/kemiq_q2_beta_pla_extra_fine.inst.cfg b/resources/quality/kemiq_q2/kemiq_q2_beta_pla_extra_fine.inst.cfg index ea5fc11349..d6fe06a5a3 100644 --- a/resources/quality/kemiq_q2/kemiq_q2_beta_pla_extra_fine.inst.cfg +++ b/resources/quality/kemiq_q2/kemiq_q2_beta_pla_extra_fine.inst.cfg @@ -14,13 +14,7 @@ setting_version = 2 layer_height = 0.06 adhesion_type = skirt -speed_print = 40 -speed_infill = 50 -speed_layer_0 = 15 -speed_wall_0 = 20 -speed_wall_x = 40 -speed_topbottom = 20 -speed_travel = 120 +speed_print = 30 material_print_temperature = 214 material_bed_temperature = 60 diff --git a/resources/quality/kemiq_q2/kemiq_q2_beta_pla_fine.inst.cfg b/resources/quality/kemiq_q2/kemiq_q2_beta_pla_fine.inst.cfg index 1f2d52affc..b23d86c931 100644 --- a/resources/quality/kemiq_q2/kemiq_q2_beta_pla_fine.inst.cfg +++ b/resources/quality/kemiq_q2/kemiq_q2_beta_pla_fine.inst.cfg @@ -14,13 +14,7 @@ setting_version = 2 layer_height = 0.1 adhesion_type = skirt -speed_print = 50 -speed_infill = 60 -speed_layer_0 = 20 -speed_wall_0 = 25 -speed_wall_x = 45 -speed_topbottom = 30 -speed_travel = 120 +speed_print = 40 material_print_temperature = 214 material_bed_temperature = 60 diff --git a/resources/quality/kemiq_q2/kemiq_q2_beta_pla_low.inst.cfg b/resources/quality/kemiq_q2/kemiq_q2_beta_pla_low.inst.cfg index 97dcabd8e5..5065794ac8 100644 --- a/resources/quality/kemiq_q2/kemiq_q2_beta_pla_low.inst.cfg +++ b/resources/quality/kemiq_q2/kemiq_q2_beta_pla_low.inst.cfg @@ -14,13 +14,7 @@ setting_version = 2 layer_height = 0.2 adhesion_type = skirt -speed_print = 70 -speed_infill = 60 -speed_layer_0 = 20 -speed_wall_0 = 30 -speed_wall_x = 50 -speed_topbottom = 30 -speed_travel = 120 +speed_print = 60 material_print_temperature = 214 material_bed_temperature = 60 diff --git a/resources/quality/kemiq_q2/kemiq_q2_beta_pla_normal.inst.cfg b/resources/quality/kemiq_q2/kemiq_q2_beta_pla_normal.inst.cfg index 5ad4183058..a62b7f1254 100644 --- a/resources/quality/kemiq_q2/kemiq_q2_beta_pla_normal.inst.cfg +++ b/resources/quality/kemiq_q2/kemiq_q2_beta_pla_normal.inst.cfg @@ -14,13 +14,7 @@ setting_version = 2 layer_height = 0.15 adhesion_type = skirt -speed_print = 60 -speed_infill = 50 -speed_layer_0 = 15 -speed_wall_0 = 20 -speed_wall_x = 40 -speed_topbottom = 20 -speed_travel = 120 +speed_print = 50 material_print_temperature = 214 material_bed_temperature = 60 diff --git a/resources/quality/kemiq_q2/kemiq_q2_gama_pla_draft.inst.cfg b/resources/quality/kemiq_q2/kemiq_q2_gama_pla_draft.inst.cfg index 537ee829b8..00a7fa6173 100644 --- a/resources/quality/kemiq_q2/kemiq_q2_gama_pla_draft.inst.cfg +++ b/resources/quality/kemiq_q2/kemiq_q2_gama_pla_draft.inst.cfg @@ -12,15 +12,9 @@ setting_version = 2 [values] layer_height = 0.35 -adhesion_type = skirt +adhesion_type = raft -speed_print = 70 -speed_infill = 60 -speed_layer_0 = 20 -speed_wall_0 = 30 -speed_wall_x = 50 -speed_topbottom = 30 -speed_travel = 120 +speed_print = 60 material_print_temperature = 214 material_diameter = 1.75 diff --git a/resources/quality/kemiq_q2/kemiq_q2_gama_pla_low.inst.cfg b/resources/quality/kemiq_q2/kemiq_q2_gama_pla_low.inst.cfg index 6b9fb3acce..aa78035704 100644 --- a/resources/quality/kemiq_q2/kemiq_q2_gama_pla_low.inst.cfg +++ b/resources/quality/kemiq_q2/kemiq_q2_gama_pla_low.inst.cfg @@ -12,15 +12,9 @@ setting_version = 2 [values] layer_height = 0.2 -adhesion_type = skirt +adhesion_type = raft -speed_print = 70 -speed_infill = 60 -speed_layer_0 = 20 -speed_wall_0 = 30 -speed_wall_x = 50 -speed_topbottom = 30 -speed_travel = 120 +speed_print = 60 material_print_temperature = 214 material_diameter = 1.75 diff --git a/resources/shaders/grid.shader b/resources/shaders/grid.shader deleted file mode 100644 index 74eed544fd..0000000000 --- a/resources/shaders/grid.shader +++ /dev/null @@ -1,70 +0,0 @@ -[shaders] -vertex = - uniform highp mat4 u_modelViewProjectionMatrix; - - attribute highp vec4 a_vertex; - attribute lowp vec2 a_uvs; - - varying lowp vec2 v_uvs; - - void main() - { - gl_Position = u_modelViewProjectionMatrix * a_vertex; - v_uvs = a_uvs; - } - -fragment = - uniform lowp vec4 u_gridColor0; - uniform lowp vec4 u_gridColor1; - - varying lowp vec2 v_uvs; - - void main() - { - if (mod(floor(v_uvs.x / 10.0) - floor(v_uvs.y / 10.0), 2.0) < 1.0) - gl_FragColor = u_gridColor0; - else - gl_FragColor = u_gridColor1; - } - -vertex41core = - #version 410 - uniform highp mat4 u_modelViewProjectionMatrix; - - in highp vec4 a_vertex; - in lowp vec2 a_uvs; - - out lowp vec2 v_uvs; - - void main() - { - gl_Position = u_modelViewProjectionMatrix * a_vertex; - v_uvs = a_uvs; - } - -fragment41core = - #version 410 - uniform lowp vec4 u_gridColor0; - uniform lowp vec4 u_gridColor1; - - in lowp vec2 v_uvs; - out vec4 frag_color; - - void main() - { - if (mod(floor(v_uvs.x / 10.0) - floor(v_uvs.y / 10.0), 2.0) < 1.0) - frag_color = u_gridColor0; - else - frag_color = u_gridColor1; - } - -[defaults] -u_gridColor0 = [0.96, 0.96, 0.96, 1.0] -u_gridColor1 = [0.8, 0.8, 0.8, 1.0] - -[bindings] -u_modelViewProjectionMatrix = model_view_projection_matrix - -[attributes] -a_vertex = vertex -a_uvs = uv0 diff --git a/resources/themes/cura/theme.json b/resources/themes/cura/theme.json index f1436a8466..63265cb21e 100644 --- a/resources/themes/cura/theme.json +++ b/resources/themes/cura/theme.json @@ -214,6 +214,8 @@ "volume_outline": [1, 168, 230, 255], "buildplate": [252, 252, 252, 255], "buildplate_alt": [204, 204, 204, 255], + "buildplate_grid": [129, 131, 134, 255], + "buildplate_grid_minor": [129, 131, 134, 31], "convex_hull": [35, 35, 35, 127], "disallowed_area": [0, 0, 0, 52], diff --git a/resources/variants/ultimaker3_bb0.8.inst.cfg b/resources/variants/ultimaker3_bb0.8.inst.cfg index ddb1aa3c7e..8ed7c92511 100644 --- a/resources/variants/ultimaker3_bb0.8.inst.cfg +++ b/resources/variants/ultimaker3_bb0.8.inst.cfg @@ -24,6 +24,7 @@ infill_overlap = 0 infill_pattern = triangles infill_wipe_dist = 0 jerk_enabled = True +jerk_prime_tower = =math.ceil(jerk_print * 2 / 25) jerk_print = 25 jerk_support = =math.ceil(jerk_print * 15 / 25) jerk_support_interface = =math.ceil(jerk_support * 10 / 15) @@ -38,6 +39,7 @@ material_print_temperature = =default_material_print_temperature + 10 material_standby_temperature = 100 multiple_mesh_overlap = 0 prime_tower_enable = False +prime_tower_purge_volume = 1 prime_tower_wipe_enabled = True raft_acceleration = =acceleration_layer_0 raft_airgap = 0 diff --git a/resources/variants/ultimaker3_bb04.inst.cfg b/resources/variants/ultimaker3_bb04.inst.cfg index b5698dea54..a5aa03f1fa 100644 --- a/resources/variants/ultimaker3_bb04.inst.cfg +++ b/resources/variants/ultimaker3_bb04.inst.cfg @@ -14,11 +14,13 @@ acceleration_support_interface = =math.ceil(acceleration_support * 1500 / 2000) acceleration_support_bottom = =math.ceil(acceleration_support_interface * 100 / 1500) cool_fan_speed_max = =cool_fan_speed gradual_support_infill_steps = 2 +jerk_prime_tower = =math.ceil(jerk_print * 2 / 25) jerk_support = =math.ceil(jerk_print * 15 / 25) jerk_support_interface = =math.ceil(jerk_support * 10 / 15) jerk_support_bottom = =math.ceil(jerk_support_interface * 1 / 10) machine_nozzle_heat_up_speed = 1.5 machine_nozzle_id = BB 0.4 +prime_tower_purge_volume = 1 raft_base_speed = 20 raft_interface_speed = 20 raft_speed = 25 diff --git a/resources/variants/ultimaker3_extended_bb0.8.inst.cfg b/resources/variants/ultimaker3_extended_bb0.8.inst.cfg index 55ed280f36..886167f714 100644 --- a/resources/variants/ultimaker3_extended_bb0.8.inst.cfg +++ b/resources/variants/ultimaker3_extended_bb0.8.inst.cfg @@ -24,6 +24,7 @@ infill_overlap = 0 infill_pattern = triangles infill_wipe_dist = 0 jerk_enabled = True +jerk_prime_tower = =math.ceil(jerk_print * 2 / 25) jerk_print = 25 jerk_support = =math.ceil(jerk_print * 15 / 25) jerk_support_interface = =math.ceil(jerk_support * 10 / 15) @@ -38,6 +39,7 @@ material_print_temperature = =default_material_print_temperature + 10 material_standby_temperature = 100 multiple_mesh_overlap = 0 prime_tower_enable = False +prime_tower_purge_volume = 1 prime_tower_wipe_enabled = True raft_acceleration = =acceleration_layer_0 raft_airgap = 0 diff --git a/resources/variants/ultimaker3_extended_bb04.inst.cfg b/resources/variants/ultimaker3_extended_bb04.inst.cfg index 7393b0a24a..eb9eefed0c 100644 --- a/resources/variants/ultimaker3_extended_bb04.inst.cfg +++ b/resources/variants/ultimaker3_extended_bb04.inst.cfg @@ -14,11 +14,13 @@ acceleration_support_interface = =math.ceil(acceleration_support * 1500 / 2000) acceleration_support_bottom = =math.ceil(acceleration_support_interface * 100 / 1500) cool_fan_speed_max = =cool_fan_speed gradual_support_infill_steps = 2 +jerk_prime_tower = =math.ceil(jerk_print * 2 / 25) jerk_support = =math.ceil(jerk_print * 15 / 25) jerk_support_interface = =math.ceil(jerk_support * 10 / 15) jerk_support_bottom = =math.ceil(jerk_support_interface * 1 / 10) machine_nozzle_heat_up_speed = 1.5 machine_nozzle_id = BB 0.4 +prime_tower_purge_volume = 1 raft_base_speed = 20 raft_interface_speed = 20 raft_speed = 25