Merge branch 'master' into PP-129_increase-filter-distance

This commit is contained in:
Casper Lamboo 2022-04-07 13:54:27 +02:00 committed by GitHub
commit c4748ba332
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4394 changed files with 6885 additions and 7954 deletions

5
SECURITY.md Normal file
View File

@ -0,0 +1,5 @@
# Reporting vulnerabilities
If you discover a vulnerability, please let us know as soon as possible via`security@ultimaker.com`.
Please do not take advantage of the vulnerability and do not reveal the problem to others.
To allow us to resolve the issue, please do provide us with sufficient information to reproduce the problem.

View File

@ -1,258 +0,0 @@
# Copyright (c) 2020 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher.
from typing import Optional
from UM.Decorators import deprecated
from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator
from UM.Logger import Logger
from UM.Math.Polygon import Polygon
from UM.Math.Vector import Vector
from UM.Scene.SceneNode import SceneNode
from cura.Arranging.ShapeArray import ShapeArray
from cura.BuildVolume import BuildVolume
from cura.Scene import ZOffsetDecorator
from collections import namedtuple
import numpy
import copy
LocationSuggestion = namedtuple("LocationSuggestion", ["x", "y", "penalty_points", "priority"])
"""Return object for bestSpot"""
class Arrange:
"""
The Arrange classed is used together with :py:class:`cura.Arranging.ShapeArray.ShapeArray`. Use it to find good locations for objects that you try to put
on a build place. Different priority schemes can be defined so it alters the behavior while using the same logic.
.. note::
Make sure the scale is the same between :py:class:`cura.Arranging.ShapeArray.ShapeArray` objects and the :py:class:`cura.Arranging.Arrange.Arrange` instance.
"""
build_volume = None # type: Optional[BuildVolume]
@deprecated("Use the functions in Nest2dArrange instead", "4.8")
def __init__(self, x, y, offset_x, offset_y, scale = 0.5):
self._scale = scale # convert input coordinates to arrange coordinates
world_x, world_y = int(x * self._scale), int(y * self._scale)
self._shape = (world_y, world_x)
self._priority = numpy.zeros((world_y, world_x), dtype=numpy.int32) # beware: these are indexed (y, x)
self._priority_unique_values = []
self._occupied = numpy.zeros((world_y, world_x), dtype=numpy.int32) # beware: these are indexed (y, x)
self._offset_x = int(offset_x * self._scale)
self._offset_y = int(offset_y * self._scale)
self._last_priority = 0
self._is_empty = True
@classmethod
@deprecated("Use the functions in Nest2dArrange instead", "4.8")
def create(cls, scene_root = None, fixed_nodes = None, scale = 0.5, x = 350, y = 250, min_offset = 8) -> "Arrange":
"""Helper to create an :py:class:`cura.Arranging.Arrange.Arrange` instance
Either fill in scene_root and create will find all sliceable nodes by itself, or use fixed_nodes to provide the
nodes yourself.
:param scene_root: Root for finding all scene nodes default = None
:param fixed_nodes: Scene nodes to be placed default = None
:param scale: default = 0.5
:param x: default = 350
:param y: default = 250
:param min_offset: default = 8
"""
arranger = Arrange(x, y, x // 2, y // 2, scale = scale)
arranger.centerFirst()
if fixed_nodes is None:
fixed_nodes = []
for node_ in DepthFirstIterator(scene_root):
# Only count sliceable objects
if node_.callDecoration("isSliceable"):
fixed_nodes.append(node_)
# Place all objects fixed nodes
for fixed_node in fixed_nodes:
vertices = fixed_node.callDecoration("getConvexHullHead") or fixed_node.callDecoration("getConvexHull")
if not vertices:
continue
vertices = vertices.getMinkowskiHull(Polygon.approximatedCircle(min_offset))
points = copy.deepcopy(vertices._points)
# After scaling (like up to 0.1 mm) the node might not have points
if not points.size:
continue
try:
shape_arr = ShapeArray.fromPolygon(points, scale = scale)
except ValueError:
Logger.logException("w", "Unable to create polygon")
continue
arranger.place(0, 0, shape_arr)
# If a build volume was set, add the disallowed areas
if Arrange.build_volume:
disallowed_areas = Arrange.build_volume.getDisallowedAreasNoBrim()
for area in disallowed_areas:
points = copy.deepcopy(area._points)
shape_arr = ShapeArray.fromPolygon(points, scale = scale)
arranger.place(0, 0, shape_arr, update_empty = False)
return arranger
def resetLastPriority(self):
"""This resets the optimization for finding location based on size"""
self._last_priority = 0
@deprecated("Use the functions in Nest2dArrange instead", "4.8")
def findNodePlacement(self, node: SceneNode, offset_shape_arr: ShapeArray, hull_shape_arr: ShapeArray, step = 1) -> bool:
"""Find placement for a node (using offset shape) and place it (using hull shape)
:param node: The node to be placed
:param offset_shape_arr: shape array with offset, for placing the shape
:param hull_shape_arr: shape array without offset, used to find location
:param step: default = 1
:return: the nodes that should be placed
"""
best_spot = self.bestSpot(
hull_shape_arr, start_prio = self._last_priority, step = step)
x, y = best_spot.x, best_spot.y
# Save the last priority.
self._last_priority = best_spot.priority
# Ensure that the object is above the build platform
node.removeDecorator(ZOffsetDecorator.ZOffsetDecorator)
bbox = node.getBoundingBox()
if bbox:
center_y = node.getWorldPosition().y - bbox.bottom
else:
center_y = 0
if x is not None: # We could find a place
node.setPosition(Vector(x, center_y, y))
found_spot = True
self.place(x, y, offset_shape_arr) # place the object in arranger
else:
Logger.log("d", "Could not find spot!")
found_spot = False
node.setPosition(Vector(200, center_y, 100))
return found_spot
def centerFirst(self):
"""Fill priority, center is best. Lower value is better. """
# Square distance: creates a more round shape
self._priority = numpy.fromfunction(
lambda j, i: (self._offset_x - i) ** 2 + (self._offset_y - j) ** 2, self._shape, dtype=numpy.int32)
self._priority_unique_values = numpy.unique(self._priority)
self._priority_unique_values.sort()
def backFirst(self):
"""Fill priority, back is best. Lower value is better """
self._priority = numpy.fromfunction(
lambda j, i: 10 * j + abs(self._offset_x - i), self._shape, dtype=numpy.int32)
self._priority_unique_values = numpy.unique(self._priority)
self._priority_unique_values.sort()
def checkShape(self, x, y, shape_arr) -> Optional[numpy.ndarray]:
"""Return the amount of "penalty points" for polygon, which is the sum of priority
:param x: x-coordinate to check shape
:param y: y-coordinate to check shape
:param shape_arr: the shape array object to place
:return: None if occupied
"""
x = int(self._scale * x)
y = int(self._scale * y)
offset_x = x + self._offset_x + shape_arr.offset_x
offset_y = y + self._offset_y + shape_arr.offset_y
if offset_x < 0 or offset_y < 0:
return None # out of bounds in self._occupied
occupied_x_max = offset_x + shape_arr.arr.shape[1]
occupied_y_max = offset_y + shape_arr.arr.shape[0]
if occupied_x_max > self._occupied.shape[1] + 1 or occupied_y_max > self._occupied.shape[0] + 1:
return None # out of bounds in self._occupied
occupied_slice = self._occupied[
offset_y:occupied_y_max,
offset_x:occupied_x_max]
try:
if numpy.any(occupied_slice[numpy.where(shape_arr.arr == 1)]):
return None
except IndexError: # out of bounds if you try to place an object outside
return None
prio_slice = self._priority[
offset_y:offset_y + shape_arr.arr.shape[0],
offset_x:offset_x + shape_arr.arr.shape[1]]
return numpy.sum(prio_slice[numpy.where(shape_arr.arr == 1)])
def bestSpot(self, shape_arr, start_prio = 0, step = 1) -> LocationSuggestion:
"""Find "best" spot for ShapeArray
:param shape_arr: shape array
:param start_prio: Start with this priority value (and skip the ones before)
:param step: Slicing value, higher = more skips = faster but less accurate
:return: namedtuple with properties x, y, penalty_points, priority.
"""
start_idx_list = numpy.where(self._priority_unique_values == start_prio)
if start_idx_list:
try:
start_idx = start_idx_list[0][0]
except IndexError:
start_idx = 0
else:
start_idx = 0
priority = 0
for priority in self._priority_unique_values[start_idx::step]:
tryout_idx = numpy.where(self._priority == priority)
for idx in range(len(tryout_idx[0])):
x = tryout_idx[1][idx]
y = tryout_idx[0][idx]
projected_x = int((x - self._offset_x) / self._scale)
projected_y = int((y - self._offset_y) / self._scale)
penalty_points = self.checkShape(projected_x, projected_y, shape_arr)
if penalty_points is not None:
return LocationSuggestion(x = projected_x, y = projected_y, penalty_points = penalty_points, priority = priority)
return LocationSuggestion(x = None, y = None, penalty_points = None, priority = priority) # No suitable location found :-(
def place(self, x, y, shape_arr, update_empty = True):
"""Place the object.
Marks the locations in self._occupied and self._priority
:param x:
:param y:
:param shape_arr:
:param update_empty: updates the _is_empty, used when adding disallowed areas
"""
x = int(self._scale * x)
y = int(self._scale * y)
offset_x = x + self._offset_x + shape_arr.offset_x
offset_y = y + self._offset_y + shape_arr.offset_y
shape_y, shape_x = self._occupied.shape
min_x = min(max(offset_x, 0), shape_x - 1)
min_y = min(max(offset_y, 0), shape_y - 1)
max_x = min(max(offset_x + shape_arr.arr.shape[1], 0), shape_x - 1)
max_y = min(max(offset_y + shape_arr.arr.shape[0], 0), shape_y - 1)
occupied_slice = self._occupied[min_y:max_y, min_x:max_x]
# we use a slice of shape because it can be out of bounds
new_occupied = numpy.where(shape_arr.arr[
min_y - offset_y:max_y - offset_y, min_x - offset_x:max_x - offset_x] == 1)
if update_empty and new_occupied:
self._is_empty = False
occupied_slice[new_occupied] = 1
# Set priority to low (= high number), so it won't get picked at trying out.
prio_slice = self._priority[min_y:max_y, min_x:max_x]
prio_slice[new_occupied] = 999
@property
def isEmpty(self):
return self._is_empty

View File

@ -1,154 +0,0 @@
# Copyright (c) 2019 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher.
from UM.Application import Application
from UM.Job import Job
from UM.Scene.SceneNode import SceneNode
from UM.Math.Vector import Vector
from UM.Operations.TranslateOperation import TranslateOperation
from UM.Operations.GroupedOperation import GroupedOperation
from UM.Message import Message
from UM.i18n import i18nCatalog
i18n_catalog = i18nCatalog("cura")
from cura.Scene.ZOffsetDecorator import ZOffsetDecorator
from cura.Arranging.Arrange import Arrange
from cura.Arranging.ShapeArray import ShapeArray
from typing import List
class ArrangeArray:
"""Do arrangements on multiple build plates (aka builtiplexer)"""
def __init__(self, x: int, y: int, fixed_nodes: List[SceneNode]) -> None:
self._x = x
self._y = y
self._fixed_nodes = fixed_nodes
self._count = 0
self._first_empty = None
self._has_empty = False
self._arrange = [] # type: List[Arrange]
def _updateFirstEmpty(self):
for i, a in enumerate(self._arrange):
if a.isEmpty:
self._first_empty = i
self._has_empty = True
return
self._first_empty = None
self._has_empty = False
def add(self):
new_arrange = Arrange.create(x = self._x, y = self._y, fixed_nodes = self._fixed_nodes)
self._arrange.append(new_arrange)
self._count += 1
self._updateFirstEmpty()
def count(self):
return self._count
def get(self, index):
return self._arrange[index]
def getFirstEmpty(self):
if not self._has_empty:
self.add()
return self._arrange[self._first_empty]
class ArrangeObjectsAllBuildPlatesJob(Job):
def __init__(self, nodes: List[SceneNode], min_offset = 8) -> None:
super().__init__()
self._nodes = nodes
self._min_offset = min_offset
def run(self):
status_message = Message(i18n_catalog.i18nc("@info:status", "Finding new location for objects"),
lifetime = 0,
dismissable=False,
progress = 0,
title = i18n_catalog.i18nc("@info:title", "Finding Location"))
status_message.show()
# Collect nodes to be placed
nodes_arr = [] # fill with (size, node, offset_shape_arr, hull_shape_arr)
for node in self._nodes:
offset_shape_arr, hull_shape_arr = ShapeArray.fromNode(node, min_offset = self._min_offset)
nodes_arr.append((offset_shape_arr.arr.shape[0] * offset_shape_arr.arr.shape[1], node, offset_shape_arr, hull_shape_arr))
# Sort the nodes with the biggest area first.
nodes_arr.sort(key=lambda item: item[0])
nodes_arr.reverse()
global_container_stack = Application.getInstance().getGlobalContainerStack()
machine_width = global_container_stack.getProperty("machine_width", "value")
machine_depth = global_container_stack.getProperty("machine_depth", "value")
x, y = machine_width, machine_depth
arrange_array = ArrangeArray(x = x, y = y, fixed_nodes = [])
arrange_array.add()
# Place nodes one at a time
start_priority = 0
grouped_operation = GroupedOperation()
found_solution_for_all = True
left_over_nodes = [] # nodes that do not fit on an empty build plate
for idx, (size, node, offset_shape_arr, hull_shape_arr) in enumerate(nodes_arr):
# For performance reasons, we assume that when a location does not fit,
# it will also not fit for the next object (while what can be untrue).
try_placement = True
current_build_plate_number = 0 # always start with the first one
while try_placement:
# make sure that current_build_plate_number is not going crazy or you'll have a lot of arrange objects
while current_build_plate_number >= arrange_array.count():
arrange_array.add()
arranger = arrange_array.get(current_build_plate_number)
best_spot = arranger.bestSpot(hull_shape_arr, start_prio=start_priority)
x, y = best_spot.x, best_spot.y
node.removeDecorator(ZOffsetDecorator)
if node.getBoundingBox():
center_y = node.getWorldPosition().y - node.getBoundingBox().bottom
else:
center_y = 0
if x is not None: # We could find a place
arranger.place(x, y, offset_shape_arr) # place the object in the arranger
node.callDecoration("setBuildPlateNumber", current_build_plate_number)
grouped_operation.addOperation(TranslateOperation(node, Vector(x, center_y, y), set_position = True))
try_placement = False
else:
# very naive, because we skip to the next build plate if one model doesn't fit.
if arranger.isEmpty:
# apparently we can never place this object
left_over_nodes.append(node)
try_placement = False
else:
# try next build plate
current_build_plate_number += 1
try_placement = True
status_message.setProgress((idx + 1) / len(nodes_arr) * 100)
Job.yieldThread()
for node in left_over_nodes:
node.callDecoration("setBuildPlateNumber", -1) # these are not on any build plate
found_solution_for_all = False
grouped_operation.push()
status_message.hide()
if not found_solution_for_all:
no_full_solution_message = Message(i18n_catalog.i18nc("@info:status",
"Unable to find a location within the build volume for all objects"),
title = i18n_catalog.i18nc("@info:title", "Can't Find Location"),
message_type = Message.MessageType.WARNING)
no_full_solution_message.show()

View File

@ -1113,7 +1113,8 @@ class BuildVolume(SceneNode):
# Use brim width if brim is enabled OR the prime tower has a brim.
if adhesion_type == "brim":
brim_line_count = skirt_brim_stack.getProperty("brim_line_count", "value")
bed_adhesion_size = skirt_brim_line_width * brim_line_count * initial_layer_line_width_factor / 100.0
brim_gap = skirt_brim_stack.getProperty("brim_gap", "value")
bed_adhesion_size = brim_gap + skirt_brim_line_width * brim_line_count * initial_layer_line_width_factor / 100.0
for extruder_stack in used_extruders:
bed_adhesion_size += extruder_stack.getProperty("skirt_brim_line_width", "value") * extruder_stack.getProperty("initial_layer_line_width_factor", "value") / 100.0
@ -1214,7 +1215,7 @@ class BuildVolume(SceneNode):
return max(min(value, max_value), min_value)
_machine_settings = ["machine_width", "machine_depth", "machine_height", "machine_shape", "machine_center_is_zero"]
_skirt_settings = ["adhesion_type", "skirt_gap", "skirt_line_count", "skirt_brim_line_width", "brim_width", "brim_line_count", "raft_margin", "draft_shield_enabled", "draft_shield_dist", "initial_layer_line_width_factor"]
_skirt_settings = ["adhesion_type", "skirt_gap", "skirt_line_count", "skirt_brim_line_width", "brim_gap", "brim_width", "brim_line_count", "raft_margin", "draft_shield_enabled", "draft_shield_dist", "initial_layer_line_width_factor"]
_raft_settings = ["adhesion_type", "raft_base_thickness", "raft_interface_layers", "raft_interface_thickness", "raft_surface_layers", "raft_surface_thickness", "raft_airgap", "layer_0_z_overlap"]
_extra_z_settings = ["retraction_hop_enabled", "retraction_hop"]
_prime_settings = ["extruder_prime_pos_x", "extruder_prime_pos_y", "prime_blob_enable"]

View File

@ -43,7 +43,7 @@ from UM.Scene.Selection import Selection
from UM.Scene.ToolHandle import ToolHandle
from UM.Settings.ContainerRegistry import ContainerRegistry
from UM.Settings.InstanceContainer import InstanceContainer
from UM.Settings.SettingDefinition import SettingDefinition, DefinitionPropertyType
from UM.Settings.SettingDefinition import SettingDefinition, DefinitionPropertyType, toIntConversion
from UM.Settings.SettingFunction import SettingFunction
from UM.Settings.Validator import Validator
from UM.View.SelectionPass import SelectionPass # For typing.
@ -52,8 +52,6 @@ from UM.i18n import i18nCatalog
from cura import ApplicationMetadata
from cura.API import CuraAPI
from cura.API.Account import Account
from cura.Arranging.Arrange import Arrange
from cura.Arranging.ArrangeObjectsAllBuildPlatesJob import ArrangeObjectsAllBuildPlatesJob
from cura.Arranging.ArrangeObjectsJob import ArrangeObjectsJob
from cura.Arranging.Nest2DArrange import arrange
from cura.Machines.MachineErrorChecker import MachineErrorChecker
@ -129,7 +127,7 @@ class CuraApplication(QtApplication):
# SettingVersion represents the set of settings available in the machine/extruder definitions.
# You need to make sure that this version number needs to be increased if there is any non-backwards-compatible
# changes of the settings.
SettingVersion = 19
SettingVersion = 20
Created = False
@ -382,11 +380,12 @@ class CuraApplication(QtApplication):
SettingDefinition.addSupportedProperty("resolve", DefinitionPropertyType.Function, default=None,
depends_on="value")
SettingDefinition.addSettingType("extruder", None, str, Validator)
SettingDefinition.addSettingType("optional_extruder", None, str, None)
SettingDefinition.addSettingType("extruder", None, toIntConversion, Validator)
SettingDefinition.addSettingType("optional_extruder", None, toIntConversion, None)
SettingDefinition.addSettingType("[int]", None, str, None)
def _initializeSettingFunctions(self):
"""Adds custom property types, settings types, and extra operators (functions).
@ -818,9 +817,6 @@ class CuraApplication(QtApplication):
root = self.getController().getScene().getRoot()
self._volume = BuildVolume.BuildVolume(self, root)
# Ensure that the old style arranger still works.
Arrange.build_volume = self._volume
# initialize info objects
self._print_information = PrintInformation.PrintInformation(self)
self._cura_actions = CuraActions.CuraActions(self)
@ -1376,33 +1372,6 @@ class CuraApplication(QtApplication):
op.addOperation(SetTransformOperation(node, Vector(0, center_y, 0), Quaternion(), Vector(1, 1, 1)))
op.push()
@pyqtSlot()
def arrangeObjectsToAllBuildPlates(self) -> None:
"""Arrange all objects."""
nodes_to_arrange = []
for node in DepthFirstIterator(self.getController().getScene().getRoot()):
if not isinstance(node, SceneNode):
continue
if not node.getMeshData() and not node.callDecoration("isGroup"):
continue # Node that doesn't have a mesh and is not a group.
parent_node = node.getParent()
if parent_node and parent_node.callDecoration("isGroup"):
continue # Grouped nodes don't need resetting as their parent (the group) is reset)
if not node.callDecoration("isSliceable") and not node.callDecoration("isGroup"):
continue # i.e. node with layer data
bounding_box = node.getBoundingBox()
# Skip nodes that are too big
if bounding_box is None or bounding_box.width < self._volume.getBoundingBox().width or bounding_box.depth < self._volume.getBoundingBox().depth:
nodes_to_arrange.append(node)
job = ArrangeObjectsAllBuildPlatesJob(nodes_to_arrange)
job.start()
self.getCuraSceneController().setActiveBuildPlate(0) # Select first build plate
# Single build plate
@pyqtSlot()
def arrangeAll(self) -> None:

View File

@ -137,7 +137,9 @@ class PrinterOutputDevice(QObject, OutputDevice):
"""
if self.connectionState != connection_state:
self._connection_state = connection_state
cura.CuraApplication.CuraApplication.getInstance().getGlobalContainerStack().setMetaDataEntry("is_online", self.isConnected())
global_stack = cura.CuraApplication.CuraApplication.getInstance().getGlobalContainerStack()
if global_stack:
global_stack.setMetaDataEntry("is_online", self.isConnected())
self.connectionStateChanged.emit(self._id)
@pyqtProperty(int, constant = True)

View File

@ -1,4 +0,0 @@
import warnings
warnings.warn("Importing cura.PrinterOutput.PrinterOutputModel has been deprecated since 4.1, use cura.PrinterOutput.Models.PrinterOutputModel instead", DeprecationWarning, stacklevel=2)
# We moved the the models to one submodule deeper
from cura.PrinterOutput.Models.PrinterOutputModel import PrinterOutputModel

View File

@ -1,4 +0,0 @@
import warnings
warnings.warn("Importing cura.PrinterOutputDevice has been deprecated since 4.1, use cura.PrinterOutput.PrinterOutputDevice instead", DeprecationWarning, stacklevel=2)
# We moved the PrinterOutput device to it's own submodule.
from cura.PrinterOutput.PrinterOutputDevice import PrinterOutputDevice, ConnectionState

View File

@ -60,16 +60,6 @@ class GlobalStack(CuraContainerStack):
extrudersChanged = pyqtSignal()
configuredConnectionTypesChanged = pyqtSignal()
@pyqtProperty("QVariantMap", notify = extrudersChanged)
@deprecated("Please use extruderList instead.", "4.4")
def extruders(self) -> Dict[str, "ExtruderStack"]:
"""Get the list of extruders of this stack.
:return: The extruders registered with this stack.
"""
return self._extruders
@pyqtProperty("QVariantList", notify = extrudersChanged)
def extruderList(self) -> List["ExtruderStack"]:
result_tuple_list = sorted(list(self._extruders.items()), key=lambda x: int(x[0]))

View File

@ -14,7 +14,7 @@ import time
class CuraSplashScreen(QSplashScreen):
def __init__(self):
super().__init__()
self._scale = 0.7
self._scale = 1
self._version_y_offset = 0 # when extra visual elements are in the background image, move version text down
if ApplicationMetadata.IsAlternateVersion:
@ -69,23 +69,21 @@ class CuraSplashScreen(QSplashScreen):
version = Application.getInstance().getVersion().split("-")
# Draw version text
font = QFont() # Using system-default font here
font.setPixelSize(18)
font = QFont()
font.setPixelSize(24)
painter.setFont(font)
painter.drawText(60, 70 + self._version_y_offset, round(330 * self._scale), round(230 * self._scale), Qt.AlignLeft | Qt.AlignTop, version[0] if not ApplicationMetadata.IsAlternateVersion else ApplicationMetadata.CuraBuildType)
if len(version) > 1:
font.setPixelSize(16)
painter.setFont(font)
painter.setPen(QColor(200, 200, 200, 255))
painter.drawText(247, 105 + self._version_y_offset, round(330 * self._scale), round(255 * self._scale), Qt.AlignLeft | Qt.AlignTop, version[1])
painter.setPen(QColor(255, 255, 255, 255))
if len(version) == 1:
painter.drawText(40, 104 + self._version_y_offset, round(330 * self._scale), round(230 * self._scale), Qt.AlignLeft | Qt.AlignTop, version[0] if not ApplicationMetadata.IsAlternateVersion else ApplicationMetadata.CuraBuildType)
elif len(version) > 1:
painter.drawText(40, 104 + self._version_y_offset, round(330 * self._scale), round(230 * self._scale), Qt.AlignLeft | Qt.AlignTop, version[0] +" "+ version[1] if not ApplicationMetadata.IsAlternateVersion else ApplicationMetadata.CuraBuildType)
# Draw the loading image
pen = QPen()
pen.setWidthF(6 * self._scale)
pen.setColor(QColor(32, 166, 219, 255))
pen.setWidthF(2 * self._scale)
pen.setColor(QColor(255, 255, 255, 255))
painter.setPen(pen)
painter.drawArc(60, 150, round(32 * self._scale), round(32 * self._scale), round(self._loading_image_rotation_angle * 16), 300 * 16)
painter.drawArc(38, 324, round(20 * self._scale), round(20 * self._scale), round(self._loading_image_rotation_angle * 16), 300 * 16)
# Draw message text
if self._current_message:
@ -95,7 +93,7 @@ class CuraSplashScreen(QSplashScreen):
pen.setColor(QColor(255, 255, 255, 255))
painter.setPen(pen)
painter.setFont(font)
painter.drawText(100, 128, 170, 64,
painter.drawText(70, 320, 170, 24,
Qt.AlignLeft | Qt.AlignVCenter | Qt.TextWordWrap,
self._current_message)

View File

@ -17,8 +17,7 @@ UM.Dialog
minimumWidth: UM.Theme.getSize("popup_dialog").width
minimumHeight: UM.Theme.getSize("popup_dialog").height
width: minimumWidth
height: Math.max(dialogSummaryItem.height + 2 * buttonsItem.height, minimumHeight) // 2 * button height to also have some extra space around the button relative to the button size
property int comboboxHeight: UM.Theme.getSize("default_margin").height
onClosing: manager.notifyClosed()
@ -67,7 +66,7 @@ UM.Dialog
Column
{
width: parent.width
height: cildrenRect.height
height: childrenRect.height
UM.Label
{
@ -149,7 +148,7 @@ UM.Dialog
Column
{
width: parent.width
height: cildrenRect.height
height: childrenRect.height
UM.Label
{
@ -225,7 +224,7 @@ UM.Dialog
Column
{
width: parent.width
height: cildrenRect.height
height: childrenRect.height
UM.Label
{
@ -341,7 +340,7 @@ UM.Dialog
Column
{
width: parent.width
height: cildrenRect.height
height: childrenRect.height
Row
{
height: childrenRect.height
@ -382,7 +381,7 @@ UM.Dialog
Column
{
width: parent.width
height: cildrenRect.height
height: childrenRect.height
UM.Label
{

View File

@ -67,11 +67,17 @@ Item
}
text: PrintInformation.jobName
font: UM.Theme.getFont("medium")
font: fontMetrics.font
height: fontMetrics.height + 2 * UM.Theme.getSize("thin_margin").height
placeholderText: "Enter the name of the file."
onAccepted: { if (saveButton.enabled) {saveButton.clicked()}}
}
FontMetrics
{
id: fontMetrics
font: UM.Theme.getFont("medium")
}
Rectangle
{

View File

@ -1,4 +1,4 @@
# Copyright (c) 2021 Ultimaker B.V.
# Copyright (c) 2022 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher.
import math
@ -31,6 +31,8 @@ Position = NamedTuple("Position", [("x", float), ("y", float), ("z", float), ("f
class FlavorParser:
"""This parser is intended to interpret the common firmware codes among all the different flavors"""
MAX_EXTRUDER_COUNT = 16
def __init__(self) -> None:
CuraApplication.getInstance().hideMessageSignal.connect(self._onHideMessage)
self._cancelled = False
@ -53,7 +55,7 @@ class FlavorParser:
def _clearValues(self) -> None:
self._extruder_number = 0
self._extrusion_length_offset = [0] * 8 # type: List[float]
self._extrusion_length_offset = [0] * self.MAX_EXTRUDER_COUNT # type: List[float]
self._layer_type = LayerPolygon.Inset0Type
self._layer_number = 0
self._previous_z = 0 # type: float
@ -355,7 +357,7 @@ class FlavorParser:
Logger.log("d", "Parsing g-code...")
current_position = Position(0, 0, 0, 0, [0] * 8)
current_position = Position(0, 0, 0, 0, [0] * self.MAX_EXTRUDER_COUNT)
current_path = [] #type: List[List[float]]
min_layer_number = 0
negative_layers = 0

View File

@ -31,8 +31,11 @@ class Marketplace(Extension, QObject):
# Not entirely the cleanest code, since the localPackage list also checks the server if there are updates
# Since that in turn will trigger notifications to be shown, we do need to construct it here and make sure
# that it checks for updates...
preferences = CuraApplication.getInstance().getPreferences()
preferences.addPreference("info/automatic_plugin_update_check", True)
self._local_package_list = LocalPackageList(self)
self._local_package_list.checkForUpdates(self._package_manager.local_packages)
if preferences.getValue("info/automatic_plugin_update_check"):
self._local_package_list.checkForUpdates(self._package_manager.local_packages)
self._package_manager.installedPackagesChanged.connect(self.checkIfRestartNeeded)

View File

@ -4,62 +4,21 @@
import QtQuick 2.2
import QtQuick.Controls 2.1
import Cura 1.5 as Cura
import UM 1.5 as UM
import Cura 1.0 as Cura
import ".."
Button {
Cura.CategoryButton
{
id: base;
background: Rectangle {
color: UM.Theme.getColor("category_background")
}
contentItem: Row
{
spacing: UM.Theme.getSize("default_lining").width
Item //Wrapper to give space before icon with fixed width. This allows aligning checkbox with category icon.
{
height: label.height
width: height
anchors.verticalCenter: parent.verticalCenter
UM.RecolorImage
{
anchors.verticalCenter: parent.verticalCenter
height: (label.height / 2) | 0
width: height
source: base.checked ? UM.Theme.getIcon("ChevronSingleDown") : UM.Theme.getIcon("ChevronSingleRight")
color: base.hovered ? UM.Theme.getColor("primary_button_hover"): UM.Theme.getColor("text")
}
}
UM.RecolorImage
{
anchors.verticalCenter: parent.verticalCenter
height: label.height
width: height
source: UM.Theme.getIcon(definition.icon)
color: base.hovered ? UM.Theme.getColor("primary_button_hover") : UM.Theme.getColor("text")
}
UM.Label
{
id: label
anchors.verticalCenter: parent.verticalCenter
text: base.text
color: base.hovered ? UM.Theme.getColor("primary_button_hover") : UM.Theme.getColor("text")
font.bold: true
}
}
categoryIcon: definition ? UM.Theme.getIcon(definition.icon) : ""
labelText: definition ? definition.label : ""
expanded: definition ? definition.expanded : false
signal showTooltip(string text)
signal hideTooltip()
signal contextMenuRequested()
text: definition.label
checkable: true
checked: definition.expanded
onClicked: definition.expanded ? settingDefinitionsModel.collapseRecursive(definition.key) : settingDefinitionsModel.expandRecursive(definition.key)
onClicked: expanded ? settingDefinitionsModel.collapseRecursive(definition.key) : settingDefinitionsModel.expandRecursive(definition.key)
}

View File

@ -10,25 +10,15 @@ import Cura 1.0 as Cura
UM.TooltipArea
{
x: model.depth * UM.Theme.getSize("default_margin").width
x: model.depth * UM.Theme.getSize("narrow_margin").width
text: model.description
width: childrenRect.width
height: childrenRect.height
Item
{
id: spacer
// Align checkbox with PerObjectCategory icon
width: UM.Theme.getSize("default_margin").width
}
UM.CheckBox
{
id: check
anchors.left: spacer.right
text: definition.label
checked: addedSettingsModel.getVisible(model.key)

View File

@ -187,7 +187,7 @@ Item
// It kinda looks ugly otherwise (big panel, no content on it)
id: currentSettings
property int maximumHeight: 200 * screenScaleFactor
height: Math.min(contents.count * (UM.Theme.getSize("section").height + UM.Theme.getSize("default_lining").height), maximumHeight)
height: Math.min(contents.count * (UM.Theme.getSize("section").height + UM.Theme.getSize("narrow_margin").height + UM.Theme.getSize("default_lining").height), maximumHeight)
visible: currentMeshType != "anti_overhang_mesh"
ListView
@ -245,7 +245,7 @@ Item
{
id: settingLoader
width: UM.Theme.getSize("setting").width
height: UM.Theme.getSize("section").height
height: UM.Theme.getSize("section").height + UM.Theme.getSize("narrow_margin").height
enabled: provider.properties.enabled === "True"
property var definition: model
property var settingDefinitionsModel: addedSettingsModel

View File

@ -12,6 +12,8 @@ UM.Dialog
{
id: settingPickDialog
margin: UM.Theme.getSize("default_margin").width
title: catalog.i18nc("@title:window", "Select Settings to Customize for this model")
width: UM.Theme.getSize("small_popup_dialog").width
backgroundColor: UM.Theme.getColor("background_1")

View File

@ -298,7 +298,7 @@ class ChangeAtZ(Script):
},
"caz_change_retract": {
"label": "Change Retraction",
"description": "Indicates you would like to modify retraction properties.",
"description": "Indicates you would like to modify retraction properties. Does not work when using relative extrusion.",
"type": "bool",
"default_value": false
},

View File

@ -21,7 +21,10 @@ Component
Cura.PrintMonitor
{
anchors.fill: parent
anchors.top: parent.top
anchors.left: parent.left
anchors.right: parent.right
anchors.bottom: footerSeparator.top
}
Rectangle

View File

@ -1,4 +1,4 @@
# Copyright (c) 2021 Ultimaker B.V.
# Copyright (c) 2022 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher.
import configparser
@ -11,14 +11,19 @@ _removed_settings = {
"travel_compensate_overlapping_walls_0_enabled",
"travel_compensate_overlapping_walls_x_enabled",
"fill_perimeter_gaps",
"filter_out_tiny_gaps",
"wall_min_flow",
"wall_min_flow_retract",
"speed_equalize_flow_enabled",
"speed_equalize_flow_min"
"speed_equalize_flow_max"
}
_transformed_settings = { # These settings have been changed to a new topic, but may have different data type. Used only for setting visibility; the rest is handled separately.
"outer_inset_first": "inset_direction",
"speed_equalize_flow_enabled": "speed_equalize_flow_width_factor"
}
class VersionUpgrade49to50(VersionUpgrade):
class VersionUpgrade413to50(VersionUpgrade):
def upgradePreferences(self, serialized: str, filename: str) -> Tuple[List[str], List[str]]:
"""
Upgrades preferences to remove from the visibility list the settings that were removed in this version.
@ -34,7 +39,7 @@ class VersionUpgrade49to50(VersionUpgrade):
parser.read_string(serialized)
# Update version number.
parser["metadata"]["setting_version"] = "18"
parser["metadata"]["setting_version"] = "20"
# Remove deleted settings from the visible settings list.
if "general" in parser and "visible_settings" in parser["general"]:
@ -43,10 +48,11 @@ class VersionUpgrade49to50(VersionUpgrade):
if removed in visible_settings:
visible_settings.remove(removed)
# Replace Outer Before Inner Walls with equivalent.
if "outer_inset_first" in visible_settings:
visible_settings.remove("outer_inset_first")
visible_settings.add("inset_direction")
# Replace equivalent settings that have been transformed.
for old, new in _transformed_settings.items():
if old in visible_settings:
visible_settings.remove(old)
visible_settings.add(new)
parser["general"]["visible_settings"] = ";".join(visible_settings)
@ -71,7 +77,7 @@ class VersionUpgrade49to50(VersionUpgrade):
parser.read_string(serialized)
# Update version number.
parser["metadata"]["setting_version"] = "18"
parser["metadata"]["setting_version"] = "20"
if "values" in parser:
# Remove deleted settings from the instance containers.
@ -86,9 +92,12 @@ class VersionUpgrade49to50(VersionUpgrade):
old_value = old_value[1:]
parser["values"]["inset_direction"] = f"='outside_in' if ({old_value}) else 'inside_out'" # Makes it work both with plain setting values and formulas.
# Disable Fuzzy Skin as it doesn't work with with the libArachne walls
if "magic_fuzzy_skin_enabled" in parser["values"]:
parser["values"]["magic_fuzzy_skin_enabled"] = "False"
# Replace Equalize Filament Flow with equivalent setting.
if "speed_equalize_flow_enabled" in parser["values"]:
old_value = parser["values"]["speed_equalize_flow_enabled"]
if old_value.startswith("="): # Was already a formula.
old_value = old_value[1:]
parser["values"]["speed_equalize_flow_width_factor"] = f"=100 if ({old_value}) else 0" # If it used to be enabled, set it to 100%. Otherwise 0%.
result = io.StringIO()
parser.write(result)
@ -110,8 +119,7 @@ class VersionUpgrade49to50(VersionUpgrade):
if "metadata" not in parser:
parser["metadata"] = {}
parser["general"]["version"] = "5"
parser["metadata"]["setting_version"] = "18"
parser["metadata"]["setting_version"] = "20"
result = io.StringIO()
parser.write(result)

View File

@ -1,28 +1,26 @@
# Copyright (c) 2020 Ultimaker B.V.
# Copyright (c) 2022 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher.
from typing import Any, Dict, TYPE_CHECKING
from . import VersionUpgrade49to50
from . import VersionUpgrade413to50
if TYPE_CHECKING:
from UM.Application import Application
upgrade = VersionUpgrade49to50.VersionUpgrade49to50()
upgrade = VersionUpgrade413to50.VersionUpgrade413to50()
def getMetaData() -> Dict[str, Any]:
return { # Since there is no VersionUpgrade from 48 to 49 yet, upgrade the 48 profiles to 50.
return {
"version_upgrade": {
# From To Upgrade function
("preferences", 6000016): ("preferences", 6000018, upgrade.upgradePreferences),
("machine_stack", 5000016): ("machine_stack", 5000018, upgrade.upgradeStack),
("extruder_train", 5000016): ("extruder_train", 5000018, upgrade.upgradeStack),
("machine_stack", 4000018): ("machine_stack", 5000018, upgrade.upgradeStack), # We made a mistake in the arachne beta 1
("extruder_train", 4000018): ("extruder_train", 5000018, upgrade.upgradeStack), # We made a mistake in the arachne beta 1
("definition_changes", 4000016): ("definition_changes", 4000018, upgrade.upgradeInstanceContainer),
("quality_changes", 4000016): ("quality_changes", 4000018, upgrade.upgradeInstanceContainer),
("quality", 4000016): ("quality", 4000018, upgrade.upgradeInstanceContainer),
("user", 4000016): ("user", 4000018, upgrade.upgradeInstanceContainer),
("preferences", 7000019): ("preferences", 7000020, upgrade.upgradePreferences),
("machine_stack", 5000019): ("machine_stack", 5000020, upgrade.upgradeStack),
("extruder_train", 5000019): ("extruder_train", 5000020, upgrade.upgradeStack),
("definition_changes", 4000019): ("definition_changes", 4000020, upgrade.upgradeInstanceContainer),
("quality_changes", 4000019): ("quality_changes", 4000020, upgrade.upgradeInstanceContainer),
("quality", 4000019): ("quality", 4000020, upgrade.upgradeInstanceContainer),
("user", 4000019): ("user", 4000020, upgrade.upgradeInstanceContainer),
},
"sources": {
"preferences": {

View File

@ -0,0 +1,8 @@
{
"name": "Version Upgrade 4.13 to 5.0",
"author": "Ultimaker B.V.",
"version": "1.0.0",
"description": "Upgrades configurations from Cura 4.13 to Cura 5.0.",
"api": "7.9.0",
"i18n-catalog": "cura"
}

View File

@ -1,8 +0,0 @@
{
"name": "Version Upgrade 4.9 to 5.0",
"author": "Ultimaker B.V.",
"version": "1.0.0",
"description": "Upgrades configurations from Cura 4.9 to Cura 5.0.",
"api": "7.4.0",
"i18n-catalog": "cura"
}

View File

@ -6,7 +6,7 @@
"type": "extruder",
"author": "Ultimaker",
"manufacturer": "Unknown",
"setting_version": 19,
"setting_version": 20,
"visible": false,
"position": "0"
},

View File

@ -6,7 +6,7 @@
"type": "machine",
"author": "Unknown",
"manufacturer": "Unknown",
"setting_version": 19,
"setting_version": 20,
"file_formats": "text/x-gcode;model/stl;application/x-wavefront-obj;application/x3g",
"visible": false,
"has_materials": true,
@ -758,6 +758,16 @@
"default_value": 10.0,
"settable_per_mesh": false,
"settable_per_extruder": true
},
"machine_scale_fan_speed_zero_to_one":
{
"label": "Scale Fan Speed To 0-1",
"description": "Scale the fan speed to be between 0 and 1 instead of between 0 and 256.",
"type": "bool",
"default_value": false,
"settable_per_mesh": false,
"settable_per_extruder": false,
"settable_per_meshgroup": false
}
}
},
@ -1078,52 +1088,6 @@
}
}
},
"beading_strategy_type":
{
"label": "Variable Line Strategy",
"description": "Strategy to use to print the width of a part with a number of walls. This determines how many walls it will use for a certain total width, and how wide each of these lines are. \"Center Deviation\" will print all walls at the nominal line width except the central one(s), causing big variations in the center but very consistent outsides. \"Distributed\" distributes the width equally over all walls. \"Inward Distributed\" is a balance between the other two, distributing the changes in width over all walls but keeping the walls on the outside slightly more consistent.",
"type": "enum",
"options":
{
"center_deviation": "Center Deviation",
"distributed": "Distributed",
"inward_distributed": "Inward Distributed"
},
"default_value": "inward_distributed",
"limit_to_extruder": "wall_0_extruder_nr"
},
"wall_transition_threshold": {
"label": "Middle Line Threshold",
"description": "The smallest line width, as a factor of the normal line width, below which it will choose to use fewer, but wider lines to fill the available space the wall needs to occupy. Reduce this setting to use more, thinner lines. Increase to use fewer, wider lines. Note that this applies -as if- the entire shape should be filled with wall, so the middle here refers to the middle of the object between two outer edges of the shape, even if there actually is fill or (other) skin in the print instead of wall.",
"type": "float",
"unit": "%",
"default_value": 90,
"minimum_value": "1",
"maximum_value": "99",
"children":
{
"wall_split_middle_threshold": {
"label": "Split Middle Line Threshold",
"description": "The smallest line width, as a factor of the normal line width, above which the middle line (if there is one) will be split into two. Reduce this setting to use more, thinner lines. Increase to use fewer, wider lines. Note that this applies -as if- the entire shape should be filled with wall, so the middle here refers to the middle of the object between two outer edges of the shape, even if there actually is fill or (other) skin in the print instead of wall.",
"type": "float",
"unit": "%",
"default_value": 90,
"value": "wall_transition_threshold",
"minimum_value": "1",
"maximum_value": "99"
},
"wall_add_middle_threshold": {
"label": "Add Middle Line Threshold",
"description": "The smallest line width, as a factor of the normal line width, above which a middle line (if there wasn't one already) will be added. Reduce this setting to use more, thinner lines. Increase to use fewer, wider lines. Note that this applies -as if- the entire shape should be filled with wall, so the middle here refers to the middle of the object between two outer edges of the shape, even if there actually is fill or (other) skin in the print instead of wall.",
"type": "float",
"unit": "%",
"default_value": 80,
"value": "wall_transition_threshold * 8 / 9",
"minimum_value": "1",
"maximum_value": "99"
}
}
},
"wall_transition_length":
{
"label": "Wall Transition Length",
@ -1144,13 +1108,12 @@
"type": "int",
"maximum_value": "999999",
"default_value": 1,
"minimum_value": "1",
"enabled": "beading_strategy_type == 'inward_distributed'"
"minimum_value": "1"
},
"wall_transition_angle":
{
"label": "Wall Transition Angle",
"description": "When transitioning between different numbers of walls as the part becomes thinner, two adjacent walls will join together at this angle. This can make the walls come together faster than what the Wall Transition Length indicates, filling the space better.",
"label": "Wall Transitioning Threshold Angle",
"description": "When to create transitions between even and odd numbers of walls. A wedge shape with an angle greater than this setting will not have transitions and no walls will be printed in the center to fill the remaining space. Reducing this setting reduces the number and length of these center walls, but may leave gaps or overextrude.",
"type": "float",
"unit": "°",
"default_value": 10,
@ -1161,16 +1124,29 @@
},
"wall_transition_filter_distance":
{
"label": "Wall Transition Distance Filter",
"label": "Wall Transitioning Filter Distance",
"description": "If it would be transitioning back and forth between different numbers of walls in quick succession, don't transition at all. Remove transitions if they are closer together than this distance.",
"type": "float",
"unit": "mm",
"default_value": 100,
"value": "100",
"enabled": false,
"default_value": 100,
"minimum_value": "wall_transition_length",
"minimum_value_warning": "math.cos(wall_transition_angle / 180 * math.pi) * wall_line_width_x",
"maximum_value": "999999"
},
"wall_transition_filter_deviation":
{
"label": "Wall Transitioning Filter Margin",
"description": "Prevent transitioning back and forth between one extra wall and one less. This margin extends the range of line widths which follow to [Minimum Wall Line Width - Margin, 2 * Minimum Wall Line Width + Margin]. Increasing this margin reduces the number of transitions, which reduces the number of extrusion starts/stops and travel time. However, large line width variation can lead to under- or overextrusion problems.",
"type": "float",
"unit": "mm",
"default_value": 0.1,
"value": ".25 * machine_nozzle_size",
"minimum_value": "0",
"minimum_value_warning": ".01",
"maximum_value_warning": "machine_nozzle_size"
},
"wall_0_wipe_dist":
{
"label": "Outer Wall Wipe Distance",
@ -1212,10 +1188,9 @@
"type": "enum",
"options": {
"inside_out": "Inside To Outside",
"outside_in": "Outside To Inside",
"center_last": "Center Last"
"outside_in": "Outside To Inside"
},
"default_value": "center_last",
"default_value": "outside_in",
"settable_per_mesh": true
},
"alternate_extra_perimeter":
@ -1227,14 +1202,70 @@
"limit_to_extruder": "infill_extruder_nr",
"settable_per_mesh": true
},
"filter_out_tiny_gaps":
"min_wall_line_width":
{
"label": "Filter Out Tiny Gaps",
"description": "Filter out tiny gaps to reduce blobs on outside of model.",
"type": "bool",
"default_value": true,
"limit_to_extruder": "wall_0_extruder_nr",
"settable_per_mesh": true
"label": "Minimum Wall Line Width",
"description": "For thin structures around once or twice the nozzle size, the line widths need to be altered to adhere to the thickness of the model. This setting controls the minimum line width allowed for the walls. The minimum line widths inherently also determine the maximum line widths, since we transition from N to N+1 walls at some geometry thickness where the N walls are wide and the N+1 walls are narrow. The widest possible wall line is twice the Minimum Wall Line Width.",
"unit": "mm",
"minimum_value_warning": ".5 * max(wall_line_width_0, wall_line_width_x)",
"maximum_value_warning": "min(wall_line_width_0, wall_line_width_x)",
"default_value": 0.3,
"value": "machine_nozzle_size * .85",
"type": "float",
"settable_per_mesh": true,
"children":
{
"min_even_wall_line_width":
{
"label": "Minimum Even Wall Line Width",
"description": "The minimum line width for normal polygonal walls. This setting determines at which model thickness we switch from printing a single thin wall line, to printing two wall lines. A higher Minimum Even Wall Line Width leads to a higher maximum odd wall line width. The maximum even wall line width is calculated as Outer Wall Line Width + 0.5 * Minimum Odd Wall Line Width.",
"unit": "mm",
"minimum_value_warning": ".5 * max(wall_line_width_0, wall_line_width_x)",
"maximum_value_warning": "min(wall_line_width_0, wall_line_width_x)",
"default_value": 0.3,
"value": "min_wall_line_width",
"type": "float",
"settable_per_mesh": true,
"children":
{
"wall_split_middle_threshold": {
"label": "Split Middle Line Threshold",
"description": "The smallest line width, as a factor of the normal line width, above which the middle line (if there is one) will be split into two. Reduce this setting to use more, thinner lines. Increase to use fewer, wider lines. Note that this applies -as if- the entire shape should be filled with wall, so the middle here refers to the middle of the object between two outer edges of the shape, even if there actually is fill or (other) skin in the print instead of wall.",
"type": "float",
"unit": "%",
"default_value": 50,
"value": "max(1, min(99, 100 * (2 * min_even_wall_line_width - wall_line_width_0) / wall_line_width_0))",
"minimum_value": "1",
"maximum_value": "99"
}
}
},
"min_odd_wall_line_width":
{
"label": "Minimum Odd Wall Line Width",
"description": "The minimum line width for middle line gap filler polyline walls. This setting determines at which model thickness we switch from printing two wall lines, to printing two outer walls and a single central wall in the middle. A higher Minimum Odd Wall Line Width leads to a higher maximum even wall line width. The maximum odd wall line width is calculated as 2 * Minimum Even Wall Line Width,",
"unit": "mm",
"minimum_value_warning": ".5 * max(wall_line_width_0, wall_line_width_x)",
"maximum_value_warning": "min(wall_line_width_0, wall_line_width_x)",
"default_value": 0.3,
"value": "min_wall_line_width",
"type": "float",
"settable_per_mesh": true,
"children":
{
"wall_add_middle_threshold": {
"label": "Add Middle Line Threshold",
"description": "The smallest line width, as a factor of the normal line width, above which a middle line (if there wasn't one already) will be added. Reduce this setting to use more, thinner lines. Increase to use fewer, wider lines. Note that this applies -as if- the entire shape should be filled with wall, so the middle here refers to the middle of the object between two outer edges of the shape, even if there actually is fill or (other) skin in the print instead of wall.",
"type": "float",
"unit": "%",
"default_value": 75,
"value": "max(1, min(99, 100 * min_odd_wall_line_width / wall_line_width_x))",
"minimum_value": "1",
"maximum_value": "99"
}
}
}
}
},
"fill_outline_gaps": {
"label": "Print Thin Walls",
@ -1260,10 +1291,10 @@
},
"min_bead_width":
{
"label": "Minimum Wall Line Width",
"label": "Minimum Thin Wall Line Width",
"description": "Width of the wall that will replace thin features (according to the Minimum Feature Size) of the model. If the Minimum Wall Line Width is thinner than the thickness of the feature, the wall will become as thick as the feature itself.",
"unit": "mm",
"value": "wall_line_width_0 * (100.0 + wall_split_middle_threshold)/200",
"value": "min_wall_line_width",
"default_value": 0.2,
"minimum_value": "0.001",
"minimum_value_warning": "min_feature_size",
@ -1521,7 +1552,7 @@
"default_value": 6,
"maximum_value": "999999",
"type": "int",
"value": "999999 if infill_sparse_density == 100 else math.ceil(round(bottom_thickness / resolveOrValue('layer_height'), 4))",
"value": "999999 if infill_sparse_density == 100 and not magic_spiralize else math.ceil(round(bottom_thickness / resolveOrValue('layer_height'), 4))",
"limit_to_extruder": "top_bottom_extruder_nr",
"settable_per_mesh": true
},
@ -2516,7 +2547,7 @@
"unit": "%",
"type": "float",
"default_value": 100.0,
"enabled": false,
"enabled": true,
"minimum_value": "0.001",
"minimum_value_warning": "100",
"maximum_value_warning": "120",
@ -2532,7 +2563,7 @@
"unit": "%",
"type": "float",
"default_value": 100.0,
"enabled": false,
"enabled": true,
"minimum_value": "0.001",
"minimum_value_warning": "100",
"maximum_value_warning": "120",
@ -2548,7 +2579,7 @@
"unit": "%",
"type": "float",
"default_value": 100.0,
"enabled": false,
"enabled": true,
"minimum_value": "0.001",
"minimum_value_warning": "100",
"maximum_value_warning": "120",
@ -4366,6 +4397,7 @@
"default_value": "0",
"value": "support_extruder_nr",
"enabled": "(support_enable or support_meshes_present) and extruders_enabled_count > 1",
"resolve": "max(extruderValues('support_interface_extruder_nr'))",
"settable_per_mesh": false,
"settable_per_extruder": false,
"children":
@ -4378,6 +4410,7 @@
"default_value": "0",
"value": "support_interface_extruder_nr",
"enabled": "(support_enable or support_meshes_present) and extruders_enabled_count > 1",
"resolve": "max(extruderValues('support_roof_extruder_nr'))",
"settable_per_mesh": false,
"settable_per_extruder": false
},
@ -4389,6 +4422,7 @@
"default_value": "0",
"value": "support_interface_extruder_nr",
"enabled": "(support_enable or support_meshes_present) and extruders_enabled_count > 1",
"resolve": "max(extruderValues('support_bottom_extruder_nr'))",
"settable_per_mesh": false,
"settable_per_extruder": false
}
@ -5421,6 +5455,7 @@
"default_value": "0",
"value": "int(defaultExtruderPosition())",
"enabled": "extruders_enabled_count > 1 and (resolveOrValue('adhesion_type') != 'none' or resolveOrValue('prime_tower_brim_enable'))",
"resolve": "max(extruderValues('adhesion_extruder_nr'))",
"settable_per_mesh": false,
"settable_per_extruder": false,
"children":
@ -5444,6 +5479,7 @@
"default_value": "0",
"value": "adhesion_extruder_nr",
"enabled": "extruders_enabled_count > 1 and resolveOrValue('adhesion_type') == 'raft'",
"resolve": "max(extruderValues('raft_base_extruder_nr'))",
"settable_per_mesh": false,
"settable_per_extruder": false
},
@ -5455,6 +5491,7 @@
"default_value": "0",
"value": "adhesion_extruder_nr",
"enabled": "extruders_enabled_count > 1 and resolveOrValue('adhesion_type') == 'raft'",
"resolve": "max(extruderValues('raft_interface_extruder_nr'))",
"settable_per_mesh": false,
"settable_per_extruder": false
},
@ -5466,6 +5503,7 @@
"default_value": "0",
"value": "adhesion_extruder_nr",
"enabled": "extruders_enabled_count > 1 and resolveOrValue('adhesion_type') == 'raft'",
"resolve": "max(extruderValues('raft_surface_extruder_nr'))",
"settable_per_mesh": false,
"settable_per_extruder": false
}
@ -6411,8 +6449,10 @@
"description": "The maximum extrusion area deviation allowed when removing intermediate points from a straight line. An intermediate point may serve as width-changing point in a long straight line. Therefore, if it is removed, it will cause the line to have a uniform width and, as a result, lose (or gain) a bit of extrusion area. If you increase this you may notice slight under- (or over-) extrusion in between straight parallel walls, as more intermediate width-changing points will be allowed to be removed. Your print will be less accurate, but the g-code will be smaller.",
"type": "float",
"unit": "μm²",
"default_value": 50000,
"default_value": 2000,
"minimum_value": "0",
"minimum_value_warning": "500",
"maximum_value_warning": "50000",
"settable_per_mesh": true
}
}

View File

@ -29,7 +29,7 @@
"default_value": "M104 S{material_print_temperature_layer_0} ;Set Hotend Temperature\nM140 S{material_bed_temperature_layer_0} ;Set Bed Temperature\nG28 ;home\nG90 ;absolute positioning\nG1 X-10 Y-10 F3000 ;Move to corner \nG1 Z0 F1800 ;Go to zero offset\nM109 S{material_print_temperature_layer_0} ;Wait for Hotend Temperature\nM190 S{material_bed_temperature_layer_0} ;Wait for Bed Temperature\nG92 E0 ;Zero set extruder position\nG1 E20 F200 ;Feed filament to clear nozzle\nG92 E0 ;Zero set extruder position"
},
"machine_end_gcode": {
"default_value": "M104 S0 ;Extruder heater off\nM140 S0 ;Heated bed heater off\nG90 ;absolute positioning\nG92 E0 ;Retract the filament\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z{machine_width} E-1 F3000 ;move Z up a bit and retract filament even more\nG1 X0 F3000 ;move X to min endstops, so the head is out of the way\nG1 Y{machine_depth} F3000 ;so the head is out of the way and Plate is moved forward"
"default_value": "M104 S0 ;Extruder heater off\nM140 S0 ;Heated bed heater off\nG90 ;absolute positioning\nG92 E0 ;Retract the filament\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z{machine_height} E-1 F3000 ;move Z up a bit and retract filament even more\nG1 X0 F3000 ;move X to min endstops, so the head is out of the way\nG1 Y{machine_depth} F3000 ;so the head is out of the way and Plate is moved forward"
},
"machine_nozzle_size": {
"default_value": 0.4

View File

@ -47,26 +47,53 @@
"line_width": {
"value": "machine_nozzle_size"
},
"wall_thickness": {
"value": "wall_line_width_0 + wall_line_width_x"
},
"infill_before_walls": {
"value": "False"
},
"infill_material_flow": {
"value": "(1.95-infill_sparse_density / 100 if infill_sparse_density > 95 else 1) * material_flow"
},
"retraction_combing": {
"value": "'no_outer_surfaces'"
},
"roofing_layer_count": {
"value": "0"
},
"roofing_material_flow": {
"value": "material_flow"
},
"skin_material_flow": {
"value": "0.97 * material_flow"
},
"skin_monotonic" : {
"value": true
},
"speed_equalize_flow_width_factor": {
"value": "110.0"
},
"meshfix_maximum_extrusion_area_deviation": {
"value": "50000"
},
"top_layers": {
"value": "math.ceil(round(top_thickness / resolveOrValue('layer_height'), 4))"
},
"bottom_layers": {
"value": "math.ceil(round(bottom_thickness / resolveOrValue('layer_height'), 4))"
},
"xy_offset": {
"value": "-layer_height * 0.1"
},
"meshfix_maximum_resolution": {
"value": "max(speed_wall_0 / 75, 0.5)"
},
"meshfix_maximum_deviation": {
"value": "machine_nozzle_size / 10"
},
"jerk_travel": {
"value": "jerk_print"
},
"acceleration_travel": {
"value": "acceleration_wall"
}
}
}

View File

@ -34,9 +34,6 @@
"layer_height_0": {
"value": "round(machine_nozzle_size / 1.5, 2)"
},
"line_width": {
"value": "machine_nozzle_size"
},
"speed_support": {
"value": "speed_wall_0"
},

View File

@ -60,7 +60,6 @@
"speed_infill": { "value": "speed_print" },
"speed_wall_x": { "value": "speed_wall" },
"layer_height_0": { "value": "round(machine_nozzle_size / 1.5, 2)" },
"line_width": { "value": "machine_nozzle_size" },
"optimize_wall_printing_order": { "value": "True" },
"zig_zaggify_infill": { "value": "gradual_infill_steps == 0" },
"speed_support": { "value": "speed_wall_0" },

View File

@ -111,7 +111,6 @@
"jerk_support_infill": {"minimum_value_warning": 20 },
"jerk_support_interface": { "value": "math.ceil(jerk_print * 5 / 20)"},
"jerk_prime_tower": { "value": "jerk_print", "minimum_value_warning": 20 },
"jerk_travel": {"minimum_value_warning": 20 },
"jerk_layer_0": { "value": "jerk_topbottom", "minimum_value_warning": 20},
"jerk_print_layer_0": {"minimum_value_warning": 20 },
"jerk_travel_layer_0": {"minimum_value_warning": 20 },
@ -166,7 +165,6 @@
"top_bottom_thickness": { "value": "1" },
"travel_avoid_distance": { "value": "3 if extruders_enabled_count > 1 else machine_nozzle_tip_outer_diameter / 2 * 1.5" },
"wall_0_inset": { "value": "0" },
"wall_thickness": { "value": "1" },
"zig_zaggify_infill": { "value": "gradual_infill_steps == 0" }
}
}

View File

@ -103,7 +103,6 @@
"jerk_support_infill": {"minimum_value_warning": 20 },
"jerk_support_interface": { "value": "math.ceil(jerk_print * 5 / 20)"},
"jerk_prime_tower": { "value": "jerk_print", "minimum_value_warning": 20 },
"jerk_travel": {"minimum_value_warning": 20 },
"jerk_layer_0": { "value": "jerk_topbottom", "minimum_value_warning": 20},
"jerk_print_layer_0": {"minimum_value_warning": 20 },
"jerk_travel_layer_0": {"minimum_value_warning": 20 },
@ -159,9 +158,6 @@
"travel_avoid_supports": { "value": "True" },
"travel_avoid_distance": { "value": "3 if extruders_enabled_count > 1 else machine_nozzle_tip_outer_diameter / 2 * 1.5" },
"wall_0_inset": { "value": "0" },
"wall_thickness": { "value": "1" },
"meshfix_maximum_resolution": { "value": "(speed_wall_0 + speed_wall_x) / 60" },
"meshfix_maximum_deviation": { "value": "layer_height / 4" },
"initial_layer_line_width_factor": { "value": "120" },
"zig_zaggify_infill": { "value": "gradual_infill_steps == 0" }
}

View File

@ -105,7 +105,6 @@
"jerk_support_infill": {"minimum_value_warning": 20 },
"jerk_support_interface": { "value": "math.ceil(jerk_print * 5 / 20)"},
"jerk_prime_tower": { "value": "jerk_print", "minimum_value_warning": 20 },
"jerk_travel": {"minimum_value_warning": 20 },
"jerk_layer_0": { "value": "jerk_topbottom", "minimum_value_warning": 20},
"jerk_print_layer_0": {"minimum_value_warning": 20 },
"jerk_travel_layer_0": {"minimum_value_warning": 20 },
@ -161,9 +160,6 @@
"travel_avoid_supports": { "value": "True" },
"travel_avoid_distance": { "value": "3 if extruders_enabled_count > 1 else machine_nozzle_tip_outer_diameter / 2 * 1.5" },
"wall_0_inset": { "value": "0" },
"wall_thickness": { "value": "1" },
"meshfix_maximum_resolution": { "value": "(speed_wall_0 + speed_wall_x) / 60" },
"meshfix_maximum_deviation": { "value": "layer_height / 4" },
"optimize_wall_printing_order": { "value": "True" },
"initial_layer_line_width_factor": { "value": "120" },
"zig_zaggify_infill": { "value": "gradual_infill_steps == 0" },

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 318 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 320 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 317 KiB

View File

@ -4,7 +4,7 @@ name = Accurate
definition = deltacomb_base
[metadata]
setting_version = 19
setting_version = 20
type = intent
quality_type = D010
intent_category = engineering

View File

@ -4,7 +4,7 @@ name = Accurate
definition = deltacomb_base
[metadata]
setting_version = 19
setting_version = 20
type = intent
quality_type = D015
intent_category = engineering

View File

@ -4,7 +4,7 @@ name = Accurate
definition = deltacomb_base
[metadata]
setting_version = 19
setting_version = 20
type = intent
quality_type = D020
intent_category = engineering

View File

@ -4,7 +4,7 @@ name = Quick
definition = deltacomb_base
[metadata]
setting_version = 19
setting_version = 20
type = intent
quality_type = D020
intent_category = quick

View File

@ -4,7 +4,7 @@ name = Quick
definition = deltacomb_base
[metadata]
setting_version = 19
setting_version = 20
type = intent
quality_type = D030
intent_category = quick

View File

@ -4,7 +4,7 @@ name = Accurate
definition = deltacomb_base
[metadata]
setting_version = 19
setting_version = 20
type = intent
quality_type = D010
intent_category = engineering

View File

@ -4,7 +4,7 @@ name = Accurate
definition = deltacomb_base
[metadata]
setting_version = 19
setting_version = 20
type = intent
quality_type = D015
intent_category = engineering

View File

@ -4,7 +4,7 @@ name = Accurate
definition = deltacomb_base
[metadata]
setting_version = 19
setting_version = 20
type = intent
quality_type = D020
intent_category = engineering

View File

@ -4,7 +4,7 @@ name = Quick
definition = deltacomb_base
[metadata]
setting_version = 19
setting_version = 20
type = intent
quality_type = D020
intent_category = quick

View File

@ -4,7 +4,7 @@ name = Quick
definition = deltacomb_base
[metadata]
setting_version = 19
setting_version = 20
type = intent
quality_type = D030
intent_category = quick

View File

@ -4,7 +4,7 @@ name = Accurate
definition = deltacomb_base
[metadata]
setting_version = 19
setting_version = 20
type = intent
quality_type = D010
intent_category = engineering

View File

@ -4,7 +4,7 @@ name = Accurate
definition = deltacomb_base
[metadata]
setting_version = 19
setting_version = 20
type = intent
quality_type = D015
intent_category = engineering

View File

@ -4,7 +4,7 @@ name = Accurate
definition = deltacomb_base
[metadata]
setting_version = 19
setting_version = 20
type = intent
quality_type = D020
intent_category = engineering

View File

@ -4,7 +4,7 @@ name = Quick
definition = deltacomb_base
[metadata]
setting_version = 19
setting_version = 20
type = intent
quality_type = D020
intent_category = quick

View File

@ -4,7 +4,7 @@ name = Quick
definition = deltacomb_base
[metadata]
setting_version = 19
setting_version = 20
type = intent
quality_type = D020
intent_category = quick

View File

@ -4,7 +4,7 @@ name = Quick
definition = deltacomb_base
[metadata]
setting_version = 19
setting_version = 20
type = intent
quality_type = D030
intent_category = quick

View File

@ -4,7 +4,7 @@ name = Accurate
definition = deltacomb_base
[metadata]
setting_version = 19
setting_version = 20
type = intent
quality_type = D010
intent_category = engineering

View File

@ -4,7 +4,7 @@ name = Accurate
definition = deltacomb_base
[metadata]
setting_version = 19
setting_version = 20
type = intent
quality_type = D015
intent_category = engineering

View File

@ -4,7 +4,7 @@ name = Accurate
definition = deltacomb_base
[metadata]
setting_version = 19
setting_version = 20
type = intent
quality_type = D020
intent_category = engineering

View File

@ -4,7 +4,7 @@ name = Quick
definition = deltacomb_base
[metadata]
setting_version = 19
setting_version = 20
type = intent
quality_type = D015
intent_category = quick

View File

@ -4,7 +4,7 @@ name = Quick
definition = deltacomb_base
[metadata]
setting_version = 19
setting_version = 20
type = intent
quality_type = D020
intent_category = quick

View File

@ -4,7 +4,7 @@ name = Quick
definition = deltacomb_base
[metadata]
setting_version = 19
setting_version = 20
type = intent
quality_type = D030
intent_category = quick

View File

@ -4,7 +4,7 @@ name = Accurate
definition = deltacomb_base
[metadata]
setting_version = 19
setting_version = 20
type = intent
quality_type = D010
intent_category = engineering

View File

@ -4,7 +4,7 @@ name = Accurate
definition = deltacomb_base
[metadata]
setting_version = 19
setting_version = 20
type = intent
quality_type = D015
intent_category = engineering

View File

@ -4,7 +4,7 @@ name = Accurate
definition = deltacomb_base
[metadata]
setting_version = 19
setting_version = 20
type = intent
quality_type = D020
intent_category = engineering

View File

@ -4,7 +4,7 @@ name = Quick
definition = deltacomb_base
[metadata]
setting_version = 19
setting_version = 20
type = intent
quality_type = D020
intent_category = quick

View File

@ -4,7 +4,7 @@ name = Quick
definition = deltacomb_base
[metadata]
setting_version = 19
setting_version = 20
type = intent
quality_type = D030
intent_category = quick

View File

@ -4,7 +4,7 @@ name = Accurate
definition = deltacomb_base
[metadata]
setting_version = 19
setting_version = 20
type = intent
quality_type = D010
intent_category = engineering

View File

@ -4,7 +4,7 @@ name = Accurate
definition = deltacomb_base
[metadata]
setting_version = 19
setting_version = 20
type = intent
quality_type = D015
intent_category = engineering

View File

@ -4,7 +4,7 @@ name = Accurate
definition = deltacomb_base
[metadata]
setting_version = 19
setting_version = 20
type = intent
quality_type = D020
intent_category = engineering

View File

@ -4,7 +4,7 @@ name = Quick
definition = deltacomb_base
[metadata]
setting_version = 19
setting_version = 20
type = intent
quality_type = D020
intent_category = quick

View File

@ -4,7 +4,7 @@ name = Quick
definition = deltacomb_base
[metadata]
setting_version = 19
setting_version = 20
type = intent
quality_type = D030
intent_category = quick

View File

@ -4,7 +4,7 @@ name = Quick
definition = liquid
[metadata]
setting_version = 19
setting_version = 20
type = intent
intent_category = quick
quality_type = draft

View File

@ -4,7 +4,7 @@ name = Accurate
definition = liquid
[metadata]
setting_version = 19
setting_version = 20
type = intent
intent_category = engineering
quality_type = fast

View File

@ -4,7 +4,7 @@ name = Visual
definition = liquid
[metadata]
setting_version = 19
setting_version = 20
type = intent
quality_type = fast
intent_category = visual

View File

@ -4,7 +4,7 @@ name = Visual
definition = liquid
[metadata]
setting_version = 19
setting_version = 20
type = intent
quality_type = high
intent_category = visual

View File

@ -4,7 +4,7 @@ name = Accurate
definition = liquid
[metadata]
setting_version = 19
setting_version = 20
type = intent
intent_category = engineering
quality_type = normal

View File

@ -4,7 +4,7 @@ name = Visual
definition = liquid
[metadata]
setting_version = 19
setting_version = 20
type = intent
quality_type = normal
intent_category = visual

View File

@ -4,7 +4,7 @@ name = Accurate
definition = liquid
[metadata]
setting_version = 19
setting_version = 20
type = intent
intent_category = engineering
quality_type = fast

View File

@ -4,7 +4,7 @@ name = Accurate
definition = liquid
[metadata]
setting_version = 19
setting_version = 20
type = intent
intent_category = engineering
quality_type = normal

View File

@ -4,7 +4,7 @@ name = Accurate
definition = liquid
[metadata]
setting_version = 19
setting_version = 20
type = intent
intent_category = engineering
quality_type = fast

View File

@ -4,7 +4,7 @@ name = Accurate
definition = liquid
[metadata]
setting_version = 19
setting_version = 20
type = intent
intent_category = engineering
quality_type = normal

View File

@ -4,7 +4,7 @@ name = Accurate
definition = liquid
[metadata]
setting_version = 19
setting_version = 20
type = intent
intent_category = engineering
quality_type = fast

View File

@ -4,7 +4,7 @@ name = Accurate
definition = liquid
[metadata]
setting_version = 19
setting_version = 20
type = intent
intent_category = engineering
quality_type = normal

View File

@ -4,7 +4,7 @@ name = Quick
definition = liquid
[metadata]
setting_version = 19
setting_version = 20
type = intent
intent_category = quick
quality_type = draft

View File

@ -4,7 +4,7 @@ name = Accurate
definition = liquid
[metadata]
setting_version = 19
setting_version = 20
type = intent
intent_category = engineering
quality_type = fast

View File

@ -4,7 +4,7 @@ name = Visual
definition = liquid
[metadata]
setting_version = 19
setting_version = 20
type = intent
quality_type = fast
intent_category = visual

View File

@ -4,7 +4,7 @@ name = Visual
definition = liquid
[metadata]
setting_version = 19
setting_version = 20
type = intent
quality_type = high
intent_category = visual

View File

@ -4,7 +4,7 @@ name = Accurate
definition = liquid
[metadata]
setting_version = 19
setting_version = 20
type = intent
intent_category = engineering
quality_type = normal

View File

@ -4,7 +4,7 @@ name = Visual
definition = liquid
[metadata]
setting_version = 19
setting_version = 20
type = intent
quality_type = normal
intent_category = visual

View File

@ -4,7 +4,7 @@ name = Quick
definition = liquid
[metadata]
setting_version = 19
setting_version = 20
type = intent
intent_category = quick
quality_type = draft

View File

@ -4,7 +4,7 @@ name = Accurate
definition = liquid
[metadata]
setting_version = 19
setting_version = 20
type = intent
intent_category = engineering
quality_type = fast

View File

@ -4,7 +4,7 @@ name = Visual
definition = liquid
[metadata]
setting_version = 19
setting_version = 20
type = intent
quality_type = fast
intent_category = visual

View File

@ -4,7 +4,7 @@ name = Visual
definition = liquid
[metadata]
setting_version = 19
setting_version = 20
type = intent
quality_type = high
intent_category = visual

View File

@ -4,7 +4,7 @@ name = Accurate
definition = liquid
[metadata]
setting_version = 19
setting_version = 20
type = intent
intent_category = engineering
quality_type = normal

View File

@ -4,7 +4,7 @@ name = Visual
definition = liquid
[metadata]
setting_version = 19
setting_version = 20
type = intent
quality_type = normal
intent_category = visual

View File

@ -4,7 +4,7 @@ name = Quick
definition = ultimaker_s3
[metadata]
setting_version = 19
setting_version = 20
type = intent
intent_category = quick
quality_type = draft
@ -18,8 +18,7 @@ speed_wall = =speed_print
speed_wall_0 = =speed_wall
speed_wall_x = =speed_wall
speed_layer_0 = 20
top_bottom_thickness = =wall_thickness
wall_thickness = =line_width * 2
top_bottom_thickness = 0.8
infill_sparse_density = 15
jerk_print = 30

View File

@ -4,7 +4,7 @@ name = Accurate
definition = ultimaker_s3
[metadata]
setting_version = 19
setting_version = 20
type = intent
intent_category = engineering
quality_type = fast
@ -31,4 +31,3 @@ speed_wall_x = =speed_wall
top_bottom_thickness = =wall_thickness
wall_thickness = =line_width * 3
xy_offset = =-layer_height * 0.2

View File

@ -4,7 +4,7 @@ name = Visual
definition = ultimaker_s3
[metadata]
setting_version = 19
setting_version = 20
type = intent
quality_type = fast
intent_category = visual
@ -13,5 +13,4 @@ variant = AA 0.4
[values]
speed_infill = 50
wall_thickness = =wall_line_width * 3
top_bottom_thickness = =wall_thickness
top_bottom_thickness = 1.05

View File

@ -4,7 +4,7 @@ name = Visual
definition = ultimaker_s3
[metadata]
setting_version = 19
setting_version = 20
type = intent
quality_type = high
intent_category = visual
@ -13,5 +13,4 @@ variant = AA 0.4
[values]
speed_infill = 50
wall_thickness = =wall_line_width * 3
top_bottom_thickness = =wall_thickness
top_bottom_thickness = 1.05

View File

@ -4,7 +4,7 @@ name = Accurate
definition = ultimaker_s3
[metadata]
setting_version = 19
setting_version = 20
type = intent
intent_category = engineering
quality_type = normal
@ -31,4 +31,3 @@ speed_wall_x = =speed_wall
top_bottom_thickness = =wall_thickness
wall_thickness = =line_width * 3
xy_offset = =-layer_height * 0.2

View File

@ -4,7 +4,7 @@ name = Visual
definition = ultimaker_s3
[metadata]
setting_version = 19
setting_version = 20
type = intent
quality_type = normal
intent_category = visual
@ -13,5 +13,4 @@ variant = AA 0.4
[values]
speed_infill = 50
wall_thickness = =wall_line_width * 3
top_bottom_thickness = =wall_thickness
top_bottom_thickness = 1.05

View File

@ -1,35 +1,34 @@
[general]
version = 4
name = Accurate
definition = ultimaker_s3
[metadata]
setting_version = 19
type = intent
intent_category = engineering
quality_type = fast
material = generic_cpe_plus
variant = AA 0.4
[values]
jerk_print = 30
jerk_infill = =jerk_print
jerk_topbottom = =jerk_print
jerk_wall = =jerk_print
jerk_wall_0 = =jerk_wall
jerk_wall_x = =jerk_wall
jerk_layer_0 = 5
speed_print = 30
speed_infill = =speed_print
speed_layer_0 = 20
speed_topbottom = =speed_print
speed_wall = =speed_print
speed_wall_0 = =speed_wall
speed_wall_x = =speed_wall
top_bottom_thickness = =wall_thickness
wall_thickness = =line_width * 3
xy_offset = =-layer_height * 0.2
[general]
version = 4
name = Accurate
definition = ultimaker_s3
[metadata]
setting_version = 20
type = intent
intent_category = engineering
quality_type = fast
material = generic_cpe_plus
variant = AA 0.4
[values]
jerk_print = 30
jerk_infill = =jerk_print
jerk_topbottom = =jerk_print
jerk_wall = =jerk_print
jerk_wall_0 = =jerk_wall
jerk_wall_x = =jerk_wall
jerk_layer_0 = 5
speed_print = 30
speed_infill = =speed_print
speed_layer_0 = 20
speed_topbottom = =speed_print
speed_wall = =speed_print
speed_wall_0 = =speed_wall
speed_wall_x = =speed_wall
top_bottom_thickness = =wall_thickness
wall_thickness = =line_width * 3

View File

@ -1,35 +1,34 @@
[general]
version = 4
name = Accurate
definition = ultimaker_s3
[metadata]
setting_version = 19
type = intent
intent_category = engineering
quality_type = normal
material = generic_cpe_plus
variant = AA 0.4
[values]
jerk_print = 30
jerk_infill = =jerk_print
jerk_topbottom = =jerk_print
jerk_wall = =jerk_print
jerk_wall_0 = =jerk_wall
jerk_wall_x = =jerk_wall
jerk_layer_0 = 5
speed_print = 30
speed_infill = =speed_print
speed_layer_0 = 20
speed_topbottom = =speed_print
speed_wall = =speed_print
speed_wall_0 = =speed_wall
speed_wall_x = =speed_wall
top_bottom_thickness = =wall_thickness
wall_thickness = =line_width * 3
xy_offset = =-layer_height * 0.2
[general]
version = 4
name = Accurate
definition = ultimaker_s3
[metadata]
setting_version = 20
type = intent
intent_category = engineering
quality_type = normal
material = generic_cpe_plus
variant = AA 0.4
[values]
jerk_print = 30
jerk_infill = =jerk_print
jerk_topbottom = =jerk_print
jerk_wall = =jerk_print
jerk_wall_0 = =jerk_wall
jerk_wall_x = =jerk_wall
jerk_layer_0 = 5
speed_print = 30
speed_infill = =speed_print
speed_layer_0 = 20
speed_topbottom = =speed_print
speed_wall = =speed_print
speed_wall_0 = =speed_wall
speed_wall_x = =speed_wall
top_bottom_thickness = =wall_thickness
wall_thickness = =line_width * 3

Some files were not shown because too many files have changed in this diff Show More