Merge branch 'main' into PP-441-Generic-PEKK-profile

This commit is contained in:
Casper Lamboo 2024-03-07 16:19:05 +01:00 committed by GitHub
commit 26d181c695
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
71 changed files with 9843 additions and 259 deletions

View File

@ -4,7 +4,7 @@ requirements:
- "curaengine/(latest)@ultimaker/testing"
- "cura_binary_data/(latest)@ultimaker/testing"
- "fdm_materials/(latest)@ultimaker/testing"
- "curaengine_plugin_gradual_flow/0.1.0-beta.2"
- "curaengine_plugin_gradual_flow/0.1.0-beta.3"
- "dulcificum/latest@ultimaker/testing"
- "pysavitar/5.3.0"
- "pynest2d/5.3.0"

View File

@ -1,6 +1,5 @@
# Copyright (c) 2023 UltiMaker
# Cura is released under the terms of the LGPLv3 or higher.
from typing import List, cast
from PyQt6.QtCore import QObject, QUrl, pyqtSignal, pyqtProperty
@ -33,7 +32,6 @@ from cura.Operations.SetBuildPlateNumberOperation import SetBuildPlateNumberOper
from UM.Logger import Logger
from UM.Scene.SceneNode import SceneNode
class CuraActions(QObject):
def __init__(self, parent: QObject = None) -> None:
super().__init__(parent)

View File

@ -601,9 +601,7 @@ class CuraApplication(QtApplication):
preferences.addPreference("mesh/scale_to_fit", False)
preferences.addPreference("mesh/scale_tiny_meshes", True)
preferences.addPreference("cura/dialog_on_project_save", True)
preferences.addPreference("cura/dialog_on_ucp_project_save", True)
preferences.addPreference("cura/asked_dialog_on_project_save", False)
preferences.addPreference("cura/asked_dialog_on_ucp_project_save", False)
preferences.addPreference("cura/choice_on_profile_override", "always_ask")
preferences.addPreference("cura/choice_on_open_project", "always_ask")
preferences.addPreference("cura/use_multi_build_plate", False)
@ -1979,6 +1977,17 @@ class CuraApplication(QtApplication):
openProjectFile = pyqtSignal(QUrl, bool, arguments = ["project_file", "add_to_recent_files"]) # Emitted when a project file is about to open.
@pyqtSlot(QUrl, bool)
def readLocalUcpFile(self, file: QUrl, add_to_recent_files: bool = True):
file_name = QUrl(file).toLocalFile()
workspace_reader = self.getWorkspaceFileHandler()
if workspace_reader is None:
Logger.warning(f"Workspace reader not found, cannot read file {file_name}.")
return
workspace_reader.readLocalFile(file, add_to_recent_files)
@pyqtSlot(QUrl, str, bool)
@pyqtSlot(QUrl, str)
@pyqtSlot(QUrl)
@ -2184,6 +2193,12 @@ class CuraApplication(QtApplication):
def addNonSliceableExtension(self, extension):
self._non_sliceable_extensions.append(extension)
@pyqtSlot(str, result = bool)
def isProjectUcp(self, file_url) -> bool:
file_path = QUrl(file_url).toLocalFile()
workspace_reader = self.getWorkspaceFileHandler().getReaderForFile(file_path)
return workspace_reader.getIsProjectUcp()
@pyqtSlot(str, result=bool)
def checkIsValidProjectFile(self, file_url):
"""Checks if the given file URL is a valid project file. """
@ -2193,6 +2208,8 @@ class CuraApplication(QtApplication):
if workspace_reader is None:
return False # non-project files won't get a reader
try:
if workspace_reader.getPluginId() == "3MFReader":
workspace_reader.clearOpenAsUcp()
result = workspace_reader.preRead(file_path, show_dialog=False)
return result == WorkspaceReader.PreReadResult.accepted
except:

View File

@ -5,7 +5,7 @@
# online cloud connected printers are represented within this ListModel. Additional information such as the number of
# connected printers for each printer type is gathered.
from typing import Optional, List, cast
from typing import Optional, List, cast, Dict, Any
from PyQt6.QtCore import Qt, QTimer, QObject, pyqtSlot, pyqtProperty, pyqtSignal
@ -30,10 +30,10 @@ class MachineListModel(ListModel):
ComponentTypeRole = Qt.ItemDataRole.UserRole + 8
IsNetworkedMachineRole = Qt.ItemDataRole.UserRole + 9
def __init__(self, parent: Optional[QObject] = None, machines_filter: List[GlobalStack] = None, listenToChanges: bool = True) -> None:
def __init__(self, parent: Optional[QObject] = None, machines_filter: List[GlobalStack] = None, listenToChanges: bool = True, showCloudPrinters: bool = False) -> None:
super().__init__(parent)
self._show_cloud_printers = False
self._show_cloud_printers = showCloudPrinters
self._machines_filter = machines_filter
self._catalog = i18nCatalog("cura")
@ -159,3 +159,8 @@ class MachineListModel(ListModel):
"machineCount": machine_count,
"catergory": "connected" if is_online else "other",
})
def getItems(self) -> Dict[str, Any]:
if self.count > 0:
return self.items
return {}

View File

@ -3,6 +3,7 @@
from PyQt6.QtCore import Qt
from UM.Logger import Logger
from UM.Settings.SettingDefinition import SettingDefinition
from UM.Qt.ListModel import ListModel
@ -19,6 +20,8 @@ class SpecificSettingsModel(ListModel):
self.addRoleName(self.ValueRole, "value")
self._i18n_catalog = None
self._update()
def addSettingsFromStack(self, stack, category, settings):
for setting, value in settings.items():
@ -27,7 +30,7 @@ class SpecificSettingsModel(ListModel):
setting_type = stack.getProperty(setting, "type")
if setting_type is not None:
# This is not very good looking, but will do for now
value = SettingDefinition.settingValueToString(setting_type, value) + " " + unit
value = str(SettingDefinition.settingValueToString(setting_type, value)) + " " + str(unit)
else:
value = str(value)
@ -36,3 +39,8 @@ class SpecificSettingsModel(ListModel):
"label": stack.getProperty(setting, "label"),
"value": value
})
def _update(self):
Logger.debug(f"Updating {self.__class__.__name__}")
self.setItems([])
return

View File

@ -117,6 +117,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
self._supported_extensions = [".3mf"]
self._dialog = WorkspaceDialog()
self._3mf_mesh_reader = None
self._is_ucp = None
self._container_registry = ContainerRegistry.getInstance()
# suffixes registered with the MimeTypes don't start with a dot '.'
@ -143,16 +144,17 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
self._old_new_materials: Dict[str, str] = {}
self._machine_info = None
self._load_profile = False
self._user_settings: Dict[str, Dict[str, Any]] = {}
def _clearState(self):
self._id_mapping = {}
self._old_new_materials = {}
self._machine_info = None
self._load_profile = False
self._user_settings = {}
def clearOpenAsUcp(self):
self._is_ucp = None
def getNewId(self, old_id: str):
"""Get a unique name based on the old_id. This is different from directly calling the registry in that it caches results.
@ -207,6 +209,16 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
return global_stack_file_list[0], extruder_stack_file_list
def _isProjectUcp(self, file_name) -> bool:
if self._is_ucp == None:
archive = zipfile.ZipFile(file_name, "r")
cura_file_names = [name for name in archive.namelist() if name.startswith("Cura/")]
self._is_ucp =True if USER_SETTINGS_PATH in cura_file_names else False
def getIsProjectUcp(self) -> bool:
return self._is_ucp
def preRead(self, file_name, show_dialog=True, *args, **kwargs):
"""Read some info so we can make decisions
@ -215,7 +227,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
we don't want to show a dialog.
"""
self._clearState()
self._isProjectUcp(file_name)
self._3mf_mesh_reader = Application.getInstance().getMeshFileHandler().getReaderForFile(file_name)
if self._3mf_mesh_reader and self._3mf_mesh_reader.preRead(file_name) == WorkspaceReader.PreReadResult.accepted:
pass
@ -242,7 +254,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
# Read definition containers
#
machine_definition_id = None
updatable_machines = None if is_ucp else []
updatable_machines = None if self._is_ucp else []
machine_definition_container_count = 0
extruder_definition_container_count = 0
definition_container_files = [name for name in cura_file_names if name.endswith(self._definition_container_suffix)]
@ -609,11 +621,13 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
# Load the user specifically exported settings
self._dialog.exportedSettingModel.clear()
if is_ucp:
self._dialog.setCurrentMachineName("")
if self._is_ucp:
try:
self._user_settings = json.loads(archive.open("Cura/user-settings.json").read().decode("utf-8"))
any_extruder_stack = ExtruderManager.getInstance().getExtruderStack(0)
actual_global_stack = CuraApplication.getInstance().getGlobalContainerStack()
self._dialog.setCurrentMachineName(actual_global_stack.id)
for stack_name, settings in self._user_settings.items():
if stack_name == 'global':
@ -658,15 +672,15 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
self._dialog.setVariantType(variant_type_name)
self._dialog.setHasObjectsOnPlate(Application.getInstance().platformActivity)
self._dialog.setMissingPackagesMetadata(missing_package_metadata)
self._dialog.setHasVisibleSelectSameProfileChanged(is_ucp)
self._dialog.setAllowCreatemachine(not is_ucp)
self._dialog.setAllowCreatemachine(not self._is_ucp)
self._dialog.setIsUcp(self._is_ucp)
self._dialog.show()
# Choosing the initially selected printer in MachineSelector
is_networked_machine = False
is_abstract_machine = False
if global_stack and isinstance(global_stack, GlobalStack):
if global_stack and isinstance(global_stack, GlobalStack) and not self._is_ucp:
# The machine included in the project file exists locally already, no need to change selected printers.
is_networked_machine = global_stack.hasNetworkedConnection()
is_abstract_machine = parseBool(existing_global_stack.getMetaDataEntry("is_abstract_machine", False))
@ -675,7 +689,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
elif self._dialog.updatableMachinesModel.count > 0:
# The machine included in the project file does not exist. There is another machine of the same type.
# This will always default to an abstract machine first.
machine = self._dialog.updatableMachinesModel.getItem(0)
machine = self._dialog.updatableMachinesModel.getItem(self._dialog.currentMachinePositionIndex)
machine_name = machine["name"]
is_networked_machine = machine["isNetworked"]
is_abstract_machine = machine["isAbstractMachine"]
@ -693,7 +707,6 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
self._dialog.setIsAbstractMachine(is_abstract_machine)
self._dialog.setMachineName(machine_name)
self._dialog.updateCompatibleMachine()
self._dialog.setSelectSameProfileChecked(self._dialog.isCompatibleMachine)
# Block until the dialog is closed.
self._dialog.waitForClose()
@ -701,8 +714,6 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
if self._dialog.getResult() == {}:
return WorkspaceReader.PreReadResult.cancelled
self._load_profile = not is_ucp or (self._dialog.selectSameProfileChecked and self._dialog.isCompatibleMachine)
self._resolve_strategies = self._dialog.getResult()
#
# There can be 3 resolve strategies coming from the dialog:
@ -717,7 +728,6 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
if key not in containers_found_dict or strategy is not None:
continue
self._resolve_strategies[key] = "override" if containers_found_dict[key] else "new"
return WorkspaceReader.PreReadResult.accepted
@call_on_qt_thread
@ -825,7 +835,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
for stack in extruder_stacks:
stack.setNextStack(global_stack, connect_signals = False)
if self._load_profile:
if not self._is_ucp:
Logger.log("d", "Workspace loading is checking definitions...")
# Get all the definition files & check if they exist. If not, add them.
definition_container_files = [name for name in cura_file_names if name.endswith(self._definition_container_suffix)]
@ -899,7 +909,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
QCoreApplication.processEvents() # Ensure that the GUI does not freeze.
if global_stack:
if self._load_profile:
if not self._is_ucp:
# Handle quality changes if any
self._processQualityChanges(global_stack)
@ -907,7 +917,8 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
self._applyChangesToMachine(global_stack, extruder_stack_dict)
else:
# Just clear the settings now, so that we can change the active machine without conflicts
self._clearMachineSettings(global_stack, extruder_stack_dict)
self._clearMachineSettings(global_stack, {})
Logger.log("d", "Workspace loading is notifying rest of the code of changes...")
# Actually change the active machine.
@ -917,9 +928,10 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
# function is running on the main thread (Qt thread), although those "changed" signals have been emitted, but
# they won't take effect until this function is done.
# To solve this, we schedule _updateActiveMachine() for later so it will have the latest data.
self._updateActiveMachine(global_stack)
if not self._load_profile:
if self._is_ucp:
# Now we have switched, apply the user settings
self._applyUserSettings(global_stack, extruder_stack_dict, self._user_settings)
@ -931,6 +943,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
base_file_name = os.path.basename(file_name)
self.setWorkspaceName(base_file_name)
self._is_ucp = None
return nodes, self._loadMetadata(file_name)
@staticmethod
@ -1309,39 +1322,40 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
machine_manager.setActiveMachine(global_stack.getId())
# Set metadata fields that are missing from the global stack
for key, value in self._machine_info.metadata_dict.items():
if key not in global_stack.getMetaData() and key not in _ignored_machine_network_metadata:
global_stack.setMetaDataEntry(key, value)
if not self._is_ucp:
for key, value in self._machine_info.metadata_dict.items():
if key not in global_stack.getMetaData() and key not in _ignored_machine_network_metadata:
global_stack.setMetaDataEntry(key, value)
if self._quality_changes_to_apply:
quality_changes_group_list = container_tree.getCurrentQualityChangesGroups()
quality_changes_group = next((qcg for qcg in quality_changes_group_list if qcg.name == self._quality_changes_to_apply), None)
if not quality_changes_group:
Logger.log("e", "Could not find quality_changes [%s]", self._quality_changes_to_apply)
return
machine_manager.setQualityChangesGroup(quality_changes_group, no_dialog = True)
else:
self._quality_type_to_apply = self._quality_type_to_apply.lower() if self._quality_type_to_apply else None
quality_group_dict = container_tree.getCurrentQualityGroups()
if self._quality_type_to_apply in quality_group_dict:
quality_group = quality_group_dict[self._quality_type_to_apply]
if self._quality_changes_to_apply !=None:
quality_changes_group_list = container_tree.getCurrentQualityChangesGroups()
quality_changes_group = next((qcg for qcg in quality_changes_group_list if qcg.name == self._quality_changes_to_apply), None)
if not quality_changes_group:
Logger.log("e", "Could not find quality_changes [%s]", self._quality_changes_to_apply)
return
machine_manager.setQualityChangesGroup(quality_changes_group, no_dialog = True)
else:
Logger.log("i", "Could not find quality type [%s], switch to default", self._quality_type_to_apply)
preferred_quality_type = global_stack.getMetaDataEntry("preferred_quality_type")
quality_group = quality_group_dict.get(preferred_quality_type)
if quality_group is None:
Logger.log("e", "Could not get preferred quality type [%s]", preferred_quality_type)
if quality_group is not None:
machine_manager.setQualityGroup(quality_group, no_dialog = True)
# Also apply intent if available
available_intent_category_list = IntentManager.getInstance().currentAvailableIntentCategories()
if self._intent_category_to_apply is not None and self._intent_category_to_apply in available_intent_category_list:
machine_manager.setIntentByCategory(self._intent_category_to_apply)
self._quality_type_to_apply = self._quality_type_to_apply.lower() if self._quality_type_to_apply else None
quality_group_dict = container_tree.getCurrentQualityGroups()
if self._quality_type_to_apply in quality_group_dict:
quality_group = quality_group_dict[self._quality_type_to_apply]
else:
# if no intent is provided, reset to the default (balanced) intent
machine_manager.resetIntents()
Logger.log("i", "Could not find quality type [%s], switch to default", self._quality_type_to_apply)
preferred_quality_type = global_stack.getMetaDataEntry("preferred_quality_type")
quality_group = quality_group_dict.get(preferred_quality_type)
if quality_group is None:
Logger.log("e", "Could not get preferred quality type [%s]", preferred_quality_type)
if quality_group is not None:
machine_manager.setQualityGroup(quality_group, no_dialog = True)
# Also apply intent if available
available_intent_category_list = IntentManager.getInstance().currentAvailableIntentCategories()
if self._intent_category_to_apply is not None and self._intent_category_to_apply in available_intent_category_list:
machine_manager.setIntentByCategory(self._intent_category_to_apply)
else:
# if no intent is provided, reset to the default (balanced) intent
machine_manager.resetIntents()
# Notify everything/one that is to notify about changes.
global_stack.containersChanged.emit(global_stack.getTop())

View File

@ -63,21 +63,22 @@ class WorkspaceDialog(QObject):
self._machine_name = ""
self._machine_type = ""
self._variant_type = ""
self._current_machine_name = ""
self._material_labels = []
self._extruders = []
self._objects_on_plate = False
self._is_printer_group = False
self._updatable_machines_model = MachineListModel(self, listenToChanges=False)
self._updatable_machines_model = MachineListModel(self, listenToChanges = False, showCloudPrinters = True)
self._missing_package_metadata: List[Dict[str, str]] = []
self._plugin_registry: PluginRegistry = CuraApplication.getInstance().getPluginRegistry()
self._install_missing_package_dialog: Optional[QObject] = None
self._is_abstract_machine = False
self._is_networked_machine = False
self._is_compatible_machine = False
self._has_visible_select_same_profile = False
self._select_same_profile_checked = True
self._allow_create_machine = True
self._exported_settings_model = SpecificSettingsModel()
self._current_machine_pos_index = 0
self._is_ucp = False
machineConflictChanged = pyqtSignal()
qualityChangesConflictChanged = pyqtSignal()
@ -102,8 +103,7 @@ class WorkspaceDialog(QObject):
isPrinterGroupChanged = pyqtSignal()
missingPackagesChanged = pyqtSignal()
isCompatibleMachineChanged = pyqtSignal()
hasVisibleSelectSameProfileChanged = pyqtSignal()
selectSameProfileCheckedChanged = pyqtSignal()
isUcpChanged = pyqtSignal()
@pyqtProperty(bool, notify = isPrinterGroupChanged)
def isPrinterGroup(self) -> bool:
@ -176,8 +176,30 @@ class WorkspaceDialog(QObject):
self._machine_name = machine_name
self.machineNameChanged.emit()
def setCurrentMachineName(self, machine: str) -> None:
self._current_machine_name = machine
@pyqtProperty(str, notify = machineNameChanged)
def currentMachineName(self) -> str:
return self._current_machine_name
@staticmethod
def getIndexOfCurrentMachine(list_of_dicts, key, value, defaultIndex):
for i, d in enumerate(list_of_dicts):
if d.get(key) == value: # found the dictionary
return i
return defaultIndex
@pyqtProperty(int, notify = machineNameChanged)
def currentMachinePositionIndex(self):
return self._current_machine_pos_index
@pyqtProperty(QObject, notify = updatableMachinesChanged)
def updatableMachinesModel(self) -> MachineListModel:
if self._current_machine_name != "":
self._current_machine_pos_index = self.getIndexOfCurrentMachine(self._updatable_machines_model.getItems(), "id", self._current_machine_name, defaultIndex = 0)
else:
self._current_machine_pos_index = 0
return cast(MachineListModel, self._updatable_machines_model)
def setUpdatableMachines(self, updatable_machines: List[GlobalStack]) -> None:
@ -318,23 +340,14 @@ class WorkspaceDialog(QObject):
def isCompatibleMachine(self) -> bool:
return self._is_compatible_machine
def setHasVisibleSelectSameProfileChanged(self, has_visible_select_same_profile):
if has_visible_select_same_profile != self._has_visible_select_same_profile:
self._has_visible_select_same_profile = has_visible_select_same_profile
self.hasVisibleSelectSameProfileChanged.emit()
def setIsUcp(self, isUcp: bool) -> None:
if isUcp != self._is_ucp:
self._is_ucp = isUcp
self.isUcpChanged.emit()
@pyqtProperty(bool, notify = hasVisibleSelectSameProfileChanged)
def hasVisibleSelectSameProfile(self):
return self._has_visible_select_same_profile
def setSelectSameProfileChecked(self, select_same_profile_checked):
if select_same_profile_checked != self._select_same_profile_checked:
self._select_same_profile_checked = select_same_profile_checked
self.selectSameProfileCheckedChanged.emit()
@pyqtProperty(bool, notify = selectSameProfileCheckedChanged, fset = setSelectSameProfileChecked)
def selectSameProfileChecked(self):
return self._select_same_profile_checked
@pyqtProperty(bool, notify=isUcpChanged)
def isUcp(self):
return self._is_ucp
def setAllowCreatemachine(self, allow_create_machine):
self._allow_create_machine = allow_create_machine
@ -343,7 +356,7 @@ class WorkspaceDialog(QObject):
def allowCreateMachine(self):
return self._allow_create_machine
@pyqtProperty(QObject, constant = True)
@pyqtProperty(QObject)
def exportedSettingModel(self):
return self._exported_settings_model

View File

@ -12,7 +12,7 @@ import Cura 1.1 as Cura
UM.Dialog
{
id: workspaceDialog
title: catalog.i18nc("@title:window", "Open Project")
title: manager.isUcp? catalog.i18nc("@title:window", "Open Universal Cura Project (UCP)"): catalog.i18nc("@title:window", "Open Project")
margin: UM.Theme.getSize("default_margin").width
minimumWidth: UM.Theme.getSize("modal_window_minimum").width
@ -28,7 +28,7 @@ UM.Dialog
UM.Label
{
id: titleLabel
text: catalog.i18nc("@action:title", "Summary - Cura Project")
text: manager.isUcp? catalog.i18nc("@action:title", "Summary - Open Universal Cura Project (UCP)"): catalog.i18nc("@action:title", "Summary - Cura Project")
font: UM.Theme.getFont("large")
anchors.top: parent.top
anchors.left: parent.left
@ -96,7 +96,7 @@ UM.Dialog
WorkspaceRow
{
leftLabelText: catalog.i18nc("@action:label", manager.isPrinterGroup ? "Printer Group" : "Printer Name")
rightLabelText: manager.machineName == catalog.i18nc("@button", "Create new") ? "" : manager.machineName
rightLabelText: manager.isUcp? manager.machineType: manager.machineName == catalog.i18nc("@button", "Create new") ? "" : manager.machineName
}
}
@ -159,7 +159,7 @@ UM.Dialog
WorkspaceSection
{
id: profileSection
title: catalog.i18nc("@action:label", "Profile settings")
title: manager.isUcp? catalog.i18nc("@action:label", "Suggested Profile settings"):catalog.i18nc("@action:label", "Profile settings")
iconSource: UM.Theme.getIcon("Sliders")
content: Column
{
@ -185,32 +185,44 @@ UM.Dialog
{
leftLabelText: catalog.i18nc("@action:label", "Not in profile")
rightLabelText: catalog.i18ncp("@action:label", "%1 override", "%1 overrides", manager.numUserSettings).arg(manager.numUserSettings)
visible: manager.numUserSettings != 0 && manager.selectSameProfileChecked && manager.isCompatibleMachine
visible: manager.numUserSettings != 0 && manager.isCompatibleMachine
}
WorkspaceRow
{
leftLabelText: catalog.i18nc("@action:label", "Derivative from")
rightLabelText: catalog.i18ncp("@action:label", "%1, %2 override", "%1, %2 overrides", manager.numSettingsOverridenByQualityChanges).arg(manager.qualityType).arg(manager.numSettingsOverridenByQualityChanges)
visible: manager.numSettingsOverridenByQualityChanges != 0 && manager.selectSameProfileChecked && manager.isCompatibleMachine
visible: manager.numSettingsOverridenByQualityChanges != 0 && manager.isCompatibleMachine
}
}
}
WorkspaceSection
{
id: ucpProfileSection
visible: manager.isUcp
title: catalog.i18nc("@action:label", "Settings Loaded from UCP file")
iconSource: UM.Theme.getIcon("Settings")
content: Column
{
id: ucpProfileSettingsValuesTable
spacing: UM.Theme.getSize("default_margin").height
leftPadding: UM.Theme.getSize("medium_button_icon").width + UM.Theme.getSize("default_margin").width
WorkspaceRow
{
leftLabelText: catalog.i18nc("@action:label", "Specific settings")
leftLabelText: catalog.i18nc("@action:label", "Settings Loaded from UCP file")
rightLabelText: catalog.i18ncp("@action:label", "%1 override", "%1 overrides", manager.exportedSettingModel.rowCount()).arg(manager.exportedSettingModel.rowCount())
buttonText: tableViewSpecificSettings.shouldBeVisible ? catalog.i18nc("@action:button", "Hide settings") : catalog.i18nc("@action:button", "Show settings")
visible: !manager.selectSameProfileChecked || !manager.isCompatibleMachine
onButtonClicked: tableViewSpecificSettings.shouldBeVisible = !tableViewSpecificSettings.shouldBeVisible
}
Cura.TableView
{
id: tableViewSpecificSettings
width: parent.width - parent.leftPadding - UM.Theme.getSize("default_margin").width
height: UM.Theme.getSize("card").height
visible: shouldBeVisible && (!manager.selectSameProfileChecked || !manager.isCompatibleMachine)
property bool shouldBeVisible: false
visible: shouldBeVisible && manager.isUcp
property bool shouldBeVisible: true
columnHeaders:
[
@ -227,15 +239,11 @@ UM.Dialog
}
}
UM.CheckBox
property var modelRows: manager.exportedSettingModel.items
onModelRowsChanged:
{
text: catalog.i18nc("@action:checkbox", "Select the same profile")
onEnabledChanged: manager.selectSameProfileChecked = enabled
tooltip: enabled ? "" : catalog.i18nc("@tooltip", "You can use the same profile only if you have the same printer as the project was published with")
visible: manager.hasVisibleSelectSameProfile && manager.isCompatibleMachine
checked: manager.selectSameProfileChecked
onCheckedChanged: manager.selectSameProfileChecked = checked
tableModel.clear()
tableModel.rows = modelRows
}
}
@ -245,7 +253,7 @@ UM.Dialog
id: qualityChangesResolveComboBox
model: resolveStrategiesModel
textRole: "label"
visible: manager.qualityChangesConflict
visible: manager.qualityChangesConflict && !manager.isUcp
contentLeftPadding: UM.Theme.getSize("default_margin").width + UM.Theme.getSize("narrow_margin").width
textFont: UM.Theme.getFont("medium")
@ -274,7 +282,7 @@ UM.Dialog
WorkspaceSection
{
id: materialSection
title: catalog.i18nc("@action:label", "Material settings")
title: manager.isUcp? catalog.i18nc("@action:label", "Suggested Material settings"): catalog.i18nc("@action:label", "Material settings")
iconSource: UM.Theme.getIcon("Spool")
content: Column
{
@ -299,7 +307,7 @@ UM.Dialog
id: materialResolveComboBox
model: resolveStrategiesModel
textRole: "label"
visible: manager.materialConflict
visible: manager.materialConflict && !manager.isUcp
contentLeftPadding: UM.Theme.getSize("default_margin").width + UM.Theme.getSize("narrow_margin").width
textFont: UM.Theme.getFont("medium")
@ -330,6 +338,7 @@ UM.Dialog
id: visibilitySection
title: catalog.i18nc("@action:label", "Setting visibility")
iconSource: UM.Theme.getIcon("Eye")
visible : !manager.isUcp
content: Column
{
spacing: UM.Theme.getSize("default_margin").height
@ -467,12 +476,13 @@ UM.Dialog
{
if (visible)
{
// Force relead the comboboxes
// Force reload the comboboxes
// Since this dialog is only created once the first time you open it, these comboxes need to be reloaded
// each time it is shown after the first time so that the indexes will update correctly.
materialSection.reloadValues()
profileSection.reloadValues()
printerSection.reloadValues()
ucpProfileSection.reloadValues()
}
}
}

View File

@ -84,7 +84,8 @@ Item
{
anchors.right: parent.right
anchors.verticalCenter: comboboxLabel.verticalCenter
color: UM.Theme.getColor("small_button_text")
icon: UM.Theme.getIcon("Information")
text: comboboxTooltipText
visible: comboboxTooltipText != ""
}

View File

@ -19,7 +19,7 @@ RowLayout
Layout.preferredWidth: UM.Theme.getSize("setting").width
checked: modelData.selected
onClicked: modelData.selected = checked
enabled: modelData.selectable
tooltip: modelData.selectable ? "" :catalog.i18nc("@tooltip", "This setting may not perform well while exporting to UCP. Users are asked to add it at their own risk.")
}
UM.Label
@ -30,9 +30,10 @@ RowLayout
UM.HelpIcon
{
UM.I18nCatalog { id: catalog; name: "cura" }
text: catalog.i18nc("@tooltip",
"This setting can't be exported because it depends on the used printer capacities")
"This setting may not perform well while exporting to UCP, Users are asked to add it at their own risk.")
visible: !modelData.selectable
}
}

View File

@ -61,43 +61,47 @@ class SettingsExportModel(QObject):
'top_skin_preshrink',
'interlocking_enable'}
def __init__(self, parent = None):
PER_MODEL_EXPORTABLE_SETTINGS_KEYS = {"anti_overhang_mesh",
"infill_mesh",
"cutting_mesh",
"support_mesh"}
def __init__(self, parent=None):
super().__init__(parent)
self._settings_groups = []
application = CuraApplication.getInstance()
# Display global settings
global_stack = application.getGlobalContainerStack()
self._settings_groups.append(SettingsExportGroup(global_stack,
"Global settings",
SettingsExportGroup.Category.Global,
self._exportSettings(global_stack)))
self._appendGlobalSettings(application)
self._appendExtruderSettings(application)
self._appendModelSettings(application)
# Display per-extruder settings
def _appendGlobalSettings(self, application):
global_stack = application.getGlobalContainerStack()
self._settings_groups.append(SettingsExportGroup(
global_stack, "Global settings", SettingsExportGroup.Category.Global, self._exportSettings(global_stack)))
def _appendExtruderSettings(self, application):
extruders_stacks = ExtruderManager.getInstance().getUsedExtruderStacks()
for extruder_stack in extruders_stacks:
color = ""
if extruder_stack.material:
color = extruder_stack.material.getMetaDataEntry("color_code")
color = extruder_stack.material.getMetaDataEntry("color_code") if extruder_stack.material else ""
self._settings_groups.append(SettingsExportGroup(
extruder_stack, "Extruder settings", SettingsExportGroup.Category.Extruder,
self._exportSettings(extruder_stack), extruder_index=extruder_stack.position, extruder_color=color))
self._settings_groups.append(SettingsExportGroup(extruder_stack,
"Extruder settings",
SettingsExportGroup.Category.Extruder,
self._exportSettings(extruder_stack),
extruder_index=extruder_stack.position,
extruder_color=color))
def _appendModelSettings(self, application):
scene = application.getController().getScene()
for scene_node in scene.getRoot().getChildren():
self._appendNodeSettings(scene_node, "Model settings", SettingsExportGroup.Category.Model)
def _appendNodeSettings(self, node, title_prefix, category):
stack = node.callDecoration("getStack")
if stack:
self._settings_groups.append(SettingsExportGroup(
stack, f"{title_prefix}", category, self._exportSettings(stack), node.getName()))
for child in node.getChildren():
self._appendNodeSettings(child, f"Children of {node.getName()}", SettingsExportGroup.Category.Model)
# Display per-model settings
scene_root = application.getController().getScene().getRoot()
for scene_node in scene_root.getChildren():
per_model_stack = scene_node.callDecoration("getStack")
if per_model_stack is not None:
self._settings_groups.append(SettingsExportGroup(per_model_stack,
"Model settings",
SettingsExportGroup.Category.Model,
self._exportSettings(per_model_stack),
scene_node.getName()))
@pyqtProperty(list, constant=True)
def settingsGroups(self) -> List[SettingsExportGroup]:
@ -107,8 +111,10 @@ class SettingsExportModel(QObject):
def _exportSettings(settings_stack):
user_settings_container = settings_stack.userChanges
user_keys = user_settings_container.getAllKeys()
exportable_settings = SettingsExportModel.EXPORTABLE_SETTINGS
settings_export = []
# Check whether any of the user keys exist in PER_MODEL_EXPORTABLE_SETTINGS_KEYS
is_exportable = any(key in SettingsExportModel.PER_MODEL_EXPORTABLE_SETTINGS_KEYS for key in user_keys)
for setting_to_export in user_keys:
label = settings_stack.getProperty(setting_to_export, "label")
@ -117,7 +123,6 @@ class SettingsExportModel(QObject):
setting_type = settings_stack.getProperty(setting_to_export, "type")
if setting_type is not None:
# This is not very good looking, but will do for now
value = f"{str(SettingDefinition.settingValueToString(setting_type, value))} {unit}"
else:
value = str(value)
@ -125,6 +130,6 @@ class SettingsExportModel(QObject):
settings_export.append(SettingExport(setting_to_export,
label,
value,
setting_to_export in SettingsExportModel.EXPORTABLE_SETTINGS))
is_exportable or setting_to_export in exportable_settings))
return settings_export

View File

@ -462,40 +462,5 @@ class ThreeMFWriter(MeshWriter):
return extra_settings
def exportUcp(self):
preferences = CuraApplication.getInstance().getPreferences()
if preferences.getValue("cura/dialog_on_ucp_project_save"):
self._config_dialog = UCPDialog()
self._config_dialog.show()
else:
application = CuraApplication.getInstance()
workspace_handler = application.getInstance().getWorkspaceFileHandler()
# Set the model to the workspace writer
mesh_writer = workspace_handler.getWriter("3MFWriter")
mesh_writer.setExportModel(SettingsExportModel())
# Open file dialog and write the file
device = application.getOutputDeviceManager().getOutputDevice("local_file")
nodes = [application.getController().getScene().getRoot()]
file_name = CuraApplication.getInstance().getPrintInformation().baseName
try:
device.requestWrite(
nodes,
file_name,
["application/vnd.ms-package.3dmanufacturing-3dmodel+xml"],
workspace_handler,
preferred_mimetype_list="application/vnd.ms-package.3dmanufacturing-3dmodel+xml"
)
except OutputDeviceError.UserCanceledError:
self._onRejected()
except Exception as e:
message = Message(
catalog.i18nc("@info:error", "Unable to write to file: {0}", file_name),
title=catalog.i18nc("@info:title", "Error"),
message_type=Message.MessageType.ERROR
)
message.show()
Logger.logException("e", "Unable to write to file %s: %s", file_name, e)
self._onRejected()
self._config_dialog = UCPDialog()
self._config_dialog.show()

View File

@ -19,21 +19,6 @@ UM.Dialog
minimumHeight: UM.Theme.getSize("modal_window_minimum").height
backgroundColor: UM.Theme.getColor("detail_background")
property bool dontShowAgain: false
function storeDontShowAgain()
{
UM.Preferences.setValue("cura/dialog_on_ucp_project_save", !dontShowAgainCheckbox.checked)
UM.Preferences.setValue("cura/asked_dialog_on_ucp_project_save", false)
}
onVisibleChanged:
{
if(visible && UM.Preferences.getValue("cura/asked_dialog_on_ucp_project_save"))
{
dontShowAgain = !UM.Preferences.getValue("cura/dialog_on_ucp_project_save")
}
}
headerComponent: Rectangle
{
@ -90,15 +75,7 @@ UM.Dialog
delegate: SettingsSelectionGroup { Layout.margins: 0 }
}
}
leftButtons:
[
UM.CheckBox
{
id: dontShowAgainCheckbox
text: catalog.i18nc("@action:label", "Don't show project summary on save again")
checked: dontShowAgain
}
]
rightButtons:
[
Cura.TertiaryButton
@ -117,9 +94,6 @@ UM.Dialog
onClosing:
{
storeDontShowAgain()
manager.notifyClosed()
}
onRejected: storeDontShowAgain()
onAccepted: storeDontShowAgain()
}

View File

@ -9,6 +9,7 @@
# When setting an accel limit on multi-extruder printers ALL extruders are effected.
# This post does not distinguish between Print Accel and Travel Accel. The limit is the limit for all regardless. Example: Skin Accel = 1000 and Outer Wall accel = 500. If the limit is set to 300 then both Skin and Outer Wall will be Accel = 300.
# 9/15/2023 added support for RepRap M566 command for Jerk in mm/min
# 2/4/2024 Added a block so the script doesn't run unless Accel Control is enabled in Cura. This should keep users from increasing the Accel Limits.
from ..Script import Script
from cura.CuraApplication import CuraApplication
@ -46,6 +47,10 @@ class LimitXYAccelJerk(Script):
if ext_count > 1:
Message(text = "<NOTICE> 'Limit the X-Y Accel/Jerk': The post processor treats all extruders the same. If you have multiple extruders they will all be subject to the same Accel and Jerk limits imposed. If you have different Travel and Print Accel they will also be subject to the same limits. If that is not acceptable then you should not use this Post Processor.").show()
# Warn the user if Accel Control is not enabled in Cura. This keeps the script from being able to increase the Accel limits-----------
if not bool(extruder[0].getProperty("acceleration_enabled", "value")):
Message(title = "[Limit the X-Y Accel/Jerk]", text = "You must have 'Enable Acceleration Control' checked in Cura or the script will exit.").show()
def getSettingDataString(self):
return """{
"name": "Limit the X-Y Accel/Jerk (all extruders equal)",
@ -169,6 +174,13 @@ class LimitXYAccelJerk(Script):
extruder = mycura.extruderList
machine_name = str(mycura.getProperty("machine_name", "value"))
print_sequence = str(mycura.getProperty("print_sequence", "value"))
acceleration_enabled = bool(extruder[0].getProperty("acceleration_enabled", "value"))
# Exit if acceleration control is not enabled----------------
if not acceleration_enabled:
Message(title = "[Limit the X-Y Accel/Jerk]", text = "DID NOT RUN. You must have 'Enable Acceleration Control' checked in Cura.").show()
data[0] += "; [LimitXYAccelJerk] DID NOT RUN because 'Enable Acceleration Control' is not checked in Cura.\n"
return data
# Exit if 'one_at_a_time' is enabled-------------------------
if print_sequence == "one_at_a_time":
@ -183,12 +195,8 @@ class LimitXYAccelJerk(Script):
return data
type_of_change = str(self.getSettingValueByKey("type_of_change"))
accel_print_enabled = bool(extruder[0].getProperty("acceleration_enabled", "value"))
accel_travel_enabled = bool(extruder[0].getProperty("acceleration_travel_enabled", "value"))
accel_print = extruder[0].getProperty("acceleration_print", "value")
accel_travel = extruder[0].getProperty("acceleration_travel", "value")
jerk_print_enabled = str(extruder[0].getProperty("jerk_enabled", "value"))
jerk_travel_enabled = str(extruder[0].getProperty("jerk_travel_enabled", "value"))
jerk_print_old = extruder[0].getProperty("jerk_print", "value")
jerk_travel_old = extruder[0].getProperty("jerk_travel", "value")
if int(accel_print) >= int(accel_travel):

View File

@ -12,15 +12,6 @@
{
"gantry_height": { "value": 25 },
"machine_depth": { "default_value": 230 },
"machine_head_polygon":
{
"default_value": [
[-1, 1],
[-1, -1],
[1, -1],
[1, 1]
]
},
"machine_head_with_fans_polygon":
{
"default_value": [

View File

@ -0,0 +1,32 @@
{
"version": 2,
"name": "Dagoma Sigma Pro 500Z",
"inherits": "dagoma_delta",
"metadata":
{
"visible": true,
"author": "Dagoma",
"manufacturer": "Dagoma",
"file_formats": "text/x-gcode",
"platform": "dagoma_sigma_pro.obj",
"first_start_actions": [ "MachineSettingsAction" ],
"has_machine_quality": true,
"has_variants": true,
"machine_extruder_trains": { "0": "dagoma_sigma_pro_extruder" },
"platform_texture": "dagoma_sigma_pro.png",
"preferred_quality_type": "h0.2",
"preferred_variant_name": "Brass 0.4mm",
"quality_definition": "dagoma_sigma_pro",
"variants_name": "Nozzle"
},
"overrides":
{
"machine_depth": { "default_value": 200 },
"machine_end_gcode": { "default_value": ";End Gcode for {machine_name}\n;Author: Dagoma\nM104 S0\nM107 ;stop fan\nM140 S0 ;heated bed heater off (if you have it)\nG92 E0\nG1 E-55 F4600\nG27\nG90 ; Absolute positioning\nT0" },
"machine_heated_bed": { "default_value": true },
"machine_height": { "default_value": 501 },
"machine_name": { "default_value": "Dagoma Sigma Pro 500Z" },
"machine_start_gcode": { "default_value": ";Start Gcode for {machine_name}\n;Author: Dagoma\n;Sliced: {date} {time}\n;Estimated print time: {print_time}\n;Print speed: {speed_print}mm/s\n;Layer height: {layer_height}mm\n;Wall thickness: {wall_thickness}mm\n;Infill density: {infill_sparse_density}%\n;Infill pattern: {infill_pattern}\n;Support: {support_enable}\n;Print temperature: {material_print_temperature}\u00b0C\n;Flow: {material_flow}%\n;Retraction amount: {retraction_amount}mm\n;Retraction speed: {retraction_retract_speed}mm/s\nG90 ;absolute positioning\nM190 S{material_bed_temperature_layer_0};\nM109 S140;\nG1 F200 E-1.0\nM106 S255 ;Activating layers fans\nG28 ;Homing\nG29 ;Calibration\nM107 ;Off Ventilateur\nM109 S{material_print_temperature_layer_0} ;Temperature for the first layer only\nG92 E0 ;Zero the extruded length again\nG1 X0 Y-105 Z1 F3000\nG1 F{speed_travel}\nM117 Printing...\n" },
"machine_width": { "default_value": 200 }
}
}

View File

@ -0,0 +1,37 @@
{
"version": 2,
"name": "Dagoma Sigma Pro 500Z Dual",
"inherits": "dagoma_delta",
"metadata":
{
"visible": true,
"author": "Dagoma",
"manufacturer": "Dagoma",
"file_formats": "text/x-gcode",
"platform": "dagoma_sigma_pro.obj",
"first_start_actions": [ "MachineSettingsAction" ],
"has_machine_quality": true,
"has_variants": true,
"machine_extruder_trains":
{
"0": "dagoma_sigma_pro_dual_extruder_right",
"1": "dagoma_sigma_pro_dual_extruder_left"
},
"platform_texture": "dagoma_sigma_pro.png",
"preferred_quality_type": "h0.2",
"preferred_variant_name": "Brass 0.4mm",
"quality_definition": "dagoma_sigma_pro_dual",
"variants_name": "Nozzle"
},
"overrides":
{
"machine_depth": { "default_value": 200 },
"machine_end_gcode": { "default_value": ";End Gcode for {machine_name}\n;Author: Dagoma\nM104 S0\nM107 ;stop fan\nM140 S0 ;heated bed heater off (if you have it)\nG92 E0\nG1 E-55 F4600\nG27\nG90 ; Absolute positioning\nT0" },
"machine_extruder_count": { "default_value": 2 },
"machine_heated_bed": { "default_value": true },
"machine_height": { "default_value": 501 },
"machine_name": { "default_value": "Dagoma Sigma Pro 500Z Dual" },
"machine_start_gcode": { "default_value": ";Start Gcode for {machine_name}\n;Author: Dagoma\n;Sliced: {date} {time}\n;Estimated print time: {print_time}\n;Print speed: {speed_print}mm/s\n;Layer height: {layer_height}mm\n;Wall thickness: {wall_thickness}mm\n;Infill density: {infill_sparse_density}%\n;Infill pattern: {infill_pattern}\n;Support: {support_enable}\n;Print temperature: {material_print_temperature}\u00b0C\n;Flow: {material_flow}%\n;Retraction amount: {retraction_amount}mm\n;Retraction speed: {retraction_retract_speed}mm/s\nG90 ;absolute positioning\nM190 S{material_bed_temperature_layer_0};\nM109 S140;\nG1 F200 E-1.0\nM106 S255 ;Activating layers fans\nG28 ;Homing\nG29 ;Calibration\nM107 ;Off Ventilateur\nM109 S{material_print_temperature_layer_0} ;Temperature for the first layer only\nG92 E0 ;Zero the extruded length again\nG1 X0 Y-105 Z1 F3000\nG1 F{speed_travel}\nM117 Printing...\n" },
"machine_width": { "default_value": 200 }
}
}

View File

@ -0,0 +1,18 @@
{
"version": 2,
"name": "Left Extruder",
"inherits": "fdmextruder",
"metadata":
{
"machine": "dagoma_sigma_pro_dual",
"position": "1"
},
"overrides":
{
"extruder_nr": { "default_value": 1 },
"machine_extruder_end_code": { "default_value": ";END T1\nG92 E0\nM83\nG1 E-55 F4700\nM82\nG92 E0\n" },
"machine_extruder_start_code": { "default_value": ";START T1\n;No temperature change\nG1 X0 Y77.5 F8000\nG92 E0\nM83\nG1 E50 F1200\nM82\nG92 E0\n" },
"machine_nozzle_size": { "default_value": 0.4 },
"material_diameter": { "default_value": 1.75 }
}
}

View File

@ -0,0 +1,18 @@
{
"version": 2,
"name": "Right Extruder",
"inherits": "fdmextruder",
"metadata":
{
"machine": "dagoma_sigma_pro_dual",
"position": "0"
},
"overrides":
{
"extruder_nr": { "default_value": 0 },
"machine_extruder_end_code": { "default_value": ";END T0\nG92 E0\nM83\nG1 E-55 F4700\nM82\nG92 E0\n" },
"machine_extruder_start_code": { "default_value": ";START T0\n;No temperature change\nG1 X0 Y77.5 F8000\nG92 E0\nM83\nG1 E50 F1200\nM82\nG92 E0\n" },
"machine_nozzle_size": { "default_value": 0.4 },
"material_diameter": { "default_value": 1.75 }
}
}

View File

@ -0,0 +1,18 @@
{
"version": 2,
"name": "Extruder",
"inherits": "fdmextruder",
"metadata":
{
"machine": "dagoma_sigma_pro",
"position": "0"
},
"overrides":
{
"extruder_nr": { "default_value": 0 },
"machine_extruder_end_code": { "default_value": ";END T0\nG92 E0\nM83\nG1 E-55 F4700\nM82\nG92 E0\n" },
"machine_extruder_start_code": { "default_value": ";START T0\n;No temperature change\nG1 X0 Y77.5 F8000\nG92 E0\nM83\nG1 E50 F1200\nM82\nG92 E0\n" },
"machine_nozzle_size": { "default_value": 0.4 },
"material_diameter": { "default_value": 1.75 }
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 111 KiB

File diff suppressed because it is too large Load Diff

View File

@ -701,24 +701,33 @@ UM.MainWindow
if (hasProjectFile)
{
var projectFile = projectFileUrlList[0];
// check preference
var choice = UM.Preferences.getValue("cura/choice_on_open_project");
if (choice == "open_as_project")
var projectFile = projectFileUrlList[0]
var is_ucp = CuraApplication.isProjectUcp(projectFile);
if (is_ucp)
{
openFilesIncludingProjectsDialog.loadProjectFile(projectFile);
askOpenAsProjectOrUcpOrImportModelsDialog.fileUrl = projectFile;
askOpenAsProjectOrUcpOrImportModelsDialog.addToRecent = true;
askOpenAsProjectOrUcpOrImportModelsDialog.show();
}
else if (choice == "open_as_model")
else
{
openFilesIncludingProjectsDialog.loadModelFiles([projectFile].slice());
}
else // always ask
{
// ask whether to open as project or as models
askOpenAsProjectOrModelsDialog.fileUrl = projectFile;
askOpenAsProjectOrModelsDialog.addToRecent = true;
askOpenAsProjectOrModelsDialog.show();
// check preference
var choice = UM.Preferences.getValue("cura/choice_on_open_project");
if (choice == "open_as_project")
{
openFilesIncludingProjectsDialog.loadProjectFile(projectFile);
}
else if (choice == "open_as_model")
{
openFilesIncludingProjectsDialog.loadModelFiles([projectFile].slice());
}
else // always ask
{
// ask whether to open as project or as models
askOpenAsProjectOrModelsDialog.fileUrl = projectFile;
askOpenAsProjectOrModelsDialog.addToRecent = true;
askOpenAsProjectOrModelsDialog.show();
}
}
}
else
@ -769,14 +778,30 @@ UM.MainWindow
id: askOpenAsProjectOrModelsDialog
}
AskOpenAsProjectOrUcpOrImportModel
{
id: askOpenAsProjectOrUcpOrImportModelsDialog
}
Connections
{
target: CuraApplication
function onOpenProjectFile(project_file, add_to_recent_files)
{
askOpenAsProjectOrModelsDialog.fileUrl = project_file;
askOpenAsProjectOrModelsDialog.addToRecent = add_to_recent_files;
askOpenAsProjectOrModelsDialog.show();
var is_ucp = CuraApplication.isProjectUcp(project_file);
if (is_ucp)
{
askOpenAsProjectOrUcpOrImportModelsDialog.fileUrl = project_file;
askOpenAsProjectOrUcpOrImportModelsDialog.addToRecent = add_to_recent_files;
askOpenAsProjectOrUcpOrImportModelsDialog.show();
}
else
{
askOpenAsProjectOrModelsDialog.fileUrl = project_file;
askOpenAsProjectOrModelsDialog.addToRecent = add_to_recent_files;
askOpenAsProjectOrModelsDialog.show();
}
}
}

View File

@ -0,0 +1,91 @@
// Copyright (c) 2022 Ultimaker B.V.
// Cura is released under the terms of the LGPLv3 or higher.
import QtQuick 2.2
import QtQuick.Controls 2.1
import QtQuick.Layouts 1.1
import UM 1.5 as UM
import Cura 1.0 as Cura
UM.Dialog
{
// This dialog asks the user whether he/she wants to open a project file as a project or import models.
id: base
title: catalog.i18nc("@title:window", "Open Universal Cura Project (UCP) file")
width: UM.Theme.getSize("small_popup_dialog").width
height: UM.Theme.getSize("small_popup_dialog").height
backgroundColor: UM.Theme.getColor("main_background")
maximumHeight: height
maximumWidth: width
minimumHeight: maximumHeight
minimumWidth: maximumWidth
modality: Qt.WindowModal
property var fileUrl
property var addToRecent: true //Whether to add this file to the recent files list after reading it.
// load the project file as separated models
function loadModelFiles() {
CuraApplication.readLocalFile(base.fileUrl, "open_as_model", base.addToRecent)
base.hide()
}
// load the project file as Universal cura project
function loadUcpFiles() {
CuraApplication.readLocalUcpFile(base.fileUrl, base.addToRecent)
base.hide()
}
// override UM.Dialog accept
function accept () {
// when hitting 'enter', we always open as project unless open_as_model was explicitly stored as preference
if (openAsPreference == "open_as_model") {
loadModelFiles()
} else{
loadUcpFiles()
}
}
Column
{
anchors.fill: parent
spacing: UM.Theme.getSize("default_margin").height
UM.Label
{
id: questionText
width: parent.width
text: catalog.i18nc("@text:window", "This is a Cura Universal project file. Would you like to open it as a Cura project or Cura Universal Project or import the models from it?")
wrapMode: Text.WordWrap
}
}
onAccepted: loadUcpFile()
onRejected: loadModelFiles()
buttonSpacing: UM.Theme.getSize("thin_margin").width
rightButtons:
[
Cura.PrimaryButton
{
text: catalog.i18nc("@action:button", "Open as UCP")
iconSource: UM.Theme.getIcon("CuraShareIcon")
onClicked: loadUcpFiles()
},
Cura.SecondaryButton
{
text: catalog.i18nc("@action:button", "Import models")
onClicked: loadModelFiles()
}
]
}

View File

@ -784,20 +784,6 @@ UM.PreferencesPage
}
}
UM.TooltipArea
{
width: childrenRect.width
height: childrenRect.height
text: catalog.i18nc("@info:tooltip", "Should a summary be shown when saving a UCP project file?")
UM.CheckBox
{
text: catalog.i18nc("@option:check", "Show summary dialog when saving a UCP project")
checked: boolCheck(UM.Preferences.getValue("cura/dialog_on_ucp_project_save"))
onCheckedChanged: UM.Preferences.setValue("cura/dialog_on_ucp_project_save", checked)
}
}
UM.TooltipArea
{
width: childrenRect.width

View File

@ -132,8 +132,6 @@ ScrollView
key: "material_bed_temperature"
watchedProperties: ["value", "minimum_value", "maximum_value", "resolve"]
storeIndex: 0
property var resolve: Cura.MachineManager.activeStack != Cura.MachineManager.activeMachine ? properties.resolve : "None"
}
UM.SettingPropertyProvider

View File

@ -25,8 +25,6 @@ Item
key: "material_print_temperature"
watchedProperties: ["value", "minimum_value", "maximum_value", "resolve"]
storeIndex: 0
property var resolve: Cura.MachineManager.activeStack != Cura.MachineManager.activeMachine ? properties.resolve : "None"
}
Rectangle

View File

@ -199,17 +199,7 @@ Item
{
return "";
}
if ((bedTemperature.resolve != "None" && bedTemperature.resolve) && (bedTemperature.stackLevels[0] != 0) && (bedTemperature.stackLevels[0] != 1))
{
// We have a resolve function. Indicates that the setting is not settable per extruder and that
// we have to choose between the resolved value (default) and the global value
// (if user has explicitly set this).
return bedTemperature.resolve;
}
else
{
return bedTemperature.properties.value;
}
return bedTemperature.properties.value;
}
}
}

View File

@ -0,0 +1,74 @@
[general]
definition = dagoma_sigma_pro
name = Fine
version = 4
[metadata]
material = generic_pla
quality_type = h0.1
setting_version = 22
type = quality
variant = Brass 0.4mm
weight = 1
[values]
adhesion_type = brim
bridge_settings_enabled = True
brim_width = 2
coasting_enable = True
coasting_volume = 0.06
cool_fan_full_layer = 5
cool_min_layer_time = 7
cool_min_temperature = 195
infill_material_flow = 105
infill_sparse_density = 15
material_final_print_temperature = 196
material_flow_layer_0 = 100
material_initial_print_temperature = 196
material_print_temperature = 196
material_print_temperature_layer_0 = 196
material_standby_temperature = 195
ooze_shield_enabled = False
prime_tower_brim_enable = True
prime_tower_enable = True
prime_tower_min_volume = 44
prime_tower_size = 25
prime_tower_wipe_enabled = False
retraction_amount = 3.0
retraction_combing = infill
retraction_hop = 0.4
retraction_hop_after_extruder_switch_height = 0
retraction_hop_enabled = True
retraction_prime_speed = 45
retraction_retract_speed = 60
retraction_speed = 80
smooth_spiralized_contours = False
speed_infill = 80
speed_layer_0 = 22
speed_prime_tower = 70
speed_print = 35
speed_slowdown_layers = 3
speed_topbottom = 35
speed_travel = 180
speed_travel_layer_0 = 70
speed_wall_0 = 25
speed_wall_x = 35.0
speed_z_hop = 120
support_enable = False
support_structure = tree
support_tree_angle = 55
support_tree_top_rate = =30 if support_roof_enable else 10
switch_extruder_extra_prime_amount = 0
switch_extruder_prime_speed = 20
switch_extruder_retraction_amount = 80
switch_extruder_retraction_speed = =switch_extruder_retraction_speeds
switch_extruder_retraction_speeds = 80
travel_avoid_distance = 2.0
travel_avoid_other_parts = False
travel_avoid_supports = True
wall_0_material_flow = =wall_material_flow
wall_0_material_flow_layer_0 = 85
wall_thickness = 0.8
wall_transition_length = 0.4
wall_x_material_flow_layer_0 = 90

View File

@ -0,0 +1,74 @@
[general]
definition = dagoma_sigma_pro
name = Normal
version = 4
[metadata]
material = generic_pla
quality_type = h0.2
setting_version = 22
type = quality
variant = Brass 0.4mm
weight = 1
[values]
adhesion_type = brim
bridge_settings_enabled = True
brim_width = 2
coasting_enable = True
coasting_volume = 0.06
cool_fan_full_layer = 5
cool_min_layer_time = 7
cool_min_temperature = 195
infill_material_flow = 105
infill_sparse_density = 15
material_final_print_temperature = 200
material_flow_layer_0 = 100
material_initial_print_temperature = 200
material_print_temperature = 200
material_print_temperature_layer_0 = 200
material_standby_temperature = 195
ooze_shield_enabled = False
prime_tower_brim_enable = True
prime_tower_enable = True
prime_tower_min_volume = 44
prime_tower_size = 25
prime_tower_wipe_enabled = False
retraction_amount = 3.0
retraction_combing = infill
retraction_hop = 0.4
retraction_hop_after_extruder_switch_height = 0
retraction_hop_enabled = True
retraction_prime_speed = 45
retraction_retract_speed = 60
retraction_speed = 80
smooth_spiralized_contours = False
speed_infill = 80
speed_layer_0 = 22
speed_prime_tower = 70
speed_print = 35
speed_slowdown_layers = 3
speed_topbottom = 35
speed_travel = 180
speed_travel_layer_0 = 70
speed_wall_0 = 25
speed_wall_x = 35.0
speed_z_hop = 120
support_enable = False
support_structure = tree
support_tree_angle = 55
support_tree_top_rate = =30 if support_roof_enable else 10
switch_extruder_extra_prime_amount = 0
switch_extruder_prime_speed = 20
switch_extruder_retraction_amount = 80
switch_extruder_retraction_speed = =switch_extruder_retraction_speeds
switch_extruder_retraction_speeds = 80
travel_avoid_distance = 2.0
travel_avoid_other_parts = False
travel_avoid_supports = True
wall_0_material_flow = =wall_material_flow
wall_0_material_flow_layer_0 = 85
wall_thickness = 1.2
wall_transition_length = 0.4
wall_x_material_flow_layer_0 = 90

View File

@ -0,0 +1,15 @@
[general]
definition = dagoma_sigma_pro
name = Draft
version = 4
[metadata]
material = generic_pla
quality_type = h0.3
setting_version = 22
type = quality
variant = Brass 0.4mm
weight = 1
[values]

View File

@ -0,0 +1,15 @@
[general]
definition = dagoma_sigma_pro
name = Normal
version = 4
[metadata]
material = generic_pla
quality_type = h0.2
setting_version = 22
type = quality
variant = Brass 0.8mm
weight = 1
[values]

View File

@ -0,0 +1,15 @@
[general]
definition = dagoma_sigma_pro
name = Fast
version = 4
[metadata]
material = generic_pla
quality_type = h0.4
setting_version = 22
type = quality
variant = Brass 0.8mm
weight = 1
[values]

View File

@ -0,0 +1,15 @@
[general]
definition = dagoma_sigma_pro
name = Very Fast
version = 4
[metadata]
material = generic_pla
quality_type = h0.6
setting_version = 22
type = quality
variant = Brass 0.8mm
weight = 1
[values]

View File

@ -0,0 +1,75 @@
[general]
definition = dagoma_sigma_pro_dual
name = Fine
version = 4
[metadata]
material = generic_pla
quality_type = h0.1
setting_version = 22
type = quality
variant = Brass 0.4mm
weight = 1
[values]
adhesion_type = brim
bridge_settings_enabled = True
brim_width = 2
coasting_enable = True
coasting_volume = 0.1
cool_fan_full_layer = 5
cool_min_layer_time = 7
cool_min_temperature = 195
infill_material_flow = 105
infill_sparse_density = 15
material_final_print_temperature = 196
material_flow_layer_0 = 100
material_initial_print_temperature = 196
material_print_temperature = 196
material_print_temperature_layer_0 = 196
material_standby_temperature = 196
ooze_shield_enabled = False
prime_tower_brim_enable = True
prime_tower_enable = True
prime_tower_min_volume = 24
prime_tower_size = 25
prime_tower_wipe_enabled = True
retraction_amount = 10
retraction_combing = infill
retraction_extrusion_window = 10.0
retraction_hop = 0.4
retraction_hop_after_extruder_switch_height = 0
retraction_hop_enabled = True
retraction_prime_speed = 60
retraction_retract_speed = 90
retraction_speed = 80
smooth_spiralized_contours = False
speed_infill = 80
speed_layer_0 = 22
speed_prime_tower = 70
speed_print = 35
speed_slowdown_layers = 3
speed_topbottom = 35
speed_travel = 180
speed_travel_layer_0 = 70
speed_wall_0 = 25
speed_wall_x = 35.0
speed_z_hop = 120
support_enable = False
support_structure = tree
support_tree_angle = 55
support_tree_top_rate = =30 if support_roof_enable else 10
switch_extruder_extra_prime_amount = 0
switch_extruder_prime_speed = 20
switch_extruder_retraction_amount = 0
switch_extruder_retraction_speed = =switch_extruder_retraction_speeds
switch_extruder_retraction_speeds = 75
travel_avoid_distance = 2.0
travel_avoid_other_parts = False
travel_avoid_supports = True
wall_0_material_flow = =wall_material_flow
wall_0_material_flow_layer_0 = 85
wall_thickness = 1.2
wall_transition_length = 0.4
wall_x_material_flow_layer_0 = 90

View File

@ -0,0 +1,75 @@
[general]
definition = dagoma_sigma_pro_dual
name = Normal
version = 4
[metadata]
material = generic_pla
quality_type = h0.2
setting_version = 22
type = quality
variant = Brass 0.4mm
weight = 1
[values]
adhesion_type = brim
bridge_settings_enabled = True
brim_width = 2
coasting_enable = True
coasting_volume = 0.1
cool_fan_full_layer = 5
cool_min_layer_time = 7
cool_min_temperature = 195
infill_material_flow = 105
infill_sparse_density = 15
material_final_print_temperature = 200
material_flow_layer_0 = 100
material_initial_print_temperature = 200
material_print_temperature = 200
material_print_temperature_layer_0 = =material_print_temperature
material_standby_temperature = 200
ooze_shield_enabled = False
prime_tower_brim_enable = True
prime_tower_enable = True
prime_tower_min_volume = 44
prime_tower_size = 25
prime_tower_wipe_enabled = True
retraction_amount = 10
retraction_combing = infill
retraction_extrusion_window = 10.0
retraction_hop = 0.4
retraction_hop_after_extruder_switch_height = 0
retraction_hop_enabled = True
retraction_prime_speed = 60
retraction_retract_speed = 90
retraction_speed = 80
smooth_spiralized_contours = False
speed_infill = 80
speed_layer_0 = 22
speed_prime_tower = 70
speed_print = 35
speed_slowdown_layers = 3
speed_topbottom = 35
speed_travel = 180
speed_travel_layer_0 = 70
speed_wall_0 = 25
speed_wall_x = 35.0
speed_z_hop = 120
support_enable = False
support_structure = tree
support_tree_angle = 55
support_tree_top_rate = =30 if support_roof_enable else 10
switch_extruder_extra_prime_amount = 0
switch_extruder_prime_speed = 20
switch_extruder_retraction_amount = 0
switch_extruder_retraction_speed = =switch_extruder_retraction_speeds
switch_extruder_retraction_speeds = 75
travel_avoid_distance = 2.0
travel_avoid_other_parts = False
travel_avoid_supports = True
wall_0_material_flow = =wall_material_flow
wall_0_material_flow_layer_0 = 85
wall_thickness = 1.2
wall_transition_length = 0.4
wall_x_material_flow_layer_0 = 90

View File

@ -0,0 +1,15 @@
[general]
definition = dagoma_sigma_pro_dual
name = Draft
version = 4
[metadata]
material = generic_pla
quality_type = h0.3
setting_version = 22
type = quality
variant = Brass 0.4mm
weight = 1
[values]

View File

@ -0,0 +1,15 @@
[general]
definition = dagoma_sigma_pro_dual
name = Normal
version = 4
[metadata]
material = generic_pla
quality_type = h0.2
setting_version = 22
type = quality
variant = Brass 0.8mm
weight = 1
[values]

View File

@ -0,0 +1,15 @@
[general]
definition = dagoma_sigma_pro_dual
name = Fast
version = 4
[metadata]
material = generic_pla
quality_type = h0.4
setting_version = 22
type = quality
variant = Brass 0.8mm
weight = 1
[values]

View File

@ -0,0 +1,15 @@
[general]
definition = dagoma_sigma_pro_dual
name = Very Fast
version = 4
[metadata]
material = generic_pla
quality_type = h0.6
setting_version = 22
type = quality
variant = Brass 0.8mm
weight = 1
[values]

View File

@ -0,0 +1,16 @@
[general]
definition = dagoma_sigma_pro_dual
name = Fine
version = 4
[metadata]
global_quality = True
material = generic_pla
quality_type = h0.1
setting_version = 22
type = quality
weight = 1
[values]
layer_height = 0.1

View File

@ -0,0 +1,16 @@
[general]
definition = dagoma_sigma_pro_dual
name = Normal
version = 4
[metadata]
global_quality = True
material = generic_pla
quality_type = h0.2
setting_version = 22
type = quality
weight = 1
[values]
layer_height = 0.2

View File

@ -0,0 +1,16 @@
[general]
definition = dagoma_sigma_pro_dual
name = Draft
version = 4
[metadata]
global_quality = True
material = generic_pla
quality_type = h0.3
setting_version = 22
type = quality
weight = 1
[values]
layer_height = 0.3

View File

@ -0,0 +1,16 @@
[general]
definition = dagoma_sigma_pro_dual
name = Fast
version = 4
[metadata]
global_quality = True
material = generic_pla
quality_type = h0.4
setting_version = 22
type = quality
weight = 1
[values]
layer_height = 0.4

View File

@ -0,0 +1,16 @@
[general]
definition = dagoma_sigma_pro_dual
name = Very Fast
version = 4
[metadata]
global_quality = True
material = generic_pla
quality_type = h0.6
setting_version = 22
type = quality
weight = 1
[values]
layer_height = 0.6

View File

@ -0,0 +1,15 @@
[general]
definition = dagoma_sigma_pro_dual
name = Fine
version = 4
[metadata]
material = generic_pla
quality_type = h0.1
setting_version = 22
type = quality
variant = Steel 0.4mm
weight = 1
[values]

View File

@ -0,0 +1,15 @@
[general]
definition = dagoma_sigma_pro_dual
name = Normal
version = 4
[metadata]
material = generic_pla
quality_type = h0.2
setting_version = 22
type = quality
variant = Steel 0.4mm
weight = 1
[values]

View File

@ -0,0 +1,15 @@
[general]
definition = dagoma_sigma_pro_dual
name = Draft
version = 4
[metadata]
material = generic_pla
quality_type = h0.3
setting_version = 22
type = quality
variant = Steel 0.4mm
weight = 1
[values]

View File

@ -0,0 +1,15 @@
[general]
definition = dagoma_sigma_pro_dual
name = Normal
version = 4
[metadata]
material = generic_pla
quality_type = h0.2
setting_version = 22
type = quality
variant = Steel 0.8mm
weight = 1
[values]

View File

@ -0,0 +1,15 @@
[general]
definition = dagoma_sigma_pro_dual
name = Fast
version = 4
[metadata]
material = generic_pla
quality_type = h0.4
setting_version = 22
type = quality
variant = Steel 0.8mm
weight = 1
[values]

View File

@ -0,0 +1,15 @@
[general]
definition = dagoma_sigma_pro_dual
name = Very Fast
version = 4
[metadata]
material = generic_pla
quality_type = h0.6
setting_version = 22
type = quality
variant = Steel 0.8mm
weight = 1
[values]

View File

@ -0,0 +1,16 @@
[general]
definition = dagoma_sigma_pro
name = Fine
version = 4
[metadata]
global_quality = True
material = generic_pla
quality_type = h0.1
setting_version = 22
type = quality
weight = 1
[values]
layer_height = 0.1

View File

@ -0,0 +1,16 @@
[general]
definition = dagoma_sigma_pro
name = Normal
version = 4
[metadata]
global_quality = True
material = generic_pla
quality_type = h0.2
setting_version = 22
type = quality
weight = 1
[values]
layer_height = 0.2

View File

@ -0,0 +1,16 @@
[general]
definition = dagoma_sigma_pro
name = Draft
version = 4
[metadata]
global_quality = True
material = generic_pla
quality_type = h0.3
setting_version = 22
type = quality
weight = 1
[values]
layer_height = 0.3

View File

@ -0,0 +1,16 @@
[general]
definition = dagoma_sigma_pro
name = Fast
version = 4
[metadata]
global_quality = True
material = generic_pla
quality_type = h0.4
setting_version = 22
type = quality
weight = 1
[values]
layer_height = 0.4

View File

@ -0,0 +1,16 @@
[general]
definition = dagoma_sigma_pro
name = Very Fast
version = 4
[metadata]
global_quality = True
material = generic_pla
quality_type = h0.6
setting_version = 22
type = quality
weight = 1
[values]
layer_height = 0.6

View File

@ -0,0 +1,15 @@
[general]
definition = dagoma_sigma_pro
name = Fine
version = 4
[metadata]
material = generic_pla
quality_type = h0.1
setting_version = 22
type = quality
variant = Steel 0.4mm
weight = 1
[values]

View File

@ -0,0 +1,15 @@
[general]
definition = dagoma_sigma_pro
name = Normal
version = 4
[metadata]
material = generic_pla
quality_type = h0.2
setting_version = 22
type = quality
variant = Steel 0.4mm
weight = 1
[values]

View File

@ -0,0 +1,15 @@
[general]
definition = dagoma_sigma_pro
name = Draft
version = 4
[metadata]
material = generic_pla
quality_type = h0.3
setting_version = 22
type = quality
variant = Steel 0.4mm
weight = 1
[values]

View File

@ -0,0 +1,15 @@
[general]
definition = dagoma_sigma_pro
name = Normal
version = 4
[metadata]
material = generic_pla
quality_type = h0.2
setting_version = 22
type = quality
variant = Steel 0.8mm
weight = 1
[values]

View File

@ -0,0 +1,15 @@
[general]
definition = dagoma_sigma_pro
name = Fast
version = 4
[metadata]
material = generic_pla
quality_type = h0.4
setting_version = 22
type = quality
variant = Steel 0.8mm
weight = 1
[values]

View File

@ -0,0 +1,15 @@
[general]
definition = dagoma_sigma_pro
name = Very Fast
version = 4
[metadata]
material = generic_pla
quality_type = h0.6
setting_version = 22
type = quality
variant = Steel 0.8mm
weight = 1
[values]

View File

@ -0,0 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 50">
<g clip-path="url(#clip0_8_4)">
<g filter="url(#filter0_i_8_4)">
<path d="M49.8789 38.1712L38.1712 49.8789H0.121338V11.829L11.829 0.121338H49.8789V38.1712Z" fill="#196EF0"/>
</g>
<path fill-rule="evenodd" clip-rule="evenodd" d="M47.5728 37.2299V2.42718H12.7701L2.42718 12.7701V47.5728H37.2299L47.5728 37.2299ZM38.2353 50L50 38.2353V0H11.7647L0 11.7647V50H38.2353Z" fill="#FAFAFA"/>
<g filter="url(#filter1_d_8_4)">
<path fill-rule="evenodd" clip-rule="evenodd" d="M29.9757 15.2913C29.9757 14.487 30.6277 13.835 31.432 13.835C32.2363 13.835 32.8884 14.487 32.8884 15.2913C32.8884 16.0956 32.2363 16.7476 31.432 16.7476C30.6277 16.7476 29.9757 16.0956 29.9757 15.2913ZM26.6696 17.1117H25.8589C23.5685 17.1117 21.3926 17.9683 19.8051 19.4611C19.3329 19.9051 18.9246 20.3941 18.584 20.9158C19.8267 21.8454 20.6311 23.3288 20.6311 25C20.6311 26.6713 19.8267 28.1547 18.584 29.0843C18.9246 29.606 19.3329 30.0949 19.8051 30.539C21.3926 32.0318 23.5685 32.8884 25.8589 32.8884H26.6696C27.4025 30.9723 29.2584 29.6117 31.432 29.6117C34.2471 29.6117 36.5291 31.8937 36.5291 34.7088C36.5291 37.5238 34.2471 39.8059 31.432 39.8059C29.2584 39.8059 27.4025 38.4452 26.6696 36.5292H25.8589C22.6727 36.5292 19.5961 35.34 17.3111 33.1913C16.3376 32.276 15.5411 31.2174 14.9472 30.0637C12.4085 29.7727 10.4369 27.6166 10.4369 25C10.4369 22.3834 12.4085 20.2273 14.9472 19.9364C15.5411 18.7827 16.3376 17.7241 17.3111 16.8087C19.5961 14.66 22.6727 13.4709 25.8589 13.4709H26.6696C27.4025 11.5549 29.2584 10.1942 31.432 10.1942C34.2471 10.1942 36.5291 12.4763 36.5291 15.2913C36.5291 18.1063 34.2471 20.3884 31.432 20.3884C29.2584 20.3884 27.4025 19.0277 26.6696 17.1117ZM31.432 33.2525C30.6277 33.2525 29.9757 33.9045 29.9757 34.7088C29.9757 35.5131 30.6277 36.1651 31.432 36.1651C32.2363 36.1651 32.8884 35.5131 32.8884 34.7088C32.8884 33.9045 32.2363 33.2525 31.432 33.2525ZM14.0777 25C14.0777 24.1957 14.7297 23.5437 15.534 23.5437C16.3383 23.5437 16.9903 24.1957 16.9903 25C16.9903 25.8043 16.3383 26.4564 15.534 26.4564C14.7297 26.4564 14.0777 25.8043 14.0777 25Z" fill="#FAFAFA"/>
</g>
</g>
<defs>
<filter id="filter0_i_8_4" x="0.121338" y="0.121338" width="49.7576" height="49.7576" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset/>
<feGaussianBlur stdDeviation="6"/>
<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.5 0"/>
<feBlend mode="normal" in2="shape" result="effect1_innerShadow_8_4"/>
</filter>
<filter id="filter1_d_8_4" x="5.43689" y="5.19421" width="36.0923" height="39.6117" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset/>
<feGaussianBlur stdDeviation="2.5"/>
<feComposite in2="hardAlpha" operator="out"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.4 0"/>
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_8_4"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_8_4" result="shape"/>
</filter>
<clipPath id="clip0_8_4">
<rect width="50" height="50" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 3.6 KiB

View File

@ -0,0 +1,14 @@
[general]
definition = dagoma_sigma_pro
name = Brass 0.4mm
version = 4
[metadata]
hardware_type = nozzle
setting_version = 22
type = variant
[values]
machine_nozzle_id = Brass 0.4mm
machine_nozzle_size = 0.4

View File

@ -0,0 +1,14 @@
[general]
definition = dagoma_sigma_pro
name = Brass 0.8mm
version = 4
[metadata]
hardware_type = nozzle
setting_version = 22
type = variant
[values]
machine_nozzle_id = Brass 0.8mm
machine_nozzle_size = 0.8

View File

@ -0,0 +1,14 @@
[general]
definition = dagoma_sigma_pro_dual
name = Brass 0.4mm
version = 4
[metadata]
hardware_type = nozzle
setting_version = 22
type = variant
[values]
machine_nozzle_id = Brass 0.4mm
machine_nozzle_size = 0.4

View File

@ -0,0 +1,14 @@
[general]
definition = dagoma_sigma_pro_dual
name = Brass 0.8mm
version = 4
[metadata]
hardware_type = nozzle
setting_version = 22
type = variant
[values]
machine_nozzle_id = Brass 0.8mm
machine_nozzle_size = 0.8

View File

@ -0,0 +1,14 @@
[general]
definition = dagoma_sigma_pro_dual
name = Steel 0.4mm
version = 4
[metadata]
hardware_type = nozzle
setting_version = 22
type = variant
[values]
machine_nozzle_id = Steel 0.4mm
machine_nozzle_size = 0.4

View File

@ -0,0 +1,14 @@
[general]
definition = dagoma_sigma_pro_dual
name = Steel 0.8mm
version = 4
[metadata]
hardware_type = nozzle
setting_version = 22
type = variant
[values]
machine_nozzle_id = Steel 0.8mm
machine_nozzle_size = 0.8

View File

@ -0,0 +1,14 @@
[general]
definition = dagoma_sigma_pro
name = Steel 0.4mm
version = 4
[metadata]
hardware_type = nozzle
setting_version = 22
type = variant
[values]
machine_nozzle_id = Steel 0.4mm
machine_nozzle_size = 0.4

View File

@ -0,0 +1,14 @@
[general]
definition = dagoma_sigma_pro
name = Steel 0.8mm
version = 4
[metadata]
hardware_type = nozzle
setting_version = 22
type = variant
[values]
machine_nozzle_id = Steel 0.8mm
machine_nozzle_size = 0.8