Merge branch 'master' into CURA-7689_beta_release_notifications

This commit is contained in:
Konstantinos Karmas 2021-08-02 16:04:00 +02:00
commit b006d9111f
153 changed files with 2127 additions and 129 deletions

11
CITATION.cff Normal file
View File

@ -0,0 +1,11 @@
# YAML 1.2
---
authors:
cff-version: "1.1.0"
date-released: 2021-06-28
license: "LGPL-3.0"
message: "If you use this software, please cite it using these metadata."
repository-code: "https://github.com/ultimaker/cura/"
title: "Ultimaker Cura"
version: "4.10.0"
...

View File

@ -178,7 +178,9 @@ class Account(QObject):
if self._error_message:
self._error_message.hide()
Logger.log("w", "Failed to login: %s", error_message)
self._error_message = Message(error_message, title = i18n_catalog.i18nc("@info:title", "Login failed"))
self._error_message = Message(error_message,
title = i18n_catalog.i18nc("@info:title", "Login failed"),
message_type = Message.MessageType.ERROR)
self._error_message.show()
self._logged_in = False
self.loginStateChanged.emit(False)
@ -209,7 +211,7 @@ class Account(QObject):
if self._update_timer.isActive():
self._update_timer.stop()
elif self._sync_state == SyncState.SYNCING:
Logger.warning("Starting a new sync while previous sync was not completed\n{}", str(self._sync_services))
Logger.debug("Starting a new sync while previous sync was not completed")
self.syncRequested.emit()

View File

@ -147,6 +147,8 @@ class ArrangeObjectsAllBuildPlatesJob(Job):
status_message.hide()
if not found_solution_for_all:
no_full_solution_message = Message(i18n_catalog.i18nc("@info:status", "Unable to find a location within the build volume for all objects"),
title = i18n_catalog.i18nc("@info:title", "Can't Find Location"))
no_full_solution_message = Message(i18n_catalog.i18nc("@info:status",
"Unable to find a location within the build volume for all objects"),
title = i18n_catalog.i18nc("@info:title", "Can't Find Location"),
message_type = Message.MessageType.WARNING)
no_full_solution_message.show()

View File

@ -39,6 +39,7 @@ class ArrangeObjectsJob(Job):
no_full_solution_message = Message(
i18n_catalog.i18nc("@info:status",
"Unable to find a location within the build volume for all objects"),
title = i18n_catalog.i18nc("@info:title", "Can't Find Location"))
title = i18n_catalog.i18nc("@info:title", "Can't Find Location"),
message_type = Message.MessageType.ERROR)
no_full_solution_message.show()
self.finished.emit(self)

View File

@ -111,15 +111,15 @@ class Backup:
return archive
except (IOError, OSError, BadZipfile) as error:
Logger.log("e", "Could not create archive from user data directory: %s", error)
self._showMessage(
self.catalog.i18nc("@info:backup_failed",
"Could not create archive from user data directory: {}".format(error)))
self._showMessage(self.catalog.i18nc("@info:backup_failed",
"Could not create archive from user data directory: {}".format(error)),
message_type = Message.MessageType.ERROR)
return None
def _showMessage(self, message: str) -> None:
def _showMessage(self, message: str, message_type: Message.MessageType = Message.MessageType.NEUTRAL) -> None:
"""Show a UI message."""
Message(message, title=self.catalog.i18nc("@info:title", "Backup"), lifetime=30).show()
Message(message, title=self.catalog.i18nc("@info:title", "Backup"), message_type = message_type).show()
def restore(self) -> bool:
"""Restore this back-up.
@ -130,9 +130,9 @@ class Backup:
if not self.zip_file or not self.meta_data or not self.meta_data.get("cura_release", None):
# We can restore without the minimum required information.
Logger.log("w", "Tried to restore a Cura backup without having proper data or meta data.")
self._showMessage(
self.catalog.i18nc("@info:backup_failed",
"Tried to restore a Cura backup without having proper data or meta data."))
self._showMessage(self.catalog.i18nc("@info:backup_failed",
"Tried to restore a Cura backup without having proper data or meta data."),
message_type = Message.MessageType.ERROR)
return False
current_version = Version(self._application.getVersion())
@ -141,9 +141,9 @@ class Backup:
if current_version < version_to_restore:
# Cannot restore version newer than current because settings might have changed.
Logger.log("d", "Tried to restore a Cura backup of version {version_to_restore} with cura version {current_version}".format(version_to_restore = version_to_restore, current_version = current_version))
self._showMessage(
self.catalog.i18nc("@info:backup_failed",
"Tried to restore a Cura backup that is higher than the current version."))
self._showMessage(self.catalog.i18nc("@info:backup_failed",
"Tried to restore a Cura backup that is higher than the current version."),
message_type = Message.MessageType.ERROR)
return False
# Get the current secrets and store since the back-up doesn't contain those
@ -154,7 +154,11 @@ class Backup:
archive = ZipFile(io.BytesIO(self.zip_file), "r")
except LookupError as e:
Logger.log("d", f"The following error occurred while trying to restore a Cura backup: {str(e)}")
self._showMessage(self.catalog.i18nc("@info:backup_failed", "The following error occurred while trying to restore a Cura backup:") + str(e))
Message(self.catalog.i18nc("@info:backup_failed",
"The following error occurred while trying to restore a Cura backup:") + str(e),
title = self.catalog.i18nc("@info:title", "Backup"),
message_type = Message.MessageType.ERROR).show()
return False
extracted = self._extractArchive(archive, version_data_dir)

View File

@ -95,9 +95,11 @@ class BuildVolume(SceneNode):
self._edge_disallowed_size = None
self._build_volume_message = Message(catalog.i18nc("@info:status",
"The build volume height has been reduced due to the value of the"
" \"Print Sequence\" setting to prevent the gantry from colliding"
" with printed models."), title = catalog.i18nc("@info:title", "Build Volume"))
"The build volume height has been reduced due to the value of the"
" \"Print Sequence\" setting to prevent the gantry from colliding"
" with printed models."),
title = catalog.i18nc("@info:title", "Build Volume"),
message_type = Message.MessageType.WARNING)
self._global_container_stack = None # type: Optional[GlobalStack]

View File

@ -1798,8 +1798,10 @@ class CuraApplication(QtApplication):
if extension in self._non_sliceable_extensions:
message = Message(
self._i18n_catalog.i18nc("@info:status",
"Only one G-code file can be loaded at a time. Skipped importing {0}",
filename), title = self._i18n_catalog.i18nc("@info:title", "Warning"))
"Only one G-code file can be loaded at a time. Skipped importing {0}",
filename),
title = self._i18n_catalog.i18nc("@info:title", "Warning"),
message_type = Message.MessageType.WARNING)
message.show()
return
# If file being loaded is non-slicable file, then prevent loading of any other files
@ -1808,8 +1810,10 @@ class CuraApplication(QtApplication):
if extension in self._non_sliceable_extensions:
message = Message(
self._i18n_catalog.i18nc("@info:status",
"Can't open any other file if G-code is loading. Skipped importing {0}",
filename), title = self._i18n_catalog.i18nc("@info:title", "Error"))
"Can't open any other file if G-code is loading. Skipped importing {0}",
filename),
title = self._i18n_catalog.i18nc("@info:title", "Error"),
message_type = Message.MessageType.ERROR)
message.show()
return

View File

@ -2,9 +2,10 @@
# Cura is released under the terms of the LGPLv3 or higher.
import copy # To duplicate materials.
from PyQt5.QtCore import QObject, pyqtSignal, pyqtSlot # To allow the preference page proxy to be used from the actual preferences page.
from PyQt5.QtCore import pyqtProperty, pyqtSignal, pyqtSlot, QObject, QUrl
from typing import Any, Dict, Optional, TYPE_CHECKING
import uuid # To generate new GUIDs for new materials.
import zipfile # To export all materials in a .zip archive.
from UM.i18n import i18nCatalog
from UM.Logger import Logger
@ -20,11 +21,6 @@ if TYPE_CHECKING:
catalog = i18nCatalog("cura")
class MaterialManagementModel(QObject):
"""Proxy class to the materials page in the preferences.
This class handles the actions in that page, such as creating new materials, renaming them, etc.
"""
favoritesChanged = pyqtSignal(str)
"""Triggered when a favorite is added or removed.
@ -264,3 +260,40 @@ class MaterialManagementModel(QObject):
self.favoritesChanged.emit(material_base_file)
except ValueError: # Material was not in the favorites list.
Logger.log("w", "Material {material_base_file} was already not a favorite material.".format(material_base_file = material_base_file))
@pyqtSlot(result = QUrl)
def getPreferredExportAllPath(self) -> QUrl:
"""
Get the preferred path to export materials to.
If there is a removable drive, that should be the preferred path. Otherwise it should be the most recent local
file path.
:return: The preferred path to export all materials to.
"""
cura_application = cura.CuraApplication.CuraApplication.getInstance()
device_manager = cura_application.getOutputDeviceManager()
devices = device_manager.getOutputDevices()
for device in devices:
if device.__class__.__name__ == "RemovableDriveOutputDevice":
return QUrl.fromLocalFile(device.getId())
else: # No removable drives? Use local path.
return cura_application.getDefaultPath("dialog_material_path")
@pyqtSlot(QUrl)
def exportAll(self, file_path: QUrl) -> None:
"""
Export all materials to a certain file path.
:param file_path: The path to export the materials to.
"""
registry = CuraContainerRegistry.getInstance()
archive = zipfile.ZipFile(file_path.toLocalFile(), "w", compression = zipfile.ZIP_DEFLATED)
for metadata in registry.findInstanceContainersMetadata(type = "material"):
if metadata["base_file"] != metadata["id"]: # Only process base files.
continue
if metadata["id"] == "empty_material": # Don't export the empty material.
continue
material = registry.findContainers(id = metadata["id"])[0]
suffix = registry.getMimeTypeForContainer(type(material)).preferredSuffix
filename = metadata["id"] + "." + suffix
archive.writestr(filename, material.serialize())

View File

@ -74,5 +74,6 @@ class MultiplyObjectsJob(Job):
if not found_solution_for_all:
no_full_solution_message = Message(
i18n_catalog.i18nc("@info:status", "Unable to find a location within the build volume for all objects"),
title = i18n_catalog.i18nc("@info:title", "Placing Object"))
title = i18n_catalog.i18nc("@info:title", "Placing Object"),
message_type = Message.MessageType.WARNING)
no_full_solution_message.show()

View File

@ -186,8 +186,10 @@ class AuthorizationService:
self._server.start(verification_code, state)
except OSError:
Logger.logException("w", "Unable to create authorization request server")
Message(i18n_catalog.i18nc("@info", "Unable to start a new sign in process. Check if another sign in attempt is still active."),
title=i18n_catalog.i18nc("@info:title", "Warning")).show()
Message(i18n_catalog.i18nc("@info",
"Unable to start a new sign in process. Check if another sign in attempt is still active."),
title=i18n_catalog.i18nc("@info:title", "Warning"),
message_type = Message.MessageType.WARNING).show()
return
auth_url = self._generate_auth_url(query_parameters_dict, force_browser_logout)
@ -241,7 +243,10 @@ class AuthorizationService:
if self._unable_to_get_data_message is not None:
self._unable_to_get_data_message.hide()
self._unable_to_get_data_message = Message(i18n_catalog.i18nc("@info", "Unable to reach the Ultimaker account server."), title = i18n_catalog.i18nc("@info:title", "Warning"))
self._unable_to_get_data_message = Message(i18n_catalog.i18nc("@info",
"Unable to reach the Ultimaker account server."),
title = i18n_catalog.i18nc("@info:title", "Warning"),
message_type = Message.MessageType.ERROR)
self._unable_to_get_data_message.show()
except (ValueError, TypeError):
Logger.logException("w", "Could not load auth data from preferences")

View File

@ -141,20 +141,29 @@ class CuraContainerRegistry(ContainerRegistry):
success = profile_writer.write(file_name, container_list)
except Exception as e:
Logger.log("e", "Failed to export profile to %s: %s", file_name, str(e))
m = Message(catalog.i18nc("@info:status Don't translate the XML tags <filename> or <message>!", "Failed to export profile to <filename>{0}</filename>: <message>{1}</message>", file_name, str(e)),
m = Message(catalog.i18nc("@info:status Don't translate the XML tags <filename> or <message>!",
"Failed to export profile to <filename>{0}</filename>: <message>{1}</message>",
file_name, str(e)),
lifetime = 0,
title = catalog.i18nc("@info:title", "Error"))
title = catalog.i18nc("@info:title", "Error"),
message_type = Message.MessageType.ERROR)
m.show()
return False
if not success:
Logger.log("w", "Failed to export profile to %s: Writer plugin reported failure.", file_name)
m = Message(catalog.i18nc("@info:status Don't translate the XML tag <filename>!", "Failed to export profile to <filename>{0}</filename>: Writer plugin reported failure.", file_name),
m = Message(catalog.i18nc("@info:status Don't translate the XML tag <filename>!",
"Failed to export profile to <filename>{0}</filename>: Writer plugin reported failure.",
file_name),
lifetime = 0,
title = catalog.i18nc("@info:title", "Error"))
title = catalog.i18nc("@info:title", "Error"),
message_type = Message.MessageType.ERROR)
m.show()
return False
m = Message(catalog.i18nc("@info:status Don't translate the XML tag <filename>!", "Exported profile to <filename>{0}</filename>", file_name),
title = catalog.i18nc("@info:title", "Export succeeded"))
m = Message(catalog.i18nc("@info:status Don't translate the XML tag <filename>!",
"Exported profile to <filename>{0}</filename>",
file_name),
title = catalog.i18nc("@info:title", "Export succeeded"),
message_type = Message.MessageType.POSITIVE)
m.show()
return True

View File

@ -86,6 +86,14 @@ class GlobalStack(CuraContainerStack):
def supportsNetworkConnection(self):
return self.getMetaDataEntry("supports_network_connection", False)
@pyqtProperty(bool, constant = True)
def supportsMaterialExport(self):
"""
Whether the printer supports Cura's export format of material profiles.
:return: ``True`` if it supports it, or ``False`` if not.
"""
return self.getMetaDataEntry("supports_material_export", False)
@classmethod
def getLoadingPriority(cls) -> int:
return 2

View File

@ -853,7 +853,8 @@ class MachineManager(QObject):
self._global_container_stack.userChanges.setProperty(setting_key, "value", self._default_extruder_position)
if add_user_changes:
caution_message = Message(
catalog.i18nc("@info:message Followed by a list of settings.", "Settings have been changed to match the current availability of extruders:") + " [{settings_list}]".format(settings_list = ", ".join(add_user_changes)),
catalog.i18nc("@info:message Followed by a list of settings.",
"Settings have been changed to match the current availability of extruders:") + " [{settings_list}]".format(settings_list = ", ".join(add_user_changes)),
lifetime = 0,
title = catalog.i18nc("@info:title", "Settings updated"))
caution_message.show()

View File

@ -540,7 +540,8 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
"Project file <filename>{0}</filename> contains an unknown machine type"
" <message>{1}</message>. Cannot import the machine."
" Models will be imported instead.", file_name, machine_definition_id),
title = i18n_catalog.i18nc("@info:title", "Open Project File"))
title = i18n_catalog.i18nc("@info:title", "Open Project File"),
message_type = Message.MessageType.WARNING)
message.show()
Logger.log("i", "Could unknown machine definition %s in project file %s, cannot import it.",
@ -637,14 +638,16 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
except EnvironmentError as e:
message = Message(i18n_catalog.i18nc("@info:error Don't translate the XML tags <filename> or <message>!",
"Project file <filename>{0}</filename> is suddenly inaccessible: <message>{1}</message>.", file_name, str(e)),
title = i18n_catalog.i18nc("@info:title", "Can't Open Project File"))
title = i18n_catalog.i18nc("@info:title", "Can't Open Project File"),
message_type = Message.MessageType.ERROR)
message.show()
self.setWorkspaceName("")
return [], {}
except zipfile.BadZipFile as e:
message = Message(i18n_catalog.i18nc("@info:error Don't translate the XML tags <filename> or <message>!",
"Project file <filename>{0}</filename> is corrupt: <message>{1}</message>.", file_name, str(e)),
title = i18n_catalog.i18nc("@info:title", "Can't Open Project File"))
title = i18n_catalog.i18nc("@info:title", "Can't Open Project File"),
message_type = Message.MessageType.ERROR)
message.show()
self.setWorkspaceName("")
return [], {}
@ -696,7 +699,8 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
if not global_stacks:
message = Message(i18n_catalog.i18nc("@info:error Don't translate the XML tag <filename>!",
"Project file <filename>{0}</filename> is made using profiles that"
" are unknown to this version of Ultimaker Cura.", file_name))
" are unknown to this version of Ultimaker Cura.", file_name),
message_type = Message.MessageType.ERROR)
message.show()
self.setWorkspaceName("")
return [], {}

View File

@ -43,7 +43,9 @@ class CreateBackupJob(Job):
"""After the job completes, an empty string indicates success. Othrerwise, the value is a translated message."""
def run(self) -> None:
upload_message = Message(catalog.i18nc("@info:backup_status", "Creating your backup..."), title = self.MESSAGE_TITLE, progress = -1)
upload_message = Message(catalog.i18nc("@info:backup_status", "Creating your backup..."),
title = self.MESSAGE_TITLE,
progress = -1)
upload_message.show()
CuraApplication.getInstance().processEvents()
cura_api = CuraApplication.getInstance().getCuraAPI()

View File

@ -114,13 +114,17 @@ class DrivePluginExtension(QObject, Extension):
self.restoringStateChanged.emit()
if error_message:
self.backupIdBeingRestored = ""
Message(error_message, title = catalog.i18nc("@info:title", "Backup")).show()
Message(error_message,
title = catalog.i18nc("@info:title", "Backup"),
message_type = Message.MessageType.ERROR).show()
def _onCreatingStateChanged(self, is_creating: bool = False, error_message: str = None) -> None:
self._is_creating_backup = is_creating
self.creatingStateChanged.emit()
if error_message:
Message(error_message, title = catalog.i18nc("@info:title", "Backup")).show()
Message(error_message,
title = catalog.i18nc("@info:title", "Backup"),
message_type = Message.MessageType.ERROR).show()
else:
self._storeBackupDate()
if not is_creating and not error_message:

View File

@ -391,7 +391,9 @@ class CuraEngineBackend(QObject, Backend):
if job.getResult() == StartJobResult.MaterialIncompatible:
if application.platformActivity:
self._error_message = Message(catalog.i18nc("@info:status",
"Unable to slice with the current material as it is incompatible with the selected machine or configuration."), title = catalog.i18nc("@info:title", "Unable to slice"))
"Unable to slice with the current material as it is incompatible with the selected machine or configuration."),
title = catalog.i18nc("@info:title", "Unable to slice"),
message_type = Message.MessageType.WARNING)
self._error_message.show()
self.setState(BackendState.Error)
self.backendError.emit(job)
@ -421,8 +423,10 @@ class CuraEngineBackend(QObject, Backend):
continue
error_labels.add(definitions[0].label)
self._error_message = Message(catalog.i18nc("@info:status", "Unable to slice with the current settings. The following settings have errors: {0}").format(", ".join(error_labels)),
title = catalog.i18nc("@info:title", "Unable to slice"))
self._error_message = Message(catalog.i18nc("@info:status",
"Unable to slice with the current settings. The following settings have errors: {0}").format(", ".join(error_labels)),
title = catalog.i18nc("@info:title", "Unable to slice"),
message_type = Message.MessageType.WARNING)
self._error_message.show()
self.setState(BackendState.Error)
self.backendError.emit(job)
@ -445,8 +449,10 @@ class CuraEngineBackend(QObject, Backend):
Logger.log("e", "When checking settings for errors, unable to find definition for key {key} in per-object stack.".format(key = key))
continue
errors[key] = definition[0].label
self._error_message = Message(catalog.i18nc("@info:status", "Unable to slice due to some per-model settings. The following settings have errors on one or more models: {error_labels}").format(error_labels = ", ".join(errors.values())),
title = catalog.i18nc("@info:title", "Unable to slice"))
self._error_message = Message(catalog.i18nc("@info:status",
"Unable to slice due to some per-model settings. The following settings have errors on one or more models: {error_labels}").format(error_labels = ", ".join(errors.values())),
title = catalog.i18nc("@info:title", "Unable to slice"),
message_type = Message.MessageType.WARNING)
self._error_message.show()
self.setState(BackendState.Error)
self.backendError.emit(job)
@ -454,8 +460,10 @@ class CuraEngineBackend(QObject, Backend):
if job.getResult() == StartJobResult.BuildPlateError:
if application.platformActivity:
self._error_message = Message(catalog.i18nc("@info:status", "Unable to slice because the prime tower or prime position(s) are invalid."),
title = catalog.i18nc("@info:title", "Unable to slice"))
self._error_message = Message(catalog.i18nc("@info:status",
"Unable to slice because the prime tower or prime position(s) are invalid."),
title = catalog.i18nc("@info:title", "Unable to slice"),
message_type = Message.MessageType.WARNING)
self._error_message.show()
self.setState(BackendState.Error)
self.backendError.emit(job)
@ -463,8 +471,10 @@ class CuraEngineBackend(QObject, Backend):
self.setState(BackendState.NotStarted)
if job.getResult() == StartJobResult.ObjectsWithDisabledExtruder:
self._error_message = Message(catalog.i18nc("@info:status", "Unable to slice because there are objects associated with disabled Extruder %s.") % job.getMessage(),
title = catalog.i18nc("@info:title", "Unable to slice"))
self._error_message = Message(catalog.i18nc("@info:status",
"Unable to slice because there are objects associated with disabled Extruder %s.") % job.getMessage(),
title = catalog.i18nc("@info:title", "Unable to slice"),
message_type = Message.MessageType.WARNING)
self._error_message.show()
self.setState(BackendState.Error)
self.backendError.emit(job)
@ -476,7 +486,8 @@ class CuraEngineBackend(QObject, Backend):
"\n- Fit within the build volume"
"\n- Are assigned to an enabled extruder"
"\n- Are not all set as modifier meshes"),
title = catalog.i18nc("@info:title", "Unable to slice"))
title = catalog.i18nc("@info:title", "Unable to slice"),
message_type = Message.MessageType.WARNING)
self._error_message.show()
self.setState(BackendState.Error)
self.backendError.emit(job)

View File

@ -257,10 +257,10 @@ class ProcessSlicedLayersJob(Job):
if self.isRunning():
if Application.getInstance().getController().getActiveView().getPluginId() == "SimulationView":
if not self._progress_message:
self._progress_message = Message(catalog.i18nc("@info:status", "Processing Layers"), 0, False, 0, catalog.i18nc("@info:title", "Information"))
self._progress_message = Message(catalog.i18nc("@info:status", "Processing Layers"), 0, False, 0,
catalog.i18nc("@info:title", "Information"))
if self._progress_message.getProgress() != 100:
self._progress_message.show()
else:
if self._progress_message:
self._progress_message.hide()

View File

@ -73,6 +73,7 @@ class DFFileExportAndUploadManager:
text = "Your {} uploaded to '{}'.".format("file was" if len(self._file_upload_job_metadata) <= 1 else "files were", self._library_project_name),
title = "Upload successful",
lifetime = 0,
message_type = Message.MessageType.POSITIVE
)
self._generic_success_message.addAction(
"open_df_project",
@ -81,8 +82,6 @@ class DFFileExportAndUploadManager:
)
self._generic_success_message.actionTriggered.connect(self._onMessageActionTriggered)
def _onCuraProjectFileExported(self, job: ExportFileJob) -> None:
"""Handler for when the DF Library workspace file (3MF) has been created locally.
@ -221,7 +220,8 @@ class DFFileExportAndUploadManager:
self._file_upload_job_metadata[filename]["file_upload_failed_message"] = Message(
text = "Failed to export the file '{}'. The upload process is aborted.".format(filename),
title = "Export error",
lifetime = 0
lifetime = 0,
message_type = Message.MessageType.ERROR
)
self._on_upload_error()
self._onFileUploadFinished(filename)
@ -243,7 +243,8 @@ class DFFileExportAndUploadManager:
self._file_upload_job_metadata[filename_3mf]["file_upload_failed_message"] = Message(
text = "Failed to upload the file '{}' to '{}'. {}".format(filename_3mf, self._library_project_name, human_readable_error),
title = "File upload error",
lifetime = 0
lifetime = 0,
message_type = Message.MessageType.ERROR
)
self._on_upload_error()
self._onFileUploadFinished(filename_3mf)
@ -265,7 +266,8 @@ class DFFileExportAndUploadManager:
self._file_upload_job_metadata[filename_ufp]["file_upload_failed_message"] = Message(
title = "File upload error",
text = "Failed to upload the file '{}' to '{}'. {}".format(filename_ufp, self._library_project_name, human_readable_error),
lifetime = 0
lifetime = 0,
message_type = Message.MessageType.ERROR
)
self._on_upload_error()
self._onFileUploadFinished(filename_ufp)
@ -301,7 +303,8 @@ class DFFileExportAndUploadManager:
self._file_upload_job_metadata[filename]["file_upload_failed_message"] = Message(
title = "File upload error",
text = "Failed to upload the file '{}' to '{}'. {}".format(self._file_name, self._library_project_name, human_readable_error),
lifetime = 0
lifetime = 0,
message_type = Message.MessageType.ERROR
)
self._on_upload_error()
@ -338,11 +341,13 @@ class DFFileExportAndUploadManager:
text = "'{}' was uploaded to '{}'.".format(filename_3mf, self._library_project_name),
title = "Upload successful",
lifetime = 0,
message_type = Message.MessageType.POSITIVE
),
"file_upload_failed_message": Message(
text = "Failed to upload the file '{}' to '{}'.".format(filename_3mf, self._library_project_name),
title = "File upload error",
lifetime = 0
lifetime = 0,
message_type = Message.MessageType.ERROR
)
}
job_3mf = ExportFileJob(self._file_handlers["3mf"], self._nodes, self._file_name, "3mf")
@ -360,11 +365,13 @@ class DFFileExportAndUploadManager:
text = "'{}' was uploaded to '{}'.".format(filename_ufp, self._library_project_name),
title = "Upload successful",
lifetime = 0,
message_type = Message.MessageType.POSITIVE
),
"file_upload_failed_message": Message(
text = "Failed to upload the file '{}' to '{}'.".format(filename_ufp, self._library_project_name),
title = "File upload error",
lifetime = 0
lifetime = 0,
message_type = Message.MessageType.ERROR
)
}
job_ufp = ExportFileJob(self._file_handlers["ufp"], self._nodes, self._file_name, "ufp")

View File

@ -530,7 +530,8 @@ class DigitalFactoryController(QObject):
Message(
text = "Failed to write to temporary file for '{}'.".format(file_name),
title = "File-system error",
lifetime = 10
lifetime = 10,
message_type=Message.MessageType.ERROR
).show()
return
@ -544,7 +545,8 @@ class DigitalFactoryController(QObject):
Message(
text = "Failed Digital Library download for '{}'.".format(f),
title = "Network error {}".format(error),
lifetime = 10
lifetime = 10,
message_type=Message.MessageType.ERROR
).show()
download_manager = HttpRequestManager.getInstance()
@ -589,7 +591,10 @@ class DigitalFactoryController(QObject):
if filename == "":
Logger.log("w", "The file name cannot be empty.")
Message(text = "Cannot upload file with an empty name to the Digital Library", title = "Empty file name provided", lifetime = 0).show()
Message(text = "Cannot upload file with an empty name to the Digital Library",
title = "Empty file name provided",
lifetime = 0,
message_type = Message.MessageType.ERROR).show()
return
self._saveFileToSelectedProjectHelper(filename, formats)

View File

@ -500,7 +500,8 @@ class FlavorParser:
"@info:generic",
"Make sure the g-code is suitable for your printer and printer configuration before sending the file to it. The g-code representation may not be accurate."),
lifetime=0,
title = catalog.i18nc("@info:title", "G-code Details"))
title = catalog.i18nc("@info:title", "G-code Details"),
message_type = Message.MessageType.WARNING)
caution_message.show()
# The "save/print" button's state is bound to the backend state.

View File

@ -28,7 +28,8 @@ class ModelChecker(QObject, Extension):
self._caution_message = Message("", #Message text gets set when the message gets shown, to display the models in question.
lifetime = 0,
title = catalog.i18nc("@info:title", "3D Model Assistant"))
title = catalog.i18nc("@info:title", "3D Model Assistant"),
message_type = Message.MessageType.WARNING)
self._change_timer = QTimer()
self._change_timer.setInterval(200)

View File

@ -0,0 +1,11 @@
This is the folder for _bundled_ plugins. If you place any other plugins here,
they will not be seen or upgraded by any next version of Cura.
If you want your (unbundled) plugins to work after an upgrade,
please don't put them here, but install them either;
- via the Marketplace (recommended if available for that plugin),
- by dragging a `.curapackage` file onto Cura,
- or place it in the plugin folder in the configuration folder* for Cura.
*) The plugin sub-folder of the configuration folder can be found by:
Open up Help -> Show Configuration Folder -> Navigate to the plugins folder.

View File

@ -93,7 +93,9 @@ class RemovableDriveOutputDevice(OutputDevice):
job.progress.connect(self._onProgress)
job.finished.connect(self._onFinished)
message = Message(catalog.i18nc("@info:progress Don't translate the XML tags <filename>!", "Saving to Removable Drive <filename>{0}</filename>").format(self.getName()), 0, False, -1, catalog.i18nc("@info:title", "Saving"))
message = Message(catalog.i18nc("@info:progress Don't translate the XML tags <filename>!",
"Saving to Removable Drive <filename>{0}</filename>").format(self.getName()),
0, False, -1, catalog.i18nc("@info:title", "Saving"))
message.show()
self.writeStarted.emit(self)
@ -136,7 +138,8 @@ class RemovableDriveOutputDevice(OutputDevice):
except:
Logger.logException("w", "An execption occured while trying to write to removable drive.")
message = Message(catalog.i18nc("@info:status", "Could not save to removable drive {0}: {1}").format(self.getName(),str(job.getError())),
title = catalog.i18nc("@info:title", "Error"))
title = catalog.i18nc("@info:title", "Error"),
message_type = Message.MessageType.ERROR)
message.show()
self.writeError.emit(self)
return
@ -144,13 +147,19 @@ class RemovableDriveOutputDevice(OutputDevice):
self._writing = False
self.writeFinished.emit(self)
if job.getResult():
message = Message(catalog.i18nc("@info:status", "Saved to Removable Drive {0} as {1}").format(self.getName(), os.path.basename(job.getFileName())), title = catalog.i18nc("@info:title", "File Saved"))
message = Message(catalog.i18nc("@info:status", "Saved to Removable Drive {0} as {1}").format(self.getName(), os.path.basename(job.getFileName())),
title = catalog.i18nc("@info:title", "File Saved"),
message_type = Message.MessageType.POSITIVE)
message.addAction("eject", catalog.i18nc("@action:button", "Eject"), "eject", catalog.i18nc("@action", "Eject removable device {0}").format(self.getName()))
message.actionTriggered.connect(self._onActionTriggered)
message.show()
self.writeSuccess.emit(self)
else:
message = Message(catalog.i18nc("@info:status", "Could not save to removable drive {0}: {1}").format(self.getName(), str(job.getError())), title = catalog.i18nc("@info:title", "Warning"))
message = Message(catalog.i18nc("@info:status",
"Could not save to removable drive {0}: {1}").format(self.getName(),
str(job.getError())),
title = catalog.i18nc("@info:title", "Error"),
message_type = Message.MessageType.ERROR)
message.show()
self.writeError.emit(self)
job.getStream().close()
@ -159,8 +168,12 @@ class RemovableDriveOutputDevice(OutputDevice):
if action == "eject":
if Application.getInstance().getOutputDeviceManager().getOutputDevicePlugin("RemovableDriveOutputDevice").ejectDevice(self):
message.hide()
eject_message = Message(catalog.i18nc("@info:status", "Ejected {0}. You can now safely remove the drive.").format(self.getName()), title = catalog.i18nc("@info:title", "Safely Remove Hardware"))
eject_message = Message(catalog.i18nc("@info:status",
"Ejected {0}. You can now safely remove the drive.").format(self.getName()),
title = catalog.i18nc("@info:title", "Safely Remove Hardware"))
else:
eject_message = Message(catalog.i18nc("@info:status", "Failed to eject {0}. Another program may be using the drive.").format(self.getName()), title = catalog.i18nc("@info:title", "Warning"))
eject_message = Message(catalog.i18nc("@info:status",
"Failed to eject {0}. Another program may be using the drive.").format(self.getName()),
title = catalog.i18nc("@info:title", "Warning"),
message_type = Message.MessageType.ERROR)
eject_message.show()

View File

@ -125,10 +125,17 @@ class SimulationView(CuraView):
self._only_show_top_layers = bool(Application.getInstance().getPreferences().getValue("view/only_show_top_layers"))
self._compatibility_mode = self._evaluateCompatibilityMode()
self._wireprint_warning_message = Message(catalog.i18nc("@info:status", "Cura does not accurately display layers when Wire Printing is enabled."),
title = catalog.i18nc("@info:title", "Simulation View"))
self._slice_first_warning_message = Message(catalog.i18nc("@info:status", "Nothing is shown because you need to slice first."), title = catalog.i18nc("@info:title", "No layers to show"),
option_text = catalog.i18nc("@info:option_text", "Do not show this message again"), option_state = False)
self._wireprint_warning_message = Message(catalog.i18nc("@info:status",
"Cura does not accurately display layers when Wire Printing is enabled."),
title = catalog.i18nc("@info:title", "Simulation View"),
message_type = Message.MessageType.WARNING)
self._slice_first_warning_message = Message(catalog.i18nc("@info:status",
"Nothing is shown because you need to slice first."),
title = catalog.i18nc("@info:title", "No layers to show"),
option_text = catalog.i18nc("@info:option_text",
"Do not show this message again"),
option_state = False,
message_type = Message.MessageType.WARNING)
self._slice_first_warning_message.optionToggled.connect(self._onDontAskMeAgain)
CuraApplication.getInstance().getPreferences().addPreference(self._no_layers_warning_preference, True)

View File

@ -72,7 +72,8 @@ class SolidView(View):
lifetime = 60 * 5, # leave message for 5 minutes
title = catalog.i18nc("@info:title", "Model Errors"),
option_text = catalog.i18nc("@info:option_text", "Do not show this message again"),
option_state = False
option_state = False,
message_type=Message.MessageType.WARNING
)
self._xray_warning_message.optionToggled.connect(self._onDontAskMeAgain)
application.getPreferences().addPreference(self._show_xray_warning_preference, True)

View File

@ -15,10 +15,9 @@ class RestartApplicationPresenter:
def present(self) -> None:
app_name = self._app.getApplicationDisplayName()
message = Message(self._i18n_catalog.i18nc(
"@info:generic",
"You need to quit and restart {} before changes have effect.", app_name
))
message = Message(self._i18n_catalog.i18nc("@info:generic",
"You need to quit and restart {} before changes have effect.",
app_name))
message.addAction("quit",
name="Quit " + app_name,

View File

@ -111,4 +111,4 @@ class SyncOrchestrator(Extension):
"""Logs an error and shows it to the user"""
Logger.error(text)
Message(text, lifetime=0).show()
Message(text, lifetime = 0, message_type = Message.MessageType.ERROR).show()

View File

@ -230,7 +230,8 @@ class CloudOutputDeviceManager:
),
progress = 0,
lifetime = 0,
image_source = image_path
image_source = image_path,
message_type = Message.MessageType.POSITIVE
)
message.show()
@ -316,7 +317,8 @@ class CloudOutputDeviceManager:
"A cloud connection is not available for a printer",
"A cloud connection is not available for some printers",
len(self.reported_device_ids)
)
),
message_type = Message.MessageType.WARNING
)
device_names = "".join(["<li>{} ({})</li>".format(self._um_cloud_printers[device].name, self._um_cloud_printers[device].definition.name) for device in self.reported_device_ids])
message_text = self.i18n_catalog.i18ncp(

View File

@ -19,7 +19,8 @@ class LegacyDeviceNoLongerSupportedMessage(Message):
"running Ultimaker Connect. Please update the printer to the "
"latest firmware."),
title = I18N_CATALOG.i18nc("@info:title", "Update your printer"),
lifetime = 10
lifetime = 10,
message_type = Message.MessageType.WARNING
)
def show(self) -> None:

View File

@ -25,8 +25,7 @@ class MaterialSyncMessage(Message):
"on the host printer of group {0}.", device.name),
title = I18N_CATALOG.i18nc("@info:title", "Sending materials to printer"),
lifetime = 10,
dismissable = True
)
dismissable = True)
def show(self) -> None:
if MaterialSyncMessage.__is_visible:

View File

@ -29,7 +29,8 @@ class NotClusterHostMessage(Message):
"it as a group host.", device.name),
title = I18N_CATALOG.i18nc("@info:title", "Not a group host"),
lifetime = 0,
dismissable = True
dismissable = True,
message_type = Message.MessageType.ERROR
)
self._address = device.address
self.addAction("", I18N_CATALOG.i18nc("@action", "Configure group"), "", "")

View File

@ -14,5 +14,6 @@ class PrintJobUploadBlockedMessage(Message):
super().__init__(
text = I18N_CATALOG.i18nc("@info:status", "Please wait until the current job has been sent."),
title = I18N_CATALOG.i18nc("@info:title", "Print error"),
lifetime = 10
lifetime = 10,
message_type = Message.MessageType.ERROR
)

View File

@ -13,5 +13,6 @@ class PrintJobUploadErrorMessage(Message):
def __init__(self, message: str = None) -> None:
super().__init__(
text = message or I18N_CATALOG.i18nc("@info:text", "Could not upload the data to the printer."),
title = I18N_CATALOG.i18nc("@info:title", "Network error")
title = I18N_CATALOG.i18nc("@info:title", "Network error"),
message_type=Message.MessageType.ERROR
)

View File

@ -15,5 +15,6 @@ class PrintJobUploadQueueFullMessage(Message):
super().__init__(
text = I18N_CATALOG.i18nc("@info:status", "Print job queue is full. The printer can't accept a new job."),
title = I18N_CATALOG.i18nc("@info:title", "Queue Full"),
lifetime = 10
lifetime = 10,
message_type=Message.MessageType.ERROR
)

View File

@ -13,5 +13,6 @@ class PrintJobUploadSuccessMessage(Message):
def __init__(self) -> None:
super().__init__(
text = I18N_CATALOG.i18nc("@info:status", "Print job was successfully sent to the printer."),
title = I18N_CATALOG.i18nc("@info:title", "Data Sent")
title = I18N_CATALOG.i18nc("@info:title", "Data Sent"),
message_type = Message.MessageType.POSITIVE
)

View File

@ -131,7 +131,10 @@ class USBPrinterOutputDevice(PrinterOutputDevice):
"""
if self._is_printing:
message = Message(text = catalog.i18nc("@message", "A print is still in progress. Cura cannot start another print via USB until the previous print has completed."), title = catalog.i18nc("@message", "Print in Progress"))
message = Message(text = catalog.i18nc("@message",
"A print is still in progress. Cura cannot start another print via USB until the previous print has completed."),
title = catalog.i18nc("@message", "Print in Progress"),
message_type = Message.MessageType.ERROR)
message.show()
return # Already printing
self.writeStarted.emit(self)

View File

@ -30,7 +30,6 @@ requests==2.22.0
sentry-sdk==0.13.5
six==1.12.0
trimesh==3.2.33
urllib3==1.25.6
zeroconf==0.24.1
comtypes==1.1.7
pywin32==300

View File

@ -0,0 +1,11 @@
This is the folder for _bundled_ resources. If you place, or tinker with,
any resources here, they will not be seen or upgraded by next versions of Cura.
If you want your (unbundled or altered) resources to work after an upgrade,
please don't put them here, but install them either;
- for materials: via the Marketplace (recommended if avialable),
- by dragging a `.curapackage` file onto Cura,
- or place it in the right sub-folder in the configuration folder* for Cura.
*) The configuration folder can be found by:
Open up Help -> Show Configuration Folder

View File

@ -43,7 +43,7 @@
]
},
"machine_start_gcode": {
"default_value": "; BIQU BX Start G-code\r\n; For inforation on how to tune this profile and get the\r\n; most out of your BX visit: https:\/\/github.com\/looxonline\/Marlin\r\n; For the official github site visit: https:\/\/github.com\/bigtreetech\/BIQU-BX\r\n\r\nM117 Initial homing sequence. ; Home so that the probe is positioned to heat\r\nG28\r\n\r\nM117 Probe heating position\r\nG0 X65 Y5 Z1 ; Move the probe to the heating position.\r\n\r\nM117 Getting the heaters up to temp!\r\nM104 S140 ; Set Extruder temperature, no wait\r\nM140 S60 ; Set Heat Bed temperature\r\nM190 S60 ; Wait for Heat Bed temperature\r\n\r\nM117 Waiting for probe to warm! ; Wait another 90s for the probe to absorb heat.\r\nG4 S90 \r\n\r\nM117 Post warming re-home\r\nG28 ; Home all axes again after warming\r\n\r\nM117 Z-Dance of my people\r\nG34\r\n\r\nM117 ABL Probing\r\nG29\r\n\r\nM900 K0 L0 T0 ;Edit the K and L values if you have calibrated a k factor for your filament\r\nM900 T0 S0\r\n\r\nG1 Z2.0 F3000 ; Move Z Axis up little to prevent scratching of Heat Bed\r\nG1 X4.1 Y10 Z0.3 F5000.0 ; Move to start position\r\n\r\nM117 Getting the extruder up to temp\r\nM140 S{material_bed_temperature_layer_0} ; Set Heat Bed temperature\r\nM104 S{material_print_temperature_layer_0} ; Set Extruder temperature\r\nM109 S{material_print_temperature_layer_0} ; Wait for Extruder temperature\r\nM190 S{material_bed_temperature_layer_0} ; Wait for Heat Bed temperature\r\n\r\nG92 E0 ; Reset Extruder\r\nM117 Purging\r\nG1 X4.1 Y200.0 Z0.3 F1500.0 E15 ; Draw the first line\r\nG1 X4.4 Y200.0 Z0.3 F5000.0 ; Move to side a little\r\nG1 X4.4 Y20 Z0.3 F1500.0 E30 ; Draw the second line\r\nG92 E0 ; Reset Extruder\r\nM117 Lets make\r\nG1 X8 Y20 Z0.3 F5000.0 ; Move over to prevent blob squish"
"default_value": "; BIQU BX Start G-code\r\n; For information on how to tune this profile and get the\r\n; most out of your BX visit: https:\/\/github.com\/looxonline\/Marlin\r\n; For the official github site visit: https:\/\/github.com\/bigtreetech\/BIQU-BX\r\n\r\nM117 Initial homing sequence. ; Home so that the probe is positioned to heat\r\nG28\r\n\r\nM117 Probe heating position\r\nG0 X65 Y5 Z1 ; Move the probe to the heating position.\r\n\r\nM117 Getting the heaters up to temp!\r\nM104 S140 ; Set Extruder temperature, no wait\r\nM140 S60 ; Set Heat Bed temperature\r\nM190 S60 ; Wait for Heat Bed temperature\r\n\r\nM117 Waiting for probe to warm! ; Wait another 90s for the probe to absorb heat.\r\nG4 S90 \r\n\r\nM117 Post warming re-home\r\nG28 ; Home all axes again after warming\r\n\r\nM117 Z-Dance of my people\r\nG34\r\n\r\nM117 ABL Probing\r\nG29\r\n\r\nM900 K0 L0 T0 ;Edit the K and L values if you have calibrated a k factor for your filament\r\nM900 T0 S0\r\n\r\nG1 Z2.0 F3000 ; Move Z Axis up little to prevent scratching of Heat Bed\r\nG1 X4.1 Y10 Z0.3 F5000.0 ; Move to start position\r\n\r\nM117 Getting the extruder up to temp\r\nM140 S{material_bed_temperature_layer_0} ; Set Heat Bed temperature\r\nM104 S{material_print_temperature_layer_0} ; Set Extruder temperature\r\nM109 S{material_print_temperature_layer_0} ; Wait for Extruder temperature\r\nM190 S{material_bed_temperature_layer_0} ; Wait for Heat Bed temperature\r\n\r\nG92 E0 ; Reset Extruder\r\nM117 Purging\r\nG1 X4.1 Y200.0 Z0.3 F1500.0 E15 ; Draw the first line\r\nG1 X4.4 Y200.0 Z0.3 F5000.0 ; Move to side a little\r\nG1 X4.4 Y20 Z0.3 F1500.0 E30 ; Draw the second line\r\nG92 E0 ; Reset Extruder\r\nM117 Lets make\r\nG1 X8 Y20 Z0.3 F5000.0 ; Move over to prevent blob squish"
},
"gantry_height": { "value": 27.5 }

View File

@ -0,0 +1,279 @@
{
"name": "Kingroon Base Printer",
"version": 2,
"inherits": "fdmprinter",
"metadata": {
"visible": false,
"author": "notamu",
"manufacturer": "Kingroon",
"file_formats": "text/x-gcode",
"first_start_actions": ["MachineSettingsAction"],
"machine_extruder_trains": {
"0": "kingroon_base_extruder_0"
},
"has_materials": true,
"has_variants": true,
"has_machine_quality": true,
"variants_name": "Nozzle Size",
"preferred_variant_name": "0.4mm Nozzle",
"preferred_quality_type": "standard",
"preferred_material": "generic_pla",
"exclude_materials": [
"3D-Fuel_PLA_PRO_Black",
"3D-Fuel_PLA_SnapSupport",
"bestfilament_abs_skyblue",
"bestfilament_petg_orange",
"bestfilament_pla_green",
"chromatik_pla",
"dsm_arnitel2045_175",
"dsm_novamid1070_175",
"emotiontech_abs",
"emotiontech_absx",
"emotiontech_acetate",
"emotiontech_asax",
"emotiontech_copa",
"emotiontech_nylon_1030",
"emotiontech_nylon_1030cf",
"emotiontech_nylon_1070",
"emotiontech_pc",
"emotiontech_petg",
"emotiontech_pla",
"emotiontech_pla_hr_870",
"emotiontech_bvoh",
"emotiontech_hips",
"emotiontech_pva-m",
"emotiontech_pva-s",
"emotiontech_tpu98a",
"eSUN_PLA_PRO_White",
"eSUN_PETG_Black",
"eSUN_PETG_Grey",
"eSUN_PETG_Purple",
"eSUN_PLA_PRO_Black",
"eSUN_PLA_PRO_Grey",
"eSUN_PLA_PRO_Purple",
"fabtotum_abs",
"fabtotum_nylon",
"fabtotum_pla",
"fabtotum_tpu",
"fdplast_pla_olive",
"fdplast_abs_tomato",
"fdplast_petg_gray",
"fiberlogy_hd_pla",
"filo3d_pla",
"filo3d_pla_green",
"filo3d_pla_red",
"generic_cpe_175",
"generic_hips_175",
"generic_nylon_175",
"generic_pc_175",
"generic_pva_175",
"imade3d_petg_175",
"imade3d_pla_175",
"innofill_innoflex60_175",
"layer_one_white_pla",
"layer_one_black_pla",
"layer_one_dark_gray_pla",
"leapfrog_pva_natural",
"leapfrog_abs_natural",
"leapfrog_epla_natural",
"octofiber_pla",
"polyflex_pla",
"polymax_pla",
"polyplus_pla",
"polywood_pla",
"redd_tpe",
"redd_abs",
"redd_asa",
"redd_hips",
"redd_nylon",
"redd_petg",
"redd_pla",
"tizyx_flex",
"tizyx_petg",
"tizyx_pla",
"tizyx_pla_bois",
"tizyx_pva",
"tizyx_abs",
"verbatim_bvoh_175",
"Vertex_Delta_TPU",
"Vertex_Delta_ABS",
"Vertex_Delta_PET",
"Vertex_Delta_PLA",
"Vertex_Delta_PLA_Glitter",
"Vertex_Delta_PLA_Mat",
"Vertex_Delta_PLA_Satin",
"Vertex_Delta_PLA_Wood",
"volumic_support_ultra",
"volumic_abs_ultra",
"volumic_arma_ultra",
"volumic_asa_ultra",
"volumic_br80_ultra",
"volumic_bumper_ultra",
"volumic_cu80_ultra",
"volumic_flex93_ultra",
"volumic_medical_ultra",
"volumic_nylon_ultra",
"volumic_pekk_carbone",
"volumic_petg_ultra",
"volumic_petgcarbone_ultra",
"volumic_pla_ultra",
"volumic_pp_ultra",
"volumic_strong_ultra",
"zyyx_pro_flex",
"zyyx_pro_pla"
]
},
"overrides": {
"machine_name": { "default_value": "Kingroon Base Printer" },
"machine_start_gcode": { "default_value": "G28 ; home all axes\n M117 Purge extruder\n G92 E0 ; reset extruder\n G1 Z1.0 F3000 ; move z up little to prevent scratching of surface\n G1 X2 Y20 Z0.3 F5000.0 ; move to start-line position\n G1 X2 Y175.0 Z0.3 F1500.0 E15 ; draw 1st line\n G1 X2 Y175.0 Z0.4 F5000.0 ; move to side a little\n G1 X2 Y20 Z0.4 F1500.0 E30 ; draw 2nd line\n G92 E0 ; reset extruder\n G1 Z1.0 F3000 ; move z up little to prevent scratching of surface"},
"machine_end_gcode": { "default_value": "G91; relative positioning\n G1 Z1.0 F3000 ; move z up little to prevent scratching of print\n G90; absolute positioning\n G1 X0 Y200 F1000 ; prepare for part removal\n M104 S0; turn off extruder\n M140 S0 ; turn off bed\n G1 X0 Y300 F1000 ; prepare for part removal\n M84 ; disable motors\n M106 S0 ; turn off fan" },
"machine_width": { "default_value": 180 },
"machine_depth": { "default_value": 180 },
"machine_height": { "default_value": 180 },
"machine_max_feedrate_x": { "default_value": 100 },
"machine_max_feedrate_y": { "default_value": 100 },
"machine_max_feedrate_z": { "default_value": 10 },
"machine_max_feedrate_e": { "default_value": 100 },
"machine_max_acceleration_x": { "default_value": 500 },
"machine_max_acceleration_y": { "default_value": 500 },
"machine_max_acceleration_z": { "default_value": 50 },
"machine_max_acceleration_e": { "default_value": 500 },
"machine_acceleration": { "default_value": 500 },
"machine_max_jerk_xy": { "default_value": 10 },
"machine_max_jerk_z": { "default_value": 0.3 },
"machine_max_jerk_e": { "default_value": 5 },
"machine_heated_bed": { "default_value": true },
"material_diameter": { "default_value": 1.75 },
"acceleration_print": { "value": 500 },
"acceleration_travel": { "value": 500 },
"acceleration_travel_layer_0": { "value": "acceleration_travel" },
"acceleration_roofing": { "enabled": "acceleration_enabled and roofing_layer_count > 0 and top_layers > 0" },
"jerk_print": { "value": 8 },
"jerk_travel": { "value": "jerk_print" },
"jerk_travel_layer_0": { "value": "jerk_travel" },
"acceleration_enabled": { "value": false },
"jerk_enabled": { "value": false },
"default_material_print_temperature": { "maximum_value_warning": "260", "maximum_value": "275" },
"default_material_bed_temperature": { "maximum_value": "150" },
"speed_print": { "value": 60.0 } ,
"speed_infill": { "value": "speed_print" },
"speed_wall": { "value": "speed_print / 2" },
"speed_wall_0": { "value": "speed_wall" },
"speed_wall_x": { "value": "speed_wall" },
"speed_topbottom": { "value": "speed_print / 2" },
"speed_roofing": { "value": "speed_topbottom" },
"speed_travel": { "value": "150.0 if speed_print < 60 else 250.0 if speed_print > 100 else speed_print * 2.5" },
"speed_layer_0": { "value": 20.0 },
"speed_print_layer_0": { "value": "speed_layer_0" },
"speed_travel_layer_0": { "value": "100 if speed_layer_0 < 20 else 150 if speed_layer_0 > 30 else speed_layer_0 * 5" },
"speed_prime_tower": { "value": "speed_topbottom" },
"speed_support": { "value": "speed_wall_0" },
"speed_support_interface": { "value": "speed_topbottom" },
"speed_z_hop": { "value": 5 },
"skirt_brim_speed": { "value": "speed_layer_0" },
"line_width": { "value": "machine_nozzle_size * 1.1" },
"optimize_wall_printing_order": { "value": true },
"material_initial_print_temperature": { "value": "material_print_temperature" },
"material_final_print_temperature": { "value": "material_print_temperature" },
"material_flow": { "value": 100 },
"travel_compensate_overlapping_walls_0_enabled": { "value": false },
"z_seam_type": { "value": "'back'" },
"z_seam_corner": { "value": "'z_seam_corner_none'" },
"infill_sparse_density": { "value": "15" },
"infill_pattern": { "value": "'lines' if infill_sparse_density > 50 else 'cubic'" },
"infill_before_walls": { "value": false },
"infill_overlap": { "value": 30.0 },
"skin_overlap": { "value": 10.0 },
"infill_wipe_dist": { "value": 0.0 },
"wall_0_wipe_dist": { "value": 0.0 },
"fill_perimeter_gaps": { "value": "'everywhere'" },
"fill_outline_gaps": { "value": false },
"filter_out_tiny_gaps": { "value": false },
"retraction_speed": {
"maximum_value_warning": "machine_max_feedrate_e if retraction_enable else float('inf')",
"maximum_value": 200
},
"retraction_retract_speed": {
"maximum_value_warning": "machine_max_feedrate_e if retraction_enable else float('inf')",
"maximum_value": 200
},
"retraction_prime_speed": {
"maximum_value_warning": "machine_max_feedrate_e if retraction_enable else float('inf')",
"maximum_value": 200
},
"retraction_hop_enabled": { "value": true },
"retraction_hop": { "value": "layer_height*2" },
"retraction_combing": { "value": "'off' if retraction_hop_enabled else 'infill'" },
"retraction_combing_max_distance": { "value": 30 },
"travel_avoid_other_parts": { "value": true },
"travel_avoid_supports": { "value": true },
"travel_retract_before_outer_wall": { "value": true },
"retraction_amount": { "value": 2 },
"retraction_enable": { "value": true },
"retraction_count_max": { "value": 100 },
"retraction_extrusion_window": { "value": 2 },
"retraction_min_travel": { "value": 1.5 },
"cool_fan_full_at_height": { "value": "layer_height_0 + 2 * layer_height" },
"cool_fan_enabled": { "value": true },
"cool_min_layer_time": { "value": 10 },
"adhesion_type": { "value": "'none' if support_enable else 'skirt'" },
"brim_replaces_support": { "value": false },
"skirt_gap": { "value": 10.0 },
"skirt_line_count": { "value": 4 },
"adaptive_layer_height_variation": { "value": 0.04 },
"adaptive_layer_height_variation_step": { "value": 0.04 },
"meshfix_maximum_resolution": { "value": "0.05" },
"meshfix_maximum_travel_resolution": { "value": "meshfix_maximum_resolution" },
"support_angle": { "value": "math.floor(math.degrees(math.atan(line_width / 2.0 / layer_height)))" },
"support_pattern": { "value": "'zigzag'" },
"support_infill_rate": { "value": "0 if support_enable and support_structure == 'tree' else 20" },
"support_use_towers": { "value": false },
"support_xy_distance": { "value": "wall_line_width_0 * 2" },
"support_xy_distance_overhang": { "value": "wall_line_width_0" },
"support_z_distance": { "value": "layer_height if layer_height >= 0.16 else layer_height * 2" },
"support_xy_overrides_z": { "value": "'xy_overrides_z'" },
"support_wall_count": { "value": 1 },
"support_brim_enable": { "value": true },
"support_brim_width": { "value": 4 },
"support_interface_enable": { "value": true },
"support_interface_height": { "value": "layer_height * 4" },
"support_interface_density": { "value": 33.333 },
"support_interface_pattern": { "value": "'grid'" },
"support_interface_skip_height": { "value": 0.2 },
"minimum_support_area": { "value": 2 },
"minimum_interface_area": { "value": 10 },
"top_bottom_thickness": {"value": "layer_height_0 + layer_height * 3" },
"wall_thickness": {"value": "line_width * 2" }
}
}

View File

@ -0,0 +1,22 @@
{
"name": "Kingroon KP3",
"version": 2,
"inherits": "kingroon_base",
"overrides": {
"machine_name": { "default_value": "Kingroon KP3" },
"machine_steps_per_mm_x": { "value": 80 },
"machine_steps_per_mm_y": { "value": 80 },
"machine_steps_per_mm_z": { "value": 400 },
"machine_steps_per_mm_e": { "value": 95 },
"retraction_amount": { "value": 4 },
"retraction_speed": { "value": 40 },
"retraction_extrusion_window": { "value": 4 },
"speed_travel": { "value": 100 }
},
"metadata": {
"quality_definition": "kingroon_base",
"visible": true,
"platform": "kingroon_kp3.stl"
}
}

View File

@ -0,0 +1,33 @@
{
"name": "Kingroon KP3S",
"version": 2,
"inherits": "kingroon_base",
"overrides": {
"machine_name": { "default_value": "Kingroon KP3S" },
"machine_steps_per_mm_x": { "value": 160 },
"machine_steps_per_mm_y": { "value": 160 },
"machine_steps_per_mm_z": { "value": 800 },
"machine_steps_per_mm_e": { "value": 764 },
"machine_max_feedrate_x": { "value": 200 },
"machine_max_feedrate_y": { "value": 200 },
"machine_max_feedrate_z": { "value": 4 },
"machine_max_feedrate_e": { "value": 100 },
"machine_max_acceleration_x": { "value": 1000 },
"machine_max_acceleration_y": { "value": 1000 },
"machine_max_acceleration_z": { "value": 100 },
"machine_max_acceleration_e": { "value": 1000 },
"machine_acceleration": { "value": 1000 },
"machine_max_jerk_xy": { "value": 15 },
"machine_max_jerk_z": { "value": 0.4 },
"retraction_amount": { "value": 1 },
"retraction_speed": { "value": 40 },
"retraction_extrusion_window": { "value": 1 },
"speed_z_hop": { "value": 4 }
},
"metadata": {
"quality_definition": "kingroon_base",
"visible": true,
"platform": "kingroon_kp3s.stl"
}
}

View File

@ -3,7 +3,7 @@
"name": "MP Mini Delta",
"inherits": "fdmprinter",
"metadata": {
"author": "MPMD Facebook Group",
"author": "MPMD V1 Facebook Group",
"manufacturer": "Monoprice",
"file_formats": "text/x-gcode",
"platform": "mp_mini_delta_platform.3mf",
@ -25,7 +25,7 @@
"overrides": {
"machine_start_gcode":
{
"default_value": ";MPMD Basic Calibration Tutorial: \n; https://www.thingiverse.com/thing:3892011 \n; \n; If you want to put calibration values in your \n; Start Gcode, put them here. \n; \n;If on stock firmware, at minimum, consider adding \n;M665 R here since there is a firmware bug. \n; \n; Calibration part ends here \n; \nG90 ; switch to absolute positioning \nG92 E0 ; reset extrusion distance \nG1 E20 F200 ; purge 20mm of filament to prime nozzle. \nG92 E0 ; reset extrusion distance \nG4 S5 ; Pause for 5 seconds to allow time for removing extruded filament \nG28 ; start from home position \nG1 E-6 F900 ; retract 6mm of filament before starting the bed leveling process \nG92 E0 ; reset extrusion distance \nG4 S5 ; pause for 5 seconds to allow time for removing extruded filament \nG29 P2 Z0.28 ; Auto-level ; ADJUST Z higher or lower to set first layer height. Start with 0.02 adjustments. \nG1 Z30 ; raise Z 30mm to prepare for priming the nozzle \nG1 E5 F200 ; extrude 5mm of filament to help prime the nozzle just prior to the start of the print \nG92 E0 ; reset extrusion distance \nG4 S5 ; pause for 5 seconds to allow time for cleaning the nozzle and build plate if needed "
"default_value": ";MPMD V1 Basic Calibration Tutorial: \n; https://www.thingiverse.com/thing:3892011 \n; \n; If you want to put calibration values in your \n; Start Gcode, put them here. \n; \n;If on stock firmware, at minimum, consider adding \n;M665 R here since there is a firmware bug. \n; \n; Calibration part ends here \n; \nG90 ; switch to absolute positioning \nG92 E0 ; reset extrusion distance \nG1 E20 F200 ; purge 20mm of filament to prime nozzle. \nG92 E0 ; reset extrusion distance \nG4 S5 ; Pause for 5 seconds to allow time for removing extruded filament \nG28 ; start from home position \nG1 E-6 F900 ; retract 6mm of filament before starting the bed leveling process \nG92 E0 ; reset extrusion distance \nG4 S5 ; pause for 5 seconds to allow time for removing extruded filament \nG29 P2 Z0.28 ; Auto-level ; ADJUST Z higher or lower to set first layer height. Start with 0.02 adjustments. \nG1 Z30 ; raise Z 30mm to prepare for priming the nozzle \nG1 E5 F200 ; extrude 5mm of filament to help prime the nozzle just prior to the start of the print \nG92 E0 ; reset extrusion distance \nG4 S5 ; pause for 5 seconds to allow time for cleaning the nozzle and build plate if needed "
},
"machine_end_gcode":
{
@ -47,9 +47,9 @@
"default_value": 0.21
},
"material_bed_temperature": { "value": 40 },
"line_width": { "value": "round(machine_nozzle_size * 0.875, 2)" },
"material_print_temperature_layer_0": { "value": "material_print_temperature + 5" },
"material_bed_temperature_layer_0": { "value": "material_bed_temperature + 5" },
"line_width": { "value": "round(machine_nozzle_size, 2)" },
"material_print_temperature_layer_0": { "value": "material_print_temperature" },
"material_bed_temperature_layer_0": { "value": "material_bed_temperature" },
"machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" },
"machine_max_feedrate_x": { "default_value": 150 },
"machine_max_feedrate_y": { "default_value": 150 },

View File

@ -0,0 +1,51 @@
{
"version": 2,
"name": "MP Mini Delta V2",
"inherits": "fdmprinter",
"metadata": {
"author": "mpminidelta subreddit",
"manufacturer": "Monoprice",
"file_formats": "text/x-gcode",
"platform": "mp_mini_delta_platform.3mf",
"supports_usb_connection": true,
"has_machine_quality": false,
"visible": true,
"platform_offset": [0, 0, 0],
"has_materials": true,
"has_variants": false,
"has_machine_materials": false,
"has_variant_materials": false,
"preferred_quality_type": "normal",
"machine_extruder_trains":
{
"0": "mp_mini_delta_v2_extruder_0"
}
},
"overrides": {
"machine_start_gcode":
{
"default_value": ";(**** start.gcode for MP Mini Delta V2****)\nG21\nG90\nM82\nM107\nM104 S170\nG28 X0 Y0\nG28 Z0\nG29 Z0.4\nG1 Z15 F300\nM109 S{material_print_temperature_layer_0}\nG92 E0\nG1 F200 E3\nG92 E0\nG1 F2000\n"
},
"machine_end_gcode": {
"default_value": ";(**** end.gcode for MP Mini Delta V2****)\nG28;(Stick out the part)\nM190 S0;(Turn off heat bed, don't wait.)\nG92 E10;(Set extruder to 10)\nG1 E7 F200;(retract 3mm)\nM104 S0;(Turn off nozzle, don't wait)\nG4 S300;(Delay 5 minutes)\nM107;(Turn off part fan)\nM84;(Turn off stepper motors.)"
},
"material_print_temp_prepend":{"default_value":false},
"material_bed_temperature": { "value": 40 },
"machine_width": { "default_value": 110 },
"machine_depth": { "default_value": 110 },
"machine_height": { "default_value": 120 },
"machine_heated_bed": { "default_value": true },
"machine_shape": { "default_value": "elliptic" },
"machine_center_is_zero": { "default_value": true },
"machine_nozzle_size": {
"default_value": 0.4
},
"line_width": { "value": "round(machine_nozzle_size, 2)" },
"machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" },
"retraction_amount": { "default_value": 5 },
"retraction_speed": { "default_value": 28 },
"retraction_hop_enabled": { "default_value": false },
"retract_at_layer_change": { "default_value": true }
}
}

View File

@ -0,0 +1,59 @@
{
"version": 2,
"name": "SecKit SK-Go",
"inherits": "fdmprinter",
"metadata": {
"visible": true,
"author": "Ernest Lin",
"manufacturer": "SecKit 3DP Design",
"file_formats": "text/x-gcode",
"has_materials": true,
"has_machine_quality": false,
"preferred_quality_type": "normal",
"machine_extruder_trains":
{
"0": "seckit_skgo_extruder_0"
}
},
"overrides": {
"machine_name": { "default_value": "SecKit SK-Go" },
"machine_width": {
"default_value": 310
},
"machine_depth": {
"default_value": 310
},
"machine_height": {
"default_value": 350
},
"machine_center_is_zero": {
"default_value": false
},
"machine_heated_bed": {
"default_value": true
},
"machine_head_with_fans_polygon":
{
"default_value": [
[ -10, 20 ],
[ -10, -20 ],
[ 10, 20 ],
[ 10, -20 ]
]
},
"gantry_height": {
"value": "50"
},
"machine_gcode_flavor": {
"default_value": "RepRap (Marlin/Sprinter)"
},
"machine_start_gcode": {
"default_value": "M569 S1 X Y ; enable StealthChop for Sensorless Homing\nG28 ; Home\nM569 S0 X Y ; disable StealthChop for normal print\nM900 K0.07 ; K factor of linear advance\nG1 Z15.0 F6000 ;Move the platform down 15mm\n;Prime the extruder\nG92 E0\nG1 F200 E3\nG92 E0\nG90 ; abs position"
},
"machine_end_gcode": {
"default value": "M104 S0\nM140 S0\nG91 ; relative position\nG1 Z10 F450\n;Retract the filament\nG92 E1\nG1 E-1 F300\nG90 ; abs position\nG1 X10 Y280 F6000\nM84"
}
}
}

View File

@ -0,0 +1,59 @@
{
"version": 2,
"name": "SecKit SK-Tank",
"inherits": "fdmprinter",
"metadata": {
"visible": true,
"author": "Ernest Lin",
"manufacturer": "SecKit 3DP Design",
"file_formats": "text/x-gcode",
"has_materials": true,
"has_machine_quality": false,
"preferred_quality_type": "normal",
"machine_extruder_trains":
{
"0": "seckit_sktank_extruder_0"
}
},
"overrides": {
"machine_name": { "default_value": "SecKit SK-Tank" },
"machine_width": {
"default_value": 350
},
"machine_depth": {
"default_value": 350
},
"machine_height": {
"default_value": 400
},
"machine_center_is_zero": {
"default_value": false
},
"machine_heated_bed": {
"default_value": true
},
"machine_head_with_fans_polygon":
{
"default_value": [
[ -10, 20 ],
[ -10, -20 ],
[ 10, 20 ],
[ 10, -20 ]
]
},
"gantry_height": {
"value": "50"
},
"machine_gcode_flavor": {
"default_value": "RepRap (RepRap)"
},
"machine_start_gcode": {
"default_value": "G32 ;auto bed tramming and find a correct Z datum\nG29 S1 ;load default mesh\nM572 D0 S0.08 ; Pressure advance\nG1 Z15.0 F6000 ;Move the platform down 15mm\n;Prime the extruder\nG92 E0\nG1 F200 E3\nG92 E0"
},
"machine_end_gcode": {
"default value": "M104 S0\nM140 S0\n;Retract the filament\nG92 E1\nG1 E-1 F300\nG90\nG1 X2 Y300 F6000\n; move bed to the bottom to prevent bed falls\n;G91\n;G1 Z300\nM106 P0 S0\nM18"
}
}
}

View File

@ -27,6 +27,7 @@
"first_start_actions": [ "DiscoverUM3Action" ],
"supported_actions": [ "DiscoverUM3Action" ],
"supports_usb_connection": false,
"supports_material_export": true,
"weight": -1,
"firmware_update_info": {
"id": 213482,

View File

@ -28,6 +28,7 @@
"supported_actions": [ "DiscoverUM3Action" ],
"supports_usb_connection": false,
"supports_network_connection": true,
"supports_material_export": true,
"weight": -2,
"firmware_update_info": {
"id": 9051,

View File

@ -0,0 +1,16 @@
{
"version": 2,
"name": "Extruder 1",
"inherits": "fdmextruder",
"metadata": {
"machine": "kingroon_base",
"position": "0"
},
"overrides": {
"extruder_nr": { "default_value": 0 },
"machine_nozzle_size": { "default_value": 0.4 },
"material_diameter": { "default_value": 1.75 }
}
}

View File

@ -0,0 +1,15 @@
{
"version": 2,
"name": "Extruder 0",
"inherits": "fdmextruder",
"metadata": {
"machine": "mp_mini_delta_v2",
"position": "0"
},
"overrides": {
"extruder_nr": { "default_value": 0 },
"machine_nozzle_size": { "default_value": 0.4 },
"material_diameter": { "default_value": 1.75 }
}
}

View File

@ -0,0 +1,15 @@
{
"version": 2,
"name": "Extruder 1",
"inherits": "fdmextruder",
"metadata": {
"machine": "seckit_skgo",
"position": "0"
},
"overrides": {
"extruder_nr": { "default_value": 0 },
"machine_nozzle_size": { "default_value": 0.4 },
"material_diameter": { "default_value": 1.75 }
}
}

View File

@ -0,0 +1,15 @@
{
"version": 2,
"name": "Extruder 1",
"inherits": "fdmextruder",
"metadata": {
"machine": "seckit_sktank",
"position": "0"
},
"overrides": {
"extruder_nr": { "default_value": 0 },
"machine_nozzle_size": { "default_value": 0.4 },
"material_diameter": { "default_value": 1.75 }
}
}

Binary file not shown.

Binary file not shown.

View File

@ -1,4 +1,4 @@
// Copyright (c) 2018 Ultimaker B.V.
// Copyright (c) 2021 Ultimaker B.V.
// Cura is released under the terms of the LGPLv3 or higher.
pragma Singleton
@ -122,7 +122,15 @@ Item
Action
{
id: quitAction
text: catalog.i18nc("@action:inmenu menubar:file","&Quit")
//On MacOS, don't translate the "Quit" word.
//Qt moves the "quit" entry to a different place, and if it got renamed can't find it again when it attempts to
//delete the item upon closing the application, causing a crash.
//In the new location, these items are translated automatically according to the system's language.
//For more information, see:
//- https://doc.qt.io/qt-5/macos-issues.html#menu-bar
//- https://doc.qt.io/qt-5/qmenubar.html#qmenubar-as-a-global-menu-bar
text: (Qt.platform.os == "osx") ? "&Quit" : catalog.i18nc("@action:inmenu menubar:file", "&Quit")
iconName: "application-exit"
shortcut: StandardKey.Quit
}
@ -172,7 +180,14 @@ Item
Action
{
id: preferencesAction
text: catalog.i18nc("@action:inmenu", "Configure Cura...")
//On MacOS, don't translate the "Configure" word.
//Qt moves the "configure" entry to a different place, and if it got renamed can't find it again when it
//attempts to delete the item upon closing the application, causing a crash.
//In the new location, these items are translated automatically according to the system's language.
//For more information, see:
//- https://doc.qt.io/qt-5/macos-issues.html#menu-bar
//- https://doc.qt.io/qt-5/qmenubar.html#qmenubar-as-a-global-menu-bar
text: (Qt.platform.os == "osx") ? "Configure Cura..." : catalog.i18nc("@action:inmenu", "Configure Cura...")
iconName: "configure"
}
@ -263,7 +278,15 @@ Item
Action
{
id: aboutAction;
text: catalog.i18nc("@action:inmenu menubar:help", "About...");
//On MacOS, don't translate the "About" word.
//Qt moves the "about" entry to a different place, and if it got renamed can't find it again when it
//attempts to delete the item upon closing the application, causing a crash.
//In the new location, these items are translated automatically according to the system's language.
//For more information, see:
//- https://doc.qt.io/qt-5/macos-issues.html#menu-bar
//- https://doc.qt.io/qt-5/qmenubar.html#qmenubar-as-a-global-menu-bar
text: (Qt.platform.os == "osx") ? "About..." : catalog.i18nc("@action:inmenu menubar:help", "About...");
iconName: "help-about";
}

View File

@ -18,7 +18,7 @@ Item
property bool extruderEnabled: true
property alias iconSize: mainIcon.sourceSize
property string iconVariant: "medium"
layer.enabled: true // Prevent weird opacity effects.
Item
{
opacity: extruderEnabled ? 1 : UM.Theme.getColor("extruder_disabled").a

View File

@ -1,4 +1,4 @@
// Copyright (c) 2018 Ultimaker B.V.
// Copyright (c) 2021 Ultimaker B.V.
// Cura is released under the terms of the LGPLv3 or higher.
import QtQuick 2.7
@ -48,7 +48,17 @@ Item
ViewMenu { title: catalog.i18nc("@title:menu menubar:toplevel", "&View") }
SettingsMenu { title: catalog.i18nc("@title:menu menubar:toplevel", "&Settings") }
SettingsMenu
{
//On MacOS, don't translate the "Settings" word.
//Qt moves the "settings" entry to a different place, and if it got renamed can't find it again when it
//attempts to delete the item upon closing the application, causing a crash.
//In the new location, these items are translated automatically according to the system's language.
//For more information, see:
//- https://doc.qt.io/qt-5/macos-issues.html#menu-bar
//- https://doc.qt.io/qt-5/qmenubar.html#qmenubar-as-a-global-menu-bar
title: (Qt.platform.os == "osx") ? "&Settings" : catalog.i18nc("@title:menu menubar:toplevel", "&Settings")
}
Menu
{
@ -91,7 +101,15 @@ Item
Menu
{
id: preferencesMenu
title: catalog.i18nc("@title:menu menubar:toplevel", "P&references")
//On MacOS, don't translate the "Preferences" word.
//Qt moves the "preferences" entry to a different place, and if it got renamed can't find it again when it
//attempts to delete the item upon closing the application, causing a crash.
//In the new location, these items are translated automatically according to the system's language.
//For more information, see:
//- https://doc.qt.io/qt-5/macos-issues.html#menu-bar
//- https://doc.qt.io/qt-5/qmenubar.html#qmenubar-as-a-global-menu-bar
title: (Qt.platform.os == "osx") ? "&Preferences" : catalog.i18nc("@title:menu menubar:toplevel", "P&references")
MenuItem { action: Cura.Actions.preferences }
}

View File

@ -32,19 +32,20 @@ Item
anchors.top: parent.top
anchors.topMargin: UM.Theme.getSize("default_margin").height
UM.RecolorImage
Rectangle
{
id: icon
anchors.left: parent.left
anchors.verticalCenter: label.verticalCenter
source: UM.Theme.getIcon("Warning")
color: UM.Theme.getColor("warning")
width: UM.Theme.getSize("section_icon").width
height: width
radius: width / 2
UM.RecolorImage
{
anchors.fill:parent
source: UM.Theme.getIcon("Warning", "low")
color: UM.Theme.getColor("message_warning_icon")
}
}
Label
{
id: label

View File

@ -1,5 +1,5 @@
// Copyright (c) 2018 Ultimaker B.V.
// Uranium is released under the terms of the LGPLv3 or higher.
// Copyright (c) 2021 Ultimaker B.V.
// Cura is released under the terms of the LGPLv3 or higher.
import QtQuick 2.7
import QtQuick.Controls 1.4
@ -191,6 +191,21 @@ Item
}
enabled: base.hasCurrentItem
}
//Sync button.
Button
{
id: syncMaterialsButton
text: catalog.i18nc("@action:button Sending materials to printers", "Sync with Printers")
iconName: "sync-synchronizing"
onClicked:
{
forceActiveFocus();
exportAllMaterialsDialog.folder = base.materialManagementModel.getPreferredExportAllPath();
exportAllMaterialsDialog.open();
}
visible: Cura.MachineManager.activeMachine.supportsMaterialExport
}
}
Item {
@ -368,6 +383,19 @@ Item
}
}
FileDialog
{
id: exportAllMaterialsDialog
title: catalog.i18nc("@title:window", "Export All Materials")
selectExisting: false
nameFilters: ["Material archives (*.umm)", "All files (*)"]
onAccepted:
{
base.materialManagementModel.exportAll(fileUrl);
CuraApplication.setDefaultPath("dialog_material_path", folder);
}
}
MessageDialog
{
id: messageDialog

View File

@ -185,6 +185,8 @@ Item
right: parent.right
rightMargin: UM.Theme.getSize("wide_margin").width
}
width: UM.Theme.getSize("medium_button_icon").width
height: UM.Theme.getSize("medium_button_icon").height
style: ButtonStyle
{

View File

@ -24,7 +24,7 @@ MenuItem
anchors.verticalCenter: parent.verticalCenter
anchors.right: parent.right
anchors.rightMargin: UM.Theme.getSize("default_margin").width
source: UM.Theme.getIcon("arrow_right")
source: UM.Theme.getIcon("ChevronSingleRight")
color: UM.Theme.getColor("setting_control_text")
}
@ -37,7 +37,7 @@ MenuItem
anchors.verticalCenter: parent.verticalCenter
anchors.left: parent.left
anchors.leftMargin: UM.Theme.getSize("default_margin").width
source: UM.Theme.getIcon("check")
source: UM.Theme.getIcon("Check")
color: UM.Theme.getColor("setting_control_text")
}

View File

@ -34,6 +34,7 @@ ScrollView
color: UM.Theme.getColor("text")
textFormat: TextEdit.PlainText
renderType: Text.NativeRendering
wrapMode: Text.Wrap
selectByMouse: true
}
}

View File

@ -0,0 +1,14 @@
[general]
version = 4
name = Super Quality
definition = kingroon_base
[metadata]
setting_version = 17
type = quality
quality_type = super
material = generic_abs
variant = 0.2mm Nozzle
[values]
wall_thickness = =line_width*8

View File

@ -0,0 +1,14 @@
[general]
version = 4
name = Ultra Quality
definition = kingroon_base
[metadata]
setting_version = 17
type = quality
quality_type = ultra
material = generic_abs
variant = 0.2mm Nozzle
[values]
wall_thickness = =line_width*8

View File

@ -0,0 +1,14 @@
[general]
version = 4
name = Dynamic Quality
definition = kingroon_base
[metadata]
setting_version = 17
type = quality
quality_type = adaptive
material = generic_abs
variant = 0.3mm Nozzle
[values]
wall_thickness = =line_width*4

View File

@ -0,0 +1,14 @@
[general]
version = 4
name = Low Quality
definition = kingroon_base
[metadata]
setting_version = 17
type = quality
quality_type = low
material = generic_abs
variant = 0.3mm Nozzle
[values]
wall_thickness = =line_width*4

View File

@ -0,0 +1,14 @@
[general]
version = 4
name = Standard Quality
definition = kingroon_base
[metadata]
setting_version = 17
type = quality
quality_type = standard
material = generic_abs
variant = 0.3mm Nozzle
[values]
wall_thickness = =line_width*4

View File

@ -0,0 +1,14 @@
[general]
version = 4
name = Super Quality
definition = kingroon_base
[metadata]
setting_version = 17
type = quality
quality_type = super
material = generic_abs
variant = 0.3mm Nozzle
[values]
wall_thickness = =line_width*4

View File

@ -0,0 +1,14 @@
[general]
version = 4
name = Dynamic Quality
definition = kingroon_base
[metadata]
setting_version = 17
type = quality
quality_type = adaptive
material = generic_abs
variant = 0.4mm Nozzle
[values]
wall_thickness = =line_width*4

View File

@ -0,0 +1,14 @@
[general]
version = 4
name = Low Quality
definition = kingroon_base
[metadata]
setting_version = 17
type = quality
quality_type = low
material = generic_abs
variant = 0.4mm Nozzle
[values]
wall_thickness = =line_width*4

View File

@ -0,0 +1,14 @@
[general]
version = 4
name = Standard Quality
definition = kingroon_base
[metadata]
setting_version = 17
type = quality
quality_type = standard
material = generic_abs
variant = 0.4mm Nozzle
[values]
wall_thickness = =line_width*4

View File

@ -0,0 +1,14 @@
[general]
version = 4
name = Super Quality
definition = kingroon_base
[metadata]
setting_version = 17
type = quality
quality_type = super
material = generic_abs
variant = 0.4mm Nozzle
[values]
wall_thickness = =line_width*4

View File

@ -0,0 +1,14 @@
[general]
version = 4
name = Dynamic Quality
definition = kingroon_base
[metadata]
setting_version = 17
type = quality
quality_type = adaptive
material = generic_abs
variant = 0.5mm Nozzle
[values]
wall_thickness = =line_width*4

View File

@ -0,0 +1,14 @@
[general]
version = 4
name = Low Quality
definition = kingroon_base
[metadata]
setting_version = 17
type = quality
quality_type = low
material = generic_abs
variant = 0.5mm Nozzle
[values]
wall_thickness = =line_width*4

View File

@ -0,0 +1,14 @@
[general]
version = 4
name = Standard Quality
definition = kingroon_base
[metadata]
setting_version = 17
type = quality
quality_type = standard
material = generic_abs
variant = 0.5mm Nozzle
[values]
wall_thickness = =line_width*4

View File

@ -0,0 +1,14 @@
[general]
version = 4
name = Super Quality
definition = kingroon_base
[metadata]
setting_version = 17
type = quality
quality_type = super
material = generic_abs
variant = 0.5mm Nozzle
[values]
wall_thickness = =line_width*4

View File

@ -0,0 +1,14 @@
[general]
version = 4
name = Standard Quality
definition = kingroon_base
[metadata]
setting_version = 17
type = quality
quality_type = standard
material = generic_abs
variant = 0.6mm Nozzle
[values]
wall_thickness = =line_width*3

View File

@ -0,0 +1,14 @@
[general]
version = 4
name = Draft Quality
definition = kingroon_base
[metadata]
setting_version = 17
type = quality
quality_type = draft
material = generic_abs
variant = 0.8mm Nozzle
[values]
wall_thickness = =line_width*3

View File

@ -0,0 +1,14 @@
[general]
version = 4
name = Draft Quality
definition = kingroon_base
[metadata]
setting_version = 17
type = quality
quality_type = draft
material = generic_abs
variant = 1.0mm Nozzle
[values]
wall_thickness = =line_width*3

View File

@ -0,0 +1,15 @@
[general]
version = 4
name = Super Quality
definition = kingroon_base
[metadata]
setting_version = 17
type = quality
quality_type = super
material = generic_petg
variant = 0.2mm Nozzle
[values]
speed_layer_0 = 15
wall_thickness = =line_width*8

View File

@ -0,0 +1,15 @@
[general]
version = 4
name = Ultra Quality
definition = kingroon_base
[metadata]
setting_version = 17
type = quality
quality_type = ultra
material = generic_petg
variant = 0.2mm Nozzle
[values]
speed_layer_0 = 15
wall_thickness = =line_width*8

View File

@ -0,0 +1,15 @@
[general]
version = 4
name = Dynamic Quality
definition = kingroon_base
[metadata]
setting_version = 17
type = quality
quality_type = adaptive
material = generic_petg
variant = 0.3mm Nozzle
[values]
speed_layer_0 = 15
wall_thickness = =line_width*4

View File

@ -0,0 +1,15 @@
[general]
version = 4
name = Low Quality
definition = kingroon_base
[metadata]
setting_version = 17
type = quality
quality_type = low
material = generic_petg
variant = 0.3mm Nozzle
[values]
speed_layer_0 = 15
wall_thickness = =line_width*4

View File

@ -0,0 +1,15 @@
[general]
version = 4
name = Standard Quality
definition = kingroon_base
[metadata]
setting_version = 17
type = quality
quality_type = standard
material = generic_petg
variant = 0.3mm Nozzle
[values]
speed_layer_0 = 15
wall_thickness = =line_width*4

View File

@ -0,0 +1,15 @@
[general]
version = 4
name = Super Quality
definition = kingroon_base
[metadata]
setting_version = 17
type = quality
quality_type = super
material = generic_petg
variant = 0.3mm Nozzle
[values]
speed_layer_0 = 15
wall_thickness = =line_width*4

View File

@ -0,0 +1,15 @@
[general]
version = 4
name = Dynamic Quality
definition = kingroon_base
[metadata]
setting_version = 17
type = quality
quality_type = adaptive
material = generic_petg
variant = 0.4mm Nozzle
[values]
speed_layer_0 = 15
wall_thickness = =line_width*4

View File

@ -0,0 +1,15 @@
[general]
version = 4
name = Low Quality
definition = kingroon_base
[metadata]
setting_version = 17
type = quality
quality_type = low
material = generic_petg
variant = 0.4mm Nozzle
[values]
speed_layer_0 = 15
wall_thickness = =line_width*4

View File

@ -0,0 +1,15 @@
[general]
version = 4
name = Standard Quality
definition = kingroon_base
[metadata]
setting_version = 17
type = quality
quality_type = standard
material = generic_petg
variant = 0.4mm Nozzle
[values]
speed_layer_0 = 15
wall_thickness = =line_width*4

View File

@ -0,0 +1,15 @@
[general]
version = 4
name = Super Quality
definition = kingroon_base
[metadata]
setting_version = 17
type = quality
quality_type = super
material = generic_petg
variant = 0.4mm Nozzle
[values]
speed_layer_0 = 15
wall_thickness = =line_width*4

View File

@ -0,0 +1,15 @@
[general]
version = 4
name = Dynamic Quality
definition = kingroon_base
[metadata]
setting_version = 17
type = quality
quality_type = adaptive
material = generic_petg
variant = 0.5mm Nozzle
[values]
speed_layer_0 = 15
wall_thickness = =line_width*4

View File

@ -0,0 +1,15 @@
[general]
version = 4
name = Low Quality
definition = kingroon_base
[metadata]
setting_version = 17
type = quality
quality_type = low
material = generic_petg
variant = 0.5mm Nozzle
[values]
speed_layer_0 = 15
wall_thickness = =line_width*4

View File

@ -0,0 +1,15 @@
[general]
version = 4
name = Standard Quality
definition = kingroon_base
[metadata]
setting_version = 17
type = quality
quality_type = standard
material = generic_petg
variant = 0.5mm Nozzle
[values]
speed_layer_0 = 15
wall_thickness = =line_width*4

View File

@ -0,0 +1,15 @@
[general]
version = 4
name = Super Quality
definition = kingroon_base
[metadata]
setting_version = 17
type = quality
quality_type = super
material = generic_petg
variant = 0.5mm Nozzle
[values]
speed_layer_0 = 15
wall_thickness = =line_width*4

View File

@ -0,0 +1,15 @@
[general]
version = 4
name = Standard Quality
definition = kingroon_base
[metadata]
setting_version = 17
type = quality
quality_type = standard
material = generic_petg
variant = 0.6mm Nozzle
[values]
speed_layer_0 = 15
wall_thickness = =line_width*3

View File

@ -0,0 +1,15 @@
[general]
version = 4
name = Draft Quality
definition = kingroon_base
[metadata]
setting_version = 17
type = quality
quality_type = draft
material = generic_petg
variant = 0.8mm Nozzle
[values]
speed_layer_0 = 15
wall_thickness = =line_width*3

View File

@ -0,0 +1,15 @@
[general]
version = 4
name = Draft Quality
definition = kingroon_base
[metadata]
setting_version = 17
type = quality
quality_type = draft
material = generic_petg
variant = 1.0mm Nozzle
[values]
speed_layer_0 = 15
wall_thickness = =line_width*3

View File

@ -0,0 +1,13 @@
[general]
version = 4
name = Super Quality
definition = kingroon_base
[metadata]
setting_version = 17
type = quality
quality_type = super
material = generic_pla
variant = 0.2mm Nozzle
[values]

View File

@ -0,0 +1,13 @@
[general]
version = 4
name = Ultra Quality
definition = kingroon_base
[metadata]
setting_version = 17
type = quality
quality_type = ultra
material = generic_pla
variant = 0.2mm Nozzle
[values]

View File

@ -0,0 +1,13 @@
[general]
version = 4
name = Dynamic Quality
definition = kingroon_base
[metadata]
setting_version = 17
type = quality
quality_type = adaptive
material = generic_pla
variant = 0.3mm Nozzle
[values]

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