Merge remote-tracking branch 'origin/main' into optimized-prime-tower

This commit is contained in:
Erwan MATHIEU 2024-01-17 13:01:41 +01:00
commit 8d0329f284
87 changed files with 375 additions and 160 deletions

View File

@ -6,7 +6,6 @@ requirements:
- "fdm_materials/(latest)@ultimaker/testing" - "fdm_materials/(latest)@ultimaker/testing"
- "curaengine_plugin_gradual_flow/(latest)@ultimaker/stable" - "curaengine_plugin_gradual_flow/(latest)@ultimaker/stable"
- "dulcificum/latest@ultimaker/testing" - "dulcificum/latest@ultimaker/testing"
- "pyarcus/5.3.0"
- "pysavitar/5.3.0" - "pysavitar/5.3.0"
- "pynest2d/5.3.0" - "pynest2d/5.3.0"
- "curaengine_grpc_definitions/(latest)@ultimaker/testing" - "curaengine_grpc_definitions/(latest)@ultimaker/testing"

View File

@ -242,7 +242,7 @@ class CuraConan(ConanFile):
self.output.warning(f"Source path for binary {binary['binary']} does not exist") self.output.warning(f"Source path for binary {binary['binary']} does not exist")
continue continue
for bin in Path(src_path).glob(binary["binary"] + "*[.exe|.dll|.so|.dylib|.so.|.pdb]*"): for bin in Path(src_path).glob(binary["binary"] + "*[.exe|.dll|.so|.dylib|.so.]*"):
binaries.append((str(bin), binary["dst"])) binaries.append((str(bin), binary["dst"]))
for bin in Path(src_path).glob(binary["binary"]): for bin in Path(src_path).glob(binary["binary"]):
binaries.append((str(bin), binary["dst"])) binaries.append((str(bin), binary["dst"]))
@ -320,6 +320,8 @@ class CuraConan(ConanFile):
self.options["openssl"].shared = True self.options["openssl"].shared = True
if self.conf.get("user.curaengine:sentry_url", "", check_type=str) != "": if self.conf.get("user.curaengine:sentry_url", "", check_type=str) != "":
self.options["curaengine"].enable_sentry = True self.options["curaengine"].enable_sentry = True
self.options["arcus"].enable_sentry = True
self.options["clipper"].enable_sentry = True
def validate(self): def validate(self):
version = self.conf.get("user.cura:version", default = self.version, check_type = str) version = self.conf.get("user.cura:version", default = self.version, check_type = str)
@ -335,6 +337,7 @@ class CuraConan(ConanFile):
for req in self.conan_data["requirements_internal"]: for req in self.conan_data["requirements_internal"]:
self.requires(req) self.requires(req)
self.requires("cpython/3.10.4@ultimaker/stable") self.requires("cpython/3.10.4@ultimaker/stable")
self.requires("clipper/6.4.2@ultimaker/stable")
self.requires("openssl/3.2.0") self.requires("openssl/3.2.0")
self.requires("boost/1.82.0") self.requires("boost/1.82.0")
self.requires("spdlog/1.12.0") self.requires("spdlog/1.12.0")
@ -518,7 +521,8 @@ echo "CURA_APP_NAME={{ cura_app_name }}" >> ${{ env_prefix }}GITHUB_ENV
del self.info.options.cloud_api_version del self.info.options.cloud_api_version
del self.info.options.display_name del self.info.options.display_name
del self.info.options.cura_debug_mode del self.info.options.cura_debug_mode
self.options.rm_safe("enable_i18n") if self.options.get_safe("enable_i18n", False):
del self.info.options.enable_i18n
# TODO: Use the hash of requirements.txt and requirements-ultimaker.txt, Because changing these will actually result in a different # TODO: Use the hash of requirements.txt and requirements-ultimaker.txt, Because changing these will actually result in a different
# Cura. This is needed because the requirements.txt aren't managed by Conan and therefor not resolved in the package_id. This isn't # Cura. This is needed because the requirements.txt aren't managed by Conan and therefor not resolved in the package_id. This isn't

View File

@ -3,10 +3,11 @@
from typing import List, cast from typing import List, cast
from PyQt6.QtCore import QObject, QUrl, QMimeData from PyQt6.QtCore import QObject, QUrl, pyqtSignal, pyqtProperty
from PyQt6.QtGui import QDesktopServices from PyQt6.QtGui import QDesktopServices
from PyQt6.QtWidgets import QApplication from PyQt6.QtWidgets import QApplication
from UM.Application import Application
from UM.Event import CallFunctionEvent from UM.Event import CallFunctionEvent
from UM.FlameProfiler import pyqtSlot from UM.FlameProfiler import pyqtSlot
from UM.Math.Vector import Vector from UM.Math.Vector import Vector
@ -37,6 +38,10 @@ class CuraActions(QObject):
def __init__(self, parent: QObject = None) -> None: def __init__(self, parent: QObject = None) -> None:
super().__init__(parent) super().__init__(parent)
self._operation_stack = Application.getInstance().getOperationStack()
self._operation_stack.changed.connect(self._onUndoStackChanged)
undoStackChanged = pyqtSignal()
@pyqtSlot() @pyqtSlot()
def openDocumentation(self) -> None: def openDocumentation(self) -> None:
# Starting a web browser from a signal handler connected to a menu will crash on windows. # Starting a web browser from a signal handler connected to a menu will crash on windows.
@ -45,6 +50,25 @@ class CuraActions(QObject):
event = CallFunctionEvent(self._openUrl, [QUrl("https://ultimaker.com/en/resources/manuals/software?utm_source=cura&utm_medium=software&utm_campaign=dropdown-documentation")], {}) event = CallFunctionEvent(self._openUrl, [QUrl("https://ultimaker.com/en/resources/manuals/software?utm_source=cura&utm_medium=software&utm_campaign=dropdown-documentation")], {})
cura.CuraApplication.CuraApplication.getInstance().functionEvent(event) cura.CuraApplication.CuraApplication.getInstance().functionEvent(event)
@pyqtProperty(bool, notify=undoStackChanged)
def canUndo(self):
return self._operation_stack.canUndo()
@pyqtProperty(bool, notify=undoStackChanged)
def canRedo(self):
return self._operation_stack.canRedo()
@pyqtSlot()
def undo(self):
self._operation_stack.undo()
@pyqtSlot()
def redo(self):
self._operation_stack.redo()
def _onUndoStackChanged(self):
self.undoStackChanged.emit()
@pyqtSlot() @pyqtSlot()
def openBugReportPage(self) -> None: def openBugReportPage(self) -> None:
event = CallFunctionEvent(self._openUrl, [QUrl("https://github.com/Ultimaker/Cura/issues/new/choose")], {}) event = CallFunctionEvent(self._openUrl, [QUrl("https://github.com/Ultimaker/Cura/issues/new/choose")], {})

View File

@ -15,13 +15,13 @@ import numpy
from PyQt6.QtCore import QObject, QTimer, QUrl, QUrlQuery, pyqtSignal, pyqtProperty, QEvent, pyqtEnum, QCoreApplication, \ from PyQt6.QtCore import QObject, QTimer, QUrl, QUrlQuery, pyqtSignal, pyqtProperty, QEvent, pyqtEnum, QCoreApplication, \
QByteArray QByteArray
from PyQt6.QtGui import QColor, QIcon from PyQt6.QtGui import QColor, QIcon
from PyQt6.QtQml import qmlRegisterUncreatableType, qmlRegisterUncreatableMetaObject, qmlRegisterSingletonType, qmlRegisterType from PyQt6.QtQml import qmlRegisterUncreatableMetaObject, qmlRegisterSingletonType, qmlRegisterType
from PyQt6.QtWidgets import QMessageBox from PyQt6.QtWidgets import QMessageBox
import UM.Util import UM.Util
import cura.Settings.cura_empty_instance_containers import cura.Settings.cura_empty_instance_containers
from UM.Application import Application from UM.Application import Application
from UM.Decorators import override from UM.Decorators import override, deprecated
from UM.FlameProfiler import pyqtSlot from UM.FlameProfiler import pyqtSlot
from UM.Logger import Logger from UM.Logger import Logger
from UM.Math.AxisAlignedBox import AxisAlignedBox from UM.Math.AxisAlignedBox import AxisAlignedBox
@ -1138,6 +1138,10 @@ class CuraApplication(QtApplication):
return cast(MachineActionManager.MachineActionManager, self._machine_action_manager) return cast(MachineActionManager.MachineActionManager, self._machine_action_manager)
@pyqtSlot(result = QObject)
def getMachineActionManagerQml(self)-> MachineActionManager.MachineActionManager:
return cast(QObject, self._machine_action_manager)
@pyqtSlot(result = QObject) @pyqtSlot(result = QObject)
def getMaterialManagementModel(self) -> MaterialManagementModel: def getMaterialManagementModel(self) -> MaterialManagementModel:
if not self._material_management_model: if not self._material_management_model:
@ -1150,7 +1154,8 @@ class CuraApplication(QtApplication):
self._quality_management_model = QualityManagementModel(parent = self) self._quality_management_model = QualityManagementModel(parent = self)
return self._quality_management_model return self._quality_management_model
def getSimpleModeSettingsManager(self, *args): @pyqtSlot(result=QObject)
def getSimpleModeSettingsManager(self)-> SimpleModeSettingsManager:
if self._simple_mode_settings_manager is None: if self._simple_mode_settings_manager is None:
self._simple_mode_settings_manager = SimpleModeSettingsManager() self._simple_mode_settings_manager = SimpleModeSettingsManager()
return self._simple_mode_settings_manager return self._simple_mode_settings_manager
@ -1193,16 +1198,43 @@ class CuraApplication(QtApplication):
return self._print_information return self._print_information
def getQualityProfilesDropDownMenuModel(self, *args, **kwargs): @pyqtSlot(result=QObject)
def getQualityProfilesDropDownMenuModel(self, *args, **kwargs)-> QualityProfilesDropDownMenuModel:
if self._quality_profile_drop_down_menu_model is None: if self._quality_profile_drop_down_menu_model is None:
self._quality_profile_drop_down_menu_model = QualityProfilesDropDownMenuModel(self) self._quality_profile_drop_down_menu_model = QualityProfilesDropDownMenuModel(self)
return self._quality_profile_drop_down_menu_model return self._quality_profile_drop_down_menu_model
def getCustomQualityProfilesDropDownMenuModel(self, *args, **kwargs): @pyqtSlot(result=QObject)
def getCustomQualityProfilesDropDownMenuModel(self, *args, **kwargs)->CustomQualityProfilesDropDownMenuModel:
if self._custom_quality_profile_drop_down_menu_model is None: if self._custom_quality_profile_drop_down_menu_model is None:
self._custom_quality_profile_drop_down_menu_model = CustomQualityProfilesDropDownMenuModel(self) self._custom_quality_profile_drop_down_menu_model = CustomQualityProfilesDropDownMenuModel(self)
return self._custom_quality_profile_drop_down_menu_model return self._custom_quality_profile_drop_down_menu_model
@deprecated("SimpleModeSettingsManager is deprecated and will be removed in major SDK release, Use getSimpleModeSettingsManager() instead", since = "5.7.0")
def getSimpleModeSettingsManagerWrapper(self, *args, **kwargs):
return self.getSimpleModeSettingsManager()
@deprecated("MachineActionManager is deprecated and will be removed in major SDK release, Use getMachineActionManager() instead", since="5.7.0")
def getMachineActionManagerWrapper(self, *args, **kwargs):
return self.getMachineActionManager()
@deprecated("QualityManagementModel is deprecated and will be removed in major SDK release, Use getQualityManagementModel() instead", since="5.7.0")
def getQualityManagementModelWrapper(self, *args, **kwargs):
return self.getQualityManagementModel()
@deprecated("MaterialManagementModel is deprecated and will be removed in major SDK release, Use getMaterialManagementModel() instead", since = "5.7.0")
def getMaterialManagementModelWrapper(self, *args, **kwargs):
return self.getMaterialManagementModel()
@deprecated("QualityProfilesDropDownMenuModel is deprecated and will be removed in major SDK release, Use getQualityProfilesDropDownMenuModel() instead", since = "5.7.0")
def getQualityProfilesDropDownMenuModelWrapper(self, *args, **kwargs):
return self.getQualityProfilesDropDownMenuModel()
@deprecated("CustomQualityProfilesDropDownMenuModel is deprecated and will be removed in major SDK release, Use getCustomQualityProfilesDropDownMenuModel() instead", since = "5.7.0")
def getCustomQualityProfilesDropDownMenuModelWrapper(self, *args, **kwargs):
return self.getCustomQualityProfilesDropDownMenuModel()
def getCuraAPI(self, *args, **kwargs) -> "CuraAPI": def getCuraAPI(self, *args, **kwargs) -> "CuraAPI":
return self._cura_API return self._cura_API
@ -1231,8 +1263,8 @@ class CuraApplication(QtApplication):
qmlRegisterSingletonType(MachineManager, "Cura", 1, 0, self.getMachineManager, "MachineManager") qmlRegisterSingletonType(MachineManager, "Cura", 1, 0, self.getMachineManager, "MachineManager")
qmlRegisterSingletonType(IntentManager, "Cura", 1, 6, self.getIntentManager, "IntentManager") qmlRegisterSingletonType(IntentManager, "Cura", 1, 6, self.getIntentManager, "IntentManager")
qmlRegisterSingletonType(SettingInheritanceManager, "Cura", 1, 0, self.getSettingInheritanceManager, "SettingInheritanceManager") qmlRegisterSingletonType(SettingInheritanceManager, "Cura", 1, 0, self.getSettingInheritanceManager, "SettingInheritanceManager")
qmlRegisterSingletonType(SimpleModeSettingsManager, "Cura", 1, 0, self.getSimpleModeSettingsManager, "SimpleModeSettingsManager") qmlRegisterSingletonType(SimpleModeSettingsManager, "Cura", 1, 0, self.getSimpleModeSettingsManagerWrapper, "SimpleModeSettingsManager")
qmlRegisterSingletonType(MachineActionManager.MachineActionManager, "Cura", 1, 0, self.getMachineActionManager, "MachineActionManager") qmlRegisterSingletonType(MachineActionManager.MachineActionManager, "Cura", 1, 0, self.getMachineActionManagerWrapper, "MachineActionManager")
self.processEvents() self.processEvents()
qmlRegisterType(NetworkingUtil, "Cura", 1, 5, "NetworkingUtil") qmlRegisterType(NetworkingUtil, "Cura", 1, 5, "NetworkingUtil")
@ -1257,16 +1289,14 @@ class CuraApplication(QtApplication):
qmlRegisterType(FavoriteMaterialsModel, "Cura", 1, 0, "FavoriteMaterialsModel") qmlRegisterType(FavoriteMaterialsModel, "Cura", 1, 0, "FavoriteMaterialsModel")
qmlRegisterType(GenericMaterialsModel, "Cura", 1, 0, "GenericMaterialsModel") qmlRegisterType(GenericMaterialsModel, "Cura", 1, 0, "GenericMaterialsModel")
qmlRegisterType(MaterialBrandsModel, "Cura", 1, 0, "MaterialBrandsModel") qmlRegisterType(MaterialBrandsModel, "Cura", 1, 0, "MaterialBrandsModel")
qmlRegisterSingletonType(QualityManagementModel, "Cura", 1, 0, self.getQualityManagementModel, "QualityManagementModel") qmlRegisterSingletonType(QualityManagementModel, "Cura", 1, 0, self.getQualityManagementModelWrapper,"QualityManagementModel")
qmlRegisterSingletonType(MaterialManagementModel, "Cura", 1, 5, self.getMaterialManagementModel, "MaterialManagementModel") qmlRegisterSingletonType(MaterialManagementModel, "Cura", 1, 5, self.getMaterialManagementModelWrapper,"MaterialManagementModel")
self.processEvents() self.processEvents()
qmlRegisterType(DiscoveredPrintersModel, "Cura", 1, 0, "DiscoveredPrintersModel") qmlRegisterType(DiscoveredPrintersModel, "Cura", 1, 0, "DiscoveredPrintersModel")
qmlRegisterType(DiscoveredCloudPrintersModel, "Cura", 1, 7, "DiscoveredCloudPrintersModel") qmlRegisterType(DiscoveredCloudPrintersModel, "Cura", 1, 7, "DiscoveredCloudPrintersModel")
qmlRegisterSingletonType(QualityProfilesDropDownMenuModel, "Cura", 1, 0, qmlRegisterSingletonType(QualityProfilesDropDownMenuModel, "Cura", 1, 0, self.getQualityProfilesDropDownMenuModelWrapper, "QualityProfilesDropDownMenuModel")
self.getQualityProfilesDropDownMenuModel, "QualityProfilesDropDownMenuModel") qmlRegisterSingletonType(CustomQualityProfilesDropDownMenuModel, "Cura", 1, 0, self.getCustomQualityProfilesDropDownMenuModelWrapper, "CustomQualityProfilesDropDownMenuModel")
qmlRegisterSingletonType(CustomQualityProfilesDropDownMenuModel, "Cura", 1, 0,
self.getCustomQualityProfilesDropDownMenuModel, "CustomQualityProfilesDropDownMenuModel")
qmlRegisterType(NozzleModel, "Cura", 1, 0, "NozzleModel") qmlRegisterType(NozzleModel, "Cura", 1, 0, "NozzleModel")
qmlRegisterType(IntentModel, "Cura", 1, 6, "IntentModel") qmlRegisterType(IntentModel, "Cura", 1, 6, "IntentModel")
qmlRegisterType(IntentCategoryModel, "Cura", 1, 6, "IntentCategoryModel") qmlRegisterType(IntentCategoryModel, "Cura", 1, 6, "IntentCategoryModel")

View File

@ -227,7 +227,7 @@ class ExtrudersModel(ListModel):
"material_brand": "", "material_brand": "",
"color_name": "", "color_name": "",
"material_type": "", "material_type": "",
"material_label": "" "material_name": ""
} }
items.append(item) items.append(item)
if self._items != items: if self._items != items:

View File

@ -15,6 +15,10 @@ if "" in sys.path:
import argparse import argparse
import faulthandler import faulthandler
import os import os
# set the environment variable QT_QUICK_FLICKABLE_WHEEL_DECELERATION to 5000 as mentioned in qt6.6 update log to overcome scroll related issues
os.environ["QT_QUICK_FLICKABLE_WHEEL_DECELERATION"] = str(int(os.environ.get("QT_QUICK_FLICKABLE_WHEEL_DECELERATION", "5000")))
if sys.platform != "linux": # Turns out the Linux build _does_ use this, but we're not making an Enterprise release for that system anyway. if sys.platform != "linux": # Turns out the Linux build _does_ use this, but we're not making an Enterprise release for that system anyway.
os.environ["QT_PLUGIN_PATH"] = "" # Security workaround: Don't need it, and introduces an attack vector, so set to nul. os.environ["QT_PLUGIN_PATH"] = "" # Security workaround: Don't need it, and introduces an attack vector, so set to nul.
os.environ["QML2_IMPORT_PATH"] = "" # Security workaround: Don't need it, and introduces an attack vector, so set to nul. os.environ["QML2_IMPORT_PATH"] = "" # Security workaround: Don't need it, and introduces an attack vector, so set to nul.

View File

@ -35,6 +35,8 @@ message Slice
repeated EnginePlugin engine_plugins = 5; repeated EnginePlugin engine_plugins = 5;
string sentry_id = 6; // The anonymized Sentry user id that requested the slice string sentry_id = 6; // The anonymized Sentry user id that requested the slice
string cura_version = 7; // The version of Cura that requested the slice string cura_version = 7; // The version of Cura that requested the slice
optional string project_name = 8; // The name of the project that requested the slice
optional string user_name = 9; // The Digital Factory account name of the user that requested the slice
} }
message Extruder message Extruder

View File

@ -164,6 +164,7 @@ class CuraEngineBackend(QObject, Backend):
application.getPreferences().addPreference("general/auto_slice", False) application.getPreferences().addPreference("general/auto_slice", False)
application.getPreferences().addPreference("info/send_engine_crash", True) application.getPreferences().addPreference("info/send_engine_crash", True)
application.getPreferences().addPreference("info/anonymous_engine_crash_report", True)
self._use_timer: bool = False self._use_timer: bool = False
@ -1094,14 +1095,14 @@ class CuraEngineBackend(QObject, Backend):
self._change_timer.timeout.disconnect(self.slice) self._change_timer.timeout.disconnect(self.slice)
def _onPreferencesChanged(self, preference: str) -> None: def _onPreferencesChanged(self, preference: str) -> None:
if preference != "general/auto_slice" and preference != "info/send_engine_crash": if preference != "general/auto_slice" and preference != "info/send_engine_crash" and preference != "info/anonymous_engine_crash_report":
return return
if preference == "general/auto_slice": if preference == "general/auto_slice":
auto_slice = self.determineAutoSlicing() auto_slice = self.determineAutoSlicing()
if auto_slice: if auto_slice:
self._change_timer.start() self._change_timer.start()
elif preference == "info/send_engine_crash": elif preference == "info/send_engine_crash":
os.environ["use_sentry"] = "1" if CuraApplication.getInstance().getPreferences().getValue("info/send_engine_crash") else "0" os.environ["USE_SENTRY"] = "1" if CuraApplication.getInstance().getPreferences().getValue("info/send_engine_crash") else "0"
def tickle(self) -> None: def tickle(self) -> None:
"""Tickle the backend so in case of auto slicing, it starts the timer.""" """Tickle the backend so in case of auto slicing, it starts the timer."""

View File

@ -1,4 +1,4 @@
# Copyright (c) 2023 UltiMaker # Copyright (c) 2024 UltiMaker
# Cura is released under the terms of the LGPLv3 or higher. # Cura is released under the terms of the LGPLv3 or higher.
import uuid import uuid
@ -63,13 +63,12 @@ class GcodeStartEndFormatter(Formatter):
# will be used. Alternatively, if the expression is formatted as "{[expression], [extruder_nr]}", # will be used. Alternatively, if the expression is formatted as "{[expression], [extruder_nr]}",
# then the expression will be evaluated with the extruder stack of the specified extruder_nr. # then the expression will be evaluated with the extruder stack of the specified extruder_nr.
_extruder_regex = re.compile(r"^\s*(?P<expression>.*)\s*,\s*(?P<extruder_nr>\d+)\s*$") _extruder_regex = re.compile(r"^\s*(?P<expression>.*)\s*,\s*(?P<extruder_nr_expr>.*)\s*$")
def __init__(self, default_extruder_nr: int = -1, *, def __init__(self, all_extruder_settings: Dict[str, Any], default_extruder_nr: int = -1) -> None:
additional_per_extruder_settings: Optional[Dict[str, Dict[str, any]]] = None) -> None:
super().__init__() super().__init__()
self._all_extruder_settings: Dict[str, Any] = all_extruder_settings
self._default_extruder_nr: int = default_extruder_nr self._default_extruder_nr: int = default_extruder_nr
self._additional_per_extruder_settings: Optional[Dict[str, Dict[str, any]]] = additional_per_extruder_settings
def get_field(self, field_name, args: [str], kwargs: dict) -> Tuple[str, str]: def get_field(self, field_name, args: [str], kwargs: dict) -> Tuple[str, str]:
# get_field method parses all fields in the format-string and parses them individually to the get_value method. # get_field method parses all fields in the format-string and parses them individually to the get_value method.
@ -88,22 +87,32 @@ class GcodeStartEndFormatter(Formatter):
if expression in post_slice_data_variables: if expression in post_slice_data_variables:
return f"{{{expression}}}" return f"{{{expression}}}"
extruder_nr = self._default_extruder_nr extruder_nr = str(self._default_extruder_nr)
# The settings may specify a specific extruder to use. This is done by # The settings may specify a specific extruder to use. This is done by
# formatting the expression as "{expression}, {extruder_nr}". If the # formatting the expression as "{expression}, {extruder_nr_expr}". If the
# expression is formatted like this, we extract the extruder_nr and use # expression is formatted like this, we extract the extruder_nr and use
# it to get the value from the correct extruder stack. # it to get the value from the correct extruder stack.
match = self._extruder_regex.match(expression) match = self._extruder_regex.match(expression)
if match: if match:
expression = match.group("expression") expression = match.group("expression")
extruder_nr = int(match.group("extruder_nr")) extruder_nr_expr = match.group("extruder_nr_expr")
if self._additional_per_extruder_settings is not None and str( if extruder_nr_expr.isdigit():
extruder_nr) in self._additional_per_extruder_settings: extruder_nr = extruder_nr_expr
additional_variables = self._additional_per_extruder_settings[str(extruder_nr)]
else: else:
additional_variables = dict() # We get the value of the extruder_nr_expr from `_all_extruder_settings` dictionary
# rather than the global container stack. The `_all_extruder_settings["-1"]` is a
# dict-representation of the global container stack, with additional properties such
# as `initial_extruder_nr`. As users may enter such expressions we can't use the
# global container stack.
extruder_nr = str(self._all_extruder_settings["-1"].get(extruder_nr_expr, "-1"))
if extruder_nr in self._all_extruder_settings:
additional_variables = self._all_extruder_settings[extruder_nr].copy()
else:
Logger.warning(f"Extruder {extruder_nr} does not exist, using global settings")
additional_variables = self._all_extruder_settings["-1"].copy()
# Add the arguments and keyword arguments to the additional settings. These # Add the arguments and keyword arguments to the additional settings. These
# are currently _not_ used, but they are added for consistency with the # are currently _not_ used, but they are added for consistency with the
@ -113,15 +122,17 @@ class GcodeStartEndFormatter(Formatter):
for key, value in kwargs.items(): for key, value in kwargs.items():
additional_variables[key] = value additional_variables[key] = value
if extruder_nr == -1: if extruder_nr == "-1":
container_stack = CuraApplication.getInstance().getGlobalContainerStack() container_stack = CuraApplication.getInstance().getGlobalContainerStack()
else: else:
container_stack = ExtruderManager.getInstance().getExtruderStack(extruder_nr) container_stack = ExtruderManager.getInstance().getExtruderStack(extruder_nr)
if not container_stack:
Logger.warning(f"Extruder {extruder_nr} does not exist, using global settings")
container_stack = CuraApplication.getInstance().getGlobalContainerStack()
setting_function = SettingFunction(expression) setting_function = SettingFunction(expression)
value = setting_function(container_stack, additional_variables=additional_variables) value = setting_function(container_stack, additional_variables=additional_variables)
return value return value
@ -131,12 +142,13 @@ class StartSliceJob(Job):
def __init__(self, slice_message: Arcus.PythonMessage) -> None: def __init__(self, slice_message: Arcus.PythonMessage) -> None:
super().__init__() super().__init__()
self._scene = CuraApplication.getInstance().getController().getScene() #type: Scene self._scene: Scene = CuraApplication.getInstance().getController().getScene()
self._slice_message: Arcus.PythonMessage = slice_message self._slice_message: Arcus.PythonMessage = slice_message
self._is_cancelled = False #type: bool self._is_cancelled: bool = False
self._build_plate_number = None #type: Optional[int] self._build_plate_number: Optional[int] = None
self._all_extruders_settings = None #type: Optional[Dict[str, Any]] # cache for all setting values from all stacks (global & extruder) for the current machine # cache for all setting values from all stacks (global & extruder) for the current machine
self._all_extruders_settings: Optional[Dict[str, Any]] = None
def getSliceMessage(self) -> Arcus.PythonMessage: def getSliceMessage(self) -> Arcus.PythonMessage:
return self._slice_message return self._slice_message
@ -340,6 +352,12 @@ class StartSliceJob(Job):
self._slice_message.sentry_id = f"{user_id}" self._slice_message.sentry_id = f"{user_id}"
self._slice_message.cura_version = CuraVersion self._slice_message.cura_version = CuraVersion
# Add the project name to the message if the user allows for non-anonymous crash data collection.
account = CuraApplication.getInstance().getCuraAPI().account
if account and account.isLoggedIn and not CuraApplication.getInstance().getPreferences().getValue("info/anonymous_engine_crash_report"):
self._slice_message.project_name = CuraApplication.getInstance().getPrintInformation().baseName
self._slice_message.user_name = account.userName
# Build messages for extruder stacks # Build messages for extruder stacks
for extruder_stack in global_stack.extruderList: for extruder_stack in global_stack.extruderList:
self._buildExtruderMessage(extruder_stack) self._buildExtruderMessage(extruder_stack)
@ -471,10 +489,7 @@ class StartSliceJob(Job):
# Get "replacement-keys" for the extruders. In the formatter the settings stack is used to get the # Get "replacement-keys" for the extruders. In the formatter the settings stack is used to get the
# replacement values for the setting-keys. However, the values for `material_id`, `material_type`, # replacement values for the setting-keys. However, the values for `material_id`, `material_type`,
# etc are not in the settings stack. # etc are not in the settings stack.
additional_per_extruder_settings = self._all_extruders_settings.copy() fmt = GcodeStartEndFormatter(self._all_extruders_settings, default_extruder_nr=default_extruder_nr)
additional_per_extruder_settings["default_extruder_nr"] = default_extruder_nr
fmt = GcodeStartEndFormatter(default_extruder_nr=default_extruder_nr,
additional_per_extruder_settings=additional_per_extruder_settings)
return str(fmt.format(value)) return str(fmt.format(value))
except: except:
Logger.logException("w", "Unable to do token replacement on start/end g-code") Logger.logException("w", "Unable to do token replacement on start/end g-code")

View File

@ -25,7 +25,7 @@ UM.TooltipArea
onClicked: onClicked:
{ {
addedSettingsModel.setVisible(model.key, checked); addedSettingsModel.setVisible(model.key, checked);
UM.ActiveTool.forceUpdate(); UM.Controller.forceUpdate();
} }
} }

View File

@ -23,7 +23,7 @@ Item
readonly property string infillMeshType: "infill_mesh" readonly property string infillMeshType: "infill_mesh"
readonly property string antiOverhangMeshType: "anti_overhang_mesh" readonly property string antiOverhangMeshType: "anti_overhang_mesh"
property var currentMeshType: UM.ActiveTool.properties.getValue("MeshType") property var currentMeshType: UM.Controller.properties.getValue("MeshType")
// Update the view every time the currentMeshType changes // Update the view every time the currentMeshType changes
onCurrentMeshTypeChanged: onCurrentMeshTypeChanged:
@ -56,7 +56,7 @@ Item
function setMeshType(type) function setMeshType(type)
{ {
UM.ActiveTool.setProperty("MeshType", type) UM.Controller.setProperty("MeshType", type)
updateMeshTypeCheckedState(type) updateMeshTypeCheckedState(type)
} }
@ -224,7 +224,7 @@ Item
visibilityHandler: Cura.PerObjectSettingVisibilityHandler visibilityHandler: Cura.PerObjectSettingVisibilityHandler
{ {
id: visibility_handler id: visibility_handler
selectedObjectId: UM.ActiveTool.properties.getValue("SelectedObjectId") selectedObjectId: UM.Controller.properties.getValue("SelectedObjectId")
} }
// For some reason the model object is updated after removing him from the memory and // For some reason the model object is updated after removing him from the memory and
@ -320,7 +320,7 @@ Item
{ {
id: provider id: provider
containerStackId: UM.ActiveTool.properties.getValue("ContainerID") containerStackId: UM.Controller.properties.getValue("ContainerID")
key: model.key key: model.key
watchedProperties: [ "value", "enabled", "validationState" ] watchedProperties: [ "value", "enabled", "validationState" ]
storeIndex: 0 storeIndex: 0
@ -330,7 +330,7 @@ Item
UM.SettingPropertyProvider UM.SettingPropertyProvider
{ {
id: inheritStackProvider id: inheritStackProvider
containerStackId: UM.ActiveTool.properties.getValue("ContainerID") containerStackId: UM.Controller.properties.getValue("ContainerID")
key: model.key key: model.key
watchedProperties: [ "limit_to_extruder" ] watchedProperties: [ "limit_to_extruder" ]
} }
@ -381,22 +381,22 @@ Item
Connections Connections
{ {
target: UM.ActiveTool target: UM.Controller
function onPropertiesChanged() function onPropertiesChanged()
{ {
// the values cannot be bound with UM.ActiveTool.properties.getValue() calls, // the values cannot be bound with UM.Controller.properties.getValue() calls,
// so here we connect to the signal and update the those values. // so here we connect to the signal and update the those values.
if (typeof UM.ActiveTool.properties.getValue("SelectedObjectId") !== "undefined") if (typeof UM.Controller.properties.getValue("SelectedObjectId") !== "undefined")
{ {
const selectedObjectId = UM.ActiveTool.properties.getValue("SelectedObjectId") const selectedObjectId = UM.Controller.properties.getValue("SelectedObjectId")
if (addedSettingsModel.visibilityHandler.selectedObjectId != selectedObjectId) if (addedSettingsModel.visibilityHandler.selectedObjectId != selectedObjectId)
{ {
addedSettingsModel.visibilityHandler.selectedObjectId = selectedObjectId addedSettingsModel.visibilityHandler.selectedObjectId = selectedObjectId
} }
} }
if (typeof UM.ActiveTool.properties.getValue("ContainerID") !== "undefined") if (typeof UM.Controller.properties.getValue("ContainerID") !== "undefined")
{ {
const containerId = UM.ActiveTool.properties.getValue("ContainerID") const containerId = UM.Controller.properties.getValue("ContainerID")
if (provider.containerStackId !== containerId) if (provider.containerStackId !== containerId)
{ {
provider.containerStackId = containerId provider.containerStackId = containerId

View File

@ -0,0 +1,95 @@
# Copyright (c) 2024 UltiMaker
# Cura is released under the terms of the LGPLv3 or higher.
import configparser
from typing import Tuple, List
import io
from UM.VersionUpgrade import VersionUpgrade
_REMOVED_SETTINGS = {
"support_interface_skip_height",
}
_NEW_SETTING_VERSION = "23"
class VersionUpgrade56to57(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.
It also changes the preferences to have the new version number.
This removes any settings that were removed in the new Cura version.
:param serialized: The original contents of the preferences file.
:param filename: The file name of the preferences file.
:return: A list of new file names, and a list of the new contents for
those files.
"""
parser = configparser.ConfigParser(interpolation = None)
parser.read_string(serialized)
# Update version number.
parser["metadata"]["setting_version"] = _NEW_SETTING_VERSION
# Remove deleted settings from the visible settings list.
if "general" in parser and "visible_settings" in parser["general"]:
visible_settings = set(parser["general"]["visible_settings"].split(";"))
for removed in _REMOVED_SETTINGS:
if removed in visible_settings:
visible_settings.remove(removed)
parser["general"]["visible_settings"] = ";".join(visible_settings)
result = io.StringIO()
parser.write(result)
return [filename], [result.getvalue()]
def upgradeInstanceContainer(self, serialized: str, filename: str) -> Tuple[List[str], List[str]]:
"""
Upgrades instance containers to remove the settings that were removed in this version.
It also changes the instance containers to have the new version number.
This removes any settings that were removed in the new Cura version and updates settings that need to be updated
with a new value.
:param serialized: The original contents of the instance container.
:param filename: The original file name of the instance container.
:return: A list of new file names, and a list of the new contents for
those files.
"""
parser = configparser.ConfigParser(interpolation = None, comment_prefixes = ())
parser.read_string(serialized)
# Update version number.
parser["metadata"]["setting_version"] = _NEW_SETTING_VERSION
if "values" in parser:
# Remove deleted settings from the instance containers.
for removed in _REMOVED_SETTINGS:
if removed in parser["values"]:
del parser["values"][removed]
result = io.StringIO()
parser.write(result)
return [filename], [result.getvalue()]
def upgradeStack(self, serialized: str, filename: str) -> Tuple[List[str], List[str]]:
"""
Upgrades stacks to have the new version number.
:param serialized: The original contents of the stack.
:param filename: The original file name of the stack.
:return: A list of new file names, and a list of the new contents for
those files.
"""
parser = configparser.ConfigParser(interpolation = None)
parser.read_string(serialized)
# Update version number.
if "metadata" not in parser:
parser["metadata"] = {}
parser["metadata"]["setting_version"] = _NEW_SETTING_VERSION
result = io.StringIO()
parser.write(result)
return [filename], [result.getvalue()]

View File

@ -0,0 +1,61 @@
# Copyright (c) 2024 UltiMaker
# Cura is released under the terms of the LGPLv3 or higher.
from typing import Any, Dict, TYPE_CHECKING
from . import VersionUpgrade56to57
if TYPE_CHECKING:
from UM.Application import Application
upgrade = VersionUpgrade56to57.VersionUpgrade56to57()
def getMetaData() -> Dict[str, Any]:
return {
"version_upgrade": {
# From To Upgrade function
("preferences", 7000022): ("preferences", 7000023, upgrade.upgradePreferences),
("machine_stack", 6000022): ("machine_stack", 6000023, upgrade.upgradeStack),
("extruder_train", 6000022): ("extruder_train", 6000023, upgrade.upgradeStack),
("definition_changes", 4000022): ("definition_changes", 4000023, upgrade.upgradeInstanceContainer),
("quality_changes", 4000022): ("quality_changes", 4000023, upgrade.upgradeInstanceContainer),
("quality", 4000022): ("quality", 4000023, upgrade.upgradeInstanceContainer),
("user", 4000022): ("user", 4000023, upgrade.upgradeInstanceContainer),
("intent", 4000022): ("intent", 4000023, upgrade.upgradeInstanceContainer),
},
"sources": {
"preferences": {
"get_version": upgrade.getCfgVersion,
"location": {"."}
},
"machine_stack": {
"get_version": upgrade.getCfgVersion,
"location": {"./machine_instances"}
},
"extruder_train": {
"get_version": upgrade.getCfgVersion,
"location": {"./extruders"}
},
"definition_changes": {
"get_version": upgrade.getCfgVersion,
"location": {"./definition_changes"}
},
"quality_changes": {
"get_version": upgrade.getCfgVersion,
"location": {"./quality_changes"}
},
"quality": {
"get_version": upgrade.getCfgVersion,
"location": {"./quality"}
},
"user": {
"get_version": upgrade.getCfgVersion,
"location": {"./user"}
}
}
}
def register(app: "Application") -> Dict[str, Any]:
return {"version_upgrade": upgrade}

View File

@ -0,0 +1,8 @@
{
"name": "Version Upgrade 5.6 to 5.7",
"author": "UltiMaker",
"version": "1.0.0",
"description": "Upgrades configurations from Cura 5.6 to Cura 5.7.",
"api": 8,
"i18n-catalog": "cura"
}

View File

@ -112,7 +112,6 @@
"support_interface_density": { "value": 33.333 }, "support_interface_density": { "value": 33.333 },
"support_interface_enable": { "value": true }, "support_interface_enable": { "value": true },
"support_interface_pattern": { "value": "'grid'" }, "support_interface_pattern": { "value": "'grid'" },
"support_interface_skip_height": { "value": 0.2 },
"support_roof_enable": { "value": true }, "support_roof_enable": { "value": true },
"support_xy_distance": { "value": "wall_line_width_0 * 2" }, "support_xy_distance": { "value": "wall_line_width_0 * 2" },
"support_xy_distance_overhang": { "value": "wall_line_width_0" }, "support_xy_distance_overhang": { "value": "wall_line_width_0" },

View File

@ -114,7 +114,6 @@
"support_interface_enable": { "value": true }, "support_interface_enable": { "value": true },
"support_interface_height": { "value": "layer_height * 4" }, "support_interface_height": { "value": "layer_height * 4" },
"support_interface_pattern": { "value": "'grid'" }, "support_interface_pattern": { "value": "'grid'" },
"support_interface_skip_height": { "value": 0.2 },
"support_xy_distance": { "value": "wall_line_width_0 * 2" }, "support_xy_distance": { "value": "wall_line_width_0 * 2" },
"support_xy_distance_overhang": { "value": "wall_line_width_0" }, "support_xy_distance_overhang": { "value": "wall_line_width_0" },
"support_xy_overrides_z": { "value": "'xy_overrides_z'" }, "support_xy_overrides_z": { "value": "'xy_overrides_z'" },

View File

@ -154,7 +154,6 @@
"support_infill_rate": { "value": "20" }, "support_infill_rate": { "value": "20" },
"support_interface_enable": { "value": "True" }, "support_interface_enable": { "value": "True" },
"support_interface_height": { "value": "1" }, "support_interface_height": { "value": "1" },
"support_interface_skip_height": { "value": "layer_height" },
"support_join_distance": { "value": "1" }, "support_join_distance": { "value": "1" },
"support_offset": { "value": "1.5" }, "support_offset": { "value": "1.5" },
"support_pattern": { "default_value": "zigzag" }, "support_pattern": { "default_value": "zigzag" },

View File

@ -108,7 +108,6 @@
"support_interface_enable": { "value": true }, "support_interface_enable": { "value": true },
"support_interface_height": { "value": "layer_height * 4" }, "support_interface_height": { "value": "layer_height * 4" },
"support_interface_pattern": { "value": "'grid'" }, "support_interface_pattern": { "value": "'grid'" },
"support_interface_skip_height": { "value": 0.2 },
"support_pattern": { "value": "'zigzag'" }, "support_pattern": { "value": "'zigzag'" },
"support_wall_count": { "value": 1 }, "support_wall_count": { "value": 1 },
"support_xy_distance": { "value": "wall_line_width_0 * 2" }, "support_xy_distance": { "value": "wall_line_width_0 * 2" },

View File

@ -97,7 +97,6 @@
"support_interface_enable": { "value": true }, "support_interface_enable": { "value": true },
"support_interface_height": { "value": "layer_height * 4" }, "support_interface_height": { "value": "layer_height * 4" },
"support_interface_pattern": { "value": "'grid'" }, "support_interface_pattern": { "value": "'grid'" },
"support_interface_skip_height": { "value": 0.2 },
"support_pattern": { "value": "'zigzag'" }, "support_pattern": { "value": "'zigzag'" },
"support_xy_distance": { "value": "wall_line_width_0 * 2" }, "support_xy_distance": { "value": "wall_line_width_0 * 2" },
"support_xy_distance_overhang": { "value": "wall_line_width_0" }, "support_xy_distance_overhang": { "value": "wall_line_width_0" },

View File

@ -5423,20 +5423,6 @@
} }
} }
}, },
"support_interface_skip_height":
{
"label": "Support Interface Resolution",
"description": "When checking where there's model above and below the support, take steps of the given height. Lower values will slice slower, while higher values may cause normal support to be printed in some places where there should have been support interface.",
"unit": "mm",
"type": "float",
"default_value": 0.2,
"value": "layer_height",
"minimum_value": "0",
"maximum_value_warning": "support_interface_height",
"limit_to_extruder": "support_interface_extruder_nr",
"enabled": "support_interface_enable and (support_enable or support_meshes_present)",
"settable_per_mesh": true
},
"support_interface_density": "support_interface_density":
{ {
"label": "Support Interface Density", "label": "Support Interface Density",

View File

@ -92,7 +92,6 @@
"support_interface_height": { "value": "layer_height * 4" }, "support_interface_height": { "value": "layer_height * 4" },
"support_interface_line_width": { "value": "line_width - 0.1" }, "support_interface_line_width": { "value": "line_width - 0.1" },
"support_interface_pattern": { "value": "'grid'" }, "support_interface_pattern": { "value": "'grid'" },
"support_interface_skip_height": { "value": 0.2 },
"support_pattern": { "value": "'zigzag'" }, "support_pattern": { "value": "'zigzag'" },
"support_wall_count": { "value": 1 }, "support_wall_count": { "value": 1 },
"support_xy_distance": { "value": "wall_line_width_0 * 2" }, "support_xy_distance": { "value": "wall_line_width_0 * 2" },

View File

@ -112,7 +112,6 @@
"support_interface_density": { "value": 33.333 }, "support_interface_density": { "value": 33.333 },
"support_interface_height": { "value": "layer_height * 4" }, "support_interface_height": { "value": "layer_height * 4" },
"support_interface_pattern": { "value": "'grid'" }, "support_interface_pattern": { "value": "'grid'" },
"support_interface_skip_height": { "value": 0.2 },
"support_pattern": { "value": "'zigzag'" }, "support_pattern": { "value": "'zigzag'" },
"support_wall_count": { "value": 0 }, "support_wall_count": { "value": 0 },
"support_xy_distance": { "value": "wall_line_width_0 * 3" }, "support_xy_distance": { "value": "wall_line_width_0 * 3" },

View File

@ -133,7 +133,6 @@
"support_interface_enable": { "value": true }, "support_interface_enable": { "value": true },
"support_interface_height": { "value": "layer_height * 4" }, "support_interface_height": { "value": "layer_height * 4" },
"support_interface_pattern": { "value": "'grid'" }, "support_interface_pattern": { "value": "'grid'" },
"support_interface_skip_height": { "value": 0.2 },
"support_pattern": { "value": "'zigzag'" }, "support_pattern": { "value": "'zigzag'" },
"support_wall_count": { "value": 1 }, "support_wall_count": { "value": 1 },
"support_xy_distance": { "value": "wall_line_width_0 * 2" }, "support_xy_distance": { "value": "wall_line_width_0 * 2" },

View File

@ -70,7 +70,6 @@
"support_interface_enable": { "value": true }, "support_interface_enable": { "value": true },
"support_interface_height": { "value": "layer_height * 4" }, "support_interface_height": { "value": "layer_height * 4" },
"support_interface_pattern": { "value": "'grid'" }, "support_interface_pattern": { "value": "'grid'" },
"support_interface_skip_height": { "value": 0.2 },
"support_pattern": { "value": "'zigzag'" }, "support_pattern": { "value": "'zigzag'" },
"support_wall_count": { "value": 1 }, "support_wall_count": { "value": 1 },
"support_xy_distance": { "value": "wall_line_width_0 * 2" }, "support_xy_distance": { "value": "wall_line_width_0 * 2" },

View File

@ -88,7 +88,6 @@
"support_interface_enable": { "value": true }, "support_interface_enable": { "value": true },
"support_interface_height": { "value": "layer_height * 4" }, "support_interface_height": { "value": "layer_height * 4" },
"support_interface_pattern": { "value": "'grid'" }, "support_interface_pattern": { "value": "'grid'" },
"support_interface_skip_height": { "value": 0.2 },
"support_pattern": { "value": "'zigzag'" }, "support_pattern": { "value": "'zigzag'" },
"support_wall_count": { "value": 1 }, "support_wall_count": { "value": 1 },
"support_xy_distance": { "value": "wall_line_width_0 * 2" }, "support_xy_distance": { "value": "wall_line_width_0 * 2" },

View File

@ -88,7 +88,6 @@
"support_interface_enable": { "value": true }, "support_interface_enable": { "value": true },
"support_interface_height": { "value": "layer_height * 4" }, "support_interface_height": { "value": "layer_height * 4" },
"support_interface_pattern": { "value": "'grid'" }, "support_interface_pattern": { "value": "'grid'" },
"support_interface_skip_height": { "value": 0.2 },
"support_pattern": { "value": "'zigzag'" }, "support_pattern": { "value": "'zigzag'" },
"support_wall_count": { "value": 1 }, "support_wall_count": { "value": 1 },
"support_xy_distance": { "value": "wall_line_width_0 * 2" }, "support_xy_distance": { "value": "wall_line_width_0 * 2" },

View File

@ -109,7 +109,6 @@
"support_interface_enable": { "value": true }, "support_interface_enable": { "value": true },
"support_interface_height": { "value": "layer_height * 4" }, "support_interface_height": { "value": "layer_height * 4" },
"support_interface_pattern": { "value": "'grid'" }, "support_interface_pattern": { "value": "'grid'" },
"support_interface_skip_height": { "value": 0.2 },
"support_pattern": { "value": "'zigzag'" }, "support_pattern": { "value": "'zigzag'" },
"support_wall_count": { "value": 1 }, "support_wall_count": { "value": 1 },
"support_xy_distance": { "value": "wall_line_width_0 * 2" }, "support_xy_distance": { "value": "wall_line_width_0 * 2" },

View File

@ -119,7 +119,6 @@
"support_interface_enable": { "value": true }, "support_interface_enable": { "value": true },
"support_interface_height": { "value": "layer_height * 4" }, "support_interface_height": { "value": "layer_height * 4" },
"support_interface_pattern": { "value": "'grid'" }, "support_interface_pattern": { "value": "'grid'" },
"support_interface_skip_height": { "value": 0.2 },
"support_pattern": { "value": "'zigzag'" }, "support_pattern": { "value": "'zigzag'" },
"support_wall_count": { "value": 1 }, "support_wall_count": { "value": 1 },
"support_xy_distance": { "value": "wall_line_width_0 * 2" }, "support_xy_distance": { "value": "wall_line_width_0 * 2" },

View File

@ -70,7 +70,6 @@
"support_interface_enable": { "value": true }, "support_interface_enable": { "value": true },
"support_interface_height": { "value": "layer_height * 4" }, "support_interface_height": { "value": "layer_height * 4" },
"support_interface_pattern": { "value": "'grid'" }, "support_interface_pattern": { "value": "'grid'" },
"support_interface_skip_height": { "value": 0.2 },
"support_pattern": { "value": "'zigzag'" }, "support_pattern": { "value": "'zigzag'" },
"support_wall_count": { "value": 1 }, "support_wall_count": { "value": 1 },
"support_xy_distance": { "value": "wall_line_width_0 * 2" }, "support_xy_distance": { "value": "wall_line_width_0 * 2" },

View File

@ -111,7 +111,6 @@
"support_interface_density": { "value": 33.333 }, "support_interface_density": { "value": 33.333 },
"support_interface_height": { "value": "layer_height * 4" }, "support_interface_height": { "value": "layer_height * 4" },
"support_interface_pattern": { "value": "'grid'" }, "support_interface_pattern": { "value": "'grid'" },
"support_interface_skip_height": { "value": 0.2 },
"support_pattern": { "value": "'zigzag'" }, "support_pattern": { "value": "'zigzag'" },
"support_wall_count": { "value": "1 if (support_structure == 'tree') else 0" }, "support_wall_count": { "value": "1 if (support_structure == 'tree') else 0" },
"support_xy_distance": { "value": "wall_line_width_0 * 3" }, "support_xy_distance": { "value": "wall_line_width_0 * 3" },

View File

@ -68,7 +68,6 @@
"support_interface_density": { "value": 33.333 }, "support_interface_density": { "value": 33.333 },
"support_interface_height": { "value": "layer_height * 4" }, "support_interface_height": { "value": "layer_height * 4" },
"support_interface_pattern": { "value": "'grid'" }, "support_interface_pattern": { "value": "'grid'" },
"support_interface_skip_height": { "value": 0.2 },
"support_pattern": { "value": "'zigzag'" }, "support_pattern": { "value": "'zigzag'" },
"support_wall_count": { "value": "1 if (support_structure == 'tree') else 0" }, "support_wall_count": { "value": "1 if (support_structure == 'tree') else 0" },
"support_xy_distance": { "value": "wall_line_width_0 * 2" }, "support_xy_distance": { "value": "wall_line_width_0 * 2" },

View File

@ -99,7 +99,7 @@
"acceleration_print": "acceleration_print":
{ {
"enabled": false, "enabled": false,
"value": 300 "value": 800
}, },
"acceleration_print_layer_0": "acceleration_print_layer_0":
{ {
@ -234,7 +234,7 @@
"jerk_print": "jerk_print":
{ {
"enabled": false, "enabled": false,
"value": 12.5 "value": 6.25
}, },
"jerk_print_layer_0": "jerk_print_layer_0":
{ {
@ -279,7 +279,7 @@
"jerk_travel": "jerk_travel":
{ {
"enabled": false, "enabled": false,
"value": 12.5 "value": "jerk_print"
}, },
"jerk_travel_enabled": "jerk_travel_enabled":
{ {

View File

@ -99,7 +99,6 @@
"support_interface_enable": { "value": true }, "support_interface_enable": { "value": true },
"support_interface_height": { "value": "layer_height * 4" }, "support_interface_height": { "value": "layer_height * 4" },
"support_interface_pattern": { "value": "'grid'" }, "support_interface_pattern": { "value": "'grid'" },
"support_interface_skip_height": { "value": 0.2 },
"support_pattern": { "value": "'zigzag'" }, "support_pattern": { "value": "'zigzag'" },
"support_wall_count": { "value": 1 }, "support_wall_count": { "value": 1 },
"support_xy_distance": { "value": "wall_line_width_0 * 2" }, "support_xy_distance": { "value": "wall_line_width_0 * 2" },

View File

@ -14,8 +14,9 @@
"default_value": 0, "default_value": 0,
"maximum_value": "1" "maximum_value": "1"
}, },
"machine_extruder_end_code": { "default_value": "M106 P{extruder_nr} S255\nG91\nG0 Z0.4 F600\nG90\nG0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000" }, "machine_extruder_end_code": { "default_value": "M106 P{extruder_nr} S1.0\nG91\nG0 Z0.4 F600\nG90\nG0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000" },
"machine_extruder_start_code": { "default_value": "G0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000\nM109 S{material_final_print_temperature}\nG4 S5\nG91\nG0 Z-0.4 F600\nG90\nM107 P{(extruder_nr+1)%2}\nM106 P{extruder_nr} S{cool_fan_speed*255/100}" }, "machine_extruder_start_code": { "default_value": "G0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000\nM104 S{material_print_temperature}\nG4 S5\nG91\nG0 Z-0.4 F600\nG90\nM107 P{(extruder_nr+1)%2}\nM106 P{extruder_nr} S{cool_fan_speed/100}" },
"machine_extruder_start_code_duration": { "default_value": 8 },
"machine_nozzle_offset_x": { "default_value": 0 }, "machine_nozzle_offset_x": { "default_value": 0 },
"machine_nozzle_offset_y": { "default_value": 0 }, "machine_nozzle_offset_y": { "default_value": 0 },
"machine_nozzle_size": { "default_value": 0.4 }, "machine_nozzle_size": { "default_value": 0.4 },

View File

@ -14,8 +14,9 @@
"default_value": 1, "default_value": 1,
"maximum_value": "1" "maximum_value": "1"
}, },
"machine_extruder_end_code": { "default_value": "M106 P{extruder_nr} S255\nG91\nG0 Z0.4 F600\nG90\nG0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000" }, "machine_extruder_end_code": { "default_value": "M106 P{extruder_nr} S1.0\nG91\nG0 Z0.4 F600\nG90\nG0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000" },
"machine_extruder_start_code": { "default_value": "G0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000\nM109 S{material_final_print_temperature}\nG4 S5\nG91\nG0 Z-0.4 F600\nG90\nM107 P{(extruder_nr+1)%2}\nM106 P{extruder_nr} S{cool_fan_speed*255/100}" }, "machine_extruder_start_code": { "default_value": "G0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000\nM104 S{material_print_temperature}\nG4 S5\nG91\nG0 Z-0.4 F600\nG90\nM107 P{(extruder_nr+1)%2}\nM106 P{extruder_nr} S{cool_fan_speed/100}" },
"machine_extruder_start_code_duration": { "default_value": 8 },
"machine_nozzle_offset_x": { "default_value": 0 }, "machine_nozzle_offset_x": { "default_value": 0 },
"machine_nozzle_offset_y": { "default_value": 0 }, "machine_nozzle_offset_y": { "default_value": 0 },
"machine_nozzle_size": { "default_value": 0.4 }, "machine_nozzle_size": { "default_value": 0.4 },

View File

@ -14,8 +14,9 @@
"default_value": 0, "default_value": 0,
"maximum_value": "1" "maximum_value": "1"
}, },
"machine_extruder_end_code": { "default_value": "M106 P{extruder_nr} S255\nG91\nG0 Z0.4 F600\nG90\nG0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000" }, "machine_extruder_end_code": { "default_value": "M106 P{extruder_nr} S1.0\nG91\nG0 Z0.4 F600\nG90\nG0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000" },
"machine_extruder_start_code": { "default_value": "G0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000\nM109 S{material_final_print_temperature}\nG4 S5\nG91\nG0 Z-0.4 F600\nG90\nM107 P{(extruder_nr+1)%2}\nM106 P{extruder_nr} S{cool_fan_speed*255/100}" }, "machine_extruder_start_code": { "default_value": "G0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000\nM104 S{material_print_temperature}\nG4 S5\nG91\nG0 Z-0.4 F600\nG90\nM107 P{(extruder_nr+1)%2}\nM106 P{extruder_nr} S{cool_fan_speed/100}" },
"machine_extruder_start_code_duration": { "default_value": 10 },
"machine_nozzle_offset_x": { "default_value": 0 }, "machine_nozzle_offset_x": { "default_value": 0 },
"machine_nozzle_offset_y": { "default_value": 0 }, "machine_nozzle_offset_y": { "default_value": 0 },
"machine_nozzle_size": { "default_value": 0.4 }, "machine_nozzle_size": { "default_value": 0.4 },

View File

@ -14,8 +14,9 @@
"default_value": 1, "default_value": 1,
"maximum_value": "1" "maximum_value": "1"
}, },
"machine_extruder_end_code": { "default_value": "M106 P{extruder_nr} S255\nG91\nG0 Z0.4 F600\nG90\nG0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000" }, "machine_extruder_end_code": { "default_value": "M106 P{extruder_nr} S1.0\nG91\nG0 Z0.4 F600\nG90\nG0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000" },
"machine_extruder_start_code": { "default_value": "G0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000\nM109 S{material_final_print_temperature}\nG4 S5\nG91\nG0 Z-0.4 F600\nG90\nM107 P{(extruder_nr+1)%2}\nM106 P{extruder_nr} S{cool_fan_speed*255/100}" }, "machine_extruder_start_code": { "default_value": "G0 X{prime_tower_position_x - prime_tower_size/2} Y{prime_tower_position_y + prime_tower_size/2} F6000\nM104 S{material_print_temperature}\nG4 S5\nG91\nG0 Z-0.4 F600\nG90\nM107 P{(extruder_nr+1)%2}\nM106 P{extruder_nr} S{cool_fan_speed/100}" },
"machine_extruder_start_code_duration": { "default_value": 10 },
"machine_nozzle_offset_x": { "default_value": 0 }, "machine_nozzle_offset_x": { "default_value": 0 },
"machine_nozzle_offset_y": { "default_value": 0 }, "machine_nozzle_offset_y": { "default_value": 0 },
"machine_nozzle_size": { "default_value": 0.4 }, "machine_nozzle_size": { "default_value": 0.4 },

View File

@ -3548,14 +3548,6 @@ msgctxt "support_bottom_height description"
msgid "The thickness of the support floors. This controls the number of dense layers that are printed on top of places of a model on which support rests." msgid "The thickness of the support floors. This controls the number of dense layers that are printed on top of places of a model on which support rests."
msgstr "" msgstr ""
msgctxt "support_interface_skip_height label"
msgid "Support Interface Resolution"
msgstr ""
msgctxt "support_interface_skip_height description"
msgid "When checking where there's model above and below the support, take steps of the given height. Lower values will slice slower, while higher values may cause normal support to be printed in some places where there should have been support interface."
msgstr ""
msgctxt "support_interface_density label" msgctxt "support_interface_density label"
msgid "Support Interface Density" msgid "Support Interface Density"
msgstr "" msgstr ""

View File

@ -120,8 +120,8 @@ Item
text: catalog.i18nc("@action:inmenu menubar:edit", "&Undo") text: catalog.i18nc("@action:inmenu menubar:edit", "&Undo")
icon.name: "edit-undo" icon.name: "edit-undo"
shortcut: StandardKey.Undo shortcut: StandardKey.Undo
onTriggered: UM.OperationStack.undo() onTriggered: CuraActions.undo()
enabled: UM.OperationStack.canUndo enabled: CuraActions.canUndo
} }
Action Action
@ -130,8 +130,8 @@ Item
text: catalog.i18nc("@action:inmenu menubar:edit", "&Redo") text: catalog.i18nc("@action:inmenu menubar:edit", "&Redo")
icon.name: "edit-redo" icon.name: "edit-redo"
shortcut: StandardKey.Redo shortcut: StandardKey.Redo
onTriggered: UM.OperationStack.redo() onTriggered: CuraActions.redo()
enabled: UM.OperationStack.canRedo enabled: CuraActions.canRedo
} }
Action Action

View File

@ -58,7 +58,7 @@ UM.Dialog
UM.Label UM.Label
{ {
id: version id: version
text: catalog.i18nc("@label","version: %1").arg(UM.Application.version) text: catalog.i18nc("@label","version: %1").arg(CuraApplication.version())
font: UM.Theme.getFont("large_bold") font: UM.Theme.getFont("large_bold")
color: UM.Theme.getColor("button_text") color: UM.Theme.getColor("button_text")
anchors.right : logo.right anchors.right : logo.right

View File

@ -124,6 +124,9 @@ UM.PreferencesPage
UM.Preferences.resetPreference("info/send_engine_crash") UM.Preferences.resetPreference("info/send_engine_crash")
sendEngineCrashCheckbox.checked = boolCheck(UM.Preferences.getValue("info/send_engine_crash")) sendEngineCrashCheckbox.checked = boolCheck(UM.Preferences.getValue("info/send_engine_crash"))
UM.Preferences.resetPreference("info/anonymous_engine_crash_report")
sendEngineCrashCheckboxAnonymous.checked = boolCheck(UM.Preferences.getValue("info/anonymous_engine_crash_report"))
UM.Preferences.resetPreference("info/automatic_update_check") UM.Preferences.resetPreference("info/automatic_update_check")
checkUpdatesCheckbox.checked = boolCheck(UM.Preferences.getValue("info/automatic_update_check")) checkUpdatesCheckbox.checked = boolCheck(UM.Preferences.getValue("info/automatic_update_check"))
@ -859,21 +862,63 @@ UM.PreferencesPage
font: UM.Theme.getFont("medium_bold") font: UM.Theme.getFont("medium_bold")
text: catalog.i18nc("@label", "Privacy") text: catalog.i18nc("@label", "Privacy")
} }
UM.TooltipArea UM.TooltipArea
{ {
width: childrenRect.width width: childrenRect.width
height: visible ? childrenRect.height : 0 height: visible ? childrenRect.height : 0
text: catalog.i18nc("@info:tooltip", "Should slicing crashes be automatically reported to Ultimaker? Note, no models, IP addresses or other personally identifiable information is sent or stored.") text: catalog.i18nc("@info:tooltip", "Should slicing crashes be automatically reported to Ultimaker? Note, no models, IP addresses or other personally identifiable information is sent or stored, unless you give explicit permission.")
UM.CheckBox UM.CheckBox
{ {
id: sendEngineCrashCheckbox id: sendEngineCrashCheckbox
text: catalog.i18nc("@option:check","Send (anonymous) engine crash reports") text: catalog.i18nc("@option:check","Send engine crash reports")
checked: boolCheck(UM.Preferences.getValue("info/send_engine_crash")) checked: boolCheck(UM.Preferences.getValue("info/send_engine_crash"))
onCheckedChanged: UM.Preferences.setValue("info/send_engine_crash", checked) onCheckedChanged: UM.Preferences.setValue("info/send_engine_crash", checked)
} }
} }
ButtonGroup
{
id: curaCrashGroup
buttons: [sendEngineCrashCheckboxAnonymous, sendEngineCrashCheckboxUser]
}
UM.TooltipArea
{
width: childrenRect.width
height: visible ? childrenRect.height : 0
text: catalog.i18nc("@info:tooltip", "Send crash reports without any personally identifiable information or models data to UltiMaker.")
anchors.left: parent.left
anchors.leftMargin: UM.Theme.getSize("default_margin").width
Cura.RadioButton
{
id: sendEngineCrashCheckboxAnonymous
text: catalog.i18nc("@option:radio", "Anonymous crash reports")
enabled: sendEngineCrashCheckbox.checked && Cura.API.account.isLoggedIn
checked: boolCheck(UM.Preferences.getValue("info/anonymous_engine_crash_report"))
onClicked: UM.Preferences.setValue("info/anonymous_engine_crash_report", true)
}
}
UM.TooltipArea
{
width: childrenRect.width
height: visible ? childrenRect.height : 0
text: Cura.API.account.isLoggedIn ?
catalog.i18nc("@info:tooltip", "Send crash reports with your registered UltiMaker account name and the project name to UltiMaker Sentry. No actual model data is being send.") :
catalog.i18nc("@info:tooltip", "Please sign in to your UltiMaker account to allow sending non-anonymous data.")
anchors.left: parent.left
anchors.leftMargin: UM.Theme.getSize("default_margin").width
Cura.RadioButton
{
id: sendEngineCrashCheckboxUser
text: catalog.i18nc("@option:radio", "Include UltiMaker account name")
enabled: sendEngineCrashCheckbox.checked && Cura.API.account.isLoggedIn
checked: !boolCheck(UM.Preferences.getValue("info/anonymous_engine_crash_report")) && Cura.API.account.isLoggedIn
onClicked: UM.Preferences.setValue("info/anonymous_engine_crash_report", false)
}
}
UM.TooltipArea UM.TooltipArea
{ {
width: childrenRect.width width: childrenRect.width

View File

@ -12,6 +12,7 @@ import Cura 1.0 as Cura
UM.ManagementPage UM.ManagementPage
{ {
id: base id: base
property var machineActionManager: CuraApplication.getMachineActionManagerQml()
Item { enabled: false; UM.I18nCatalog { id: catalog; name: "cura"} } Item { enabled: false; UM.I18nCatalog { id: catalog; name: "cura"} }
title: catalog.i18nc("@title:tab", "Printers") title: catalog.i18nc("@title:tab", "Printers")
@ -58,10 +59,11 @@ UM.ManagementPage
anchors.fill: parent anchors.fill: parent
spacing: UM.Theme.getSize("default_margin").height spacing: UM.Theme.getSize("default_margin").height
Repeater Repeater
{ {
id: machineActionRepeater id: machineActionRepeater
model: base.currentItem ? Cura.MachineActionManager.getSupportedActions(Cura.MachineManager.getDefinitionByMachineId(base.currentItem.id)) : null model: base.currentItem ? machineActionManager.getSupportedActions(Cura.MachineManager.getDefinitionByMachineId(base.currentItem.id)) : null
Item Item
{ {

View File

@ -160,7 +160,7 @@ Item
ProfileWarningReset ProfileWarningReset
{ {
id: profileWarningReset id: profileWarningReset
width: childrenRect.width width: parent.width
anchors.right: parent.right anchors.right: parent.right
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
fullWarning: false fullWarning: false

View File

@ -187,7 +187,7 @@ Popup
//Add all the custom profiles. //Add all the custom profiles.
Repeater Repeater
{ {
model: Cura.CustomQualityProfilesDropDownMenuModel model: CuraApplication.getCustomQualityProfilesDropDownMenuModel()
MenuButton MenuButton
{ {
onClicked: Cura.MachineManager.setQualityChangesGroup(model.quality_changes_group) onClicked: Cura.MachineManager.setQualityChangesGroup(model.quality_changes_group)

View File

@ -11,7 +11,7 @@ import "../Dialogs"
Item Item
{ {
property bool fullWarning: true // <- Can you see the warning icon and the text, or is it just the buttons? property bool fullWarning: true // <- Can you see the warning icon and the text, or is it just the buttons?
property var simpleModeSettingsManager :CuraApplication.getSimpleModeSettingsManager()
height: visible ? UM.Theme.getSize("action_button_icon").height : 0 height: visible ? UM.Theme.getSize("action_button_icon").height : 0
width: visible ? childrenRect.width: 0 width: visible ? childrenRect.width: 0
visible: Cura.MachineManager.hasUserSettings || (fullWarning && Cura.MachineManager.hasCustomQuality) visible: Cura.MachineManager.hasUserSettings || (fullWarning && Cura.MachineManager.hasCustomQuality)
@ -96,7 +96,7 @@ Item
State State
{ {
name: "custom settings changed" name: "custom settings changed"
when: Cura.SimpleModeSettingsManager.isProfileCustomized when: simpleModeSettingsManager.isProfileCustomized
PropertyChanges PropertyChanges
{ {
target: warning target: warning

View File

@ -223,7 +223,7 @@ SettingItem
cursorShape: Qt.IBeamCursor cursorShape: Qt.IBeamCursor
onPressed: { onPressed:(mouse)=> {
if (!input.activeFocus) if (!input.activeFocus)
{ {
base.focusGainedByClick = true base.focusGainedByClick = true

View File

@ -203,7 +203,7 @@ Item
x: UM.Theme.getSize("default_margin").width x: UM.Theme.getSize("default_margin").width
y: UM.Theme.getSize("default_margin").height y: UM.Theme.getSize("default_margin").height
source: UM.ActiveTool.valid ? UM.ActiveTool.activeToolPanel : "" source: UM.Controller.valid ? UM.Controller.activeToolPanel : ""
enabled: UM.Controller.toolsEnabled enabled: UM.Controller.toolsEnabled
} }
} }
@ -222,7 +222,7 @@ Item
UM.Label UM.Label
{ {
id: toolHint id: toolHint
text: UM.ActiveTool.properties.getValue("ToolHint") != undefined ? UM.ActiveTool.properties.getValue("ToolHint") : "" text: UM.Controller.properties.getValue("ToolHint") != undefined ? UM.ActiveTool.properties.getValue("ToolHint") : ""
color: UM.Theme.getColor("tooltip_text") color: UM.Theme.getColor("tooltip_text")
anchors.horizontalCenter: parent.horizontalCenter anchors.horizontalCenter: parent.horizontalCenter
} }

View File

@ -33,7 +33,6 @@ support_infill_rate = 20
support_interface_enable = True support_interface_enable = True
support_interface_height = 0.60 support_interface_height = 0.60
support_interface_pattern = zigzag support_interface_pattern = zigzag
support_interface_skip_height = 0.30
support_offset = 0.8 support_offset = 0.8
support_z_distance = 0.4 support_z_distance = 0.4
wall_thickness = 1.6 wall_thickness = 1.6

View File

@ -33,7 +33,6 @@ support_infill_rate = 20
support_interface_enable = True support_interface_enable = True
support_interface_height = 0.60 support_interface_height = 0.60
support_interface_pattern = zigzag support_interface_pattern = zigzag
support_interface_skip_height = 0.20
support_offset = 0.8 support_offset = 0.8
support_z_distance = 0.3 support_z_distance = 0.3
wall_thickness = 1.6 wall_thickness = 1.6

View File

@ -33,7 +33,6 @@ support_infill_rate = 20
support_interface_enable = True support_interface_enable = True
support_interface_height = 0.30 support_interface_height = 0.30
support_interface_pattern = zigzag support_interface_pattern = zigzag
support_interface_skip_height = 0.06
support_offset = 0.8 support_offset = 0.8
support_z_distance = 0.12 support_z_distance = 0.12
wall_thickness = 1.6 wall_thickness = 1.6

View File

@ -33,7 +33,6 @@ support_infill_rate = 20
support_interface_enable = True support_interface_enable = True
support_interface_height = 0.30 support_interface_height = 0.30
support_interface_pattern = zigzag support_interface_pattern = zigzag
support_interface_skip_height = 0.10
support_offset = 0.8 support_offset = 0.8
support_z_distance = 0.2 support_z_distance = 0.2
wall_thickness = 1.6 wall_thickness = 1.6

View File

@ -33,7 +33,6 @@ support_infill_rate = 20
support_interface_enable = True support_interface_enable = True
support_interface_height = 0.45 support_interface_height = 0.45
support_interface_pattern = zigzag support_interface_pattern = zigzag
support_interface_skip_height = 0.15
support_offset = 0.8 support_offset = 0.8
support_z_distance = 0.25 support_z_distance = 0.25
wall_thickness = 1.6 wall_thickness = 1.6

View File

@ -33,7 +33,6 @@ support_infill_rate = 20
support_interface_enable = True support_interface_enable = True
support_interface_height = 0.60 support_interface_height = 0.60
support_interface_pattern = zigzag support_interface_pattern = zigzag
support_interface_skip_height = 0.30
support_offset = 0.8 support_offset = 0.8
support_z_distance = 0.2 support_z_distance = 0.2
wall_thickness = 0.8 wall_thickness = 0.8

View File

@ -33,7 +33,6 @@ support_infill_rate = 20
support_interface_enable = True support_interface_enable = True
support_interface_height = 0.40 support_interface_height = 0.40
support_interface_pattern = zigzag support_interface_pattern = zigzag
support_interface_skip_height = 0.20
support_offset = 0.8 support_offset = 0.8
support_z_distance = 0.2 support_z_distance = 0.2
wall_thickness = 0.8 wall_thickness = 0.8

View File

@ -33,7 +33,6 @@ support_infill_rate = 20
support_interface_enable = True support_interface_enable = True
support_interface_height = 0.30 support_interface_height = 0.30
support_interface_pattern = zigzag support_interface_pattern = zigzag
support_interface_skip_height = 0.06
support_offset = 0.8 support_offset = 0.8
support_z_distance = 0.2 support_z_distance = 0.2
wall_thickness = 0.8 wall_thickness = 0.8

View File

@ -33,7 +33,6 @@ support_infill_rate = 20
support_interface_enable = True support_interface_enable = True
support_interface_height = 0.30 support_interface_height = 0.30
support_interface_pattern = zigzag support_interface_pattern = zigzag
support_interface_skip_height = 0.10
support_offset = 0.8 support_offset = 0.8
support_z_distance = 0.2 support_z_distance = 0.2
wall_thickness = 0.8 wall_thickness = 0.8

View File

@ -33,7 +33,6 @@ support_infill_rate = 20
support_interface_enable = True support_interface_enable = True
support_interface_height = 0.45 support_interface_height = 0.45
support_interface_pattern = zigzag support_interface_pattern = zigzag
support_interface_skip_height = 0.15
support_offset = 0.8 support_offset = 0.8
support_z_distance = 0.2 support_z_distance = 0.2
wall_thickness = 0.8 wall_thickness = 0.8

View File

@ -65,7 +65,6 @@ support_interface_density = 60
support_interface_enable = True support_interface_enable = True
support_interface_height = 0.96 support_interface_height = 0.96
support_interface_pattern = grid support_interface_pattern = grid
support_interface_skip_height = 0.12
support_roof_density = 60 support_roof_density = 60
support_type = everywhere support_type = everywhere
support_wall_count = 1 support_wall_count = 1

View File

@ -65,7 +65,6 @@ support_interface_density = 60
support_interface_enable = True support_interface_enable = True
support_interface_height = 0.6 support_interface_height = 0.6
support_interface_pattern = grid support_interface_pattern = grid
support_interface_skip_height = 0.2
support_roof_density = 60 support_roof_density = 60
support_type = everywhere support_type = everywhere
support_wall_count = 1 support_wall_count = 1

View File

@ -100,7 +100,6 @@ support_interface_density = 70
support_interface_enable = True support_interface_enable = True
support_interface_height = 0.6 support_interface_height = 0.6
support_interface_pattern = lines support_interface_pattern = lines
support_interface_skip_height = 0.2
support_pattern = zigzag support_pattern = zigzag
support_roof_density = 70 support_roof_density = 70
support_type = everywhere support_type = everywhere

View File

@ -65,7 +65,6 @@ support_interface_density = 70
support_interface_enable = True support_interface_enable = True
support_interface_height = 2 support_interface_height = 2
support_interface_pattern = concentric support_interface_pattern = concentric
support_interface_skip_height = 0.1
support_type = everywhere support_type = everywhere
support_use_towers = False support_use_towers = False
support_xy_distance = 0.8 support_xy_distance = 0.8

View File

@ -65,7 +65,6 @@ support_interface_density = 70
support_interface_enable = True support_interface_enable = True
support_interface_height = 2 support_interface_height = 2
support_interface_pattern = concentric support_interface_pattern = concentric
support_interface_skip_height = 0.1
support_type = everywhere support_type = everywhere
support_use_towers = False support_use_towers = False
support_xy_distance = 0.8 support_xy_distance = 0.8

View File

@ -65,7 +65,6 @@ support_interface_density = 70
support_interface_enable = True support_interface_enable = True
support_interface_height = 2 support_interface_height = 2
support_interface_pattern = concentric support_interface_pattern = concentric
support_interface_skip_height = 0.1
support_type = everywhere support_type = everywhere
support_use_towers = False support_use_towers = False
support_xy_distance = 0.8 support_xy_distance = 0.8

View File

@ -65,7 +65,6 @@ support_interface_density = 70
support_interface_enable = True support_interface_enable = True
support_interface_height = 2 support_interface_height = 2
support_interface_pattern = concentric support_interface_pattern = concentric
support_interface_skip_height = 0.1
support_type = everywhere support_type = everywhere
support_use_towers = False support_use_towers = False
support_xy_distance = 0.8 support_xy_distance = 0.8

View File

@ -65,7 +65,6 @@ support_interface_density = 70
support_interface_enable = True support_interface_enable = True
support_interface_height = 2 support_interface_height = 2
support_interface_pattern = concentric support_interface_pattern = concentric
support_interface_skip_height = 0.1
support_type = everywhere support_type = everywhere
support_use_towers = False support_use_towers = False
support_xy_distance = 0.8 support_xy_distance = 0.8

View File

@ -65,7 +65,6 @@ support_interface_density = 70
support_interface_enable = True support_interface_enable = True
support_interface_height = 2 support_interface_height = 2
support_interface_pattern = concentric support_interface_pattern = concentric
support_interface_skip_height = 0.1
support_type = everywhere support_type = everywhere
support_use_towers = False support_use_towers = False
support_xy_distance = 0.8 support_xy_distance = 0.8

View File

@ -65,7 +65,6 @@ support_interface_density = 70
support_interface_enable = True support_interface_enable = True
support_interface_height = 2 support_interface_height = 2
support_interface_pattern = concentric support_interface_pattern = concentric
support_interface_skip_height = 0.1
support_type = everywhere support_type = everywhere
support_use_towers = False support_use_towers = False
support_xy_distance = 0.8 support_xy_distance = 0.8

View File

@ -65,7 +65,6 @@ support_interface_density = 70
support_interface_enable = True support_interface_enable = True
support_interface_height = 2 support_interface_height = 2
support_interface_pattern = concentric support_interface_pattern = concentric
support_interface_skip_height = 0.1
support_type = everywhere support_type = everywhere
support_use_towers = False support_use_towers = False
support_xy_distance = 0.8 support_xy_distance = 0.8

View File

@ -293,7 +293,6 @@ support_bottom_wall_count
support_interface_height support_interface_height
support_roof_height support_roof_height
support_bottom_height support_bottom_height
support_interface_skip_height
support_interface_density support_interface_density
support_roof_density support_roof_density
support_bottom_density support_bottom_density

View File

@ -21,7 +21,6 @@ support_interface_density = 100
support_interface_enable = True support_interface_enable = True
support_interface_height = =layer_height * 5 support_interface_height = =layer_height * 5
support_interface_pattern = concentric support_interface_pattern = concentric
support_interface_skip_height = =layer_height
support_join_distance = 3 support_join_distance = 3
support_offset = 3 support_offset = 3
support_pattern = triangles support_pattern = triangles

View File

@ -21,7 +21,6 @@ support_interface_density = 100
support_interface_enable = True support_interface_enable = True
support_interface_height = =layer_height * 5 support_interface_height = =layer_height * 5
support_interface_pattern = concentric support_interface_pattern = concentric
support_interface_skip_height = =layer_height
support_join_distance = 3 support_join_distance = 3
support_offset = 3 support_offset = 3
support_pattern = triangles support_pattern = triangles

View File

@ -21,7 +21,6 @@ support_interface_density = 100
support_interface_enable = True support_interface_enable = True
support_interface_height = =layer_height * 5 support_interface_height = =layer_height * 5
support_interface_pattern = concentric support_interface_pattern = concentric
support_interface_skip_height = =layer_height
support_join_distance = 3 support_join_distance = 3
support_offset = 3 support_offset = 3
support_pattern = triangles support_pattern = triangles

View File

@ -21,7 +21,6 @@ support_interface_density = 100
support_interface_enable = True support_interface_enable = True
support_interface_height = =layer_height * 5 support_interface_height = =layer_height * 5
support_interface_pattern = concentric support_interface_pattern = concentric
support_interface_skip_height = =layer_height
support_join_distance = 3 support_join_distance = 3
support_offset = 3 support_offset = 3
support_pattern = triangles support_pattern = triangles

View File

@ -21,7 +21,6 @@ support_interface_density = 100
support_interface_enable = True support_interface_enable = True
support_interface_height = =layer_height * 5 support_interface_height = =layer_height * 5
support_interface_pattern = concentric support_interface_pattern = concentric
support_interface_skip_height = =layer_height
support_join_distance = 3 support_join_distance = 3
support_offset = 3 support_offset = 3
support_pattern = triangles support_pattern = triangles

View File

@ -21,7 +21,6 @@ support_interface_density = 100
support_interface_enable = True support_interface_enable = True
support_interface_height = =layer_height * 5 support_interface_height = =layer_height * 5
support_interface_pattern = concentric support_interface_pattern = concentric
support_interface_skip_height = =layer_height
support_join_distance = 3 support_join_distance = 3
support_offset = 3 support_offset = 3
support_pattern = triangles support_pattern = triangles

View File

@ -21,7 +21,6 @@ support_interface_density = 100
support_interface_enable = True support_interface_enable = True
support_interface_height = =layer_height * 5 support_interface_height = =layer_height * 5
support_interface_pattern = concentric support_interface_pattern = concentric
support_interface_skip_height = =layer_height
support_join_distance = 3 support_join_distance = 3
support_offset = 3 support_offset = 3
support_pattern = triangles support_pattern = triangles

View File

@ -21,7 +21,6 @@ support_interface_density = 100
support_interface_enable = True support_interface_enable = True
support_interface_height = =layer_height * 5 support_interface_height = =layer_height * 5
support_interface_pattern = concentric support_interface_pattern = concentric
support_interface_skip_height = =layer_height
support_join_distance = 3 support_join_distance = 3
support_offset = 3 support_offset = 3
support_pattern = triangles support_pattern = triangles

View File

@ -21,7 +21,6 @@ support_interface_density = 100
support_interface_enable = True support_interface_enable = True
support_interface_height = =layer_height * 5 support_interface_height = =layer_height * 5
support_interface_pattern = concentric support_interface_pattern = concentric
support_interface_skip_height = =layer_height
support_join_distance = 3 support_join_distance = 3
support_offset = 3 support_offset = 3
support_pattern = triangles support_pattern = triangles

View File

@ -21,7 +21,6 @@ support_interface_density = 100
support_interface_enable = True support_interface_enable = True
support_interface_height = =layer_height * 5 support_interface_height = =layer_height * 5
support_interface_pattern = concentric support_interface_pattern = concentric
support_interface_skip_height = =layer_height
support_join_distance = 3 support_join_distance = 3
support_offset = 3 support_offset = 3
support_pattern = triangles support_pattern = triangles

View File

@ -21,7 +21,6 @@ support_interface_density = 100
support_interface_enable = True support_interface_enable = True
support_interface_height = =layer_height * 5 support_interface_height = =layer_height * 5
support_interface_pattern = concentric support_interface_pattern = concentric
support_interface_skip_height = =layer_height
support_join_distance = 3 support_join_distance = 3
support_offset = 3 support_offset = 3
support_pattern = triangles support_pattern = triangles

View File

@ -21,7 +21,6 @@ support_interface_density = 100
support_interface_enable = True support_interface_enable = True
support_interface_height = =layer_height * 5 support_interface_height = =layer_height * 5
support_interface_pattern = concentric support_interface_pattern = concentric
support_interface_skip_height = =layer_height
support_join_distance = 3 support_join_distance = 3
support_offset = 3 support_offset = 3
support_pattern = triangles support_pattern = triangles

View File

@ -21,7 +21,6 @@ support_interface_density = 100
support_interface_enable = True support_interface_enable = True
support_interface_height = =layer_height * 5 support_interface_height = =layer_height * 5
support_interface_pattern = concentric support_interface_pattern = concentric
support_interface_skip_height = =layer_height
support_join_distance = 3 support_join_distance = 3
support_offset = 3 support_offset = 3
support_pattern = triangles support_pattern = triangles

View File

@ -21,7 +21,6 @@ support_interface_density = 100
support_interface_enable = True support_interface_enable = True
support_interface_height = =layer_height * 5 support_interface_height = =layer_height * 5
support_interface_pattern = concentric support_interface_pattern = concentric
support_interface_skip_height = =layer_height
support_join_distance = 3 support_join_distance = 3
support_offset = 3 support_offset = 3
support_pattern = triangles support_pattern = triangles

View File

@ -21,7 +21,6 @@ support_interface_density = 100
support_interface_enable = True support_interface_enable = True
support_interface_height = =layer_height * 5 support_interface_height = =layer_height * 5
support_interface_pattern = concentric support_interface_pattern = concentric
support_interface_skip_height = =layer_height
support_join_distance = 3 support_join_distance = 3
support_offset = 3 support_offset = 3
support_pattern = triangles support_pattern = triangles

View File

@ -21,7 +21,6 @@ support_interface_density = 100
support_interface_enable = True support_interface_enable = True
support_interface_height = =layer_height * 5 support_interface_height = =layer_height * 5
support_interface_pattern = concentric support_interface_pattern = concentric
support_interface_skip_height = =layer_height
support_join_distance = 3 support_join_distance = 3
support_offset = 3 support_offset = 3
support_pattern = triangles support_pattern = triangles

View File

@ -21,7 +21,6 @@ support_interface_density = 100
support_interface_enable = True support_interface_enable = True
support_interface_height = =layer_height * 5 support_interface_height = =layer_height * 5
support_interface_pattern = concentric support_interface_pattern = concentric
support_interface_skip_height = =layer_height
support_join_distance = 3 support_join_distance = 3
support_offset = 3 support_offset = 3
support_pattern = triangles support_pattern = triangles

View File

@ -21,7 +21,6 @@ support_interface_density = 100
support_interface_enable = True support_interface_enable = True
support_interface_height = =layer_height * 5 support_interface_height = =layer_height * 5
support_interface_pattern = concentric support_interface_pattern = concentric
support_interface_skip_height = =layer_height
support_join_distance = 3 support_join_distance = 3
support_offset = 3 support_offset = 3
support_pattern = triangles support_pattern = triangles